<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Viktors Rotanovs</title>
 <link href="http://www.rotanovs.com/atom.xml" rel="self"/>
 <link href="http://www.rotanovs.com/"/>
 <updated>2011-09-26T11:12:15+02:00</updated>
 <id>http://www.rotanovs.com/</id>
 <author>
   <name>Viktors Rotanovs</name>
   <email>viktors.rotanovs@gmail.com</email>
 </author>

 
 <entry>
   <title>Understanding Amazon EC2 failures and redundancy</title>
   <link href="http://www.rotanovs.com/cloud/amazon-ec2-failures/"/>
   <updated>2011-09-22T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/cloud/amazon-ec2-failures</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve been looking after &lt;a href='http://www.enormo.com/'&gt;several&lt;/a&gt; &lt;a href='http://www.hitgeist.com/'&gt;websites&lt;/a&gt; on Amazon EC2, and I&amp;#8217;d like to share some thoughts about how Amazon EC2 can fail.&lt;/p&gt;

&lt;h1 id='shared_servers_and_avoiding_spof'&gt;Shared servers and avoiding SPOF&lt;/h1&gt;

&lt;p&gt;Only two instance types run on dedicated servers: &lt;a href='http://huanliu.wordpress.com/2010/06/14/amazons-physical-hardware-and-ec2-compute-unit/'&gt;c1.xlarge and m2.4xlarge&lt;/a&gt;. Other instance types use shared servers.&lt;/p&gt;

&lt;p&gt;If you start multiple instances for redundancy, there&amp;#8217;s a good chance they will land on the same server, therefore not providing redundancy. For example, I&amp;#8217;ve just tried launching eight instances, and three of them landed on the same physical server (as confirmed by traceroute).&lt;/p&gt;

&lt;p&gt;Therefore, to avoid having a single point of failure, most likely you&amp;#8217;ll need to start instances in more than one Availability Zone.&lt;/p&gt;

&lt;h1 id='ebs_durability'&gt;EBS durability&lt;/h1&gt;

&lt;p&gt;&lt;a href='https://forums.aws.amazon.com/thread.jspa?threadID=27590'&gt;EBS does not provide real durability&lt;/a&gt; because of writeback caches. &lt;a href='http://fallabs.com/blog/promenade.cgi?id=6'&gt;Some people claim that&amp;#8217;s an advantage.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Replicating data to a second EBS volume in the same Availability Zone will not prevent disasters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in case of &lt;a href='http://aws.amazon.com/message/2329B7/'&gt;data center failure&lt;/a&gt; multiple EBS volumes can get corrupted simultaneously,&lt;/li&gt;

&lt;li&gt;there is no guarantee that two EBS volumes won&amp;#8217;t land on the same physical hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only solution is to replicate data to another Availability Zone.&lt;/p&gt;

&lt;h1 id='the_devil_is_in_the_details'&gt;The devil is in the details&lt;/h1&gt;

&lt;p&gt;Having perfectly running system today does not guarantee you&amp;#8217;ll be able to run it tomorrow.&lt;/p&gt;

&lt;p&gt;In case of forced server shutdown by Amazon, hardware failure, or stopping and starting an EBS root instance, the following may happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Physical server may change. It&amp;#8217;s possible to get different CPU models with different extensions (e.g. E5507 may change to E5430 or even to an Opteron)&lt;/li&gt;

&lt;li&gt;Xen version may change. For example, 3.0.3-rc5-8.1.14.f may become 3.4.3-2.6.18.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is &lt;a href='https://bugs.launchpad.net/ubuntu/+source/linux/+bug/651370'&gt;no guarantee&lt;/a&gt; that your OS will support these changes.&lt;/p&gt;

&lt;p&gt;Also, some Linux kernel bugs exist &lt;a href='https://bugs.launchpad.net/ubuntu/+source/linux/+bug/666211'&gt;only when running on EC2&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id='conclusion'&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;Creating reliable systems on EC2 can be hard, because critical services may need to span multiple Availability Zones. While most of the time systems will run fine, extensive sysadmin skills may be required when things go wrong.&lt;/p&gt;

&lt;h1 id='ps'&gt;P.S.&lt;/h1&gt;

&lt;p&gt;Here are two common setup mistakes when you take factors above into account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hadoop HDFS with replication factor set to 2 for reliability&lt;/li&gt;

&lt;li&gt;Database replication for reliability with all database servers in the same availability zone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do you know more examples?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>HBase Dump and Restore</title>
   <link href="http://www.rotanovs.com/hbase/hbase-importexport/"/>
   <updated>2010-05-13T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/hbase/hbase-importexport</id>
   <content type="html">&lt;p&gt;Cookbook-type snippets to export data out of HBase or import dumps into HBase.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Export&lt;/em&gt; a table from HBase into &lt;em&gt;local&lt;/em&gt; filesystem:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;bin/hbase org.apache.hadoop.hbase.mapreduce.Driver &lt;span class='nb'&gt;export&lt;/span&gt; &lt;span class='se'&gt;\&lt;/span&gt;
table_name /local/path
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Export&lt;/em&gt; a table from HBase into &lt;em&gt;HDFS&lt;/em&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;bin/hbase org.apache.hadoop.hbase.mapreduce.Driver &lt;span class='nb'&gt;export&lt;/span&gt; &lt;span class='se'&gt;\&lt;/span&gt;
table_name hdfs://namenode/path
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Import&lt;/em&gt; a table from a local dump into &lt;em&gt;existing&lt;/em&gt; HBase table:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;bin/hbase org.apache.hadoop.hbase.mapreduce.Driver import &lt;span class='se'&gt;\&lt;/span&gt;
table_name /local/path
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s a good idea to count and compare number of rows before exporting and after importing:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;bin/hbase org.apache.hadoop.hbase.mapreduce.Driver &lt;span class='se'&gt;\&lt;/span&gt;
rowcounter table_name
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Number of rows is visible in Hadoop counter called ROWS, like in output below:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mapred.JobClient:   org.apache.hadoop.hbase.mapreduce.RowCounter$RowCounterMapper$Counters
mapred.JobClient:     ROWS=103821&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alternatively, you can use Hadoop Tool interface, but it may complain about missing classes if hadoop-env.sh is not configured properly. For example, when launched without arguments, it displays available options:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;hadoop jar hbase-0.20.3.jar
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;An example program must be given as the first argument.
Valid program names are:
export: Write table data to HDFS.
hsf2sf: Bulk convert 0.19 HStoreFiles to 0.20 StoreFiles
import: Import data written by Export.
rowcounter: Count rows in HBase table&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;HBase dump is one ore more Hadoop &lt;em&gt;SequenceFile&lt;/em&gt;s, you can inspect its contents with something like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;hadoop fs -fs &lt;span class='nb'&gt;local&lt;/span&gt; -text table_name/part-m-00000
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Hitgeist.com rewritten using HAML and Compass</title>
   <link href="http://www.rotanovs.com/trends/hitgeist-com-migrated-from-erb-to-haml-and-compassblueprint/"/>
   <updated>2009-06-12T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/trends/hitgeist-com-migrated-from-erb-to-haml-and-compassblueprint</id>
   <content type="html">&lt;p&gt;&lt;a href='http://www.hitgeist.com/' title='Fastest Growing Websites'&gt;Hitgeist&lt;/a&gt;, a ranking service for finding recently popular sites in each country, received a minor upgrade - now it uses several new libraries to make development of new features easier, and code cleaner and nicer.&lt;/p&gt;

