<?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>Daily Morn by Raymond Li</title>
	<atom:link href="http://rayli.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://rayli.net/blog</link>
	<description></description>
	<lastBuildDate>Thu, 02 Sep 2010 04:01:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Windows Mobile screen calibration</title>
		<link>http://rayli.net/blog/2010/09/windows-mobile-screen-calibration/</link>
		<comments>http://rayli.net/blog/2010/09/windows-mobile-screen-calibration/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 04:01:33 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Windows Mobile]]></category>
		<category><![CDATA[HTC Touch Pro 2]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=616</guid>
		<description><![CDATA[Screen calibration is tucked away under a myriad of icons and menus.  Despite the calibration you did when you first got the device, the touch screen may need to be re-calibrated.  There&#8217;s no need to do a hard reset if you follow just a few short steps.

In fewer than 10 steps, you can re-calibrate your touch [...]]]></description>
			<content:encoded><![CDATA[<p>Screen calibration is tucked away under a myriad of icons and menus.  Despite the calibration you did when you first got the device, the touch screen may need to be re-calibrated.  There&#8217;s no need to do a hard reset if you follow just a few short steps.</p>
<p><span id="more-616"></span></p>
<p>In fewer than 10 steps, you can re-calibrate your touch screen for your Windows Mobile device (I&#8217;m using the HTC Touch Pro 2).</p>
<ol>
<li>Click on <em>Start</em>.</li>
<li>Click on the <em>Settings</em> icon.</li>
<li>A screen containing various settings is displayed.</li>
<li>Click on the word <em>Menu</em> at the bottom right corner.</li>
<li>Click on <em>All Settings</em>.</li>
<li>Click on the <em>System</em> icon.</li>
<li>Click on the <em>Screen</em> icon.</li>
<li>Click on the <em>Align Screen</em> button.</li>
<li>Follow the directions for re-calibrating the touch screen.</li>
</ol>
<p>&#8230;and there you go.  Your touch screen is ready to go!</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2010/09/windows-mobile-screen-calibration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VimOutliner Windows installation howto</title>
		<link>http://rayli.net/blog/2010/08/vimoutliner-windows-installation-howto/</link>
		<comments>http://rayli.net/blog/2010/08/vimoutliner-windows-installation-howto/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 02:21:39 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Vim]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[VimOutliner]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=505</guid>
		<description><![CDATA[VimOutliner is a plugin that turns Vim into an outliner.  It&#8217;s cross-platform.  However, installing it on Windows can be challenging.  My customized version of the plugin should make it a breeze.


Why VimOutliner?

Vi lovers, this is probably the only reason that you need.  All your Vi keystrokes work in VimOutliner as they would in Vim.  Need [...]]]></description>
			<content:encoded><![CDATA[<p><a title="VimOutliner" href="http://vimoutliner.org/">VimOutliner</a> is a plugin that turns Vim into an outliner.  It&#8217;s cross-platform.  However, installing it on Windows can be challenging.  My customized version of the plugin should make it a breeze.</p>
<p><span id="more-505"></span></p>
<p><img class="alignnone" title="Vim Outline" src="/ref/2010-08/vimoutline.png" alt="Vim Outline" width="400" height="350" /></p>
<h3>Why VimOutliner?</h3>
<ol>
<li>Vi lovers, this is probably the only reason that you need.  All your Vi keystrokes work in VimOutliner as they would in Vim.  Need I say more?</li>
<li>Vim is free, and VimOutliner is also free.  You can have access to a powerful outliner on any of your computers without paying a penny.</li>
<li>Vim/VimOutliner is cross-platform.  Whether you are using MacOS, Windows, Linux or some other variant of Unix (even Cygwin!), you can have the same outliner on every platform.</li>
<li>VimOutliner files are simple text files that rely on indentation to indicate the level of nesting.  Therefore, the outline files can be viewed using any text editor (not just Vim).  Using Vim with the VimOutliner plugin provides added features like folding, checkboxes, hoisting, and percentage done (just to name a few).</li>
<li>VimOutliner can run over an SSH session.  Since Vim can run at the console, VimOutliner inherits this ability.  There&#8217;s no need to initiate a Remote Desktop connection or leverage VNC, VimOutliner is text-based so an SSH session is all you need.</li>
<li>With complete access to the plugin&#8217;s source code, you can modify VimOutliner to meet your needs and do whatever you think an outliner should do.</li>
</ol>
<h3>Installation howto</h3>
<p>My customized version of VimOutliner 3.4 provides a straight-forward installation that works on Windows XP, Windows Vista and Windows 7.  I&#8217;ve only tested it on Vim 7.2.  If you run into issues using with other versions of Vim, please let me know or post a comment.</p>
<ol>
<li>Download <a title="VimOutliner-rayli.zip" href="/ref/2010-08/vimoutliner-rayli.zip">vimoutliner-rayli.zip</a>.</li>
<li>Extract it in <em>C:\Program Files\Vim\</em>.</li>
<li>This will create a <em>C:\Program Files\Vim\vimfiles\</em> directory (if it doesn&#8217;t already exist).  In addition, this puts the required plugin files in the correct directories.</li>
<li>Add to the <em>C:\Program Files\Vim\_vimrc</em> file the following lines:</li>
</ol>
<pre class="brush: plain;">
filetype plugin indent on
syntax on
runtime! ftdetect\*.vim
</pre>
<h3>My customizations</h3>
<p>These customizations are already integrated into my zip file.  If you don&#8217;t like them, you can change them or remove them.</p>
<ol>
<li>In <em>C:\Program Files\Vim\vimfiles\ftdetect\vo_base.vim</em>, comment out the <em>if-endif</em> block.  For whatever reason, this block causes my installation issues.</li>
<li>In <em>C:\Program Files\Vim\vimfiles\syntax\vo_base.vim</em>, search for <em>OL2</em> twice.</li>
<li>On that line, change <em>guifg=red </em>to <em>guifg=#FFAE66</em>.</li>
<li>In that same file, search for <em>OL6</em>.</li>
<li>Change <em>guifg=red </em>to <em>guifg=#FFAE66</em>.</li>
<li>The red syntax highlighting is too bright and doesn&#8217;t work well for me, so this change works much better.</li>
<li>Search for <em>FoldColumn</em>.</li>
<li>Comment out the <em>FoldColumn</em> line.</li>
<li>In <em>C:\Program Files\Vim\vimfiles\ftplugin\vo_base.vim</em>, search for <em>foldcolumn</em>.</li>
<li>Replace <em>foldcolumn=1</em> with <em>foldcolumn=4</em>.</li>
<li>My outlines usually nest more than 1 level, so it&#8217;s nice to see the fold characters rather than the fold level numbers in the fold column.</li>
</ol>
<p>And there you have it&#8230;  this installation has served me well for quite some time now, and I hope the trend continues with your installation.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2010/08/vimoutliner-windows-installation-howto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When to use &#8220;a&#8221; or &#8220;an&#8221;</title>
		<link>http://rayli.net/blog/2010/07/when-to-use-a-or-an/</link>
		<comments>http://rayli.net/blog/2010/07/when-to-use-a-or-an/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 12:17:00 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Grammar]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=537</guid>
		<description><![CDATA[A historic or an historic?  A university or an university?  A MBA or an MBA?  A user or an user?  If there&#8217;s even a little doubt about which is correct, there is a simple rule to clear up the confusion.

First, why the confusion?
In grade school, I was taught a simple (but wrong) rule for using [...]]]></description>
			<content:encoded><![CDATA[<p>A historic or an historic?  A university or an university?  A MBA or an MBA?  A user or an user?  If there&#8217;s even a little doubt about which is correct, there is a simple rule to clear up the confusion.</p>
<p><span id="more-537"></span></p>
<h3>First, why the confusion?</h3>
<p>In grade school, I was taught a simple (but wrong) rule for using <em>a </em>or <em>an</em>:</p>
<blockquote><p>Use &#8220;a&#8221; for words that begin with a consonant and &#8220;an&#8221; for words that begin with vowels.</p></blockquote>
<p>Although this rule is correct for a lot of words, the actual rule has very little to do with how a word is <em>spelled</em>.  The rule has everything to do with how the word is <em>pronounced</em>:</p>
<blockquote><p>Use &#8220;a&#8221; for words that begin with a consonant sound and &#8220;an&#8221; for words that begin with a vowel sound.</p></blockquote>
<h3>Common questions</h3>
<p><span style="color: #ff6600;"><em>Question:</em> A historic or an historic?</span><br />
<em>Answer:</em> A historic.  The word <em>historic </em>is pronounced with an <em>H </em>sound.  In this case, the <em>H </em>sound is a consonant sound.</p>
<p><span style="color: #ff6600;"><em>Question:</em> A university or an university?</span><br />
<em>Answer:</em> A university.  Although <em>U </em>is a vowel, the pronunciation of <em>university </em>begins with a <em>Y </em>sound (you-nee-&#8230;) which is a consonant sound.</p>
<p><a name="mba"></a><span style="color: #ff6600;"><em>Question: </em>A MBA or an MBA?</span><br />
<em>Answer: </em>Both.  If you pronounce the acronym as em-bee-ey, you should use <em>an</em>, since it&#8217;s pronounced with a vowel sound.  However, if you expand the acronym to <em>Master of Business Administration</em>, you should use <em>a</em>, since <em>master </em>is pronounced with a consonant <em>M </em>sound.  Although the former is more commonly used, both are acceptable.</p>
<p><span style="color: #ff6600;"><em>Question: </em>A user or an user?</span><br />
Answer: A user.  Although <em>U </em>is a vowel, the pronunciation of <em>user </em>begins with a <em>Y </em>sound (you-zer) which is a consonant sound.</p>
<p><span style="color: #ff6600;"><em>Question:</em> A hotel or an hotel?</span><br />
<em>Answer:</em> A hotel.  The word <em>hotel </em>is pronounced with an <em>H </em>sound.  In this case, the <em>H </em>sound is a consonant sound.</p>
<h3>Tough questions</h3>
<p><span style="color: #ff6600;"><em>Question: </em>A one or an one?</span><br />
<em>Answer:</em> A one.  The word <em>one </em>is pronounced with a <em>W </em>sound.  In this case, the <em>W</em> sound is a consonant sound.</p>
<p><span style="color: #ff6600;"><em>Question: </em>A useful or an useful?</span><br />
<em>Answer:</em> A useful.  Although <em>U </em>is a vowel, the pronunciation of <em>useful </em>begins with a <em>Y </em>sound (yoos-ful) which is a consonant sound.</p>
<p><span style="color: #ff6600;"><em>Question: </em>A email or an email?</span><br />
Answer: An email.  The pronunciation of the word <em>email </em>begins with an <em>eee </em>sound.  This is a vowel sound.</p>
<p><span style="color: #ff6600;"><em>Question: </em>A or an before s-words?</span><br />
<em>Answer:</em> It depends.  For a simple word like <em>secure</em>, you should use <em>a secure</em>, since its pronunciation begins with an <em>S</em> consonant sound.  For a more complex example like <em>SSH</em>, you should go through the same thought process as in the <a href="#mba"><em>MBA </em>question</a>.  You could go either way for <em>SSH</em>.  However, the more common usage is <em>an SSH</em>.</p>
<p><span style="color: #ff6600;"><em>Question: </em>A or an before x-words?</span><br />
<em>Answer:</em> It depends again.  For a simple word like <em>xylophone</em>, you should use <em>a xylophone</em>, since its pronunciation begins with an <em>Z</em> consonant sound.  For a more complex example like <em>x-ray</em>, you should pronounce the word: <em>ex-ray</em>.  Its pronunciation begins with a vowel sound, so its usage is <em>an x-ray</em>.</p>
<h3>Trick question</h3>
<p><span style="color: #ff6600;"><em>Question:</em> A honest or an honest?</span><br />
<em>Answer:</em> An honest.  Did I catch you?  The word <em>honest </em>begins with an <em>H </em>which is a consonant.  However, it is pronounced <em>onest</em>.  That&#8217;s right&#8230;  its pronunciation begins with a vowel sound.</p>
<h3>Let your ear decide</h3>
<p>The old grade school rule works most of the time for two reasons:</p>
<ol>
<li>The spelling of most words that begin with a consonant are pronounced with a consonant sound.</li>
<li>The same is true for words that begin with a vowel &#8212; they are pronounced with a vowel sound.</li>
</ol>
<p>However, the examples given above show the spelling of some words that begin with a consonant are pronounced with a vowel sound.  Some that begin with a vowel are pronounced with a consonant sound.  So when all else fails, say the word aloud, and let your ear decide whether it begins with a consonant or a vowel.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2010/07/when-to-use-a-or-an/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Acer Aspire One Slow?</title>
		<link>http://rayli.net/blog/2010/06/acer-aspire-one-slow/</link>
		<comments>http://rayli.net/blog/2010/06/acer-aspire-one-slow/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 10:28:33 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Popular]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Netbook]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=429</guid>
		<description><![CDATA[The Acer Aspire One netbook running Windows 7 Starter Edition won&#8217;t win any performance benchmarks.  However, you can greatly improve this netbook&#8217;s responsiveness with some targeted tweaking.
DISCLAIMER: Some of the tips mentioned below potentially leave your system vulnerable.  Although these particular settings work for me, they may not be the best fit for how you [...]]]></description>
			<content:encoded><![CDATA[<p>The Acer Aspire One netbook running Windows 7 Starter Edition won&#8217;t win any performance benchmarks.  However, you can greatly improve this netbook&#8217;s responsiveness with some targeted tweaking.</p>
<p><span id="more-429"></span>DISCLAIMER: Some of the tips mentioned below potentially leave your system vulnerable.  Although these particular settings work for me, they may not be the best fit for how you use your netbook and your environment.  Please use these tips at your own risk.</p>
<ul>
<li><a title="More RAM" href="#ram">Add more RAM</a></li>
<li><a title="Disable styling extras" href="#performance">Disable performance and appearance options</a></li>
<li><a title="Disable services" href="#services">Disable services</a></li>
<li><a title="Disable start-up applications" href="#startup">Disable start-up applications</a></li>
<li><a title="Disable McAfee anti-virus" href="#mcafee">Disable McAfee anti-virus</a></li>
<li><a title="Disable sound schemes" href="#sound">Disable sound schemes</a></li>
<li><a title="Disable system restore" href="#system-restore">Disable system restore</a></li>
</ul>
<h3><a name="ram"></a>Add more RAM</h3>
<p>Adding more RAM is one of the most expensive and invasive options for remedying a slow netbook.  However, it arguably offers the greatest gains.  My netbook comes with 1GB of RAM and can handle an upgrade to 2GB.  Increasing the amount of RAM available to your system (in this case, doubling the RAM) produces increased responsiveness you&#8217;ll notice immediately.</p>
<p>First, find out how much RAM you currently have.</p>
<ol>
<li>Press the <em>Windows</em> key.</li>
<li>Type <em>system</em> in the search box.</li>
<li>Run the <em>System </em>application from the search results.</li>
<li>Under the <em>System </em>section, look for <em>Installed memory (RAM)</em>.</li>
</ol>
<p><img class="alignnone" title="System RAM" src="/ref/2010-06/system-ram.png" alt="System RAM" width="400" height="280" /></p>
<p>Then, look in your Aspire One manual to determine how much RAM your netbook can handle.  You can also rely on the memory experts at <a title="Crucial" href="http://crucial.com">Crucial</a> for this information.</p>
<ol>
<li>Navigate to the Crucial website: <a title="Crucial" href="http://crucial.com">http://crucial.com</a>.</li>
<li>Using the Crucial Memory Advisor Tool, select the <em>Manufacturer</em> (Acer).</li>
<li>Select the <em>Product Line</em> (Aspire netbooks).</li>
<li>Select the <em>Model</em> (Aspire One 532h, your model may be slightly different).</li>
<li>Click <em>Find It</em>.</li>
</ol>
<p><em>Crucial </em>displays the default configuration for your netbook and the memory upgrades that are possible.  A list of compatible parts is also listed.  For my configuration, I can get a 2GB DDR2 for about $50.</p>
<p>Numerous guides are available for installing the memory upgrade (just do a search for <em>aspire one memory upgrade</em>).  This is the one I found most useful: <a title="How to Add RAM to the 10-inch Acer Aspire One" href="http://www.laptopmag.com/Advice/how-to/aspire-one-10-ram.aspx">How to Add RAM to the 10-inch Acer Aspire One</a>.</p>
<h3><a name="performance"></a>Disable performance and appearance options</h3>
<p>Adjusting the Windows 7 performance and appearance options is bound to increase the responsiveness of your netbook.</p>
<ol>
<li>Press the <em>Windows</em> key.</li>
<li>Type <em>system</em> in the search box.</li>
<li>Run the <em>System </em>application from the search results.</li>
<li>Click on the <em>Advanced system settings</em> link.</li>
<li>Click on the <em>Advanced</em> tab.</li>
<li>In the <em>Performance</em> section, click on the <em>Settings</em> button.</li>
<li>It&#8217;s up to you which options you&#8217;d like to keep around.  On my netbook, I uncheck all except:<br />
<em> Show window contents while dragging<br />
Smooth edges of screen fonts<br />
Use visual styles on windows and buttons</em></li>
<li>Click <em>OK</em>.</li>
</ol>
<p><img class="alignnone" title="Performance Options" src="/ref/2010-06/performance-options.png" alt="Performance Options" width="377" height="541" /></p>
<h3><a name="services"></a>Disable services</h3>
<p>Setting unneeded services to start <em>Manually</em> will definitely free up resources previously used by those services.</p>
<ol>
<li>Press the <em>Windows</em> key.</li>
<li>Type <em>services</em> in the search box.</li>
<li>Run the <em>Services </em>application from the search results.</li>
<li>To set services to start manually, double-click on the service.</li>
<li>Set each of these services to start <em>Manually</em>, and click <em>OK</em>.<br />
<em>Desktop Window Manager Session Manager<br />
Diagnostic Policy Service<br />
Distributed Link Tracking Client<br />
IP Helper<br />
Print Spooler (I don&#8217;t print from my netbook)<br />
TCP/IP NetBIOS Helper</em></li>
</ol>
<p><img class="alignnone" title="Services" src="/ref/2010-06/services.png" alt="Services" width="400" height="451" /></p>
<h3><a name="startup"></a>Disable startup applications</h3>
<p>Disabling unneeded startup applications speeds up Windows 7 start-up time and frees up resources previously used by those applications.</p>
<ol>
<li>Press the <em>Windows</em> key.</li>
<li>Type <em>system configuration</em> in the search box.</li>
<li>Run the <em>System Configuration</em> application from the search results.</li>
<li>Click on the <em>Startup</em> tab.</li>
<li>Uncheck processes you don&#8217;t want running at startup.</li>
<li>Click <em>OK</em>.</li>
</ol>
<p><img class="alignnone" title="System Configuration" src="/ref/2010-06/startup.png" alt="System Configuration" width="400" height="267" /></p>
<h3><a name="mcafee"></a>Disable McAfee anti-virus</h3>
<p>Anti-virus programs are necessary in many environments for providing a safe computing experience.  If anti-virus programs saved your computer more times than you can remember, do not take my advice.  However, if you can&#8217;t remember the last time anti-virus did anything for you except slow down your system, <a title="Choosing Anti-Anti-Virus Software" href="http://www.codinghorror.com/blog/2007/02/choosing-anti-anti-virus-software.html">you are not alone</a>.</p>
<p>Because of the stranglehold that McAfee has on my system, I chose to completely uninstall it.</p>
<ol>
<li>Press the <em>Windows</em> key.</li>
<li>Type <em>program and features</em> in the search box.</li>
<li>Run the <em>Program and Features</em> application from the search results.</li>
<li>Locate the McAfee application in the program listing.</li>
<li>Right-click on it.</li>
<li>Click <em>Uninstall</em>.</li>
</ol>
<h3><a name="sound"></a>Disable sound schemes</h3>
<p>Playing sounds during certain actions in Windows takes up some resources.  If you like the sound schemes, by all means keep them.  If it doesn&#8217;t matter to you, disable them so that there&#8217;s one less thing taking up system resources.</p>
<ol>
<li>Press the <em>Windows</em> key.</li>
<li>Type <em>sound</em> in the search box.</li>
<li>Run the <em>Sound</em> application from the search results.</li>
<li>Click on the <em>Sounds</em> tab.</li>
<li>Set <em>Sound Scheme</em> to <em>No Sounds</em>.</li>
<li>Uncheck <em>Play Windows Startup sound</em>.</li>
<li>Click <em>OK</em>.</li>
</ol>
<p><img class="alignnone" title="Sound" src="/ref/2010-06/sound.png" alt="Sound" width="400" height="445" /></p>
<h3><a name="system-restore"></a>Disable system restore</h3>
<p><em>System restore</em> definitely has its advantages.  When you absolutely must back out of some system changes, being able to restore to a previously working point is an awesome safety net.  Since my netbook is not my primary computer, <em>system restore</em> is an extra application that takes up resources to periodically snapshot images of my system.  In addition, it requires a relatively large chunk of disk space.  So, I disable it.</p>
<ol>
<li>Press the <em>Windows</em> key.</li>
<li>Type <em>system</em> in the search box.</li>
<li>Click on the <em>System Protection</em> link.</li>
<li>Click on the <em>System Protection</em> tab.</li>
<li>In the <em>Protection Settings</em> section, click on a drive.</li>
<li>Click on the <em>Configure </em>button.</li>
<li>In the Restore Settings section, click on the <em>Turn off system protection</em> option.</li>
<li>Click <em>OK</em>.</li>
<li>Once system restore is disabled for all desired drives, click <em>OK</em>.</li>
</ol>
<p><img class="alignnone" title="System Protection" src="/ref/2010-06/system-protection.png" alt="System Protection" width="400" height="445" /></p>
<p>With these tweaks, my RAM usage noticeably decreased and system responsiveness seems to be snappier.  Hopefully, they&#8217;ll produce a similar result for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2010/06/acer-aspire-one-slow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tickler file system alternative</title>
		<link>http://rayli.net/blog/2010/05/tickler-file-system-alternative/</link>
		<comments>http://rayli.net/blog/2010/05/tickler-file-system-alternative/#comments</comments>
		<pubDate>Mon, 31 May 2010 01:37:20 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Popular]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[GTD]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=353</guid>
		<description><![CDATA[A tickler file system is an old but innovative way to schedule a physical reminder on a specific date.  However, checking it everyday, ensuring it&#8217;s up-to-date, and rotating the reminders to each new month seems like an added hassle (especially if most of your 43 folders are empty!).  There is an alternative&#8230;
If you&#8217;re already familiar [...]]]></description>
			<content:encoded><![CDATA[<p>A tickler file system is an old but innovative way to schedule a physical reminder on a specific date.  However, checking it everyday, ensuring it&#8217;s up-to-date, and rotating the reminders to each new month seems like an added hassle (especially if most of your 43 folders are empty!).  There is an alternative&#8230;</p>
<p><span id="more-353"></span>If you&#8217;re already familiar with tickler file systems, skip the walk-through and read about the alternative.</p>
<h3>A quick walk-through</h3>
<p>Using the tickler file system is easier to describe with an example. The tickler file system consists of 2 sets of folders:</p>
<ol>
<li>12 folders labeled with the name of each month</li>
<li>31 folders labeled from 1 to 31 for each day of the current month (enough folders for 28, 29, 30 and 31 day months)</li>
</ol>
<p>Start with the day folders from 1 to 31.  Place the month folders in month order behind the day folders.  Let&#8217;s say today is January 1st.  You wake up with a slight New Year&#8217;s hangover and glance over at your tickler file system.  You notice the day 1 folder is empty, so there&#8217;s no reminders for January 1st.  Refile this folder behind the February folder.  The day 1 folder is now used to hold reminders for February 1st.</p>
<p>You just remember that you have a meeting tomorrow (January 2nd).  To remind yourself of the meeting, you put the agenda for the meeting in day folder 2.  The thinking is that when you look at day folder 2 tomorrow, you&#8217;ll be instantly &#8220;tickled&#8221; by the meeting occurring right after New Year&#8217;s.</p>
<p>After looking at your email, you notice the meeting is rescheduled for February 14th.  Day folder 14 is currently holding reminders for January 14th, so you place the meeting agenda in the February folder.  When February rolls around, you&#8217;ll need to go through all the items in the February folder and redistribute them among the day folders.</p>
<h3>Weaknesses of tickler file system</h3>
<p>The weaknesses of the tickler file system are many:</p>
<ol>
<li>In a recent <a title="Tickler Lite? | GTD Times" href="http://www.gtdtimes.com/2010/05/10/tickler-lite/">post at GTD Times</a>, a GTDer asked about a &#8220;tickler lite&#8221; system to address their 43 folders (12 month folders + 31 day folders) frequently being empty.  Unless you have lots of reminders to tickle yourself about, this is one of the weaknesses of the tickler file system &#8212; multiple folders can go unused.</li>
<li>Making sure to check it everyday could also be considered a weakness initially until it becomes a daily habit.  However, I find that checking a system that is empty more often than not can easily lead to neglecting it.  For example, if you get email everyday, you&#8217;re more likely to check for new messages than if you get messages every few days.</li>
<li>One more weakness is the need to re-sort reminders stored in the month folders.  The necessity to re-sort reminders indicates that the reminder must keep track of its due date.
<p>If we go back to our previous example regarding the meeting agenda on February 14th, the date for the agenda must be somewhere on the agenda.  It might already be mentioned in the agenda or it could be a post-it placed on the agenda.  Because you&#8217;re putting off re-sorting the month day folder, you must remind yourself what date the reminder should be sorted into.</li>
<li>Additionally, you must remind yourself to do this re-sorting every month.  Doing it daily is another option.  However, you&#8217;ll be sorting and re-sorting other reminders in the month folder that are not quite ready to be sorted into their corresponding day folders.</li>
<li>After filing an item into the desired day or month folder, you&#8217;ll potentially search through 43 folders if you need to find the item before its &#8220;tickle&#8221; date.</li>
</ol>
<h3>An alternative</h3>
<p>An alternative is it to leverage other parts of GTD to serve a similar function.</p>
<p>The tickler file is basically a date-based reminder that allows you to store a physical item. Instead of a tickler file, you could record a reminder in your calendar and then file away the item in your reference folders. The reminder could even tell you what folder to look in.  In this way, you could leverage your existing calendar and filing system and not have to maintain a tickler system that you rarely use.</p>
<p>The advantages of this approach are numerous:</p>
<ol>
<li>No daily habit of checking your tickler file system, because your calendar is already something that you check everyday.</li>
<li>No re-sorting tickler reminders for the next month, because your calendar has entries for the whole year.  Just enter the reminder into its corresponding date in your calendar.</li>
<li>Only limited by your filing system rather than your tickler filing system.  Your filing system implementation is probably more robust than most tickler filing system implementations (large filing cabinet vs. expanding accordion files).</li>
<li>Depending on your filing system, items are categorized by topic or project rather than by date (as in the tickler file system).  Finding the item before its tickle date involves leveraging your filing system rather than possibly searching through all 43 folders.</li>
<li>No extra system to maintain and take up psychic RAM.</li>
</ol>
<p>In a nutshell, the tickler filing system can be essentially re-defined as a reminder on your calendar that specifically references an item in your filing system.</p>
<p>UPDATE: A <a title="Comment from Christoph Dollis" href="http://rayli.net/blog/2010/05/tickler-file-system-alternative/#comment-272">comment from Christoph Dollis</a> points out the system is not limited to an item in a physical file system.  An item in your digital filing system could be just as effectively referenced from your calendar.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2010/05/tickler-file-system-alternative/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>What are the benefits of a tracing JIT?</title>
		<link>http://rayli.net/blog/2010/04/what-are-the-benefits-of-a-tracing-jit/</link>
		<comments>http://rayli.net/blog/2010/04/what-are-the-benefits-of-a-tracing-jit/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 02:54:25 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=266</guid>
		<description><![CDATA[Firefox uses a tracing JIT.  Adobe&#8217;s been using it for a while.  A Python interpreter uses tracing.  Microsoft is also researching its possibilities.  So what&#8217;s the big deal?

What is a tracing JIT?
Although tracing JITs are a complex technology, the core concept is  about optimizing execution of the hot paths in a program.  The emphasis [...]]]></description>
			<content:encoded><![CDATA[<p>Firefox <a title="TraceMonkey" href="http://en.wikipedia.org/wiki/TraceMonkey#TraceMonkey">uses a tracing JIT</a>.  Adobe&#8217;s been <a title="Tamarin" href="http://www.mozilla.org/projects/tamarin/">using it for a while</a>.  A Python interpreter <a title="PyPy Status Blog: Applying a Tracing JIT to an Interpreter" href="http://morepypy.blogspot.com/2009/03/applying-tracing-jit-to-interpreter.html">uses tracing</a>.  Microsoft is also <a title="SPUR: A Trace-Based JIT Compiler for CIL" href="http://research.microsoft.com/en-us/projects/spur/">researching its possibilities</a>.  So what&#8217;s the big deal?</p>
<p><span id="more-266"></span></p>
<p><em><strong>What is a tracing JIT?</strong></em></p>
<p>Although tracing JITs are a complex technology, the core concept is  about optimizing execution of the hot paths in a program.  The emphasis  is specifically on hot paths that return to the start of a path which sounds very  much like a loop.  However, the traditional definition of a programming  loop is only a subset of these hot paths.  The broader definition  includes code that spans methods and possibly even modules.  This  broader definition of a loop is what&#8217;s called a <em>trace</em>.</p>
<p><em><strong>Why use traces?</strong></em></p>
<p>By JIT compiling the traces, code that is executed frequently runs faster.  Code that isn&#8217;t included in traces isn&#8217;t compiled.  The claim is untraced code would not benefit as greatly from JIT compilation since it is not executed as frequently.  The basic trade-off is the time needed to JIT compile and cache the resulting code versus  the time needed to execute the code.</p>
<p><em><strong>When does tracing happen?</strong></em></p>
<p>Tracing takes place as instructions are interpreted.  Whether it&#8217;s Java, Python or Javascript, the code must be interpreted by a virtual machine.  It is during this stage that loops are detected and identified as traces.</p>
<p><em><strong>How is a tracing JIT different from other JITs?</strong></em></p>
<p>﻿﻿Run-time profiling for optimization and specific CPU and memory optimizations are done with most JITs to adapt the application for best performance.  However, non-tracing JIT implementations (Sun&#8217;s Java VM and Microsoft&#8217;s CLR) do this at the method level.  When code is determined to be &#8220;hot,&#8221; the entire method containing that code is JIT compiled and cached.  Tracing JITs do this at the trace level and may consist of a portion of a method (just a specific loop), multiple methods and even multiple methods from different modules.</p>
<p><em><strong>Who is using tracing JITs?</strong></em></p>
<p>The Mozilla Team uses a tracing JIT in the JavaScript engine for Firefox.  It&#8217;s codenamed <a title="TraceMonkey" href="https://wiki.mozilla.org/JavaScript:TraceMonkey">TraceMonkey</a> and is enabled by default in Firefox since version 3.5.  Adobe Labs has a tracing JIT called <a title="Tamarin" href="http://www.mozilla.org/projects/tamarin/">Tamarin</a>.  It&#8217;s basically a JavaScript engine as well.  Technically, it&#8217;s an implementation of ActionScript which is based on ECMAScript which JavaScript is based on.  Tamarin and TraceMonkey are so closely related that they both use the same backend: <a title="NanoJit" href="http://developer.mozilla.org/En/Nanojit">NanoJit</a>.</p>
<p>A Python interpreter called <a title="What is the purpose of PyPy?" href="http://rayli.net/blog/2010/04/what-is-the-purpose-of-pypy/">PyPy</a> recently <a title="PyPy JIT Overview" href="http://codespeak.net/pypy/dist/pypy/doc/jit/overview.html">switched</a> from being based on partial evaluation to a tracing JIT.  Microsoft is researching and prototyping a tracing JIT compiler (TJIT) for the common intermediate language (CIL) called <a title="SPUR: A Trace-Based JIT Compiler for CIL" href="http://research.microsoft.com/en-us/projects/spur/">SPUR</a>.</p>
<p><em><strong>Where can I find out more?</strong></em></p>
<p>This post only scratches the surface.  There&#8217;s plenty more about tracing JITs!</p>
<ul>
<li><a title="Andreas Gal" href="http://andreasgal.wordpress.com/">Andreas Gal&#8217;s blog</a></li>
<li><a title="Lambda the Ultimate | Have tracing JIT compilers won?" href="http://lambda-the-ultimate.org/node/3851">Lambda the Ultimate thread on tracing JITs (highly recommended)</a></li>
<li><a title="Hacker News | Have Tracing JIT Compilers Won?" href="http://news.ycombinator.com/item?id=1180517">Hacker News thread on tracing JITs</a></li>
<li><a title="Tracing JIT Notes" href="http://michael.bebenita.com/">Tracing JIT Notes</a></li>
<li><a title="Trace tree" href="http://en.wikipedia.org/wiki/Trace_tree">Wikipedia entry on trace trees</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2010/04/what-are-the-benefits-of-a-tracing-jit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is the purpose of PyPy?</title>
		<link>http://rayli.net/blog/2010/04/what-is-the-purpose-of-pypy/</link>
		<comments>http://rayli.net/blog/2010/04/what-is-the-purpose-of-pypy/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 20:03:59 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=189</guid>
		<description><![CDATA[PyPy is a Python interpreter written in Python.  It claims to be faster than CPython for certain benchmark tests.  How can Python &#8212; not particularly known for its speed &#8212; interpret Python source code faster than an interpreter written in C?  Also, an interpreter written in Python sounds like a neat exercise, but what&#8217;s the [...]]]></description>
			<content:encoded><![CDATA[<p><a title="PyPy" href="http://codespeak.net/pypy/">PyPy</a> is a Python interpreter written in Python.  It claims to be faster than CPython for certain benchmark tests.  How can Python &#8212; not particularly known for its speed &#8212; interpret Python source code faster than an interpreter written in C?  Also, an interpreter written in Python sounds like a neat exercise, but what&#8217;s the point of doing this?</p>
<p><span id="more-189"></span><strong><em>How can Python interpret Python source code faster than an interpreter written in C?</em></strong></p>
<p>The short answer is it can&#8217;t.  The long answer is that PyPy is actually two pieces of software:</p>
<ol>
<li>an interpreter</li>
<li>a translator</li>
</ol>
<p>The interpreter understands the full Python language.  The interpreter is written in <a title="Restricted Python" href="http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html#restricted-python">RPython</a> (Restricted Python).  RPython is  statically typed which makes it easier to compile into more efficient  code.  This characteristic is very important for the next step.</p>
<p>The translator takes RPython code as its input and translates it to a lower language like C.  Although the interpreter was originally written in Python (specifically RPython), the translator translates it to C which can be compiled into a much faster interpreter that could rival or even surpass CPython.</p>
<p><strong><em>What&#8217;s the point of doing this in RPython?  Why not just code it in C like CPython?</em></strong></p>
<p>The difference boils down to the perceived difference between hacking away at an interpreter written in RPython (PyPy) versus an interpreter written in C (CPython).  The claim is that an interpreter coded in RPython allows for faster experimentation.</p>
<p><strong><em>Can a Python interpreter based on RPython code translated into C rival or exceed the performance of CPython?</em></strong></p>
<p>At this moment (April 7, 2010), the <a title="PyPy Speed Center" href="http://speed.pypy.org/">answer is no</a>.  Default CPython bests its PyPy-C equivalent on just about every benchmark.  On some benchmarks, the measurements are close.  On others, CPython is clearly the winner by far.</p>
<p><em><strong>This is false advertising!  If CPython does better on most benchmarks, how can PyPy claim to be faster?</strong></em></p>
<p>The answer is JIT!  The developers of PyPy <a title="PyPy JIT" href="http://codespeak.net/pypy/dist/pypy/doc/jit/overview.html">created a JIT compiler</a> for Python by adding a few hints to their RPython interpreter.  The PyPy JIT compiler just-in-time compiles RPython code to native code which is why it&#8217;s able to get such fantastic speed gains when compared to CPython.  PyPy-C-JIT crushes CPython on the majority of the speed tests at the <a title="PyPy Speed Center" href="http://speed.pypy.org/overview/">PyPy Speed Center</a>.</p>
<p><em><strong>That doesn&#8217;t seem fair&#8230;  Of course native code will be faster than interpreted code.  What if CPython is coupled with JITting?<br />
</strong></em></p>
<p>Turns out PyPy still comes out ahead.  CPython can be coupled with <a title="Psyco" href="http://psyco.sourceforge.net/">Psyco</a>, a Python extension module that can JIT compile Python code.  The Psyco JIT approach differs from the PyPy approach, because the former focuses on partial evaluation and the latter on tracing.  I don&#8217;t know the difference yet (maybe another blog post?), but what we do know is this tracing JIT approach outperforms the Psyco approach.</p>
<p>So there it is&#8230;  PyPy in a nutshell.</p>
<p>UPDATE: It seems I&#8217;m not the only one interested in PyPy&#8217;s claims.  I came across a related thread on Stackoverflow: <a title="PyPy — How can it possibly beat CPython?" href="http://stackoverflow.com/questions/2591879/pypy-how-can-it-possibly-beat-cpython">PyPy — How can it possibly beat CPython?</a></p>
<p><em>DISCLAIMER: I have not used PyPy &#8212; just very curious about the problems it solves.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2010/04/what-is-the-purpose-of-pypy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Official launch of Daily Morn</title>
		<link>http://rayli.net/blog/2010/03/official-launch-of-dailymorn-com/</link>
		<comments>http://rayli.net/blog/2010/03/official-launch-of-dailymorn-com/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 23:37:50 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=154</guid>
		<description><![CDATA[Daily Morn is online!  It&#8217;s been many months in the making&#8230;  Many thanks to Joshua Corbin, Jeremiah Nisbet and Kevin Dwyer.  Getting this web site up-and-running would not have been possible without their great suggestions and endless experience.

]]></description>
			<content:encoded><![CDATA[<p>Daily Morn is online!  It&#8217;s been many months in the making&#8230;  Many thanks to Joshua Corbin, Jeremiah Nisbet and <a title="Kevin Dwyer's Pheared Networks" href="http://pheared.net">Kevin Dwyer</a>.  Getting this web site up-and-running would not have been possible without their great suggestions and endless experience.</p>
<p><span id="more-154"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2010/03/official-launch-of-dailymorn-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PyCon 2010 Atlanta</title>
		<link>http://rayli.net/blog/2010/02/pycon-2010-atlanta/</link>
		<comments>http://rayli.net/blog/2010/02/pycon-2010-atlanta/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 14:54:15 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=161</guid>
		<description><![CDATA[PyCon 2010 was in Atlanta this year.  It wasn&#8217;t quite as warm as I hoped it would be, but definitely an improvement over the 2-3 feet of snow we got in the DC region.  I do feel a little smarter after attending PyCon, but also infinitely humbled by the creativity, energy, and raw intelligence in [...]]]></description>
			<content:encoded><![CDATA[<p>PyCon 2010 was in Atlanta this year.  It wasn&#8217;t quite as warm as I hoped it would be, but definitely an improvement over the 2-3 feet of snow we got in the DC region.  I do feel a little smarter after attending PyCon, but also infinitely humbled by the creativity, energy, and raw intelligence in the Python community.  Here are some notes I took from the talks I attended&#8230;</p>
<p><span id="more-161"></span><em> </em></p>
<p><em>Python in the Browser</em>, Jimmy Schementi<br />
Using Python in the web browser leverages Microsoft&#8217;s Python implementation.  The goal is to use <a title="Silverlight" href="http://www.silverlight.net/">Silverlight</a>/<a title="Moonlight" href="http://www.mono-project.com/Moonlight">Moonlight</a> with <a title="IronPython" href="http://ironpython.net">IronPython</a> as a client-side browser language.</p>
<p><em>State of PyPy</em>, Maciej Fijalkowski<br />
<a title="PyPy" href="http://codespeak.net/pypy/">PyPy</a> is an implementation of Python written in Python.  But why?  (UPDATE:  <a title="http://rayli.net/blog/2010/04/what-is-the-purpose-of-pypy/" href="http://rayli.net/blog/2010/04/what-is-the-purpose-of-pypy/">What is the purpose of PyPy?</a>)</p>
<p><em>Python 3: Next Generation</em>, Wesley Chun<br />
This talk went through a laundry list of new features and bug fixes in Python 3.</p>
<p><em>Unladen Swallow: fewer coconuts, faster Python</em>, Collin Winter<br />
<a title="Unladen Swallow" href="http://code.google.com/p/unladen-swallow/">Unladen Swallow</a> is Google&#8217;s Python implementation branch of CPython.  It claims significant speed improvements.  Currently, the interpreter is a virtual machine with a JIT built using <a title="LLVM" href="http://llvm.org/">LLVM</a>.</p>
<p><em>Understanding the Python GIL</em>, David Beazly<br />
Discussed key issues with the global intepreter lock (GIL).  It seems improvements in Python 3 solve some problems associated with the GIL, but create new ones.  Beazly goes over how difficult the problem is, and how he feels it can be solved.</p>
<p><em>Easy command-line applications with cmd and cmd2</em>, Catherine Devlin (a.k.a. PyOraGeek)<br />
The talk title was a bit deceiving.  She prefaced the talk with a disclaimer, because the topic was actually command-line interpreters.  This is more along the lines of applications like the bash shell or Python&#8217;s REPL.  <a title="cmd" href="http://docs.python.org/library/cmd.html"><em>cmd</em></a> is Python&#8217;s class for line-oriented command interpreters.  <a title="cmd2" href="http://catherine.devlin.googlepages.com/cmd2.html"><em>cmd2</em></a> is Devlin&#8217;s enhancements to <em>cmd</em>.</p>
<p>The rest of the talks I attended were about <strong>software testing</strong>!</p>
<p><em>Why not run all your tests all the time?  A study of continuous integration systems</em>, C. Titus Brown<br />
Brown compared continuous integration systems: <a title="Hudson" href="http://hudson-ci.org/">Hudson</a>, <a title="Buildbot" href="http://buildbot.net/">Buildbot</a>, <a title="CruiseControl" href="http://cruisecontrol.sourceforge.net/">CruiseControl</a>, <a title="Bamboo" href="http://www.atlassian.com/software/bamboo/">Bamboo</a>, <a title="Bitten" href="http://bitten.edgewall.org/">Bitten</a>, <a title="Pony-build" href="http://wiki.github.com/ctb/pony-build/">Pony-build</a> (his project).  Despite this possible bias, a strong recommendation was give for <a title="Hudson" href="http://hudson-ci.org/">Hudson</a> (Java-based).</p>
<p><em>Tests and Testability</em>, Ned Batchelder<br />
Batchelder discussed testing lifecycle: test isolation, harvesting output, dependency injection and mocking.</p>
<p><em>Rapid Multi-purpose Testing</em>, Holger Krekel<br />
Krekel&#8217;s <a title="py.test" href="http://codespeak.net/py/dist/test/">py.test</a> is a command-line tool to collect, run and report about automated tests.  It supports test skipping, test running modes, parametric testing, test discovery, and multi-cpu testing.</p>
<p><em>New and Improved: Coming changes to unittest, the standard library test framework</em>, Michael Foord<br />
These changes will be new for Python 2.7:</p>
<ul>
<li>New assert methods.</li>
<li>No more fail methods, standardize on assert*.</li>
<li>Better multiline string testing.</li>
<li>Unit test discovery.</li>
<li><em>cleanup()</em> method cleans up in reverse order (improvement over current <em>tearDown()</em> method).</li>
</ul>
<p>Backported to Python 2.4, 2.5, and 2.6.  Check it out at <a title="unittest2" href="http://pypi.python.org/pypi/unittest2">unittest2</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2010/02/pycon-2010-atlanta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Biostatistics of cigarette smoking</title>
		<link>http://rayli.net/blog/2009/12/biostatistics-of-cigarette-smoking/</link>
		<comments>http://rayli.net/blog/2009/12/biostatistics-of-cigarette-smoking/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 05:49:17 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Bioinformatics]]></category>
		<category><![CDATA[JHU]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[Statistics]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=109</guid>
		<description><![CDATA[Stay away from smoking!  This is my analysis of the GSE5056 dataset from the Gene Expression Omnibus (GEO).  The dataset is part of a study aimed at understanding how  cigarette smoking modifies neuroendocrine cells. By comparing the smokers to the non-smokers,  it&#8217;s possible to see very clear trends using statistical methods despite  [...]]]></description>
			<content:encoded><![CDATA[<p>Stay away from smoking!  This is my analysis of the <a title="GSE5056" href="http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE5056">GSE5056</a> dataset from the <a title="Gene Expression Omnibus" href="http://www.ncbi.nlm.nih.gov/geo/">Gene Expression Omnibus</a> (GEO).  The dataset is part of a study aimed at understanding how  cigarette smoking modifies neuroendocrine cells. By comparing the smokers to the non-smokers,  it&#8217;s possible to see very clear trends using statistical methods despite  the enormous amount of gene data.</p>
<p><span id="more-109"></span></p>
<h3>What were the findings?</h3>
<p>The genes responsible for the responses below are very strongly associated with smokers:</p>
<ul>
<li>Alcohol detoxification/response (2 genes)</li>
<li>Inflammatory response (3 genes)</li>
<li>Oxidative stress response (2 genes)</li>
<li>Cholesterol homeostasis (2 genes)</li>
<li>Bile acid binding (1 gene)</li>
<li>Organophosphorus response (1 gene)</li>
<li>Immune response (1 gene)</li>
<li>Toxin response (1 gene)</li>
</ul>
<h3>How is this related to smoking?</h3>
<ul>
<li>Alcohol detoxification is strongly expressed and could be correlated with <a title="Cigarette Additives, Carcinogens and Chemicals" href="http://whyquit.com/whyquit/A_Tobacco_Additives.html">ethanol and a number of other alcohols found in cigarettes</a>.</li>
<li>Inflammatory response and oxidative stress are <a title="Differential effects of cigarette smoke on oxidative stress and proinflammatory cytokine release in primary human airway epithelial cells and in a variety of transformed alveolar epithelial cells" href="http://respiratory-research.com/content/7/1/132">very highly correlated</a> with cigarette smoking.</li>
<li>Cholesterol homeostasis is needed possibly because HDL (good cholesterol) is <a title="Cigarette smoking and HDL cholesterol: the Framingham offspring study" href="http://www.ncbi.nlm.nih.gov/pubmed/209795">lowered</a> by cigarette smoking.</li>
<li>Bile acid binding could be associated with bile salt concentration being <a title="Bile reflux is increased in cigarette smokers" href="http://www.ncbi.nlm.nih.gov/pubmed/3956939">increased</a> by cigarette smoking.</li>
<li>An organophosphorus response could be the result of organophosphorus found in pesticide which is used on the tobacco <a title="The effect of tobacco consumption on blood cholinesterase levels among workers exposed to organophosphorus pesticides" href="http://tih.sagepub.com/cgi/content/abstract/22/9/399">found in cigarettes</a>.</li>
<li>Immune response is <a title="Effects of Cigarette Smoke on Immune Response: Chronic Exposure to Cigarette Smoke Impairs Antigen-Mediated Signaling in T Cells and Depletes IP3-Sensitive Ca2+ Stores" href="http://jpet.aspetjournals.org/content/293/1/166.abstract">suppressed</a> by smoking cigarettes.</li>
<li>Toxin response is <a title="Biomarkers of Toxic Response to Low Nicotion Cigarette Smoke" href="http://www.med.upenn.edu/ceet/documents_user/BlairNCI.doc">triggered</a> by smoking cigarettes.</li>
</ul>
<h3>How was this done?</h3>
<p>The bulk of the analysis is done using <a title="The R  Project for Statistical Computing" href="http://www.r-project.org/">R</a>.  Before loading the dataset into R, some pre-filtering is done to remove the annotations.</p>
<p>Using R, outliers are processed using a <a title="Correlation plot for all genes" href="/ref/2009-12/correlation_plot.png">correlation plot</a>, <a title="Cluster Dendrogram" href="/ref/2009-12/cluster_dendrogram.png">cluster dendrogram</a> and a <a title="Sample CV versus Mean Plot" href="/ref/2009-12/cv_mean.png">CV versus Mean plot</a>.  To further filter the genes, two approaches are taken: remove genes with an average expression value less than 50, and remove genes with a coefficient of variation in the lowest quantile (5%).  A <a title="Histogram of p-values for Remaing Genes" href="/ref/2009-12/p_value_histogram.png">t-test with multiple test correction</a> is used to do feature selection.  <a title="PCA plot of Filtered GSE5056 Data" href="/ref/2009-12/pca_plot.png">Principle Component Analysis</a> (PCA) is used for dimensionality reduction.  A <a title="Scree Plot" href="/ref/2009-12/scree_plot.png">Scree plot</a> shows the effectiveness of this approach.  Using the previously identified PCA components, quadratic discriminant analysis (QDA) is used to <a title="PCA plot of Filtered GSE5056 Prediction Data" href="/ref/2009-12/pca_plot_predict.png">classify</a> the samples into their respective smoking or non-smoking <a title="One Sample Run" href="/ref/2009-12/sample_run.png">classes</a>.</p>
<p>The filtering, feature selection and dimensionality reduction focused our analysis from the original 7,129 genes to just 23 genes.  Finally, using fold change, the 10 most discriminant genes are selected.  This is defined as the 5 genes with the greatest positive fold change and the 5 genes with the greatest negative fold change.  The result of this analysis is summarized in the findings above which correlate these 10 genes with smokers.</p>
<p>Here is the <a title="R source code for GSE5056 analysis" href="/ref/2009-12/gse5056_r_code.txt">R code</a> and <a title="Presentation for GSE5056 analysis" href="/ref/2009-12/gse5056_presentation.pdf">PDF presentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2009/12/biostatistics-of-cigarette-smoking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
