<?xml version="1.0" encoding="UTF-8"?><feed
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:thr="http://purl.org/syndication/thread/1.0"
  xml:lang="en-US"
  xml:base="http://www.johnvey.com/wp-atom.php"
   >
	<title type="text">Johnvey Hwang</title>
	<subtitle type="text">Purveyor of Fine Words</subtitle>

	<updated>2012-12-05T08:46:04Z</updated>

	<link rel="alternate" type="text/html" href="http://www.johnvey.com" />
	<id>http://www.johnvey.com/feed/atom</id>
	<link rel="self" type="application/atom+xml" href="http://www.johnvey.com/feed/atom" />

	<generator uri="http://wordpress.org/" version="3.4.1">WordPress</generator>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[IBM Thinkpad External USB Keyboard with Trackpoint on Windows 8]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2012/12/ibm-thinkpad-external-usb-keyboard-with-trackpoint-on-windows-8" />
		<id>http://www.johnvey.com/?p=307</id>
		<updated>2012-12-05T08:46:04Z</updated>
		<published>2012-12-05T08:46:04Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[Do you have one of the amazing original IBM Thinkpad USB Trackpoint keyboards (Model: SK-8835, P/N: 02R0400) but can't get it to work under Windows 8? After lots of trial and error, I found the right driver set that does the trick. Works The only driver set that works is: Think/Travel USB Keyboard with UltraNav [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2012/12/ibm-thinkpad-external-usb-keyboard-with-trackpoint-on-windows-8"><![CDATA[<p>
Do you have one of the amazing original IBM Thinkpad USB Trackpoint keyboards (Model: SK-8835, P/N: 02R0400) but can't get it to work under Windows 8? After lots of trial and error, I found the right driver set that does the trick.
</p>
<h3>Works</h3>
<p>The only driver set that works is:</p>
<ul>
<li>Think/Travel USB Keyboard with UltraNav TrackPoint/TouchPad driver for Windows Vista</li>
<li>v2kyb03us17.exe</li>
<li>9.1.2.0 14</li>
<li>Mar 2007</li>
</ul>
<p>You can find the download from one of these locations</p>
<ul>
<li><a href="http://support.lenovo.com/en_US/detail.page?LegacyDocID=MIGR-66917">Lenovo Support page</a> (scroll to the bottom)</li>
<li><a href="http://download.lenovo.com/ibmdl/pub/pc/pccbbs/thinkcentre_drivers/v2kyb03us17.exe">Direct download from Lenovo</a></li>
<li><a href="http://stash2.johnvey.com/v2kyb03us17.exe">Local mirror</a></li>
</ul>
<p>Once you have downloaded <code>v2kyb03us17.exe</code>:</p>
<ol>
<li>Run the downloaded file to extract the contents</li>
<li>Do NOT run the first <code>setup.exe</code></li>
<li>Go to: <code>C:\swtools\drivers\KYB\v2kyb03us17\WinWDF\</code></li>
<li>Go to your platform (64 or 32 bit)</li>
<li>Run that <code>setup.exe</code></li>
</ol>

<h3>Do NOT work</h3>
<p>These drivers all had a better Google page rank, but did not work at all for me:</p>
<ul>
<li>tpusbkybdwtrackpoint_108.exe - <a href="http://support.lenovo.com/en_US/detail.page?LegacyDocID=MIGR-73235">http://support.lenovo.com/en_US/detail.page?LegacyDocID=MIGR-73235</a></li>
<li>v5kyb04us17.exe - <a href="http://support.lenovo.com/en_US/detail.page?LegacyDocID=MIGR-66917">http://support.lenovo.com/en_US/detail.page?LegacyDocID=MIGR-66917</a></li>
<li>q2kyb02us13.exe - <a href="http://support.lenovo.com/en_US/downloads/detail.page?DocID=DS013703">http://support.lenovo.com/en_US/downloads/detail.page?DocID=DS013703</a></li>
</ul>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2012/12/ibm-thinkpad-external-usb-keyboard-with-trackpoint-on-windows-8#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2012/12/ibm-thinkpad-external-usb-keyboard-with-trackpoint-on-windows-8/feed/atom" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[King Schmendricks]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2012/08/king-schmendricks" />
		<id>http://www.johnvey.com/?p=294</id>
		<updated>2012-08-23T19:01:44Z</updated>
		<published>2012-08-23T19:01:44Z</published>
		<category scheme="http://www.johnvey.com" term="Food" />		<summary type="html"><![CDATA[Yes this is a $3 bagel, and yes it is really good. Schmendricks is a pop-up bagel shop here in SF that is making all the headlines. Their press page links to most of the coverage from the media. Serious Eats also posted a more in-depth series on their beginnings. Beware that the bagel half-life [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2012/08/king-schmendricks"><![CDATA[<p>
<img src="http://stash1.johnvey.com/images/blog/schmendricks.jpg" alt="A Schmendricks poppy seed bagel with chive cream cheese" width="700" height="457" class="full" />
</p>
<p>
Yes this is a $3 bagel, and yes it is really good.
</p>
<p>
Schmendricks is a pop-up bagel shop here in SF that is making all the headlines. <a href="http://www.schmendricks.com/press/">Their press page</a> links to most of the coverage from the media. Serious Eats also posted a more <a href="http://www.seriouseats.com/2012/06/schmendricks-bagels-shop-san-francisco-david-kover.html">in-depth series on their beginnings</a>.
</p>
<p>
Beware that the bagel half-life is definitely in effect here. As Serious Eats found out when they tried to do <a href="http://newyork.seriouseats.com/2009/10/serious-eats-finds-new-yorks-best-bagel-1.html">head-to-head taste tests in NYC</a>, a bagel will lose most of its awesomeness 30 minutes after it's come out of the oven:
</p>
<blockquote>
Our conclusion? A bagel's half-life, untoasted and unadorned, is no more than half an hour. It was far less than any of us had thought, but after more than thirty minutes, we saw a rapid decline in texture, crust, and even taste. Brooklyn Bagel's initial victory? Simply a matter of freshness.
</blockquote>
<p>
I've tasted Schmendricks bagels at 10, 25, 40, and 90 minutes after they've come out of the oven and absolutely agree that afterthe half hour mark they take a turn for the ordinary. So my advice is this: <strong>eat a Schmendricks bagel while it's still hot and you'll swear you've just had a real bagel for the first time</strong>; eat one after it's cooled and you'll wonder why you didn't spend that $3 at <a href="http://travel.nytimes.com/2007/01/28/travel/28Bite.html">Tartine Bakery</a> instead.
</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2012/08/king-schmendricks#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2012/08/king-schmendricks/feed/atom" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[93% of top passwords appear in LinkedIn leak]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2012/06/93-of-top-passwords-appear-in-linkedin-leak" />
		<id>http://www.johnvey.com/?p=284</id>
		<updated>2012-06-07T18:52:58Z</updated>
		<published>2012-06-07T18:52:58Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[LinkedIn launched itself back into the limelight with yesterday's massive user account security breach. Over 6 million unsalted SHA-1 password hashes were posted online, triggering an orgy of consternation, smugness, and schadenfreude across the geek boards. It was barely a year and a half ago that LinkedIn was in the press because of leaked password [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2012/06/93-of-top-passwords-appear-in-linkedin-leak"><![CDATA[<p>
LinkedIn launched itself back into the limelight with yesterday's <a href="http://nakedsecurity.sophos.com/2012/06/06/millions-of-linkedin-passwords-reportedly-leaked-take-action-now/">massive 
user account security breach</a>. Over 6 million unsalted SHA-1 password hashes were posted online, 
triggering an orgy of <a href="http://thenextweb.com/socialmedia/2012/06/06/bad-day-for-linkedin-6-5-million-hashed-passwords-reportedly-leaked-change-yours-now/#comments">consternation</a>, <a href="http://news.ycombinator.com/item?id=4073309">smugness</a>, 
and <a href="http://www.metafilter.com/116678/Your-LinkedIn-Password">schadenfreude</a> across the geek boards. It was barely a year and a half ago that LinkedIn was in the press because of <a href="http://www.pcmag.com/article2/0,2817,2374375,00.asp">leaked password issues</a> (not their fault)--one would have thought that they would have spent a little time auditing their security procedures. Now Last.fm is <a href="http://www.last.fm/passwordsecurity">reporting their own leak</a> just 24 hours later.
</p>

<p>
I downloaded the hashes and did find my LinkedIn password hash in the dump, though apparently uncracked. You can check yours over at <a href="https://lastpass.com/linkedin/">LastPass</a> or <a href="http://leakedin.org/">LeakedIn.org</a>. Luckily I have unique passwords for all my logins so the damage was minimal. The damage to LinkedIn's reputation though, is not so contained:
</p>
<ul>
    <li>LinkedIn had (or still has) a security hole that allowed someone to gain access to their user account database</li>
	<li>LinkedIn's use of unsalted SHA-1 hashing is <a href="http://www.codinghorror.com/blog/2007/09/rainbow-hash-cracking.html">gross negligence at best</a></li>
	<li>LinkedIn's public incident response was pathetic: <a href="https://twitter.com/LinkedIn/status/210356987576324096">2 tweets</a> and <a href="http://blog.linkedin.com/2012/06/06/updating-your-password-on-linkedin-and-other-account-security-best-practices/">2 blog posts</a> (2 more tweets simply linking to the blog posts)</li>
</ul>
<p>
Luckily LinkedIn search currently shows <a href="http://www.linkedin.com/search/fpsearch?type=people&#038;keywords=director+of+security&#038;pplSearchOrigin=GLHD&#038;pageKey=fps_results">480,153 profile matches for "Director of Security"</a>. Maybe they might want to start cold calling some of them.
</p>


<h3>The File</h3>
<p>
The file that I was able to download off of the torrent sites is a single column dump of SHA-1 hashes that looks like:
</p>
<pre>
00000fac2ec84586f9f5221a05c0e9acc3d2e670
0000022c7caab3ac515777b611af73afc3d2ee50
deb46f052152cfed79e3b96f51e52b82c3d2ee8e
00000dc7cc04ea056cc8162a4cbd65aec3d2f0eb
00000a2c4f4b579fc778e4910518a48ec3d2f111
b3344eaec4585720ca23b338e58449e4c3d2f628
674db9e37ace89b77401fa2bfe456144c3d2f708
37b5b1edf4f84a85d79d04d75fd8f8a1c3d2fbde
00000e56fae33ab04c81e727bf24bedbc3d2fc5a
0000058918701830b2cca174758f7af4c3d30432
</pre>
<p>
<a href="http://news.ycombinator.com/item?id=4073928">The consensus</a> is that all of the hashes that start with <code>00000</code> were artifically masked and have already been cracked. This is supported by the evidence that known common hashes, like for the string <code>password</code>:
</p>
<pre>5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8</pre>
<p>are not in the file, but their masked counterparts:</p>
<pre>000001e4c9b93f3f0682250b6cf8331b7ee68fd8</pre>
<p>are in the file. Initial reports said that 6.5 million hashes were release, but the file that I downloaded was slightly different:</p>
<ul>
	<li>Filename: <strong>SHA1.txt</strong></li>
	<li>Total count: <strong>6,143,150</strong></li>
	<li>Masked hash count: <strong>3,521,180</strong></li>
</ul>
<p>
<p>
So about 57% of the passwords are assumed to have been cracked. I was curious as to what percentage of the most common passwords were present in this dump, as a proxy for gauging the password choices for a supposedly more professional population. A quick search led me to security guy Mark Burnett, who maintains a list of the <a href="http://xato.net/passwords/more-top-worst-passwords">top 10,000 most used passwords</a> across the internet. He admits to some skew caused by a significant amount of <a href="http://xato.net/passwords/how-i-collect-passwords">sourcing from adult websites</a>, but I don't think it really matters.
</p>
<p>
I dumped all the hashes into a <a href="http://redis.io/">Redis instance</a>, produced a list of SHA-1 hashes from Mark's list, and looked for matches on both full and masked hash variants. Here's what I found:
</p>
<ul>
	<li><strong>7,142</strong> of the most common passwords were present</li>
	<li><strong>546</strong> of the most common passwords were not present</li>
	<li><strong>2,312</strong> of the most common passwords were too short for LinkedIn's 6 character minimum</li>
</ul>
<p>
I've posted <a href="/etc/10k_linkedin.csv">my final CSV</a> of the top 10,000 passwords with SHA-1 hashes and their status in the LinkedIn dump. What does it all say? Well, adjusted for the minimum password length:
</p>
<p class="pullquote">
93% of the eligible subset of the 10,000 most common passwords were found in the LinkedIn password leak.
</p>
<p>
Unfortunately, the leaked hashes were only uniques and did not contain any frequency information so I wasn't able to match it to the distribution that Mark reports. Still, this reaffirms that the vast majority of people don't concern themselves with password security. Stop the madness! Generate site-specific passwords and manage them using <a href="http://lastpass.com">LastPass</a>. Sign up for <a href="http://support.google.com/accounts/bin/answer.py?hl=en&#038;answer=180744">two-factor authentication</a> on Google.
</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2012/06/93-of-top-passwords-appear-in-linkedin-leak#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2012/06/93-of-top-passwords-appear-in-linkedin-leak/feed/atom" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[How to block SMS text message spam on Verizon]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2012/05/how-to-block-sms-text-message-spam-on-verizon" />
		<id>http://www.johnvey.com/?p=268</id>
		<updated>2012-05-30T09:38:39Z</updated>
		<published>2012-05-29T22:25:41Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[Are you getting SMS text message spam from 5-digit numbers? These are messages that Verizon complicity sends to you via their "Premium Messaging" service. The good news is that Verizon allows you to block all of these via their website. The bad news is that there are still plenty of SMS spammers that don't route [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2012/05/how-to-block-sms-text-message-spam-on-verizon"><![CDATA[<p>
<img src="http://stash1.johnvey.com/images/blog/verizon-sms.png" width="320" height="263" alt="block verizon sms text message spam" />
</p>
<p>
Are you getting SMS text message spam from 5-digit numbers? These are messages that Verizon complicity sends to you via their "Premium Messaging" service. The good news is that Verizon allows you to block all of these via their website. The bad news is that there are still plenty of SMS spammers that don't route through Verizon's officially sanctioned spam channels and just robo-spam.
</p>
<ol>
<li>Log in to My Verizon</li>
<li>Go to the "Verizon Safeguards" page</li>
<li>Go to the "Service Blocks" page</li>
<li>Check both boxes for "Block Premium Messaging" and "Block Premium Animated Messaging"</li>
</ol>
<p>
<img src="http://stash1.johnvey.com/images/blog/verizon-block-1.png" width="520" height="501" alt="verizon safeguard sms service block options" />
</p>
<p>
Verizon <a href="http://support.verizonwireless.com/faqs/Premium_TXT_and_MMS/faq_premium_txt_and_mms.html">explains "premium messaging"</a> on it's FAQ page:
</p>
<blockquote>
<p>
What is Premium Messaging?
</p>
<p>
Premium Messaging is an option to purchase or subscribe to messaging programs, provided by third party content providers, for premium charges (e.g., charges that are in addition to standard messaging charges). The premium charges for subscriptions recur monthly, while the premium charges for purchases occur only once. Many programs offer both one-time purchases and recurring subscriptions. These programs are initiated through special numbers, which are four, five or six-digit numbers, known as Short Codes.
</p>
<p>
Examples of Premium Messaging programs are:
</p>
<ul>
<li>Interactive voting during TV shows</li>
<li>Purchases of content, such as ringtones, wallpaper or screensavers</li>
<li>Weather alerts, sports score alerts, daily jokes, horoscopes, etc.</li>
<li>Trivia subscriptions</li>
<li>Subscriptions that enable the download of a certain amount of content each month, such as the ability to download 10 ringtones or wallpapers per month</li>
</blockquote>
<p>
Not surprisingly, in 2011 Verizon settled a class action suit where customers were unwittingly signed up for recurring billing for various bullshit services:
</p>
<blockquote>
<p>
Verizon Wireless has learned that some customers may have signed up and been charged for certain third party premium text messaging services based on advertising that did not meet Verizon Wireless’ standards for the disclosure of pricing and subscription information. These charges were for content associated with a company known variously as Cylon, Jawa and/or Eye Level Holdings (although these names may not have appeared on the content or on your bill).
</p>
<p>
-- <a href="https://www.premiumsmsrefunds.com">www.premiumsmsrefunds.com</a>
</p>
</blockquote>
<p>
Read more about the implementation side of <a href="http://developer.verizon.com/content/vdc/en/verizon-platforms/verizon-premium-messaging-overview.html">premium messaging at Verizon's developer site</a>, and from the <a href="http://www.sumotext.com/ShortCodes.html">perspective of Sumotext</a>, a SMS short code provider.
</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2012/05/how-to-block-sms-text-message-spam-on-verizon#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2012/05/how-to-block-sms-text-message-spam-on-verizon/feed/atom" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Comparison of Slicehost vs. Linode VPS Performance]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2011/09/comparison-of-slicehost-vs-linode-vps-performance" />
		<id>http://www.johnvey.com/?p=218</id>
		<updated>2012-04-17T07:27:42Z</updated>
		<published>2011-09-22T06:49:31Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[I had been hosting this site on a 256MB VPS from Slicehost for just over 2 years in their Dallas datacenter. Overall, it was a great service (and a much needed upgrade from Dreamhost), with only 3 unscheduled reboots over those years. However, my weekly monitoring reports from Browsermob never hit 100% uptime across their global [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2011/09/comparison-of-slicehost-vs-linode-vps-performance"><![CDATA[I had been hosting this site on a 256MB VPS from <a href="http://www.slicehost.com/">Slicehost</a> for just over 2 years in their Dallas datacenter. Overall, it was a great service (and a much needed upgrade from Dreamhost), with only 3 unscheduled reboots over those years. However, my weekly monitoring reports from <a href="https://browsermob.com/website-monitoring">Browsermob</a> never hit 100% uptime across their global servers. A typical report looked like this:
<table class="data"><caption>Slicehost (Dallas) VPS weekly uptime</caption>
<tbody>
<tr>
<th>Location</th>
<th>Response Time</th>
<th>Checks</th>
<th>Failures</th>
<th>Availability</th>
</tr>
<tr>
<td>Amsterdam</td>
<td>5.94 secs</td>
<td>192</td>
<td>26</td>
<td>86.5%</td>
</tr>
<tr>
<td>Dallas, TX</td>
<td>1.04 secs</td>
<td>166</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>Dublin, Ireland</td>
<td>2.28 secs</td>
<td>140</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>New York City</td>
<td>6.01 secs</td>
<td>196</td>
<td>33</td>
<td>83.2%</td>
</tr>
<tr>
<td>SF Bay Area, CA</td>
<td>1.3 secs</td>
<td>163</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>Singapore</td>
<td>3.83 secs</td>
<td>170</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>Washington, DC</td>
<td>1.1 secs</td>
<td>174</td>
<td>0</td>
<td>100%</td>
</tr>
</tbody>
</table>
Over 4 months of monitoring, between 1 and 3 locations would fail to reach 100% availability each week. Out of curiosity, I wanted to see if any other VPS service could do any better. I signed up for a <a href="http://www.linode.com">Linode 512 plan</a> and ported over this site, which had the following relevant configuration:
<ul>
	<li>CentOS 5.3</li>
	<li>Apache 2.2</li>
	<li>MySQL 5</li>
	<li>WordPress 2.1</li>
</ul>
The change in the Browsermob profile was immediate. The first full week of running on Linode in their Fremont datacenter looked like this:
<table class="data">
<caption>Linode (Fremont) VPS weekly uptime</caption>
<tbody>
<tr>
<th>Location</th>
<th>Response Time</th>
<th>Checks</th>
<th>Failures</th>
<th>Availability</th>
</tr>
<tr>
<td>Amsterdam</td>
<td>2.06 secs</td>
<td>84</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>Dallas, TX</td>
<td>1.05 secs</td>
<td>84</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>Dublin, Ireland</td>
<td>1.9 secs</td>
<td>83</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>New York City</td>
<td>1.27 secs</td>
<td>84</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>SF Bay Area, CA</td>
<td>672 ms</td>
<td>84</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>Singapore</td>
<td>2.37 secs</td>
<td>84</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>Tokyo</td>
<td>1.58 secs</td>
<td>83</td>
<td>0</td>
<td>100%</td>
</tr>
<tr>
<td>Washington, DC</td>
<td>1.15 secs</td>
<td>84</td>
<td>0</td>
<td>100%</td>
</tr>
</tbody>
</table>
<p>
(The drop in number of checks is due to a drop in the daily allowance for free Browsermob accounts, in addition to an increase of one new location in Tokyo.)
</p>
<p>
Diving into the data some more, I found that the range of response times across the globe were also substantially improved. The response time chart in my profile showed a clear improvement at the time of the switch on July 4:</p>
<p>
<img src="http://stash1.johnvey.com/images/blog/vps-times.png" width="700" height="353" alt="graph of global response times"/>
</p>


<table class="data">
<tr>
<th></th>
<th>Slicehost</th>
<th>Linode</th>
<th>% improvement</th>
</tr>
<tr>
<td>Average response time (ms)</td>
<td>1889</td>
<td>1513</td>
<td>19.91%</td>
</tr>
<tr>
<td>Response time stdev</td>
<td>1161</td>
<td>638.7</td>
<td>44.95%</td>
</tr>
<tr>
<td>Coefficent of variation</td>
<td>0.6141</td>
<td>0.4221</td>
<td>31.26%</td>
</tr>
</table>
<p>
<strong>So, for the same price ($20/month), Linode was able to deliver almost 20% improvement in average global response time along with a much tighter standard deviation.</strong>
</p>
<p>
<em>At the time that I switched, the 256 Slicehost plan cost the same as the 512 Linode plan. Slicehost has since changed their pricing to almost match Linode.</em>
</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2011/09/comparison-of-slicehost-vs-linode-vps-performance#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2011/09/comparison-of-slicehost-vs-linode-vps-performance/feed/atom" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Canon 5D loose mirror replacement]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2011/09/canon-5d-loose-mirror-replacement" />
		<id>http://www.johnvey.com/?p=206</id>
		<updated>2012-04-17T03:11:09Z</updated>
		<published>2011-09-13T06:17:26Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[I was hiking up in Yosemite when at the top of North Dome the mirror in my Canon 5D came unglued and started bouncing around in my camera! I took it to a local camera shop, who quoted a $350 repair (which involved replacing the entire mirror housing), but luckily a bit of interneting yield [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2011/09/canon-5d-loose-mirror-replacement"><![CDATA[<p>
I was hiking up in Yosemite when at the top of North Dome the mirror in my Canon 5D came unglued and started bouncing around in my camera! I took it to a local camera shop, who quoted a $350 repair (which involved replacing the entire mirror housing), but luckily a bit of interneting yield the following <a title="Service Notice: EOS 5D: Main Mirror Detachment" href="http://www.usa.canon.com/cusa/modelServiceAndSupportTab.action?componentCid=0901e024800bf0db&amp;modelId=11933&amp;productOverviewCid=0901e0248003ce56&amp;questionConceptId=49459&amp;questionName=The+main+mirror+has+fallen+out&amp;action=kbSolutionsList&amp;kbSessionId=2">service notice</a> from Canon's astoundingly-difficult-to-bookmark <a href="http://www.usa.canon.com/cusa/support/consumer/eos_slr_camera_systems/eos_digital_slr_cameras/eos_5d#ServiceAndSupport" title="Canon general support">support site</a>:
</p>

<blockquote>
<h3 align="center">Service Notice: EOS 5D: Main Mirror Detachment</h3>

<p>
Thank you for using Canon products.
</p>
<p>
We have discovered that, in rare instances, the main mirror of some EOS 5D Digital SLR cameras may detach due to deterioration in the strength of the adhesive. Accordingly, we would like to convey the details and our service policy concerning this phenomenon.
</p>
<p>
We offer our sincerest apologies to those customers who have been inconvenienced by this issue. Canon always strives to provide the highest quality products to our customers and we will spare no effort in our quality management to make sure our customers can use our products with confidence. We hope our efforts will earn your understanding.
</p>
<p>
<strong>Phenomenon</strong>:
The main mirror of the camera detaches and images cannot be viewed through the viewfinder.
</p>
<p>
<strong>Affected products:</strong>
EOS 5D Digital SLR cameras whose main mirror has detached.
</p>
<p>
<strong>User Support</strong>:
We will repair and reinforce the mirror portion of the affected products free of charge. If you own one of the affected products, please contact our Customer Support Center.
</p>
<p>
We appreciate your patience, and we offer our sincerest apologies to the customers using these products who have been inconvenienced by this issue.
</p>
<p>
This information is for residents of the United States and Puerto Rico only. If you do not reside in the USA or Puerto Rico, please contact the Canon Customer Support Center in your region.
</p>
<p>
Contact Information for Inquiries<br />
Customer Support Center<br />
1-866-422-2965 (toll free)<br />
8:00 a.m. - Midnight, EST (M-F)<br />
10:00 a.m. - 8:00 p.m., EST (Sat.)<br />
Email: <a href="mailto:carecenter@cits.canon.com">carecenter@cits.canon.com</a>

</blockquote>


The Canon customer support rep was far more friendly than their website. The timeline went like this:
<ul>
	<li><strong>August 6</strong>: Canon sent over a UPS ground shipping label to the closest repair facility in Irvine, CA</li>
	<li><strong>August 11</strong>: I shipped out my 5D body</li>
	<li><strong>August 18</strong>: Canon sent an email confirming that they have inspected the camera and would be starting repairs</li>
	<li><strong>August 22</strong>: Canon sent an email confirming that the repair was finished and a Fedex tracking number</li>
</ul>
So within 2 weeks, I got my camera back, freshly cleaned and sporting a reinforced mirror mount (highlighted in green below) total free of charge:

<img src="http://stash1.johnvey.com/images/blog/5d_mirror.jpg" alt="Canon 5D reinforced main mirror assembly" width="700" height="380" />]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2011/09/canon-5d-loose-mirror-replacement#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2011/09/canon-5d-loose-mirror-replacement/feed/atom" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[The best page in the universe]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2007/12/the-best-page-in-the-universe" />
		<id>http://www.johnvey.com/blog/2007/12/the-best-page-in-the-universe</id>
		<updated>2007-12-24T05:10:43Z</updated>
		<published>2007-12-24T05:10:43Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[According to Google, I am the second-most popular "purveyor of [insert genre here]" in the world, bested only by the purveyor of the world's finest teas, Upton Tea Import. Being second in this list is lamentable, but under the circumstances not a terrible position considering that I have a better rank than the leading purveyor [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2007/12/the-best-page-in-the-universe"><![CDATA[<p>
According to Google, I am the <a href="http://www.google.com/search?hl=en&#038;q=%22purveyor+of%22">second-most popular "purveyor of [insert genre here]"</a> in the world, bested only by the purveyor of the world's finest teas, Upton Tea Import.  Being second in this list is lamentable, but under the circumstances not a terrible position considering that I have a better rank than the leading purveyor of fine needlework and supplies, and the purveyor of EarthBalls and Giant Globes.  Gloating aside, how the moniker "purveyor of" came into being merits some discussion.  C.M. recently asked,
</p>

<blockquote>
You use the line "purveyor of fine words." Before commandeering this line, did you look into its etymology? For example, what is correct "fine purveyor of..." or "purveyor of fine..."? Oddly, there is not much online by way of a discussion. There are of course several instances of people using the phrases both ways. I did come across a book about the history of purveyance and it talked about "fine purveyors" as those who procured better cuts of meat or poultry, as opposed to the "coarse purveyors." However, these days, everyone claims to be a "purveyor of fine something". I just wonder if they are interchangeable or if one is more correct than the other. For obvious reasons, you seemed like a good person to ask, being a self-titled "purveyor of fine words" and all.
</blockquote>

<p>
Well, I chose the tagline 'purveyor of fine words' as a response to the typical self-deprecating blog name that is so common these days -- ones that mix and match words like 'rambling', 'thoughts',  'random', 'drivel', 'brain farts'.  I subscribe to one blog that is titled, "<a href="http://alex.dojotoolkit.org/">Continuing Intermittent Incoherency</a>", which sounds like the author picked up some kind of Mad-Lib for blog names for inspiration.  "<a href="http://www.gringod.com/">Randomised nonsense</a>" and "<a href="http://secularskeptic.blogspot.com/">The Solipsistic Sayings of a Random Infidel</a>" also seem to have been derived from the same template.
</p>

<p>
Perhaps these titles are a byproduct of today's disclaimer-ridden society, where consumers are too moronic to realize that a cup of coffee contains scalding hot liquid, or that a pack of peanuts "may contain nuts", or that power tool enthusiasts should not "attempt to stop a chainsaw with [their] hand".  In the online world, this warning zealotry translates into prefacing statements with redundant <a href="http://www.geocities.com/CollegePark/Campus/4642/irchat.html">acronyms</a> like FWIW or IMHO, which authors use to ostensibly indemnify themselves against criticism.  "IMHO, you're nothing but a fucktard and the best part of you ran down the crack of your momma's ass", becomes a quaint jest I suppose.  In order to buck this trend, I opted to go big instead and inflate myself to gourmet proportions, and thus I promoted myself to a purveyor of fine words.
</p>

<p>
In response to C.M.'s question, I don't have any more insight into the etymology of the phrase, as mine merely parodies Dean &#038; Deluca's tag line of "Purveyors of Fine Foods and Kitchenware".  I would say that "purveyors of fine..." is much more prevalent than "fine purveyors..." insofar as it's difficult to explain the difference between a "purveyor" and a "fine purveyor" (maybe the purveyor is very attractive?), whereas the difference between "food" and "fine food" immediately conjures up contrasting images of corn dogs and Iranian caviar.
</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2007/12/the-best-page-in-the-universe#comments" thr:count="4"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2007/12/the-best-page-in-the-universe/feed/atom" thr:count="4"/>
		<thr:total>4</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[IE does not bubble form &lt;select&gt; element onchange events]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2007/07/ie-does-not-bubble-form-select-element-onchange-events" />
		<id>http://www.johnvey.com/blog/2007/07/ie-does-not-bubble-form-select-element-onchange-events</id>
		<updated>2007-07-16T20:05:15Z</updated>
		<published>2007-07-16T20:05:15Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[When developing dynamically generated forms, you often want to attach a single event handler to the main form object, and have that handle the events generated by the form elements, thus saving you the trouble of constantly attaching event handlers to newly generated elements. However, IE 6 and 7 do not bubble the onchange event [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2007/07/ie-does-not-bubble-form-select-element-onchange-events"><![CDATA[<p>When developing dynamically generated forms, you often want to attach a single event handler to the main form object, and have that handle the events generated by the form elements, thus saving you the trouble of constantly attaching event handlers to newly generated elements.  However, IE 6 and 7 do not bubble the <em>onchange</em> event beyond the originating select element, meaning that you have to explicitly attach an <em>onchange</em> handler to every select you generate.  All other current browsers bubble the event properly.</p>

<p>Here is a test form for checking if your browser registers the <em>onchange</em> event beyond the firing select element.  Changing the select options should trigger an alert dialog box.</p>

<p><em>onchange</em> listener attached to parent &lt;div&gt; node</p>
<div id="xwrapper1">
	<select id="xselect1">
		<option>option1</option>
		<option>option2</option>
		<option>option3</option>
	</select>
</div>

<p><em>onchange</em> listener attached to parent &lt;form&gt; node</p>
<form id="xwrapper2">
	<select id="xselect2">
		<option>option1</option>
		<option>option2</option>
		<option>option3</option>
	</select>
</form>

<p><em>onchange</em> listener attached to actual &lt;select&gt; node</p>
<form id="xwrapper3">
	<select id="xselect3">
		<option>option1</option>
		<option>option2</option>
		<option>option3</option>
	</select>
</form>

<script type="text/javascript">
<!--
	// credit to John Resig,
	function xaddEvent (obj, type, fn ) {
		if (obj.addEventListener)
			obj.addEventListener( type, fn, false );
		else if (obj.attachEvent) {
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
			obj.attachEvent( "on"+type, obj[type+fn] );
		}
	}

	function xhandleOnChange(evt) {
		var evt = evt || window.event;
		var target = evt.target || evt.srcElement;
		alert('Onchange has been fired by element id=' + target.id);
	}

	xaddEvent(document.getElementById('xwrapper1'), 'change', xhandleOnChange);
	xaddEvent(document.getElementById('xwrapper2'), 'change', xhandleOnChange);
	xaddEvent(document.getElementById('xselect3'), 'change', xhandleOnChange);
// -->
</script>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2007/07/ie-does-not-bubble-form-select-element-onchange-events#comments" thr:count="2"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2007/07/ie-does-not-bubble-form-select-element-onchange-events/feed/atom" thr:count="2"/>
		<thr:total>2</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Concise Adblock Filter Set Explained]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2007/01/concise-adblock-filter-set-explained" />
		<id>http://www.johnvey.com/blog/2007/01/concise-adblock-filter-set-explained</id>
		<updated>2007-01-15T01:55:25Z</updated>
		<published>2007-01-15T01:55:25Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[Adblock is the single most useful Firefox plugin available today. Just like watching sitcoms with automatic commercial-skip, adblock's banner ad supression system elicits a smug sense of satisfaction even after browsing through your 10,000th ad-free web page. However, a huge barrier to adoption seems to be the lack of a default filter set, so when [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2007/01/concise-adblock-filter-set-explained"><![CDATA[<p>
<a href="http://adblock.mozdev.org/">Adblock</a> is the single most useful Firefox plugin available today.  Just like watching sitcoms with automatic commercial-skip, adblock's banner ad supression system elicits a smug sense of satisfaction even after browsing through your 10,000th ad-free web page.  However, a huge barrier to adoption seems to be the lack of a default filter set, so when you first install adblock, nothing happens.
</p>
<p>
The main issue is that adblock does not have any intelligence as to the content that is included with a webpage; it is just a generic regex-based filter system, so it is only as effective as the filters that you provide.  There are plenty of pre-made lists available but they tend to be overly-aggressive in what is supressed, resulting in occasional broken pages and/or pages that dead-end because adblock has removed the "Next" button.  The most dangerous public set seems to be the <a href="http://easylist.adblockplus.org/">EasyList</a>, which has a <a href="http://easylist.adblockplus.org/adblock_rick752.txt">360+ item block list</a>.  Evidence that the creators know of its greedy nature is their inclusion of a 20+ item whitelist to manually compensate what was initially blocked.  Even more unstable is the EasyElement list that searches through the DOM to remove suspected elements directly from the main document -- a <a href="http://easylist.adblockplus.org/easylist-element_rick752.txt">list of 570+ substrings</a> to search for.
</p>
<p>
Intead of using such a large, reactive list of simple and site-specific string matches that tries to supress 100% of ads, I posit that you only need 2 adblock filters to eliminate 70-80% of ads, and still be confident that legitimate content isn't being flagged as a false positive.  By getting into the heads of HTML writers, we can pick out the most common patterns used to include ads and create regex patterns to suppress the ads.
</p>
<ol>
<li><strong><code>/(\b|_)ad(x|s?)(\b|_)/</code></strong><br />This regex looks for any element that contains the string 'ad', 'ads', or 'adx' surrounded by a word boundary, because the vast majority of web sites partition their ads into a single directory or serve them through a single script.  The word boundary check is crucial to this filter because just searching for the characters 'ad' is ineffective.  Instead, the word boundary restriction means that adblock will supress elements that contain strings like 'ads.server.com' or 'www.server.com/ads/' or 'server.com/ad_server.php', but not 'adobe.com' or 'server.com/adjustment'.</li>
<li><strong><code>/ad.*\d+[xX]\d+/</code></strong><br />This regex exploits the common technique of ad designers to use the image dimensions in their element name, i.e., "server.com/newads.php?location=top&#038;size=468x80".  Like the previous rule, we don't just exclude any element that has dimensions, but qualify that by searching for the string 'ad' as well.</li>
</ol>
<p>At this point, your browsing experience will be significantly improved, but you can bump up your block rate to about 80-90% with a few more simple substring matches.  There are many well known ad providers that exist solely to deliver ads, so we can consildate those in composite filter rules:
</p>
<ol>
<li><strong><code>/a(2\.yimg|dserv|dvert|tdmt|twola)/</code></strong><br />This rule collects all the ad serving systems that start with 'a': Yahoo, Atlas, AOLTimeWarner, and generic ad serving systems.</li>
<li><strong><code>/b(anners|logads)/<br />falkag.net</code></strong><br />These pick up anything labeled with 'banner', the 'blogads' network, or Falk AdSolutions.</li>
</ol>
<p>
Realistically, reducing the ad load by 90% should be more than sufficient for anyone.  Chasing that last 10% -- and whitelisting the collateral damage -- will always be a losing battle.  Your time is better used reading the content that is on the page you requested in the first place.
</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2007/01/concise-adblock-filter-set-explained#comments" thr:count="3"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2007/01/concise-adblock-filter-set-explained/feed/atom" thr:count="3"/>
		<thr:total>3</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Positions filled]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2006/09/positions-filled" />
		<id>http://johnvey.com/blog/2006/09/positions-filled</id>
		<updated>2006-09-09T21:16:53Z</updated>
		<published>2006-09-09T21:16:53Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[Effective immediately, I have a new title at work &#8212; actually 6 new titles... Internets Strategerist Sr. Tube Developer The Decider Guapo Scrabblista Assistant to the Regional Manager Bonus points if you can match all the cards with their respective references: The Office Senator Ted Stevens G.W. Bush &#38; Will Ferrell Victor's Taqueria G.W. Bush [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2006/09/positions-filled"><![CDATA[<p>Effective immediately, I have a new title at work &#8212; actually 6 new titles...</p>
<p><img src="http://stash1.johnvey.com/images/etc/splunk_card.jpg" width="400" height="208" alt="Internets Strategerist" style="border:1px solid #ccc" /><br />Internets Strategerist</p>
<p>
<img src="http://stash1.johnvey.com/images/etc/splunk_card_tube.jpg" width="346" height="55" alt="Sr. Tube Developer" style="border:1px solid #ccc" /><br />Sr. Tube Developer
<br />
<img src="http://stash1.johnvey.com/images/etc/splunk_card_decider.jpg" width="346" height="55" alt="The Decider" style="border:1px solid #ccc" /><br />The Decider
<br />
<img src="http://stash1.johnvey.com/images/etc/splunk_card_guapo.jpg" width="346" height="55" alt="Guapo" style="border:1px solid #ccc" /><br />Guapo
<br />
<img src="http://stash1.johnvey.com/images/etc/splunk_card_scrabble.jpg" width="346" height="55" alt="Scrabblista" style="border:1px solid #ccc" /><br />Scrabblista
<br />
<img src="http://stash1.johnvey.com/images/etc/splunk_card_assistant.jpg" width="346" height="55" alt="Assistant to the Regional Manager" style="border:1px solid #ccc" /><br />Assistant to the Regional Manager
<br />
</p>
<p>Bonus points if you can match all the cards with their respective references:</p>
<ul>
<li>The Office</li>
<li>Senator Ted Stevens</li>
<li>G.W. Bush &amp; Will Ferrell</li>
<li>Victor's Taqueria</li>
<li>G.W. Bush</li>
<li>My desk at work</li>
</ul>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2006/09/positions-filled#comments" thr:count="5"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2006/09/positions-filled/feed/atom" thr:count="5"/>
		<thr:total>5</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Yum install GPG error]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2006/08/yum-install-gpg-error" />
		<id>http://johnvey.com/blog/2006/08/yum-install-gpg-error</id>
		<updated>2006-08-21T17:40:43Z</updated>
		<published>2006-08-21T17:40:43Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[When using yum install, sometimes the old GPG keys installed with rpm are obsolete, resulting in an error like the following: warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID db42a60e public key not available for autoconf-2.59-5.noarch.rpm Retrieving GPG key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora The GPG key at file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora (0x4F2A6FD2) is already installed but is not the [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2006/08/yum-install-gpg-error"><![CDATA[<p>
When using <code>yum install</code>, sometimes the old GPG keys installed with rpm are obsolete, resulting in an error like the following:
</p>
<blockquote><code>warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID db42a60e
public key not available for autoconf-2.59-5.noarch.rpm
Retrieving GPG key from file://<strong>/etc/pki/rpm-gpg/RPM-GPG-KEY-fedora</strong>
The GPG key at file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora (0x4F2A6FD2)
is already installed but is not the correct key for this package.
Check that this is the correct key for the "Fedora Core 4 - i386 - Base" repository.
</code></blockquote>
<p>To fix, just add the new keys to rpm (changing the path for you particular install):</p>
<p><code>rpm --import <strong>/etc/pki/rpm-gpg/RPM*</strong></code></p>
<p>Some forum posts have suggested disabling GPG (i.e. <code>gpgcheck=0</code>), which can be a foolish thing to do.  You want to maintain <em>some</em> level of assurance that what you're downloading is legit.</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2006/08/yum-install-gpg-error#comments" thr:count="2"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2006/08/yum-install-gpg-error/feed/atom" thr:count="2"/>
		<thr:total>2</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[del.icio.us direc.tor update]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2006/07/delicious-director-update" />
		<id>http://johnvey.com/blog/2006/07/delicious-director-update</id>
		<updated>2006-07-01T21:30:02Z</updated>
		<published>2006-07-01T21:30:02Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[del.icio.us has changed their API host, which breaks the current direc.tor because of the xmlHTTPRequest's domain security policy. To fix this, the del.icio.us guys have added a couple public pages to allow direc.tor to continuing functioning. Now, you must first browse to https://api.del.icio.us before starting the direc.tor bookmarklet. Let me know if you are having [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2006/07/delicious-director-update"><![CDATA[del.icio.us has <a href="http://blog.del.icio.us/blog/2006/05/feel_secure.html">changed their API host</a>, which breaks the current <a href="/features/deliciousdirector">direc.tor</a> because of the xmlHTTPRequest's domain security policy.  To fix this, the del.icio.us guys have added a couple public pages to allow direc.tor to continuing functioning.  Now, you must first browse to https://api.del.icio.us before starting the direc.tor bookmarklet.  Let me know if you are having any issues.]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2006/07/delicious-director-update#comments" thr:count="12"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2006/07/delicious-director-update/feed/atom" thr:count="12"/>
		<thr:total>12</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[How to create PHP extensions (aka .so objects)]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2006/05/how-to-create-php-extensions-aka-so-objects" />
		<id>http://johnvey.com/blog/2006/05/how-to-create-php-extensions-aka-so-objects</id>
		<updated>2006-05-24T23:51:01Z</updated>
		<published>2006-05-24T23:51:01Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[Although PHP has a great library of functions, many of them are not included in the standard build, or haven't been included into the popular package installers like yum or apt-get. The man page doesn't leave you with much instruction, other than something like "compile PHP with the flag --with-pspell[=dir]". At this point you have [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2006/05/how-to-create-php-extensions-aka-so-objects"><![CDATA[<p>
Although PHP has a great library of functions, many of them are not included in the standard build, or haven't been included into the popular package installers like yum or apt-get.  The man page doesn't leave you with much instruction, other than something like "compile PHP with the flag --with-pspell[=dir]".  At this point you have 2 options:
</p>
<ul>
<li><strong>Recompile PHP</strong><br />
Find your existing PHP configure command and append this new flag, and recompile PHP.  This takes a while and is generally quite bothersome, if not unacceptable like when you're in a production environment.
</li>
<li><strong>Create a dynamic extension</strong><br />
Compile a separate file (usually ending in <code>.so</code>) that you copy into a PHP directory, and edit php.ini.  If you are running multiple machines on the same OS, you can just copy the file to all those machines as well.  Much easier, and you can turn it on and off at will.
</li>
</ul>
<p>Here's how to create the extension for modules that appear in the PHP manual on a linux-based system (for third-party extensions, it's most likely the same).</p>
<ol>
<li>Check that you have the PHP development package, which often comes in a separate package.  Yum lists it as <code>php-devel</code>.  You'll need its components in a few steps.</li>
<li><a href="http://www.php.net/downloads.php">Download</a> the PHP source code for whatever version you're currently running</li>
<li>In the source code, there is an <code>ext/</code> directory that should contain a subdirectory for the module that you're looking for.  Change to that subdirectory, i.e. <code>ext/pspell/</code>.</li>
<li>Type <code>phpize</code><br />(This won't work if you didn't verify step 1)</li>
<li>Type <code>./configure <span style="color:#800;font-weight:bold">--with-pspell=/usr</span></code><br />Replace the red portion with the text that is specified in the PHP man page for the module you want.  For example, MySQL improved would be something like <code>--with-mysqli=/usr/local/mysql/bin/mysql_config</code>.  Be aware that the path is sometimes a base directory, and sometimes needs to point to a specific file.  Read the PHP docs carefully.</li>
<li>Type <code>make</code></li>
<li>When finished, the compiler should tell you where it created the <code>.so</code> file (most likely in the <code>modules/</code> subdirectory of your current location).  Copy the <code>.so</code> file to your PHP extensions directory, i.e. <code>/usr/lib/php/modules</code>.  If you don't know this, it's listed in your php.ini file under the <code>extension_dir</code> parameter.  You'll need root access to do this.</li>
<li>Finally, tell PHP about your new extension by adding one line to php.ini:<br />
<code>extension=pspell.so</code><br />
Alternatively, if you already have a bunch of extensions installed, you can place it in your <code>/etc/php.d</code> directory in it's own ini file for a cleaner installation approach.
</li>
<li>Restart apache, if you're using it</li>
<li>Check <code>phpinfo()</code> to verify that your new module is installed</li>
</ol>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2006/05/how-to-create-php-extensions-aka-so-objects#comments" thr:count="3"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2006/05/how-to-create-php-extensions-aka-so-objects/feed/atom" thr:count="3"/>
		<thr:total>3</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Ajax spell check as you type]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2006/05/ajax-spellcheck-as-you-type" />
		<id>http://johnvey.com/blog/2006/05/ajax-spellcheck-as-you-type</id>
		<updated>2006-05-24T22:51:05Z</updated>
		<published>2006-05-24T22:51:05Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[I've been looking for a nice web Javascript spell checker, and came across a great implementation by Emil that he named LiteSpellChecker. It mimics the spell checker in MS Word by underlining misspelled words and presenting a nice substitute word selection menu. The javascript takes a standard &#60;textarea&#62; element, erases the background, and inserts a [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2006/05/ajax-spellcheck-as-you-type"><![CDATA[<p>
I've been looking for a nice web Javascript spell checker, and came across a great implementation by Emil that he named <a href="http://me.eae.net/archive/2005/07/26/litespellchecker/">LiteSpellChecker</a>.  It mimics the spell checker in MS Word by underlining misspelled words and presenting a nice substitute word selection menu.  The javascript takes a standard <code>&lt;textarea&gt;</code> element, erases the background, and inserts a shadow <code>&lt;div&gt;</code> underneath that holds the redline segments.
<img src="http://stash1.johnvey.com/images/etc/litespellchecker.gif" width="425" height="288" alt="spell check screenshot in Firefox OS X" style="border:1px solid #999;padding:4px" />
</p>
<h4>Bug Fixes (based on 2005-7-24 version of LiteSpellChecker)</h4>
<p>
The current implementation on his site has some bugs, so I've started to tackle some of them:
</p>
<ul>
<li>
<strong>Fixed: Redlines get misaligned when scrolling with arrow keys in Firefox</strong><br />
When scrolling long text using Firefox, the redlines become misaligned as you move towards the bottom of the page.  Once they begin to misalign, you have to manually refresh in order get it right again.
</li>
<li><strong>Fixed: Ignore word function breaks if there are non-word segments in the text</strong><br />
If the text contains characters like ++ or @@, then the ignore words function fails.  This problem crops up whenever you have wiki markup syntax.
</li>
<li><strong>Fixed: Numbers are flagged as misspelled</strong><br />
Any word that contains a number is now ignored by the spell checker.
</li>
</ul>
<h4>Performance Improvements</h4>
<p>Since many of my users will be working with long documents, performance is key. </p>

<ul>
<li><strong>Sped up ignore function by almost 5x</strong><br />
The ignore word function loops through all words and feeds it back into the spellchecker.  In long documents, the lag becomes noticable, and also causes a flicker of all the redlines.  Instead of blindly looping through all words, I changed it to a case-insensitive search for the ignored word, and only processed the matching words.  Venkman reports a speed up from 278.2ms to 57.95ms on a Powerbook G4.
</li>
<li><strong>Improved responsiveness while editing long text</strong><br />
Since the spell checker updates the spelling status on <em>every</em> keystroke, the UI becomes unusable when editing long text.  I added a spell check delay that suspends the spell checker while typing continuously.  You can adjust the sensitivity via the <code>SPELL_CHECK_DELAY</code> variable.</li>
</ul>

<p>Download my source code.  <strong>Important:</strong> read <a href="http://me.eae.net/archive/2005/07/26/litespellchecker/">Emil's demo page</a> before attempting to do anything with these files.</p>
<ul>
<li><a href="/etc/litespellchecker.js">litespellchecker.js</a></li>
<li><a href="/etc/spellcheckerbase.js">spellcheckerbase.js</a></li>
</ul>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2006/05/ajax-spellcheck-as-you-type#comments" thr:count="5"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2006/05/ajax-spellcheck-as-you-type/feed/atom" thr:count="5"/>
		<thr:total>5</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Flickr Prints Review]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2005/12/flickr-prints-review" />
		<id>http://johnvey.com/blog/2005/12/flickr-prints-review</id>
		<updated>2005-12-08T07:27:18Z</updated>
		<published>2005-12-08T07:27:18Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[I ordered a couple prints from Flickr's new print service to check out the quality. Here are my comments: Wait time: 8 days via USPS: 11/28 - submitted order; 11/30 - order shipped; 12/7 - order received; The package was delivered from Norcross, GA, so I'm assuming that the west coast has the longest wait. [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2005/12/flickr-prints-review"><![CDATA[<p>I ordered a couple prints from Flickr's new <a href="http://flickr.com/help/printing/">print service</a> to check out the quality.  Here are my comments:</p>
<ul>
<li><strong>Wait time</strong>: 8 days via USPS: 11/28 - submitted order; 11/30 - order shipped; 12/7 - order received; The package was delivered from Norcross, GA, so I'm assuming that the west coast has the longest wait.</li>
<li><strong>Package contents</strong>: index print, photos, Flickr sticker, "Inspected by #179" note.</li>
<li><strong>Print quality</strong>: The glossy 4x6 prints I ordered were printed on Fujifilm Fujicolor Crystal Archive paper, most likey by a Frontier laser system.  The photo quality is what you'd expect from this standard pairing, and works great for snsapshot prints.  No Ofoto-style color tweaking going on here.</li>
<li><strong>Metadata</strong>: Neither the index print or the text on the back of the photos show the title that you enter into Flickr, or the EXIF capture date. Only the date of development is printed, along with "Yahoo!_Flickr" on the back &#8212; not too helpful.</li>
</ul>
<p><img src="http://stash1.johnvey.com/images/etc/flickr_prints.jpg" width="300" alt="Flickr print service sample" style="border:1px solid #999" /></p>
<p>Overall, a well executed service that has been long awaited on Flickr.  I'll probably try a matte print, and larger sizes soon.</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2005/12/flickr-prints-review#comments" thr:count="1"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2005/12/flickr-prints-review/feed/atom" thr:count="1"/>
		<thr:total>1</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Death Valley]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2005/12/death-valley" />
		<id>http://johnvey.com/blog/2005/12/death-valley</id>
		<updated>2005-12-01T19:14:58Z</updated>
		<published>2005-12-01T19:14:58Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[This year I spent Thanksgiving not sitting at home in front of a heaping pile of white and dark meat, but rather in the middle of the desert &#8212; Death Valley to be exact. Although the valley is the hottest place in the world, it was a fantastic 75 degrees the whole time. See the [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2005/12/death-valley"><![CDATA[<div class="blogPicFrame"><a href="/photos/deathvalley/"><img src="http://stash1.johnvey.com/images/deathvalley/th/20051126-1404-2252.jpg" alt="Death Valley" /></a></div><p>This year I spent Thanksgiving not sitting at home in front of a heaping pile of white and dark meat, but rather in the middle of the desert &#8212; Death Valley to be exact. Although the valley is the hottest place in the world, it was a fantastic 75 degrees the whole time.  <a href="/photos/deathvalley/">See the pictures</a></p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2005/12/death-valley#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2005/12/death-valley/feed/atom" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Web 1.0]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2005/10/web-10" />
		<id>http://johnvey.com/blog/2005/10/web-10</id>
		<updated>2005-10-05T07:01:21Z</updated>
		<published>2005-10-05T07:01:21Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[I couldn't get my employer to spring for the Web 2.0 conference in town, but all is not lost: the Web 1.0 summit is also convening over at the House of Shields. Oh, yeah...increasing eyeballs and pushing site stickiness through out-of-the-box paradigm shifts? Fuckin' best summit ever! I'll arrive in style in a Webvan delivery [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2005/10/web-10"><![CDATA[<p>I couldn't get my employer to spring for the <a href="http://www.web2con.com/">Web 2.0 conference</a> in town, but all is not lost: the <a href="http://upcoming.org/event/20836/">Web 1.0 summit</a> is also convening over at the House of Shields. Oh, yeah...increasing eyeballs and pushing site stickiness through out-of-the-box paradigm shifts? Fuckin' best summit ever!  I'll arrive in style in a Webvan delivery truck and a <a href="http://www.wired.com/wired/archive/13.08/1999.html">sock puppet</a> as my date.</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2005/10/web-10#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2005/10/web-10/feed/atom" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[AJAXSLT]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2005/07/ajaxslt" />
		<id>http://johnvey.com/blog/2005/07/ajaxslt</id>
		<updated>2005-07-03T19:58:15Z</updated>
		<published>2005-07-03T19:58:15Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[Google's recent release of AJAXSLT is a good first step towards unifying XSLT services in the browser. Currently, IE uses a rental-model XSLT processor, which is inconvenient for stateful Javascript applications like direc.tor because you have to instantiate a new object every time you make any change to the XSL stylesheet. Hopefully the browser vendors [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2005/07/ajaxslt"><![CDATA[<p>Google's recent release of <a href="http://goog-ajaxslt.sourceforge.net/">AJAXSLT</a> is a good first step towards unifying XSLT services in the browser.  Currently, IE uses a rental-model XSLT processor, which is inconvenient for stateful Javascript applications like <a href="/features/deliciousdirector/">direc.tor</a> because you have to instantiate a new object every time you make any change to the XSL stylesheet.  Hopefully the browser vendors will converge towards a common interface, like they did with XmlHTTP, in the future.
</p><p>Even though the AJAXSLT library supports Safari and Opera, it's still not ready for prime time, mostly because of performance reasons.  In IE and Firefox, the AJAXSLT library is really just a pass-though for the compiled XSL services.  However, in Safari and Opera the XSL transformations are done <em>in</em> interpreted  Javascript, making it much slower than IE and Firefox.  Many people have asked me if I could use this library to make direc.tor work with Safari.  The answer is yes, but for anyone with more than a couple hundred bookmarks, the poor performance would become unbearable very quickly.</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2005/07/ajaxslt#comments" thr:count="6"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2005/07/ajaxslt/feed/atom" thr:count="6"/>
		<thr:total>6</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Delicious Press]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2005/07/delicious-press" />
		<id>http://johnvey.com/blog/2005/07/delicious-press</id>
		<updated>2005-07-02T00:38:48Z</updated>
		<published>2005-07-02T00:38:48Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[Cut to one week later: del.icio.us direc.tor is a huge hit! Here's what people are saying: del.icio.us on crack&#8212;Lifehacker ...yet another stunning remix&#8212;Jon Udell ...elegant alternate interface to your del.icio.us tags and bookmarks&#8212;Jesse James Garrett gorgeously designed Ajax-style browser for Del.icio.us&#8212;waxy.org Oh my god. del.icio.us direc.tor is my new best friend.&#8212;Mulling It Over Run. Don’t [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2005/07/delicious-press"><![CDATA[<p>Cut to one week later: del.icio.us direc.tor is a huge hit! Here's what people are saying:</p>
<ul>
<li><em>del.icio.us on crack</em><br />&#8212;<a href="http://www.lifehacker.com/software/productivity/delicious-on-crack-delicious-director-109934.php">Lifehacker</a>
</li>
<li><em>...yet another stunning remix</em><br />&#8212;<a href="http://weblog.infoworld.com/udell/2005/06/27.html#a1258">Jon Udell</a>
</li>
<li><em>...elegant alternate interface to your del.icio.us tags and bookmarks</em><br />&#8212;<a href="http://blog.jjg.net/weblog/2005/06/if_youre_a_deli.html">Jesse James Garrett</a>
</li>
<li><em>gorgeously designed Ajax-style browser for Del.icio.us</em><br />&#8212;<a href="http://www.waxy.org/links/archive/2005/06/index.shtml#24">waxy.org</a>
</li>
<li><em>Oh my god. del.icio.us direc.tor is my new best friend.</em><br />&#8212;<a href="http://www.mullingitover.com/wpress/2005/06/24/deliciously-new-toy/">Mulling It Over</a>
</li>
<li><em>Run. Don’t walk to try this out.</em><br />&#8212;<a href="http://www.lisamcmillan.com/journal/coolest-webapp-ever">Lisa McMillan</a>
</li>
<li><em>A lovely lovely shiny thing buried under quite a lot of brain-slide-offable verbiage</em><br />&#8212;<a href="http://www.plasticbag.org/archives/2005/06/links_for_20050626.shtml">plasticbag.org</a>
</li>
<li><em>...this application will make you weep. Seriously.</em><br />&#8212;<a href="http://www.gadgetopia.com/2005/06/24/DeliciousDirector.html">Gadgetopia</a>
</li></ul>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2005/07/delicious-press#comments" thr:count="3"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2005/07/delicious-press/feed/atom" thr:count="3"/>
		<thr:total>3</thr:total>
	</entry>
		<entry>
		<author>
			<name>Johnvey</name>
					</author>
		<title type="html"><![CDATA[Spunk, with an &#8220;L&#8221;]]></title>
		<link rel="alternate" type="text/html" href="http://www.johnvey.com/blog/2005/06/spunk-with-an-l" />
		<id>http://johnvey.com/blog/2005/06/spunk-with-an-l</id>
		<updated>2005-06-24T06:31:23Z</updated>
		<published>2005-06-24T06:31:23Z</published>
		<category scheme="http://www.johnvey.com" term="Uncategorized" />		<summary type="html"><![CDATA[The projects at my new company, Splunk, are going so well that we need to hire another web guru, ASAP. If you are an expert PHP and MySQL coder, well-versed in OOP, have substantial experience building community sites, and are available for a 2 month contract in San Francisco, let me know. We're also looking [...]]]></summary>
		<content type="html" xml:base="http://www.johnvey.com/blog/2005/06/spunk-with-an-l"><![CDATA[<p>The projects at my new company, Splunk, are going so well that we need to hire another web guru, ASAP.  If you are an expert PHP and MySQL coder, well-versed in OOP, have substantial experience building community sites, and are available for a 2 month contract in San Francisco, <a href="/contact/">let me know</a>.  We're also looking for<a href="http://splunk.com/index.php/articles/news/1"> QA and support engineers</a>, among others.
</p>
<p>We are a small startup, working on an IT solution that helps administrators find out what is going on in their data centers.  Some call it a "Google for machine data", others call it a "super-grep".  Whatever you call it, it's damn cool.</p>
<p>And we're in the same building as Al Gore's TV station, <a href="http://www.current.tv/">Current TV</a>. Ohmigod, ohmigod, ohmigod, ohmigod.</p>]]></content>
		<link rel="replies" type="text/html" href="http://www.johnvey.com/blog/2005/06/spunk-with-an-l#comments" thr:count="1"/>
		<link rel="replies" type="application/atom+xml" href="http://www.johnvey.com/blog/2005/06/spunk-with-an-l/feed/atom" thr:count="1"/>
		<thr:total>1</thr:total>
	</entry>
	</feed>