&lt;p&gt;I built Hitgeist using Merb, a Ruby framework which brings fun back into web development. In fact, the fun is taken by Symfony, which just &lt;a href='http://www.symfonylab.com/symfony-2-again/'&gt;doesn't feel elegant anymore&lt;/a&gt;. Merb also has less magic than Ruby on Rails, and is a lot better architected. RoR developers liked Merb so much &lt;a href='http://yehudakatz.com/2009/06/11/rails-edge-architecture/'&gt;they started to unify both frameworks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, what are the updates?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;First&lt;/em&gt;, I rewrote all templates from ERB to &lt;a href='http://haml.hamptoncatlin.com/release-notes'&gt;HAML&lt;/a&gt;. I should have done this before. Code becomes so much cleaner—tags are closed automatically, and visual clutter is reduced:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ERB&lt;/em&gt; (before, 9 lines)&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='erb'&gt;&lt;span class='x'&gt;&amp;lt;div id=&amp;quot;container&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class='x'&gt;  &amp;lt;div id=&amp;quot;sitemap&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class='x'&gt;    &amp;lt;span class=&amp;quot;letters&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class='x'&gt;      &lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;A&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;letter&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='cp'&gt;%&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='x'&gt;        &amp;lt;a href=&amp;quot;/trends/&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;%=&lt;/span&gt;&lt;span class='n'&gt;letter&lt;/span&gt;&lt;span class='cp'&gt;%&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;%=&lt;/span&gt;&lt;span class='n'&gt;letter&lt;/span&gt;&lt;span class='cp'&gt;%&amp;gt;&lt;/span&gt;&lt;span class='x'&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class='x'&gt;      &lt;/span&gt;&lt;span class='cp'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt; &lt;span class='cp'&gt;%&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;span class='x'&gt;    &amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class='x'&gt;  &amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class='x'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;HAML&lt;/em&gt; (after, 5 lines)&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haml'&gt;&lt;span class='nf'&gt;#container&lt;/span&gt;
  &lt;span class='nf'&gt;#sitemap&lt;/span&gt;
    &lt;span class='nt'&gt;%span&lt;/span&gt;&lt;span class='nc'&gt;.letters&lt;/span&gt;
      &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;A&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;letter&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
        &lt;span class='nt'&gt;%a&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='ss'&gt;:href&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;/trends/&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;letter&lt;/span&gt; &lt;span class='p'&gt;}=&lt;/span&gt; &lt;span class='n'&gt;letter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Second&lt;/em&gt;, I changed site structure to use grid system, a method to construct visually appealing page layouts using columns and rows which was used in newspapers for decades, but started getting its way to web only &lt;a href='http://www.markboulton.co.uk/journal/comments/five_simple_steps_to_designing_grid_systems_part_1/'&gt;around 2005&lt;/a&gt;. Usually grids are implemented using one of CSS frameworks, which mostly solve cross-browser and printing issues and add niceties such as vertical rhythm and beautiful typography.&lt;/p&gt;

&lt;p&gt;There are several CSS frameworks available to implement grids, most famous ones being &lt;a href='http://www.blueprintcss.org/'&gt;Blueprint&lt;/a&gt; (which is used by sites like &lt;a href='http://www.quantcast.com/'&gt;QuantCast&lt;/a&gt;), &lt;a href='http://960.gs/'&gt;960.gs&lt;/a&gt;, and &lt;a href='https://developer.yahoo.com/yui/grids/'&gt;Yahoo UI Grids&lt;/a&gt;. There are also others, like this &lt;a href='http://kilianvalkhof.com/2009/sencss/pixel-perfect-forms-sencss-06-released/' title='SenCSs'&gt;high-quality small CSS framework&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I chose Blueprint because it&amp;#8217;s complete and integrates nicely with &lt;a href='http://wiki.github.com/chriseppstein/compass'&gt;Compass&lt;/a&gt;, a CSS meta-framework for making CSS shorter, much like HAML does for ERB. It also allows to do computations, for example:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='sass'&gt;&lt;span class='nc'&gt;.bright&lt;/span&gt;
  &lt;span class='na'&gt;:font-color&lt;/span&gt; &lt;span class='nv'&gt;!main_color&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='mh'&gt;#663300&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Did these changes improve the website? Visit &lt;a href='http://www.hitgeist.com/' title='Trendy websites around the world'&gt;new version&lt;/a&gt;, and send your feedback.&lt;/p&gt;

&lt;p&gt;PS: Do you know anything like HAML but for PHP?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Canon 50D, or Truth About DPReview</title>
   <link href="http://www.rotanovs.com/photography/canon-50d-vs-nikon-d90/"/>
   <updated>2008-12-18T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/photography/canon-50d-vs-nikon-d90</id>
   <content type="html">&lt;p&gt;I like &lt;a href='http://www.dpreview.com/'&gt;DPReview&lt;/a&gt;. I thought after &lt;a href='http://www.techcrunch.com/2007/05/14/amazon-acquires-dpreviewcom/'&gt;Amazon bought it&lt;/a&gt; it will become more corporate, but it looks it&amp;#8217;s still as biased as it used to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://www.dpreview.com/reviews/nikond90/page36.asp'&gt;Nikon D90&lt;/a&gt; - described as photographer&amp;#8217;s camera&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.dpreview.com/reviews/canoneos50d/page31.asp'&gt;Canon 50D&lt;/a&gt; - highly recommended, &lt;em&gt;just&lt;/em&gt;&amp;lt;/li&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let&amp;#8217;s get things straight. None of D90 features are very different to Canon 50D, but there are several quite important differences:&lt;/p&gt;
