<?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>odyniec.net blog</title>
	<atom:link href="http://odyniec.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://odyniec.net/blog</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Tue, 09 Mar 2010 11:43:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>New Version of ImgZoom in Development</title>
		<link>http://odyniec.net/blog/2010/03/new-version-of-imgzoom-in-development/</link>
		<comments>http://odyniec.net/blog/2010/03/new-version-of-imgzoom-in-development/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 11:42:13 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[imgZoom]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=445</guid>
		<description><![CDATA[Last weekend I started working on the next version of imgZoom, the jQuery plugin that uses vector graphics to implement a smooth zoom effect on thumbnailed images. With the initial release (a couple months back), I boldly announced that I intend to one day turn it into a decent substitution for Lightbox, and I think [...]]]></description>
			<content:encoded><![CDATA[<p>Last weekend I started working on the next version of <a href="http://odyniec.net/projects/imgzoom/">imgZoom</a>, the <a href="http://jquery.com/">jQuery</a> plugin that uses vector graphics to implement a smooth zoom effect on thumbnailed images. With the <a href="http://odyniec.net/blog/2009/08/imgzoom-0-1/">initial release</a> (a couple months back), I boldly announced that I intend to one day turn it into a decent substitution for <a href="http://www.lokeshdhakar.com/projects/lightbox2/">Lightbox</a>, and I think I&#8217;m actually getting closer to that. The current version has the lightbox-esque features of displaying images in a window, and allowing to navigate between previous and next images.</p>
<p>I transformed one of my testing pages into a <a href="http://odyniec.net/projects/imgzoom/imgzoom-0.2-demo/">nicely-looking gallery</a>, so if you want to take a look at the development version in action, be my guest. The gallery should work correctly in most browsers, only Internet Explorer might still have some issues &#8212; I&#8217;m working on that. As always, I&#8217;m open to feedback.</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2010/03/new-version-of-imgzoom-in-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Blog and Multiple Server Names</title>
		<link>http://odyniec.net/blog/2010/02/wordpress-blog-and-multiple-server-names/</link>
		<comments>http://odyniec.net/blog/2010/02/wordpress-blog-and-multiple-server-names/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 22:24:11 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=430</guid>
		<description><![CDATA[I was recently updating my WordPress installation to a freshly released version. My traditional procedure of updating the website is to first make changes to a test version (which is set up on a subdomain of odyniec.net), make sure everything works and looks right, then copy the test files to the public location.
Unfortunately, WordPress didn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently updating my <a href="http://wordpress.org/">WordPress</a> installation to a freshly released version. My traditional procedure of updating the website is to first make changes to a test version (which is set up on a subdomain of odyniec.net), make sure everything works and looks right, then copy the test files to the public location.</p>
<p>Unfortunately, WordPress didn&#8217;t get along with this solution especially well. The WordPress engine didn&#8217;t like being accessed through the test subdomain, as it expected a single host name to be designated as its home location. Even though I could open the blog at the test address, all the dynamically generated links to scripts, style sheets, archives and such still pointed to the live version. I also couldn&#8217;t log in to the administrative interface at the test version, as it kept redirecting me to the live login page.</p>
<p>I knew PHP stored the actual host name that was used to access the page in the <a href="http://www.php.net/manual/en/reserved.variables.server.php">$_SERVER['SERVER_NAME']</a> variable, and I thought a simple solution would be to make WordPress use that instead of the basic URL set in the configuration. I had very little experience with WordPress internals, so it took me some time to figure out how to implement this, but I eventually succeeded. I wrapped the code into a plugin so that the functionality can be easily enabled or disabled and doesn&#8217;t affect the base WordPress code.</p>
<p>So, behold! My first WordPress plugin ever:</p>
<p><p class="code">&lt;?php

/*
Plugin Name:    Server Name Support
Description:    Allows the blog to be accessed with multiple server names
Author:         Michal Wojciechowski
Version:        0.0.1
Author URI:     http://odyniec.net/
*/

$sns_home = preg_replace('!://[a-z0-9.-]*!', '://' . $_SERVER['SERVER_NAME'],
    get_option('home'));

function sns_home()
{
    global $sns_home;

    return $sns_home;
}

function sns_replace_host($url, $path = '')
{
    return preg_replace('!://[a-z0-9.-]*!', '://' . $_SERVER['SERVER_NAME'],
        $url);
}

add_filter('pre_option_home', 'sns_home');
add_filter('pre_option_siteurl', 'sns_home');
add_filter('pre_option_url', 'sns_home');
add_filter('stylesheet_uri', 'sns_replace_host');

add_filter('admin_url', 'sns_replace_host');

?&gt;</p></p>
<p>In case you&#8217;d like to use it (not very likely, as I don&#8217;t think my use case is that common), all you need to do is save the above code in a <code>.php</code> file, place it in the <code>wp-content/plugins</code> directory, and activate it in the WordPress admin interface.</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2010/02/wordpress-blog-and-multiple-server-names/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ImgAreaSelect 0.9.2</title>
		<link>http://odyniec.net/blog/2010/02/imgareaselect-0-9-2/</link>
		<comments>http://odyniec.net/blog/2010/02/imgareaselect-0-9-2/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 18:37:27 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[imgAreaSelect]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=424</guid>
		<description><![CDATA[ImgAreaSelect version 0.9.2 is out. This version fixes a few minor bugs, and introduces a new option that allows you to completely remove the plugin from the image that it was attached to. Thanks to all the people who helped me by reporting bugs and sending feedback.
I have also added a new example to the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://odyniec.net/projects/imgareaselect/">ImgAreaSelect</a> version 0.9.2 is out. This version fixes a few minor bugs, and introduces a new option that allows you to completely remove the plugin from the image that it was attached to. Thanks to all the people who helped me by reporting bugs and sending feedback.</p>
<p>I have also added a new example to the <a href="http://odyniec.net/projects/imgareaselect/examples-advanced.html">Advanced Usage</a> page &#8212; it demonstrates an extension of the plugin API that allows you to <a href="http://odyniec.net/projects/imgareaselect/examples-advanced.html#animation">animate the selection area</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2010/02/imgareaselect-0-9-2/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Running Multiple Versions of Firefox in Ubuntu 9.10</title>
		<link>http://odyniec.net/blog/2010/02/running-multiple-versions-of-firefox-in-ubuntu-9-10/</link>
		<comments>http://odyniec.net/blog/2010/02/running-multiple-versions-of-firefox-in-ubuntu-9-10/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 21:45:51 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=390</guid>
		<description><![CDATA[Here&#8217;s a simple howto on running several different versions of Firefox in Ubuntu 9.10. This is the setup that I use to test my jQuery plugins and other JavaScript code &#8212; I hope some of you fellow developers out there will find it useful too. The basic advantage of this solution is that is does [...]]]></description>
			<content:encoded><![CDATA[<p><em>Here&#8217;s a simple howto on running several different versions of Firefox in Ubuntu 9.10. This is the setup that I use to test my <a href="http://odyniec.net/projects/#jquery-plugins">jQuery plugins</a> and other JavaScript code &#8212; I hope some of you fellow developers out there will find it useful too. The basic advantage of this solution is that is does not clutter your basic system with unnecessary software packages, as all the additional files are stored in your home directory and nowhere else.</em></p>
<p>I&#8217;m going to create a directory where all the different Firefox versions will reside. I have a dedicated directory for any software that I can&#8217;t or don&#8217;t want to install the standard way (using <code>apt</code>), and it is located in my home directory &#8211; <code>/home/michal/opt</code>. It serves a similar purpose as the system-wide <code>opt</code> directory, which is intended for &#8220;<code>opt</code>ional&#8221; software.<br />
<p class="code">$ <strong>mkdir /home/michal/opt/firefoxes</strong></p></p>
<p>There it is. Now, I&#8217;m going to get all those versions of Firefox that I want to run. As of this writing, the version running in my system is 3.5.7. I decided to also install the latest version of the 3.0 series (3.0.17), the prehistoric 2.0.0.20 release, as well as the freshly released Firefox 3.6.</p>
<p>Actually, according to browser usage statistics (such as those run by <a href="http://getclicky.com/marketshare/global/web-browsers/firefox/">Clicky</a> and <a href="http://gs.statcounter.com/">StatCounter</a>), Firefox 2.0 has a market share below one percent, so it&#8217;s questionable whether web developers should still care about it. I just happen to like to see if new versions of my jQuery plugins still work in the older browsers, so I&#8217;m going to install it.</p>
<p>Binary packages for all Firefox releases can be downloaded from the Mozilla FTP server at <a href="ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/">ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/</a>. Here are the respective URLs for the versions that I&#8217;ve chosen:</p>
<ul>
<li><a href="ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/linux-i686/en-US/firefox-2.0.0.20.tar.gz">ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/linux-i686/en-US/firefox-2.0.0.20.tar.gz</a></li>
<li><a href="ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/3.0.17/linux-i686/en-US/firefox-3.0.17.tar.bz2">ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/3.0.17/linux-i686/en-US/firefox-3.0.17.tar.bz2</a></li>
<li><a href="ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/3.6/linux-i686/en-US/firefox-3.6.tar.bz2">ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/3.6/linux-i686/en-US/firefox-3.6.tar.bz2</a></li>
</ul>
<p>So now I&#8217;ll go to the <code>firefoxes</code> directory and download the three packages with wget (of course, you can also download them using your browser or any FTP client):<br />
<p class="code">$ <strong>cd /home/michal/opt/firefoxes</strong>
$ <strong>wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/linux-i686/en-US/firefox-2.0.0.20.tar.gz</strong>
$ <strong>wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/3.0.17/linux-i686/en-US/firefox-3.0.17.tar.bz2</strong>
$ <strong>wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/3.6/linux-i686/en-US/firefox-3.6.tar.bz2</strong></p></p>
<p><span id="more-390"></span></p>
<p>The files are gzipped or bzipped tar packages, so I need to uncompress them. Let&#8217;s start with the Firefox 2 package:<br />
<p class="code">$ <strong>tar zxvf firefox-2.0.0.20.tar.gz</strong></p></p>
<p>Each package extracts to a directory named <code>firefox</code>, so if I just uncompress the tarballs one after another, all the different versions are going to go into the same directory and the files will get mixed up and overwritten. To prevent that, I&#8217;ll rename each directory after it is extracted:<br />
<p class="code">$ <strong>mv firefox firefox-2.0</strong></p></p>
<p>Now the other two:<br />
<p class="code">$ <strong>tar jxvf firefox-3.0.17.tar.bz2</strong>
$ <strong>mv firefox firefox-3.0</strong>
$ <strong>tar jxvf firefox-3.6.tar.bz2</strong>
$ <strong>mv firefox firefox-3.6</strong></p></p>
<p>Ok, so now I have three directories in <code>/home/michal/opt/firefoxes</code>, each holding a different release of Firefox.</p>
<p>Each version needs a separate user profile &#8212; otherwise, it won&#8217;t be possible to run them simultaneously, and worse, it might break the default profile which is used by the system version. I&#8217;m going to create new profiles for the three versions by running Firefox with the <code>-no-remote</code> and <code>-CreateProfile</code> options:<br />
<p class="code">$ <strong>firefox -no-remote -CreateProfile firefox-2.0</strong>
$ <strong>firefox -no-remote -CreateProfile firefox-3.0</strong>
$ <strong>firefox -no-remote -CreateProfile firefox-3.6</strong></p></p>
<p>That&#8217;s it for the basic setup &#8212; I can now try running the Firefoxes. Let&#8217;s start with the ancient version 2.0:<br />
<p class="code">$ <strong>cd firefox-2.0</strong>
$ <strong>./firefox -no-remote -P firefox-2.0</strong>
./firefox-bin: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory</p></p>
<p>Whooops. Grandpa Firefox 2.0 says it won&#8217;t run, unless it has the <code>libstdc++.so.5</code> library. However, Ubuntu 9.10 comes with a newer version of <code>libstdc++</code>, and the obsolete release is no longer available. But that&#8217;s no big deal, as I can just get it elsewhere &#8212; for example, at <a href="http://packages.debian.org/">packages.debian.org</a>:</p>
<p><a href="http://ftp.us.debian.org/debian/pool/main/g/gcc-3.3/libstdc++5_3.3.6-18_i386.deb">http://ftp.us.debian.org/debian/pool/main/g/gcc-3.3/libstdc++5_3.3.6-18_i386.deb</a></p>
<p>So let&#8217;s grab it:<br />
<p class="code">$ <strong>cd ..</strong>
$ <strong>wget http://ftp.us.debian.org/debian/pool/main/g/gcc-3.3/libstdc++5_3.3.6-18_i386.deb</strong></p></p>
<p>Since it&#8217;s a <code>.deb</code> package, I could simply install it with <code>dpkg</code> &#8212; but, I want to keep my system sterile clean and not clutter it with outdated packages that only some old Firefox release needs. Let&#8217;s have a look at the files that this package would install &#8212; I&#8217;ll use a combination of <code>ar</code> and <code>tar</code> (in case you&#8217;d be interested, <a href="http://www.g-loaded.eu/2008/01/28/how-to-extract-rpm-or-deb-packages/">this blog post</a> at <a href="http://www.g-loaded.eu/">G-Loaded Journal</a> explains the use of these commands):<br />
<p class="code">$ <strong>ar p libstdc++5_3.3.6-18_i386.deb data.tar.gz | tar zt</strong>
./
./usr/
./usr/share/
./usr/share/doc/
./usr/share/doc/libstdc++5/
./usr/share/doc/libstdc++5/README.Debian
./usr/share/doc/libstdc++5/TODO.Debian
./usr/share/doc/libstdc++5/copyright
./usr/share/doc/libstdc++5/changelog.Debian.gz
./usr/lib/
./usr/lib/libstdc++.so.5.0.7
./usr/lib/libstdc++.so.5</p></p>
<p>Apparently, there&#8217;s a couple documentation files that I can ignore. What I&#8217;m interested in are the two library files in <code>./usr/lib</code> &#8212; <code>libstdc++.so.5.0.7</code> and <code>libstdc++.so.5</code> (actually, that&#8217;s just one library file, as <code>libstdc++.so.5</code> is a symbolic link to <code>libstdc++.so.5.0.7</code>), and I&#8217;m going to extract just those two files. Moreover, I don&#8217;t want <code>tar</code> to create the <code>usr/lib</code> directory structure (as it normally would), I just want the two files to be placed in the <code>firefox-2.0</code> directory, and for all that to happen I&#8217;ll use this lengthy command:<br />
<p class="code">$ <strong>ar p libstdc++5_3.3.6-18_i386.deb data.tar.gz | tar zx ./usr/lib/libstdc++.so.5.0.7 ./usr/lib/libstdc++.so.5 --transform 's!./usr/lib/!firefox-2.0/!'</strong></p></p>
<p>What this command does is it extracts the two library files from the package, then translates their full paths, substituting <code>./usr/lib</code> with <code>firefox-2.0</code>, so the files should end up where I want them. Let&#8217;s see:<br />
<p class="code">$ <strong>ls firefox-2.0/libstdc++*</strong>
firefox-2.0/libstdc++.so.5  firefox-2.0/libstdc++.so.5.0.7</p></p>
<p>Great. Now I can try launching Firefox 2 again, but I also have to tell it that it should look for the <code>libstdc++.so.5</code> library file in its own directory. There&#8217;s an environmental variable that serves this purpose called <code>LD_LIBRARY_PATH</code> &#8212; all I need to do is set it to &#8220;.&#8221; (which corresponds to the current directory) and run Firefox with that setting:<br />
<p class="code">$ <strong>cd firefox-2.0</strong>
$ <strong>LD_LIBRARY_PATH=. ./firefox -no-remote -P firefox-2.0</strong></p></p>
<p>Success! We can now party like it&#8217;s 2008.</p>
<p style="text-align: center;"><img class="size-full wp-image-401  aligncenter" title="Firefox 2.0 About Window" src="http://odyniec.net/blog/wp-content/uploads/2010/02/firefox-2.0.png" alt="Firefox 2.0 About Window" width="330" height="514" /></p>
<p>The other two versions should run smoothly without complaining about libraries.<br />
<p class="code">$ <strong>cd ../firefox-3.0</strong>
$ <strong>./firefox -no-remote -P firefox-3.0</strong></p></p>
<p><p class="code">$ <strong>cd ../firefox-3.6</strong>
$ <strong>./firefox -no-remote -P firefox-3.6</strong></p></p>
<p>Enjoy your multiple Firefoxes!</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2010/02/running-multiple-versions-of-firefox-in-ubuntu-9-10/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SelectList 0.1.2</title>
		<link>http://odyniec.net/blog/2010/01/selectlist-0-1-2/</link>
		<comments>http://odyniec.net/blog/2010/01/selectlist-0-1-2/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 14:10:34 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[selectList]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=383</guid>
		<description><![CDATA[I&#8217;ve just released a new version of the selectList jQuery plugin &#8212; no exciting new features, though, this release only fixes a bug that generated a JavaScript error in IE6 when there were no options in the original select field (thanks to CJ for reporting this).
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just released a new version of the <a title="selectList jQuery plugin" href="http://odyniec.net/projects/selectlist/">selectList jQuery plugin</a> &#8212; no exciting new features, though, this release only fixes a bug that generated a JavaScript error in IE6 when there were no options in the original select field (thanks to CJ for reporting this).</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2010/01/selectlist-0-1-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SelectList 0.1.1</title>
		<link>http://odyniec.net/blog/2009/10/selectlist-0-1-1/</link>
		<comments>http://odyniec.net/blog/2009/10/selectlist-0-1-1/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:47:28 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[selectList]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=377</guid>
		<description><![CDATA[Here&#8217;s another minor update to one of my jQuery plugins &#8212; this time it&#8217;s selectList, version 0.1.1. The update is mostly a code cleanup, with one functional change &#8212; if a hint has been provided with the title attribute, it is always shown as the currently selected option in the dropdown list after each selection [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s another minor update to one of my jQuery plugins &#8212; this time it&#8217;s <a title="selectList" href="http://odyniec.net/projects/selectlist/">selectList</a>, version 0.1.1. The update is mostly a code cleanup, with one functional change &#8212; if a hint has been provided with the <code>title</code> attribute, it is always shown as the currently selected option in the dropdown list after each selection takes place (<a href="http://odyniec.net/blog/2009/06/selectlist-01/comment-page-1/#comment-284">as requested by some</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2009/10/selectlist-0-1-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rocket</title>
		<link>http://odyniec.net/blog/2009/10/rocket/</link>
		<comments>http://odyniec.net/blog/2009/10/rocket/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 14:18:43 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=371</guid>
		<description><![CDATA[Meet Rocket.

Rocket is a (approximately) seven weeks old, cute-as-hell kitten.
I found him about a month ago, while going for a walk around my neighborhood. He was crawling through some bushes, squeaking silently, but loud enough for me to hear. I have had a few kittens throughout my life, so I immediately recognized the characteristic squeak [...]]]></description>
			<content:encoded><![CDATA[<p>Meet Rocket.</p>
<p><img class="size-full wp-image-372" title="Rocket" src="http://odyniec.net/blog/wp-content/uploads/2009/10/rocket.jpg" alt="Rocket" width="320" height="320" /></p>
<p style="text-align: left;">Rocket is a (approximately) seven weeks old, cute-as-hell kitten.</p>
<p>I found him about a month ago, while going for a walk around my neighborhood. He was crawling through some bushes, squeaking silently, but loud enough for me to hear. I have had a few kittens throughout my life, so I immediately recognized the characteristic squeak of a baby cat calling for help. When I saw him, the poor thing looked really miserable, messy, with eyes completely matted shut. Seeing no signs of his cat mother anywhere near, and knowing that the little guy had no chance of surviving on his own, I decided to take him home.</p>
<p>He was soon seen by a veterinarian, and it turned out he was literally covered with ticks. As the doctor put it, they would have &#8220;sucked him dry&#8221; if he hadn&#8217;t been found. It took a whole hour to remove all those little bastards. The doctor also opened Rocket&#8217;s matted eyes, and there was some bad news. His eyes were badly infected (in doctor&#8217;s words, the infection looked &#8220;horrible&#8221;), and it was highly likely that he will be blind or nearly blind for the rest of his cat life.</p>
<p>This didn&#8217;t sound optimistic, but I thought, what the hell, whatever chance there is, it&#8217;s worth trying, so I took him back home and started his treatment. At that time, his eyes looked really bad, lifeless and empty, like those of a zombie. Rocket could open them, but it was obvious he can&#8217;t see a thing.</p>
<p>I have other cats in my apartment, and since Rocket&#8217;s infection was contagious, I had to isolate him. I arranged him a cozy therapy room in the bathroom and he stayed there most of the time. However, he had an unstoppable urge to explore the world around him, and whenever I opened the bathroom door, he shot out of there like a freaking rocket. Yup, that&#8217;s how he got his name.</p>
<p>Despite being sightless and weakened by his illness, he was unbelievably full of life. I got him a toy rat, and he spent hours biting, strangling, and generally torturing the hell out of it. Whenever he smelled food, he sniffed his way towards it like a hunting dog &#8212; and when he got to it, he ate like crazy.</p>
<p>I&#8217;m sure it was this exceptional lust for life that made him defeat his illness. After a few days of intensive treatment, I noticed some changes. His eyes looked less zombielike every day, and there were undoubted signs that Rocket was starting to see. This was mostly observable when he paused his activities (which mostly involved running around and biting everything) for a brief moment, and turned his head only slightly, obviously experiencing the formerly unknown sensation of sight.</p>
<p>About two weeks after I found him, he was all better. His eyes looked almost normal, with just a few barely noticeable spots left after the infection. The first time I saw him play with a tiny piece of paper, I had no doubt that he is able to see pretty clearly. Even the doctor was amazed by how well he was doing.</p>
<p>I could not keep Rocket in my apartment for good, because the other cats weren&#8217;t getting along with him especially well. Luckily, my mom decided to take him, so now Rocket has a new, loving home, and he&#8217;s a happy little troublemaker.</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2009/10/rocket/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ImgZoom 0.1.1</title>
		<link>http://odyniec.net/blog/2009/10/imgzoom-0-1-1/</link>
		<comments>http://odyniec.net/blog/2009/10/imgzoom-0-1-1/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 16:54:03 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[imgZoom]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=367</guid>
		<description><![CDATA[Today I released a new version of imgZoom. It&#8217;s just a minor update that fixes one bug and introduces the getOptions() API method.
I have also updated the documentation &#8212; it now includes a reference of the available API methods.
]]></description>
			<content:encoded><![CDATA[<p>Today I released a new version of <a href="http://odyniec.net/projects/imgzoom/">imgZoom</a>. It&#8217;s just a minor update that fixes one bug and introduces the <code>getOptions()</code> API method.</p>
<p>I have also updated the <a href="http://odyniec.net/projects/imgzoom/usage.html">documentation</a> &#8212; it now includes a reference of the available API methods.</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2009/10/imgzoom-0-1-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Learning jQuery 1.3 &#8211; Book Review</title>
		<link>http://odyniec.net/blog/2009/09/learning-jquery-1-3-book-review/</link>
		<comments>http://odyniec.net/blog/2009/09/learning-jquery-1-3-book-review/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 00:18:51 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=359</guid>
		<description><![CDATA[I recently had a chance to read &#8220;Learning jQuery 1.3&#8243; by Jonathan Chaffer and Karl Swedberg. Having been using jQuery for quite a while in dozens of web development projects, and having released a few plugins, I consider myself an advanced user of this great library. However, my knowledge of jQuery comes almost exclusively from [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.packtpub.com/learning-jquery-1.3/book"><img class="size-full wp-image-360 alignright" title="Learning jQuery 1.3" src="http://odyniec.net/blog/wp-content/uploads/2009/09/learning_jquery_1.3_cover.jpg" alt="Learning jQuery 1.3" width="210" height="272" /></a>I recently had a chance to read <a title="Learning jQuery 1.3" href="http://www.packtpub.com/learning-jquery-1.3/book">&#8220;Learning jQuery <span class="_US_to_Metric_value" style="cursor: pointer; color: inherit; font-size: inherit; font-weight: inherit;" title="1.3&quot; = 3.30 cm"><span class="_US_to_Metric_value" style="cursor: pointer; color: inherit; font-size: inherit; font-weight: inherit;" title="1.3&quot; = 3.30 cm"><span class="_US_to_Metric_value" style="cursor: pointer; color: inherit; font-size: inherit; font-weight: inherit;" title="1.3&quot; = 3.30 cm">1.3&#8243;</span></span></span></a> by Jonathan Chaffer and Karl Swedberg. Having been using jQuery for quite a while in dozens of web development projects, and having released a few plugins, I consider myself an advanced user of this great library. However, my knowledge of jQuery comes almost exclusively from the official <a href="http://docs.jquery.com/Main_Page">online documentation</a> (particularly the API reference) and some occasional reading. So I thought this could be an interesting opportunity to compare my experience-based knowledge with a structured course in a book.</p>
<p>The book is divided into two parts &#8212; the first six chapters are a gradual introduction to the concepts of jQuery and its basic features, while the remaining chapters discuss the more advanced topics and show some real-world applications of the library.</p>
<p>I expected the introductory part of the book to be a bit boring, since I already knew all that elementary stuff, but I was pleasantly surprised to be wrong. The authors have managed to describe the basics (selectors, events, AJAX, etc.) really comprehensively, drawing attention to many details and subtleties. For example, the chapter about effects is nothing like the &#8220;how to amaze your visitors with cool effects&#8221; approach that many tutorials seem to take &#8212; instead, the reader gets a thorough explanation of topics such as custom animations and effect queuing.</p>
<p>The advanced chapters are even more interesting, demonstrating a number of practical examples of how jQuery can enrich users&#8217; experience when dealing with common web application features, such as presenting data in tables and filling out forms. While the examples are quite complicated and lead to code snippets spanning several pages, they remain beginner-friendly, as all the new elements are introduced progressively, starting with the basics and adding more features along the way.</p>
<p>Last but not least, the book includes useful appendices that list numerous valuable online resources and development tools for jQuery users. There is also an excellent appendix on JavaScript closures, which is a very significant (and often misunderstood) subject for jQuery plugin developers, as well as anyone interested in advanced JavaScript programming.</p>
<p>What I consider the greatest strength of the book is the professional approach to web development that the authors take and try to pass to the reader. The book places great emphasis on good web development practices, especially accessibility issues &#8212; all the many examples conform to the concepts of <em>graceful degradation</em> and <em>progressive enhancement</em>, and the presented techniques can be safely implemented in accessible web applications.</p>
<p>I highly recommend the book to any present or future jQuery user. If you&#8217;re a beginner, it will help you learn jQuery and use it the right way. If you&#8217;re experienced, you might be surprised to learn a few new tricks (I was), or at the very least, you will find it an interesting read.</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2009/09/learning-jquery-1-3-book-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ImgAreaSelect 0.9.1</title>
		<link>http://odyniec.net/blog/2009/08/imgareaselect-0-9-1/</link>
		<comments>http://odyniec.net/blog/2009/08/imgareaselect-0-9-1/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 23:47:26 +0000</pubDate>
		<dc:creator>Michal Wojciechowski</dc:creator>
				<category><![CDATA[imgAreaSelect]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://odyniec.net/blog/?p=356</guid>
		<description><![CDATA[I have just released an update to imgAreaSelect with a version number of 0.9.1. It fixes a nasty bug found in version 0.9 that affected the initialization stage, causing some unexpected behavior (like not being able to set the initial selection) and JavaScript errors.
Thanks to all the people who noticed the bug and reported it [...]]]></description>
			<content:encoded><![CDATA[<p>I have just released an update to <a href="http://odyniec.net/projects/imgareaselect/">imgAreaSelect</a> with a version number of 0.9.1. It fixes a nasty bug found in version 0.9 that affected the initialization stage, causing some unexpected behavior (like not being able to set the initial selection) and JavaScript errors.</p>
<p>Thanks to all the people who noticed the bug and reported it to me.</p>
]]></content:encoded>
			<wfw:commentRss>http://odyniec.net/blog/2009/08/imgareaselect-0-9-1/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
