<?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/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Retina Technology Blog &#187; web development</title>
	<atom:link href="http://www.retina.net/tech/category/web-development/feed" rel="self" type="application/rss+xml" />
	<link>http://www.retina.net/tech</link>
	<description>John Adams' views on emerging technologies, software engineering, and various hacks</description>
	<lastBuildDate>Fri, 16 Sep 2011 09:06:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
	<!-- podcast_generator="podPress/8.8.10.2" -->
	<copyright>2006-2007 </copyright>
	<managingEditor>jna@retina.net (John Adams)</managingEditor>
	<webMaster>jna@retina.net (John Adams)</webMaster>
	<ttl>1440</ttl>
	<image>
		<url>http://www.retina.net/tech/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
		<title>Retina Technology Blog &#187; web development</title>
		<link>http://www.retina.net/tech</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle></itunes:subtitle>
	<itunes:summary>John Adams' views on emerging technologies, software engineering, and various hacks</itunes:summary>
	<itunes:keywords></itunes:keywords>
	<itunes:category text="Technology" />
	<itunes:category text="Technology">
		<itunes:category text="Tech News" />
	</itunes:category>
	<itunes:author>John Adams</itunes:author>
	<itunes:owner>
		<itunes:name>John Adams</itunes:name>
		<itunes:email>jna@retina.net</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://www.retina.net/tech/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<item>
		<title>Photocasting to iPhoto with Ruby</title>
		<link>http://www.retina.net/tech/photocasting-to-iphoto-with-ruby.html</link>
		<comments>http://www.retina.net/tech/photocasting-to-iphoto-with-ruby.html#comments</comments>
		<pubDate>Thu, 01 Jan 2009 04:06:59 +0000</pubDate>
		<dc:creator>John Adams</dc:creator>
				<category><![CDATA[media]]></category>
		<category><![CDATA[rubyrails]]></category>
		<category><![CDATA[stuff]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.retina.net/tech/?p=177</guid>
		<description><![CDATA[Today we&#8217;re going to teach you how to deal with having too many computers. Moving media around is a living hell because iPhoto and iTunes assume that you only ever possess one library. Sure, you can play music and movies purchased in the store on multiple machines, but what about your own library? How do [...]]]></description>
			<content:encoded><![CDATA[<p>Today we&#8217;re going to teach you how to deal with having too many computers. Moving media around is a living hell because iPhoto and iTunes assume that you only ever possess one library. Sure, you can play music and movies purchased in the store on multiple machines, but what about your own library? How do you use that on multiple machines without moving things around?</p>
<p>At home I have a number of Macs, with one large machine (~1.5TB disk, 4 GB RAM) dedicated to digital photo editing. This machine houses a large volume of photos in it&#8217;s &#8220;Final Exports&#8221; folder. It&#8217;s not my main computer &#8211; my main computer is a MacBook Pro which travels with me nearly everywhere, and when I don&#8217;t have that, I have my iPhone.</p>
<p>I want my photos with me everywhere (or, at least, the last few hundred of them) so I can show people the last great event I went to, or that thing in the club that time. Here&#8217;s my solution.</p>
<p>1) Keep the photos on the large machine, where I edit photos in Adobe Lightroom and export them to the &#8220;Final Exports&#8221; folder.</p>
<p>2) Keep the laptop as the primary sync machine for the iPhone</p>
<p>3) Sync the iphone to the laptop, and retrieve the latest photos.</p>
<p>iPhoto 7 has a wonderful feature called Photocasting which will read lists of latest photos from the Internet (say, flickr, for example.) using a format that is very similar to RSS, but completely not compliant with current RSS standards.</p>
<p>The following Ruby script, and ERB template will turn a directory of directories into a pubsub feed for iphoto. You save your files in this form:</p>
<p>Final_Exports/dir1</p>
<p>Final_Exports/dir1/1.jpg</p>
<p>Final_Exports/dir1/2.jpg (and so on&#8230;)</p>
<p>Final_Exports/dir2</p>
<p>Final_Exports/dir&#8230;</p>
<p>Final_Exports/dirN (and so on&#8230;)</p>
<p>I use the scripts to generate RSS, and then put the RSS file somewhere on the Internet (the same directory with the photos works well, as my machines are internet accessible.) Running the script from cron once a day and syncing the phone, keeps you up to date.</p>
<p><strong>Scripts:</strong></p>
<p><a href="http://gw.retina.net/iphotorss/makeiphotorss.rb">makeiphotorss.rb</a></p>
<p><a href="http://gw.retina.net/iphotorss/makeiphotorss.erb">makeiphotorss.erb</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.retina.net/tech/photocasting-to-iphoto-with-ruby.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Improving Javascript Load Times using Google AJAX API</title>
		<link>http://www.retina.net/tech/improving-javascript-load-times-using-google-ajax-api.html</link>
		<comments>http://www.retina.net/tech/improving-javascript-load-times-using-google-ajax-api.html#comments</comments>
		<pubDate>Mon, 22 Sep 2008 20:12:26 +0000</pubDate>
		<dc:creator>John Adams</dc:creator>
				<category><![CDATA[peformance]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pageload]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.retina.net/tech/?p=123</guid>
		<description><![CDATA[If your site uses common AJAX libraries like jQuery, jQuery UI, mootools, prototype, script.aculo.us, or dojo, the first thing that you&#8217;ll notice is that these libraries are quite large and impact page load time. For a browser with a completely empty cache, the browser will load the requested library (and block all other requests during [...]]]></description>
			<content:encoded><![CDATA[<p>If your site uses common AJAX libraries like jQuery, jQuery UI, mootools, prototype, script.aculo.us, or dojo, the first thing that you&#8217;ll notice is that these libraries are quite large and impact page load time.</p>
<p>For a browser with a completely empty cache, the browser will load the requested library (and block all other requests during the load). For every site the user visits, the library is loaded again and again because the cache does not work across sites. Loading site1.com/jquery.js and site2.com/jquery.js takes the same amount of time.</p>
<p>Google&#8217;s come up with a clever solution to this problem. Instead of pointing to your local copy of whatever AJAX library you want, you point to Google&#8217;s copy using their <a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#script_aculo_us">AJAX Libraries API</a>.</p>
<p>There&#8217;s many advantages to this. If the user has been to Gmail or any Google property recently, the library is already loaded in their browser, ready to execute. If the user goes to other sites which use the API, their cache is already primed and does not need to be loaded again. </p>
<p>We&#8217;ve just put this in place over at <a href="http://www.twitter.com">Twitter</a>, and it should improve page load times dramatically.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.retina.net/tech/improving-javascript-load-times-using-google-ajax-api.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ack!</title>
		<link>http://www.retina.net/tech/ack.html</link>
		<comments>http://www.retina.net/tech/ack.html#comments</comments>
		<pubDate>Thu, 17 Jul 2008 07:43:33 +0000</pubDate>
		<dc:creator>John Adams</dc:creator>
				<category><![CDATA[peformance]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[systems administration]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.retina.net/tech/?p=71</guid>
		<description><![CDATA[I&#8217;ve been experimenting with a few things this week while trying to wade my way through Twitter&#8217;s infrastructure. One tool that&#8217;s been of extreme help in digging through source code and an extensive set of configuration files has been ack! It&#8217;s the only piece of software I know of that has &#8216;&#8211;thpppt&#8217; as an option [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been experimenting with a few things this week while trying to wade my way through <a href="http://www.twitter.com">Twitter&#8217;s</a> infrastructure. One tool that&#8217;s been of extreme help in digging through source code and an extensive set of configuration files has been <a href="http://petdance.com/ack/">ack!</a></p>
<p>It&#8217;s the only piece of software I know of that has &#8216;&#8211;thpppt&#8217; as an option (Install it, and you&#8217;ll see.) It&#8217;s an optimized replacement for many of your favorite awk | grep | sed combinations, and includes syntax highlighting. </p>
<p>In other news, I&#8217;ve resolved a number of bugs and issued new code for running <a href="http://code.google.com/p/modtelemetry">mod_telemetry</a> on 64-bit Linux. Check out the SVN trunk for the latest branch. The data that this module has been providing to me has been invaluable for researching slow points in the back end.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.retina.net/tech/ack.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Announcing the release of Mod_Telemetry</title>
		<link>http://www.retina.net/tech/announcing-the-release-of-mod_telemetry.html</link>
		<comments>http://www.retina.net/tech/announcing-the-release-of-mod_telemetry.html#comments</comments>
		<pubDate>Thu, 10 Jul 2008 02:17:54 +0000</pubDate>
		<dc:creator>John Adams</dc:creator>
				<category><![CDATA[operations]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[mod_telemetry]]></category>

		<guid isPermaLink="false">http://www.retina.net/tech/?p=69</guid>
		<description><![CDATA[I&#8217;m releasing my apache module which has been extremely helpful to me in performance tracking, and large site analysis. mod_telemetry keeps track of all URLs on your site and how long it takes your server to deliver each request. It reports these by using a status handler (like Apache&#8217;s /server-status) to display real-time status information [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m releasing my apache module which has been extremely helpful to me in performance tracking, and large site analysis.</p>
<p>mod_telemetry keeps track of all URLs on your site and how long it takes your server to deliver each request. It reports these by using a status handler (like Apache&#8217;s /server-status) to display real-time status information about the performance of your site.</p>
<p>It is extremely useful in optimizing back-end processes (for example, when connecting to Java, FastCGI, or Ruby back-ends) to identify when specific pages are performing slowly.</p>
<p>Because it runs in the server, it&#8217;s able to show end-to-end performance on each request</p>
<p>It requires that mod_status be enabled to work.</p>
<p>An initial version of this <a href="http://code.google.com/p/modtelemetry/">code is available on google code</a>. Please help me debug and expand it&#8217;s capabilities.</p>
<p>I recommend you checkout the SVN trunk and not download the tar. It works with Apache 2.x and 2.2.x.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.retina.net/tech/announcing-the-release-of-mod_telemetry.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zvents &#8211; the Little Google That Could</title>
		<link>http://www.retina.net/tech/zvents-the-little-google-that-could.html</link>
		<comments>http://www.retina.net/tech/zvents-the-little-google-that-could.html#comments</comments>
		<pubDate>Tue, 29 Apr 2008 09:40:07 +0000</pubDate>
		<dc:creator>John Adams</dc:creator>
				<category><![CDATA[socialmedia]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://www.retina.net/tech/?p=46</guid>
		<description><![CDATA[Around here at the PornJob, we do a fair amount of research into building very large, very scalable systems to deliver lots of media content to thousands of users. We&#8217;re always trying to solve the same problem, over and over, though: How do we store hundreds of thousands of movies in a redundant, distributed fashion [...]]]></description>
			<content:encoded><![CDATA[<p>Around here at the PornJob, we do a fair amount of research into building very large, very scalable systems to deliver lots of media content to thousands of users. We&#8217;re always trying to solve the same problem, over and over, though:</p>
<p>How do we store hundreds of thousands of movies in a redundant, distributed fashion across many data centers, and bring users to that content quickly?</p>
<p>There&#8217;s lots of ways to do this. Rsync, automated copies, directory analysis, usage pattern analysis, etc. Most of them have the same problem: Moving data takes time. </p>
<p>But have you looked at zvents? Their recent work on <a href="http://hypertable.org/">hypertable</a> shows that they can make things happen, and that their strength lies in their engineering and not their domain name.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.retina.net/tech/zvents-the-little-google-that-could.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CommunityOne</title>
		<link>http://www.retina.net/tech/communityone.html</link>
		<comments>http://www.retina.net/tech/communityone.html#comments</comments>
		<pubDate>Sat, 12 Apr 2008 02:51:34 +0000</pubDate>
		<dc:creator>John Adams</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[systems administration]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.retina.net/tech/?p=47</guid>
		<description><![CDATA[Sun Microsystems is hosting CommunityOne, a free tech conference at The Moscone Center, San Francisco. If you&#8217;d like to go for free, please register at http://developers.sun.com/events/communityone and use registration ID number W1082146 ! It&#8217;s on May 5th, 2008, only three weeks away! Some info, follows, courtesy of the Sun site: Join experts and contributors from [...]]]></description>
			<content:encoded><![CDATA[<p>Sun Microsystems is hosting CommunityOne, a free tech conference at The Moscone Center, San Francisco. If you&#8217;d like to go for free, please register at http://developers.sun.com/events/communityone and use registration ID number W1082146 !</p>
<p>It&#8217;s on May 5th, 2008, only three weeks away!</p>
<p>Some info, follows, courtesy of the Sun site:</p>
<p>Join experts and contributors from dozens of free and open source projects driving innovation today. Gain skills and find solutions to advance your infrastructure, develop next-generation applications, and create compelling web experiences. Choose from 70+ sessions led by experts from 30+ communities on OSes, databases, web and app servers, scripting, Web 2.0, and more</p>
]]></content:encoded>
			<wfw:commentRss>http://www.retina.net/tech/communityone.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google AppEngine</title>
		<link>http://www.retina.net/tech/google-appengine.html</link>
		<comments>http://www.retina.net/tech/google-appengine.html#comments</comments>
		<pubDate>Tue, 08 Apr 2008 07:13:14 +0000</pubDate>
		<dc:creator>John Adams</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[systems administration]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[appengine]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.retina.net/tech/?p=42</guid>
		<description><![CDATA[This evening at the second Google Campfire, they released their Amazon EC2/S3 killer, Google AppEngine. Based in Python (2.5.2 required), It&#8217;s a developer tool that gives access to Google&#8217;s computing infrastructure and BigTable, the distributed database that Google runs on.  From their blog, it features: Dynamic webserving, with full support of common web technologies Persistent [...]]]></description>
			<content:encoded><![CDATA[<p>This evening at the second Google Campfire, they released their Amazon EC2/S3 killer, Google <a href="http://code.google.com/appengine/">AppEngine</a>. Based in Python (2.5.2 required), It&#8217;s a developer tool that gives access to Google&#8217;s computing infrastructure and BigTable, the distributed database that Google runs on. </p>
<p>From their <a href="http://googleappengine.blogspot.com/">blog</a>, it features:</p>
<ul>
<li>Dynamic webserving, with full support of common web technologies</li>
<li>Persistent storage (powered by Bigtable and GFS with queries, sorting, and transactions)</li>
<li>Automatic scaling and load balancing</li>
<li>Google APIs for authenticating users and sending email</li>
<li>A Fully featured local development environment</li>
</ul>
<p>Unlike Amazon, they don&#8217;t give you a virtual machine image to work on. They run the application code for your app, and deal with everything else. All you&#8217;re maintaining is code, and small initial applications are free!</p>
<p>I&#8217;d love to try it out, but within hours, the first 10,000 developer signups were gone.</p>
<p><a href="http://youtube.com/watch?v=3Ztr-HhWX1c">Google AppEngine Intro Video</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.retina.net/tech/google-appengine.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Piclens Rocks!</title>
		<link>http://www.retina.net/tech/piclens-rocks.html</link>
		<comments>http://www.retina.net/tech/piclens-rocks.html#comments</comments>
		<pubDate>Fri, 04 Apr 2008 00:55:17 +0000</pubDate>
		<dc:creator>John Adams</dc:creator>
				<category><![CDATA[photography]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://www.retina.net/tech/?p=23</guid>
		<description><![CDATA[At yesterday&#8217;s SFBETA meetup, I had the chance to play with PicLens, a dynamic system for displaying images in your browser, all pulled from the APIs of various web sites. It works as an adjunct to your existing browser, installing as a plugin (written in C++, or so the developer tells me.) If you connect [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>At yesterday&#8217;s <a href="http://www.sfbeta.com/">SFBETA</a> meetup, I had the chance to play with <a href="http://www.piclens.com/">PicLens</a>, a dynamic system for displaying images in your browser, all pulled from the APIs of various web sites.</p>
<p>It works as an adjunct to your existing browser, installing as a plugin (written in C++, or so the developer tells me.)</p>
<p>If you connect to a supported site, such as Google Images, Yahoo Images, Flickr, Photobucket, Smugmug, or Deviant Art, and hover over an image, you&#8217;ll see a small play icon on images from those sites, injected by the plugin. Click the plugin, and you&#8217;re greeted with an absolutely gorgeous, high-speed 3-d/2-d browser that allows you to cycle through all of the images in that set in full-screen glory:</p>
<p><a href="http://www.retina.net/tech/wp-content/uploads/2008/04/out.png"><img class="alignnone size-medium wp-image-22" title="PicLens Sample" src="http://www.retina.net/tech/wp-content/uploads/2008/04/out-300x240.png" alt="" width="300" height="240" /></a></p>
<p>There is also support for direct RSS feeds, if you want to <a href="http://www.piclens.com/lite/wordpress.php">pull images from your blog</a> directly.</p>
<p>The real impact of this system is being able to view so many photos at once. It rapidly exposes you to what these sites have to offer, and the search engine makes searching for recent events even more compelling. Additionally, there&#8217;s a search box in the upper right which can be used to search all six of the supported sites within the application, in case you don&#8217;t see what you like.</p>
<p>The application appears to be made of pure, futuristic goodness, with web2.0 reflections all over the bottom of the flying images, direct click and zoom selection of images, and really, this is what I expected the internet future to look like. Why do we not have enough 3d browsers?</p>
<p>Words are not going to do this app justice. Just download it now and check it out. It&#8217;s not supported in Safari 3.1 or firefox 3 yet, so you&#8217;ll have to run an older copy of your browser to use the plugin. Updated copies will be available soon for those browsers, so never fear.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.retina.net/tech/piclens-rocks.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Site Insecurity</title>
		<link>http://www.retina.net/tech/site-insecurity.html</link>
		<comments>http://www.retina.net/tech/site-insecurity.html#comments</comments>
		<pubDate>Mon, 07 Jan 2008 21:32:23 +0000</pubDate>
		<dc:creator>John Adams</dc:creator>
				<category><![CDATA[application security]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[Cross Site Scripting]]></category>
		<category><![CDATA[XREF]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://www.retina.net/tech/site-insecurity.html</guid>
		<description><![CDATA[Over at Chris Shiflett&#8217;s blog (he&#8217;s the author of Essential PHP Security) he&#8217;s got a nice writeup on foiling cross-site scripting attacks on web sites. While this is an older article ( from 2004 ), it still addresses many dangerous issues that developers continue to create in production code. One of our developers here recently [...]]]></description>
			<content:encoded><![CDATA[<p>Over at Chris Shiflett&#8217;s blog (he&#8217;s the author of <a href="http://phpsecurity.org/">Essential PHP Security</a>) he&#8217;s got a <a href="http://shiflett.org/articles/foiling-cross-site-attacks" title="Foiling Cross Site Scripting Attacks">nice writeup</a> on foiling cross-site scripting attacks on web sites.</p>
<p>While this is an older article ( from 2004 ), it still addresses many dangerous issues that developers continue to create in production code.</p>
<p>One of our developers here recently wrote a fairly large scripting system to deliver advertising to customers that was vulnerable to at least four XSS attacks, and I spent a fair amount of time sanitizing input and securing her code.</p>
<p>Do you accept input from users? Are you ensuring that you strip_tags (to block XSS/XSRF), escaping strings (to block SQL injection) and sanitizing all user input before storing or displaying it? If not, you might be vulnerable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.retina.net/tech/site-insecurity.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