&lt;table&gt;
&lt;tr style='background:#069;color:#fff;font-weight:bold;'&gt;&lt;th /&gt;&lt;th&gt;Nikon D90&lt;/th&gt;&lt;th&gt;Canon 50D&lt;/th&gt;&lt;/tr&gt;
&lt;tr style='background:#eee;'&gt;&lt;th&gt;Viewfinder magnification&lt;/th&gt;&lt;td&gt;0.94x&lt;/td&gt;&lt;td&gt;0.95x&lt;/td&gt;&lt;/tr&gt;
&lt;tr style='background:#ddd;'&gt;&lt;th&gt;Histogram in live view&lt;/th&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;RGB&lt;/td&gt;&lt;/tr&gt;
&lt;tr style='background:#eee;'&gt;&lt;th&gt;Live view&lt;/th&gt;&lt;td&gt;Slow mode only (contrast-detect)&lt;/td&gt;&lt;td&gt;2 modes (contrast detect and phase detect)&lt;/td&gt;&lt;/tr&gt;
&lt;tr style='background:#ddd;'&gt;&lt;th&gt;Focus points&lt;/th&gt;&lt;td&gt;11 focus points (1 cross-type sensors)&lt;/td&gt;&lt;td&gt;9-point TTL CMOS sensor, all cross-type for lenses of F5.6 or faster&lt;/td&gt;&lt;/tr&gt;
&lt;tr style='background:#eee;'&gt;&lt;th&gt;Lens correction&lt;/th&gt;&lt;td&gt;Chromatic aberrations&lt;/td&gt;&lt;td&gt;Vignetting, distortion and chromatic aberrations&lt;/td&gt;&lt;/tr&gt;
&lt;tr style='background:#ddd;'&gt;&lt;th&gt;Viewfinder dioptric adjustment&lt;/th&gt;&lt;td&gt;–2.0 to +1.0&lt;/td&gt;&lt;td&gt;-3.0 to +1.0&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;As you can see, these 2 cameras are not even in the same class, although the price difference is very small - around $250.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://idealab.local:8888/wp-content/uploads/2008/12/tio.jpg'&gt;&lt;img alt='' class='alignnone size-medium wp-image-315' height='200' src='http://rotanovs.com/wp-content/uploads/2008/12/tio-300x200.jpg' title='Tiós de Nadal' width='300' /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, after weighting all pros and cons, I chose Canon 50D, and I must say it&amp;#8217;s an excellent camera. Photographic experience is totally different than it used to be with my old Canon 350D.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Viewfinder&lt;/em&gt; probably as good as it can get with 1.6x crop factor&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Super-sharp, super-bright 640x480 LCD&lt;/em&gt; - you can re-shoot bad photos without having to check them on a computer first&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Live view for precise focusing&lt;/em&gt; - I couldn&amp;#8217;t imagine the camera is still shaking a lot when my hands are rock sturdy after making &amp;#8220;stabilization exhale&amp;#8221;. Perhaps this technique works for old cameras, but 15MP requires to do things by the book: use a tripod, or a stabilized lens. Apparently IS lens are even more important for getting sharp picture than good glass.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Live view for black and white photography&lt;/em&gt; - all picture styles work also in live view. You can start training your eye for B/W without having to download to a computer.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Focusing is great&lt;/em&gt; - success rate a lot bigger now. New auto-focus system totally rocks.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Superb menu&lt;/em&gt; - very logical and easy to use now. Almost Apple of cameras.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href='http://idealab.local:8888/wp-content/uploads/2008/12/dancing-seagull1.jpg'&gt;&lt;img alt='' class='alignnone size-medium wp-image-318' height='200' src='http://rotanovs.com/wp-content/uploads/2008/12/dancing-seagull1-300x200.jpg' title='Seagull Dancing' width='300' /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Best Nature Photography 2007</title>
   <link href="http://www.rotanovs.com/photography/best-nature-photography-2007/"/>
   <updated>2008-02-06T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/photography/best-nature-photography-2007</id>
   <content type="html">&lt;p&gt;Some time ago I was asked if super-expensive ($5k+) lens make any sense for creative photography, given the fact that the most famous photographers of the past were using relatively simple equipment. Fortunately, NatureScapes.net has announced 2007 Images of the Year awards, and pictures speak better than words.&lt;/p&gt;
&lt;div style='text-align: center;'&gt;&lt;div class='imageframe imgaligncenter' style='width:450px;'&gt;&lt;a href='http://www.naturescapes.net/iow/2007BD_DH.htm' rel='nofollow' title='See All Winners'&gt;&lt;img alt='2007ls_cc.jpg' height='147' src='/wp-content/uploads/2008/02/2007ls_cc.jpg' width='450' /&gt;&lt;/a&gt;&lt;div class='imagecaption'&gt;&amp;copy; Chris Clor&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Have a look at the list of cameras and lenses used by winners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Birds category:&lt;/em&gt; Canon EOS 20D + 500mm f/4; Canon EOS 1D MkII + 300mm f/2.8 L IS + 1.4X Teleconverter; Canon EOS 1D MkII + 500mm f/4 IS + 2X Teleconverter&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Wildlife:&lt;/em&gt; Nikon D2x + micro Nikkor AF-S VR 105mm; Nikon D2x + 200-400mm f/4 VR; Canon EOS 1Ds MarkII + EF 500mm f/4.5L&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Landscapes:&lt;/em&gt; Canon 1Ds MkII + Canon 300mm f/2.8; Canon EOS 20D + Canon 17-40mm; Canon EOS 40D + Canon 10-22mm&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Flora &amp;amp; Macro:&lt;/em&gt; Canon 30D + Canon 100mm macro; Canon 40D + Tamron 180mm; Nikon D200 + Sigma 150mm f/2.8 macro&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Elements of Humankind:&lt;/em&gt; Nikon D2x + 35-70mm; Canon EOS 5D + Canon 16-35mm f/2.8; Canon EOS 5D + 70-200mm f/4L + 1.4X Teleconverter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you might have imagined, bird photography is indeed &lt;em&gt;very&lt;/em&gt; expensive.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Facebook Copycat Becomes #3 in Russia</title>
   <link href="http://www.rotanovs.com/trends/russian-facebook-copycat-becomes-3-in-russia-in-less-than-a-year/"/>
   <updated>2008-01-13T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/trends/russian-facebook-copycat-becomes-3-in-russia-in-less-than-a-year</id>
   <content type="html">&lt;p&gt;Something strange is happening in Russia. For several years, social networking didn&amp;#8217;t really pick up, although many have tried, and about one year ago new Russian Facebook clone appeared, and became #3 now.&lt;/p&gt;
