<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Here I am, again.
I am a traveller between reality on one hand and bits&amp;bytes on the other.
Connecting what usually is disjunctive.
Playing with the immaterial.
Challenging myself and the world around me - day in, day out.




  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-33444478-1']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</description><title>Between reality and cyberspace</title><generator>Tumblr (3.0; @ox86)</generator><link>http://ox86.tumblr.com/</link><item><title>User testing done right</title><description>&lt;p&gt;Don&amp;#8217;t make assumptions about the user, have her test your website or app! It&amp;#8217;s easy, quickly done and cheap. Trust me.&lt;/p&gt;

&lt;p&gt;When it comes to usability and providing the best solution for the user, I have seen lots of mind-numbing, long and - in the end - pointless discussions.&lt;/p&gt;

&lt;p&gt;People tend to project their own behaviour onto the users of their application - and often this turns into discussions about the user as if she was an alien, yet to be discovered life form from outer space.&lt;/p&gt;

&lt;p&gt;I did that as well, but I learnt my lesson: &lt;strong&gt;I&amp;#8217;m not the user. You&amp;#8217;re not the user user either.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You know how your application is supposed to work. You know what feature can be found where - your users may think differently. And they may be different from what you think they are.&lt;/p&gt;

&lt;p&gt;A brilliant example was one of my websites: I put a big, prominent &amp;#8220;Sign in with twitter&amp;#8221; button on the homepage, but the conversion rate was poor. So I decided to do a very simple, quick and cheap way of usability testing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 5 second test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this case, you take a screenshot of a prototype, your website, your app, your design and upload it to &lt;a href="http://www.fivesecondtest.com/"&gt;Usability Hub&lt;/a&gt; (which is free, when you do other peoples tests - or you can pay for answers) and asked the question &amp;#8220;where can you become a user of that service&amp;#8221; and asked for 10 answers.&lt;/p&gt;

&lt;p&gt;Now this picture is shown to different participants for 5 seconds each. Afterwards my question will appear and they can answer.
The answers were surprising and shocking: Only 2 people got it right.
The others answered along the lines &amp;#8220;I see, where I can sign in after sign up, but where do I sign up?&amp;#8221;.&lt;/p&gt;

&lt;p&gt;This was interesting, because with Twitter login, there are no concepts such as &amp;#8220;sign up&amp;#8221; and &amp;#8220;login&amp;#8221; - you hit &amp;#8220;sign in&amp;#8221; the first time and get signed up, you hit it the next time you&amp;#8217;re on the website and you get logged in.&lt;/p&gt;

&lt;p&gt;Knowing the struggles of my users, I re-captioned the button &amp;#8220;Sign up with twitter&amp;#8221; and added a little &amp;#8220;Sign in with twitter&amp;#8221; on the top right corner et voila: Conversion rate rocketed.&lt;/p&gt;

&lt;p&gt;UsabilityHub also offers other tests, like&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The click test&lt;/strong&gt;, where you ask your users a question like &amp;#8220;Where would you click to sign up&amp;#8221; and see a) where they actually click b) how long it takes them to spot it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The nav flow test&lt;/strong&gt;, where you upload multiple screens and ask the user to carry out a task that should take them from one screen to another - you&amp;#8217;ll learn if your navigation concept works from this test type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test early &amp;amp; test often&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This shows: Testing early is possible and valuable! All it takes is a few minutes and a screenshot, a design, or even a picture of a sketch on paper.
This allows you to check, if your users &amp;#8220;get it&amp;#8221; on the many different levels:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Does the wording make sense?&lt;/li&gt;
&lt;li&gt;Does the layout structure and content hiearchy make sense?&lt;/li&gt;
&lt;li&gt;Is the visual design confusing people?&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;For all this, you don&amp;#8217;t need a working prototype, you need nothing &amp;#8220;done&amp;#8221; or &amp;#8220;shiny&amp;#8221; - but you can already learn about your users. It takes minutes and is cheap (or free).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With services such as &lt;a href="http://ox86.tumblr.com/post/39297092190/betapunch-test-your-website-with-real-users"&gt;BetaPunch&lt;/a&gt; or &lt;a href="http://www.youeye.com"&gt;YouEye&lt;/a&gt; it&amp;#8217;s very easy to get real users to do a couple of tasks on your app or website and get a recording with them saying what they think while carrying out the tasks you gave them as well as their inputs and mouse movements.&lt;/p&gt;

&lt;p&gt;BetaPunch, for example, offers one free test to get you started.&lt;/p&gt;

&lt;p&gt;There is also a user test &lt;em&gt;light&lt;/em&gt; version, where you can only get recordings of your website / app users using your app and see their mouse movements and inputs - &lt;a href="http://ox86.tumblr.com/post/39303850148/get-recordings-of-users-on-your-website"&gt;see here for more details on that&lt;/a&gt;.&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/49854476829</link><guid>http://ox86.tumblr.com/post/49854476829</guid><pubDate>Tue, 07 May 2013 16:00:21 +0200</pubDate><category>usability</category><category>testing</category><category>web development</category><category>user experience</category></item><item><title>Lightweight virtual containers with virtual networking</title><description>&lt;h1&gt;What and why?&lt;/h1&gt;

&lt;p&gt;Sometimes you want to have a quick &amp;amp; cheap way of isolating a few processes in a lightweight, para-virtualized environment.&lt;/p&gt;

