<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ivan Kuznetsov &#187; Software Development</title>
	<atom:link href="http://www.ivankuznetsov.com/category/software-development/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ivankuznetsov.com</link>
	<description>Entrepreneur, Ruby on Rails and Ubuntu fanatic, consultant</description>
	<lastBuildDate>Fri, 01 Jul 2011 22:03:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>REE segfaults when Rails application has too many localisation files</title>
		<link>http://www.ivankuznetsov.com/2011/07/ree-segfaults-when-rails-application-has-too-many-localisation-files.html</link>
		<comments>http://www.ivankuznetsov.com/2011/07/ree-segfaults-when-rails-application-has-too-many-localisation-files.html#comments</comments>
		<pubDate>Fri, 01 Jul 2011 22:03:56 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/?p=349</guid>
		<description><![CDATA[We ran into an interesting problem &#8211; at some point of time our Rails application started to fail occaionally because of REE segfaults on startup. Even starting the console with &#8216;script/console production&#8217; was occasionally failing with REE segfault. Application was growing, new features were added and segfaults started happening more and more often. There was [...]]]></description>
			<content:encoded><![CDATA[<p>We ran into an interesting problem &#8211; at some point of time our Rails application started to fail occaionally because of REE segfaults on startup. Even starting the console with &#8216;script/console production&#8217; was occasionally failing with REE segfault. Application was growing, new features were added and segfaults started happening more and more often. There was no one single place where crashes occurred, so there was no clear understanding how to tackle this problem.</p>
<p>Examples of crashes we observed:</p>
<pre>/vendor/rails/actionpack/lib/action_controller/routing/route.rb:205):2:
   [BUG] Segmentation fault
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/yaml.rb:133:
   [BUG] Segmentation fault
/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/
   backend/base.rb:257: [BUG] Segmentation fault
/vendor/rails/actionpack/lib/action_view/template.rb:226: [BUG] Segmentation fault
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/gems/1.8/gems/pauldix-sax-machine-0.0.14/
   lib/sax-machine/sax_document.rb:30: [BUG] Segmentation fault
/vendor/rails/activesupport/lib/active_support/memoizable.rb:32: [BUG] Segmentation fault</pre>
<p>After banging my head against the wall for a week I found a solution (even two) and what might seem to be a likely reason for the segfaults. Two &#8220;suspects&#8221; &#8211; lack of available memory and incorrect version of libxml were ruled out. What seems to be the actual reason is the total size of the localisation files in config/locales loaded upon startup:</p>
<pre>$ du -shb config/locales
1665858    config/locales</pre>
<pre>$ cd config/locales
$ find . -type f | wc -l
805</pre>
<p>So ~1.6Mb in 805 files give occasional segfaults. Adding 200Kb of localisation files more started giving 100% segfaults on script/console startup.</p>
<p>Now I&#8217;ve found two workarounds for this problem.</p>
<p>1. Recompile REE with &#8211;no-tcmalloc flag</p>
<pre>./ruby-enterprise-1.8.7-2011.03/installer --no-tcmalloc</pre>
<p>Note that on 64-bit platforms tcmalloc is disabled by default.</p>
<p>2. Enable large pages feature in tcmalloc</p>
<p>This is described in <a href="http://google-perftools.googlecode.com/svn/tags/perftools-1.6/INSTALL" target="_blank">tcmalloc documentation</a> as: &#8220;Internally, tcmalloc divides its memory into &#8220;pages.&#8221;  The default page size is chosen to minimize memory use by reducing fragmentation. The cost is that keeping track of these pages can cost tcmalloc time. We&#8217;ve added a new, experimental flag to tcmalloc that enables a larger page size.  In general, this will increase the memory needs of applications using tcmalloc.  However, in many cases it will speed up the applications as well, particularly if they allocate and free a lot of memory.  We&#8217;ve seen average speedups of 3-5% on Google applications.&#8221;</p>
<p>There&#8217;s a warning &#8211; &#8220;this feature is still very experimental&#8221;, but it works to solve the problem with too many localisation files.</p>
<p>To compile REE with tcmalloc with large pages enables I just edited ruby-enterprise-1.8.7-2011.03/source/distro/google-perftools-1.7/src/common.h &#8211; replaced</p>
<pre>#if defined(TCMALLOC_LARGE_PAGES)
static const size_t kPageShift  = 15;
static const size_t kNumClasses = 95;
static const size_t kMaxThreadCacheSize = 4 &lt;&lt; 20;
#else
static const size_t kPageShift  = 12;
static const size_t kNumClasses = 61;
static const size_t kMaxThreadCacheSize = 2 &lt;&lt; 20;
#endif</pre>
<p>with</p>
<pre>static const size_t kPageShift  = 15;
static const size_t kNumClasses = 95;
static const size_t kMaxThreadCacheSize = 4 &lt;&lt; 20;</pre>
<p>On production servers I opted for no tcmalloc for now &#8211; but I hope there&#8217;ll be a <a href="http://code.google.com/p/rubyenterpriseedition/issues/detail?id=73" target="_blank">better way to deal with this issue</a> soon.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2011%2F07%2Free-segfaults-when-rails-application-has-too-many-localisation-files.html&amp;title=REE%20segfaults%20when%20Rails%20application%20has%20too%20many%20localisation%20files" id="wpa2a_2"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2011/07/ree-segfaults-when-rails-application-has-too-many-localisation-files.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pitfalls of Rails fragment caching with memcached</title>
		<link>http://www.ivankuznetsov.com/2011/06/pitfalls-of-rails-fragment-caching-with-memcached.html</link>
		<comments>http://www.ivankuznetsov.com/2011/06/pitfalls-of-rails-fragment-caching-with-memcached.html#comments</comments>
		<pubDate>Wed, 29 Jun 2011 15:52:36 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/?p=319</guid>
		<description><![CDATA[Fragment caching is a powerful technique for improving performance of your web application. Rails site describes in detail how to apply this technique. Rails are providing developers with really excellent abstractions, but it&#8217;s always good to know what&#8217;s under the hood and how it all works. There are a few things that might potentially cause [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-356" title="300px-Ruby_on_Rails_logo" src="http://www.ivankuznetsov.com/wp-content/uploads/300px-Ruby_on_Rails_logo.jpg" alt="" width="150" />Fragment caching is a powerful technique for improving performance of your web application. Rails site <a href="http://guides.rubyonrails.org/caching_with_rails.html#fragment-caching" target="_blank">describes in detail</a> how to apply this technique.</p>
<p>Rails are providing developers with really excellent abstractions, but it&#8217;s always good to know what&#8217;s under the hood and how it all works.</p>
<p>There are a few things that might potentially cause bugs in your code, or waste your time (speaking from my own experience). So here goes:</p>
<p>1. Beware of globally keyed fragments</p>
<p>Let&#8217;s take example from Rails tutorial:</p>
<pre>&lt;% cache do %&gt;
  All available products:
  &lt;% Product.all.each do |p| %&gt;
    &lt;%= link_to p.name, product_url(p) %&gt;
  &lt;% end %&gt;
&lt;% end %&gt;</pre>
<p>Now if you need to deal with a multi-language site you might want to make cache fragment language dependent. What might seem a convenient solution:</p>
<pre>&lt;%- cache([user.locale.to_s]) do -%&gt;</pre>
<p>will turn into a source of very interesting problems. While calling the cache method without parameters will automatically create a controller/action specific cache key, calling it with a key will make this fragment a globally keyed fragment. Cache key in the first case is going to look like &#8220;views/localhost:3000/controller-name&#8221;, and in the other case &#8220;views/en&#8221; &#8211; this is not as unique identifier any more.</p>
<p>While automatic cache key naming provided by rails is very convenient, it is very easy to run into a problem with duplicate cache key names used in different places.</p>
<p>2. Another pitfall of automatic cache key naming is that you shall never assume that when creating a cache with global key you can later find it using e.g. <a href="http://lzone.de/articles/memcached.htm" target="_blank">telnet interface</a> to memcache. Example &#8211; add</p>
<pre>&lt;%- cache('unique_cache_key') do -%&gt;
&lt;%- end -%&gt;</pre>
<p>in your view and then try to read directly from memcache:</p>
<pre>$ telnet localhost 11211
GET unique_cache_key
END</pre>
<p>At the same time</p>
<pre>GET views/unique_cache_key</pre>
<p>will work. It&#8217;s easy to make this mistake trying to check or delete cache keys directly from memcache when using Rails cache methods.</p>
<p>3. delete_matched is not supported by memcached (see rails/activesupport/lib/active_support/cache/mem_cache_store.rb)</p>
<p>In practice that means that if you&#8217;re using memcached as Rails cache engine and trying to delete or expire fragment cache using standard Rails methods and regexp &#8211; you&#8217;ll fail.</p>
<p>expire_fragment(/base\/xyz.*/)</p>
<p>will fail miserably. Ideal solution is not to use explicit cache expiration, but rather create cache keys in such a way that doesn&#8217;t require expiration. Alternatively it&#8217;s possible to use <a href="https://github.com/jkassemi/memcache-store-extensions" target="_blank">extensions</a> implementing delete_matched for memcached (haven&#8217;t tried it myself though).</p>
<p><em>Tip: one very useful tool for checking memcached is <a href="https://github.com/fauna/peep" target="_blank">peep</a> by Evan Weaver &#8211; allows you to peek into the cache and see what&#8217;s really cached and how it is used.</em></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2011%2F06%2Fpitfalls-of-rails-fragment-caching-with-memcached.html&amp;title=Pitfalls%20of%20Rails%20fragment%20caching%20with%20memcached" id="wpa2a_4"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2011/06/pitfalls-of-rails-fragment-caching-with-memcached.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes from Gothenburg &#8211; Nordic Ruby 2011 conference</title>
		<link>http://www.ivankuznetsov.com/2011/06/notes-from-gothenburg-nordic-ruby-2011-conference.html</link>
		<comments>http://www.ivankuznetsov.com/2011/06/notes-from-gothenburg-nordic-ruby-2011-conference.html#comments</comments>
		<pubDate>Tue, 21 Jun 2011 22:00:52 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web/Tech]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/?p=334</guid>
		<description><![CDATA[Here are my notes from Nordic Ruby conference in Göteborg, Sweden. I&#8217;d like to say big thanks to the organisers of the conference (especially CJ @cjkihlbom) &#8211; everything went really smooth, even though there&#8217;s been 150 people attending this year compared to 90 last year. Some points that I&#8217;d really like to highlight are: a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ivankuznetsov.com/wp-content/uploads/nordicruby.png"><img class="alignleft size-full wp-image-335" title="nordicruby" src="http://www.ivankuznetsov.com/wp-content/uploads/nordicruby.png" alt="" width="254" height="135" /></a>Here are my notes from <a href="http://nordicruby.org/" target="_blank">Nordic Ruby</a> conference in Göteborg, Sweden.</p>
<p>I&#8217;d like to say big thanks to the organisers of the conference (especially CJ <a href="https://twitter.com/#%21/cjkihlbom" target="_blank">@cjkihlbom</a>) &#8211; everything went really smooth, even though there&#8217;s been 150 people attending this year compared to 90 last year.<br />
Some points that I&#8217;d really like to highlight are:</p>
<ul>
<li>a lot of time to meet people and discuss: 30 minutes talks followed by  30 minutes breaks, no q&amp;a &#8211; those who had questions had an  opportunity to talk to the speakers during the breaks</li>
<li>venue was  great (of course, the boat <img src='http://www.ivankuznetsov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  &#8211; there was enough space for everyone to  move around, but at the same time it was compact enough not to get lost also everyone had an opportunity to have lunch and dinner together</li>
<li>&#8220;job board&#8221; a huge white board where anyone can post information about  open positions in their companies &#8211; it got filled withing firts few  hours &#8211; job market is really hot</li>
<li>lightning talks that any participant can give &#8211; 5 minute talks in the end of the day &#8211; it was really great</li>
<li>real coffee <img src='http://www.ivankuznetsov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  espresso, latte, cappuccino, americano &#8211; you name it &#8211; professional baristas were at your service</li>
<li><a href="http://runconfapp.com/races/226e14f45b6303b98e48bab49af60683" target="_blank">5K Nordic Ruby run</a> organised on the second day&#8217;s morning</li>
</ul>
<h2><span id="more-334"></span>Day 0</h2>
<p>The conference started with a party on <a href="http://en.wikipedia.org/wiki/G%C3%B6theborg_%28ship%29" target="_blank">Göthenborg ship</a>. It was a great way to get to know the speakers and participants in an informal setting.</p>
<h2>Day 1</h2>
<p><strong>&#8220;GitHub Flavored Ruby&#8221; was by Tom Preston-Werner (@mojombo) from GitHub.</strong></p>
<p>Tom had a hard task of waking up the auidence after yesterday&#8217;s pre-conference party, and he succeeded in this task. Tom explained what is a <a href="http://tom.preston-werner.com/2010/08/23/readme-driven-development.html" target="_blank">README driven development</a> that he and some of his colleagues in GitHub are using &#8211; a golden mean between waterfall and cowboy coding.<br />
Start a new project with writing a README file, where basic design principles and conventions will be described, and don&#8217;t forget to update it as the architecture changes.</p>
<p>Another interesting topic was <a href="http://tomdoc.org/" target="_blank">TomDoc</a> &#8211; code level documentation &#8211; a better alternative than RDoc/Yard, designed for hackers/humans, not for machines to read.</p>
<p>Modularisation was yet another subject &#8211; Tom explained how at GitHub they try to split the code into independent modules to reduce complexity of the system.<br />
Grit is a good example of that &#8211; a module for Ruby-Git interaction was written even before the rails code for GitHub.</p>
<p>Other examples of modles created in GitHub (and open-sourced) are: resque, jekyll, proxymachine and chimney, albino, gollum, bart, camo, failbot, giraffe, nodeload (in node.js), ernie (in erlang), stratocaster (for event feed), ghromosome (which is apparently not used anymore, but worth mentioning just because of the fun name).</p>
<p>And naturally for versioning of the components Tom proposes to use <a href="http://semver.org/" target="_blank">Semantic versioning</a>.</p>
<p>A few notes from the after-talk discussion with Tom and others:<br />
- Github uses git powered deploys &#8211; instead of copying the new release from git and then changing symlink to current release, they use single directory and do direct git updates &#8211; rollbacks are also easy to do using git fucntionality<br />
- it&#8217;s possible to deploy Github from Campfire by giving deploy command to a robot<br />
- to avoid downtime &#8211; build_cache is executed on a local machine before deploy and pushed to the servers during deploy<br />
- GitHub is still running on Rails 2.3, Tom&#8217;s estimate for migration to Rails 3 is ~2 weeks of &#8220;stop commits and migrate&#8221; (the estimate seems to be pretty consistent &#8211; I&#8217;ve been talking to several people about it)<br />
- experience from a fairly large web-app developers: MySQL to Postgres migration took 3 weeks</p>
<p><strong>&#8220;API Design Matters&#8221; was by Anthony Eden (@aeden) from DNSimple</strong></p>
<p>Central points from Anthony&#8217;s presentation:<br />
- APIs outlive their implementation (&#8220;Think about the children&#8221; when designing APIs <img src='http://www.ivankuznetsov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
- Design APIs so that they are easy to extend<br />
- 5 Cs: consistent, clear, convenient, concise and complete<br />
- The best API is no API<br />
- If you&#8217;re a software developer &#8211; you are and API designer<br />
- And use semantic versioning that Tom was talking about</p>
<p>Reading recommendations:<br />
- Jasmine Blanchette &#8220;<a href="http://chaos.troll.no/~shausman/api-design/api-design.pdf" target="_blank">The little manual of API design</a>&#8221;<br />
- Joshua Bloch &#8220;<a href="http://www.youtube.com/watch?v=aAb7hSCtvGw, " target="_blank">How to design a good API and why it matters</a>&#8221;</p>
<p><strong>&#8220;Bridging the gap &#8211; Using JavaScript in Rails to write DRY rich client applications&#8221; by Thorben Schröder (@walski), KOPFMaschine</strong></p>
<p>An interesting talk about using Java Script from Ruby code and the other way around.<br />
Implementing validations on the client side reduces amount of round-trips and speeds up user interaction, but since smart people can hack JavaScript and bypass client-side validations, also server side validations are necessary. To avoid writing validations twice use The Ruby Racer,  CommonJS and CommonJS models to DRY your code and write validations only once and use them from both Ruby and JS code. Pretty smart, huh?</p>
<p><strong>&#8220;Limited Red Society&#8221; by Joseph Wilk (@josephwilk)</strong></p>
<p>Slides: <a href="http://www.slideshare.net/josephwilk/the-limited-red-society-8367200" target="_blank">http://www.slideshare.net/josephwilk/the-limited-red-society-8367200</a></p>
<p>Kanban is limiting number of tasks the team has in progress at any given moment. Joseph described in his talk how to apply this methodology to testing.</p>
<p>It&#8217;s important to have metrics for your testing and it&#8217;s important to visualize them. How much time do you spend in &#8220;red&#8221; when your tests are failing, which modules in your code are changed most often, are they the same that usually fail tests, are there any oscillating test cases that pass then fail then pass again?</p>
<p>One thing to be noted &#8211; some metrics have limited lifespan &#8211; measure what you&#8217;re interested in and then throw them away.</p>
<p>Reading recommendations:<br />
&#8220;<a href="http://www.amazon.co.uk/Refactoring-Ruby-William-C-Wake/dp/0321545044" target="_blank">Refactoring in Ruby</a>&#8221;<br />
&#8220;<a href="http://www.amazon.co.uk/Refactoring-Ruby-Addison-Wesley-Professional/dp/0321603508" target="_blank">Refactoring. Ruby Edition</a>&#8221; Kent Beck</p>
<p><strong>&#8220;</strong><strong>Must It Always Be About Sex?</strong><strong>&#8221; by Joshua Wehner (@jaw6)</strong></p>
<p>Links from the talk: <a href="http://pinboard.in/u:jaw6/t:nr2011/" target="_blank">http://pinboard.in/u:jaw6/t:nr2011/</a></p>
<p>Minorities and women are under-represented in our community. Black man is more likely to be hit by lightning than become a computer science professor.<br />
75% of women engineers leave profession because they are not socially accepted in the working culture. In the beginning of computer era programming was mostly a job for women.<br />
Do you think that your application is mobile friendly if you have iPhone optimised version? Think again &#8211; the most popular phone with a web browser is Nokia 1100 &#8211; more than 250 million phones sold to date,<br />
and that kind of devices are the only way how most people in Africa or India access the Internet.</p>
<p>What do we need to do to change current situation?</p>
<p>Just today I came across an article on the same subject: <a href="http://www.blackweb20.com/2011/06/10/two-11-year-old-entrepreneurs-learned-the-hard-way-what-it%E2%80%99s-like-to-be-a-minority-in-tech-during-startup-weekend/" target="_blank">Two 11-year-old entrepreneurs learned the hard way what it’s like to be a minority in tech during Startup Weekend</a></p>
<p><strong>&#8220;Infinite data &#8211; finite solutions&#8221; by Randall Thomas (@daksis) from Engine Yard</strong></p>
<p>Quick dive into Bayesian statistics. That is the technology that helps  to filter out spam from your inbox: &#8220;Keeps spam at Bayes&#8221; <img src='http://www.ivankuznetsov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bayes + DAG (Directed Acyclic Graph) = BBN (Bayesian Belief Network)</p>
<p>Probably the most scientific talk of the conference and two great demos: reconstruction of Bach&#8217;s first invention using BBN (amazing stuff) and analysing whiskey properties</p>
<p>Book to read: &#8220;<a href="http://fisher.stat.wmich.edu/joe/Stat666/book/book.pdf" target="_blank">Robust Nonparametric Statistical Methods</a>&#8221;<br />
Site to check: <a href="http://yudkowsky.net/rational/bayes" target="_blank">Eliezer Yudkowsky</a><br />
Tool to check: <a href="http://www.cs.waikato.ac.nz/ml/weka/" target="_blank">Weka</a> &#8211; analysis tool &#8211; live example how to analyze properites of whiskey.</p>
<p>A great collection of links on Bayesian Networks:  <a href="https://gist.github.com/1031597">https://gist.github.com/1031597</a></p>
<p><strong>&#8220;Taking Back Education&#8221; by Joe O&#8217;Brien (@objo)<br />
</strong></p>
<p>Education. We are in the top 5 to 2% of the developers by just being here &#8211; attending the conference.<br />
Why education system sucks? There&#8217;s a clear need for apprenticeship institute.</p>
<p>Harward Business Review research indicated that team IQ depends on diversity, not on IQ of individual members.<br />
Adding a women to the team cnsistently improves team performance (good reference for Diversity problems talk by Joshua)</p>
<p><strong>In the end of the first day there was a series of &#8220;lightning talks&#8221;.</strong></p>
<p>* Anthony Eden (@aeden) proposed to use DNS protocol for resolving dependencies. Definitely idea worth <a href="https://gist.github.com/1031494" target="_blank">studying</a>.<br />
* Twitter will be native on all iOS devices &#8211; think about it, and what do you want to do with it.<br />
* Stephen Sykes &#8211; obfuscated code for fun and ruby quiz &#8211; really, really fun &#8211; see the slides here: <a href="http://www.stephensykes.com/obfu_lightening.pdf" target="_blank">http://www.stephensykes.com/obfu_lightening.pdf</a><br />
* Emily Bach (backconsulting.com) shared her experiences in teaching TDD<br />
* Theo from Burt talked about his experiences and lessons learned from scaling:<br />
- build two of everything from the start &#8211; will help with horizontal scaling later<br />
- fail fast (Göthenburg ship made it to China and back to Sweden and sank a hundred meters from the home harbour, Vaasa is a lot better example &#8211; it sank right after it was deployed <img src='http://www.ivankuznetsov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
- queues<br />
* Tom from GitHub talked about Hubot &#8211; a Campfire robot they wrote in node.js and keep developing just for fun &#8211; absolutely amazing stuff, every team should do that<br />
* David from Streamio (one of the sponsors of Nordic Ruby) did a &#8220;shameless self-promotion&#8221; of his company<br />
* Alex who has been doing a great job filming the conference talked about making a movie &#8211; what it takes<br />
* Antony Sastre &#8211; talked about photography &#8211; really inspiring, Antony was a web developer, then left the field and was doing photography for living for two years, now came back to web development<br />
* Nikolai (@nikolayb) Is this a bad idea? Deploying always to production on a site with millions of page views per day, one branch always &#8211; test code on a live service? Somehow it works&#8230;<br />
* Paul Wilson (@paulanthonywils) talked about Agile Delivery Network &#8211; doing better government IT, and here&#8217;s a bunch of links from his talk: https://gist.github.com/1035392<br />
* Paul Campbell (@paulk) talked about whenever.js and made it public on GitHub in the end of his talk http://whatever-js.heroku.com/#1, https://github.com/paulca/whenever.js</p>
<p>Day one ended with a BBQ dinner at the River Cafe.</p>
<h2>Day 2</h2>
<p>Paul Campbell who ended Day 1 with his lightning talk also started Day 2 with a autobiographical talk &#8220;In search of me fein&#8221; (myself in Irish).</p>
<p>7 days in my life, zombie movies and finding inspiration<br />
Technologist, developers, live in a bubble &#8211; we have no problems finding jobs, we can travel, we can choose where we live and work. It&#8217;s not like that outsie of our industry.</p>
<p><strong>&#8220;Actors on stage&#8221; by Elise Huard (@elise_huard)</strong></p>
<p>Slides: <a href="http://www.slideshare.net/ehuard/ruby-hollywood-nordic" target="_blank">http://www.slideshare.net/ehuard/ruby-hollywood-nordic</a></p>
<p>We have multiple cores in our processors now &#8211; how do we benefit from it?<br />
MRI is the only Ruby where parallel threads are executed time-scliced in one real thread.</p>
<p><a href="http://www.unlimitednovelty.com/2011/05/introducing-celluloid-concurrent-object.html" target="_blank">Cellucloid</a> &#8211; a concurrent object framework for Ruby.</p>
<p>Languages that implement actors: Erlang, Scala (Actors are in standard library), Closure (Actors called Agents)</p>
<p>Mats hates threads <img src='http://www.ivankuznetsov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Should there still be a better cuncurrency primitives in MRI? shall we create a branch of Ruby to implement it?</p>
<p><strong>&#8220;Beyond Ruby&#8221; by Jakob Mattson from Burt (@jakobmattsson)<br />
</strong></p>
<p>Slides: <a href="http://jakobmattsson.tumblr.com/post/6664704401/beyond-ruby" target="_blank">http://jakobmattsson.tumblr.com/post/6664704401/beyond-ruby</a></p>
<p>Bold statement: Ruby is not a dynamic language. Not everyting in Ruby is an object, despite what many books claim.<br />
E.g. dot (.) or &#8220;or&#8221; (||) operators cannot be redefined. Or operator doesn&#8217;t evaluate second argument if the first one is true.<br />
Ruby is not as moldable as it could be.<br />
It would be cool to implement calling by name &#8211; passing expression along with the context to the callee and letting it decide whether to evaluate it or not.<br />
<a href="http://www.iolanguage.com/" target="_blank"> Io language</a> is probably 80% there. A new language needs to be invented. And coding it would not be that difficult &#8211; because if it is<br />
truly dynamic, then most of it can be implemented in itself.</p>
<p><strong>&#8220;Fewer constraints&#8221; by Ryan Smith (@ryandotsmith) from Heroku</strong></p>
<p>Slides: <a href="http://dl.dropbox.com/u/1579953/concurrency_deck_with_notes.pdf" target="_blank">http://dl.dropbox.com/u/1579953/concurrency_deck_with_notes.pdf</a></p>
<p>Continuing the theme that Elise started this morning. How to improve performance of your application by parallelizing.<br />
Amdahl&#8217;s law &#8211; adding processors gives only marginal speed-up. &#8220;Even though we have 10 workers<br />
available to us, we are only seeing a speedup factor of 5.2, with 20 workers it get only to 6.9&#8243;.</p>
<p>Real life example &#8211; improving queue performance. Using Fuzzy FIFO instead of traditional queues FIFO implementation.<br />
Example with using spinlock in PostgreSQL to implement it. See queue_classic on github.</p>
<p><strong>&#8220;Mountain Dew and My Trail of Tears&#8221; by Aaron Patterson (@tenderlove) from AT&amp;T Interactive</strong></p>
<p>Aaron discussed in depth how to work with legacy code.</p>
<p>- use &#8220;ruby -w&#8221; to see the warnings in your code, warnings can be used by developers to inform about upcoming deprecations<br />
- Liskov substitution principle (LSP)<br />
- Single responsibility principple<br />
- Method extraction<br />
- Object#extend<br />
- Code seams<br />
- sleep sort: <a href="http://dis.4chan.org/read/prog/1295544154" target="_blank">http://dis.4chan.org/read/prog/1295544154</a> <img src='http://www.ivankuznetsov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Recommended reading: <a href="http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052" target="_blank">Working effectibely with legacy code</a></p>
<p><strong>&#8220;Legacy&#8221; by Chad Fowler (@chadfowler)</strong></p>
<p>Chad started with playing a recording of Beethoven &#8211; this is legacy. Miro is legacy. Gaudi is legacy too, and the only reason to visit Barcelona.</p>
<p>Legacy is good.</p>
<p>Nobody will remember your work when you die. There are still systems in use written 25 years ago &#8211; why don&#8217;t we write that kind of code anymore?<br />
Average lifespan of a business software is 5 years (figure is probably made up)</p>
<p>Recommended reading:</p>
<p>Michael Feathers &#8220;<a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2007/03/your_code_its_a.html" target="_blank">Your Code.. it&#8217;s Alive..</a>&#8221;<br />
Richard P. Gabriel &#8220;<a href="http://www.dreamsongs.com/Files/DesignBeyondHumanAbilitiesSimp.pdf" target="_blank">Design Beyond Human Abilities</a>&#8221;</p>
<p>What kind of software lasts &#8211; either small (cell-size) or systems consisting of cell-sized software (like UNIX).</p>
<p>Force heterogenity &#8211; languages, OSes, frameworks &#8211; will change over time. If it&#8217;s hard to force heterogenity &#8211; do it all the time.</p>
<p><strong>&#8220;Must.Try.Harder&#8221; by Keavy McMinn (@keavy)</strong></p>
<p>An absolutely fascinating and inspirational talk from a woman who decided to train for an IronMan from pretty much zero.<br />
She did it. A rare inspirational example of how to go outside your comfort zone and achieve a goal that looked impossible.</p>
<p>&nbsp;</p>
<p>Other conference notes:</p>
<p>Fredrik Rubensson: <a href="http://www.highlevelbits.com/2011/06/nordic-ruby.html" target="_blank">http://www.highlevelbits.com/2011/06/nordic-ruby.html</a><br />
Andreas Ronge / Jayway:  <a href="http://blog.jayway.com/2011/06/19/notes-and-thoughts-from-a-great-conference/" target="_blank">http://blog.jayway.com/2011/06/19/notes-and-thoughts-from-a-great-conference/</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2011%2F06%2Fnotes-from-gothenburg-nordic-ruby-2011-conference.html&amp;title=Notes%20from%20Gothenburg%20%26%238211%3B%20Nordic%20Ruby%202011%20conference" id="wpa2a_6"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2011/06/notes-from-gothenburg-nordic-ruby-2011-conference.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Call to undefined function: imagecreatefromjpeg()</title>
		<link>http://www.ivankuznetsov.com/2010/10/call-to-undefined-function-imagecreatefromjpeg.html</link>
		<comments>http://www.ivankuznetsov.com/2010/10/call-to-undefined-function-imagecreatefromjpeg.html#comments</comments>
		<pubDate>Sun, 10 Oct 2010 08:34:23 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web/Tech]]></category>
		<category><![CDATA[gd]]></category>
		<category><![CDATA[imagecreatefromjpeg]]></category>
		<category><![CDATA[jpeg]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/?p=299</guid>
		<description><![CDATA[While installing new Joomla modules I came across this PHP error (yep, still have to deal with PHP occasionally). I had PHP compiled from source on Ubuntu 10.04 as per earlier instructions. Quick check of phpinfo() indicated that while gd module was compiled in, it didn&#8217;t have JPEG support: GD Support enabled GD Version bundled [...]]]></description>
			<content:encoded><![CDATA[<p>While installing new Joomla modules I came across this PHP error (yep, still have to deal with PHP occasionally). I had PHP compiled from source on Ubuntu 10.04 as per <a href="http://www.ivankuznetsov.com/2010/05/moving-joomla-wordpress-and-other-phpfastcgi-apps-to-nginx.html">earlier instructions</a>. Quick check of phpinfo() indicated that while gd module was compiled in, it didn&#8217;t have JPEG support:</p>
<pre>GD Support         enabled
GD Version         bundled (2.0.34 compatible)
GIF Read Support   enabled
GIF Create Support enabled
PNG Support        enabled
WBMP Support       enabled
XBM Support        enabled</pre>
<p>Making sure that JPEG libraries are installed</p>
<pre>sudo aptitude install libjpeg libjpeg-dev</pre>
<p>and reconfiguring PHP with &#8211;with-jpeg-dir flag (the rest of the compilation process remains the same as <a href="http://www.ivankuznetsov.com/2010/05/moving-joomla-wordpress-and-other-phpfastcgi-apps-to-nginx.html">here</a>)</p>
<pre>./configure --enable-fastcgi --enable-fpm --with-mcrypt --with-zlib
--enable-mbstring --with-openssl --with-mysql --with-mysql-sock
--with-gd --without-sqlite --disable-pdo --with-jpeg-dir=/usr/lib</pre>
<p>and then restarting nginx</p>
<pre>sudo /etc/init.d/nginx restart</pre>
<p>helped to solve the problem.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2010%2F10%2Fcall-to-undefined-function-imagecreatefromjpeg.html&amp;title=Call%20to%20undefined%20function%3A%20imagecreatefromjpeg%28%29" id="wpa2a_8"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2010/10/call-to-undefined-function-imagecreatefromjpeg.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up your own git server on Ubuntu</title>
		<link>http://www.ivankuznetsov.com/2010/05/setting-up-your-own-git-server-on-ubuntu.html</link>
		<comments>http://www.ivankuznetsov.com/2010/05/setting-up-your-own-git-server-on-ubuntu.html#comments</comments>
		<pubDate>Thu, 13 May 2010 12:39:00 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[gitosis]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/?p=262</guid>
		<description><![CDATA[This will create a new user &#8216;gitosis&#8217; and prepare a structure for repositories in /srv/gitosis. Now let&#8217;s initialize a gitosis-admin repo &#8211; it is used for managing repositories and access Of course there&#8217;s always an option to use github. And if you&#8217;re working on an open source project, or want to concentrate on coding and [...]]]></description>
			<content:encoded><![CDATA[<p>This will create a new user &#8216;gitosis&#8217; and prepare a structure for repositories in /srv/gitosis. Now let&#8217;s initialize a gitosis-admin repo &#8211; it is used for managing repositories and access<img class="alignleft size-full wp-image-261" title="git-logo" src="http://www.ivankuznetsov.com/wp-content/uploads/git-logo.png" alt="" width="97" height="188" /></p>
<p>Of course there&#8217;s always an option to use <a href="http://www.github.com" target="_blank">github</a>. And if you&#8217;re working on an open source project, or want to concentrate on coding and not system administration, github is a lot better option than setting up and managing your own git server (I&#8217;ve been so impressed by <a href="http://twitter.com/defunkt" target="_blank">@defunkt</a>&#8216;s presentation on <a href="http://www.frozenrails.eu" target="_blank">#frozenrails</a>, that started recommending github to everyone <img src='http://www.ivankuznetsov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  But if you already pay for a virtual machine somewhere (like <a href="http://www.linode.com" target="_blank">Linode</a>), then setting up your own git server might be a viable option, especially that it is sooo easy.</p>
<p>The following instructions have been verified on Ubuntu 10.04 Lucid Lynx, but should work at least on Ubuntu 9.04 and 9.10 just as well.</p>
<p><span id="more-262"></span></p>
<p>Let&#8217;s start with installing gitosis itself. Issue the following command on the server:</p>
<pre>sudo apt-get install gitosis</pre>
<p>This will create a new user &#8216;gitosis&#8217; and prepare a structure for repositories in /srv/gitosis. Now let&#8217;s initialize a gitosis-admin repo &#8211; it is used for managing repositories and access rights.</p>
<pre>sudo -H -u gitosis gitosis-init &lt; ~/tmp/my_public.key</pre>
<p>You need to have a public key for accessing it. If you don&#8217;t have one yet, you can use</p>
<pre><code>ssh-keygen -t rsa</code></pre>
<p>command on your local machine to generate public/private key pair. Copy public key to the server before initializing gitosis-admin repository.</p>
<p>Now with gitosis-admin repo initialized on the server &#8211; let&#8217;s clone it to the local computer.</p>
<pre>git clone gitosis@myserver.com:gitosis-admin.git</pre>
<p>If you see an error like:</p>
<pre>Permission denied (publickey).
fatal: The remote end hung up unexpectedly</pre>
<p>That is most likely because you restricted access to you server via ssh to only certain users, and gitosis is not one of them. Edit /etc/ssh/sshd_config, find AllowUsers line and add gitosis to the list.</p>
<p>Now that you have successfully cloned gitosis-admin repo to your local computer, you can add  new users and new repositories.</p>
<p>To add new repository, edit gitosis.conf and add lines like:</p>
<pre>[group myrepo]
writable = myrepo
members = user@computer</pre>
<p>After that commit and push the changes to gitosis-admin project:</p>
<pre>git commit -a -m "Added myrepo repository"</pre>
<p>Now you can clone this new repository to your local machine (note .git added to the name of the repository):</p>
<pre>git clone gitosis@mygitserver.com:myrepo.git</pre>
<p>To allow new user to access your repository, get this user&#8217;s public key, copy it to gitosis-admin/keydir as newuser@computer.pub, then edit gitosis.conf and add newuser@computer (without .pub) to the list of members:</p>
<pre>[group myrepo]
writable = myrepo
members = user@computer newuser@computer</pre>
<p>Now add new files and commit and push changes to git server (make sure you really add all files and don&#8217;t forget to push &#8211; these are quite common mistakes when adding new users).</p>
<pre>git add .
git commit -m "Added user newuser"
git push</pre>
<p>With a freshly cloned empty repository you&#8217;ll need to add you first files, do a commit and push origin master:</p>
<pre>vim README.txt
git commit -a -m "Added readme"
git push origin master</pre>
<p>Now you can git pull and git push as much as you like.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2010%2F05%2Fsetting-up-your-own-git-server-on-ubuntu.html&amp;title=Setting%20up%20your%20own%20git%20server%20on%20Ubuntu" id="wpa2a_10"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2010/05/setting-up-your-own-git-server-on-ubuntu.html/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Git &#8211; revert or amend last commit</title>
		<link>http://www.ivankuznetsov.com/2010/01/git-revert-or-amend-last-commit.html</link>
		<comments>http://www.ivankuznetsov.com/2010/01/git-revert-or-amend-last-commit.html#comments</comments>
		<pubDate>Sat, 16 Jan 2010 20:15:53 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/?p=232</guid>
		<description><![CDATA[Since we moved from SVN to git in HeiaHeia I had to revert or amend changes I accidentally committed or committed and pushed to git repository. This is not the most common operation, so I have to browse the documentation every time I do that. This is more of a memo to myself, which hopefully [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="Git" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Git-logo.svg/71px-Git-logo.svg.png" alt="" width="71" height="26" />Since we moved from SVN to git in <a href="http://www.ivankuznetsov.com/2010/01/heiaheia-probably-the-most-fun-way-to-keep-fit-2.html">HeiaHeia</a> I had to revert or amend changes I accidentally committed or committed and pushed to git repository. This is not the most common operation, so I have to browse the documentation every time I do that. This is more of a memo to myself, which hopefully will be useful to others too.</p>
<p>Committed some changes, didn&#8217;t push them, and need to amend the commit:</p>
<pre>git commit --amend -a -m "Commit message"</pre>
<p>Committed some changes, pushed them, and need to amend the commit, do the revert operation instead, since someone might&#8217;ve already used your changes.</p>
<p>Committed some changes, didn&#8217;t push them, and need to undo the commit:</p>
<pre>git reset --hard HEAD<code>^</code></pre>
<p>This will just toss away the last commit completely.</p>
<p>Commited some changes, pushed them, and need to undo the commit:</p>
<pre>git revert HEAD</pre>
<p>This will automatically create a new commit, reverting the changes from the previous</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2010%2F01%2Fgit-revert-or-amend-last-commit.html&amp;title=Git%20%26%238211%3B%20revert%20or%20amend%20last%20commit" id="wpa2a_12"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2010/01/git-revert-or-amend-last-commit.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Agile distributed team &#8211; using chat to run scrum meetings</title>
		<link>http://www.ivankuznetsov.com/2009/10/agile-distributed-team-using-chat-to-run-scrum-meetings.html</link>
		<comments>http://www.ivankuznetsov.com/2009/10/agile-distributed-team-using-chat-to-run-scrum-meetings.html#comments</comments>
		<pubDate>Mon, 19 Oct 2009 16:42:53 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[remote work]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/?p=212</guid>
		<description><![CDATA[The current development team that I&#8217;m working in is really small &#8211; just 2 software gurus, a product owner and me as a scum-master/system admninistrator/part-time developer/architect. Our team is distributed to the extent that sometimes all four of us are located in different places during our meetings &#8211; but time zones difference is in most [...]]]></description>
			<content:encoded><![CDATA[<p>The current development team that I&#8217;m working in is really small &#8211; just 2 software gurus, a product owner and me as a scum-master/system admninistrator/part-time developer/architect.</p>
<p>Our team is distributed to the extent that sometimes all four of us are located in different places during our meetings &#8211; but time zones difference is in most of the cases withing 1-2 hours. Up until recently some of us didn&#8217;t have a permanent office and had to participate in daily scrum meetings, and sprint planning/reviews from public open spaces.<span id="more-212"></span></p>
<p>We tired to use Skype, but flakiness of wireless in some locations and sometimes just insufficient bandwith quickly rendered it as a non-viable option. Even with commercial telco systems it is quite often that people spend first 10 minutes of the meeting on making sure that everyone is on the line and can hear the other party &#8211; can be really frustrating, especially when the meeting is supposed to last for 15 minutes.</p>
<p>In the end we started using Google Talk for daily scrum meetings and for sprint planning / reviews as well. Works really good &#8211; keeps reports short and to the point. No time is lost on setting up voice connections and exchanging &#8220;can you hear me &#8211; you are breaking up&#8221;.</p>
<p>I believe two major factors that contribute to success use of chat are that:<br />
1. the team is small and<br />
2. everyone is in equal position</p>
<p>When a part of the team is located in the same physical space and there is just one or two people on the other side of the telephone &#8211; most important discussions tend to take place face-2-face, and remote members of the team are excluded. Using chat ensures that those team members who happen to be in the same office are talking to each other the same way as if they were remote.</p>
<p>It would be interesting to hear experiences from other teams that are running scrum with chat as primary means of communication.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2009%2F10%2Fagile-distributed-team-using-chat-to-run-scrum-meetings.html&amp;title=Agile%20distributed%20team%20%26%238211%3B%20using%20chat%20to%20run%20scrum%20meetings" id="wpa2a_14"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2009/10/agile-distributed-team-using-chat-to-run-scrum-meetings.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Choosing Mobile Development Platform</title>
		<link>http://www.ivankuznetsov.com/2009/05/choosing-mobile-development-platform.html</link>
		<comments>http://www.ivankuznetsov.com/2009/05/choosing-mobile-development-platform.html#comments</comments>
		<pubDate>Wed, 06 May 2009 16:20:13 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Symbian]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[S60]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/?p=162</guid>
		<description><![CDATA[There&#8217;s been a lot of heated discussions in the blogosphere in the past month about mobile platforms from independent developer perspective. Which platform to choose, if you want to develop cool applications, reach a lot of users and maximize your revenues? I previously wrote on this subject a year ago, when Android was announced, and [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-167" title="mobileplatform" src="http://www.ivankuznetsov.com/wp-content/uploads/mobileplatform.png" alt="mobileplatform" width="200" height="161" />There&#8217;s been a lot of heated discussions in the blogosphere in the past month about mobile platforms from independent developer perspective. Which platform to choose, if you want to develop cool applications, reach a lot of users and maximize your revenues?</p>
<p>I previously wrote on this subject <a href="http://www.ivankuznetsov.com/2008/01/google-android-vs-nokia-series-60-what-would-it-take-to-build-a-better-mobile-phone.html" target="_blank">a year ago</a>, when Android was announced, and <a href="http://www.ivankuznetsov.com/2006/07/why-are-mobile.html" target="_blank">three years ago</a>, when I was really disappointed by a pretty much dead S60 applications market.</p>
<p>This time it started with a great presentation by <a href="http://dirtyaura.org/blog/" target="_blank">Teemu Kurppa</a> (a mastermind behind mobile Jaiku) at <a href="http://mobiledevcamp.fi/" target="_blank">MobileDevCamp Helsinki</a> &#8211; &#8220;<a href="http://dirtyaura.org/blog/2009/03/10/mobiledevcamp-slides-platform-stage/" target="_blank">Platform = Stage. How to choose a mobile development platform?</a>&#8220;. It is a must see for every mobile developer.</p>
<p><span id="more-162"></span>Teemu compares the number of &#8220;educated users&#8221; for S60, iPhone and J2ME enabled phones, and illustrates that they are cardinally different from absolute numbers of sold devices/potential customers advertised by companies behind those technologies.</p>
<p>Even if iPhone/iPod Touch has the smallest number of sold devices, it has 3x times the number of &#8220;educated users&#8221; than its nearest competitor (S60), and &#8220;educated users&#8221; are the real potential customers with the money and intention to buy.</p>
<p>Teemu also compares the distribution channels &#8211; Apple App Store vs. S60 Download and user experience when downloading and installing applications.</p>
<p>By far iPhone/iPod Touch coupled with App Store is the absolute winner as a development platform, if you want to maximize your target audience and profits. But there will be two major disruptions this year, trigerring a ripple effect in mobile development pond &#8211; Nokia&#8217;s global <a href="http://store.ovi.com" target="_blank">Ovi Store</a> launch and Google&#8217;s <a href="http://www.android.com/market/" target="_blank">Android Market</a> launch in Europe.</p>
<p>However as <a href="http://www.ewan.net/2009/04/10/me-what-about-the-400m-ovi-compatible-handsets-by-dec-2010-iphone-dev-rockstar-uhhh/" target="_blank">Ewan MacLeod reports</a> Nokia&#8217;s Ovi Store got more than a cold reception from mobile developers in the Bay Area, who were unimpressed by &#8220;400 million Ovi compatible handsets by Dec 2010&#8243; proposition.</p>
<p>Mike Rowehl in his rant &#8220;<a href="http://www.thisismobility.com/blog/2009/04/11/please-dont-mistake-my-apathy-for-a-lack-of-understanding/" target="_blank">Please Don’t Mistake My Apathy For A Lack of Understanding</a>&#8221; explains the reasons behind his choice of iPhone as a preferred development platform. Addressing Nokia, RIM and Microsoft, Mike wrote <em>&#8220;Once things change, once you get your stores developed, released, and proven as a good commercial channels to end users &#8211; then we can talk again. Until then we’re all just going to keep laughing at you and developing for iPhone&#8221;</em>. He got a reassuring comment from Lee Williams, executive director of Symbian Foundation, which I do hope is the first sign that at least Nokia starts caring about developer&#8217;s needs.</p>
<p>iPhone was the buzzword of 2008, but I am still closely following Google&#8217;s Android development. I was really impressed by a successful example of one of my friends, who concepted, developed and published mobile application for Android in about a month of evening coding &#8211; without any prior mobile development experience, let alone Android experience. Android documentation and community, encouraged and supported by Google, allowed this to happen.</p>
<p>Apple&#8217;s App Store success (1 bln downloads quoted) indicates that there is a lot of moeny in 3rd party application market, and there will be a fierce competition between Google, Apple and Nokia for developers attention. The one that succeeds will have to forget about having the largest number of devices on the market, and concentrate on three really important things:</p>
<ul>
<li>providing a good distribution channel with a fair revenue split</li>
<li>educating users about possibility to install mobile applications</li>
<li>creating a decent development platform, with a good toolset, comprehensive documentation and active community</li>
</ul>
<p>With Apple being now a clear leader, and Android a strong challenger with large potential, it is going to be an uphill battle for Nokia to regain trust of mobile developers and deliver on promises of Symbian Foundation and Ovi Store.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2009%2F05%2Fchoosing-mobile-development-platform.html&amp;title=Choosing%20Mobile%20Development%20Platform" id="wpa2a_16"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2009/05/choosing-mobile-development-platform.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Introducing Moozement</title>
		<link>http://www.ivankuznetsov.com/2009/03/introducing-moozement.html</link>
		<comments>http://www.ivankuznetsov.com/2009/03/introducing-moozement.html#comments</comments>
		<pubDate>Wed, 04 Mar 2009 22:10:25 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[HeiaHeia]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Social Networks]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web/Tech]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/?p=108</guid>
		<description><![CDATA[Last year I got involved in the development of a new social network &#8211; Moozement. There are plenty of social networks out there, there are even white label social networks. So why create another one? Jyri Engeström wrote some time ago about the case for object-centered sociality: &#8220;&#8216;social networking&#8217; makes little sense if we leave [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-112" title="moozement" src="http://www.ivankuznetsov.com/wp-content/uploads/moozement.jpg" alt="moozement" width="314" height="96" />Last year I got involved in the development of a new social network &#8211; <a href="http://www.moozement.com" target="_blank">Moozement</a>. There are <a href="http://en.wikipedia.org/wiki/List_of_social_networking_websites" target="_blank">plenty of social networks</a> out there, there are even <a href="http://www.ning.com" target="_blank">white label social networks</a>. So why create another one?</p>
<p><a href="http://www.zengestrom.com" target="_blank">Jyri Engeström</a> wrote some time ago about <a href="http://www.zengestrom.com/blog/2005/04/why_some_social.html" target="_blank">the case for object-centered sociality</a>: <em>&#8220;&#8216;social networking&#8217; makes little sense if we leave out the objects that mediate the ties between people&#8221;</em>. I could not agree with him more. The glue of each community is something that unites them &#8211; common interest, social object. When you join new social network, you typically start by building your social graph &#8211; re-establishing links to the real people you know, checking if they have already registered, inviting those whom you would like to see in the new environment. But there must be something beyond the initial phase of building the social graph. And this is the problem that haunts giants like Facebook and MySpace. You cannot possibly have common interest with everyone, and you don&#8217;t want to share the same things with everyone.</p>
<p><span id="more-108"></span>While Facebook is still growing strongly, it&#8217;s morphing into some sort of a generic social utility. Thanks to the <a href="http://developers.facebook.com/" target="_blank">Platform API</a> there are all kinds of applications available on <a href="http://www.facebook.com/apps/">Facebook</a>, some of them creating social objects (like <a href="http://www.facebook.com/apps/application.php?id=8278986302">Circle of Moms</a> or <a href="http://www.facebook.com/apps/application.php?id=2219089314">Cities I&#8217;ve Visited</a>), but it feels like true passions of people are quite rare in generic networks. When it comes to your most important hobbies, you might want to share your thoughts and data with other likeminded people and not necessarily with all aquaintances on Facebook. This is one of the reasons why specialized social networks are thriving. <a href="http://www.dogster.com" target="_blank">Dogster.com</a> and <a href="http://www.catster.com" target="_blank">catster.com</a> <a href="http://www.catster.com/" target="_blank"></a>are two perfect examples of such networks with very strong social objects. <a href="http://blog.pmarca.com/" target="_blank">Mark Andreesen</a>&#8216;s creation <a href="http://www.ning.com" target="_blank">Ning</a> &#8211; a place where everyone can build own social network &#8211; already has hundreds of thousands of networks.</p>
<div>Online sports services can be divided into at least three major categories:</div>
<div>
<div><strong>Well-being services</strong></p>
<p>There are plenty of online training log services promoting weight management, wellness, healthy lifestyle, sport and exercise. There are many good and innovative services in this segment, but they&#8217;re all somewhat serious by definition (in a good way) &#8211; you need to be on a program to make perfect use of them.</p></div>
<div class="im"><strong>Advanced sports services</strong></p>
<p>There are also some useful advanced sports services, provided by giants like <a href="http://nikeplus.nike.com" target="_blank">Nike</a><a href="http://nikeplus.nike.com/" target="_blank"></a>, <a href="https://www.polarpersonaltrainer.com/" target="_blank">Polar</a> and <a href="http://sportstracker.nokia.com" target="_blank">Nokia</a>. These services are great for automatically collecting data about your exercises and utilizing it in various ways. They are targeting enthusiasts, who typically use heart rate monitors, GPS devices, altimeters and other equipment to monitor their progress.</p>
<p><strong>Casual sports services</strong></p>
<p><strong></strong>I believe <a href="http://www.moozement.com">Moozement</a> established and defined this category &#8211; by combining social networking and online training logs in a casual way. It is so simple that anybody doing any kind of sports can use it and benefit from it. Simplicity and wide set of available sports sets it apart from all existing solutions. Moozement entry barrier is so low that you can literally connect to all your sporty friends. Moozement concentrates on the social aspect of physical activity, gives an opportunity to brag about your achievements, yet not taking it very seriously. You can log cycling 10km to work, or skiing 3km on Saturday afternoon, or even that you walked 50 stairs up the metro escalator. Every bit counts.</div>
<div>Moozement is targeting casual and amateur sportsmen and has already proven to be an excellent way to motivate people to exercise more because of the peer pressure. The buddy log on Moozement gives you an excellent overview on how you are doing compared to your friends this week (or month, or year). Sometimes it might look like comparing apples and oranges, but it is just for fun anyway. If you want to take it more seriously, it is possible to create a group &#8211; e.g. just for your friends who are into rollerblading &#8211; and compare results only in the group log.</p>
<div class="im">There are a lot of other nice features. E.g. <a href="http://apps.facebook.com/moozement/" target="_blank">Moozement Facebook application</a> allows you to put your ranking among your friends to your Facebook profile and put your exercises into your Facebook feed &#8211; to widen the circle of your bragging &#8211; while Facebook might be lacking passion, it sure has the numbers ; )</p>
<p>Let&#8217;s see where Moozement&#8217;s development curve will take it. For me it is a hobby project, but I can see a bright future in it.</p>
<p>Now I would encourage you to go to <a href="http://www.moozement.com/" target="_blank">http://www.moozement.com</a> and check it out for yourself. All feedback is welcome &#8211; I will make sure that it reaches developers.</div>
</div>
</div>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2009%2F03%2Fintroducing-moozement.html&amp;title=Introducing%20Moozement" id="wpa2a_18"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2009/03/introducing-moozement.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Nokia Beta Labs &#8211; Tommi Vilkamo</title>
		<link>http://www.ivankuznetsov.com/2007/09/nokia-beta-labs-tommi-vilkamo.html</link>
		<comments>http://www.ivankuznetsov.com/2007/09/nokia-beta-labs-tommi-vilkamo.html#comments</comments>
		<pubDate>Sun, 02 Sep 2007 12:48:31 +0000</pubDate>
		<dc:creator>Ivan Kuznetsov</dc:creator>
				<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.ivankuznetsov.com/2007/09/nokia-beta-labs-tommi-vilkamo.html</guid>
		<description><![CDATA[Conratulations Tommi, congratulations Nokia! It is really a lucky break for Nokia that someone with such a great track record of blogging and openly talking to community of Nokia users will head Beta Labs. As Stephen Johnston said &#8220;Plenty of improvement ideas are in the pipeline, and the key one for me will be to [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.ivankuznetsov.com/wp-content/uploads/2007/09/logo_nokia_115_40_1.gif" class="alignleft" alt="Nokia - Connecting People" />Conratulations <a href="http://blogs.s60.com/tommi">Tommi</a>, congratulations <a href="http://www.nokia.com">Nokia</a>! It is really a lucky break for Nokia that someone with such a great track record of blogging and openly talking to community of Nokia users <a href="http://blogs.s60.com/tommi/2007/08/announcement_ill_start_heading.html">will head Beta Labs</a>.</p>
<p>As <a href="http://3dpeople.blogspot.com">Stephen Johnston</a> <a href="http://3dpeople.blogspot.com/2007/04/nokia-beta-labs-soft-launch.html">said</a> &#8220;Plenty of improvement ideas are in the pipeline, and the key one for me will be to build up a sense of community of Nokia early adopters and use them as lead innovators to help us know what we should be working on next.&#8221;</p>
<p>From my point of view the most important change would be that of the spirit of development in Nokia, so that beta culture really grows roots, and more interesting and innovative projects have a chance to emerge from our own developers and see the light of day.</p>
<p>William L.McKnight, 3M chairman of the board, formulated <a href="http://solutions.3m.com/wps/portal/3M/en_US/our/company/information/history/McKnight-principles/">management principles</a> already in 1948  where he encouraged 3M management to &#8220;delegate responsibility and encourage men and women to exercise their initiative.&#8221;</p>
<p>This is one principle I see us in Nokia adopting this very moment.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ivankuznetsov.com%2F2007%2F09%2Fnokia-beta-labs-tommi-vilkamo.html&amp;title=Nokia%20Beta%20Labs%20%26%238211%3B%20Tommi%20Vilkamo" id="wpa2a_20"><img src="http://www.ivankuznetsov.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ivankuznetsov.com/2007/09/nokia-beta-labs-tommi-vilkamo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