&lt;a href='http://www.hitgeist.com/compare/?q=vkontakte.ru+odnoklassniki.ru+google.ru+mail.ru'&gt;&lt;img alt='Top Russian Websites' height='225' src='http://www.hitgeist.com/graph/2007-12-01/77-120-148-23/graph.png' width='300' /&gt;&lt;/a&gt;
&lt;p&gt;The site itself doesn&amp;#8217;t look special - design is almost except copy of digg at time vkontakte.ru was created:&lt;/p&gt;
&lt;div style='width:400px;overflow:hidden'&gt;&lt;a href='/wp-content/uploads/2007/11/digg-header1.png' rel='lightbox[pics67]' title='Digg.com - older design'&gt;&lt;img alt='Digg.com - older design' class='imageframe imgalignleft' height='77' src='/wp-content/uploads/2007/11/digg-header1.png' width='953' /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;All features are standard: friends, photos, videos, messages, notes (blog), groups, and events. There is support for Russian declinations, including gender-specific inflection with support for names, which is quite difficult to implement, for example: Друзья Наталии Искорки (Friends of Nataly Iskorka).&lt;/p&gt;

&lt;p&gt;Former soviet republics are recognized, so perhaps website may become popular among Russian-speaking audience in Baltics or Central Asia, and 5.9% of its users already come from Ukraine.&lt;/p&gt;

&lt;p&gt;Website owner is Pavel Durov, with user&amp;#8217;s id of 1. I&amp;#8217;m wondering who&amp;#8217;s got id of zero.&lt;/p&gt;
&lt;a href='/wp-content/uploads/2007/11/vkontakte-screenshot3.png' rel='lightbox[pics67]' title='vkontakte.ru screenshot'&gt;&lt;img alt='vkontakte.ru screenshot' class='imageframe imgalignleft' height='385' src='/wp-content/uploads/2007/11/vkontakte-screenshot3.png' width='500' /&gt;&lt;/a&gt;
&lt;p&gt;To view pages of other users, you have to fill your profile to at least 30%. Perhaps that&amp;#8217;s a contributing factor to site&amp;#8217;s growth, in addition to quite good picture filtering - you won&amp;#8217;t find Olsen Twins photos in profiles here, at least not at first sight. Updating profile photo may be not super-easy for users who got high-megapixel camera or don&amp;#8217;t know the difference between BMP and JPG - upload is limited to 5 MB.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve heard rumors that the site grew so quickly because creators took their hands on database of students, which is not impossible given current situation with intellectual property protection in Russia.&lt;/p&gt;

&lt;p&gt;Many other Russian Web 2.0 sites copy ideas as well, just check the list at &lt;a href='http://www.hitgeist.com/'&gt;Hitgeist&lt;/a&gt;: &lt;a href='http://www.hitgeist.com/Russia/'&gt;Trends in Russia&lt;/a&gt;. In particular, &lt;a href='http://www.hitgeist.com/compare/?q=rutube.ru'&gt;RuTube&lt;/a&gt;, &lt;a href='http://www.hitgeist.com/compare/?q=odnoklassniki.ru'&gt;Odnoklassniki.ru&lt;/a&gt; and &lt;a href='http://smotri.com/'&gt;Smotri.com&lt;/a&gt; are worth mentioning.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Rising Web Sites 2008 – HitGeist.com Relaunch</title>
   <link href="http://www.rotanovs.com/trends/rising-web-sites-2008-hitgeistcom-relaunch/"/>
   <updated>2008-01-13T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/trends/rising-web-sites-2008-hitgeistcom-relaunch</id>
   <content type="html">&lt;p&gt;Today I&amp;#8217;ve relaunched &lt;a href='http://www.hitgeist.com/'&gt;HitGeist.com&lt;/a&gt;, with fresh data from Alexa and much improved algorithm.&lt;/p&gt;

&lt;p&gt;Visitor popularity trends have been not what TechCrunch usually writes about - there are many overseen websites which grow at astonishing rates. Many new companies emerge from around the world, for example, Russian &lt;a href='http://rotanovs.com/trends/russian-facebook-copycat-becomes-3-in-russia-in-less-than-a-year/'&gt;vkontakte.ru&lt;/a&gt; is about to become #2 by daily unique visitors at local market, and &lt;a href='http://www.hitgeist.com/Scandinavia/'&gt;Scandinavian countries&lt;/a&gt; have their own set of traffic-rich national players.&lt;/p&gt;

&lt;p&gt;While sudden traffic surges are interesting, new HitGeist focuses on discovering websites which have shown steady growth, and assumes that when traffic is unstable, website is more likely to use non-natural means to attract traffic, such as advertising, PPC campaigns, spam, or spyware.&lt;/p&gt;

&lt;p&gt;There are still some bugs to fix, but new stats were so breathtaking that I decided to share them as soon as possible.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ruby 1.9 released</title>
   <link href="http://www.rotanovs.com/ruby/ruby-19-is-released/"/>
   <updated>2007-12-26T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/ruby/ruby-19-is-released</id>
   <content type="html">&lt;p&gt;Great Christmas gift from matz and other contributors: &lt;a href='http://www.ruby-forum.com/topic/136553'&gt;Ruby 1.9&lt;/a&gt;. Some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Around 2x performance increase in many cases, thanks to YARV-based code&lt;/li&gt;

&lt;li&gt;Nice syntax enhancements, like &lt;code&gt;(1..10).reduce(:+) # =&gt; 55&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;JavaScript-style literal hashes: &lt;code&gt;{var: &quot;value&quot;}&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;Lots of &lt;a href='http://eigenclass.org/hiki/Changes+in+Ruby+1.9'&gt;other enhancements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ruby 1.9 is a development release, and contains a lot of experimental features. For production, it&amp;#8217;s recommended to continue using 1.8 branch.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>jQuery-style Chainability in PHP, Using SPL</title>
   <link href="http://www.rotanovs.com/php/jquery-chains-php-spl/"/>
   <updated>2007-10-29T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/php/jquery-chains-php-spl</id>
   <content type="html">&lt;p&gt;What could be better than chainable operators in jQuery, &lt;code&gt;.addClass(&quot;beautiful&quot;).show(&quot;slow&quot;)&lt;/code&gt;-style? Almost nothing, but adding those to PHP would make code cleaner and life easier.&lt;/p&gt;