&lt;p&gt;When full-blown virtualization, for instance with Xen or KVM, is just too much (or not suitable, because you&amp;#8217;re already running in a virtual environment) and process-level isolation (what for example &lt;a href="http://www.docker.io/"&gt;docker.io&lt;/a&gt; provides) isn&amp;#8217;t enough, &lt;strong&gt;&lt;a href="http://user-mode-linux.sourceforge.net/"&gt;user mode linux&lt;/a&gt;&lt;/strong&gt; is for you.&lt;/p&gt;

&lt;h1&gt;Example:&lt;/h1&gt;

&lt;h2&gt;Multiple isolated build environments for Continuous Integration&lt;/h2&gt;

&lt;p&gt;One scenario is running integration tests between multiple components on a shared CI server (e.g. Jenkins).&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s elaborate this scenario a little more:&lt;/p&gt;

&lt;p&gt;Say, we have a Jenkins instance that is used to build multiple projects, say an API and a &amp;#8220;frontend webapp&amp;#8221; (I&amp;#8217;ll reference it as &amp;#8220;Frontend&amp;#8221; from now on).
The API can be build and tested independently, but that requires the installation of a bunch of libraries, gems and other fun things.&lt;/p&gt;

&lt;p&gt;The Frontend is a little more complex: In addition to the need of its own dependencies (gems, libs, modules, &amp;#8230;) it also needs a running instance of the latest stable API and a running API also needs a database and other components (let&amp;#8217;s say a message queue).&lt;/p&gt;

&lt;p&gt;The safest bet is to have every system under test (API stand-alone, Frontend instance + API instance + database + message queue) isolated, always freshly created when the tests start and torn down when done.&lt;/p&gt;

&lt;p&gt;Our goal is to setup a virtual container in which we can build the API and another virtual container in which we will setup the database, the message queue, the API and a third one for the frontend, with a virtual network between the second and third container.&lt;/p&gt;

&lt;p&gt;With user-mode linux you can achieve this goal pretty fast&amp;amp;easily:&lt;/p&gt;

&lt;h2&gt;Install user-mode-linux and the utilities needed:&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ apt-get install wget user-mode-linux uml-utilities bridge-utils debootstrap realpath
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Setup a new machine&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/AVGP/5410903"&gt;You can use my create_machine script&lt;/a&gt; which is based on &lt;a href="http://eggdrop.ch/texts/uml/"&gt;this article&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ wget &lt;a href="https://gist.github.com/AVGP/5412047/raw/ee9057124fa32edbf5c427955cc0be4012015ec5/create_machine_switched.sh"&gt;https://gist.github.com/AVGP/5412047/raw/ee9057124fa32edbf5c427955cc0be4012015ec5/create_machine_switched.sh&lt;/a&gt;
$ chmod +x create_machine_switched.sh
$ ./create_machine_switched.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The script will ask you for a few things:
* The hostname of the container (we&amp;#8217;ll use &amp;#8220;API-build&amp;#8221;, &amp;#8220;API-run&amp;#8221; and &amp;#8220;Frontend&amp;#8221;)
* If you want SSH to be installed (&amp;#8220;y&amp;#8221; for our example)
* If you want to configure the network (&amp;#8220;y&amp;#8221; for our example)
* Couple of network settings. For this example we&amp;#8217;re using the following settings:
  * IP-Address: 10.10.10.2 for API-build, 10.10.10.3 for API-run, 10.10.10.4 for Frontend build
  * Network: 10.10.10.0
  * Broadcast: 10.10.10.255
  * Subnet: 255.255.255.0
  * Gateway: 10.10.10.1
* Root password for the container&lt;/p&gt;

&lt;h2&gt;Setting up the host-side networking&lt;/h2&gt;

&lt;p&gt;Before starting the container, we need to set up the host and the network switching on the host machine.&lt;/p&gt;

&lt;p&gt;First of all add the following to &lt;code&gt;/etc/network/interfaces&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    auto tap0
    iface tap0 inet static
            address 10.1.0.1
            netmask 255.255.255.0
            tunctl_user uml-net
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then edit &lt;code&gt;/etc/default/uml-utilities&lt;/code&gt; by uncommenting the line with the &lt;code&gt;UML_SWITCH_OPTIONS&lt;/code&gt; and, if needed, change it to look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;UML_SWITCH_OPTIONS="-tap tap0"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then stop the uml-utilities daemon, bring up &lt;code&gt;tap0&lt;/code&gt; and start uml-utilities again:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ /etc/init.d/uml-utilities stop
$ ifup tap0
$ /etc/init.d/uml-utilities start
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Afterwards, you can start the container by changing in their directories and execute &lt;code&gt;./run&lt;/code&gt;, preferably do this in a screen (or tmux) session:&lt;/p&gt;

&lt;h2&gt;Start the containers&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ cd API-run
$ ./run
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and the same for the other two machines.
You should be abled to login as root on all running instances and ping to the internet as well as to the other instances.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;root@API-run # ifconfig eth0
    eth0   Link encap:Ethernet  HWaddr d2:45:9b:1f:ba:c6
              inet addr:10.10.10.3  Bcast:10.10.10.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:25 errors:0 dropped:0 overruns:0 frame:0
              TX packets:43 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:1092 (1.0 KiB)  TX bytes:2198 (2.1 KiB)
              Interrupt:5
root@API-run # ping -c1 10.10.10.4
PING 10.10.10.4 (10.10.10.4) 56(84) bytes of data.
64 bytes from 10.10.10.4: icmp_req=1 ttl=64 time=0.192 ms

--- 10.10.10.4 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.192/0.192/0.192/0.000 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Setup the NAT on the host&lt;/h2&gt;

&lt;p&gt;For the containers to be abled to reach the internet, you need to enable masquerading and IP-Forwarding using these two commands:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ echo '1' &amp;amp;gt; /proc/sys/net/ipv4/ip_forward
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you can setup all the applications inside the containers (you may use provisioners, such as &lt;a href="http://"&gt;chef&lt;/a&gt; or &lt;a href="http://"&gt;puppet&lt;/a&gt;) and enjoy your virtual testing environment and its virtual networking.&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/48274682732</link><guid>http://ox86.tumblr.com/post/48274682732</guid><pubDate>Thu, 18 Apr 2013 15:00:00 +0200</pubDate><category>virtualization</category><category>linux</category><category>development</category><category>DevOps</category></item><item><title>The bad, the good, the masterpieces</title><description>&lt;p&gt;Building websites and web applications is a craft. And as far as crafts go, there will always be bad, mediocre and great pieces.&lt;/p&gt;

&lt;p&gt;The question is, what makes something a masterpiece? Is it the techniques applied, the perfect mastery of them, the little details?&lt;/p&gt;

&lt;p&gt;Coming back from Rome again, a city full of various disciplines master pieces, I have gained a better understanding.&lt;/p&gt;

&lt;p&gt;Though it&amp;#8217;s hard for me to grasp the entire cleverness and knowledge that contribute to the overall results of each of them, certain patterns and aspects can be found repeatedly on most, if not all, of them.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s usually neither one aspect, nor all of them together, it&amp;#8217;s the consistency in the impression that is created in the observer.&lt;/p&gt;

&lt;p&gt;There is a lot of different aspects that come into play there, for example&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Color theory&lt;/li&gt;
&lt;li&gt;Use of fore- and background, as well as the space in between&lt;/li&gt;
&lt;li&gt;Composition&lt;/li&gt;
&lt;li&gt;Guidance of the viewers&amp;#8217; eyes&lt;/li&gt;
&lt;li&gt;Technique&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Being a developer striving to learn about design, it came as a surprise to me, that the techniques used and how well they were mastered by the artist are not the most important aspect that makes something a masterpiece.&lt;/p&gt;

&lt;p&gt;Looking at a lot of mediocre, some most-popular and some less popular but extraordinarily intriguing items, I figured that mostly three things caught my eyes and captured my attention for more then the average time span:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;The colors and contrasts&lt;/li&gt;
&lt;li&gt;The composition of the piece&lt;/li&gt;
&lt;li&gt;The guidance of view&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The amazing thing I never noticed before: That also worked, when proportions where slightly off, or there were minor defects (e.g. broken off parts of a statue or parts of the canvas) or missing details, etc.&lt;/p&gt;

&lt;p&gt;I did notice these deficiencies, though I was standing there, admiring the overall impression they made on me.&lt;/p&gt;

&lt;p&gt;I had to look at a bunch of those pieces and it was only at the Vatican museums, where most of the art was related to Christianity and there were a lot of more-or-less comparable works to gaze upon, or downright &lt;em&gt;staring&lt;/em&gt; at them for pretty long, to gain the insights, that it&amp;#8217;s the above-mentioned three things (in the order I put them) that attracts people.&lt;/p&gt;

&lt;p&gt;I even watched others and how they looked at the different things and how their eyes were moving around.&lt;/p&gt;

&lt;p&gt;After getting this invaluable &amp;#8220;Heureka&amp;#8221; moment, I am now looking differently at designs and art, whether it&amp;#8217;s a famous painting, an anchient statue or something profane as a website or a web application, because this simple finding applies to all of them:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don&amp;#8217;t have to do everything 100% perfectly, as long as you put effort in how the spectator reacts to it and is engaged with it and get it &lt;em&gt;pretty right&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/48128518723</link><guid>http://ox86.tumblr.com/post/48128518723</guid><pubDate>Tue, 16 Apr 2013 21:23:00 +0200</pubDate><category>design</category><category>web design</category><category>inspiration</category></item><item><title>Why developers should learn to estimate and estimate often</title><description>&lt;p&gt;Developers are sometimes a grumpy set of people.&lt;/p&gt;

&lt;p&gt;To a certain extent, I understand my fellow developers - deadlines are tight, features creep in and out from time to time and uncertainty is your daily companion.&lt;/p&gt;

&lt;p&gt;Asking the right questions before starting to hack away is crucial but pretty hard at the same time.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s hard, because it&amp;#8217;s likely that you never did something alike and before sitting down and thinking it through carefully it&amp;#8217;s hard to ask the interesting questions to other stakeholders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So why would you do that?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First of all, estimations help everyone to &lt;strong&gt;get the expectations straight&lt;/strong&gt;.
That tough deadline is in two weeks but the estimated work says 2 months? Well, then there&amp;#8217;s some sort of problem and you should talk about that.&lt;/p&gt;

&lt;p&gt;The work is finished faster than expected? Well, then you may have a problem as well (somebody may have missed important bits &amp;amp; pieces or the code is poorly written, docs may be missing, &amp;#8230;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What can be the reasons that estimations are wrong?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s a pretty long list. My top 3:&lt;/p&gt;

&lt;p&gt;1.) The task wasn&amp;#8217;t thought-through. Sub-task were missed, uncertainties weren&amp;#8217;t identified or the requirements weren&amp;#8217;t documented.
2.) A lack of experience. It takes some try&amp;amp;error to get a feeling for the common tasks and problems.
3.) &lt;a href="http://en.wikipedia.org/wiki/Scope_creep"&gt;Scope creep&lt;/a&gt; happened between the estimation and the (delayed) delivery.&lt;/p&gt;

&lt;p&gt;Yes, in &lt;strong&gt;that&lt;/strong&gt; particular order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do do better estimations?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s not a one-shot thing. It took me a couple of attempts to get to acceptable and apropriate estimations for different tasks. Basically you oscillate around the right estimation - sometimes you&amp;#8217;re over, sometimes you&amp;#8217;re under, but you should always aim to make it as close as possible.
If you get your performance to +/- 5%, you&amp;#8217;re good.
For example: In sprints of one week I tried to be within 2 hours of my estimations. I am pretty sure I never reached that goal, but I wasn&amp;#8217;t too bad at it (I think).&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/47528396389</link><guid>http://ox86.tumblr.com/post/47528396389</guid><pubDate>Tue, 09 Apr 2013 11:00:32 +0200</pubDate><category>scrum</category><category>estimations</category><category>programming</category><category>productivity</category></item><item><title>Open source: Go contribute. Now!</title><description>&lt;p&gt;You&amp;#8217;re still here, reading this article?&lt;/p&gt;

&lt;p&gt;Well, that means you&amp;#8217;re probably like me a few years ago.
You think &lt;strong&gt;&amp;#8220;I don&amp;#8217;t have time for that&amp;#8221;&lt;/strong&gt; or &lt;strong&gt;&amp;#8220;I am not good enough to contribute&amp;#8221;&lt;/strong&gt; or &lt;strong&gt;&amp;#8220;I can&amp;#8217;t code at all&amp;#8221;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;All of those things &lt;strong&gt;are no excuse&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;First: About the &lt;strong&gt;time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I guess you have a lot of things to do then, right? And I bet you wrote a few scripts (be it a tiny 2 liner or a huge collection of shell scripts) to speed up the chores, right?&lt;br/&gt;&lt;strong&gt;Publish them. Now.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s no need to polish them or write 100 pages of manual texts. Just throw in a readme with two lines (what it does and how to execute it) and publish it.&lt;/p&gt;

&lt;p&gt;If you don&amp;#8217;t wanna &amp;#8220;clutter&amp;#8221; your account with a repository or the script is just one clever line of shell code, you can also use &lt;a href="http://www.coderwall.com"&gt;Coderwall&lt;/a&gt; or a &lt;a href="http://gist.github.com"&gt;Gist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Why you should publish things like that, you ask? Because even if you think it&amp;#8217;s a very specific solution for a very special problem, others may encounter it. And if so, your tool can help them get it done quicker.&lt;/p&gt;

&lt;p&gt;Another case is when you do a little modification to an existing tool, because it makes it a little easier to use or a little faster or even fixes a bug - &lt;strong&gt;publish it&lt;/strong&gt;, so that others can benefit just like you did by using the tool in the first place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributing often only takes a few minutes&lt;/strong&gt; and often you just need to put it online somewhere (with things like &lt;a href="https://github.com"&gt;Github&lt;/a&gt; available, this is no big deal anymore!) - and you should do so, even if it&amp;#8217;s not &lt;em&gt;polished&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I see it pretty often that people postpone their contribution, because it needs to be cleaned up, documented or polished in whatever way.
&lt;strong&gt;Publish the raw gem that you have&lt;/strong&gt; - and &lt;em&gt;then&lt;/em&gt; you can polish it later.
Maybe even other people &lt;strong&gt;polish it for you&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Next one: &lt;strong&gt;You are good enough and you will learn something from contributing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s really just two things that can happen: Your code is good enough. And it&amp;#8217;s a great feeling, when it gets accepted into a tool or library you use in your daily work.&lt;/p&gt;

&lt;p&gt;The other case is, that your code isn&amp;#8217;t good enough. In that case you get invaluable feedback on why it isn&amp;#8217;t good enough and how to improve. That, in the long run, makes you a better programmer. It&amp;#8217;s pretty much &lt;strong&gt;free training&lt;/strong&gt;. Use this opportunity by contributing code.&lt;/p&gt;

&lt;p&gt;Alright - last one.&lt;br/&gt;
You can&amp;#8217;t code? So what?&lt;br/&gt;
Often the documentation of a project has missing or outdated parts. Fill them with the knowledge you gained while using the tool.&lt;/p&gt;

&lt;p&gt;Another way of contributing is joining the forums, mailing list or user group or stackoverflow of the project to answer questions of others.&lt;/p&gt;

&lt;p&gt;You should understand that &lt;strong&gt;contributing is a small thing to do&lt;/strong&gt; with a &lt;strong&gt;big impact&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Don&amp;#8217;t hesistate, contribute today.&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/46496475654</link><guid>http://ox86.tumblr.com/post/46496475654</guid><pubDate>Thu, 28 Mar 2013 11:00:40 +0100</pubDate><category>open source</category></item><item><title>Things I learnt from deploying my first larger Meteor.js app</title><description>&lt;p&gt;With Google Reader &lt;a href="http://www.ubergizmo.com/2013/03/google-reader-discontinued/"&gt;said to be discontinued&lt;/a&gt; I had to look for alternatives.
I had a look at the many alternatives but none made me really happy - &lt;em&gt;plus&lt;/em&gt; I was already looking for a way of building a &amp;#8220;real&amp;#8221; app that I&amp;#8217;d like to use to learn more about the woes and joys of maintaining a Meteor.js app and potentially running it at a bigger scale on my own infrastructure.&lt;/p&gt;

&lt;p&gt;So building my own RSS reader and offering it to everybody as a hosted service on my private server seemed perfect to achieve more &amp;#8220;real life&amp;#8221; experience with Meteor.js.&lt;/p&gt;

&lt;p&gt;The result is my latest side project &lt;a href="http://neee.ws"&gt;Neee.ws&lt;/a&gt;, which is &lt;a href="https://github.com/avgp/rssteroids"&gt;also on Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Okay, enough context - what went good, what went bad?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(Re-)Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First of all, redeployment involved the following steps&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Run &lt;code&gt;mrt bundle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Copy the tar to the server&lt;/li&gt;
&lt;li&gt;Unpack it&lt;/li&gt;
&lt;li&gt;Delete the &lt;code&gt;fibers&lt;/code&gt; package (because I bundle on a different architecture as my servers&amp;#8217;.&lt;/li&gt;
&lt;li&gt;Restart the application&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;to make this a little more convenient, I wrote a &lt;a href="https://gist.github.com/anonymous/5249546"&gt;little shell script&lt;/a&gt; to do that and also keep a backup of the previously deployed version.&lt;/p&gt;

&lt;p&gt;To run the app on the server I use &lt;a href="https://github.com/nodejitsu/forever"&gt;forever&lt;/a&gt;, which is super-simple and works reliably for me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beware of large collections!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I totally forgot about the client-side mongo instance.
Meteor tries to download the whole database (&lt;strong&gt;!&lt;/strong&gt;) to the client for caching. Even if you&amp;#8217;re limiting your query results: The client will get the &lt;em&gt;whole&lt;/em&gt; database.
That is part of the &lt;code&gt;autopublish&lt;/code&gt; magic.
Hence you should remove the autopublish package and use &lt;code&gt;Meteor.publish&lt;/code&gt;, &lt;code&gt;Meteor.subscribe&lt;/code&gt; and &lt;code&gt;Deps.autorun&lt;/code&gt; and do as much filtering as possible on the server side to have only the most important documents cached locally.&lt;/p&gt;

&lt;p&gt;The performance gain is enormous - from &lt;strong&gt;28 seconds&lt;/strong&gt; loading time down to &lt;strong&gt;1.9 seconds&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The many joys of Meteor.js&lt;/strong&gt;
The development was really quick &amp;amp; easy - thanks to the many nice things Meteor gives you for free. I will just give a short list here:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Google Login + oAuth token for API access&lt;/li&gt;
&lt;li&gt;Reactivity in data sources&lt;/li&gt;
&lt;li&gt;Helpful &lt;a href="https://github.com/oortcloud/meteorite"&gt;Meteorite&lt;/a&gt; packages, particularly &lt;a href="https://github.com/tmeasday/meteor-router"&gt;meteor-router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Easy setup &amp;amp; bundling&lt;/li&gt;
&lt;/ul&gt;</description><link>http://ox86.tumblr.com/post/46411734222</link><guid>http://ox86.tumblr.com/post/46411734222</guid><pubDate>Wed, 27 Mar 2013 11:00:28 +0100</pubDate><category>meteor.js</category><category>javascript</category><category>web</category><category>development</category><category>web development</category></item><item><title>A fun look back to the history of computing and the origins of...</title><description>&lt;iframe width="400" height="225" src="http://www.youtube.com/embed/JxAXlJEmNMg?wmode=transparent&amp;autohide=1&amp;egm=0&amp;hd=1&amp;iv_load_policy=3&amp;modestbranding=1&amp;rel=0&amp;showinfo=0&amp;showsearch=0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;A fun look back to the history of computing and the origins of some things we wonder about nowadays. Don’t let the title of the video trick you: This is a lot of fun to watch, it has not too much to do with Javascript and it’s worth watching.&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/45408425407</link><guid>http://ox86.tumblr.com/post/45408425407</guid><pubDate>Fri, 15 Mar 2013 09:00:28 +0100</pubDate><category>Around the Web</category><category>programming</category><category>computer science</category></item><item><title>How to manage building a great software product</title><description>&lt;p&gt;The internet is fast-paced and to build great stuff, it&amp;#8217;s vital to manage your project properly.&lt;/p&gt;

&lt;p&gt;Because if you don&amp;#8217;t, you&amp;#8217;ll never build something truly great.
You may say &amp;#8220;Yup, that&amp;#8217;s obvious&amp;#8221;. Like everybody does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The TL;DR:&lt;/strong&gt;
* Focus on building what the customer needs
* &lt;strong&gt;You&lt;/strong&gt; don&amp;#8217;t know what the customer needs, so ask the customer early on
* Measure the use of the features, optimize for the &lt;strong&gt;real&lt;/strong&gt; top features
* Waterfall doesn&amp;#8217;t work, the original paper (1983) even says so, &lt;strong&gt;be agile&lt;/strong&gt; and deal with it.&lt;/p&gt;

&lt;p&gt;But for some reason, whenever I&amp;#8217;m on an event or I look at fellow developers I hear the same things over and over and over again?&lt;/p&gt;

&lt;p&gt;Here are the top 5:
1. The managers give us not enough time and budget to build giant, complex apps and expect the outcome to be great.
2. The deadlines are unrealistic the moment they&amp;#8217;re set
3. Nobody asked us about it, the decisions were made without the developers
4. We&amp;#8217;re behind schedule, the set of features is steady (sometimes this is even &amp;#8220;it actually grows&amp;#8221;) and the deadline can&amp;#8217;t be delayed.
5. We don&amp;#8217;t have time to really think about anything, we just have to code code code.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s not coming from people working in the same company. I hear this a lot and thinking back, I encountered that myself as well. Often.&lt;/p&gt;

&lt;p&gt;When you ask people who know enough about coding but are in a managing position, I often get the following reply:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I know, but the management&amp;#8230;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have a theory that has proven to be right pretty often: The project management gets under pressure from the higher management and doesn&amp;#8217;t stand their ground, which transitions into putting the pressure on the development team&amp;#8230; which doesn&amp;#8217;t stand their ground either.&lt;/p&gt;

&lt;p&gt;So here&amp;#8217;s my suggestion to this: When somebody &lt;strong&gt;demands something unrealistic&lt;/strong&gt;, tell them about the &lt;strong&gt;Scope Triangle&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The scope triangle is one of the most-obvious yet most-ignored things in management of IT projects. It looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cdn.projectsmart.co.uk/img/scope-triangle.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;It means: &lt;strong&gt;From Quality, Time or Money you can pick two or you end up with something shitty.&lt;/strong&gt;
You should &lt;a href="http://www.projectsmart.co.uk/project-management-scope-triangle.html"&gt;&lt;strong&gt;now read this article&lt;/strong&gt;&lt;/a&gt; for further details on this.&lt;br/&gt;
Seriously, click the link and read that really thoroughly, then come back.&lt;/p&gt;

&lt;p&gt;Alright. Now that you understand the key thing there,start by focusing on the &lt;strong&gt;only really important aspect&lt;/strong&gt;: The &lt;strong&gt;user&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;If your project &lt;strong&gt;looks really great&lt;/strong&gt;, but doesn&amp;#8217;t really &lt;strong&gt;do the right job perfectly&lt;/strong&gt;, it&amp;#8217;s &lt;strong&gt;shit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If your project &lt;strong&gt;has a ton of features&lt;/strong&gt;, but doesn&amp;#8217;t really &lt;strong&gt;do the right job perfectly&lt;/strong&gt;, it&amp;#8217;s &lt;strong&gt;shit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If your project &lt;strong&gt;has the best user experience&lt;/strong&gt;, but doesn&amp;#8217;t really &lt;strong&gt;do the right job perfectly&lt;/strong&gt;, it&amp;#8217;s &lt;strong&gt;shit&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Period.&lt;/strong&gt; No excuses, no &amp;#8220;Yeah but&amp;#8230;&amp;#8221; - the &lt;strong&gt;first thing&lt;/strong&gt; you have to release is something &lt;strong&gt;the user wants&lt;/strong&gt;. What makes people want something? If it &lt;strong&gt;does something really good&lt;/strong&gt;. Everything else is &lt;strong&gt;toys&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Do you know &lt;strong&gt;what the user needs&lt;/strong&gt; or wants? &lt;strong&gt;No you don&amp;#8217;t.&lt;/strong&gt;.&lt;br/&gt;
Try it for yourself, make up something you think a given group of people would love. Then go to a coffee shop and &lt;strong&gt;offer people from that group a coffee&lt;/strong&gt; in exchange for &lt;strong&gt;telling them your idea&lt;/strong&gt;.&lt;br/&gt;
You&amp;#8217;ll be surprised how different their desires and needs are from what you had in mind.&lt;/p&gt;

&lt;p&gt;Now that you understood how important it is to get the &lt;strong&gt;real user feedback&lt;/strong&gt; to your idea (actually even &lt;strong&gt;before having built the first release&lt;/strong&gt;), you could do different things:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Create a simple clickable prototype and do the &lt;strong&gt;coffee test&lt;/strong&gt; again.&lt;/li&gt;
&lt;li&gt;Create a simple &lt;em&gt;real&lt;/em&gt; version with only the features you think are the most vital &lt;strong&gt;but not more than one or two features&lt;/strong&gt;. Even if you think &amp;#8220;Oh this is useless to the user, because it&amp;#8217;s missing XYZ**, do it that way. Then show it to test users and ask them, what they miss. Then extend your product.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Release it early&lt;/strong&gt; and have a few early-adopters play with it. &lt;strong&gt;Proactively ask them&lt;/strong&gt; and &lt;strong&gt;gather analytics&lt;/strong&gt; on how they use your product and what they need.&lt;br/&gt;
Your anticipated killer-feature is not used at all? Throw it out, focus on the most popular thing and direct your design efforts to make this as pretty, easy and useful as possible.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s generally a really bad idea to go a top-down approach like waterfall. &lt;strong&gt;Be agile&lt;/strong&gt;.
It you think &amp;#8220;bah, the modern pseudo-management stuff? Never! I trust my waterfall&amp;#8221;, &lt;a href="http://sunset.usc.edu/csse/TECHRPTS/1983/usccse83-501/usccse83-501.pdf"&gt;&lt;strong&gt;you should finally read the original paper from 1983&lt;/strong&gt;&lt;/a&gt; - &lt;strong&gt;focus on the foreword page 2 and following&lt;/strong&gt;.
Even the author says it doesn&amp;#8217;t work that way and they had done &lt;strong&gt;prototypes first&lt;/strong&gt; to &lt;strong&gt;minimize uncertainty and risk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Money quotes:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The great majority seemed to espouse the following approach: we must write the initial top-down specification [&amp;#8230;], so we will know precisely what 
  our objectives are before we produce one line of code. This attitude can be terribly misleading and dangerous.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(p. 3, line 13ff. ) and&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;To stretch an analogy slightly, it is like saying that we must specify the 
  characteristics of a rocket engine before measuring the burning properties of liquid hydrogen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(p. 3, line 17/18)&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/45337471208</link><guid>http://ox86.tumblr.com/post/45337471208</guid><pubDate>Thu, 14 Mar 2013 11:50:00 +0100</pubDate><category>productivity</category><category>programming</category><category>management</category></item><item><title>User interface blindness</title><description>&lt;p&gt;You know that situation: The interface of your favorite webapp changed and you&amp;#8217;re lost. Even when the interface changes are relatively subtle and make sense.&lt;/p&gt;

&lt;p&gt;While that is intrinsically obvious, it came to me as a surprise &lt;em&gt;how&lt;/em&gt; blind we get when we&amp;#8217;re used to an interface.&lt;/p&gt;

&lt;p&gt;I will take &lt;a href="http://www.atlassian.com/software/confluence/overview/team-collaboration-software?_mid=eda0b423fe78c61516af57d6b8be0d65&amp;amp;gclid=CM6fyfaK-bUCFUWS3godgG8Axw"&gt;Confluence&lt;/a&gt; as an example.&lt;br/&gt;
Confluence is a nice wiki software we use for pretty much all of our internal know-how transfers. It integrates pretty well with &lt;a href="http://www.atlassian.com/software/jira/overview"&gt;Jira&lt;/a&gt;, the Atlassian Issue Tracker.&lt;br/&gt;
When I started to use the two, it was in version 4, the two interfaces were working in different ways. To accomplish similar things you had to look at different places to do them in the different applications - but the interfaces looked relatively similar to each other.&lt;br/&gt;
While that sounds like a bad thing, it worked remarkably well in reality, because your mind is aware that you&amp;#8217;re in different contexts. Either you create an Issue in Jira (which means: Look at the middle of the top navigation and use the &amp;#8220;Create&amp;#8221; button) or you add a page in the wiki (which means: Look at the right hand navigation controls and use the &amp;#8220;Add&amp;#8221; dropdown).&lt;/p&gt;

&lt;p&gt;Here are some screenshots to visualize that:&lt;br/&gt;&lt;strong&gt;The old Confluence&lt;/strong&gt;&lt;br/&gt;&lt;img src="http://media.tumblr.com/c62f810e92041f7086f53431e2e49923/tumblr_inline_mjl6x26UeV1qz4rgp.png" alt=""/&gt;&lt;strong&gt;JIRA5&lt;/strong&gt;&lt;br/&gt;&lt;img src="http://media.tumblr.com/b9eb2d823cb048f3f942dcd0d083c35a/tumblr_inline_mjl72qeN2P1qz4rgp.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;JIRA5 has been around on Atlassians cloud service substantially longer than the latest Confluence, so we got used to this inconsistency.&lt;/p&gt;

&lt;p&gt;But a few weeks ago Atlassian did a reasonable change in the Confluence UI to make it more user friendly:
&lt;img src="http://media.tumblr.com/53fe6d9131453470939c190957899685/tumblr_inline_mjl78c0bu81qz4rgp.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;That is a perfectly reasonable change - it makes the main navigation in Confluence and JIRA consistent. You don&amp;#8217;t need to think about the context you&amp;#8217;re in anymore - you alway create content with the button in the middle of the top navigation bar.
The only nasty thing is: Confluence still has &lt;em&gt;some&lt;/em&gt; controls on the right hand side below the navigation bar:
&lt;img src="http://media.tumblr.com/3bb2d65d2056aa503d0d215d51bdfb66/tumblr_inline_mjl7eiKFDL1qz4rgp.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;The problem here: The presence of this old-fashioned right submenu gives you the cue that - while the interface changes are more or less subtle, the old mechanics have been kept. You instinctively look for the &amp;#8220;Add&amp;#8221; link there. Without finding it.&lt;/p&gt;

&lt;p&gt;As the wording for creating content has been &amp;#8220;Add&amp;#8221; in Confluence so far, your brain now scans the site for something that says &amp;#8220;Add&amp;#8221;. Without success.&lt;br/&gt;
Now your brain has to go creative, because the clues, that make the workflow feel natural and obvious to you, have failed.
(At this point: I highly recommend the great book &lt;a href="http://www.sensible.com/dmmt.html"&gt;Don&amp;#8217;t make me think&lt;/a&gt; which gives great insights on those stuff)&lt;/p&gt;

&lt;p&gt;This little stupid thing took me some minutes to figure out - it made me feel dumb. And not only me. A coworker asked me why he can&amp;#8217;t add pages anymore but after I told him to search for &amp;#8220;Create&amp;#8221; on the page, he was rather surprised to find it. In the middle of the menu bar.&lt;/p&gt;

&lt;p&gt;So when you refurbish your designs to make them more consistent and intuitive, do this really graduately. If, for example, Atlassian hadn&amp;#8217;t changed all of the visual clues (i.e. text, position and appearance) it may not have been so confusing.&lt;br/&gt;
If they would have moved it to the middle of the navigation bar while still displaying the &amp;#8220;+&amp;#8221; symbol and still labeling it &amp;#8220;Add&amp;#8221;, it may have been easier to spot. Changing &amp;#8220;Add&amp;#8221; to &amp;#8220;Create&amp;#8221; and removing the symbol a few months later would have been fine, because you already would&amp;#8217;ve known where to look.&lt;/p&gt;

&lt;p&gt;While this obviously applies to redesigns, it &lt;strong&gt;also applies to making new designs&lt;/strong&gt;, because there are a bunch of &lt;strong&gt;conventions&lt;/strong&gt; (or &amp;#8220;prejudices&amp;#8221; if you wanna put it a little more negative).&lt;/p&gt;

&lt;p&gt;For example when you plan to have a search function on your website, you should put them in the top area. That&amp;#8217;s where people expect it, because most of the popular websites have it there.&lt;/p&gt;

&lt;p&gt;Login/Signup/Logout is another frequent component. It usually lives in the top right hand corner. If you put it at the bottom left, your users will hate you.
I even had trouble once when I put the signup link on the top left hand corner - literally 75% of my testers (a group of 20 people) did not know where to sign up after having looked at the site for 10 seconds.
After I put it on the right hand corner, another group of 20 people found it right away.&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/45259653580</link><guid>http://ox86.tumblr.com/post/45259653580</guid><pubDate>Wed, 13 Mar 2013 11:00:00 +0100</pubDate><category>ux</category><category>web</category><category>web design</category><category>Websites</category></item><item><title>blog.izs.me: User Feedback</title><description>&lt;a href="http://blog.izs.me/post/45090961790/user-feedback"&gt;blog.izs.me: User Feedback&lt;/a&gt;: &lt;p&gt;&lt;a href="http://blog.izs.me/post/45090961790/user-feedback" class="tumblr_blog"&gt;izs&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sometimes a request is much less interesting than the motivation &lt;em&gt;behind&lt;/em&gt; the request, which the requestor might not even fully understand.&lt;/p&gt; &lt;p&gt;Sometimes people demand a giraffe, when really, they just need a ladder, or better yet, they need things to not be up so high.&lt;/p&gt; &lt;p&gt;&lt;i&gt;“There are &lt;b&gt;ZERO&lt;/b&gt; giraffes in…&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://ox86.tumblr.com/post/45190921626</link><guid>http://ox86.tumblr.com/post/45190921626</guid><pubDate>Tue, 12 Mar 2013 16:00:22 +0100</pubDate></item><item><title>Running your meteor.js application on your own server</title><description>&lt;p&gt;During the course of the weekend two weeks ago, I created the **&lt;a href="http://quantified.geekonaut.de"&gt;Quantified Geekonaut&lt;/a&gt; to gather some data about my internet activities (such as Twitter, Last.FM [Spotify really], Foursquare, Github, my blog and a few others) and experiment with graphing and such.&lt;/p&gt;

&lt;p&gt;I decided to build it with &lt;a href="http://www.meteor.com"&gt;&lt;strong&gt;Meteor.js&lt;/strong&gt;&lt;/a&gt; - primarily because I needed a reason to play around with it again.&lt;/p&gt;

&lt;p&gt;One thing I found (without being too surprised about it) about hosting your app on the &lt;strong&gt;free meteor.com cloud hosting&lt;/strong&gt; is, that it gets restarted whenever somebody accesses your website.&lt;/p&gt;

&lt;p&gt;Which isn&amp;#8217;t a problem normally is an issue for the &lt;em&gt;Quantified Geekonaut&lt;/em&gt; application, because it gathers data periodically and saves it to be able to graph and query historical data points. That&amp;#8217;s obviously impossible, if it only collects data when accessed by a visitor.&lt;/p&gt;

&lt;p&gt;As Meteor gives you the possibility to &lt;strong&gt;bundle your app&lt;/strong&gt; as a (more or less) self-contained node.js app, you could as well &lt;strong&gt;run it on your own server&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article I&amp;#8217;ll give a quick run-through on how to do that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Bundle your app&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To bundle your meteor app, run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;meteor bundle app.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and copy the app.tar.gz on your server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional: Install nvm and node.js v0.8&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To run a meteor.js application you need to have at least node.js version 0.8.&lt;br/&gt;
Optionally, if you want to use different node.js versions in parallel, you could install nvm, the Node Version Manager (pretty much &amp;#8220;RVM&amp;#8221; for node).
To install nvm on your server, you just run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd ~
curl &lt;a href="https://raw.github.com/creationix/nvm/master/install.sh"&gt;https://raw.github.com/creationix/nvm/master/install.sh&lt;/a&gt; | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;to make bash always load nvm on startup, use&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;echo "source ~/.nvm/nvm.sh" &amp;gt;&amp;gt; .bash_rc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;on your server. If you&amp;#8217;re not using bash as your shell, adjust that accordingly.&lt;/p&gt;

&lt;p&gt;To install node 0.8 on your server you just run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nvm install v0.8
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which gets you the latest stable version of the 0.8 branch. To make node 0.8 your default node.js version (if you have more than just this one), run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nvm alias default 0.8
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Unpack the bundle on your server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pretty straight forward: Copy the bundle from Step 1 to your server and run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tar xvf app.tar.gz
cd bundle
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;** If you bundled your app on a different architecture than your servers&amp;#8217; (e.g. you bundled the app on OSX and run your server on Linux or your server is a 64bit system and your computer is a 32bit system) you need to reinstall fibers:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd server
rm -rf node_modules/fibers
npm install fibers@1.0.0
cd ..
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Install forever&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have your app running, you want to make sure it keeps running.
&lt;a href="https://github.com/nodejitsu/forever"&gt;Forever&lt;/a&gt; is a great tool for that.&lt;br/&gt;
It runs a node.js app in the background, monitors it and restarts it when needed.
To install forever, run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm install -g forever
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Optional: Get a MongoHQ database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you don&amp;#8217;t want to setup and install your own MongoDB instance, check out &lt;a href="https://www.mongohq.com/home"&gt;MongoHQ&lt;/a&gt;. You can use their free sandbox DB, if you wish. Copy the Mongo-URL to use it with meteor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Set the environment and start the app&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For this you need a connection URL to a mongo db. You can either set it up manually or you can use MongoHQ as described above.
The app needs the URL of a MongoDB and a port to run on. To specify these run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export PORT=8080
export MONGO_URL=mongodb://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;db_host&amp;gt;:&amp;lt;db_port&amp;gt;/&amp;lt;db_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Please substitute &lt;code&gt;user&lt;/code&gt;,&lt;code&gt;password&lt;/code&gt;,&lt;code&gt;db_host&lt;/code&gt;,&lt;code&gt;db_port&lt;/code&gt; and &lt;code&gt;db_name&lt;/code&gt; with values for your Mongo instance.&lt;br/&gt;
Now you can start the app with&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;forever start main.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Your app should now be reachable on Port 8080 on your server&amp;#8217;s address!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional: Setup reverse proxy with Apache&lt;/strong&gt;&lt;br/&gt;
If you want to run the app on a subdomain of your server, let&amp;#8217;s say
&lt;code&gt;meteorapp.example.com&lt;/code&gt; and you already have an Apache running for the main domain and/or some VirtualHosts, you can create a reverse proxy to serve the meteor app with something like this in your apache &lt;code&gt;sites&lt;/code&gt; folder (for Debian that is &lt;code&gt;/etc/apache2/sites-enabled&lt;/code&gt;).&lt;br/&gt;
Create a new vhost file with the following contents:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
  ServerName meteorapp.example.com
  ProxyRequests off
  &amp;lt;Proxy *&amp;gt;
    Order deny,allow
    Allow from all
  &amp;lt;/Proxy&amp;gt;

  &amp;lt;Location /&amp;gt;
    ProxyPass http://localhost:8080/
    ProxyPassReverse http://localhost:8080/
  &amp;lt;/Location&amp;gt;
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and you&amp;#8217;re ready to go. Reload apache with&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/etc/init.d/apache2 reload
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;or similar for your server OS and you&amp;#8217;re ready to enjoy meteor running on a subdomain.&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/45184656062</link><guid>http://ox86.tumblr.com/post/45184656062</guid><pubDate>Tue, 12 Mar 2013 13:00:50 +0100</pubDate><category>meteor.js</category><category>forever</category><category>devops</category><category>web</category><category>web development</category><category>Websites</category><category>server</category></item><item><title>Cloudfoundry on top of OpenStack - ICCLab</title><description>&lt;p&gt;&lt;a href="http://zurichtechtalks.ch/post/44702172046/cloudfoundry-on-top-of-openstack-icclab" class="tumblr_blog"&gt;zurichtechtalks&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;a href="https://twitter.com/christofmarti"&gt;Christof Marti&lt;/a&gt; from the &lt;a href="http://www.cloudcomp.ch/"&gt;ICCLab&lt;/a&gt; is giving a talk on how to run &lt;a href="http://www.cloudfoundry.org/"&gt;Cloudfoundry&lt;/a&gt; the open source PaaS on top of an &lt;a href="http://www.openstack.org/"&gt;Openstack&lt;/a&gt; cloud.&lt;/p&gt;

&lt;p&gt;Recorded by switch at the &lt;a href="https://twitter.com/OpenStackCH"&gt;@OpenStackCH&lt;/a&gt; meetup hosted by &lt;a href="http://www.switch.ch/"&gt;switch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cast.switch.ch/vod/clips/hnu0btd5m/flash.html"&gt;&lt;img src="http://media.tumblr.com/e7a1e004f097ce99898ec0ac4327a4f9/tumblr_inline_mj75spaeDW1qz4rgp.png" alt=""/&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Talk: &lt;a href="https://cast.switch.ch/vod/clips/hnu0btd5m/flash.html"&gt;Flash&lt;/a&gt;, &lt;a href="https://cast.switch.ch/vod/clips/hnu0btd5m/quicktime.mov"&gt;Quicktime&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://ox86.tumblr.com/post/45177108490</link><guid>http://ox86.tumblr.com/post/45177108490</guid><pubDate>Tue, 12 Mar 2013 08:15:43 +0100</pubDate></item><item><title>The native mobile app fallacy</title><description>&lt;p&gt;&lt;strong&gt;Native, web, hybrid?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it comes to mobile application development, there’s far too many evangelism out there.&lt;/p&gt;

&lt;p&gt;The web fans sing their&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“write once, deploy everywhere”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the native party yells back&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“But it’s slow and doesn’t look native!”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;but both lack the understanding of the advantages and disadvantages of each approach, as well as the rationalism to re-decide on this matter, based on the project at hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does &lt;em&gt;native&lt;/em&gt; always mean &lt;em&gt;better&lt;/em&gt;?&lt;/strong&gt;&lt;br/&gt;
Certainly &lt;strong&gt;no&lt;/strong&gt;.
Facebook is a great example for this. Their claim was, that the Android app&amp;#8217;s quirks and issues originated in its hybrid nature.&lt;br/&gt;
The reality is: The new native Android app does not really work any better and Sencha &lt;a href="http://www.sencha.com/blog/the-making-of-fastbook-an-html5-love-story/"&gt;gave an impressive proof that a non-native app could do better&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So a native app is not by definition better.&lt;br/&gt;
If you write inefficient code, the performance will be bad and the development iterations may be longer, as you can&amp;#8217;t easily test on many different platforms simultaneously without having to repeat modifications in the code for each platform.&lt;br/&gt;
If you also run a web version of your project, the mobile web or the hybrid approach allows you to quickly iterate on both of them.&lt;/p&gt;

&lt;p&gt;As always you should pick the right tool for the job, which can be a native or web app. It can even be a hybrid app.&lt;/p&gt;

&lt;p&gt;The tricky thing is to find out &lt;em&gt;when&lt;/em&gt; to use &lt;em&gt;what&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick overview of what&amp;#8217;s what&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Native&lt;/strong&gt;: Requires code tailored to each supported platform but gives you direct access to the native features.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mobile web&lt;/strong&gt;: The same code runs on many (if not all) platforms. Can also be delivered to desktop browsers, but can not be installed via app stores and can not access all device features. As the code is run in the browser which runs on top of the operating system, some features may be slower than native features.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hybrid&lt;/strong&gt;: Combination. Same code can run everywhere, all native features can be accessed and native components can be used to get a good performance. Hybrid apps can also be distributed in the app stores.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;If you have a big team of experienced mobile developers for the different platforms at hand, you can of course leverage that.&lt;/p&gt;

&lt;p&gt;But when you have a team of experienced web developers instead and need to quickly get an app out there (maybe even flanked by a web app), mobile web or hybrid apps are a great tool for achieving this.&lt;/p&gt;

&lt;p&gt;The thing many people miss is: It&amp;#8217;s &lt;strong&gt;not only&lt;/strong&gt; good for prototyping and quick iterations - it is a &lt;strong&gt;viable option&lt;/strong&gt; for building great apps.&lt;br/&gt;
With modern Javascript frameworks and libraries (such as &lt;a href="http://www.angularjs.org"&gt;Angular&lt;/a&gt; and &lt;a href="http://lungo.tapquo.com"&gt;Lungo&lt;/a&gt; in combination with &lt;a href="http://www.phonegap.com"&gt;PhoneGap&lt;/a&gt;) you can use web technologies to your mobile apps that can play in the same league as native apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It needs to look&amp;amp;feel native, right?&lt;/strong&gt;&lt;br/&gt;
First of all: If you want to achieve perfectly native look&amp;amp;feel, you’re not going to have a good time with a hybrid approach. But do you really want that?&lt;/p&gt;

&lt;p&gt;Let’s look at the Foursquare app for a second:&lt;br/&gt;&lt;img src="http://aboutfoursquare.com/wp-content/uploads/2010/09/iphone_app.png" alt="Foursquare app"/&gt; ©&lt;a href="http://www.foursquare.com"&gt;Foursquare&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and why not take another look at the Facebook app:
&lt;img src="http://cdn.sixrevisions.com/0274-02_facebook_native_mobile_web_app.jpg" alt="Facebook on Android and iOS"/&gt;&lt;/p&gt;

&lt;p&gt;© six revisions, see &lt;a href="http://sixrevisions.com/mobile/native-app-vs-mobile-web-app-comparison/"&gt;their great article about native vs. mobile web&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s easy to spot that even the &lt;em&gt;native&lt;/em&gt; Facebook-App doesn&amp;#8217;t really look native.
And that&amp;#8217;s no problem! The user doesn&amp;#8217;t really care, as long as it looks &lt;strong&gt;great&lt;/strong&gt; and &lt;strong&gt;feels right&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is something most people get wrong - you can have your very own look in your apps. Stop mimicking the native look and feel and start delivering something great and useful to your users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But to get in the stores, you need native, right?&lt;/strong&gt;&lt;br/&gt;
No you don&amp;#8217;t.&lt;br/&gt;
You can for example use &lt;a href="http://www.phonegap.com"&gt;PhoneGap&lt;/a&gt; to package your hybrid app for many different platforms (e.g. iOS, Android, Windows phone, Blackberry).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Okay, but what if I need the native features, like the camera?&lt;/strong&gt;&lt;br/&gt;
Again, PhoneGap is the answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But how do you build a great app?&lt;/strong&gt;&lt;br/&gt;
There are many different ways to build great hybrid apps.
To achieve the best results, you should focus on the following aspects:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Responsiveness - the app has to respond quickly to user input&lt;/li&gt;
&lt;li&gt;It has to feel right - don&amp;#8217;t imitate the perfect native transitions. Use decent transitions that are not giving the impression of &amp;#8220;wanna be native&amp;#8221;&lt;/li&gt;
&lt;li&gt;Be aware that the user won&amp;#8217;t always have a good internet connection (or any at all) - leverage local storage whenever you can and minimize the data to transfer&lt;/li&gt;
&lt;li&gt;Use native components (e.g via PhoneGap plugins) whenever needed&lt;/li&gt;
&lt;li&gt;be careful: Not all platforms already support every HTML 5 feature. Provide fallbacks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;test&lt;/strong&gt; your app on different devices, especially on older ones&lt;/li&gt;
&lt;/ul&gt;</description><link>http://ox86.tumblr.com/post/45101804690</link><guid>http://ox86.tumblr.com/post/45101804690</guid><pubDate>Mon, 11 Mar 2013 11:00:00 +0100</pubDate><category>mobile</category><category>web</category><category>web development</category><category>html5</category><category>javascript</category><category>PhoneGap</category><category>hybrid</category><category>programming</category><category>apps</category><category>development</category></item><item><title>Magic (programming)</title><description>&lt;a href="http://en.wikipedia.org/wiki/Magic_(programming)"&gt;Magic (programming)&lt;/a&gt;: &lt;p&gt;&lt;a class="tumblr_blog" href="http://dhotson.tumblr.com/post/44290288955/magic-programming"&gt;dhotson&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class="tumblr_blog" href="http://slashnull.tumblr.com/post/44284781512/magic-programming"&gt;slashnull&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Single-handedly the greatest page of the entire Wikipedia.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="image" src="http://i.imgur.com/Dhlw3.gif"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://ox86.tumblr.com/post/44291201622</link><guid>http://ox86.tumblr.com/post/44291201622</guid><pubDate>Fri, 01 Mar 2013 14:08:18 +0100</pubDate></item><item><title>Local.ch - War stories from the first year on Rails</title><description>&lt;p&gt;&lt;a class="tumblr_blog" href="http://zurichtechtalks.ch/post/44228560878/local-ch-the-first-year-on-rails"&gt;zurichtechtalks&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://www.local.ch"&gt;local.ch&lt;/a&gt; went live with Rails in March 2012. As with any new technology stack, handling high traffic, not everything went smoothly. &lt;a href="https://twitter.com/foz"&gt;Jeremy Seitz&lt;/a&gt;, lead engineer on the local.ch website, shares stories, experiences and lessons learned on bringing one of the most popular websites in Switzerland to Rails.&lt;/p&gt;
&lt;p&gt;Recorded at the &lt;a href="https://twitter.com/webtuesday"&gt;@webtuesday&lt;/a&gt; meetup &lt;a href="https://twitter.com/localch"&gt;@localch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to Jeremy for letting me tape this talk.&lt;/p&gt;
&lt;div&gt;&lt;iframe frameborder="0" height="360" src="http://www.youtube.com/embed/RGbCXTV1mOA" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/blockquote&gt;</description><link>http://ox86.tumblr.com/post/44278693472</link><guid>http://ox86.tumblr.com/post/44278693472</guid><pubDate>Fri, 01 Mar 2013 06:56:56 +0100</pubDate></item><item><title>Introduction to Puppet @webtuesday</title><description>&lt;p&gt;&lt;a class="tumblr_blog" href="http://zurichtechtalks.ch/post/43631525717/introduction-to-puppet-webtuesday"&gt;zurichtechtalks&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;David Gubler from &lt;a href="http://doodle.com/"&gt;Doodle&lt;/a&gt; gives a short introduction to the Server Orchestration Tool &lt;a href="http://puppetlabs.com/puppet/what-is-puppet/"&gt;Puppet&lt;/a&gt; and shows how they use it at Doodle to keep their servers in order.&lt;/p&gt;
&lt;p&gt;Recorded at the &lt;a href="https://twitter.com/webtuesday"&gt;@webtuesday&lt;/a&gt; Meetup at &lt;a href="https://twitter.com/centralway"&gt;@centralway&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to David for letting me tape his talk.&lt;/p&gt;
&lt;div&gt;&lt;iframe frameborder="0" height="360" src="http://www.youtube.com/embed/tg0uqt90UtY" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/blockquote&gt;</description><link>http://ox86.tumblr.com/post/43641631560</link><guid>http://ox86.tumblr.com/post/43641631560</guid><pubDate>Thu, 21 Feb 2013 14:00:39 +0100</pubDate></item><item><title>Kevlin Henney - The Uncertainty Principle</title><description>&lt;iframe src="http://blip.tv/play/h75rgbeufAI.html?p=1" width="400" height="322" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Kevlin Henney - The Uncertainty Principle&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/43638164351</link><guid>http://ox86.tumblr.com/post/43638164351</guid><pubDate>Thu, 21 Feb 2013 12:00:32 +0100</pubDate></item><item><title>Protected properties in Javascript</title><description>&lt;a href="https://coderwall.com/p/wmrvnw"&gt;Protected properties in Javascript&lt;/a&gt;</description><link>http://ox86.tumblr.com/post/43059315822</link><guid>http://ox86.tumblr.com/post/43059315822</guid><pubDate>Thu, 14 Feb 2013 06:11:54 +0100</pubDate><category>javascript</category><category>oop</category><category>es5</category><category>web development</category><category>tip</category><category>protip</category></item><item><title>"Put the following to the Vagrantfile" - where in the file? In an Empty file?</title><description>&lt;p&gt;Wrapped in the &lt;/p&gt;
&lt;p&gt;“&lt;span class="ss"&gt;Vagrant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|” at the beginnin and “end” at the end of either an empty file or by removing/commenting everything in the Vagrantfile that “vagrant init” created. For further guidance you can turn to &lt;/span&gt;&lt;a href="http://docs.vagrantup.com/v1/docs/getting-started/index.html"&gt;&lt;a href="http://docs.vagrantup.com/v1/docs/getting-started/index.html"&gt;http://docs.vagrantup.com/v1/docs/getting-started/index.html&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://ox86.tumblr.com/post/42866905855</link><guid>http://ox86.tumblr.com/post/42866905855</guid><pubDate>Mon, 11 Feb 2013 22:28:08 +0100</pubDate></item><item><title>"We will make the two directories called “manifests” and “configs” to house config files and puppet manifests:" - where? assume this is on the host machine i.e. not within the VM. And if on the hsot machine, where?</title><description>&lt;p&gt;In the same  directory as you put the Vagrantfile.&lt;/p&gt;
&lt;p&gt;Assuming you are in /home/user/my-project and created a Vagrantfile at /home/user/my-project/Vagrantfile, then you create the two directories&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;/home/user/my-project/manifests&lt;/li&gt;
&lt;li&gt;/home/user/my-project/configs&lt;/li&gt;
&lt;/ul&gt;</description><link>http://ox86.tumblr.com/post/42844049971</link><guid>http://ox86.tumblr.com/post/42844049971</guid><pubDate>Mon, 11 Feb 2013 16:13:42 +0100</pubDate></item></channel></rss>
