<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Nicolas Alpi, Web developer]]></title>
  <link href="http://notgeeklycorrect.com/atom.xml" rel="self"/>
  <link href="http://notgeeklycorrect.com/"/>
  <updated>2013-05-30T09:34:13+01:00</updated>
  <id>http://notgeeklycorrect.com/</id>
  <author>
    <name><![CDATA[Nicolas Alpi]]></name>
    <email><![CDATA[nicolas@cookieshq.co.uk]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[starting as a freelance]]></title>
    <link href="http://notgeeklycorrect.com/2013/04/28/starting-as-a-freelance/"/>
    <updated>2013-04-28T21:47:00+01:00</updated>
    <id>http://notgeeklycorrect.com/2013/04/28/starting-as-a-freelance</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been self employed for most of my working life. When I was in France I went self employed straight after school, then when I arrived in England, it took me a year to settle properly and I was back on the self employed saddle again.In total, I cumulate nearly 8 years of self employment, most of them Freelancing.</p>

<p>I&#8217;m writing this post to share my experiences and mistakes with people who are thinking about starting solo. My market is UK-based small businesses and my area of work is web development, but I&#8217;m sure that most of it can apply to any branch of work.</p>

<h2>Freelancing is harder than it sounds</h2>

<p>Most of the time, people picture freelancers in their pyjamas, waking up at 1pm and working in bed.
I can safely say that I don&#8217;t think it ever happened to me. In fact, maybe it did, when I was really sick, but had something really urgent to finish.</p>

<p>Freelancing is about building a business where <em>you</em> are the only asset. People will pay for <em>your</em> time and <em>your</em> expertise. This is the only thing you will sell.</p>

<p>I&#8217;m certainly not saying that you will have to work up to stupid o&#8217;clock every day (and if it does happen you&#8217;re on the wrong track), but from time to time that might happen.</p>

<p>On top of your normal workload, you need to keep finding clients. So you need to market yourself and find new leads but also send invoices, do your bookkeeping, etc.</p>

<p>Freelancing is not just about working on your passion unfortunately, it is about building a business.</p>

<p>(I know this sounds a bit bitter, but there are also many fun and rewarding parts of being a freelance, I just like to warn people.)</p>

<h2>Ask yourself why you want to be freelance</h2>

<p>Before you go to the HMRC website and register yourself as self-employed, you should take some time and think about <em>why you want to be freelance</em> and <em>what you want out of it</em>.</p>

<p>There could be multiple reasons, from having more freedom, more free time, or working on projects that you choose, technologies that you choose, or being able to work anywhere, having no boss.There are hundreds of valid reasons. Taking the time to think about them before you start will allow you to clarify what type of work you want to accept, what type of clients you want to bring in and what you will consider as a success.</p>

<h2>Where to find clients and how to keep them</h2>

<p>You&#8217;re now ready to start, you know why you want to go freelance. Now it&#8217;s time to find your first clients.</p>

<h3>Where to find them?</h3>

<p>Asking all friends of friends who might be after the service you offer.</p>

<p>If your network is small or irrelevant to your service, then you&#8217;ll have to show up at Meetup groups, conferences and random events organised where your potential clients might be.</p>

<p>Networking is an art, and not every event you will go to will bring a new client, but there is a big chance that you will make good connections and who know what can happen in the future.</p>

<h3>Don&#8217;t take every single lead on board</h3>

<p>Starting as a freelance, there are 4 things you need to consider before taking any new client on board:</p>

<ul>
<li>Who do you want to work with?</li>
<li>Do they have the money to pay me?</li>
<li>Will they pay me?</li>
<li>Do they value my expertise?</li>
</ul>


<p>One mistake that many freelancers do is to take any project from anyone who can pay them. While it sounds sensible, it can turn out to be a massive mistake if you&#8217;re not very careful.</p>

<p>Your clients need to value your time and your expertise. With time you will learn to detect and avoid the potential painful clients. If they don&#8217;t value your work, they will never be happy and suck everything they can from your soul.</p>

<h3>Keep them happy</h3>

<p>One thing you will hear a lot is that to keep your clients happy you have to &#8220;under promise and over deliver&#8221;. I don&#8217;t really agree with that idea.</p>

<p>I don&#8217;t like the idea of underpromising. For me it&#8217;s as bad as overpromising. If you&#8217;re expert, you should know of long it will take to achieve X, Y or Z task. Point.</p>

<p>Over delivering is another danger. It&#8217;s ok if you rely on that client for a short term. But I like to think of my client relationships as long term. If you over deliver all the time, then what will they think when you can only do what you agreed to do?</p>

<p>So for me, keeping a client happy is about delivering on time and on budget what they were expecting. If we have a good surprise and it went faster than expected then we can over deliver but we will explain to them why we went faster.</p>

<h2>What about money?</h2>

<p>Here it&#8217;s easy. 2 rules:</p>

<h3>1. Calculate your day rate</h3>

<p>Calculate your day rate based on all your costs: sick days, holidays, bank holidays, days off, shit days, days spent finding new clients, office/house rent, internet costs, software costs &#8230;. see it&#8217;s not just about working days.</p>

<p>Here are a few resources that can help you sorting this out:</p>

<ul>
<li><a href="http://cole007.net/blog/94/calculate-your-freelance-tax-rates">@cole007 calculate your freelance tax rate post</a></li>
<li><a href="http://relief.fraq.info/">@cole007 calculate your freelance tax rate application</a></li>
<li><a href="http://www.fraq.info/">What other freelancers are charing in your area</a></li>
</ul>


<h3>2. Don&#8217;t be stupid</h3>