&lt;p&gt;At first sight, implementing these looks almost impossible, but after a quick look at extensions we notice that &lt;a href='http://www.php.net/~helly/php/ext/spl/'&gt;SPL&lt;/a&gt; could offer something similar, if combined with &lt;a href='http://es.php.net/manual/en/language.oop5.magic.php'&gt;magic methods&lt;/a&gt;. Let&amp;#8217;s implement ArrayAccess interface and see how it works:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='nv'&gt;$fruits&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Chain&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
           &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;String&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;apple&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
           &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;String&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;mango&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
           &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;String&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;kiwi&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;));&lt;/span&gt;

&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;First fruit: &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$fruits&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;All fruits: &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$fruits&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;toUpperCase&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;join&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Outputs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;First fruit: apple
All fruits: APPLE, MANGO, KIWI&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Beautiful, eh?&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s complete source code:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Chain&lt;/span&gt; &lt;span class='k'&gt;implements&lt;/span&gt; &lt;span class='nx'&gt;ArrayAccess&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='nv'&gt;$items&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__construct&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$items&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;())&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nb'&gt;is_array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$items&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='k'&gt;return&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
      &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$items&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$element&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;[]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$element&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__call&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$method&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;count&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nb'&gt;method_exists&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='nv'&gt;$method&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;throw&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;BadMethodCallException&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
      &lt;span class='p'&gt;}&lt;/span&gt;

      &lt;span class='nv'&gt;$returnChain&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Chain&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
      &lt;span class='k'&gt;foreach&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt; &lt;span class='k'&gt;as&lt;/span&gt; &lt;span class='nv'&gt;$item&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nv'&gt;$returnChain&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;call_user_func_array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$item&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$method&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
      &lt;span class='p'&gt;}&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$returnChain&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;rewind&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='nb'&gt;reset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;current&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nb'&gt;current&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
   &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;key&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nb'&gt;key&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;next&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nb'&gt;next&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;valid&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;current&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;!==&lt;/span&gt; &lt;span class='k'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;offsetExists&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$offset&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nb'&gt;isset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$offset&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;offsetGet&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$offset&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$offset&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;offsetSet&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$offset&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$value&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$offset&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$value&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;offsetUnset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$offset&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='nb'&gt;unset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$offset&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='c1'&gt;// convenience method&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;join&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$separator&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nb'&gt;implode&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;items&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$separator&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;String&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='nv'&gt;$s&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__construct&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$s&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;s&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$s&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;toUpperCase&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;s&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;strtoupper&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;s&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__toString&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;s&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='nv'&gt;$fruits&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Chain&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
              &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;String&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;apple&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
              &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;String&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;mango&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
              &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;String&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;kiwi&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;));&lt;/span&gt;

&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;First fruit: &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$fruits&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;All fruits: &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$fruits&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;toUpperCase&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;join&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Canon 40D vs Nikon D300</title>
   <link href="http://www.rotanovs.com/photography/canon-40d-vs-nikon-d300/"/>
   <updated>2007-10-29T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/photography/canon-40d-vs-nikon-d300</id>
   <content type="html">&lt;p&gt;What a difficult choice—both leaders just released excellent prosumer models. Both dSLRs offer top-notch features like self-cleaning sensor units and low-noise CMOS sensors, the latter being exclusive Canon selling point for several years. But how do they compare now in key characteristics, after Nikon catched up with the competition?&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th /&gt;
&lt;th&gt;&lt;strong&gt;Canon 40D&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Nikon D300&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Megapixels&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10.1 MP&lt;/td&gt;
&lt;td&gt;&lt;span style='color: #009900'&gt;12.3 MP&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sensor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CMOS, sensitivity up to ISO 1600, 14-bit A/D converter&lt;/td&gt;
&lt;td&gt;CMOS, sensitivity up to &lt;span style='color: #009900'&gt;ISO 3200&lt;/span&gt;, 14-bit A/D converter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TTL Auto-Focus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9 cross-type sensors&lt;/td&gt;
&lt;td&gt;&lt;span style='color: #009900'&gt;15 cross-type sensors&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Live View Auto-Focus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, turns off LCD while focusing&lt;/td&gt;
&lt;td&gt;Yes, &lt;span style='color: #009900'&gt;contrast detect&lt;/span&gt; (like on P&amp;amp;S cameras)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Viewfinder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pentaprism, 95% frame coverage, 0.95x magnification, diopter adjustment: &lt;span style='color: #009900'&gt;-3.0&lt;/span&gt; to +1.0&lt;/td&gt;
&lt;td&gt;Pentaprism, &lt;span style='color: #009900'&gt;100% frame coverage&lt;/span&gt;, 0.94x magnification, diopter adjustment: -2.0 to +1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LCD Monitor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.0&quot;, 320x240 pixels&lt;/td&gt;
&lt;td&gt;3.0&quot;, &lt;span style='color: #009900'&gt;640x480 pixels&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href='http://www.bhphotovideo.com/' rel='nofollow'&gt;B&amp;amp;H&lt;/a&gt; Price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1,299.95 (~900 EUR)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1,799.95 (~1250 EUR)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;For pixel peepers, neither of those are interesting—the real winner is Pentax K10D, which has very light anti-alias filter and offers the best per-pixel sharpness and unique non-processed, completely photographic 3D look—check out some &lt;a href='http://www.dpreview.com/reviews/canoneos40d/page24.asp'&gt;examples&lt;/a&gt;. At about $700, with image stabilisation built in, this camera can become a great choice for photography geeks—imagine its potential after processing photos with &lt;a href='http://www.dxo.com/intl/photo/dxo_optics_pro/overview/version_5_coming_soon/new_generation_raw_converter'&gt;DxO Optics v5&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Belgium: Brussels, Bruges</title>
   <link href="http://www.rotanovs.com/photography/belgium-brussels-bruges-photos/"/>
   <updated>2007-09-16T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/photography/belgium-brussels-bruges-photos</id>
   <content type="html">&lt;p&gt;It was very refreshing since it was my first trip outside of Catalonia since I arrived in Barcelona. After rather minimalistic Iberian airlines flight I arrived to BRU, and walked, and walked, and walked before I&amp;#8217;ve got my luggage.&lt;/p&gt;

