<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>JZ * LABS - the web experiment playground of jason ting</title>
	
	<link>http://www.jzlabs.com</link>
	<description>the web experiment playground of jason ting</description>
	<pubDate>Fri, 05 Mar 2010 23:45:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/jzlabs" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="jzlabs" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Good Word - now with definitions!</title>
		<link>http://www.jzlabs.com/2010/03/05/good-word-now-with-definitions/</link>
		<comments>http://www.jzlabs.com/2010/03/05/good-word-now-with-definitions/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 23:44:35 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/?p=326</guid>
		<description><![CDATA[

Some folks have mentioned that Word With Friends already checks words, so why make Good Word?  I created Good Word to scratch an itch: I wanted to quickly make sure a word was valid if it wasn't my turn to play, and if it was my turn to make sure a word was valid [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://itunes.apple.com/us/app/good-word-words-with-friends/id358081131?mt=8" target="_blank"><br />
<img src="http://www.jzlabs.com/wp-content/uploads/2010/02/as_available_appstore_icon_20091006.png" alt="as_available_appstore_icon_20091006" title="as_available_appstore_icon_20091006" width="160" height="61" class="alignnone size-full wp-image-314" /></a></p>
<p>Some folks have mentioned that Word With Friends already checks words, so why make Good Word?  I created Good Word to scratch an itch: I wanted to quickly make sure a word was valid if it wasn't my turn to play, and if it <em>was</em> my turn to make sure a word was valid before committing.  The latest update (available now!) scratches another itch: so I know a word is valid--but what does it mean?</p>
<p>So, I've added a quick definition view to Good Word. It's perfect for those times when you're playing someone who puts down an obscure word and you're asking yourself "what does it mean?!"  </p>
<p>I wanted to keep the app clean and simple while fast and functional. After you search for a valid word, the keyboard disappears to reveal the word's definition, keeping everything on one screen.  If you prefer not to see the definitions upon checking, there is a toggle in the application settings to turn them off.</p>
<p><embed src="http://jzlabs.com/stuff/goodword.mov" autoplay="false" height="871" width="437"></embed></p>
<p>As I mentioned before, I'm planning on expanding Good Word to be a more full-featured word training tool by adding features like "save word" so you can quickly review words you want to learn or remember.  Stay tuned for more updates! I'm a proponent of the "release early and often" philosophy, so if you guys have any features you'd like to see, let me know.</p>
<p>Last thing: I have more promo codes to give away, so if you're interested please let me know!</p>
<p><a href="http://itunes.apple.com/us/app/good-word-words-with-friends/id358081131?mt=8" target="_blank"><br />
<img src="http://www.jzlabs.com/wp-content/uploads/2010/02/as_available_appstore_icon_20091006.png" alt="as_available_appstore_icon_20091006" title="as_available_appstore_icon_20091006" width="160" height="61" class="alignnone size-full wp-image-314" /></a></p>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/N6fYDCRDQis" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2010/03/05/good-word-now-with-definitions/feed/</wfw:commentRss>
<enclosure url="http://jzlabs.com/stuff/goodword.mov" length="8771108" type="video/quick" />
		</item>
		<item>
		<title>Good Word - Words With Friends Word Checker</title>
		<link>http://www.jzlabs.com/2010/02/25/good-word-words-with-friends-word-checker/</link>
		<comments>http://www.jzlabs.com/2010/02/25/good-word-words-with-friends-word-checker/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 07:29:53 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/?p=310</guid>
		<description><![CDATA[Update: Version 1.1 available, now with definitions!


I'm excited to announce my first personal app in the App Store!  Good Word is a quick and simple app to check if a word is valid in Words With Friends.



Good Word uses the Words With Friends dictionary, a modified version of the ENABLE (Enhanced North American Benchmark [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://www.jzlabs.com/2010/03/05/good-word-now-with-definitions/">Update: Version 1.1 available, now with definitions!</a></strong></p>
<p><a href="http://itunes.apple.com/us/app/good-word-words-with-friends/id358081131?mt=8" target="_blank"><br />
<img src="http://www.jzlabs.com/wp-content/uploads/2010/02/as_available_appstore_icon_20091006.png" alt="as_available_appstore_icon_20091006" title="as_available_appstore_icon_20091006" width="160" height="61" class="alignnone size-full wp-image-314" /></a></p>
<p>I'm excited to announce my first personal app in the App Store!  Good Word is a quick and simple app to check if a word is valid in Words With Friends.</p>
<p><img src="http://www.jzlabs.com/wp-content/uploads/2010/02/primary.png" alt="primary" title="primary" width="320" height="460" class="alignnone size-full wp-image-311" /><br />
<img src="http://www.jzlabs.com/wp-content/uploads/2010/02/good.png" alt="good" title="good" width="320" height="460" class="alignnone size-full wp-image-313" /><br />
<img src="http://www.jzlabs.com/wp-content/uploads/2010/02/bad.png" alt="bad" title="bad" width="320" height="460" class="alignnone size-full wp-image-312" /></p>
<p>Good Word uses the Words With Friends dictionary, a modified version of the ENABLE (Enhanced North American Benchmark Lexicon) word list.  I'll be keeping Good Word up to date whenever Word With Friends modifies their dictionary.</p>
<p>I'm planning on making Good Word a more robust word training tool by adding definitions, saved words, etc.  Any other suggestions are welcome!</p>
<p><a href="http://itunes.apple.com/us/app/good-word-words-with-friends/id358081131?mt=8" target="_blank"><br />
<img src="http://www.jzlabs.com/wp-content/uploads/2010/02/as_available_appstore_icon_20091006.png" alt="as_available_appstore_icon_20091006" title="as_available_appstore_icon_20091006" width="160" height="61" class="alignnone size-full wp-image-314" /></a></p>
<p>Thanks to <a href="http://www.clemish.com/">Clement</a> for helping design a great icon and UI!</p>
<p>Also...I have a limited number of promo codes to give away...let me know if you'd like one!</p>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/72ioGwvtIYw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2010/02/25/good-word-words-with-friends-word-checker/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Facebook App Development gotchas</title>
		<link>http://www.jzlabs.com/2010/02/19/facebook-app-development-gotchas/</link>
		<comments>http://www.jzlabs.com/2010/02/19/facebook-app-development-gotchas/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 07:09:23 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/?p=307</guid>
		<description><![CDATA[While developing a Facebook app earlier this week, I ran into a number of gotchas that make developing for Facebook just a bit more painful:

If you're developing within an FBML canvas page, you have to adjust your javascript to conform to FBJS.  FBJS does a number of things--itwill prepend all your variables and function [...]]]></description>
			<content:encoded><![CDATA[<p>While developing a Facebook app earlier this week, I ran into a number of gotchas that make developing for Facebook just a bit more painful:</p>
<ul>
<li>If you're developing within an FBML canvas page, you have to adjust your javascript to conform to <a href="http://wiki.developers.facebook.com/index.php/FBJS">FBJS</a>.  FBJS does a number of things--itwill prepend all your variables and function names with your appid, setting/getting object properties are done through custom methods, you can't create new elements in the DOM, etc.  If you need to use heavy javascript, it would be easier to use an iframe-based application.</li>
<li>If you're developing a tab-based application, it will start in "passive mode" , which means your Flash and javascript won't run until the user interacts with your page.  This means you can't use onload javascript methods until a user clicks something.  This was very frustrating because some javascript I adapted to FBJS (to create pretty checkboxes) didn't end up working at all.</li>
<li>Also on a tab-based application, your image assets will be cached by Facebook's image proxy cache.  For some reason, the proxy cache was really flaky earlier in the week; it would  randomly show some assets but fail to load others and would vary on computer to computer and browser to browser.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/zIQaXmPm1Ys" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2010/02/19/facebook-app-development-gotchas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>StoreKit SKErrorUnknown</title>
		<link>http://www.jzlabs.com/2010/02/19/storekit-skerrorunknown/</link>
		<comments>http://www.jzlabs.com/2010/02/19/storekit-skerrorunknown/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 06:53:47 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/?p=305</guid>
		<description><![CDATA[I've been trying to integrate StoreKit for in-app purchases for a project at work.  I opted to use Urban Airship because they provide a nice interface to upload content as well as a drop-in storefront interface.
Anyway, I was having no problems getting their sample client to work, but when I tried to integrate it [...]]]></description>
			<content:encoded><![CDATA[<p>I've been trying to integrate StoreKit for in-app purchases for a project at work.  I opted to use <a href="http://urbanairship.com/">Urban Airship</a> because they provide a nice interface to upload content as well as a drop-in storefront interface.</p>
<p>Anyway, I was having no problems getting their sample client to work, but when I tried to integrate it into my app and purchase an item, I would get the message "Transaction Failed (0)", indicating an SKErrorUnknown error (thanks, Apple).  </p>
<p>After hours of searching and emailing around for a solution, I finally realized that it must be something specific to my app.  I discovered that my Info.plist file had a variable in the bundle version field that wasn't getting set.  Apparently StoreKit needs an app's bundle version to work properly...changing it to "1.0" made it work!</p>
<p>Hopefully this will save someone from a few hours of frustration!</p>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/eUIHXnvDYpU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2010/02/19/storekit-skerrorunknown/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flickr Original updated to 1.0.4</title>
		<link>http://www.jzlabs.com/2009/12/30/flickr-original-updated-to-104/</link>
		<comments>http://www.jzlabs.com/2009/12/30/flickr-original-updated-to-104/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 11:52:42 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/?p=283</guid>
		<description><![CDATA[Download Flickr Original 1.0.4
Edit:
Sorry guys, I stand corrected. Upon further investigation, the Flickr slideshow queries the API with their own special API key that expires every so often (daily, I assume).  It's only when using this special API key that we can see the originalsecret and original format parameters.  
If the extension has [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://jzlabs.com/stuff/flickr_original_1.0.4.xpi">Download Flickr Original 1.0.4</a></strong></p>
<p><strong>Edit:</strong><br />
Sorry guys, I stand corrected. Upon further investigation, the Flickr slideshow queries the API with their own special API key that expires every so often (daily, I assume).  It's only when using this special API key that we can see the originalsecret and original format parameters.  </p>
<p>If the extension has stopped working for you ("Sorry, Flickr Original could not view/download this photo."), it's because the special API key had expired.  Please clear your cache (Firefox caches extension downloads) and re-download the extension which I've reverted it to use my own API key.</p>
<p>So...unfortunately, the ability to "view/download original images even if a user has disabled image downloading—provided that the original image's max dimension is less than 1280px" isn't going to be possible unless I can figure out a way to grab Flickr's special API key every time it changes.</p>
<p>Also, It looks like Flickr has changed the photos.getSizes API to not show the original size if the max image dimension <= 1280px.</p>
<p><del datetime="2009-12-31T04:06:57+00:00">I've made yet another update to Flickr Original!  Thanks to an idea from Клименков Константин, you are now able to view/download original images <em>even if a user has disabled image downloading</em>&mdash;provided that the original image's max dimension is less than 1280px.  </p>
<p><strong>Example:</strong><br />
On <a href="http://www.flickr.com/photos/22205136@N03/3687670169/" target="_blank">this photo</a>, you'll see that the "all sizes" option is not available because the owner has disabled photo downloads in their <a href="http://www.flickr.com/account/prefs/downloads/?from=privacy" target="_blank">privacy settings</a>. However, when you hit the "view as slideshow" button, the slideshow shows the original image.  Looking at the net traffic in Firebug, we can see that the slideshow is calling the Flickr API with the photos.getInfo method.  </p>
<p>Upon further investigation, it turns out that the <a href="http://www.flickr.com/services/api/flickr.photos.getInfo.html" target="_blank">photos.getInfo API</a> returns two extra fields (originalsecret and originalformat) if the original image's max dimension is less than 1280px, <strong><em>even if</em></strong> the user has disabled image downloading.  It's also interesting to note that querying an image's large size with photos.getSizes API returns an image cropped to 1024x____ if the original size max dimension is > 1280 but returns the original image if the the original size max dimension <= 1280.  </del></p>
<p><strong>In light of this, the extension has been updated to do the following:</strong></p>
<ul>
<li>Checks if an image has an original size available with the photos.getInfo method by checking if the originalsecret parameter exists</li>
<li>If so, manually constructs the original image url in the format http://farm{FARM}.static.flickr.com/{SERVER}/{ID}_{ORIGINALSECRET}.{ORIGINALFORMAT} so it doesn't need to make an extra API call to photo.getSizes</li>
<li>If the photo does <strong><em>not</em></strong> have originalsecret set, it is because a) the original image's max dimension is greater than 1280px <strong><em>and</em></strong> b) the owner is not a Flickr pro member or has not enabled downloading of their photos in their privacy settings.  In this case, the extension calls photos.getSizes to get the largest size available.</li>
</ul>
<p><strong>Other updates:</strong></p>
<ul>
<li>The extension will now alert when the original size isn't available</li>
<li>When you are on a photo detail page of a photo that has downloads disabled ("spaceball.gif protected"), the extension now shows the view/download option in the context menu and extracts the Flickr photo id from the browser url</li>
<li>The extension uses JSON.parse instead of eval() for security purposes</li>
</ul>
<p><strong>Known issues:</strong></p>
<ul>
<li>The extension won't show view/download in the context menu on a photo detail page if you a) right-click on a portion of the image where there is a note (<a href="http://www.flickr.com/photos/lovepinlac/4200417850/" target="_blank">example</a>) or b) the image is yours and you are logged in. To get around this, right-click where there is no note or on the image thumbnail instead.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/M7QP0bGsbPo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2009/12/30/flickr-original-updated-to-104/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Prowler 1.0.1</title>
		<link>http://www.jzlabs.com/2009/12/26/prowler-101/</link>
		<comments>http://www.jzlabs.com/2009/12/26/prowler-101/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 04:27:00 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/?p=273</guid>
		<description><![CDATA[I've updated the Prowler extension to make the API call in the extension instead of relying on a web service.  Please upgrade for improved performance and reliability!
Download Prowler 1.0.1
The web service (hosted on Heroku) will still be available for those running older versions of the extension.
View the original Prowler post
]]></description>
			<content:encoded><![CDATA[<p>I've updated the Prowler extension to make the API call in the extension instead of relying on a web service.  Please upgrade for improved performance and reliability!</p>
<p><a href="http://jzlabs.com/stuff/prowler_1.0.1.xpi">Download Prowler 1.0.1</a></p>
<p>The web service (hosted on <a href="http://heroku.com">Heroku</a>) will still be available for those running older versions of the extension.</p>
<p><a href="http://www.jzlabs.com/2009/07/13/prowler-a-firefox-extension-to-quickly-send-selected-text-to-prowl/">View the original Prowler post</a></p>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/S378OjBlsNk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2009/12/26/prowler-101/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flickr Original 1.0.3</title>
		<link>http://www.jzlabs.com/2009/12/26/flickr-original-103/</link>
		<comments>http://www.jzlabs.com/2009/12/26/flickr-original-103/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 04:26:05 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/?p=271</guid>
		<description><![CDATA[(UPDATE: Version 1.0.4 available!)
I've updated the Flickr Original extension to use XMLHttpRequest instead of depending on a web service.  It should be faster now since the API logic had been moved to the browser.
Download Flickr Original 1.0.3
The web service (now running on node.js) will still be available for those running older versions of the [...]]]></description>
			<content:encoded><![CDATA[<p><strong>(UPDATE: <a href="http://www.jzlabs.com/2009/12/30/flickr-original-updated-to-104/">Version 1.0.4 available!</a>)</strong></p>
<p>I've updated the Flickr Original extension to use XMLHttpRequest instead of depending on a web service.  It should be faster now since the API logic had been moved to the browser.</p>
<p><a href="http://jzlabs.com/stuff/flickr_original_1.0.3.xpi">Download Flickr Original 1.0.3</a></p>
<p>The web service (<a href="http://www.jzlabs.com/2009/12/25/trying-out-nodejs/">now running on node.js</a>) will still be available for those running older versions of the extension.</p>
<p><a href="http://www.jzlabs.com/2008/12/16/firefox-extension-flickr-original/">View the initial Flickr Original post</a></p>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/mgDEArgJyBw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2009/12/26/flickr-original-103/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Trying out Node.js</title>
		<link>http://www.jzlabs.com/2009/12/25/trying-out-nodejs/</link>
		<comments>http://www.jzlabs.com/2009/12/25/trying-out-nodejs/#comments</comments>
		<pubDate>Fri, 25 Dec 2009 22:49:20 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/?p=261</guid>
		<description><![CDATA[Node.js ("evented I/O for V8 javascript") lets you use non-blocking callbacks to improve concurrency and performance of your app.  I decided to give it a try by rewriting my Flickr Original webservice since the current Merb-based version didn't do too well when pounded--my load averages spiked fairly often and the Merb master process would [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nodejs.org/" target="_blank">Node.js</a> ("evented I/O for V8 javascript") lets you use non-blocking callbacks to improve concurrency and performance of your app.  I decided to give it a try by rewriting my Flickr Original webservice since the current Merb-based version didn't do too well when pounded--my load averages spiked fairly often and the Merb master process would get bloated into the hundreds of MB whenever I had a lot of requests coming in.  </p>
<p>In the Merb version, the method calling the Flickr API blocks, causing the app to throw 5xx errors when there are too many requests for Merb to handle.</p>
<p>Using Node, I put the Flickr API call in a block with a callback that is triggered when the API returns a result.  By doing this, the program doesn't have to wait for the API to accept another request.  This results in being able to serve <em>many</em> more requests, as shown in the benchmark below (on my local machine - 2.16ghz intel core2 duo 2gb RAM).</p>
<p>This test simulates 80 concurrent connections:<br />
<strong><br />
Merb:</strong></p>
<pre>$ httperf --server localhost --port 4000 --uri /view/4067830120 --num-conn 80 --rate 80
Total: connections 80 requests 80 replies 80 test-duration 11.665 s

Connection rate: 6.9 conn/s (145.8 ms/conn, <=80 concurrent connections)
Connection time [ms]: min 3912.1 avg 8397.8 max 11239.2 median 9315.5 stddev 2605.9
Connection time [ms]: connect 0.0
Connection length [replies/conn]: 1.000

Request rate: 6.9 req/s (145.8 ms/req)
Request size [B]: 75.0

Reply rate [replies/s]: min 0.6 avg 4.0 max 7.4 stddev 4.8 (2 samples)
Reply time [ms]: response 7264.0 transfer 1133.8
Reply size [B]: header 161.0 content 104792.0 footer 0.0 (total 104953.0)
Reply status: 1xx=0 2xx=1 3xx=5 4xx=0 5xx=74

CPU time [s]: user 0.47 system 9.76 (user 4.0% system 83.6% total 87.6%)
Net I/O: 703.4 KB/s (5.8*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0</pre>
<p><strong>Node:</strong></p>
<pre>$ httperf --server localhost --port 9900 --uri /view/4067830120 --num-conn 80 --rate 80
Total: connections 80 requests 80 replies 80 test-duration 1.182 s

Connection rate: 67.7 conn/s (14.8 ms/conn, <=20 concurrent connections)
Connection time [ms]: min 177.0 avg 200.0 max 257.6 median 196.5 stddev 17.0
Connection time [ms]: connect 0.1
Connection length [replies/conn]: 1.000

Request rate: 67.7 req/s (14.8 ms/req)
Request size [B]: 75.0

Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (0 samples)
Reply time [ms]: response 199.8 transfer 0.0
Reply size [B]: header 128.0 content 106.0 footer 0.0 (total 234.0)
Reply status: 1xx=0 2xx=80 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.14 system 1.00 (user 11.8% system 84.7% total 96.5%)
Net I/O: 20.4 KB/s (0.2*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
</pre>
<p>Node smokes Merb at 67.7 req/s vs 6.9 req/s!  We can see that Merb could definitely not keep up with 80 concurrent requests, returning 5xx on 74/80 requests, while Node was able to serve almost 85% of the requests in the first second.  </p>
<p>I've updated the Flickr Original webservice in production and so far things seem to be running smoothly.</p>
<p>I'm definitely keeping an eye on Node.js and thinking of different applications to take advantage of its event-driven model.</p>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/tRKqzQioukg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2009/12/25/trying-out-nodejs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Basecamp Favorites - Easily generate web shortcuts to all your Basecamp projects</title>
		<link>http://www.jzlabs.com/2009/09/18/basecamp-favorites-easily-generate-web-shortcuts-to-all-your-basecamp-projects/</link>
		<comments>http://www.jzlabs.com/2009/09/18/basecamp-favorites-easily-generate-web-shortcuts-to-all-your-basecamp-projects/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 00:09:39 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/?p=259</guid>
		<description><![CDATA[Ok, this is for the extremely lazy (or efficient, you pick).  With Quicksilver or LaunchBar, you can launch just pretty much everything...so why not open URL links with it?  I use Basecamp on a daily basis and it gets a bit tedious trying to find a specific project, especially if you have a [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, this is for the extremely lazy (or efficient, you pick).  With <a href="http://docs.blacktree.com/quicksilver/overview">Quicksilver</a> or <a href="http://www.obdev.at/products/launchbar/index.html">LaunchBar</a>, you can launch just pretty much everything...so why not open URL links with it?  I use Basecamp on a daily basis and it gets a bit tedious trying to find a specific project, especially if you have a ton of them.</p>
<p>Enter Basecamp Favorites, a simple script to slurp your Basecamp projects and create web shortcuts for them you can quickly launch with Quicksilver/LaunchBar/whatever.</p>
<p><a href="http://jzlabs.com/stuff/basecamp_favorites.zip"><strong>Download basecamp_favorites.zip</strong></a></p>
<p><strong>Requirements:</strong><br />
- Ruby and RubyGems installed<br />
- xml-simple gem (sudo gem install xml-simple)<br />
- API access and https enabled on your Basecamp account</p>
<p><strong>Usage:</strong><br />
1. Setup your Basecamp connection:<br />
  @@session = Basecamp.establish_connection!('YOUR_BASECAMP_URL', 'YOUR_BASECAMP_USER', 'YOUR_BASECAMP_PASSWORD', true)  </p>
<p>Make sure you omit the http/https from the url, the last parameter in the call specifies whether or not to use an https connection.</p>
<p>2. Open up a terminal, cd to the script directory, and:<br />
  ruby favorites.rb</p>
<p>Your shortcuts will be generated in the same folder you run the script. You can re-run the script whenever you want, and for bonus points, you can set up a cron job to periodically run the script to catch new projects that have been added.</p>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/8KKg15Xi6Rw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2009/09/18/basecamp-favorites-easily-generate-web-shortcuts-to-all-your-basecamp-projects/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to send text from any application to Prowl</title>
		<link>http://www.jzlabs.com/2009/07/21/how-to-send-text-from-any-application-to-prowl/</link>
		<comments>http://www.jzlabs.com/2009/07/21/how-to-send-text-from-any-application-to-prowl/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 04:13:21 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jzlabs.com/2009/07/21/how-to-send-text-from-any-application-to-prowl/</guid>
		<description><![CDATA[This post is a follow-up to Prowler, my Firefox extension that lets you send selected text to Prowl.
I thought it would be nice to be able to send text from any application to Prowl, say if a friend sent you directions via IM or you need to send text from a Word file.
This assumes you [...]]]></description>
			<content:encoded><![CDATA[<p>This post is a follow-up to <a href="http://www.jzlabs.com/2009/07/13/prowler-a-firefox-extension-to-quickly-send-selected-text-to-prowl/" target="_blank">Prowler</a>, my Firefox extension that lets you send selected text to Prowl.</p>
<p>I thought it would be nice to be able to send text from <em>any</em> application to Prowl, say if a friend sent you directions via IM or you need to send text from a Word file.</p>
<p>This assumes you have <a href="http://www.blacktree.com/" target="_blank">Quicksilver</a> installed.</p>
<p><strong>Setup:</strong><br />
1) Install the growlnotify utility by running ./install.sh within the growlnotify directory [<a href="http://jzlabs.com/stuff/growlnotify.zip">download</a>]<br />
2) Download <a href="http://jzlabs.com/stuff/prowl.sh">this shell script</a> somewhere (I put mine in my Documents folder) and chmod 777 the file.  This script sends any text in your clipboard to the growlnotify command line tool.<br />
3) In Quicksilver Triggers (⌘'), add a new hotkey command<br />
<img src="http://www.jzlabs.com/wp-content/uploads/2009/07/picture-21-300x209.png" alt="picture-21" title="picture-21" width="300" height="209" class="alignnone size-medium wp-image-249" /><br />
4) Start typing "Documents/prowl.sh" and select "Run a shell script"<br />
<img src="http://www.jzlabs.com/wp-content/uploads/2009/07/picture-31-182x300.png" alt="picture-31" title="picture-31" width="182" height="300" class="alignnone size-medium wp-image-250" /></p>
<p>5) Assign a hotkey to the command -- I chose ⌘+Alt+Shift+P</p>
<p><strong>Usage:</strong><br />
To send text to Prowl, just copy (⌘+C) the text you want to send, then hit the hotkey combo you setup to run the shell script.  When you hit the hotkey combo you should see the text in your clipboard pop up in a Growl notification which should be caught and forwarded to Prowl.</p>
<img src="http://feeds.feedburner.com/~r/jzlabs/~4/Pvz364pgYHo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jzlabs.com/2009/07/21/how-to-send-text-from-any-application-to-prowl/feed/</wfw:commentRss>
		</item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.245 seconds -->