<p>Never take a new client without a contract and always ask for a deposit.
Contracts can save your a$$ sometimes, and if your potential client refuses to sign them (usually they don&#8217;t refuse they just delay and delay and delay), it&#8217;s a sign that something is wrong.</p>

<p>The amount of the deposit is up to you, but you should ask for at least 30% of the total amount as a deposit.</p>

<p>If the contract is running for more that a month, then you should include mid-term payments.</p>

<p>You can help yourself with Andy Clarke&#8217;s <a href="http://stuffandnonsense.co.uk/projects/contract-killer/">contract killer template</a></p>

<h2>Time management</h2>

<p>Time managment is what makes the difference between good freelancers and excellent ones. You have to manage your working time, your marketing time, your rest time, your family time, your gym time and your buddy beer time. Ho and still find time to learn new tech in your field.</p>

<p>A good weekly planning for all this will usually sort you out, but be careful as it&#8217;s too easy to burry you head in the sand. Burnout is round the corner.</p>

<h2>Then what&#8217;s next?</h2>

<p>Well hopefully you will be a successful freelancer, you will become a better actor in your field of expertise, and you will become a better person.
It did work well for me for 8 years, and I&#8217;m now facing new challenges on how to move from a solo business to create a team and a development stdio.
If you have any resources that can help me on this path I would love to hear about them.</p>

<p>Good luck to everyone out there who is thinking about starting as a freelancer!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Launch GVIM MacVim With the Correct PATH Variable]]></title>
    <link href="http://notgeeklycorrect.com/2011/02/08/launch-gvim-macvim-with-the-correct-path-variable/"/>
    <updated>2011-02-08T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2011/02/08/launch-gvim-macvim-with-the-correct-path-variable</id>
    <content type="html"><![CDATA[<p>I had the problem sitting there for a long time, and I finally found the solution this morning.</p>
<p>When I was launching Vim from the terminal, my $<span class="caps">PATH</span> variable was setup properly. <br />
Idem when I was launching Gvim from the terminal, all good. <br />
But when I launching Gvim from the launcher, the $<span class="caps">PATH</span> always ended up to the default $<span class="caps">PATH</span> (usual /usr/bin &#8230; but no trace of my rvm installation). Causing rails.vim and some other commands, Ruby related, to fail.</p>
<p>One of the solution is to <strong>edit the Gvim launcher</strong> with the command:</p>
<div>
<pre><code class='bash'>bash -lc Gvim</code></pre>
</div>
<p>I&#8217;m happy I found it, that will give the opportunity to have a proper look at Gvim as a terminal alternative. I found that having menu can be useful time to time for plugins that you don&#8217;t use often.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Weekly Roundup 4]]></title>
    <link href="http://notgeeklycorrect.com/2011/02/07/weekly-roundup-4/"/>
    <updated>2011-02-07T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2011/02/07/weekly-roundup-4</id>
    <content type="html"><![CDATA[<p>Quite a busy week, so not that much links.</p>
<p><strong><a href="http://railsdeveloper.com/questions/41-what-can-i-do-to-make-capistrano-deploys-faster">What can I do to make Capistrano deploy faster</a></strong>: Simple snippet to make your deploy time even faster when using Capistrano.</p>
<p><strong><a href="http://www.cleveralgorithms.com/nature-inspired/index.html">Clever algorithms, Nature inpired programming recipes</a></strong> looks like an awesome book, and all the examples are in Ruby. I&#8217;ll give it a go as soon as I find the time.</p>
<p><strong><a href="http://blogs.sitepoint.com/2011/01/26/10-ruby-on-rails-best-practices/">Ruby on Rails best practices</a></strong>: Usally I&#8217;m not a big <a href="http://www.sitepoint.com">Sitepoint</a> fan, but this blog post, very well written, gives a good intro about Rails best practices.</p>
<p><strong>That’s all for this week, you now can close your browser and return to a normal activity.</strong></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Weekly Roundup 3]]></title>
    <link href="http://notgeeklycorrect.com/2011/01/25/weekly-roundup-3/"/>
    <updated>2011-01-25T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2011/01/25/weekly-roundup-3</id>
    <content type="html"><![CDATA[<p><strong><a href="http://startupquote.com/">Startup Quote</a></strong>, inspirational quotes from successful start-up founders.</p>
<p><strong><a href="http://anders.janmyr.com/2010/09/why-ruby.html">Why Ruby?</a></strong>, if you still need some help choosing between Ruby and another language.</p>
<p><strong><a href="http://bjhess.com/blog/a_week_off_the_grid/">A week off the grid</a></strong>, I read this advice in the [“Do More Faster”:http://amzn.to/gyJuDb] book, and I’m waiting for my first experimentation. I found Barry write up on his experience very informative.</p>
<p><strong><a href="http://timeless.judofyr.net/your-blog-is-a-project">Your blog is a project</a></strong>, something I tend for forgot on the past.</p>
<p><strong><a href="https://github.com/nu7hatch/gmail">Gmail gem</a></strong>, A Rubyesque interface to Gmail, with all the tools you&#8217;ll need. No need to say more, fantastic gem.</p>
<p><strong><a href="https://www.heroscale.com/">Hero Scale</a></strong>, Automatically scales your Heroku apps. Sounds fantastic on the paper. I’ll give it a go on my next project.</p>
<p><strong><a href="http://www.smashingmagazine.com/2011/01/18/time-saving-and-educational-resources-for-web-designers/">Time-Saving and Educational Resources for Web Designers</a></strong>, a compilation of very useful resources, even if, like me, you’re not a designer you should find some valuable apps.</p>
<p><strong><a href="http://rubythere.com/">Ruby There</a></strong>, all 2011 majors Ruby conferences in one page.</p>
<p><strong><a href="http://www.pragprog.com/titles/olag/agile-in-a-flash">Agile in flash</a></strong>, interesting concept off Agile reference cards instead of a book.</p>
<p><strong>That’s all for this week, you now can close your browser and return to a normal activity.</strong></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[5am wake up. Is it so crazy to wake up early?]]></title>
    <link href="http://notgeeklycorrect.com/2011/01/24/5am-wake-up-is-it-crazy-to-wake-up-early/"/>
    <updated>2011-01-24T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2011/01/24/5am-wake-up-is-it-crazy-to-wake-up-early</id>
    <content type="html"><![CDATA[<p>I don&#8217;t remember the exact date I started, but around a year ago I started a &#8220;new experimentation&#8221;: <strong>Being an early bird</strong>.</p>
<h2>My sleeping/working background pattern</h2>
<p>As a lot of developers, I used to be a night owl. Coding/hacking/writing on personal projects during the night, then struggling to wake up every single morning.</p>
<p>I always had a strange sleep pattern, coding lately for 2 or 3 nights in a row, and then going to bed at 9pm on the fourth day, then again 3 days of late code and 9pm sleep.</p>
<p>I would wake up around 7am or 8am. When I say I would wake up, it was more Nathalie waking me up, pushing me out of bed every single morning.</p>
<p>When I was single it was even worst, I was living with my roommate, and he had the same waking up issues, so we had 4 alarm clock in our tiny apartment. One in every room, so we could be sure of getting up. Not quite effective.</p>
<p>I knew this sleep pattern could not stay for long now for multiple reason:</p>
<ul>
	<li>First, my brain didn&#8217;t like the non scheduled type of things. Sometimes staying up late, sometimes going to bed early, caffeine all night, it&#8217;s not the best way to treat your brain and body.</li>
</ul>
<ul>
	<li>Secondly, I was now in a couple. Being in a couple means doing concessions, you can&#8217;t continue to hack all night long every night. So at first we tried to agree on a hack day schedule, hacking X days + Saturday and the rest is unwired. It was working on the first weeks, then all fall apart one day or another. Then I came across some blogs talking about this &#8220;waking up early&#8221; idea. I decided to give it a go.</li>
</ul>
<p>At the time, I didn&#8217;t know how long I was going to keep it, neither than there was going to be 3 stages on this new habit.</p>
<h2>First stage, making it a habit</h2>
<p>I&#8217;m not sure it would be acceptable for your body to go from 8am to 5am in one morning.</p>
<p>I had to make it a habit. I decided to <strong>go for 1 month</strong> at first, but 1 month where I would wake up early every single morning, <strong>even on the weekend</strong>. The idea was to <strong>make it a habit</strong>.</p>
<p>I was going to wake up earlier each week. I started waking up at 6.30am for one week, then 6am for another week, then 5.30am and 5.15am on the last week. Obviously I would go to bed early, and I found it easier to fall asleep. Strangely <strong>I found it also easier to wake up at those early hours</strong>.</p>
<p>I started around spring here, and I was rising up with the sun. I would wake up, power on the computer and go to make a cup of coffee, all listening to the silence and feel the light entering the place. It&#8217;s a nice feeling.</p>
<p>So <strong>it took me around one month to make it a habit</strong>, but it took no time to start feeling the positive effect on my life.</p>
<p>Now I&#8217;m waking up early, my schedule changed. I can hack on personal projects in the morning, then breakfast, and start working for my clients around 8.30am or 9am. I would probably put an extra hour to personal work around 5pm to 6pm. When Nathalie arrives at 6pm, I can close the computer, and enjoy <strong>the rest of the evening entirely dedicated to Nathalie</strong> or at least other activities than wired ones.</p>
<p>It took me around 2 months to move from 5.15am to 5am. Doing it by transitions. I&#8217;m now going to bed around 9pm, and fall asleep around 10pm probably. Sometimes a bit before.</p>
<p>I try to make sure I have every day at least 7 hours of sleep. It appears to be the time I need.</p>
<h2>From silence to rush</h2>
<p>After at least 6 or 7 month of this schedule, I was a happy bunny. <strong>My productivity was rocketing</strong>, waking up with the sun and the birds song was lovely. Evening with my fiancee were great, and it was a nice feeling not to feel guilty of not working in the evening.</p>
<p>Then Nathalie decided to take some courses at the Open University, and we took a gym membership. So that was more activities to add on our schedule.</p>
<p>We decided that we would go to the gym as soon as Nathalie would come back from work, in the evening, and Nathalie decided to give a go to the early rise.</p>
<p>It changed everything for me. The morning silence transformed itself into a morning rush for the first weeks. We would wake up, then take breakfast together, then Nathalie would go to the shower then myself, then, I would finally reach my computer. Even if my client work productivity didn&#8217;t change, my morning productive was in a deep down fall. It has been hard, for me, to adapt this new schedule.</p>
<h2>Finally it&#8217;s just a new habit</h2>
<p>So, after a few weeks, I realised it was just another habit. I needed to change my habit one more time. I had the same activities than before (personal work, breakfast, shower, personal work) but in a different order (breakfast, shower, personal work). Starting pomodoro helped me a lot to make it a habit, and to stick with my daily goals.</p>
<h2>In a nutshell</h2>
<p>So, if you want to start the 5am waking up call, here are my tips:</p>
<ul>
	<li><strong>Make it a habit</strong>: Start for one month, no cheating, wake up early every single day. Even during the week end. That will help your body to make it a habit. Try to always have the same go to bed time as well, so your body can learn from it.</li>
</ul>
<ul>
	<li><strong>Do it progressively</strong>: If you want to wake up more than 1 hour earlier, doing it progressively will help your body make the transition. Go by 30 minutes steps.</li>
</ul>
<ul>
	<li><strong>Have a paper/list ready</strong>: I found it easier to have a list of 2 or 3 actions ready near the bed or the desk. So when I wake up, I know what I have to do.</li>
</ul>
<p>As I said, it has been nearly a year now, and I can see pros and cons on the technique.</p>
<p><strong><span class="caps">PRO</span></strong></p>
<ul>
	<li>Makes you highly productive.</li>
</ul>
<ul>
	<li>If you&#8217;re a freelance, it&#8217;s easier to manage the balance between personal and working life.</li>
</ul>
<ul>
	<li>Gives a strict pattern to your body.</li>
</ul>
<ul>
	<li>Even in the week end, your body is use to the pattern and you wake up earlier than usual.</li>
</ul>
<ul>
	<li>Spring/Summer wake up is awesome! Sun rising, birds singing &#8230;</li>
</ul>
<p><strong><span class="caps">CONS</span></strong></p>
<ul>
	<li>Evening events are harder to make. I now decided that, the morning after an evening event, I would not wake up at 5am, but use the sleep time + 7 hours pattern. But you&#8217;re still tired before everyone else at the event.</li>
</ul>
<ul>
	<li>Autumn/Winter wake up is shit! Dark, rain and cold, makes it harder.</li>
</ul>
<p><em>Edit: I think I missed the explanation on why I started the 5am thing. As said on Hacker News, you can achieve the same productivity if you dedicate yourself some time frame in the evening (say 10pm to 1am). But I found it hard to manage private life and work life when working in the evening. I prefer the early rise in the morning to hack and spend quality time with my fiancee every evening. Before that it was more an internal fight between &#8220;Well, I need to work/hack/write&#8221; and &#8220;Hum, I&#8217;m having a good time now, I don&#8217;t want call it off&#8221;.</em></p>
<p><strong>That was my felling around my early wake up experiment. What about you, early birds or night owl? Do you have some tips to share?</strong></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Weekly Roundup 2]]></title>
    <link href="http://notgeeklycorrect.com/2011/01/17/weekly-roundup-2/"/>
    <updated>2011-01-17T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2011/01/17/weekly-roundup-2</id>
    <content type="html"><![CDATA[<p><strong><a href="http://www.smashingmagazine.com/2011/01/07/creating-and-distributing-presentations-on-the-web/">Creating and distributing presentations on the web</a></strong>, a useful article on Smashing Magazine. Sure it’ll be useful to people attending the <a href="http://www.meetup.com/bristol-ruby-user-group/">#brug</a>.</p>
<p><strong><a href="http://vim.runpaint.org/">Vim Recipes</a></strong>, nice ebook for Vim beginner or medium users of Vim. I found some useful tricks in it.</p>
<p><strong><a href="http://www.readwriteweb.com/hack/2011/01/google-to-start-charging-for-prediction-api.php">Google starts charging for prediction <span class="caps">API</span></a></strong>, a must to try.</p>
<p><strong><a href="http://theoatmeal.com/comics/shopping_cart">How to make your shopping cart suck less</a></strong>, once again The oatmeal has it all right.</p>
<p><strong><a href="https://github.com/robbyrussell/oh-my-zsh">Oh my zsh</a></strong>, super mega useful collection of templates and functions for starting with zsh.</p>
<p><strong><a href="http://rush.heroku.com/">Rush, Ruby unix shell</a></strong>, I&#8217;ve just moved to zsh, don&#8217;t make me change again :D.</p>
<p><strong><a href="http://projectb14ck.org/programming-innocence">Programming innocence</a></strong>, how can you regain your programming innocence once it has been lost?</p>
<p><strong><a href="http://getfirebug.com/releases/firebug/1.7X/">Firebug compatible with Firefox 4b beta</a></strong>, if you&#8217;re running the last beta of Firefox 4, you&#8217;ll be please to learn the there is a compatible firebug branch!</p>
<p><strong>That&#8217;s all for this week, you now can close your browser and return to a normal activity.</strong></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Weekly Roundup 1]]></title>
    <link href="http://notgeeklycorrect.com/2011/01/07/weekly-roundup-1/"/>
    <updated>2011-01-07T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2011/01/07/weekly-roundup-1</id>
    <content type="html"><![CDATA[<p>First week for the weekly roundup, a good mix between technical and business posts:</p>
<p><strong><a href="http://theeducatedentrepreneur.wordpress.com/2010/04/28/10-ted-talks-for-entrepreneurs/">10 <span class="caps">TED</span> talks for entrepreneurs</a></strong>, I truly appreciated the talks selection on this list. To me, that was a good way to start the year!</p>
<p><strong>Gary Vaynerchuk talks</strong>, well, talking about motivation, is anyone better than Gary Vaynerchuk to motivate you? I enjoyed watching <a href="http://www.youtube.com/watch?v=-QWHkcCP3tA">Gary RailsConf 2010 Talk</a> and his <a href="http://www.youtube.com/watch?v=EhqZ0RU95d4">web 2.0 expo talk</a>.</p>
<p><strong><a href="http://blog.asmartbear.com/self-doubt-fraud.html">Why I feel like a fraud</a></strong>, this one I found it in my last <a href="http://hackermonthly.com/">Hacker Monthly</a>. This is something I&#8217;ve been talking with friends for a few months now, and it has been a revelation to spot that I wasn&#8217;t alone. I&#8217;ll soon develop this point in a complete post, but this article is definitively a <strong>must read</strong>.</p>
<p><strong><a href="http://blog.envylabs.com/2010/12/rails-3-cheat-sheets/">Ruby on Rails 3 Cheat Sheets</a></strong>, certainly the most up-to-date and attractive Rails Cheat Sheets on the web.</p>
<p><strong><a href="https://developer.amazon.com/welcome.html">Amazon developer app store</a></strong> is live. I feel like a new &#8220;app store&#8221; opens every 2 days.</p>
<p><strong><a href="http://s4.io">S4.io</a></strong>, S4 is a distributed stream computing platform that was open-sourced by Yahoo! under the Apache 2.0 license. I haven&#8217;t played with it yet, but will soon!</p>
<p><strong><a href="http://blog.peepcode.com/tutorials/2011/rip-ruby-hash-rocket-syntax">Rip hashrocket</a></strong>, a seriously good looking comic blog post about the death of the well known ruby Hashrocket (=&gt;) in favor of the wider used more standard colon in Ruby 1.9.</p>
<p><strong><a href="http://policy.heroku.com/20091028-20110113_diff.html">Heroky <span class="caps">TOS</span> changes, the hacker way</a></strong>, how can a company do everything right all the time! Those guys are so amazing that they can make a <span class="caps">TOS</span> change attractive!</p>
<p><strong><a href="http://fontsinuse.com/">Font In Use</a></strong>, good looking typography website showing fonts in real use.</p>
<p><strong><a href="http://www.madebyone.com/">Made By One</a></strong>, last but not least, I <strong>love</strong> the idea behind this blog. Interviewing solo developers, a bit on the same way as <a href="http://www.usesthis.com/">usethis</a> target on the gears side of things. I hope Mubashar (creator of Made By One) will continue his post series soon.</p>
<p><strong>That&#8217;s all for this week, you now can close your browser and return to a normal activity.</strong></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My Twelve Months Review]]></title>
    <link href="http://notgeeklycorrect.com/2011/01/03/my-twelve-month-review/"/>
    <updated>2011-01-03T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2011/01/03/my-twelve-month-review</id>
    <content type="html"><![CDATA[<p>As always, the 1st week of a new year is a good time to take on personal and professional review. I had a complete disconnection time during 2 weeks, back in France, enjoying family and friends. Now it is time to take serious action to make 2011 <strong>my best year ever</strong>.</p>
<h2>2010 Review</h2>
<p>2010 as been a remarkably good year. Intensive, with a lot of work, a wide board of projects, including freelancing for 2 differents startups and managing a complete project from A to Z. On the personal side, it has been great as well, I found a way to manage properly professional and personal life to, and I can fell the benefits on my couple.</p>
<p>On the downside, even if I&#8217;ve got no problems being productive for my clients, I struggled to stop working and start creating for myself. Luckily, working for <a href="http://oahu.fr/"><span class="caps">OAHU</span></a> helped me to discover some new technologies that I wanted to play with, minimasing some of the technical debt accumulating when you don&#8217;t take the time to produce for myself.</p>
<p>On the networking side of things, I meet some interesting people, but I completely neglected this blog (see as above, be productive for myself). I struggled finding time, or idea for articles.</p>
<p>I&#8217;ll soon expand those subjects, on a separate post, as I went to a very strong introspection during the last 3 month of 2010.</p>
<h2>What do I want for 2011?</h2>
<p>On the personal side of things, I&#8217;m going to get married in May this year. We are also going to rent a house with a buying option in the next years. As you can imagine, after the wedding will certainly come a new addition to the family. So this year might be the last year I can try different things and afford to get it wrong, afterwards if going to be a bit trickier as the responsibilities grow.</p>
<p>So this year, I&#8217;m going to be over productive, but to achieve something I need goals:</p>
<p><strong>Develop and promote at least 1 personnal project</strong>. Last year I created <a href="http://www.howgoodismyfood.com">howgoodismyfood.com</a> in 24 hours, with the help of <a href="https://github.com/theoooo">Theo</a>. Unfortunately we never get our hands on make it evolve, and it stays as it for the moment. <strong>This year challenge</strong> will be creating a side business from a personal project. It is planned to happen on February.</p>
<p><strong>Promote myself</strong>, even if I do not struggle to find work for the moment, tend do not promote myself properly, probably due to the fact that I did not know where to market me. Am I a Ruby/Rails developer? or am I a Freelance website developer? a Freelance web application developer? should I take on complete projects or look to integrate a team? &#8230; Hard to market yourself when you can&#8217;t even answer to those simple questions.</p>
<p><strong>Organising a workshop/conference</strong>. Last year, with <a href="http://kernowsoul.com/">Jamie</a> and <a href="http://wearebeef.co.uk/">Steve</a>, we created the Bristol Ruby User Group (#brug). The group meet every month, and we organize talk and geek chat around food and beers. This year, we&#8217;ve got some interesting goals for the #brug, but organising a proper event is something I always wanted to do. And why not this year! Thankfully I&#8217;ll be helped by some friends and Nathalie on this adventure.</p>
<p><strong>Improve my business skills</strong>. I like business side of things when you are freelancing. I like looking for new opportunities, I like closing deals, I truly like a lot of the business side of things. I&#8217;ll do my best to improve that a lot this year.</p>
<p><strong>Regain this blog</strong>, this one, I said it at numerous occasions. Again, instead of letting the flow go, and use this blog as a personal blog, I felt into the trap of <em>&#8220;I need to write a blog post to attract an audience&#8221;.</em> But you never find something good enough and then another excuse later, your blog is a dead space on then web. So I took it that way. I&#8217;m running a web development business, everyday I solve coding problems, I read a lot, I experience a lot, so let just share it, is it not what a blog is for at the beginning?</p>
<h2>Happy new year</h2>
<p>So, Happy New Year to everyone, I hope you will work your way so 2011 will give you everything you wanted. As for me it is pretty clear that this is going to be an interesting and crazy year, certainly the best year ever!</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GTD With Free Action List Behance Replica]]></title>
    <link href="http://notgeeklycorrect.com/2010/11/02/gtd-with-action-list-behance-replica/"/>
    <updated>2010-11-02T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2010/11/02/gtd-with-action-list-behance-replica</id>
    <content type="html"><![CDATA[<p>Yesterday I came accross <a href="http://www.creativesoutfitter.com/">Behance products</a> and I specialy liked the <a href="http://www.creativesoutfitter.com/Products/Action-Pad/3">action pad</a>.</p>
<p>$8.00 per pad is not to bad, so I went to buy a pack of 2, but the shipping to UK was more than $30! No way I&#8217;d pay twice the product price just in shipping, for some paper pad.</p>
<p>So I just open <a href="http://inkscape.org/">Inkscape</a> and created few <span class="caps">SVG</span> that would match my needs in terms of space and number of action per page.</p>
<p>And I have to say, I quite like them, they looks really nice on my desk</p>
<p><img src="http://notgeeklycorrect.com/images/action_desk.JPG" title="My desk with my replica" alt="My desk with my replica" /></p>
<p>The page is a list of 20 actions, with on the left a large pixel dotted freezone.<br />
On the top you have some space for some text + reference and date of the page.<br />
It&#8217;s available in 3 colors, just help yourself.</p>
<p>Ho, I would suggest that you save the svg file to your disk and open it with <a href="http://inkscape.org/">Inkscape</a> or similar to print it. I&#8217;ve tried to print directly from the browser and the result is not that good.</p>
<p><strong>Click on the image to access the svg or right click, save as &#8230;</strong></p>
<p><a href="http://notgeeklycorrect.com/images/action_template_blue.svg"><img src="http://notgeeklycorrect.com/images/detail_blue.jpg" title="Blue version" alt="Blue version" /></a></p>
<p><a href="http://notgeeklycorrect.com/images/action_template_orange.svg"><img src="http://notgeeklycorrect.com/images/detail_orange.jpg" title="Blue version" alt="Blue version" /></a></p>
<p><a href="http://notgeeklycorrect.com/images/action_template_grey.svg"><img src="http://notgeeklycorrect.com/images/detail_grey.jpg" title="Blue version" alt="Blue version" /></a></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tutorhub]]></title>
    <link href="http://notgeeklycorrect.com/2010/10/29/tutorhub/"/>
    <updated>2010-10-29T00:00:00+01:00</updated>
    <id>http://notgeeklycorrect.com/2010/10/29/tutorhub</id>
    <content type="html"><![CDATA[<p><a href="http://www.tutorhub.org">Tutorhub</a> is a web application I&#8217;ve been working on during a few month as part of the <a href="http://jivatechnology.com/">Jiva Technology</a> team, when I was contracting with them.<br />
The public version has been release a few weeks back, and is now gaining in popularity among tutors and children.</p>
<h2>What is it?</h2>
<p><a href="http://www.tutorhub.org">Tutorhub</a> position itself between the private face to face tutoring and the classic forum where you would go asking for questions when stuck during your homework.<br />
Problem with private session is you&#8217;ll need to wait the tutor to be available for you, and you&#8217;ll have to pay a certain fee. Problem with forums is that your question can stay here without any answers for ages, or even worst beeing answer incorrectly.<br />
So the Jiva guys came with this &#8220;in between&#8221; solution, where:</p>
<ol>
	<li>You ask your question online</li>
	<li><a href="http://www.tutorhub.org">Tutorhub</a> presents to you a selection of online available tutors</li>
	<li>You pick the one you want</li>
	<li>It fires a one to one chat session with a experienced tutor, ready to answer.</li>
</ol>
<p>The work that the <a href="http://jivatechnology.com/">Jiva Technology</a> team did is amazing, the result is a really slick and user friendly app, easy to use, and I have no doubt that success is round the corner!</p>
<h2>Some videos</h2>
<p>If you want to have an introduction of what is tutorhub, they&#8217;ve realeased 2 videos for you:</p>
<p><strong>The student version</strong><br />
<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/TYQ_cJTQ3lo?fs=1&amp;hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/TYQ_cJTQ3lo?fs=1&amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<p><strong>The tutor version</strong><br />
<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/D5__G7rBdvU?fs=1&amp;hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/D5__G7rBdvU?fs=1&amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Analyse of a Disaster]]></title>
    <link href="http://notgeeklycorrect.com/2010/10/18/analyse-of-a-disaster/"/>
    <updated>2010-10-18T00:00:00+01:00</updated>
    <id>http://notgeeklycorrect.com/2010/10/18/analyse-of-a-disaster</id>
    <content type="html"><![CDATA[<p>Three days ago <a href="http://notgeeklycorrect.com/2010/10/15/railsrumble-tonight/">I was writting</a> about my excitement for this year RailsRumble, so why did I decided on Sunday morning to just gave up. <br />
I mean, it wasn&#8217;t just a temporary frustration due to lack of sleep and too much Redbull, that was really hitting the wall so hard that I could not stand up again. <br />
Let me try to analyse this unexpected failure.</p>
<h2>Launchanalytics</h2>
<p>First let&#8217;s go back to my project idea. This is an idea I had few months back, having a <span class="caps">API</span> and a dashboard helping project developers to manage their invitation system. <br />
You would be able to create invites, via the <span class="caps">API</span> or the dashboard, redeem invites and so track registered users, where they came from, enabling virality, having limited and unlimited invite code for your different invite streams, well a lot of things! <br />
Ho and obviously, for me to be happy, the project would have a nice and appealing public design + a nice dashboard design. <br />
And, a user could manage different projects <br />
And &#8230; so on and so on. <br />
I really like the idea, and those who knows me can testify that I&#8217;ve put a lot of preparation in this idea.</p>
<h2>To big, to fast</h2>
<p>I think my first mistake is that I was having a so clear idea of what I wanted to achieve, that I forgot about the 48 hours limit.</p>
<p>My expectations where way to high for this contest, and I could not imagine to deploy a half done project. Maybe I should have, after all you can&#8217;t do everything in 48 hours.</p>
<p>Also, when the competition started, I went directly to <span class="caps">VIM</span> and started writing all my tests and all my code for the models and a little bit for the controllers, so after 20 hours I was having all the application backbend ready. No views, no design but the backbend. <br />
I didn&#8217;t step back when writing my code, I was on the urge of finishing my app as fast as possible, and I didn&#8217;t see the wall coming.</p>
<h2>The wall</h2>
<p>Despite all my preparation, mockups, db schema and so on, I&#8217;ve made a very strong mistake, something that after 24 hours would have requires me at least 5 hours code changes if I wanted to have everything working as expected. <br />
At this point I tried to remove features that I knew would have been affected by this problem, but to be honest there was no so much left. <br />
I tried to review my initial plan, moved to not having public website but only an admin section, with a demo application, but well, I was very angry at myself about this stupid mistake, and could not continue anything else but ranting.</p>
<h2>Giving up, and after</h2>
<p>So I decided to gave up, I shut down the webserver, and went to bed. I can tell you that, when your competing, it&#8217;s a really hard decision to give up. And you spend the rest of your day thinking if that was the right decision, and if you shouldn&#8217;t have continued instead. <br />
In 3 years of rumbling it&#8217;s the first time I give up, and I hope I&#8217;ll never do fail again.</p>
<p><strong>Learn from your mistakes</strong> they say &#8230;</p>
<h2>I forgot what was the Rails Rumble</h2>
<p>In addition, I think that I forgot very strong parameter: <strong>I forgot what was the Rails Rumble</strong>. <br />
I forgot how (nicely) intense it was, I forgot that <strong>you can&#8217;t do everything in 48 hours</strong>. <br />
But must of all, I forgot it was <strong>all about fun</strong>. It&#8217;s fun to code, it&#8217;s fun to give birth to an application in 48 hours, but I put too much pressure on myself for this one. <br />
I wanted my application ready to use, nearly &#8220;perfect&#8221;, with this &#8220;whaou&#8221; effect for the guys who will go on the website and register.</p>
<h2>So and now</h2>
<p>Well, I still belive that Launchanalytics is a good idea, it was certainly to big to be created during the Rumble, but a beta version will be released soon. Maybe in the next 2 or 3 weeks. <br />
Besides that, I&#8217;ll learn from my failure and will be back next year, for this awesome competition.<br />
I&#8217;m sure that next year I&#8217;ll choose a much more manageable project, and why not, this time, try to do it with a team.<br />
<strong>Thanks a lot to all the RailsRumble organisers</strong>, you make this competition as awesome as it can be! <br />
Congratulation to everyone who participated, and good luck for the voting period now.</p>
<p>You can have a look to all the awesome applications that were created at <a href="http://railsrumble.com/teams">http://railsrumble.com/teams</a>.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[RailsRumble Tonight]]></title>
    <link href="http://notgeeklycorrect.com/2010/10/15/railsrumble-tonight/"/>
    <updated>2010-10-15T00:00:00+01:00</updated>
    <id>http://notgeeklycorrect.com/2010/10/15/railsrumble-tonight</id>
    <content type="html"><![CDATA[<p>So tonight is <a href="http://railsrumble.com">RailsRumble</a> night.</p>
<p>It&#8217;s going to be my 3rd participation to the contest, and all my ammo are ready</p>
<p><img src="http://farm5.static.flickr.com/4152/5081995320_9203ef7343.jpg" title="RailsRumble, all my ammo" alt="RailsRumble, all my ammo" /></p>
<h2>The rules</h2>
<p>The rules are really simple: <strong>Create the best application you can, in 48 Hours</strong>. <br />
From scratch, including server configuration and deployment. You are allowed to work on any project you want, the code as to be done in Ruby, but you are not allowed to work on any digital assets, tests, user stories, logo &#8230; before the competition starts.<br />
And organisers are tracking the teams on <a href="http://github.com">Github</a>.</p>
<p>Competition starts at 00:00 <span class="caps">GMT</span>, so it&#8217;s Saturday 1am here in Bristol.</p>
<h2>Why the hell would you work for 48 Hours, on a week end!</h2>
<p>It&#8217;s a recurring question, every time I mention the Rails Rumble.</p>
<p>To be honest the last 2 years, my projects where more toys than anything else. The kind of project you do and ditch when the competition is over.</p>
<p>But it&#8217;s still a real challenge to create an app in 48 Hours, and I like this kind of challenge. I like the moment of happiness than come with it (as well as the frustration ones :/). I like hanging in <span class="caps">IRC</span> and see what the others are doing, and it&#8217;s really a good time to sharpen your coding skills.</p>
<h2>This year project, Launch[api/analytics?]</h2>
<p>This year will be different from previous years. I&#8217;ve got a good idea I think. Something that might be useful to a lot of developers.</p>
<p>The name is not really decided yet, it could be launchapi or launchanalytics, or both &#8230;</p>
<p>Basically, when we want to launch a web application, there is always a phase of Beta. This can be a closed beta or an open beta.</p>
<p>When it comes to managing those invites, and making useful analytics of them, when always find our self reinventing the wheel.</p>
<p>So my idea is to create an api and a dashboard that will manage the invite system for the developers. The api will takes care of the invite-redeem-registration system, and the dashboard will creates nice and comprehensible results.</p>
<p>In the dashboard, you will be able to:</p>
<ul>
	<li>Manage the invites</li>
	<li>See reports and graphs of number of invites vs amount of registrations.</li>
	<li>Manage what I&#8217;m calling funnels and streams.</li>
</ul>
<p>Funnels and streams are, I think, a really nice touch.</p>
<p>Your funnel will be used to direct the streams of your invites.</p>
<p>For example you can create a funnel Social Media, and have an different invite code for your twitter feed, your Facebook page and your blog. So you can track which stream is driving more attraction in your audience.</p>
<p>You will be able to create stream with limited invites. Let says you create a Blogger funnel. Your stream will be different bloggers, that will be able to invite their readers with an unique invite code. This invite code will give them a certain number of available invites. The report will shows you which blogger as the best virality.</p>
<p>To me, that sounds like a lot of fun and a good idea, we will see what the judges think about it ;)</p>
<h2>So, and after the Rumble?</h2>
<p>Well, this year, I am really thinking about keeping the application lives after the rumble, and because that is an application targeted for developers, I assumed that I will have a nice output of what they think about it.</p>
<p>What I want to add, after the Rumble is a third part to application, like a Launch Hub, where beta application developers can promote their creation, and users will be able to request an invite (using the <span class="caps">API</span> obviously).</p>
<p>So, wait and see. It should be live and running in a little bit more than 48 Hours from now ;).</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Caution, wet paint]]></title>
    <link href="http://notgeeklycorrect.com/2010/10/10/caution-wet-paint/"/>
    <updated>2010-10-10T00:00:00+01:00</updated>
    <id>http://notgeeklycorrect.com/2010/10/10/caution-wet-paint</id>
    <content type="html"><![CDATA[<p>It&#8217;s Sunday, and I&#8217;m moving from <a href="http://www.wordpress.com">Wordpress</a> to the amazing <a href="http://github.com/mojombo/jekyll">Jekyll</a> blog engine.<br />
All the data reimport and blog post from the old Wordpress should be fine, it&#8217;s just a matter of polishing my (minimal) design now.</p>
<p>The code used to create this blog will soon be available on github as well.</p>
<p>See you soon.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My two weeks pair programming review]]></title>
    <link href="http://notgeeklycorrect.com/2010/04/14/my-two-weeks-pair-programming-review/"/>
    <updated>2010-04-14T00:00:00+01:00</updated>
    <id>http://notgeeklycorrect.com/2010/04/14/my-two-weeks-pair-programming-review</id>
    <content type="html"><![CDATA[<p>The past 2 weeks I&#8217;ve paired with Theo Cushion (<a href="http://twitter.com/theozaurus">Theo&#8217;s Twitter</a> | <a href="http://github.com/theoooo">Theo&#8217;s GitHub</a>).</p>
<p>Was planned some Erlang joy, a lot of system/server maintenance, good amount of Ruby and some JavaScript goodness.</p>
<h2>Pair programming?</h2>
<blockquote cite="http://en.wikipedia.org/wiki/Pair_programming">Pair programming is an agile software development technique in which two programmers work together at one work station. One types in code while the other reviews each line of code as it is typed in. The person typing is called the driver. The person reviewing the code is called the observer (or navigator<sup class="footnote" id="fnr1"><a href="#fn1">1</a></sup>). The two programmers switch roles frequently (possibly every 30 minutes or less).<br />
<br />
While reviewing, the observer also considers the strategic direction of the work, coming up with ideas for improvements and likely future problems to address. This frees the driver to focus all of his or her attention on the &#8220;tactical&#8221; aspects of completing the current task, using the observer as a safety net and guide.</blockquote>
<p><a title="Pair programming article on Wikipedia" href="http://en.wikipedia.org/wiki/Pair_programming">Pair programming on Wikipedia</a></p>
<h2>Pair setup</h2>
<p style="text-align: center;"><a href="http://www.notgeeklycorrect.com/wp-content/uploads/DSC00413.JPG"><img class="size-medium wp-image-621  aligncenter" title="pair programming setup" src="http://www.notgeeklycorrect.com/wp-content/uploads/DSC00413-300x225.jpg" alt="pair programming setup" width="300" height="225" /></a><br />
<br />
<br />
<br />
<ul><br />
	<li>We&#8217;ve used Theo&#8217;s desk, composed of a Mac laptop and a Dell 22&quot; screen in portrait mode.</li>
	<li>One keyboard one mouse.</li>
	<li>2 chairs.</li>
	<li>Swapping every hour.</li>
	<li>10 working days.</li>
	<li>8/9 hours days.</li>
	<li>1 break at lunch time + 2/3 little table football breaks while tests passing.</li>
</ul>
<h2>My pair programming experience</h2>
<p>First of all, I probably had the most enjoyable 2 weeks programming from a long time!. <strong>Lot of work</strong> but a <strong>lot of fun</strong> as well, the kind of fun you can&#8217;t have alone in your computer, this was probably the best part of the experience. Next week I&#8217;ll pair with <a title="Jamie Dyer blog" href="http://kernowsoul.com/">Jamie Dyer</a> and I expect the same amount of fun with him!</p>
<p>Theo is a really smart guy, smart enough to makes complicate explanations looks simpler. That was a big plus while pairing on part that I&#8217;d never worked before like the Erlang world or the <span class="caps">XMPP</span> world.</p>
<p>We found ourselves <strong>more productive</strong> than usual while pairing. First of all you can&#8217;t cheat, you are no going to open your emails/facebook/twitter/another website while the other one is typing. Two people on one computer, and regular switching, there is <strong>no way to procrastinate</strong>. Secondly, on complex problems, it&#8217;s <strong>always good to have a second pair of eyes</strong> on the proposed solution. Maybe your teammate will find a better/simpler/quicker solution to the problem. And finally it&#8217;s always good to have someone <strong>spotting the nasty typo while writing</strong> &#8211; you know forgetting a comma, forgetting to migrate the database, misspelling a word &#8230; &#8211; this can save a lot of time. So that&#8217;s a big plus in terms of productivity.</p>
<p>But the other side of the coin is that I finished my day way more tired. Because your brain is constantly assailed by requests, when you&#8217;re typing you have to deal with the keyboard, the screen, the problem you&#8217;re solving <strong>+ someone on your back watching you and talking to you</strong>. When you&#8217;re on the back you&#8217;ll try to spot this little typo that will cause problem, or find some help in doc/book, or try to imagine a better way to correct the problem &#8230; well, basically, at the end of the day your brain is fried and so you are.</p>
<p>Another problem had been the gears. I&#8217;m used to work on my Linux + Openbox powered laptop, using Vim to code. Moving to Mac Os + Textmate was a &#8220;painful&#8221; experience. You have to re-learn a lot of basic commands/shortcuts, your mouse is doing silly things with the windows, and you lost your markers &#8230; I&#8217;ve asked Theo to do one week on his machine one week on mine, but the response was a loudly &#8220;<span class="caps">HELL</span> NO&#8221; ;).</p>
<h2>In a nutshell</h2>
<p>So, the dark sides are that I was exhausted and I had to learn how to pilot a Mac Os. But the bright sides were finding myself more productive, less procrastinating and having more fun during the day. No need to mention that I&#8217;ll be really happy to renew the experience next week, and I found pair programming a really interesting way to work.</p>
<p>What about you, did you already tried pair programming? Did you enjoy it? Don&#8217;t hesitate to share your experience in comments.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Implementing RPX with clearance in Ruby on rails in 5 minutes]]></title>
    <link href="http://notgeeklycorrect.com/2010/03/22/implementing-rpx-with-clearance-in-ruby-on-rails-in-5-minutes/"/>
    <updated>2010-03-22T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2010/03/22/implementing-rpx-with-clearance-in-ruby-on-rails-in-5-minutes</id>
    <content type="html"><![CDATA[<p>When it comes to <a title="user enagamenet on wikipedia" href="http://en.wikipedia.org/wiki/Customer_engagement">user engagement</a>, having your users being able to create an account or login with one click is a really &#8220;nice to have&#8221; feature.</p>
<p>This is where <a title="RPXnow website" href="http://www.rpxnow.com"><span class="caps">RPX</span></a> appears to be able a really neat solution.</p>
<p>It allows your users to signin/signup to your website, througth the <span class="caps">RPX</span> widget, using their preferred provider (Google/OpenId, Facebook, &#8230;).</p>
<p>You can consult the <a title="RPXnow website" href="http://www.rpxnow.com"><span class="caps">RPX</span></a> website for a <a title="RPX overview" href="https://rpxnow.com/overview">complete list of supported provider</a>.</p>
<h2>Expectations</h2>
<p>I&#8217;ll assume that you already have <a title="Clearance on github" href="http://github.com/thoughtbot/clearance">Clearance</a> setup properly in your app. I presume that this tutorial can be used as a blueprint for implemennting <span class="caps">RPX</span> with others authentication system in Ruby on Rails.</p>
<p>What do we want to achieve:<br />
<ul><br />
	<li>A user should still be able to signin/signup with Clearance</li><br />
	<li>A user should be able to create a new account throught the <span class="caps">RPX</span> widget</li><br />
	<li>A user should be able to sign in throught the <span class="caps">RPX</span> widget</li><br />
	<li>If an existing user sign up via the <span class="caps">RPX</span> widget, with an existing email, it should merge the informations</li></p>
</ul>
<h2>Installing rpx_now gem</h2>
<p>First you&#8217;ll need to create an account on the <a href="https://rpxnow.com/" title="rpx website"><span class="caps">RPX</span> website</a>. Then create your application in their application manager.</p>
<p>You&#8217;ll be given an access key.</p>
<p><a href="http://github.com/grosser/rpx_now" title="rpx_now github page">Rpx_now gem</a> is certainly the best <span class="caps">RPX</span> <span class="caps">API</span> implementation available out there.</p>
<p>Install it as you usually do for a gem in your Rails application, using bundler or config.gem.</p>
<p>Create a migration, use the migration code bellow and then run your db:migrate.</p>
<div>
<pre><code class='ruby'>class AddIdentifierToUsers &amp;lt; ActiveRecord::Migration
def self.up
add_column :users, :identifier, :string
end
def self.down
remove_column :users, :identifier
end
<p>end</code></pre></p>
</div>
<p>We are adding the identifier column to the user table in order be know from where the users come from.</p>
<p>Add the <span class="caps">RPX</span> key in your config/environment.rb:</p>
<div>
<pre><code class='ruby'>config.after_initialize do # so rake gems:install works
RPXNow.api_key = &quot;<span class="caps">YOU</span> <span class="caps">RPX</span> <span class="caps">API</span> <span class="caps">KEY</span>&quot;
<p>end</code></pre></p>
</div>
<p>And you&#8217;re now ready to implement the code.</p>
<h2>New user and login with <span class="caps">RPX</span></h2>
<p><span class="caps">RPX</span> doesn&#8217;t know if the user already exists in your app database or not. So handling a new user creation or login a user will use the same method.</p>
<p>This method is the one you specify when rendering the <span class="caps">RPX</span> widget inside the new session or new user views. Let&#8217;s call it rpx_token</p>
<p>The browser will be redirected to the rpx_token method after the <span class="caps">RPX</span> login process. It will be posted a token argument and will call the <span class="caps">RPX</span> api to retrieve the user profile informations.</p>
<p>Add the RPX_now embed_code method is your new session view and new user view (outside of the form).</p>
<p>[Create an helper is a good idea]</p>
<div>
<pre><code class='ruby'>RPXNow.embed_code('MyRPXApplicationName', rpx_token_session_url)</code></pre>
</div>
<p>You can see that we are using the rpx_token_session_url route.</p>
<p>This will need to be define in your config/routes.rb</p>
<div>
<pre><code class='ruby'>map.resource  :session,
:controller =&gt; &#8216;sessions&#8217;,
:member     =&gt; {:rpx_token =&gt; [:post] }</code></pre>
</div>
<p>Then in your sessions_controller add an rpx_token method:</p>
<div>
<pre><code class='ruby'>def rpx_token
raise ActionController::Forbidden unless data = RPXNow.user_data(params[:token])
@user = User.find_by_identifier(data[:identifier]) || User.find_by_email(data[:email])
if @user.blank?
@user = User.new(:username =&gt; data[:username],:email =&gt; data[:email],:identifier =&gt; data[:identifier])
@user.email_confirmed = 1
@user.save
end
<ol>
	<li>We are using the clearance sign_in method to do the following behaviour</li>
	<li>session[:user_id] = @user.id</li>
	<li>@current_user = @user</li>
</ol>
sign_in(@user)
redirect_to root_path
<p>end</code></pre></p>
</div>
<p>If we were only using <span class="caps">RPX</span> to handle user login, that would be our last step there.</p>
<p>But because when want to make it play it nicely with Clearance, we&#8217;ll need an extra step.</p>
<p>If you try to use it at this point, Clearance will complain that the new user doesn&#8217;t have any password. Fortunately there is an existing Clearance method called <a href="http://rdoc.info/rdoc/hashrocket/clearance/blob/c46bd9a9809e23d734f7d1587a44122afd2e8f5f/Clearance/App/Models/User/ProtectedInstanceMethods.html#password_required%3F-instance_method" title="Clearance RDOC password required">password_required?</a></p>
<p>So in our user model we&#8217;ll need to super seed this method in order to add our requirement.</p>
<div>
<pre><code class='ruby'>#models/user.rb
&#8230;
def password_required?
super &amp;&amp; identifier.blank?
end
&#8230;</code></pre>
</div>
<p>Now, if there is an identifier supplied we can create the new account without password.</p>
<p>[Be sure that you have your tests for not being able to login is password is blank ;)].</p>
<p>At this point you can now create a user, login an existing user or a new user all with <span class="caps">RPX</span> and Clearance.</p>
<h2>The tests</h2>
<p>To test that I used <a href="http://github.com/thoughtbot/shoulda" title="Shoulda github page">Shoulda</a> and <a href="http://github.com/floehopper/mocha" title="Mocha github page">Mocha</a>.</p>
<div>
<pre><code class='ruby'>#session_controller_tests
<p>context &quot;on <span class="caps">GET</span> :new&quot; do<br />
    should &quot;Display <span class="caps">RPX</span> widget&quot; do<br />
      RPXNow.expects(:embed_code).with(&#8216;MyRPXAppName&#8217;, rpx_token_session_url)<br />
      get :new<br />
    end<br />
end</p>
context &quot;Connection via <span class="caps">RPX</span>&quot; do
context &quot;from a non existing user&quot; do
setup do
RPXNow.expects(:user_data).with(&quot;123456&quot;).returns({:email =&gt; &quot;rpxuser@email.com&quot;,:identifier =&gt; &quot;test&quot;,:username =&gt; &quot;rpxusername&quot;})
post :rpx_token, :token =&gt; &quot;123456&quot;
end

should_change &quot;User.count&quot;, :by =&gt; 1
should &quot;create the user with the <span class="caps">RPX</span> data&quot; do
assert assigns(:user).email      == &quot;rpxuser@email.com&quot;
assert assigns(:user).identifier == &quot;test&quot;
assert assigns(:user).username   == &quot;rpxusername&quot;
end
should &quot;set the session with the newly created user informations&quot; do
assert @request.session[:user_id] == assigns(:user).id
end
should &quot;confirm the email on the user creation&quot; do
assert assigns(:user).email_confirmed == true
end
should_redirect_to(&quot;the root page&quot;) { root_path }
end
context &quot;from an existing user&quot; do
setup do
@user = Factory(:user)
RPXNow.expects(:user_data).with(&quot;123456&quot;).returns({:email =&gt; @user.email,:identifier =&gt; &quot;test&quot;,:username =&gt; &quot;rpxusername&quot;})
post :rpx_token, :token =&gt; &quot;123456&quot;
end
should &quot;set the session with the user informations&quot; do
assert @request.session[:user_id] == @user.id
end
should &quot;not create a second user&quot; do
assert User.count == 1
end
end
context &quot;with an invalid token&quot; do
setup do
RPXNow.expects(:user_data).with(&quot;invalidtoken&quot;).returns(false)
post :rpx_token, :token =&gt; &quot;invalidtoken&quot;
end
should_respond_with :forbidden
should_not_change &quot;User.count&quot;
end</code></pre>
</div>
<div>
<pre><code class='ruby'>#unit/usert_test.rb
<p>context &quot;A user&quot; do</p>
<p>&#8230;</p>
should &quot;not request set password_requiered? to false if an identifier is set&quot; do
@user.identifier = &quot;test&quot;
assert !@user.password_required?
end

should &quot;set password_required? to true is identifier is not set&quot; do
@user.identifier = &quot;&quot;
assert @user.password_required?
end
should &quot;be able to create a user without password if identifier is set&quot; do
<code>new_user = User.new(:email =&amp;gt; &amp;quot;test</code>gmail.com&quot;,:identifier =&gt; &quot;test&quot;)
assert @new_user.save
end
should &quot;not be able to create a user without a password if identifier is not set&quot; do
<code>new_user2 = User.new(:email =&amp;gt; &amp;quot;hey</code>gmail.com&quot;)
assert !@new_user2.save
end
<p>&#8230;</p>
<p>end</code></pre></p>
</div>
<h2>Conclusion</h2>
<p>I haven&#8217;t play with the <span class="caps">PRO</span> features yet, but rpx_now is really simple to implement and it&#8217;s really simple to have it working along Clearance.</p>
<p>I hope it was useful. Let me know if you had any trouble with implementing it.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Easy rounded corners working in IE7/IE8]]></title>
    <link href="http://notgeeklycorrect.com/2010/01/21/easy-rounded-corners-working-in-ie7ie8/"/>
    <updated>2010-01-21T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2010/01/21/easy-rounded-corners-working-in-ie7ie8</id>
    <content type="html"><![CDATA[<p>This afternoon I was looking for a solution to (easily) add rounded corners into some elements of a website we are developing.</p>
<p>After having tried <a title="curvycorners jquery plugin" href="http://www.curvycorners.net/" target="_blank">Curvycorners</a>, <a title="jQuery Corners plugin" href="http://www.malsup.com/jquery/corner/" target="_blank">jQuery Corners</a> without any success (it was completely breaking the design under IE) I finally came to <a title="DD_roundies plugin" href="http://dillerdesign.com/experiment/DD_roundies/" target="_blank">DD_roundies</a>, which use <a title="Microsoft VML wikipedia" href="http://en.wikipedia.org/wiki/Vector_Markup_Language" target="_blank">Microsoft <span class="caps">VML</span></a>.</p>
<h2>DD_roundies</h2>
<p>DD_roundies is a really lightweight piece of code that will allows you to add rounded borders to nearly every element of you page by executing</p>
<div>
<pre><code class='bash'>DD_roundies.addRule('.roundify', '10px');</code></pre>
</div>
<p>It&#8217;s smart enough to only apply if the Browser doesn&#8217;t support <span class="caps">CSS</span> border-radius styles, so you can just continue to work on your <span class="caps">CSS</span> for a proper implementation in other browser than IE.</p>
<h2>Because it&#8217;s not a dream world</h2>
<p>So this implementation is working perfectly in IE7 but doesn&#8217;t work in IE8, so if you don&#8217;t need IE8 specific functionalities I would recommend you to just add a meta in your head section to for IE7 compatibility mode in IE8.</p>
<div>
<pre><code class='bash'>&amp;lt;meta content='IE=EmulateIE7' http-equiv='X-UA-Compatible' /&amp;gt;</code></pre>
</div>

<p>or if you use <span class="caps">HAML</span></p>
<div>
<pre><code class='bash'>%meta{:content =&amp;gt; &amp;quot;IE=EmulateIE7&amp;quot;, &amp;quot;http-equiv&amp;quot; =&amp;gt; &amp;quot;X-UA-Compatible'&amp;quot;}</code></pre>
</div>
<p>And off you go, now you can easily round everything like the cool kids ;)</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Superswitcher, a super alternative to alt+tab]]></title>
    <link href="http://notgeeklycorrect.com/2010/01/08/superswitcher-a-super-alternative-to-alttab/"/>
    <updated>2010-01-08T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2010/01/08/superswitcher-a-super-alternative-to-alttab</id>
    <content type="html"><![CDATA[<p>I recently came across a fantastic alternative to the alt+tab command on Linux, it&#8217;s called <a href="http://code.google.com/p/superswitcher/">Superswitcher</a>.<br />
<p style="text-align: center;"><a href="http://www.notgeeklycorrect.com/wp-content/uploads/superswitcher.png"><img class="size-medium wp-image-582    aligncenter" title="superswitcher" src="http://www.notgeeklycorrect.com/wp-content/uploads/superswitcher-300x187.png" alt="superswitcher" width="300" height="187" /></a></p>
<h2>Nice features on it</h2>
<p>Press the command touch (Windows touch on the keyboard) to display Superswitcher.</p>
<p>To switch from a desktop to another press <strong>Command + arrow left or right</strong></p>
<p>To switch from available windows in a desktop press <strong>Command + arrow up or down</strong></p>
<p>To move a window into another desktop press <strong>Command + shift + arrow left or right</strong></p>
<p>To search within all windows name <strong>Command + [any text]</strong></p>
<h2>Screencast</h2>
<p>I&#8217;ve just recorded a quick screencast to show all these functionalities</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/AGaSatCyxTY&hl=en&fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/AGaSatCyxTY&hl=en&fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h2>So?</h2>
<p>For me it&#8217;s now a must have on every computer I use, because it make organizing my desktops really easily.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Accelerate your tests in Rails with Ubuntu]]></title>
    <link href="http://notgeeklycorrect.com/2010/01/06/accelerate-your-tests-in-rails-with-ubuntu/"/>
    <updated>2010-01-06T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2010/01/06/accelerate-your-tests-in-rails-with-ubuntu</id>
    <content type="html"><![CDATA[<p>I recently came across a blog post about accelerate Ubuntu disk access perfomrance.</p>
<p>You can read it on <a href="http://blog.smartlogicsolutions.com/2009/06/04/mount-options-to-improve-ext4-file-system-performance/" target="_blank">Smartlogic blog</a>, it&#8217;s well explained so I&#8217;n not going to copy but I just would like to add some ideas:</p>
<h3>You don&#8217;t need to boot on a live CD</h3>
<p>Where Nick ask to boot on a live CD and mount your partitions, you don&#8217;t really need this part.</p>
<p>First open your /etc/fstab file and spot your active partitions.</p>
<p>For example on my development machine, I use /dev/sda1 for my / and /dev/sda6 for my /home</p>
<p>Close the file and run</p>
<div>
<pre><code class='bash'>sudo tune2fs -o journal_data_writeback /dev/sdXY</code></pre>
</div>
<p>on each partitions you&#8217;ll need to tweak.</p>
<h3>Apply noatime and data=writeback to all your working partitions</h3>
<p>As you&#8217;ve done tune2fs on each partitions, you&#8217;ll need to change the mounting options (noatime and data=writeback) in each partitions line inside your fstab.</p>
<h3>Do not do it on your server!</h3>
<p>Because these modifications make the file system more fragile if crashing, please do not consider doing these tweaks on your production servers.</p>
<h3>Enjoy the boost</h3>
<p>Where Nick claim a 30% speed gain on his machine, I can claim a gain of more that 55% as I went down from 55 minutes to 25 minutes for the same test suites on one of the biggest application I work on!</p>
<h3>Was it useful?</h3>
<p>Thanks a lot to <a href="http://blog.smartlogicsolutions.com/author/ngauthier/">Nick Gauthier</a> for his initial blog post, I hope it will be useful to some of you.<br />
Let me know in the comments if you know other tweak that can make my <a href="http://www.notgeeklycorrect.com/english/2009/09/04/netbook-for-webdevelopers/">little machine</a> works faster.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I want to make 2010 really exciting]]></title>
    <link href="http://notgeeklycorrect.com/2010/01/04/i-want-to-make-2010-really-exciting/"/>
    <updated>2010-01-04T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2010/01/04/i-want-to-make-2010-really-exciting</id>
    <content type="html"><![CDATA[<p>I&#8217;m just back from 10 days holidays in France. Catching up with family and friends was really good, but what I really enjoyed was my disconnection for all development/web platform during these 10 days.<br />
It&#8217;s always a good way, at the end of the year, to do a little retrospective on his work/life and give the new year a fresh start.</p>
<h2>2009 was a really busy and exciting year</h2>
<p>While I was looking back on what happened in 2009 I found that:<br />
<ul><br />
<li><b>I moved 2 times.</b></li><br />
<li><b>I had 1 bike accident.</b> 2009 was a cycling year for me. I started to cycle everytime, everywhere to ditch the car. In mid year I had an accident with a broken colar bone in results. I spent nearly 3 weeks out of work. It was a really bad time.</li><br />
<li><b>I&#8217;m now engaged.</b> This is a result of the bike accident :D.</li><br />
<li><b>I launched 3 web app.</b> In the beginning of the year I launched <a href="http://www.serialcooking.com">Serialcooking</a>, which is now closed but the blog is still alive. Then in September I launched <a href="hhtp://www.tweetcetetera.com">Tweetcetera</a>, an easy web twitter client. Finally in December I launched <a href="http://www.howgoodismyfood.com">Howgoodismyfood</a>.</li><br />
<li><b>I moved to full time freelance.</b> This is the big change this year, and a big challenge as well as my network, in England, is not as big as it was in France.</li></p>
</ul>
<p>So basically 2009 was a really good year, and I&#8217;ll work on make 2010 even better.</p>
<h2>Make 2010 better and more exciting than 2009</h2>
<ul>
<li>My first decision in 2010 is to discontinue the Serialcooking web application (we&#8217;ll keep the blog alive). It was supposed to be redo from scratch (because I made a lot of UI mistakes), but finally it&#8217;s going to take a lot of time and effort, and in 2010 I really want to concentrate myself on my freelance activity.</li>
<li>I&#8217;ll <b>blog more</b> as well. This is going to be result of the previous decision. I&#8217;ll have more time to update this blog and to create tutorials and smaller apps.</li>
<li><b>Embrace this f</b>* social media**: I&#8217;ll try to be proactive on <a href="http://uk.linkedin.com/in/nicolasalpi" title="my linkedin profile">Linkedin</a>, <a href="http://www.facebook.com/nicolas.alpi" title="my facebook profile">facebook</a> and <a href="http://www.twitter.com/spyou" title="My Twitter profile">Twitter</a>.</li>
<li>I&#8217;ll do my best to <b>attend at a minimum of 1 network/conference</b> event a month.</li>
<li>Run the Bath half marathon</li>
<li><b>Release at least 3 plugins/gems</b>: I&#8217;ve got some code in the cardboard that I need to clean up before releasing, but I&#8217;ll do it</li>
</ul>
<h2>The most important one</h2>
<p>Find some interesting work!</p>
<p>As some might know I&#8217;m a workaholic, I just love coding, crafting websites, applications. So if you have any project in preparation, do not hesitate to <a href="http://www.notgeeklycorrect.com/about/">contact me</a> for a chat.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[What's new on Tweetcetera]]></title>
    <link href="http://notgeeklycorrect.com/2009/11/06/whats-new-on-tweetcetera/"/>
    <updated>2009-11-06T00:00:00+00:00</updated>
    <id>http://notgeeklycorrect.com/2009/11/06/whats-new-on-tweetcetera</id>
    <content type="html"><![CDATA[<p>Last week has been a pretty busy week, but I was able to put some time on <a href="http://www.tweetcetera.com">Tweetcetera</a>.</p>
<p>Appart for some little bug correction, here are the major update that have been done this week</p>
<h2>Realtime update in title and tab bar</h2>
<p>When <a href="http://www.tweetcetera.com">Tweetcetera</a> refresh your tweets, it display a little notification on your page displaying the number of new tweets.<br />
<p style="text-align: center;"><a href="http://www.notgeeklycorrect.com/wp-content/uploads/tweetcetera_top_updates.png"><img class="size-full wp-image-555  aligncenter" title="tweetcetera_top_updates" src="http://www.notgeeklycorrect.com/wp-content/uploads/tweetcetera_top_updates.png" alt="tweetcetera_top_updates" width="250" height="181" /></a></p>
<p>Now it also display this number in your title bar and in you tab bar if you&#8217;re using a tabbed browser. That&#8217;s really convenient as you don&#8217;t need to go back to the page to view is their are updates in your network.</p>
<h2>Real time count down</h2>
<p><a href="http://www.tweetcetera.com">Tweetcetera</a> now display a count down before the next auto update of your timeline, user timeline or search results.<br />
<p style="text-align: center;"><a href="http://www.notgeeklycorrect.com/wp-content/uploads/tweetecetera_next_refresh.png"><img class="size-full wp-image-556  aligncenter" title="tweetecetera_next_refresh" src="http://www.notgeeklycorrect.com/wp-content/uploads/tweetecetera_next_refresh.png" alt="tweetecetera_next_refresh" width="178" height="55" /></a></p>
<p>So you now exactly when it&#8217;s going to be refreshed.</p>
<h2>Follow cost</h2>
<p><a href="http://www.tweetcetera.com">Tweetcetera</a> is now using the <a href="http://followcost.com/">Followcost</a> api to display the number of average tweets/day and the number of tweets replied on a user page.<br />
<p style="text-align: center;"><a href="http://www.notgeeklycorrect.com/wp-content/uploads/tweetcetera_follow_cost.png"><img class="size-full wp-image-557  aligncenter" title="tweetcetera_follow_cost" src="http://www.notgeeklycorrect.com/wp-content/uploads/tweetcetera_follow_cost.png" alt="tweetcetera_follow_cost" width="200" height="464" /></a></p>
<p>These indications, combined to the &#8220;mentioning&#8221; sidebar section, give you all the informations you need to decide if you&#8217;ll follow a user or not.</p>
<h2>What&#8217;s next?</h2>
<p>Next week I&#8217;ll be working on list implementation, and usernames auto completion. Please if you want to see any features, just drop me a message or comment on the <a href="http://getsatisfaction.com/tweetcetera">getsatisfaction</a> page or on this blog post.</p>]]></content>
  </entry>
  
</feed>