&lt;p&gt;Old city was beautiful, with beautiful buildings dancin&amp;#8217; and singin&amp;#8217; at night.&lt;/p&gt;
&lt;a href='/wp-content/uploads/2007/10/grand_place.jpg' title='Grand’ Place'&gt;&lt;img alt='Grand’ Place' src='/wp-content/uploads/2007/10/grand_place.jpg' /&gt;&lt;/a&gt;&lt;em&gt;View my &lt;a href='http://viktors.smugmug.com/gallery/3461988' title='Brussels and Bruges'&gt;Brussels &amp;amp; Bruges Photo Gallery&lt;/a&gt; &lt;/em&gt;
&lt;p&gt;What I enjoyed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Great food, especially mussels at Chez Léon, and some Asian cuisine in Bourse area&lt;/li&gt;

&lt;li&gt;Beautiful old city, ceremony near Manneken Pis&lt;/li&gt;

&lt;li&gt;Chinese pavilion (Japanese tower was closed for reconstruction works)&lt;/li&gt;

&lt;li&gt;Comics on walls in many places&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I didn&amp;#8217;t like so much:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weather&lt;/li&gt;

&lt;li&gt;Strange people on streets after 10 p.m.&lt;/li&gt;

&lt;li&gt;Coffee!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, I must say Belgian chocolate is over-hyped. I&amp;#8217;ve tried 6 different brands of chocolate, it&amp;#8217;s all great, but not better than any other top-notch chocolate in other countries. My favorite is still Emila Gustava chocolate from Latvia.&lt;/p&gt;

&lt;p&gt;Bruges was really nice, very Flemish, lots of nice people and almost everybody speaks good English. And, of course, there were canals and houseboats - what an idilly!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>HITgeist – realzeit stats (gainers &amp; losers by country)</title>
   <link href="http://www.rotanovs.com/trends/hitgeist-movers-and-shakers-by-country/"/>
   <updated>2007-04-08T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/trends/hitgeist-movers-and-shakers-by-country</id>
   <content type="html">&lt;p&gt;After being noted as an interesting project by Web 2.0 entrepreneurs and SEO specialists for several months, AlexaRadar becomes &lt;a href='http://www.hitgeist.com/'&gt;HITgeist&lt;/a&gt; today. New name demonstrates focus on international coverage and its European origin, as well as allows to show data from multiple providers of statistics.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>ProgrammableWeb chooses AlexaRadar as a 5-star mashup</title>
   <link href="http://www.rotanovs.com/trends/programmableweb-alexa-radar/"/>
   <updated>2006-10-06T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/trends/programmableweb-alexa-radar</id>
   <content type="html">&lt;a href='http://www.programmableweb.com/'&gt;&lt;img alt='ProgrammableWeb.com screenshot' border='0' id='image49' src='http://rotanovs.com/wp-content/uploads/2006/10/alexaradar-mashup-of-the-day-crop.png' title='ProgrammableWeb.com screenshot' zalign='left' /&gt;&lt;/a&gt;
&lt;p&gt;Yesterday I submitted AlexaRadar to &lt;a href='http://www.programmableweb.com/url/5068'&gt;ProgrammableWeb.com&lt;/a&gt;, a largest collection of mashups that currently exists, and - surprise! - today AlexaRadar is not only a mashup of the day, but it also received 5-star rating from users of ProgrammableWeb.com. Thanks everyone who rated the website! &lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;For those who aren't into mashups yet, ProgrammableWeb.com provides absolutely unique &lt;a href='http://www.programmableweb.com/matrix'&gt;Web 2.0 Mashup Matrix&lt;/a&gt; - it definitely deserves a look.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Alexa Radar – find successful websites around the world</title>
   <link href="http://www.rotanovs.com/trends/alexa-radar-movers-and-shakers-internationally/"/>
   <updated>2006-09-30T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/trends/alexa-radar-movers-and-shakers-internationally</id>
   <content type="html">&lt;p&gt;I needed some real project to try Ruby on Rails, so here&amp;#8217;s &lt;a href='http://www.alexaradar.com/'&gt;Alexa graph analyzer&lt;/a&gt; with some additional &lt;a href='http://www.alexaradar.com/head2head'&gt;analytic features&lt;/a&gt;. It&amp;#8217;s not finished yet, but already useful for finding what websites show &lt;a href='http://www.alexaradar.com/matrix'&gt;steady growth in all countries&lt;/a&gt; supported by Alexa. Check out what&amp;#8217;s &lt;a href='http://www.alexaradar.com/fast/country/ee'&gt;popular in Estonia&lt;/a&gt;, what do they &lt;a href='http://www.alexaradar.com/fast/country/nl'&gt;grow in Netherlands&lt;/a&gt;, and what do they &lt;a href='http://www.alexaradar.com/fast/country/kr'&gt;eat in South Korea&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Zoom Magazine – Free Issue</title>
   <link href="http://www.rotanovs.com/photography/zoom-magazine-free-issue/"/>
   <updated>2006-02-04T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/photography/zoom-magazine-free-issue</id>
   <content type="html">&lt;p&gt;Dead or alive? I had the same question when browsing &lt;a href='http://www.zoom-net.com/' target='_blank' title='Zoom Magazine'&gt;Zoom Magazine's website&lt;/a&gt; - last issue mentioned there was dated January 1, 2005. &lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;The magazine features a lot of great works (you can see past issues free of charge after registration), so I was eager to know if magazine is still there and e-mailed them. They replied shortly thereafter that the magazine is still alive and I can receive free issue if I send them my postal address. So today is a great day - while checking my mailbox I noticed big pack there - surprise surprise it was super-printed, large-format Zoom Magazine January-February 2006 issue.&lt;/p&gt;
&lt;img alt='Zoom Magazine' id='image46' src='http://rotanovs.com/wp-content/uploads/2006/02/IMG_7338_zoom_small.jpg' title='Zoom Magazine' /&gt;
&lt;p&gt;There was also a letter there offering subscriptions Zoom and five other magazines published by the same company from Milano, Italy - and the signature there was real (wow!), not one of these inkjet signatures you usually see on that kind of letters. Oddly enough the pack was sent from France, not from Italy. So, it&amp;#8217;s nice Friday evening!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>BetterPhoto.com Second Place, Again!</title>
   <link href="http://www.rotanovs.com/photography/betterphotocom-second-place-again/"/>
   <updated>2005-10-24T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/photography/betterphotocom-second-place-again</id>
   <content type="html">&lt;p&gt;Another e-mail from Heather Young, nice as always:&lt;img ALIGN='right' ALT='BetterPhoto.com WINNER Second Place' SRC='/wp-content/uploads/2007/10/winnerbuttonsecondplace.gif' /&gt;&lt;/p&gt;
