<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Brian Pane &#187; Uncategorized</title>
	<atom:link href="http://www.brianp.net/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brianp.net</link>
	<description>Occasional Writings</description>
	<lastBuildDate>Fri, 02 Jul 2010 06:35:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How Leaders are Judged</title>
		<link>http://www.brianp.net/2010/07/01/how-leaders-are-judged/</link>
		<comments>http://www.brianp.net/2010/07/01/how-leaders-are-judged/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 06:35:16 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=265</guid>
		<description><![CDATA[<p>Today the Siena Research Institute (SRI) published a list of the best and worst U.S. Presidents, based on a survey of &#8220;238 presidential scholars, historians and political scientists that responded via mail or web to an invitation to participate.&#8221;</p>
<p>The report has stirred up a lot of commentary in the media, mostly partisan and focused on [...]]]></description>
			<content:encoded><![CDATA[<p>Today the <a href="http://www.siena.edu/pages/1161.asp">Siena Research Institute</a> (SRI) published a <a href="http://www.siena.edu/uploadedfiles/home/parents_and_community/community_page/sri/independent_research/Presidents%20Release_2010_final.pdf">list</a> of the best and worst U.S. Presidents, based on a survey of &#8220;238 presidential scholars, historians and political scientists that responded via mail or web to an invitation to participate.&#8221;</p>
<p>The report has stirred up a lot of commentary in the media, mostly partisan and focused on whether pundits agree with the rankings of recent Presidents.</p>
<p>What&#8217;s most interesting to me, though, is the detailed, dimensionalized <a href="http://www.siena.edu/uploadedfiles/home/parents_and_community/community_page/sri/independent_research/Presidents%202010%20Rank%20by%20Category.pdf">data</a> that SRI released alongside the report.  The survey respondents were asked to rank each President in 20 different categories.</p>
<p>With this categorized data available, I wondered: <i>What specific leadership qualities mattered most in these experts&#8217; overall perception of a President?</i></p>
<p>To find out, I loaded the data into a spreadsheet and computed the correlation (<a href="http://en.wikipedia.org/wiki/R-squared">R-squared</a> for a linear, best-fit trendline) between each individual category and the overall Presidential rankings.</p>
<table>
<tr>
<th>Category</th>
<th>Correlation with Overall Rank<br /> (0 = no correlation, 1 = highest possible correlation)</th>
</tr>
<tr>
<td>Background (Family, Education, Experience)</td>
<td>0.41</td>
</tr>
<tr>
<td>Party Leadership</td>
<td>0.68</td>
</tr>
<tr>
<td>Communication Ability (Speaking, Writing)</td>
<td>0.82</td>
</tr>
<tr>
<td>Relationship with Congress</td>
<td>0.75</td>
</tr>
<tr>
<td>Court Appointments</td>
<td>0.78</td>
</tr>
<tr>
<td>Handling of U.S. Economy</td>
<td>0.78</td>
</tr>
<tr>
<td>Luck</td>
<td>0.57</td>
</tr>
<tr>
<td>Ability to Compromise</td>
<td>0.58</td>
</tr>
<tr>
<td>Willingness to Take Risks</td>
<td>0.71</td>
</tr>
<tr>
<td>Executive Appointments</td>
<td>0.85</td>
</tr>
<tr>
<td>Overall Ability</td>
<td>0.92</td>
</tr>
<tr>
<td>Imagination</td>
<td>0.85</td>
</tr>
<tr>
<td>Domestic Accomplishments</td>
<td>0.93</td>
</tr>
<tr>
<td>Integrity</td>
<td>0.41</td>
</tr>
<tr>
<td>Executive Ability</td>
<td>0.93</td>
</tr>
<tr>
<td>Foreign Policy Accomplishments</td>
<td>0.74</td>
</tr>
<tr>
<td>Leadership Ability</td>
<td>0.88</td>
</tr>
<tr>
<td>Intelligence</td>
<td>0.65</td>
</tr>
<tr>
<td>Avoidance of Crucial Mistakes</td>
<td>0.66</td>
</tr>
<tr>
<td>Respondents&#8217; Present Overall View</td>
<td>0.97</td>
</tr>
</table>
<p>My own interpretation of what these correlations mean:</p>
<ul>
<li>First of all, when the survey respondents were asked to provide a single, overall ranking of each President (the &#8220;Present Overall View&#8221; category), the results were very highly correlated with the derived ranking computed from all the other categories (&#8220;Overall Rank&#8221;).  This indicates to me that each respondent was self-consistent and didn&#8217;t, for example, give poor per-category rankings to some President whom they named best overall.</li>
<li>Background (Family, Education, Experience) mattered relatively little.  To me, that&#8217;s refreshing: in a true land of opportunity, someone with potential should be able to succeed regardless of background.</li>
<li>Some personality characteristics widely regarded as virtues&#8211;Integrity, Intelligence, and Ability to Compromise&#8211;had surprisingly low correlations with Overall Rank.  On the whole, it seems, results mattered more than style.</li>
<li>Domestic Accomplishments were more strongly correlated with Overall Rank than Foreign Policy Accomplishments.</li>
<li>Luck had one of the lower correlations, suggesting that the particular set of circumstances that fate presented to each President was less important than that President&#8217;s handling of the crises and opportunities.</li>
</ul>
<p>Based on SRI&#8217;s survey data, the archetype of a historically well-regarded U.S. President seems to be a skilled organizational manager and good communicator who delivers results on domestic issues.  I see parallels to how corporate CEOs are judged, too: imagination and leadership capabilities are valued highly, and results (Domestic Accomplishments in this survey, quarterly earnings in the corporate world) are paramount.</p>
<p>I&#8217;d love to hear some feedback from folks in other countries: do people judge leaders by the same criteria worldwide, or does it vary from place to place?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2010/07/01/how-leaders-are-judged/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Referring URLs and web privacy</title>
		<link>http://www.brianp.net/2010/05/21/referring-urls-and-web-privacy/</link>
		<comments>http://www.brianp.net/2010/05/21/referring-urls-and-web-privacy/#comments</comments>
		<pubDate>Fri, 21 May 2010 09:36:59 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=244</guid>
		<description><![CDATA[<p>Some writers at the WSJ recently &#8220;discovered&#8221; that one of the longstanding conventions of the web, the referring URL, can leak unexpected information if websites put things like user names in their URLs.  Although my first thought was, &#8220;that&#8217;s not news,&#8221; Facebook appears to have responded with some technical changes that protect referrer data [...]]]></description>
			<content:encoded><![CDATA[<p>Some writers at the WSJ recently &#8220;discovered&#8221; that one of the longstanding conventions of the web, the referring URL, can <a href="http://online.wsj.com/article/SB10001424052748704513104575256701215465596.html">leak unexpected information</a> if websites put things like user names in their URLs.  Although my first thought was, &#8220;that&#8217;s not news,&#8221; Facebook appears to have responded with some technical changes that protect referrer data better than the industry norm.</p>
<h2>Quick technical background</h2>
<ul>
<li>Assume you&#8217;re on a web page http://www.Site-A.com/origin-page.html</li>
<li>There&#8217;s a link on that page that goes to http://www.Site-B.net/destination-page.html</li>
<li>You click on the link.</li>
<li>Your web browser finds the web server for www.Site-B.net and sends that server a request for /destination-page.html.</li>
<li>The web browser usually also sends the www.Site-B.net web server the URL of the referring page: http://www.Site-A.com/origin-page.html</li>
</ul>
<p>In short, when you&#8217;re on a web page on site A and you click on a link to site B, site B normally knows:</p>
<ul>
<li>That you came from site A,</li>
<li><em>and</em> the URL of the specific page on site A.</li>
</ul>
<h2>How is referring URL data used?</h2>
<p>The web server for site B often just ignores the referring URL.  Occasionally it may serve up different content based on the referring URL.  But the most common practice I&#8217;ve seen is for the receiving website to study the referring URL information in aggregate to analyze traffic sources.  &#8220;Last month we saw a big jump in the number of users reaching our home page from referring URLs that look like search result pages,&#8221; a marketing manager might say, &#8220;so our SEO efforts must be working.&#8221;</p>
<style type="text/css">
div.indent { padding-left: 20px; }
</style>
<h2>What&#8217;s dangerous about referring URLs?</h2>
<p>If the referring URL contains sensitive data, that data will be visible to the destination site&#8217;s web servers.  E.g., if the page</p>
<div class="indent">
http://www.social-network.com/users/BrianPane
</div>
<p>links to an article at</p>
<div class="indent">
http://news-website.com/12345.html
</div>
<p>then the people who run the web servers for news-website.com need only read their server logs to find the name of the social network user who linked to their article.</p>
<p>If you work for an organization with an internal Wiki, you might have a page for your secret new project</p>
<div class="indent">
http://wiki.my-company.com/ProjectPhoenix
</div>
<p>that links to the competing product that you plan to crush:</p>
<div class="indent">
http://www.my-competitor.com/products/Widget-2000.html
</div>
<p>Your competitor need only study the referring URLs in their server logs to get the hint that you&#8217;re working on something called &#8220;Project Phoenix&#8221; that has something to do with their Widget-2000 product.</p>
<p>As early as 1996, the people writing the HTTP specification (the technical standard describing how web browsers talk to web servers) recognized the potential privacy problems with referring URLs.  <a href="http://www.ietf.org/rfc/rfc1945.txt">RFC 1945</a>, the first version of the HTTP spec, introduced a guideline that has remained in all subsequent versions of the spec:</p>
<div class="indent">
&#8220;Because the source of a link may be private information or may reveal an otherwise private information source, it is strongly recommended that the user be able to select whether or not the Referer field is sent. For example, a browser client could have a toggle switch for browsing openly/anonymously, which would respectively enable/disable the sending of Referer and From information.&#8221;
</div>
<p>Two things are noteworthy here:</p>
<ul>
<li>Yes, the spec uses a misspelling of &#8220;referrer.&#8221;  A programmer working on one of the earliest web browsers misspelled the word, and the misspelling became a de facto standard and then part of the official spec.</li>
<li>As far as I know, none of the major web browsers has implemented the &#8220;strongly recommended&#8221; switch to disable the sending of referring URLs.</li>
</ul>
<h2>Defending against data leakage</h2>
<p>In the absence of widespread browser support for hiding referring URLs, people who build websites can defend against data leakage on the server side.</p>
<p>One solution is to design the site so that the URLs don&#8217;t provide any externally meaningful information.  Webmail services, for example, typically are designed so that no URL conveys information about who the user is.  (If you use a webmail service and find that your username or user ID shows up in the service&#8217;s URLs, it&#8217;s probably time to switch providers.)</p>
<p>That solution isn&#8217;t always feasible, though.  In social networking websites, for example, it has become popular to put a human-readable user name in URLs.  In cases where the referring URL necessarily contains sensitive data, it is possible to keep most browsers from sending the referring URL to the destination site&#8217;s web servers.  The technique for doing this is an old trick:</p>
<ul>
<li>On Site A, instead of linking directly to http://www.Site-B.net/destination-page.html, link to http://www.Site-A.com/some-URL-that-gives-away-no-user-data.html</li>
<li>The page http://www.Site-A.com/some-URL-that-gives-away-no-user-data.html contains (nothing but) an HTML meta tag that redirects immediately to http://www.Site-B.net/destination-page.html</li>
<li>The web server for www.Site-B.net sees a referring URL of http://www.Site-A.com/some-URL-that-gives-away-no-user-data.html</li>
</ul>
<p>
It appears that Facebook is now using this trick for all links that go offsite, including ads and links in user-generated content.  Thus, while the WSJ&#8217;s article arguably is alarmist, it seems to have helped push Facebook to deploy a more rigorous referrer protection than has been common in the industry.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2010/05/21/referring-urls-and-web-privacy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Success, failure, and conversion rates</title>
		<link>http://www.brianp.net/2010/05/10/success-failure-and-conversion-rates/</link>
		<comments>http://www.brianp.net/2010/05/10/success-failure-and-conversion-rates/#comments</comments>
		<pubDate>Mon, 10 May 2010 21:54:53 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=240</guid>
		<description><![CDATA[<p>As I continue working to bootstrap my startup, Jitify, one of the most challenging parts has been dealing with setbacks.  Sending a survey to 500 people and getting just 15 responses, for example.  Talking to five different prospective cofounders and having them all opt out for various sensible reasons.  Reaching out to [...]]]></description>
			<content:encoded><![CDATA[<p>As I continue working to bootstrap my startup, <a href="http://www.jitify.com/">Jitify</a>, one of the most challenging parts has been dealing with setbacks.  Sending a survey to 500 people and getting just 15 responses, for example.  Talking to five different prospective cofounders and having them all opt out for various sensible reasons.  Reaching out to ten experienced entrepreneurs for advice and getting a meeting with just one of them.</p>
<p>One of my key learnings from this process has been that my perception of success and failure is biased by my background.  In many engineering and scientific contexts, a test that produces the desired result just 10% of the time is a failure.  In product development situations, a project that hits its scheduled milestone dates just 10% of the time is probably in trouble.  In many marketing contexts, however, a 10% conversion rate is a triumph, and a 1% conversion rate is a sign that it&#8217;s worthwhile to keep trying (with different messaging for the next test, of course).</p>
<p>As I proceed with some of the harder aspects of building a startup &#8211; finding a cofounder, finding investors, finding customers &#8211; I&#8217;m finding it essential to keep in mind that these people-centric activities are marketing efforts, not project milestones or science experiments, and they need to be measured and managed as such.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2010/05/10/success-failure-and-conversion-rates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validation</title>
		<link>http://www.brianp.net/2010/01/15/validation/</link>
		<comments>http://www.brianp.net/2010/01/15/validation/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 15:10:14 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=237</guid>
		<description><![CDATA[<p>People from Computer Science backgrounds often use the word &#8220;orthogonal.&#8221;  I think that&#8217;s partly because it concisely describes an often-important concept, but mostly because it&#8217;s one of the few impressive words in our vernacular.  (&#8220;Idempotent&#8221; is my other favorite CS term.)</p>
<p>Other professions get to use a variety of big words.  Physicians, for [...]]]></description>
			<content:encoded><![CDATA[<p>People from Computer Science backgrounds often use the word &#8220;<a href="http://en.wikipedia.org/wiki/Orthogonal">orthogonal</a>.&#8221;  I think that&#8217;s partly because it concisely describes an often-important concept, but mostly because it&#8217;s one of the few impressive words in our vernacular.  (&#8220;<a href="http://en.wikipedia.org/wiki/Idempotent">Idempotent</a>&#8221; is my other favorite CS term.)</p>
<p>Other professions get to use a variety of big words.  Physicians, for example, have a rich, domain-specific vocabulary.  So do economists.  Lawyers have perhaps the best lexicon; not only do they get to use big, fancy words, but half of those words are in <i>Latin</i>.</p>
<p>Thus it was a pleasant surprise to read that a lawyer had adopted our humble &#8220;orthogonal&#8221; and <a href="http://www.washingtonpost.com/wp-dyn/content/article/2010/01/11/AR2010011103690.html">earned kudos</a> from the Justices of the United States Supreme Court for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2010/01/15/validation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The perception of performance</title>
		<link>http://www.brianp.net/2009/12/08/the-perception-of-performance/</link>
		<comments>http://www.brianp.net/2009/12/08/the-perception-of-performance/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 01:15:12 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=230</guid>
		<description><![CDATA[<p>I&#8217;ve found myself using Safari more and more, instead of Firefox, because Firefox is slow.</p>
<p>&#8220;Slow&#8221;?  What does that mean?</p>
<p>It means that when I start up Firefox, even if it&#8217;s already in the filesystem cache, the app&#8217;s Mac dock icon completes two full bounces before the browser window appears.  Safari&#8217;s doc icon completes approximately [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve found myself using Safari more and more, instead of Firefox, because Firefox is slow.</p>
<p>&#8220;Slow&#8221;?  What does that mean?</p>
<p>It means that when I start up Firefox, even if it&#8217;s already in the filesystem cache, the app&#8217;s Mac dock icon completes two full bounces before the browser window appears.  Safari&#8217;s doc icon completes approximately half of one bounce before its window appears.  The just-released Chrome for Mac also displays its window in half a bounce.</p>
<p>Each icon bounce takes approximately one second.  Thus I&#8217;ve developed a preference not to use Firefox&#8211;an otherwise excellent product&#8211;because it takes 1.5 seconds longer to start than the competition.</p>
<p>I&#8217;ll typically keep my web browser running for hours or even days after starting it up, so Firefox&#8217;s extra startup time is immaterial when amortized over the time between restarts.  That&#8217;s my quantitative assessment, anyway.  In practice, though, I tend to click the Safari icon because, qualitatively, it&#8217;s the fast one.</p>
<p>In software, <em>speed matters</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2009/12/08/the-perception-of-performance/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Integrating Mobwrite with nginx</title>
		<link>http://www.brianp.net/2009/11/16/integrating-mobwrite-with-nginx/</link>
		<comments>http://www.brianp.net/2009/11/16/integrating-mobwrite-with-nginx/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 16:32:42 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=227</guid>
		<description><![CDATA[<p>I recently helped an old friend with some prototyping and strategy for a stealth-mode project he&#8217;s doing.  He wanted to use MobWrite, a framework that allows multiple users to do real-time, collaborative editing of content in a web page.</p>
<p>There was one technical challenge: the project was using nginx as a webserver, and none of [...]]]></description>
			<content:encoded><![CDATA[<p>I recently helped an old friend with some prototyping and strategy for a stealth-mode project he&#8217;s doing.  He wanted to use <a href="http://code.google.com/p/google-mobwrite/">MobWrite</a>, a framework that allows multiple users to do real-time, collaborative editing of content in a web page.</p>
<p>There was one technical challenge: the project was using nginx as a webserver, and none of the existing web gateway implementations for MobWrite were well-suited for use with nginx.  MobWrite has a back-end server that speaks a custom protocol, and it needs a bit of additional software to translate HTTP requests from web browsers into the server&#8217;s protocol.  The MobWrite distribution contains PHP, JSP, and Python pages that do this translation.</p>
<p>It is possible to add support for any and all of those languages to nginx, but doing so adds substantial complexity.  Specifically, the event-driven design of nginx works well only with plugins that do their work in small, event-driven steps and do not block for I/O or lengthy computation.  PHP, mod_python, and JSP, in contrast, all are based on a programming model where the code that handles the request expects to run synchronously until completion.  Running such code inside the single-threaded, asynchronous nginx could allow a long-running PHP/Python/JSP request to block all other requests.  One common solution is to use an nginx gateway plugin like mod_scgi that dispatches requests for these synchronous languages to a separate pool of processes.  This enables a single nginx server to handle both synchronous PHP/Python/JSP requests and asynchronous static-content or HTTP-proxy requests without either type of request starving out the other.  However, adding a separate process pool for the synchronous requests means adding configuration and tuning complexity, thus diminishing one of the inherent advantages of using nginx.</p>
<p>Determined to have my cake and eat it too&#8211;i.e., to support MobWrite and other types of content in a single nginx server while still enjoying nginx&#8217;s single-process simplicity and efficiency&#8211;I made a new nginx plugin called nginx-mobwrite.  This plugin translates incoming HTTP requests from MobWrite clients into the MobWrite internal format and proxies them asynchronously to the MobWrite server.  The nginx architecture includes an &#8220;upstream&#8221; framework that manages requests to back end servers as part of nginx&#8217;s event loop.  The nginx-mobwrite uses this framework to dispatch translated requests to the MobWrite server and send the responses back to clients in an asynchronous manner, without blocking any other requests the nginx server might be handling at the same time.</p>
<p>The nginx-mobwrite plugin is available as open source, under v2.0 of the Apache License, on <a href="http://github.com/brianpane/nginx-mobwrite">GitHub</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2009/11/16/integrating-mobwrite-with-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips for installing Windows 7 on a Mac</title>
		<link>http://www.brianp.net/2009/11/04/tips-for-installing-windows-7-on-a-mac/</link>
		<comments>http://www.brianp.net/2009/11/04/tips-for-installing-windows-7-on-a-mac/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 07:06:42 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=221</guid>
		<description><![CDATA[<p>I decided recently to try installing Windows 7 on my iMac, in a Boot Camp dual-boot configuration alongside OS X.  I ultimately got it working, but I ran into one perplexing problem along the way.  Here&#8217;s a summary of the symptoms and the solution, in case the information is helpful to other people.</p>
<p>I [...]]]></description>
			<content:encoded><![CDATA[<p>I decided recently to try installing Windows 7 on my iMac, in a Boot Camp dual-boot configuration alongside OS X.  I ultimately got it working, but I ran into one perplexing problem along the way.  Here&#8217;s a summary of the symptoms and the solution, in case the information is helpful to other people.</p>
<p>I used the installation process described <a href="http://www.simplehelp.net/2009/01/15/using-boot-camp-to-install-windows-7-on-your-mac-the-complete-walkthrough/">here</a>.  After I clicked the &#8220;Start Installation&#8221; button in step 8, the computer rebooted and greeted me with a blank black screen with a blinking white underline cursor in the upper left.</p>
<p>A bit of web searching led me to a solution that worked: I had to reset the computer&#8217;s PRAM.  The PRAM apparently is an area of nonvolatile memory containing information about USB devices such as keyboards and mice.  The full process I had to use was:</p>
<ul>
<li>Power off the computer.</li>
<li>Unplug the keyboard and plug it into a different USB port.</li>
<li>Turn on the computer.</li>
<li>Immediately press the Command, Option, P, and R keys and hold them down until the system restarts.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2009/11/04/tips-for-installing-windows-7-on-a-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When Bad Monopolies Happen to Good Products</title>
		<link>http://www.brianp.net/2009/10/29/when-bad-monopolies-happens-to-good-products/</link>
		<comments>http://www.brianp.net/2009/10/29/when-bad-monopolies-happens-to-good-products/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 06:30:47 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=208</guid>
		<description><![CDATA[<p>I use a lot of Apple products, and I like them.  I&#8217;ve come to depend on the versatility of Mac OS X: rather than having to choose between Windows for good productivity tools and Linux for good engineering tools, I can have all those tools together in one OS X system.  The iPhone [...]]]></description>
			<content:encoded><![CDATA[<p>I use a lot of Apple products, and I like them.  I&#8217;ve come to depend on the versatility of Mac OS X: rather than having to choose between Windows for good productivity tools and Linux for good engineering tools, I can have all those tools together in one OS X system.  The iPhone combines a lot of useful functionality in a compact device that allows me to stay connected wherever I go.  The Time Capsule combines two essential features, a backup drive and a wireless router, in one turnkey appliance.  MobileMe synchronizes my calendar and address book seamlessly across all these devices.</p>
<p>Among the themes that unite these products are vertical integration and a consistent, centrally-controlled design language.  Those themes are not always virtues, however.</p>
<p>With the iPhone, Apple controls not only the design of the device and its built-in software, but also the only distribution channel for third-party software.  Yes, be fair, there is at least one <a href="http://cydia.saurik.com/">independent alternative</a> to Apple&#8217;s App Store.  To shop there, though, a consumer must &#8220;jailbreak&#8221; the iPhone.  Because there is no supported way of installing an alternate operating system on the iPhone, the people who provide jailbreaking tools have to engage in reverse-engineering and clever hacking simply to enable a customer to install their choice of software on the hardware they&#8217;ve bought.</p>
<p>The lack of an alternate distribution channel might not be troubling to me if the official App Store were an open marketplace.  Alas, vendors can only sell their software in the App Store if Apple approves and reviews it.  Apple has <a href="http://www.techcrunch.com/2009/07/31/fcc-takes-on-apple-and-att-over-google-voice-rejection/">blocked</a> products from competitors such as Google.  Greeting card parody website <a href="http://www.someecards.com">someecards</a> recently submitted an iPhone application for Apple&#8217;s approval.  Apple refused to allow the app to be sold in the App Store because it contained &#8220;<a href="http://www.techcrunch.com/2009/10/07/apple-rejects-someecards-app-for-being-full-of-someecards-content/">content that ridicules public figures</a>&#8220;&#8211;specifically Roman Polanski and Adolf Hitler.  Presumably Apple was just enforcing editorial standards in order to maintain a high quality of content in the App Store, right?  Well, maybe not.  When someeecards relented and created a version of their app without the contentious content, Apple finally approved it for sale in the App Store, right alongside other apps that met Apple&#8217;s standards for quality and tastefulness: apps like, well, <a href="http://www.techcrunch.com/2009/10/29/someecards-gives-in-to-apple-to-take-on-asian-boobs/">I&#8217;ll let TechCrunch explain that part</a>.</p>
<p>As a consumer, I&#8217;ve come to expect that retailers will apply their own biases in deciding what products to sell.  And in a free market, I will buy from businesses whose biases are compatible with my own.  Thus what bothers me about Apple is not the apparent hypocrisy of an App Store that banned the dark humor of someecards but approved the <a href="http://www.msnbc.msn.com/id/33310411/ns/technology_and_science-tech_and_gadgets/">controversial</a> Pepsi &#8220;Amp up before you score&#8221; app.  No, what bothers me is that Apple owns the only store and has <a href="http://www.eff.org/deeplinks/2009/02/apple-says-jailbreaking-illegal">attempted</a> to wield the DMCA as a means to prevent anyone from building a competing store.</p>
<p>Even OS X, my favorite part of the Apple ecosystem, allows me no choice other than vertical integration.  I can buy Windows and install it on any compatible brand of computer.  I can download Linux and install it on any compatible brand of computer.  I can buy OS X and install it on, well, any &#8220;<a href="http://store.apple.com/Catalog/US/Images/MacOSX.htm">Apple-labeled computer</a>.&#8221;</p>
<p>Apple&#8217;s strategy of centrally controlled, vertical integration has yielded some fine products.  Furthermore, it has produced substantial profits for the company.  As a <em>user</em> of Apple products, I am happy.  As a <em>shareholder</em> of AAPL, I am happy.  As a <em>customer</em>, I am increasingly disappointed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2009/10/29/when-bad-monopolies-happens-to-good-products/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby + MySQL dynamic library problems</title>
		<link>http://www.brianp.net/2009/10/06/ruby-mysql-dynamic-library-problems/</link>
		<comments>http://www.brianp.net/2009/10/06/ruby-mysql-dynamic-library-problems/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 19:21:51 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=201</guid>
		<description><![CDATA[<p>I wanted to try out Ruby on Rails with MySQL on OS X 10.6.  I ran into a few common problems along the way, so I am documenting the process here in case it might be helpful to others.</p>
Step 1: Install MySQL
<p>I grabbed the .tar.gz distribution of the latest MySQL 5.1 release and installed [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted to try out Ruby on Rails with MySQL on OS X 10.6.  I ran into a few common problems along the way, so I am documenting the process here in case it might be helpful to others.</p>
<h2>Step 1: Install MySQL</h2>
<p>I grabbed the .tar.gz distribution of the latest <a href="http://dev.mysql.com/downloads/">MySQL 5.1</a> release and installed it in a nonstandard location on my computer.  &#8220;Nonstandard&#8221; in this case means &#8220;somewhere other than /usr/local/mysql.&#8221;  This detail would be important in a later step.</p>
<h2>Step 2: Install the Ruby mysql gem</h2>
<p>I&#8217;d installed a 64-bit version of MySQL, so the installation process for the mysql gem was:</p>
<pre>
sudo env ARCHFLAGS="-arch x86_64" gem install -t mysql \
  -- --with-mysql-config=<i>/path/to/my/mysql/installation</i>/bin/mysql_config
</pre>
<p>For a 32-bit MySQL installation, replace the &#8220;x86_64&#8243; with &#8220;x86&#8243; in the ARCHFLAGS.</p>
<h2>Step 3: Set the DYLD_LIBRARY_PATH</h2>
<p>I omitted this step initially, and when I tried to run &#8220;rake db:migrate&#8221; for my Rails application, I got an error message:</p>
<pre>
uninitialized constant MysqlCompat::MysqlRes
</pre>
<p>In the environment of each user account where you plan to run Ruby apps that depend on MySQL, do this:</p>
<pre>
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:<i>/path/to/my/mysql/installation</i>/lib
</pre>
<p>Note that most of the command-line tools supplied with binary builds of MySQL appear to be statically linked with libmysqlclient.  This means that these tools may work flawlessly even if you&#8217;ve neglected to set the DYLD_LIBRARY_PATH.  The Ruby mysql gem, however, is dynamically linked to libmysqlclient, so it is essential that the MySQL lib directory be included in your DYLD_LIBRARY_PATH if MySQL is installed in a nonstandard location.</p>
<p>For most other Unix systems, the environment variable to set is LD_LIBRARY_PATH rather than DYLD_LIBRARY_PATH.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2009/10/06/ruby-mysql-dynamic-library-problems/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sequentially assigned IDs and giving away competitive intelligence</title>
		<link>http://www.brianp.net/2009/10/06/sequentially-assigned-ids-and-giving-away-competitive-intelligence/</link>
		<comments>http://www.brianp.net/2009/10/06/sequentially-assigned-ids-and-giving-away-competitive-intelligence/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 07:40:26 +0000</pubDate>
		<dc:creator>brianp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianp.net/?p=192</guid>
		<description><![CDATA[<p>This post on TechCrunch contains quite a nice analysis of Twitter&#8217;s user behavior:</p>
<p>Twitter Data Analysis: An Investor&#8217;s Perspective</p>
<p>As the author notes, it was possible to deduce so many key metrics because &#8220;Twitter uses auto-incrementing ID numbers (1,2,3,4…) for both users and tweets.&#8221;</p>
<p>Auto-incremented ID numbers are a common web development practice.  When you run an [...]]]></description>
			<content:encoded><![CDATA[<p>This post on TechCrunch contains quite a nice analysis of Twitter&#8217;s user behavior:</p>
<p><a href="http://www.techcrunch.com/2009/10/05/twitter-data-analysis-an-investors-perspective/">Twitter Data Analysis: An Investor&#8217;s Perspective</a></p>
<p>As the author notes, it was possible to deduce so many key metrics because &#8220;Twitter uses auto-incrementing ID numbers (1,2,3,4…) for both users and tweets.&#8221;</p>
<p>Auto-incremented ID numbers are a common web development practice.  When you run an online business, you and/or your users create data&#8211;hopefully lots of data.  Each record of data needs a unique identifier that you can use to go find that bit of data for later use.  Automatically-incrementing integer IDs are a common implementation choice because they have some desirable properties:</p>
<ul>
<li><strong>Compactness</strong> &#8211; Shorter URLs are generally a good thing.  In addition, IDs that can fit into a 32- or 64-bit integer representation allow for efficient storage in a database and efficient manipulation within most programming languages.</li>
<li><strong>Uniqueness</strong> &#8211; It is trivially easy to generate unique IDs with an auto-incrementing approach: keep track of the last ID you generated, and add one.</li>
<li><strong>Efficiency</strong> &#8211; Generating the next sequential ID value doesn&#8217;t take very long.  In more precise terms, it takes O(1) time; the speed with which you can generate the next integer is a constant, and this operation will not get slower as your data size grows.</li>
<li><strong>Convenience</strong> &#8211; Most databases have a built-in feature that can auto-generate auto-incrementing IDs.</li>
</ul>
<p>Despite these virtues, auto-incrementing IDs can reveal information about the rate at which you are accumulating customers or content.  If your user IDs are sequentially generated, for example, a competitor need only sign up for a new account on your website once a day to determine how fast your user base is growing.  You may not mind that risk; the engineering team at Twitter probably discussed this issue when designing their data model and consciously decided not to obscure their ID values.</p>
<p>In cases where you do want to avoid using auto-incrementing ID values, some alternative ID generation strategies are:</p>
<ul>
<li><strong>Random</strong> &#8211; Generate a random number every time you need a new ID.  Guaranteeing uniqueness requires a bit more work with this approach, though.</li>
<li><strong>Random increment</strong> &#8211; When generating a new ID, instead of adding one to the previously generated ID, add a random number.  This approach will exhaust the range of your chosen integer representation more quickly than the traditional auto-increment, though, so it is perhaps best used with a 64-bit representation.</li>
<li><strong>UUID</strong> &#8211; Use <a ref="http://en.wikipedia.org/wiki/Universally_Unique_Identifier">UUIDs</a> instead of integers as IDs.  UUIDs have the properties of efficiency and uniqueness (even with random UUID generation, there are enough bits to make duplicates very rare) but are less compact than a typical auto-incrementing numeric ID.  A UUID occupies 36 bytes in human-readable form or 16 bytes (128 bits) in binary form.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.brianp.net/2009/10/06/sequentially-assigned-ids-and-giving-away-competitive-intelligence/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
