<?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>Konstruktors &#187; Blog About Web, Design and the Future of Publishing</title>
	<atom:link href="http://konstruktors.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://konstruktors.com</link>
	<description>Web Direction &#38; Design by Kaspars Dambis</description>
	<lastBuildDate>Sat, 17 Jul 2010 23:45:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>	<atom:link rel='hub' href='http://konstruktors.com/?pushpress=hub'/>
		<item>
		<title>Linux Kernel, Modules and&#160;Plugins</title>
		<link>http://konstruktors.com/blog/free-software/2571-linux-kernel-modules-and-plugins/</link>
		<comments>http://konstruktors.com/blog/free-software/2571-linux-kernel-modules-and-plugins/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 23:38:27 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Free Software]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2571</guid>
		<description><![CDATA[Here are some views expressed by Linus Torvalds about the Linux kernel, plugins and how he thinks about derivative work. Very relevant to what I said about plugin interfaces and user space. So, do themes and plugins serve a system-level or a user-level function? p.s. Some have compared WordPress plugin and theme API to the way [...]]]></description>
			<content:encoded><![CDATA[<p>Here are some <a href="http://linuxmafia.com/faq/Kernel/proprietary-kernel-modules.html">views expressed by Linus Torvalds</a> about the Linux kernel, plugins and how he thinks about derivative work. Very relevant to <a href="http://konstruktors.com/blog/free-software/2550-gpl-sockets/">what I said</a> about <em>plugin interfaces</em> and <em>user space</em>.</p>
<p>So, do themes and plugins serve a <em>system-level</em> or a <em>user-level</em> function?</p>
<p>p.s. Some have compared WordPress plugin and theme API to the way Linux loads kernel modules, when in fact relating it to <em>system call</em> interface (SCI) would be more appropriate.</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/free-software/2571-linux-kernel-modules-and-plugins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GPL Sockets</title>
		<link>http://konstruktors.com/blog/free-software/2550-gpl-sockets/</link>
		<comments>http://konstruktors.com/blog/free-software/2550-gpl-sockets/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 16:08:34 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Free Software]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2550</guid>
		<description><![CDATA[It is interesting how thinking and understanding of ideas change over time. This morning I woke up and started reading the GPL licence with the intent to take another look at what it actually stands for. I have come to conclusion that its purpose is to give everyone the freedom to do whatever they want [...]]]></description>
			<content:encoded><![CDATA[<p>It is interesting how thinking and understanding of ideas change over time. This morning I woke up and started reading the GPL licence with the intent to take another look at what it actually stands for.</p>
<p>I have come to conclusion that <strong>its purpose is to give everyone the freedom to do whatever they want with my work as long as they retain the freedom to derive from it</strong>.</p>
<p>With every software there are only two things one can do with it &#8212; either run it or modify it. By applying the GPL licence to my original work I am making sure that these two things can always happen and nobody can take those freedoms away.<span id="more-2550"></span></p>
<p>The important point is that I am &#8216;enforcing&#8217; these rules only in the context of the work that I have written and distributed. WordPress has been built upon the b2 blogging software by modifying its source code and adding new functionality, and because b2 was licensed under the GPL, the derived and altered source code is also licenced under the GPL. Although there might be not a single line of code left from the days of b2, WordPress started off as a tiny modification of its source code, and therefore must retain its licence. This is a very important point to understand for those trying to dismiss <em>the spirit of GPL</em>, because it&#8217;s the only thing left when every single line of code is different from the original. And it doesn&#8217;t matter if that change happened in a single patch or thousands of them.</p>
<p>Plugin functionality in WordPress didn&#8217;t exist in b2 and <a title="WordPress 1.2 Changelog" href="http://codex.wordpress.org/Changelog/1.2">was added</a> only in 2004 when WordPress 1.2 was released. Before that, one would have to make changes directly to the source code in order to alter the way WordPress works.</p>
<p>Therefore, the important question is &#8212; <strong>if changing the source code is clearly deriving from the original, then what is a plugin?</strong> Is it simply an elegant way to &#8220;modify&#8221; the source code or is it something else?</p>
<p>If we think of the plugin architecture as a &#8220;socket&#8221; through which one can get access to the &#8220;power&#8221;, does GPL has any say over what can be plugged into that socket? Do I, as the creator of the &#8220;socket&#8221;, want to determine and have control over what can be plugged in there?</p>
<p>I view software exactly as devices with plugs which need sockets of power to function. If lower level sockets didn&#8217;t exist, everyone would need to write software in assembly with the only knowledge being the hardware on which it will run. Like building a table lamp with its own wind farm.</p>
<p>Relying on existing interfaces for creating new functionality is an inherent feature of how computers work. Even programming languages can be considered as semantic interfaces through which we communicate and control the hardware. For example, WordPress will always need PHP to run. Outside PHP WordPress is not WordPress anymore.</p>
<p>With that comparison in mind, we should note that <strong>WordPress can be licensed under the GPL only because the </strong><a href="http://www.php.net/license/3_0.txt"><strong>licence of PHP</strong></a><strong> doesn&#8217;t impose any restrictions or rules on how the products derived from it are licensed</strong>. At the same time, WordPress has no influence over how PHP can be used.</p>
<p>I think that once you create an interface in your software through which you want others to modify or change the way software works, you have given others the freedom to plug in anything into it. You have created an interface which no longer requires others to derive from your original work, in order to use it. When someone uses that interface, nothing is being changed or altered in your original work.</p>
<p>By creating such plugin architecture, you have decided to give others the freedom to add any type of functionality without any restrictions. <strong>That added functionality is a derivative work only in a sense that it uses your &#8220;socket&#8221;, while the functionality itself stands on its own</strong>. It&#8217;s like plugging an amplifier into an audio system &#8212; the amplification depends only on the existence of a signal not on the type of socket it&#8217;s passed through.</p>
<p>To conclude, I think WordPress plugins and themes are not derivative works of WordPress. <strong>Use of plugins and themes is protected by the freedom Zero of the GPL &#8212; &#8220;the freedom to run the program, for any purpose&#8221;</strong>. Once you have allowed users to run any plugins or themes, you can&#8217;t limit them to plugins and themes that are licensed only under GPL.</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/free-software/2550-gpl-sockets/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Location Aware Login&#160;Prompt</title>
		<link>http://konstruktors.com/blog/design/2113-location-aware-login-prompt/</link>
		<comments>http://konstruktors.com/blog/design/2113-location-aware-login-prompt/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 13:03:14 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Design]]></category>
		<guid isPermaLink="false">http://konstruktors.com/blog/?p=2113</guid>
		<description><![CDATA[Define your home as a GPS location +/- 50 m. If you are within that area, you don&#8217;t have to enter the password. If you are outside that area, you are requested to select three images in the right order from a grid of nine images. If that fails, you are requested to enter the password. [...]]]></description>
			<content:encoded><![CDATA[<p>Define your <em>home</em> as a GPS location +/- 50 m. If you are within that area, you don&#8217;t have to enter the password. If you are outside that area, you are requested to select three images in the right order from a grid of nine images. If that fails, you are requested to enter the password.</p>
<p>This would be extremely useful for all the tablets out there.</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/design/2113-location-aware-login-prompt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatic Updates for Plugins and Themes Hosted Outside WordPress&#160;Extend</title>
		<link>http://konstruktors.com/blog/wordpress/2538-automatic-updates-for-plugins-and-themes-hosted-outside-wordpress-extend/</link>
		<comments>http://konstruktors.com/blog/wordpress/2538-automatic-updates-for-plugins-and-themes-hosted-outside-wordpress-extend/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 12:21:44 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[theme]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2538</guid>
		<description><![CDATA[Here are two sample scripts along with an API to provide automatic updates for plugins and themes you host on your own server. Inside /api you&#8217;ll find index.php which processes all the update requests. You should place this in something like http://updates.example.com and update $api_url in /plugin/test-plugin-update/test-plugin-update.php and /theme/portfolio-racer/inc/updates.php accordingly. If you activate these sample [...]]]></description>
			<content:encoded><![CDATA[<p>Here are <a href="http://konstruktors.com/wp-content/uploads/2010/07/automatic-theme-plugin-update.zip">two sample scripts</a> along with an API to provide automatic updates for plugins and themes you host on your own server.</p>
<p>Inside <code>/api</code> you&#8217;ll find <code>index.php</code> which processes all the update requests. You should place this in something like <code>http://updates.example.com</code> and update <code>$api_url</code> in <code>/plugin/test-plugin-update/test-plugin-update.php</code> and <code>/theme/portfolio-racer/inc/updates.php</code> accordingly. If you activate these sample plugins without changing API URL, updates will be checked against my test server. If you decide to update, both plugin and theme will be replaced with exactly the same version of each.</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/wordpress/2538-automatic-updates-for-plugins-and-themes-hosted-outside-wordpress-extend/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>OpenID and PHP&#160;5.3</title>
		<link>http://konstruktors.com/blog/wordpress/2534-openid-and-php-5-3/</link>
		<comments>http://konstruktors.com/blog/wordpress/2534-openid-and-php-5-3/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 10:19:16 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[plugin]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2534</guid>
		<description><![CDATA[Here is a fix to make the OpenID plugin (version 3.3.2) work with PHP 5.3. Without it, you would get an error when trying to login: This is an OpenID Server. Nothing to see here… move along.]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/diso/issues/detail?id=161">Here is a fix</a> to make the <a href="http://wordpress.org/extend/plugins/openid/">OpenID plugin</a> (version 3.3.2) work with PHP 5.3. Without it, you would get an error when trying to login:</p>
<blockquote><p>This is an OpenID Server. Nothing to see here… move along.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/wordpress/2534-openid-and-php-5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX Cache Purge Cookie&#160;Plugin</title>
		<link>http://konstruktors.com/blog/wordpress/2521-ajax-cache-purge-cookie-plugin/</link>
		<comments>http://konstruktors.com/blog/wordpress/2521-ajax-cache-purge-cookie-plugin/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 01:24:12 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[server]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2521</guid>
		<description><![CDATA[This plugin sets a &#8220;version&#8221; cookie of your site&#8217;s content, which can be used for time-based cache invalidation, as the cookie is checked and updated (if necessary) on each page request through a single AJAX request. Download: ajax-cache-purge.zip (June 26, 2010) Installation Please note that this plugin is intended for people who run their own [...]]]></description>
			<content:encoded><![CDATA[<p>This plugin sets a &#8220;version&#8221; cookie of your site&#8217;s content, which can be used for time-based cache invalidation, as the cookie is checked and updated (if necessary) on each page request through a single AJAX request.</p>
<p><strong>Download</strong>: <a href="http://konstruktors.com/wp-content/uploads/2010/06/ajax-cache-purge.zip">ajax-cache-purge.zip</a> (June 26, 2010)</p>
<h3>Installation</h3>
<p>Please note that this plugin is intended for people who run their own servers.</p>
<ol>
<li>Upload and enable the plugin.</li>
<li>Add the value of <code>wp_cache_key_cookie</code> to the cache key.</li>
</ol>
<h3>Nginx Example</h3>
<pre>fastcgi_cache_path 	/var/www/cache  levels=1:2
			keys_zone=wp-cache:10m
			inactive=2m max_size=2000m;
fastcgi_temp_path 	/var/www/cache/tmp;
server {
	# other config options
	location ~ \.php$ {
		# Cookie is supplied by the plugin
		set $wp_cache_key_cookie 0;
		if ($http_cookie ~* "wp_cache_key_cookie[^=]*=([^;]+)(;|$)") {
			set $wp_cache_key_cookie wp_cache_key_cookie_$1;
		}
		set $wp_cache_key $scheme$host|$request_uri|args=$args$|$wp_cache_key_cookie;
		#add key in header for debugging
		#add_header	WP_KEY $osc_cache_key;
		fastcgi_cache 		wp-cache;
		fastcgi_cache_key 	$wp_cache_key;
	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/wordpress/2521-ajax-cache-purge-cookie-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Laptop from Aboard the Shuttle&#160;Spacecraft</title>
		<link>http://konstruktors.com/blog/meta/2506-laptop-from-aboard-the-shuttle-spacecraft/</link>
		<comments>http://konstruktors.com/blog/meta/2506-laptop-from-aboard-the-shuttle-spacecraft/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 00:18:24 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Meta]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[usability]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2506</guid>
		<description><![CDATA[There is only one brand of laptops used aboard the space shuttles &#8212; IBM ThinkPad. In my opinion, they are the best laptops one can ever buy, mainly because of their unspoken hardware and famous red trackpoint mouse. Several weeks ago the screen inverter of my Dell Latitude D820 laptop (which also has a trackpoint) [...]]]></description>
			<content:encoded><![CDATA[<p>There is only one brand of laptops <a href="http://spaceflight.nasa.gov/gallery/images/shuttle/sts-114/hires/s114e7012.jpg">used</a> <a href="http://www-03.ibm.com/ibm/history/exhibits/space/space_thinkpad.html">aboard the space shuttles</a> &#8212; <a href="http://en.wikipedia.org/wiki/ThinkPad">IBM ThinkPad</a>. In my opinion, they are the best laptops one can ever buy, mainly because of their unspoken hardware and famous red trackpoint mouse.</p>
<p>Several weeks ago the screen inverter of my Dell Latitude D820 laptop (which also has a trackpoint) failed and turned it into a desktop that can only be used with an external monitor. So I found a used IBM ThinkPad A31p (released in 2002), which is now running Ubuntu that supports every piece of hardware inside it. Although I won&#8217;t be carrying it around very often because it weights 3.45 kg (7.6 lb), I might make a sticker that says &#8220;Used Aboard the Shuttle Spacecraft&#8221; and look cool even with a laptop that old.</p>
<p><a href="http://www.tomsguide.com/us/ibm-thinkpad-a31p,review-42.html"><img class="aligncenter size-medium wp-image-2514" src="http://konstruktors.com/wp-content/uploads/2010/06/ibm-thinkpad-a31p-2-500x462.jpg" alt="IBM ThinkPad A31p" width="500" height="462" /></a></p>
<p><span id="more-2506"></span></p>
<p>Once you get used to the trackpoint, everything else seems so clumsy and frustrating. There is even a handy little application for configuring the trackpoint settings, called &#8216;<a href="http://sourceforge.net/projects/tpctl/">Configure TrackPoint</a>&#8216;:</p>
<p><img class="aligncenter size-full wp-image-2511" src="http://konstruktors.com/wp-content/uploads/2010/06/trackpoint-configure-ubuntu-2.png" alt="Configure TrackPoint sensitivity and speed in Ubuntu" width="441" height="611" /></p>
<p><img class="aligncenter size-full wp-image-2510" src="http://konstruktors.com/wp-content/uploads/2010/06/trackpoint-configure-ubuntu.png" alt="Configure TrackPoint for Ubuntu" width="446" height="613" /></p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/meta/2506-laptop-from-aboard-the-shuttle-spacecraft/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Widget Context User Interface&#160;Update</title>
		<link>http://konstruktors.com/blog/wordpress/2491-widget-context-user-interface-update/</link>
		<comments>http://konstruktors.com/blog/wordpress/2491-widget-context-user-interface-update/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 21:44:26 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[ui]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2491</guid>
		<description><![CDATA[Here is the new user interface that I have in mind for the next version of the Widget Context plugin. Feedback and suggestions from everyone currently using the plugin is much appreciated.]]></description>
			<content:encoded><![CDATA[<p>Here is the new user interface that I have in mind for the next version of the Widget Context plugin. Feedback and suggestions from everyone currently using the plugin is much appreciated.</p>
<p><img class="aligncenter size-full wp-image-2492" title="Widget Context new user interface" src="http://konstruktors.com/wp-content/uploads/2010/06/widget-context-new-layout.png" alt="" width="448" height="600" /></p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/wordpress/2491-widget-context-user-interface-update/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bitmaps for Gnome Panel&#160;Background</title>
		<link>http://konstruktors.com/blog/design/2483-bitmaps-for-gnome-panel-background/</link>
		<comments>http://konstruktors.com/blog/design/2483-bitmaps-for-gnome-panel-background/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 19:59:28 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[ui]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2483</guid>
		<description><![CDATA[How come that for interface elements in Gnome (in Ubuntu 10.04) we&#8217;re still stuck with bitmaps instead of scalable vector graphics.]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-medium wp-image-2484" title="Gnome panel background in Ubuntu 10.04" src="http://konstruktors.com/wp-content/uploads/2010/06/ubuntu-panel-background-img-500x50.png" alt="Gnome panel background in Ubuntu 10.04" width="500" height="50" /></p>
<p>How come that for interface elements in Gnome (in Ubuntu 10.04) we&#8217;re still stuck with bitmaps instead of scalable vector graphics.</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/design/2483-bitmaps-for-gnome-panel-background/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX Cache Key Invalidation&#160;Plugin</title>
		<link>http://konstruktors.com/blog/wordpress/2477-ajax-cache-key-invalidation-plugin/</link>
		<comments>http://konstruktors.com/blog/wordpress/2477-ajax-cache-key-invalidation-plugin/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 02:05:29 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[speed]]></category>
		<category><![CDATA[Web Development]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2477</guid>
		<description><![CDATA[Just took the time to create and implement the smartest WordPress cache solution of all time. If your server is able to use cookies for cache keys, I can send you a copy of the plugin to try it out.]]></description>
			<content:encoded><![CDATA[<p>Just took the time to create and implement <a href="http://konstruktors.com/blog/web-design/2421-use-ajax-for-cache-invalidation/">the smartest WordPress cache solution</a> of all time. If your server is able to use cookies for cache keys, I can send you a copy of the plugin to try it out.</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/wordpress/2477-ajax-cache-key-invalidation-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Steve is Listening (or iPhone&#160;4)</title>
		<link>http://konstruktors.com/blog/random-musings/2443-steve-is-listening-or-iphone-4/</link>
		<comments>http://konstruktors.com/blog/random-musings/2443-steve-is-listening-or-iphone-4/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 19:12:39 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Random Musings]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[mobile]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2443</guid>
		<description><![CDATA[Some time ago I said that Apple should call their phones simply by numbers in the order they&#8217;re released, instead of adding suffixes such as G and GS. Now they do.]]></description>
			<content:encoded><![CDATA[<p>Some time ago <a href="http://konstruktors.com/blog/design/1222-is-iphone-3g-s-slow-or-small/">I said</a> that Apple should call their phones simply by numbers in the order they&#8217;re released, instead of adding suffixes such as G and GS. Now <a href="http://www.apple.com/iphone/">they do</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/random-musings/2443-steve-is-listening-or-iphone-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Standalone Script for Clearing APC&#160;Cache</title>
		<link>http://konstruktors.com/blog/web-design/2444-standalone-script-for-clearing-apc-cache/</link>
		<comments>http://konstruktors.com/blog/web-design/2444-standalone-script-for-clearing-apc-cache/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 12:48:59 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[how to]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2444</guid>
		<description><![CDATA[After upgrading WordPress to a new version, you might need to clear the APC opcode cache. Here is a simple script that you can store in the root of your website, for example, clearapc.php: if (function_exists('apc_clear_cache') &#38;&#38; $_GET['pass'] == 'secret') { if (apc_clear_cache() &#38;&#38; apc_clear_cache('user')) print 'All Clear!'; else print 'Clearing Failed!'; print '&#60;pre&#62;'; print_r(apc_cache_info()); [...]]]></description>
			<content:encoded><![CDATA[<p>After upgrading WordPress to a new version, you might need to clear the APC opcode cache. Here is a simple script that you can store in the root of your website, for example, <code>clearapc.php</code>:</p>
<pre><code>if (function_exists('apc_clear_cache') &amp;&amp; $_GET['pass'] == 'secret') {
        if (apc_clear_cache() &amp;&amp; apc_clear_cache('user'))
                print 'All Clear!';
        else
                print 'Clearing Failed!';
        print '&lt;pre&gt;';
        print_r(apc_cache_info());
        print '&lt;/pre&gt;';
} else {
        print 'Authenticate, please!';
}</code></pre>
<p>Then call the script via <code>http://example.com/clearapc.php?pass=secret</code></p>
<p>Instead of using <code>?pass=secret</code>, you might well call the filename something that is hard to guess: <code>clearapc93920.php</code></p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/web-design/2444-standalone-script-for-clearing-apc-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chrome OS vs Android&#160;for Tablets</title>
		<link>http://konstruktors.com/blog/media-publishing/2435-chrome-os-vs-android-for-tablets/</link>
		<comments>http://konstruktors.com/blog/media-publishing/2435-chrome-os-vs-android-for-tablets/#comments</comments>
		<pubDate>Thu, 13 May 2010 14:47:33 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Media & Publishing]]></category>
		<category><![CDATA[reader]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2435</guid>
		<description><![CDATA[Android&#8217;s strength is cellular voice and data transfer and its low power consumption while Chrome OS has better support for various hardware architectures, and they are both based on the Linux kernel. If you were to build a tablet that has a touch screen not bigger than 9 inches and a modern browser as its [...]]]></description>
			<content:encoded><![CDATA[<p>Android&#8217;s strength is cellular voice and data transfer and its low power consumption while Chrome OS has better support for various hardware architectures, and they are both based on the Linux kernel.</p>
<p>If you were to build a tablet that has a touch screen not bigger than 9 inches and a modern browser as its only application, GSM + data connection, instant startup and a batter life of 12 hours, which OS would you choose?</p>
<p>I can&#8217;t understand why Google needs Chrome OS. Is it only for devices that don&#8217;t have touchscreens?</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/media-publishing/2435-chrome-os-vs-android-for-tablets/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Use AJAX&#160;for Cache Invalidation</title>
		<link>http://konstruktors.com/blog/web-design/2421-use-ajax-for-cache-invalidation/</link>
		<comments>http://konstruktors.com/blog/web-design/2421-use-ajax-for-cache-invalidation/#comments</comments>
		<pubDate>Wed, 05 May 2010 15:51:33 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[speed]]></category>
		<guid isPermaLink="false">http://konstruktors.com/?p=2421</guid>
		<description><![CDATA[Let&#8217;s have a site wide version number that is changed every time something is updated and cache needs to be invalidated. This number is stored in a simple text file. Cache keys are made up of Request-URI and this unique key, which is passed around in a cookie VERSION_NO. On every page request javascript calls version.php?timestamp [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s have a site wide <em>version number</em> that is changed every time something is updated and cache needs to be invalidated. This number is stored in a simple text file. Cache keys are made up of Request-URI and this unique key, which is passed around in a cookie <code>VERSION_NO</code>.</p>
<p>On every page request javascript calls <code>version.php?timestamp</code> (which is never cached because of the timestamp), which using <code>stat()</code> reads the <em>last modified timestamp</em> of that text file and compares it to the value of <code>VERSION_NO</code> cookie. If they are different, a new cookie value is set, which in turn changes the cache key for all future requests, and the cache is invalidated.</p>
<p>The only thing I don&#8217;t know is how fast and resource hungry is the <code>stat()</code> call?</p>
<p><strong>Update</strong>: or would it be better to use <code><a href="http://php.net/manual/en/function.filemtime.php">filemtime()</a></code>? There is <a href="http://www.php.net/manual/en/function.filemtime.php#96403">a comment</a> which says that 1000 <code>filemtime()</code> calls take 0.0049 seconds, which I think is very reasonable.</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/web-design/2421-use-ajax-for-cache-invalidation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Regarding the &#8216;Like&#8217;&#160;Button</title>
		<link>http://konstruktors.com/blog/the-web/2171-regarding-the-like-button/</link>
		<comments>http://konstruktors.com/blog/the-web/2171-regarding-the-like-button/#comments</comments>
		<pubDate>Wed, 05 May 2010 12:56:38 +0000</pubDate>
		<dc:creator>Kaspars</dc:creator>
				<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">http://konstruktors.com/blog/?p=2171</guid>
		<description><![CDATA[You can like something and there is nothing you have to do about it. It is an effortless act and there are no explanations required or expected. And people actually don&#8217;t care for what you like. They are interested in what you care for, because caring isn&#8217;t pointless, it means you take a stand.]]></description>
			<content:encoded><![CDATA[<p>You can <em>like</em> something and there is nothing you have to do about it. It is an effortless act and there are no explanations required or expected. And people actually don&#8217;t care for what you <em>like</em>. They are interested in what you <em>care for</em>, because caring isn&#8217;t pointless, it means you take a stand.</p>
]]></content:encoded>
			<wfw:commentRss>http://konstruktors.com/blog/the-web/2171-regarding-the-like-button/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