&lt;blockquote&gt;  Congratulations! You have won Second Place in the Travel &amp;amp; Place category of this month's BetterPhoto photo contest!
&lt;br /&gt;
Way to go! With over 20400 entries in the contest, it is a big honor to be selected among the winners.
&lt;/blockquote&gt;
&lt;p&gt;They even make a &lt;a HREF='http://www.betterphoto.com/press-releases/0509-65.asp'&gt;press release&lt;/a&gt; for each winner, for consumption by local papers and radio stations. So, here&amp;#8217;s &lt;a HREF='http://www.betterphoto.com/forms/discussionDetail.asp?threadID=317548'&gt;my photo&lt;/a&gt; and &lt;a HREF='http://www.betterphoto.com/contest/winners/0509.asp'&gt;other September contest winners&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>BetterPhoto Finalist, Second Time in a Row!</title>
   <link href="http://www.rotanovs.com/photography/betterphoto-finalist-second-time-in-a-row/"/>
   <updated>2005-10-22T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/photography/betterphoto-finalist-second-time-in-a-row</id>
   <content type="html">&lt;img SRC='/wp-content/uploads/2007/10/winnerbuttonfinalist.gif' align='right' alt='BetterPhoto.com Photo Contest FINALIST' /&gt;
&lt;p&gt;Another e-mail from BetterPhoto:&lt;/p&gt;
&lt;blockquote&gt;Congratulations... you have placed as a Finalist in this month's BetterPhoto Contest! Over 20900 photos were entered into the competition; it is an honor to have your image selected among the top 877 Finalist photos.

Your Finalist photo: Catching Light to Shine at Night (#1253746)&lt;/blockquote&gt;
&lt;p&gt;See &lt;a HREF='http://www.betterphoto.com/forms/discussionDetail.asp?threadID=317548'&gt;my photo&lt;/a&gt; or &lt;a HREF='http://www.betterphoto.com/gallery/dynoGall2.asp?catID=7987'&gt;other finalists&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Best Ajax Example Out There</title>
   <link href="http://www.rotanovs.com/trends/best-ajax-example/"/>
   <updated>2005-10-18T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/trends/best-ajax-example</id>
   <content type="html">&lt;p&gt;&lt;a href='http://www.protopage.com/'&gt;ProtoPage.com&lt;/a&gt; is probably the most beatiful Ajax application to show in 5 minutes to your boss and colleagues. Another interesting &lt;s&gt;poem&lt;/s&gt;code: &lt;a href='http://dojotoolkit.org/~alex/dojo/trunk/demos/widget/Fisheye.html'&gt;Fish Eye&lt;/a&gt; (be patient - it&amp;#8217;s loading very slowly).&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>BetterPhoto Second Place!</title>
   <link href="http://www.rotanovs.com/photography/betterphoto-second-place/"/>
   <updated>2005-09-26T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/photography/betterphoto-second-place</id>
   <content type="html">&lt;img align='right' alt='BetterPhoto.com WINNER Second Place' src='/wp-content/uploads/2007/10/winnerbuttonsecondplace.gif' /&gt;
&lt;p&gt;My first award in the photo contest! More than a year passed since photography became my hobby, and it finally happened!&lt;/p&gt;

&lt;p&gt;My photograph &lt;a href='http://www.betterphoto.com/gallery/dynoGallDetail.asp?photoID=1073943&amp;amp;amp;catID=8151'&gt;Woman in Black&lt;/a&gt; was chosen as one of 10 second place winners in the category &amp;#8220;Travel &amp;#38; Place&amp;#8221;. During this month, tens of thousands of photos were submitted to the contest - 23400 to be exact, so it&amp;#8217;s a big pleasure to be among the winners.&lt;/p&gt;

&lt;p&gt;You&amp;#8217;re welcome to see &lt;a href='http://www.betterphoto.com/contest/winners/0508.asp'&gt;all the winners&lt;/a&gt; or &lt;a href='http://www.betterphoto.com/gallery/dynoGallDetail.asp?photoID=1073943&amp;amp;amp;catID=8151'&gt;just my photo&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>BetterPhoto Finalist!</title>
   <link href="http://www.rotanovs.com/photography/betterphoto-finalist/"/>
   <updated>2005-09-25T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/photography/betterphoto-finalist</id>
   <content type="html">&lt;img align='right' alt='BetterPhoto.com Photo Contest FINALIST' src='/wp-content/uploads/2007/10/winnerbuttonfinalist.gif' /&gt;
&lt;p&gt;Wow! What a day! Got this email:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Congratulations&amp;#8230; you have placed as a Finalist in this month&amp;#8217;s BetterPhoto Contest! Over 23900 photos were entered into the competition; it is an honor to have your image selected among the top 988 Finalist photos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;&lt;a href='http://www.betterphoto.com/gallery/dynoGallDetail.asp?photoID=1073943'&gt;View The Photo&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s interesting, this particular photo isn&amp;#8217;t the best among photos I submitted to the contest last month (at least in my opinion) - see &lt;a href='http://www.betterphoto.com/mgadmin/siteUpdatePhotos.asp'&gt;other contest entries&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Full text of e-mail follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi Viktors&lt;/p&gt;

&lt;p&gt;Congratulations&amp;#8230; you have placed as a Finalist in this month&amp;#8217;s BetterPhoto Contest! Over 23900 photos were entered into the competition; it is an honor to have your image selected among the top 988 Finalist photos.&lt;/p&gt;

&lt;p&gt;Your Finalist photo: Old Woman In Black (#1073943)&lt;/p&gt;

&lt;p&gt;This image can be viewed - along with all of the Finalist images - at: http://www.betterphoto.com/gallery/dynoGall2.asp?catID=7679&lt;/p&gt;

&lt;p&gt;During the next few days, the judges select the top winning photos. If your image is selected as a winner, you will be emailed again.&lt;/p&gt;

&lt;p&gt;Again, congratulations on placing as a Finalist - keep up the great work!&lt;/p&gt;

&lt;p&gt;Heather Young heather@betterphoto.com&lt;/p&gt;

&lt;p&gt;Learn photography with Jim Miotke&amp;#8217;s &amp;#8220;BetterPhoto Guide to Digital Photography&amp;#8221; And the award-winning DVD - &amp;#8220;Digital Photography Unleashed&amp;#8221; Get your autographed copies today at http://www.betterphoto.com&lt;/p&gt;

&lt;p&gt;www.BetterPhoto.com The better way to learn photography!&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Lighttpd vs Tux: nice() patch</title>
   <link href="http://www.rotanovs.com/lighttpd/lighttpd-nice-patch/"/>
   <updated>2005-03-25T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/lighttpd/lighttpd-nice-patch</id>
   <content type="html">&lt;p&gt;Lighttpd by default can be slower than TUX. Why?&lt;/p&gt;

&lt;p&gt;Because TUX runs inside Linux kernel and has the highest possible priority, while lighttpd is just ordinary userspace process. Solution? Make lighttpd not so nice:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nice -20 /opt/lighttpd/sbin/lighttpd ...&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lighttpd&amp;#8217;s Adaptive Spawning users will immediately notice a problem: all processes spawned by lighttpd will also run with the highest priority. That&amp;#8217;s not good, since any PHP or other FastCGI process will be able to slow down lighttpd. Solution is quite simple: to restore back niceness level before launching a child process. This can be achieved by &lt;a href='/files/lighttpd_nice.patch'&gt;lighttpd nice patch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Any other ideas how this could be done?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Lighttpd initgroups()</title>
   <link href="http://www.rotanovs.com/lighttpd/lighttpd-initgroups/"/>
   <updated>2005-03-22T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/lighttpd/lighttpd-initgroups</id>
   <content type="html">&lt;p&gt;While converting my website to lighttpd, I noticed that php processes launched by adaptive spawning can&amp;#8217;t access certain files anymore. Small investigation has shown that the problem was caused by user &lt;em&gt;httpd&lt;/em&gt; not joining groups specified in &lt;em&gt;/etc/groups&lt;/em&gt;. Adding initgroups() call before calling &lt;em&gt;setuid()&lt;/em&gt; helped.&lt;/p&gt;

&lt;p&gt;&lt;a href='/files/lighttpd_initgroups.patch'&gt;lighttpd initgroups patch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please let me know if you&amp;#8217;ve experienced the same problem with spawn-fcgi program.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Web 2.0</title>
   <link href="http://www.rotanovs.com/trends/web-20/"/>
   <updated>2005-03-21T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/trends/web-20</id>
   <content type="html">&lt;p&gt;Bored by making websites? Not anymore. Almost overnight &lt;a href='http://www.google.com/webhp?complete=1&amp;amp;hl=en'&gt;big&lt;/a&gt; &lt;a href='http://flickr.com/'&gt;players&lt;/a&gt; made 99% of the web obsolete. Less than 10 seconds page load time? 1 second? Forget about it. Everyone now wants INSTANT results.&lt;/p&gt;

&lt;p&gt;Here are a few links for those who want to make their own Google Suggest, Gmail or Flickr:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://www.modernmethod.com/sajax/'&gt;Sajax&lt;/a&gt;: allows to call PHP functions from JavaScript&lt;/li&gt;

&lt;li&gt;&lt;a href='http://jsolait.net/'&gt;JavaScript O Lait&lt;/a&gt;: make XML-RPC and JSON-RPC (its own proprietary protocol) calls to server; some SVG examples too&lt;/li&gt;

&lt;li&gt;&lt;a href='http://eireneh.thorubio.org/dwr/index.html'&gt;DWR&lt;/a&gt;: Direct Web Remoting, for Java&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.ashleyit.com/rs/jsrs/test.htm'&gt;JSRS&lt;/a&gt;: JavaScript Remoting, with PHP and Perl samples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do you know other frameworks with similar functionality?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Lighttpd Config Includes</title>
   <link href="http://www.rotanovs.com/lighttpd/lighttpd-configs/"/>
   <updated>2005-02-16T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/lighttpd/lighttpd-configs</id>
   <content type="html">&lt;p&gt;Some of us techies have to maintain tens of webservers with different configurations. With Apache, you can easily throw in .htaccess for each website without having to change web server config. It&amp;#8217;s not so simple with Lighttpd, that&amp;#8217;s why I needed some script to join global configuration file with a local one. Some perl coding, and &lt;a href='/files/joincfg'&gt;lighttpd config merge script&lt;/a&gt; is ready.&lt;/p&gt;

&lt;h2 id='installation_and_usage'&gt;Installation and usage&lt;/h2&gt;
&lt;ol&gt;
	&lt;li&gt;Install Tie-IxHash perl module:
&lt;ul&gt;
	&lt;li&gt;Gentoo users: &lt;code&gt;emerge Tie-IxHash&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Other distros:
&lt;code&gt;perl -MCPAN -eshell
cpan&amp;gt; install Tie::IxHash&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
	&lt;li&gt;Backup your configuration&lt;/li&gt;
	&lt;li&gt;Call joincfg like follows, then start lighttpd:
&lt;code&gt;joincfg global.conf local.conf &amp;gt; new.conf
lighttpd -f new.conf
&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As usual, NO WARRANTIES!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Lighttpd DoS Tool</title>
   <link href="http://www.rotanovs.com/lighttpd/lighttpd-dos-tool/"/>
   <updated>2005-02-01T00:00:00+01:00</updated>
   <id>http://www.rotanovs.com/lighttpd/lighttpd-dos-tool</id>
   <content type="html">&lt;p&gt;After seeing lighttpd grow to hundreds of megabytes I couldn&amp;#8217;t sleep. It was like a tiny chicken has grown into a huge monster. After some experimenting I managed to grow monsters myself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href='/files/lighttpd_dos_tool'&gt;Lighttpd DoS Tool&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The source of the problem is that lighttpd ignores maximum request size setting and reads data until it fills all available memory.&lt;/p&gt;

&lt;p&gt;Return to Apache? No way - lighttpd bugs are usually fixed lightning fast.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>HttpOnly in PHP (Anti-XSS)</title>
   <link href="http://www.rotanovs.com/php/httponly-php/"/>
   <updated>2004-09-05T00:00:00+02:00</updated>
   <id>http://www.rotanovs.com/php/httponly-php</id>
   <content type="html">&lt;p&gt;Wondering how to prevent JavaScript from stealing session cookie? Major browsers got the answer: just add HttpOnly to cookie to protect it from malicious JavaScript code. Full details are available at &lt;a href='http://msdn.microsoft.com/workshop/author/dhtml/httponly_cookies.asp'&gt;MSDN&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since this option is well-supported (AFAIK MSIE, Mozilla/Firefox/Gecko and Konqueror support it) it&amp;#8217;s unclear why PHP doesn&amp;#8217;t support it yet. I&amp;#8217;ve written a &lt;a href='/files/php-session-httponly.patch'&gt;patch to add HttpOnly support to PHP&lt;/a&gt;. After applying the patch, add this string to your php.ini:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;session.cookie_httponly = 1&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;</content>
 </entry>
 
 
</feed>