<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[My Geekdom]]></title>
  
  <link href="http://www.neilsmithline.com/" />
  <updated>2012-10-02T13:29:37-04:00</updated>
  <id>http://www.neilsmithline.com/</id>
  <author>
    <name><![CDATA[Neil Smithline]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <feedburner:info uri="mygeekdom" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://www.neilsmithline.com/atom.xml" /><feedburner:emailServiceId>MyGeekdom</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Fwww.neilsmithline.com%2Fatom.xml" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><entry>
    <title type="html"><![CDATA[Disk Crash, Part 3: OS Indepent Configuration]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/-WmjF_XFnp0/" />
    <updated>2012-09-03T22:02:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/09/03/disk-crash-part3</id>
    <content type="html">&lt;p&gt;
&lt;i&gt;NOTE: This was written on September 3&lt;sup&gt;rd&lt;/sup&gt; and published on September 23&lt;sup&gt;rd&lt;/sup&gt;.&lt;/i&gt;
&lt;/p&gt;
&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;Managing Configuration&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;


&lt;p&gt;
My previous postings about my &lt;a href="http://www.neilsmithline.com/blog/2012/08/21/disk-crash/"&gt;disk crash&lt;/a&gt; and my &lt;a href="http://www.neilsmithline.com/blog/2012/08/21/disk-crash-part2/"&gt;backup strategy&lt;/a&gt; discuss how I keep files in sync across my computers. While I have a 3-tiered system using CrashPlan, DropBox, and rdist to meet different synchronization requirements for different files, this strategy uses tried-and-true technology.
&lt;/p&gt;
&lt;p&gt;
But identical files across machines doesn&amp;#8217;t guarantee identical behavior across the machines. At the moment, my computer collection is:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;A laptop running Ubuntu 12.04
&lt;/li&gt;
&lt;li&gt;A laptop double-booted to run Ubuntu 12.04 and Windows 7. I&amp;#8217;m not a big Windows fan but sometimes I need to use it.
&lt;/li&gt;
&lt;li&gt;My media/game server running Windows 7 (good for games for my kids), and Ubuntu 12.04 (best for me).
&lt;/li&gt;
&lt;li&gt;My MacBook Pro running OS X 10.6.
&lt;/li&gt;
&lt;li&gt;My VPS cloud server. It has been running Ubuntu 10.04 but I&amp;#8217;ve requested an upgrade to the newest version of Debian, I think Lenny. I need the upgrade because Ubuntu 10.04 is 2+ years old. I&amp;#8217;m switching to Debian because Debian tends to be more stable though it has a weaker &lt;a href="http://en.wikipedia.org/wiki/Desktop_environment"&gt;desktop environment&lt;/a&gt; than Ubuntu. Being that my VPS is a &lt;a href="http://en.wikipedia.org/wiki/Headless_system"&gt;headless server&lt;/a&gt;, the desktop features don&amp;#8217;t really matter to me.
&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- more --&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;Home Directories&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;


&lt;p&gt;
Being that I run three different OSs (Ubuntu is built on Debian so I don&amp;#8217;t consider it a separate OS), I have different home directories.
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu/Debian: my home directory is &lt;code&gt;/home/neil&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Mac OS X: My home directory is &lt;code&gt;/Users/neil&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Windows 7: Synchronizing configuration between &lt;a href="http://en.wikipedia.org/wiki/Unix-like"&gt;*nix&lt;/a&gt; systems and Windows only makes sense if you are running &lt;a href="http://cygwin.com"&gt;Cygwin&lt;/a&gt;. Unfortunately, Cygwin home directories seem a bit random (info about &lt;a href="http://cygwin.com/faq/faq-nochunks.html#faq.setup.home"&gt;Cygwin home directories&lt;/a&gt;).
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
While using the &lt;code&gt;$HOME&lt;/code&gt; variable to refer to your home directory works in many situations, it doesn&amp;#8217;t always help. My solution to this is simple: *nix wins. My home directory is &lt;code&gt;/home/neil&lt;/code&gt; on all of my computers. If it is not there by default, I use atypical &lt;a href="http://en.wikipedia.org/wiki/Mount_(computing)"&gt;file mounts&lt;/a&gt; or, when needed, &lt;a href="http://en.wikipedia.org/wiki/Symbolic_link"&gt;symbolic links&lt;/a&gt; to achieve conformance.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;My $PATH&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;


&lt;p&gt;
Maintaining your &lt;a href="http://en.wikipedia.org/wiki/$PATH"&gt;$PATH&lt;/a&gt; settings is a real hassle. Not only are executables in different locations based on your OS, I frequently find that executables are in different locations on the same OS.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)"&gt;Ruby&lt;/a&gt; is a good example of a program that tends to be in different locations on different computers. I use &lt;a href="http://mxcl.github.com/homebrew/"&gt;Homebrew&lt;/a&gt; to install Ruby on my Mac OS X computer, &lt;a href="http://en.wikipedia.org/wiki/Apt-get"&gt;APT&lt;/a&gt; to install Ruby on one of my Ubuntu laptops, and &lt;a href="https://github.com/sstephenson/rbenv"&gt;rbenv&lt;/a&gt; on my other Ubuntu laptop. I don&amp;#8217;t bother installying Ruby on my Windows computer as I only use Windows when I have to.
&lt;/p&gt;

&lt;/div&gt;

&lt;div id="outline-container-3-1" class="outline-3"&gt;
&lt;h3 id="sec-3-1"&gt;Dynamically Assigned $PATH Variables&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-3-1"&gt;


&lt;p&gt;
As I use a single &lt;code&gt;.bashrc&lt;/code&gt; file across all my computers and exectuables are scattered everywhere, I dynamically configure my &lt;code&gt;$PATH&lt;/code&gt; variable based on the computer&amp;#8217;s file system. I use my a &lt;code&gt;bash&lt;/code&gt; function, &lt;code&gt;addpath&lt;/code&gt;, to add directories to &lt;code&gt;$PATH&lt;/code&gt;:
&lt;/p&gt;



&lt;pre class="src src--n"&gt;addpath() {
    if [ -d &lt;span style="color: #004400; background-color: #CCCCCC;"&gt;"$@"&lt;/span&gt; ]; then
        PATH=&lt;span style="color: #004400; background-color: #CCCCCC;"&gt;"$@:$PATH"&lt;/span&gt;
    fi
}
&lt;/pre&gt;


&lt;p&gt;
With &lt;code&gt;addpath&lt;/code&gt;, I don&amp;#8217;t have to worry about adding too many directories to my &lt;code&gt;$PATH&lt;/code&gt;. This allows code such as:
&lt;/p&gt;



&lt;pre class="src src-sh"&gt;&lt;span class="linenr"&gt;1:  &lt;/span&gt;addpath /usr/bin        &lt;span style="color: #550055; background-color: #CCCCCC;"&gt;# &lt;/span&gt;&lt;span style="color: #550055; background-color: #CCCCCC;"&gt;typical *nix path component&lt;/span&gt;
&lt;span class="linenr"&gt;2:  &lt;/span&gt;addpath /sw/bin         &lt;span style="color: #550055; background-color: #CCCCCC;"&gt;# &lt;/span&gt;&lt;span style="color: #550055; background-color: #CCCCCC;"&gt;used by some Mac OS X package managers&lt;/span&gt;
&lt;span class="linenr"&gt;3:  &lt;/span&gt;addpath /c/usr/bin      &lt;span style="color: #550055; background-color: #CCCCCC;"&gt;# &lt;/span&gt;&lt;span style="color: #550055; background-color: #CCCCCC;"&gt;used by Cygwin on Windows&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;
&lt;code&gt;addpath&lt;/code&gt; ensures that only existing directories are added to &lt;code&gt;$PATH&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
This meets &lt;i&gt;nearly&lt;/i&gt; all of my needs. The one problem I have with this solution is that I find that my &lt;code&gt;$PATH&lt;/code&gt; frequently changes. For example, when I recently started using &lt;code&gt;rbenv&lt;/code&gt;, a path change was required. These changes aren&amp;#8217;t major but sometimes I need a few tries to get it right.
&lt;/p&gt;
&lt;p&gt;
So I have a strategy for repeatedly updating my &lt;code&gt;.bashrc&lt;/code&gt; file, executing the &lt;code&gt;.bashrc&lt;/code&gt; file, and testing my new &lt;code&gt;$PATH&lt;/code&gt;. The first part of this strategy is that, the first time &lt;code&gt;bash&lt;/code&gt; is run, I squirrel away the value of &lt;code&gt;$PATH&lt;/code&gt; into another variable:
&lt;/p&gt;


&lt;pre class="src src-SH"&gt;&lt;span class="linenr"&gt;1:  &lt;/span&gt;export ORIG_PATH=&lt;span style="color: #004400; background-color: #CCCCCC;"&gt;"${ORIG_PATH:-$PATH}"&lt;/span&gt;
&lt;span class="linenr"&gt;2:  &lt;/span&gt;export PATH=&lt;span style="color: #004400; background-color: #CCCCCC;"&gt;"$ORIG_PATH"&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;
For those of you that aren&amp;#8217;t fluent in shell syntax, &lt;code&gt;ORIG_PATH=${ORIG_PATH:-$PATH}&lt;/code&gt; will set the value of &lt;code&gt;$ORIG_PATH&lt;/code&gt; to &lt;code&gt;$PATH&lt;/code&gt; the first time it is executed. On subsequent executions, &lt;code&gt;$ORIG_PATH&lt;/code&gt; will be assigned the value of &lt;code&gt;$ORIG_PATH&lt;/code&gt;. This ensures that &lt;code&gt;$ORIG_PATH&lt;/code&gt; always equals the value of &lt;code&gt;$PATH&lt;/code&gt; the first time the &lt;code&gt;.bashrc&lt;/code&gt; file is executed.
&lt;/p&gt;
&lt;p&gt;
I then use &lt;code&gt;$ORIG_PATH&lt;/code&gt; as the basis for all of my &lt;code&gt;$PATH&lt;/code&gt; changes.
&lt;/p&gt;
&lt;p&gt;
The final piece of my &lt;code&gt;$PATH&lt;/code&gt; management is this function:
&lt;/p&gt;


&lt;pre class="src src-SH"&gt;&lt;span class="linenr"&gt;1:  &lt;/span&gt;reinit () {
&lt;span class="linenr"&gt;2:  &lt;/span&gt;    . $HOME/.bashrc
&lt;span class="linenr"&gt;3:  &lt;/span&gt;}
&lt;/pre&gt;


&lt;p&gt;
It is just a convenience function to execute my &lt;code&gt;.bashrc&lt;/code&gt; file in the current shell. Being that my &lt;code&gt;.bashrc&lt;/code&gt; file is &lt;a href="http://en.wikipedia.org/wiki/Idempotent"&gt;idempotent&lt;/a&gt;, I can rerun it as often as I need, confident that my &lt;code&gt;bash&lt;/code&gt; environment will be the same no matter how many times I&amp;#8217;ve executed my &lt;code&gt;.bashrc&lt;/code&gt;.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3-2" class="outline-3"&gt;
&lt;h3 id="sec-3-2"&gt;Miscellaneous Path Differences&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-3-2"&gt;



&lt;/div&gt;

&lt;div id="outline-container-3-2-1" class="outline-4"&gt;
&lt;h4 id="sec-3-2-1"&gt;Managing &lt;code&gt;rbenv&lt;/code&gt;&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-3-2-1"&gt;

&lt;p&gt;While the above solution handles general &lt;code&gt;$PATH&lt;/code&gt; configuration, some special cases still arise. Managing my &lt;code&gt;$PATH&lt;/code&gt; to work best with Ruby tends to change across my computers and even change over time on the same computer.
&lt;/p&gt;
&lt;p&gt;
For Ruby, some of my machines have &lt;code&gt;rbenv&lt;/code&gt; installed on them and some don&amp;#8217;t. On one machine I find that sometimes I use &lt;code&gt;rbenv&lt;/code&gt; and at other times I don&amp;#8217;t wish to use it. So I have a one-off solution for managing my &lt;code&gt;rbenv&lt;/code&gt; environment in my &lt;code&gt;.bashrc&lt;/code&gt; file:
&lt;/p&gt;



&lt;pre class="src src--n"&gt;if [ -f &lt;span style="color: #004400; background-color: #CCCCCC;"&gt;"$HOME/.rbenv/USE-RBENV"&lt;/span&gt; ]; then
    addpath $HOME/.rbenv/shims
    ... other stuff ...
fi
&lt;/pre&gt;


&lt;p&gt;
The file &lt;code&gt;USE-RBENV&lt;/code&gt; is an empty file that I create when I want to, not surprisingly, use &lt;code&gt;rbenv&lt;/code&gt;. To switch between using and not using &lt;code&gt;rbenv&lt;/code&gt; I create or delete the &lt;code&gt;USE-RBENV&lt;/code&gt; file and re-execute my &lt;code&gt;.bashrc&lt;/code&gt; file using my &lt;code&gt;bash&lt;/code&gt;  &lt;code&gt;reinit&lt;/code&gt; function. This strategy leverages the dynamic path settings and idempotency of my &lt;code&gt;.bashrc&lt;/code&gt; file.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3-2-2" class="outline-4"&gt;
&lt;h4 id="sec-3-2-2"&gt;Managing My &lt;code&gt;.emacs&lt;/code&gt;&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-3-2-2"&gt;


&lt;p&gt;
Avoiding most of the details, &lt;a href="http://en.wikipedia.org/wiki/Emacs"&gt;Emacs&lt;/a&gt; needs to find some &lt;a href="http://en.wikipedia.org/wiki/Elisp"&gt;elisp&lt;/a&gt; files as well as some *nix files that are not in the same place on all of my computers. For loading elisp files, I have written a function that is similar to my &lt;code&gt;addpath&lt;/code&gt; function that I use in my &lt;code&gt;.bashrc&lt;/code&gt; file.
&lt;/p&gt;
&lt;p&gt;
The elisp function, &lt;code&gt;add-load-path&lt;/code&gt;, has a bit more smarts than &lt;code&gt;addpath&lt;/code&gt;. &lt;code&gt;addpath&lt;/code&gt; works by omitting non-relevant directories to &lt;code&gt;$PATH&lt;/code&gt;. &lt;code&gt;add-load-path&lt;/code&gt; knows how to search through directories that may contain an elisp package and then include that directory. A call to &lt;code&gt;add-load-path&lt;/code&gt; is simply:
&lt;/p&gt;&lt;pre class="example"&gt;
(add-load-path "jdee/lisp")
&lt;/pre&gt;


&lt;p&gt;
There are also some functions of Emacs that behavior better if they know the full path of some executables. For example, Emacs can make use of the *nix &lt;a href="http://en.wikipedia.org/wiki/Man_page"&gt;man(1)&lt;/a&gt; command. While &lt;code&gt;add-load-path&lt;/code&gt; finds elisp files, &lt;code&gt;find-first-executable&lt;/code&gt; searches for executable files. This is the elisp command I use to find the &lt;code&gt;man&lt;/code&gt; executable:
&lt;/p&gt;


&lt;pre class="src src--n"&gt;(setq manual-program
        (find-first-executable
         '(&lt;span style="color: #004400; background-color: #CCCCCC;"&gt;"/usr/local/bin/man"&lt;/span&gt; &lt;span style="color: #004400; background-color: #CCCCCC;"&gt;"/usr/bin/man"&lt;/span&gt;
           &lt;span style="color: #004400; background-color: #CCCCCC;"&gt;"/bin/man"&lt;/span&gt; &lt;span style="color: #004400; background-color: #CCCCCC;"&gt;"c:/cygwin/bin/man.exe"&lt;/span&gt;)))
&lt;/pre&gt;


&lt;p&gt;
&lt;code&gt;find-first-executable&lt;/code&gt; returns the first path that corresponds to an executable. You may have noticed the &lt;code&gt;c:/cygwin/bin/man.exe&lt;/code&gt; argument which allows the same &lt;code&gt;.emacs&lt;/code&gt; file to run on Windows as well as *nix.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;In The Next Installment&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;


&lt;p&gt;
The next and final part of this series will delve a bit deeper into my general philosophy of portable and maintainable configuration and code. In general, I try to plan for the unplannable. I try not to let the fact that planning for the unplannable is impossible get in my way.
&lt;/p&gt;
&lt;p&gt;
I try to produce flexible designs that typically include a separation of data and code. Then, when the unexpected occurs, in theory, I can return to work with only a minimal hit to my productivity. In some sense, I use the &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;MVC&lt;/a&gt; programming model in my data management and system configuration.
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=-WmjF_XFnp0:UtxYnpqVzyM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=-WmjF_XFnp0:UtxYnpqVzyM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=-WmjF_XFnp0:UtxYnpqVzyM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/-WmjF_XFnp0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/09/03/disk-crash-part3/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Disk Crash, Part 2: My Backup Strategy]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/LcOlm3BnNh0/" />
    <updated>2012-08-21T22:02:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/08/21/disk-crash-part2</id>
    <content type="html">&lt;p&gt;
&lt;i&gt;NOTE: This was written on August 21&lt;sup&gt;st&lt;/sup&gt; and published on September 23&lt;sup&gt;rd&lt;/sup&gt;&lt;/i&gt;
&lt;/p&gt;
&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;My File Distribution And Backup Strategy&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;In my &lt;a href="http://www.neilsmithline.com/blog/2012/08/21/disk-crash/"&gt;previous posting&lt;/a&gt; I discussed my how I categorize files in terms of importance, timeliness when distributing files, and the platforms I distribute the files to. Here I&amp;#8217;ll cover the technologies I use to meet my file management goals.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;My Backup Strategy&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;Making sure your computer is backed up is typically a hassle. Even worse, my experience has taught me that thinking that you are backing up your system is very different from actually backing up your system. Numerous times I&amp;#8217;ve been told by a system admin that, unbeknownst to them, the backups are unusable.
&lt;/p&gt;
&lt;p&gt;
Knowing how difficult backing up your computer can be, I outsource it to a company whose only business is backing up data.
&lt;/p&gt;

&lt;/div&gt;

&lt;div id="outline-container-2-1" class="outline-3"&gt;
&lt;h3 id="sec-2-1"&gt;CrashPlan&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-1"&gt;




&lt;!-- more --&gt;
&lt;p&gt;
I started using &lt;a href="http://www.crashplan.com"&gt;CrashPlan&lt;/a&gt; because they have a &lt;a href="http://www.crashplan.com/consumer/compare.html"&gt;$25/year backup plan&lt;/a&gt;. That is, they are cheap. As their service was simple, reliable, and pretty much configure-and-forget-about-it, I upgraded to their &lt;a href="http://www.crashplan.com/consumer/crashplan-plus.html"&gt;premium plan&lt;/a&gt;. It costs $120/year. For that $10/month I get unlimited data storage and can backup as many as 10 computers.
&lt;/p&gt;
&lt;p&gt;
While my household has more than 10 computers, many of them aren&amp;#8217;t used very often and don&amp;#8217;t need to be backed up so the limit of 10 computers has never been a problem.
&lt;/p&gt;
&lt;p&gt;
I consider the $10/month a great deal as CrashPlan has been a life saver for me  more than once. CrashPlan has an application that runs in the background, similar to DropBox&amp;#8217;s application, and continually backs up your computer. The initial backup can take a few days but once backed up, the Crashplan database is never more than a few minutes behind changes on your disk drive.
&lt;/p&gt;
&lt;p&gt;
I should mention that the initial backup takes a few days because CrashPlan tries to share the computer with other applications. I can restore all my backed up data from CrashPlan in about an hour.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2-2" class="outline-3"&gt;
&lt;h3 id="sec-2-2"&gt;Not Just Backup, Secure Backup&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-2"&gt;

&lt;p&gt;When configured properly, CrashPlan uses the &lt;a href="http://en.wikipedia.org/wiki/Blowfish_(cipher)"&gt;Blowfish&lt;/a&gt; encryption algorithm with a &lt;a href="http://support.crashplan.com/doku.php/faq/security#what_type_of_encryption_does_crashplancrashplan_use"&gt;448-bit key&lt;/a&gt;. My encryption key was generated on my computer and has never left it. This means that even if CrashPlan&amp;#8217;s servers are compromised and all of my backup data is stolen, it is very unlikely that the attacker could decrypt my data.
&lt;/p&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2-3" class="outline-3"&gt;
&lt;h3 id="sec-2-3"&gt;Backup Everything&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-3"&gt;

&lt;p&gt;I use CrashPlan to backup everything that I want to backup. I don&amp;#8217;t distinguish between more or less important files. I just backup everything I think I may miss if it were to go away. CrashPlan is even kind enough to keep multiple revisions of each file and deleted files available for restoration. What a deal.
&lt;/p&gt;
&lt;p&gt;
On my Mac OS X, I back up nearly everything in my home directory. While I try to keep my application preferences out of &lt;code&gt;~/Library/...&lt;/code&gt;, some applications just won&amp;#8217;t cooperate. So I also selectively backup directories in &lt;code&gt;~/Library/...&lt;/code&gt; I also don&amp;#8217;t bother backing up &lt;code&gt;~/Downloads&lt;/code&gt;. I don&amp;#8217;t currently back up &lt;code&gt;~/.cpan&lt;/code&gt;, the data directory for the Perl package installer. As mentioned in my previous posting, I don&amp;#8217;t yet have a working strategy for what applications have been installed by package managers such as CPAN.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;My File Distribution Strategy&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;My file distribution strategy is more complex than my backup strategy. To date I&amp;#8217;ve not found any service that meets all of my needs for data distribution. This leaves me using multiple distribution technologies based on the importance and timeliness of the data.
&lt;/p&gt;

&lt;/div&gt;

&lt;div id="outline-container-3-1" class="outline-3"&gt;
&lt;h3 id="sec-3-1"&gt;Dropbox&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-3-1"&gt;

&lt;p&gt;&lt;a href="http://dropbox.com"&gt;Dropbox&lt;/a&gt; and similar services have become quite popular the last few years. I use Dropbox far data distribution continually. In fact, this blog entry is being authored inside my Dropbox directory. Dropbox is the primary data distribution technology that I use for managing the distribution of High Importance, Timely Distribution files. Especially my &lt;a href="http://www.orgmode.org"&gt;Org Mode&lt;/a&gt; PIM files.
&lt;/p&gt;
&lt;p&gt;
Because of Dropbox&amp;#8217;s nearly instantaneous file distribution, I can be working on one laptop, save my Org Mode files, pick up my other laptop to find the updated Org Mode files waiting for me. Wonderful!
&lt;/p&gt;

&lt;/div&gt;

&lt;div id="outline-container-3-1-1" class="outline-4"&gt;
&lt;h4 id="sec-3-1-1"&gt;Dropbox Security Concerns&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-3-1-1"&gt;

&lt;p&gt;While Dropbox is awfully convenient, I&amp;#8217;m not terribly comfortable with its security. &lt;a href="https://www.dropbox.com/help/27/en"&gt;Dropbox&amp;#8217;s security claims&lt;/a&gt; state that they use &lt;a href="http://en.wikipedia.org/wiki/Transport_Layer_Security"&gt;TLS&lt;/a&gt;, which is frequently referred to as &amp;#8220;SSL&amp;#8221;, for network security. But the rest of their claims are intangible. For example, what is a &amp;#8220;hardened&amp;#8221; website and how is it better than other websites? They flat out state:
&lt;/p&gt;&lt;blockquote&gt;

&lt;p&gt;Like most online services, we have a small number of employees who must be able to access user data for the reasons stated in our privacy policy (e.g., when legally required to do so).
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;
Without disputing Dropbox&amp;#8217;s claim that most online services have a means to allow their employees to access your private data, I use CrashPlan for my backups and know that they can&amp;#8217;t access my private data.
&lt;/p&gt;
&lt;p&gt;
Even if Dropbox&amp;#8217;s employees are 100% trustworthy, if their employees can access your data, so too can a hacker.
&lt;/p&gt;
&lt;p&gt;
Because of my security concerns, I avoid using Dropbox for my more sensitive data. For example, I have an Org Mode todo list related to financial matters such as taxes and bill paying. The files that have the details about those tasks are not in my Dropbox directory.
&lt;/p&gt;
&lt;p&gt;
If you are interested, here&amp;#8217;s a &lt;a href="http://lifehacker.com/5794486/how-to-add-a-second-layer-of-encryption-to-dropbox"&gt;nice article&lt;/a&gt; covering some of Dropbox&amp;#8217;s security problems as well as strategies to make them less of a problem.
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3-2" class="outline-3"&gt;
&lt;h3 id="sec-3-2"&gt;rdist + ssh&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-3-2"&gt;

&lt;p&gt;&lt;a href="http://linux.about.com/library/cmd/blcmdl1_rdist.htm"&gt;rdist&lt;/a&gt; and &lt;a href="http://linux.about.com/od/commands/l/blcmdl1_ssh.htm"&gt;ssh&lt;/a&gt; are two tried and true Unix programs. rdist is used to keep two directories synchronized. The directories can be on one computer but are typically on two different computers (&lt;i&gt;rdist&lt;/i&gt; = Remote Distribution).
&lt;/p&gt;
&lt;p&gt;
rdist and Dropbox are similar in that they both keep directories across multiple machines synchronized. However, unlike Dropbox, rdist must be manually run. It doesn&amp;#8217;t watch specific directories watching for a file modification and then automatically synchronize the files across all of your computers.
&lt;/p&gt;
&lt;p&gt;
I use rdist to sync files to my &lt;a href="http://ubuntu.com"&gt;Ubuntu&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Virtual_private_server"&gt;VPS&lt;/a&gt; server that I rent, quite happily, from &lt;a href="http://rosehosting.com"&gt;RoseHosting&lt;/a&gt;. The reason for synching to my VPS is that it is my only computer that is always accessible from the internet:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Rosehosting keeps my server running.
&lt;/li&gt;
&lt;li&gt;It has a &lt;a href="http://en.wikipedia.org/wiki/Domain_Name_System"&gt;DNS&lt;/a&gt; entry so it can be found from any computer.
&lt;/li&gt;
&lt;li&gt;Unlike my personal computers, especially my laptops, my VPS is never turned off or not online.
&lt;/li&gt;
&lt;li&gt;Unlike computers on my home network, the firewall my VPS is behind allows incoming connections. My home network firewall is significantly more restrictive.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
In short, my VPS is the only computer I have that is available 24x7 from any internet connection. This means that every computer can sync with it at any time. While it would be faster and use less network bandwidth if I synched the computers in my home to each other rather than a VPS somewhere out in the cloud, I have more than enough bandwidth to use.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;Next Up&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;


&lt;p&gt;
Keeping files in sync is great but identical files don&amp;#8217;t always behave identically on different systems. For example, there tends to be lots of file paths in my &lt;code&gt;.bashrc&lt;/code&gt; and my &lt;code&gt;.emacs&lt;/code&gt; files. I utilize a series of tricks to allow many of these files to behave identically on different machines.
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=LcOlm3BnNh0:drgF3yxGbds:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=LcOlm3BnNh0:drgF3yxGbds:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=LcOlm3BnNh0:drgF3yxGbds:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/LcOlm3BnNh0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/08/21/disk-crash-part2/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Disk Crash]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/bePoDIvvCEI/" />
    <updated>2012-08-21T22:02:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/08/21/disk-crash</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;Ouch! My Disk Crashed&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;My &lt;a href="http://en.wikipedia.org/wiki/MacBook_Pro"&gt;MacBook Pro&lt;/a&gt; became unusable and required a complete repartition and several reformats before I could resuscitate it. Recovering from the disk crash was surprisingly easy, there were a few hitches. Being that, without a duplicate computer, the only time that you can see how well your backup strategy works and correct it, I&amp;#8217;ve been using this disk crash as an opportunity to bolster my backup strategy.
&lt;/p&gt;
&lt;p&gt;
While I had some gaps in my backup strategy, within 2 hours of my disk crash I had my backup computer running, complete with my data files, shell scripts, config files, etc&amp;hellip;
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;File Distribution&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;In my mind, file backup and file distribution across multiple machines are intimately related. File backup is, well it&amp;#8217;s file backup. I use file distribution to keep various files synchronized across my devices. It should be noted that while the goal of file distribution is synchronization of data across computers, distributing files to other computers effectively backs them up.
&lt;/p&gt;
&lt;p&gt;
My primary computers are my MacBook Pro and an &lt;a href="http://en.wikipedia.org/wiki/Hewlett-Packard"&gt;HP&lt;/a&gt; laptop running &lt;a href="http://en.wikipedia.org/wiki/Ubuntu_(operating_system)"&gt;Ubuntu Linux&lt;/a&gt;. My mobile is a &lt;a href="http://en.wikipedia.org/wiki/Samsung_Infuse_4G"&gt;Samsung Infuse&lt;/a&gt; running &lt;a href="http://en.wikipedia.org/wiki/CyanogenMod#CyanogenMod_10"&gt;CyanogenMod 10&lt;/a&gt;, a customized version of &lt;a href="http://en.wikipedia.org/wiki/Android_version_history#Android_4.1.x_Jelly_Bean"&gt;Android 4.1 Jelly Bean&lt;/a&gt;. I also rent a &lt;a href="http://en.wikipedia.org/wiki/Virtual_private_server"&gt;VPS&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Cloud_computing"&gt;cloud computer&lt;/a&gt; running Ubuntu. Lastly, I have an &lt;a href="http://en.wikipedia.org/wiki/Asus"&gt;Asus&lt;/a&gt; running &lt;a href="http://en.wikipedia.org/wiki/Windows_7"&gt;Windows 7&lt;/a&gt;. I primarily use te Windows computer for &lt;a href="http://en.wikipedia.org/wiki/Streaming_media"&gt;streaming media&lt;/a&gt; (I don&amp;#8217;t dig Windows).
&lt;/p&gt;
&lt;p&gt;
I use file distribution to achieve two goals. I like to keep my configuration files consistent across my MacBook and two Ubuntu computers. This includes my &lt;a href="http://en.wikipedia.org/wiki/Bash_(Unix_shell)#Startup_scripts"&gt;.bashrc&lt;/a&gt; and my &lt;a href="http://en.wikipedia.org/wiki/Emacs_Lisp#Source_code"&gt;.emacs&lt;/a&gt; site startup files. While I want those files to stay in sync to make the management of them simpler, there&amp;#8217;s generally no rush in synchronizing them.
&lt;/p&gt;
&lt;p&gt;
Another example of my file distribution involves my &lt;a href="http://en.wikipedia.org/wiki/Personal_information_manager"&gt;PIM&lt;/a&gt;. I use &lt;a href="http://orgmode.org"&gt;Org Mode&lt;/a&gt; as my &lt;a href="http://en.wikipedia.org/wiki/Personal_information_manager"&gt;PIM&lt;/a&gt; and want the data files to be synchronized across my MacBook, two Linux boxes, and my Android. I want those files synchronized immediately as I frequently move from computer to computer and always want my PIM data to be up to date.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;Prioritization Of File Backup And File Distribution&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;My backup and distribution strategy categorizes files using two metrics:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;File Importance:&lt;/b&gt; This describes how critical each file is. Files in &lt;code&gt;~/Downloads&lt;/code&gt; are typically not very important while the text for this blog entry is very important (at least to me).
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Synchronization Delay:&lt;/b&gt; As I move between multiple computers, my productivity is related to how frequently some files are synchronized across the computers. Some I want optimized as soon as possible while other files can take hours or even days to get synchronized without affecting my productivity. Some low priority files, such as those in &lt;code&gt;~/Downloads&lt;/code&gt; don&amp;#8217;t ever need to be synchronized across machines.
&lt;/li&gt;
&lt;/ul&gt;




&lt;!-- more --&gt;

&lt;p&gt;
In practice this leads to four types of files:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;High/Timely:&lt;/b&gt; Files that are very important and need to be synchronized in a timely fashion. My PIM files fall into this category.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;High/Delayed:&lt;/b&gt; Important files that don&amp;#8217;t need to timely synchronization. Configuration files such as my .bashrc are High/Delayed.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Low/Delayed:&lt;/b&gt; Files that are convenient to have across my machines but aren&amp;#8217;t essential to my immediate productivity. For example, I frequently download manuals for various appliances that I own. I like to have them handy but it&amp;#8217;s fine if they aren&amp;#8217;t synched immediately. As I can easily download them again, they&amp;#8217;re of relatively low importance.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Everything Else:&lt;/b&gt; These are files that are of significantly low importance that I don&amp;#8217;t worry too much about them.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
My backup and distribution strategy varies by which quadrant (I&amp;#8217;m excluding the N/A boxes) a file is in.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;There&amp;#8217;s Data That Should Be Backed Up That Is Not In A File&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt;My first lesson was that not all data is backupable via file backup and distribution processes. The best example I have of this is the set of installed applications. Applications are typically large files and frequently require complex installations. While many &lt;a href="http://en.wikipedia.org/wiki/Mac_os_x"&gt;Mac OS X&lt;/a&gt; applications can be installed by copying the file into the &lt;code&gt;/Applications&lt;/code&gt; directory, others require the use of package installers. This is similar to &lt;a href="http://en.wikipedia.org/wiki/Windows"&gt;Windows&lt;/a&gt; applications that store data in the &lt;a href="http://en.wikipedia.org/wiki/Windows_registry"&gt;Windows Registry&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Knowing that applications were cumbersome and frequently needed special installation scripts led me to decide to not back up my applications. After this disk crash, I continue to think that it makes no sense to backup your installed apps. That said, I have sorely missed having a list of the applications that I had installed before the disk problems.
&lt;/p&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-1" class="outline-3"&gt;
&lt;h3 id="sec-4-1"&gt;Monitor Installed Applications&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-4-1"&gt;

&lt;p&gt;My initial response to the lack of a list of installed apps was to start recording apps as I installed them. After the first half-dozen or so apps I decided that this was a bad idea. I could see that the list was going to be incomplete, outdated, and generally not very helpful.
&lt;/p&gt;
&lt;p&gt;
So I took a few minutes to whip up a trivial shell script that I run once a day via crontab. The shell script attempts to record the names of installed applications rather than the actual applications themselves. The version of the shell script that I&amp;#8217;m currently using is:
&lt;/p&gt;


&lt;pre class="src src-sh-mode"&gt;#!/bin/sh
shopt -s nullglob
shopt -u failglob
ls -dlrt /Applications/* /Library/PreferencePanes/* ~/Library/PreferencePanes/* &amp;gt; ~/Dropbox/Backups/InstalledApps.txt
&lt;/pre&gt;


&lt;p&gt;
An abbreviated sample of its output is:
&lt;/p&gt;


&lt;pre class="example"&gt;drwxr-xr-x   3 root  wheel  102 May  5  2009 /Applications/Font Book.app
drwxr-xr-x   3 root  wheel  102 May 19  2009 /Applications/Stickies.app
drwxr-xr-x   3 root  wheel  102 May 19  2009 /Applications/Chess.app
drwxr-xr-x   3 root  admin  102 Sep 19  2009 /Library/PreferencePanes/RCDefaultApp.prefPane
drwxrwxr-x   3 root  wheel  102 May 24  2011 /Library/PreferencePanes/Growl.prefPane
drwxr-xr-x@  3 neil  admin  102 May 24  2011 /Applications/HardwareGrowler.app
drwxr-xr-x@  3 neil  admin  102 May 24  2011 /Applications/GrowlTunes.app
drwxr-xr-x   3 neil  staff  102 Jul 25 18:27 /Applications/BetterTouchTool.app
drwxr-xr-x@  3 neil  admin  102 Aug 13 22:51 /Applications/Google Chrome.app
drwxr-xr-x@  4 neil  admin  136 Aug 18 08:19 /Applications/FirefoxAurora.app
drwxr-xr-x   3 neil  staff  102 Aug 18 11:52 /Applications/GrowlSafari.app
&lt;/pre&gt;


&lt;p&gt;
As this script is run once a day and stored in my Dropbox folder, I always have an up-to-date copy of the file.
&lt;/p&gt;
&lt;p&gt;
I still have some changes planned for the script:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;The script only works for typical Mac OS X applications. It doesn&amp;#8217;t check for command line applications as well as applications installed by a package manager such os &lt;a href="http://mxcl.github.com/homebrew/"&gt;Homebrew&lt;/a&gt; (Mac OS X package installer), &lt;a href="http://www.cpan.org/"&gt;CPAN&lt;/a&gt; (Perl package installer), or &lt;a href="https://github.com/sstephenson/rbenv/"&gt;rbenv&lt;/a&gt; (Ruby package installer - sort of).
&lt;/li&gt;
&lt;li&gt;Perhaps I had a good reason to put the data file into my Dropbox folder but I can&amp;#8217;t recall it now. This data seems a perfect example of High/Delayed data as discussed in the table above.
&lt;/li&gt;
&lt;li&gt;The script misses some peculiar applications. Most of these applications are from Apple. &lt;a href="https://developer.apple.com/xcode/"&gt;Xcode&lt;/a&gt; is a good example of a &amp;#8220;peculiar&amp;#8221; application. Xcode includes a GUI application, command line programs, and runtime libraries. These get scattered across the machine. I suspect I&amp;#8217;ll just hardcode these applications into my script rather than trying to create the logic to find them. For example, I&amp;#8217;ll have my script add a line to the installed applications that reads &lt;code&gt;Xcode from https://developer.apple.com/xcode/&lt;/code&gt;. That seems good enough.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-2" class="outline-3"&gt;
&lt;h3 id="sec-4-2"&gt;Other Missing Data&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-4-2"&gt;

&lt;p&gt;Missing the list of installed apps had a quick fix but other data isn&amp;#8217;t so readily available or I don&amp;#8217;t know how to access it. Some examples of missing data are:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Customized icons for folders: On Mac OS X you can associate a small icon to each folder. On the directories that I use routinely I have customized the icons so that I can find them quickly.
&lt;/li&gt;
&lt;li&gt;The settings of some Chrome extensions did not get restored.
&lt;/li&gt;
&lt;li&gt;My cron jobs were only stored within cron&amp;#8217;s database.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
The cron jobs problem was another one that I was able to fix with a simple shell script and a minor modification to my workflow. Instead of editing my cron jobs directly via &lt;code&gt;crontab -e&lt;/code&gt;, I now keep them in a file in my &lt;code&gt;bin&lt;/code&gt; directory and modify that file as needed. When I modify my cron jobs I can either run crontab to immediately update my cron jobs or wait until I run my nightly cron job as that auto-updates my cron jobs:
&lt;/p&gt;



&lt;pre class="src src-sh-mode"&gt;#!/bin/sh

# Run my apps lister
$HOME/bin/installed-apps-lister.sh

# Run other stuff that I've removed from this example.

# Update my cron jobs in case I've modified the cron file.
crontab $HOME/bin/crontab-jobs
&lt;/pre&gt;


&lt;p&gt;
The &lt;code&gt;$HOME/bin/crontab-jobs&lt;/code&gt; file gets automatically backed up with the rest of my bin files.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;Other Backup And Distribution Strategies&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;

&lt;p&gt;I&amp;#8217;ll discuss the rest of my backup strategy in a subsequent posting. As a sneak-peek I&amp;#8217;ll tell you that the technologies I use include:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Dropbox_(service)"&gt;Dropbox&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/CrashPlan"&gt;CrashPlan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://linux.about.com/library/cmd/blcmdl1_rdist.htm"&gt;rdist&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/GitHub"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=bePoDIvvCEI:lLTy4x9yuzY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=bePoDIvvCEI:lLTy4x9yuzY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=bePoDIvvCEI:lLTy4x9yuzY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/bePoDIvvCEI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/08/21/disk-crash/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Time Tracking, Part 2: Org Mode File Format]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/2PWWrGOqLlk/" />
    <updated>2012-08-05T18:38:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/08/05/time-tracking-part-2</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;A Brief Introduction To Org Mode File Syntax&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;I&amp;#8217;ve decided that my time tracking solution requires some basic understanding of the file format of &lt;a href="http://orgmode.org"&gt;Org Mode&lt;/a&gt; as Org Mode syntax pervades the system. I&amp;#8217;ve done my best to cover the smallest amount of Org Mode syntax that is needed to understand the examples I&amp;#8217;ll of my time tracking system.
&lt;/p&gt;
&lt;p&gt;
It is frequently said that when you buy a house the three most important things to look for are &lt;a href="http://homebuying.about.com/od/marketfactstrends/qt/013008_location.htm"&gt;location, location, and location&lt;/a&gt;. When it comes to Org Mode, the three most important things to remember are Org Mode file format is plain text, Org Mode file format is plain text, and Org Mode file format is plain text.
&lt;/p&gt;
&lt;p&gt;
By &lt;a href="http://en.wikipedia.org/wiki/Plain_text"&gt;plain text&lt;/a&gt; I mean:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;You don&amp;#8217;t need a &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;GUI&lt;/a&gt; or any other program to read an Org Mode file.
&lt;/li&gt;
&lt;li&gt;Any &lt;a href="http://en.wikipedia.org/wiki/Text_editor"&gt;text editor&lt;/a&gt; can be used to create Org Mode files.
&lt;/li&gt;
&lt;li&gt;Org Mode files are highly compatible with standard text file utilities such as &lt;a href="http://linux.die.net/man/1/grep"&gt;grep(1)&lt;/a&gt;.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
While Org Mode&amp;#8217;s use of plain text has many advantages, the files tend to look a bit intimidating to a newcomer.
&lt;/p&gt;
&lt;p&gt;
While this posting only discusses Org Mode&amp;#8217;s file format, I use Org Mode for its incredibly rich organizational functionality.
&lt;/p&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;Hierarchical Outlines&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;Org Mode encourages you to store your data in an outline. A level one headline is simply a line of text that begins with a single asterisk (&lt;code&gt;*&lt;/code&gt;). A level two headline begins with two asterisks (&lt;code&gt;**&lt;/code&gt;), etc&amp;hellip;
&lt;/p&gt;


&lt;pre class="example"&gt;* Work
** Work hard.
Finish my project ahead of schedule.
** Ask boss for raise.
Remember to compliment him lots when asking.

* Personal
** Clean up after my kids.
Grumble while cleaning up.
** Tell my kids that they should clean up after themselves.
Laugh quietly to myself as I know it won't help.
&lt;/pre&gt;



&lt;!-- more --&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;Adding Tags&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;Org Mode allows you to further organize your tasks by adding &lt;a href="http://en.wikipedia.org/wiki/Tag_(metadata)"&gt;tags&lt;/a&gt; to your todo list. Being that Org Mode is plain text, tags are words wrapped in colons (&lt;code&gt;:&lt;/code&gt;).
&lt;/p&gt;


&lt;pre class="example"&gt;* Work                                                              :work:
** Work hard.
Finish my project ahead of schedule.
** Ask boss for raise.
Remember to compliment him lots when asking.

* Personal                                                          :personal:
** Clean up after my kids.
Grumble while cleaning up.
** Tell my kids that they should clean up after themselves.
Laugh quietly to myself when they say they will but I know they won't.
&lt;/pre&gt;


&lt;p&gt;
Tags in Org Mode are inherited with the hierarchical layout of the outline. In the above example, only the two level 1 headlines have tags on their line but their children inherit these tags. For example, the task
&lt;/p&gt;&lt;pre class="example"&gt;
** Clean up after my kids.
&lt;/pre&gt;

&lt;p&gt;inherits the &lt;code&gt;:personal:&lt;/code&gt; tag.
&lt;/p&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;Using Tags To Describe Multiple Facets Of A Task&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt;The above use of tags was rather dull. The tags repeated data that was already in the outline hierarchy. The real power of tags becomes apparent when you use them to classify different facets of a task. For example, a &lt;a href="http://en.wikipedia.org/wiki/Getting_Things_Done"&gt;GTD&lt;/a&gt; style of tagging can include context tags such as &lt;code&gt;:@home:&lt;/code&gt;, as well as priority tags such as &lt;code&gt;:next_action:&lt;/code&gt;. Adding these tasks, our example becomes:
&lt;/p&gt;


&lt;pre class="example"&gt;* Work                                                              :work:
** Work hard.                                                      :@work:@home:%next_action:
Finish my project ahead of schedule.
** Ask boss for raise.                                             :@boss:%someday:
Remember to compliment him lots when asking.

* Personal                                                          :personal:
** Clean up after my kids.                                         :@home:next_action:
Grumble while cleaning up.
** Tell my kids that they should clean up after themselves.        :@home:%why_bother:
Laugh quietly to myself as I know it won't help.
&lt;/pre&gt;


&lt;p&gt;
In Org Mode all tags are created equal. For example, priority tags aren&amp;#8217;t different than location or topic tags. Keeping with Org Mode&amp;#8217;s plain text file format, I decided to distinguish my priority tags with a percent sign (&lt;code&gt;%&lt;/code&gt;), changing GTD&amp;#8217;s common &lt;code&gt;:next_action:&lt;/code&gt; tag &lt;code&gt;:%next_action:&lt;/code&gt;.
&lt;/p&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;More Info&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;

&lt;p&gt;If you are interested, you can read more about Org Mode on its &lt;a href="http://orgmode.org"&gt;home page&lt;/a&gt;, from any one of the vast collection of &lt;a href="http://orgmode.org/worg/org-tutorials/index.html"&gt;tutorials&lt;/a&gt; on the Org website, or one of the links from &lt;a href="https://www.google.com/webhp?sourceid=chrome-instant&amp;amp;ie=UTF-8&amp;amp;ion=1#hl=en&amp;amp;newwindow=1&amp;amp;qscrl=1&amp;amp;sclient=psy-ab&amp;amp;q=org mode &amp;amp;qscrl=1&amp;amp;oq=&amp;amp;gs_l=&amp;amp;pbx=1&amp;amp;fp=3e0aac4b0855dc98&amp;amp;ion=1&amp;amp;bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&amp;amp;biw=1130&amp;amp;bih=932"&gt;Google search&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=2PWWrGOqLlk:f5mAeoMC27g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=2PWWrGOqLlk:f5mAeoMC27g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=2PWWrGOqLlk:f5mAeoMC27g:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/2PWWrGOqLlk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/08/05/time-tracking-part-2/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Time Tracking]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/Xm_ZSoKZQj8/" />
    <updated>2012-08-04T19:29:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/08/04/time-tracking</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;The Quantified Self&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;A couple of months ago I heard about this &lt;del&gt;nerdy&lt;/del&gt; cool movement called &lt;a href="http://en.wikipedia.org/wiki/Quantified_Self"&gt;Quantified Self&lt;/a&gt;. Its goal is improving life by leveraging organized data about yourself. The ideas behind Quantified Self are far from new. Recording your caloric intake with the aim of reaching a goal, ie: counting calories, has been around for&amp;hellip; well for a long time.
&lt;/p&gt;
&lt;p&gt;
The Quantified Self movement takes old principles, such as calorie counting, and improves upon them in two key ways:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;QS is more of an atitude than an activity.&lt;/b&gt; Tracking calories, cholesterol levels, blood pressure, etc&amp;hellip; are generally targeted at a very specific goal. For example, a baseball player that records his batting performance against different pitchers is looking to be a better batter. The Quantified Self movement encourages people to look for new means of measurement, as wel as to use existing means of measurement differently, with no single goal. If you will, QS is an umbrella encompassing both old and new tools.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Technology is a game changer.&lt;/b&gt; Almost overnight it became possible to measure and record huge amounts of data about yourself. This ranges from relatively low-tech activities such as &amp;#8220;checking in&amp;#8221; to a social network during the day or using an online to-do management system to &lt;a href="http://fitbit.com"&gt;multipurpose devices&lt;/a&gt; that collect fairly complex data.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;My Project&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;Beinng the type of person who likes &lt;del&gt;nerdy&lt;/del&gt; cool things, I got all excited the moment I heard about QS. After toying around with some ideas I decided to monitor my daily activities with the goal of using my time more wisely.
&lt;/p&gt;
&lt;p&gt;
I am not referring to the type of activity data you can get from your &lt;a href="http://en.wikipedia.org/wiki/Filofax"&gt;Filofax&lt;/a&gt; or the detailed location data that a service such as &lt;a href="http://en.wikipedia.org/wiki/Google_Latitude"&gt;Google Latitude&lt;/a&gt; provides. I am going to &lt;a href="http://en.wikipedia.org/wiki/Sample_(statistics)"&gt;sample&lt;/a&gt; my activity several dozen times a day.
&lt;/p&gt;
&lt;p&gt;
I have a &lt;a href="https://github.com/Neil-Smithline/time-tracking-experiments/"&gt;living document and code repository&lt;/a&gt; that discusses my goals in more detail. I also have a &lt;a href="https://github.com/Neil-Smithline/time-tracking-experiments/blob/1254eb4cb744305f66f547fbccfc0189db542198/README.org"&gt;snapshot&lt;/a&gt; taken at the time of writing this.
&lt;/p&gt;
&lt;p&gt;
Besides documenting my goals, I have tried, for the first time, to keep a &lt;a href="http://www.neilsmithline.com/time-tracking-experiments/journal.html"&gt;journal&lt;/a&gt; of the problem solving process as I was going through it. To reduce the overhead of maintaining a journal I have left it pretty raw so please forgive its informal presentation.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;Implementing Time Tracking&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;The broad solution I&amp;#8217;ve implemented in my time tracking experiment is documented in the living document and journal referenced above. To save time, I&amp;#8217;ll not duplicate what is documented there. What I will discuss is my first solution, perhaps my first prototype of the time tracking system.
&lt;/p&gt;
&lt;p&gt;
The goal is to track my activities via my ever-handy Android phone and record that data in a structured manner on my computer. Due to my personal preferences, I&amp;#8217;m storing the data in &lt;a href="http://www.orgmode.org"&gt;Org Mode&lt;/a&gt; but the concepts are not limited to Org Mode.
&lt;/p&gt;
&lt;p&gt;
Being that I&amp;#8217;m storing my data in Org Mode and using Org Mode as my task manager, the solution has a very Org Mode&amp;#8217;ish feel. I&amp;#8217;ll try to explain enough about Org Mode so that you can follow.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;In The Next Posting&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt;I&amp;#8217;m going to post this blog entry in two parts because my time tracking system just interrupted me, asking for a sampling of my activity. When I responded to the request I saw that I&amp;#8217;ve used up the time I&amp;#8217;ve allotted for blogging today so I&amp;#8217;m putting this aside for now.
&lt;/p&gt;
&lt;p&gt;
PS: I don&amp;#8217;t think I&amp;#8217;ve mentioned it before but my time tracking system provides instantaneous feedback. Every time it requests a sample of my activity it tells me how long I&amp;#8217;ve been doing that activity as well as all the other activities I&amp;#8217;ve done during the day. This allows me to immediately alter my behavior without waiting for longer-term analyses. Definitely cool (OK, and nerdy too).
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=Xm_ZSoKZQj8:PqbE1nmQKj4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=Xm_ZSoKZQj8:PqbE1nmQKj4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=Xm_ZSoKZQj8:PqbE1nmQKj4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/Xm_ZSoKZQj8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/08/04/time-tracking/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Blurring Static And Dynamic Blogs]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/rlx0vG7FKvA/" />
    <updated>2012-07-22T18:23:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/07/22/blurring-static-and-dynamic-blogs</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;Static Blogging&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;I&amp;#8217;ve discussed the pros and cons about static blogging &lt;a href="http://www.neilsmithline.com/blog/categories/blogging-tech/"&gt;many times&lt;/a&gt; before. In summary, the cons are that, well that your blog is static. No surprise there.
&lt;/p&gt;
&lt;p&gt;
Fortunately, there are ways to push the limits of static blogging so that it is not quite so static.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;Website Hosting&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;Unless you are self-hosting your &lt;a href="http://octopress.org"&gt;Octopress&lt;/a&gt; or &lt;a href="http://jekyllrb.com"&gt;Jekyll&lt;/a&gt; blog, you are using another site to host your blog. I host mine on Github. They have a web server running 24x7 to host it. But that&amp;#8217;s not my problem. I just use their (free) services.
&lt;/p&gt;
&lt;p&gt;
I understand that website hosting isn&amp;#8217;t a terribly exciting example of stretching the bubble of static blogging, but it is an example nonetheless. Dynamic blogs require specialized software running on their hosting computer to work. Static blogs tend to be able to run on generic web servers but there still must be a web server or there&amp;#8217;s no blog.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;JavaScript Helps&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;Out of the box, Octopress comes with some features to show your most recent tweets as well as recent activity within your &lt;a href="http://github.com"&gt;Github&lt;/a&gt; repositories. This is dynamic data that Octopress implements with some JavaScript.
&lt;/p&gt;
&lt;p&gt;
Just to be clear, by &lt;i&gt;dynamic data&lt;/i&gt; I mean that the data displayed on the page may change without a republication of the blog. I am not necessarily referring to a scrolling widget or something. Just dynamic data. 
&lt;/p&gt;
&lt;p&gt;
Conversely, JavaScript can be used to dynamically display static data. That is, data that is embedded in the source of the web page. Being that the data is embedded in the page&amp;#8217;s source at or before publication time, it is assuredly &lt;i&gt;static data&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
But client-side JavaScript (ie: JavaScript running in the user&amp;#8217;s browser) has its limits. For example, if you want to send a tweet whenever you add a new blog entry, client-side JavaScript is going to have a hard time at it.
&lt;/p&gt;


&lt;!-- more --&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;Pushing Beyond Web Hosting JavaScript&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt;The trick behind adding a much wider array of dynamic features to your &lt;i&gt;static&lt;/i&gt; blog is:
&lt;/p&gt;&lt;blockquote&gt;

&lt;p&gt;Integrate with external web services and let them do the work for you.
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;
It is even better if you can let other sites do the hard work for you free of charge. For example, Github is hosting this blog at no cost to me. Thank you Github! But Github won&amp;#8217;t tweet about my new blog postings or search through my website. Fortunately, there are services that will happily do that for you.
&lt;/p&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-1" class="outline-3"&gt;
&lt;h3 id="sec-4-1"&gt;Site Search&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-4-1"&gt;

&lt;p&gt;This blog&amp;#8217;s search functionality is provided by Google. Dynamic blogging systems such as &lt;a href="http://joomla.org"&gt;Joomla&lt;/a&gt; have a large array of &lt;a href="http://extensions.joomla.org/extensions/search-a-indexing"&gt;search extensions&lt;/a&gt; that you can run on your server to provide various searching features. I&amp;#8217;m sure that they provide a much larger set of functionality than my site&amp;#8217;s Google search provides. 
&lt;/p&gt;
&lt;p&gt;
Richer functionality or not, each extension needs to be installed, configured, and maintained. With Octopress, you never need to think about your site&amp;#8217;s search functionality. The site comes preconfigured for Google site search. That works for me.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-2" class="outline-3"&gt;
&lt;h3 id="sec-4-2"&gt;Automated Tweeting&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-4-2"&gt;

&lt;p&gt;There are many ways to tweet via an email message but there is no way, at least none that I&amp;#8217;ve bothered to think through, to get Github to send emails formatted for a tweet whenever you post. But, there are many sites that will watch your blog for change and perform some activity when your blog changes.
&lt;/p&gt;
&lt;p&gt;
Exactly which site you use depends on what your needs are. For automated tweeting I decided to use &lt;a href="http://feedburner.com/"&gt;FeedBurner&lt;/a&gt;. If you&amp;#8217;re unfamiliar with FeedBurner, it provides a web service that takes your site&amp;#8217;s RSS/Atom feed as input and adds value to that feed. My site&amp;#8217;s RSS feed is &lt;a href="http://feeds.feedburner.com/MyGeekdom"&gt;http://feeds.feedburner.com/MyGeekdom&lt;/a&gt;. Assuming you don&amp;#8217;t have uncommon browser settings, if you visit that URL  you will see something that looks like: 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.neilsmithline.com/assets/screen-snapshots/feedburner.png"  alt="http://www.neilsmithline.com/assets/screen-snapshots/feedburner.png" /&gt;
&lt;/p&gt;
&lt;p&gt;
Amongst the multitude of options that FeedBurner provides is the ability to subscribe to a site by email. So I subscribed myself, using a unique email alias, to FeedBurner emails about updates to my site. I then created an email filter that automatically forwards the FeedBurner emails to my tweeting email address and &lt;i&gt;voila&lt;/i&gt;, whenever I post a new article I automatically produce a tweet &lt;a href="https://twitter.com/neil_smithline/status/227220890109218816"&gt;like this one&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-3" class="outline-3"&gt;
&lt;h3 id="sec-4-3"&gt;Tracking &amp;#8220;The Buzz&amp;#8221;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-4-3"&gt;

&lt;p&gt;&amp;#8220;The Buzz&amp;#8221;, also known as &amp;#8220;Trending&amp;#8221; or simply &amp;#8220;current events&amp;#8221;, is a term to describe what is popular on the internet at any given moment. While tracking all of the internet&amp;#8217;s news doesn&amp;#8217;t seem appropriate for a blog, tracking news related to your blog posting may be desirable.
&lt;/p&gt;
&lt;p&gt;
Courtesy of &lt;a href="http://socialmention.com"&gt;SocialMention&lt;/a&gt;, many of my blog postings have current news in the sidebar (see &lt;a href="http://www.neilsmithline.com/blog/2012/07/15/bookifying-news/"&gt;example blog posting&lt;/a&gt;). In many ways this is similar to tracking a Twitter #hashtag. But SocialMention gathers data from many dozens of web sites providing a richer and more diverse collection of data than Twitter can. 
&lt;/p&gt;
&lt;p&gt;
For example, by tracking several popular bookmarking sites such as &lt;a href="http://delicious.com"&gt;Delicious&lt;/a&gt;, SocialMention can tell you what pages people are bookmarking that are related to your blog posting. Most people, thankfully, don&amp;#8217;t send a tweet whenever they bookmark a site.
&lt;/p&gt;
&lt;p&gt;
While it may be redundant to state,
&lt;/p&gt;&lt;blockquote&gt;

&lt;p&gt;Displaying current events on your blog postings means that they will always have current information.
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;
This means that there&amp;#8217;s no need to update your blog posting with links to relevant websites as new information becomes available. That is clearly a task that would become unmanageable as your blog grows. Instead, your &lt;i&gt;static blog&lt;/i&gt; will always have &lt;i&gt;dynamic data&lt;/i&gt; on it.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;The Age Of Cloud Computing&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;

&lt;p&gt;While my blog is far from a large operation, the advent of &lt;a href="http://en.wikipedia.org/wiki/Cloud_computing"&gt;cloud computing&lt;/a&gt; has made these dynamic features possible. From tiny systems like my blog to large systems like Google&amp;#8217;s search engine, cloud computing is about wiring together the most appropriate services in a manner that produces your desired functionality with a minimal amount of setup, cost, and maintenance.
&lt;/p&gt;
&lt;p&gt;
While I don&amp;#8217;t have exact dates, my automated tweeting on new blog posts has been working maintenance free long enough that I forgot that I had implemented it until I noticed that I had just tweeted about my previous blog posting. I believe that is the very definition of &amp;#8220;minimal maintenance&amp;#8221;.
&lt;/p&gt;
&lt;p&gt;
Given the large and growing number of web services in the cloud and my limited time to explore them, I&amp;#8217;m sure that this is but a small sampling of the different ways to use dynamic data in static blogs.
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=rlx0vG7FKvA:PdQwNHotH9s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=rlx0vG7FKvA:PdQwNHotH9s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=rlx0vG7FKvA:PdQwNHotH9s:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/rlx0vG7FKvA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/07/22/blurring-static-and-dynamic-blogs/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Desktop Time Tracking]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/06QTDX5ldR4/" />
    <updated>2012-07-21T20:17:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/07/21/desktop-time-tracking</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;Motivation&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;Recently I&amp;#8217;ve been trying to improve my time management skills. This is further discussed in this &lt;a href="https://github.com/Neil-Smithline/time-tracking-experiments"&gt;Github README&lt;/a&gt; file. I have also been keeping a &lt;a href="http://www.neilsmithline.com/time-tracking-experiments/journal.html"&gt;journal&lt;/a&gt; my activities and thoughts as I work on this project. You may also wish to read up on the &lt;a href="http://en.wikipedia.org/wiki/Quantified_Self"&gt;Quantified Self&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;Basic Activity Tracking&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;While I had not initially planned to focus on Mac OS X time tracking, it turned out to be easy. For a couple of weeks I&amp;#8217;ve been playing around with two Mac OS X applications that track your computer activities: &lt;a href="http://timingapp.com/"&gt;Timing&lt;/a&gt; (actually &lt;i&gt;Timing Lite&lt;/i&gt;) and &lt;a href="http://manytricks.com/timesink/"&gt;Time Sink&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Time Sink integrates with Mac OS X to track the &lt;i&gt;active&lt;/i&gt; or &lt;i&gt;foreground&lt;/i&gt; application and provides a variety of reports to display that information. In addition to tracking the current app, Time Sink tries to track what you were doing in that app. It achieves this by using a relatively low-tech process of collecting the active window&amp;#8217;s name.
&lt;/p&gt;
&lt;p&gt;
While a window name does not seem like a lot of information, it turns out to be surprisingly useful. From the window name Time Sink distinguishes, for example, the amount of time you spent browsing Facebook from the amount of time you spent browsing Github.
&lt;/p&gt;
&lt;p&gt;
Time Sink can harvest this data from any app that includes information about the current activity. This includes editors that put the file being edited in the window name, media plays that put the title of what is currently being played, etc&amp;hellip;
&lt;/p&gt;
&lt;p&gt;
Your activities get displayed in a nice graphical format:
&lt;img src="http://www.neilsmithline.com/assets/screen-snapshots/Time-Sink-Activities.png"  alt="http://www.neilsmithline.com/assets/screen-snapshots/Time-Sink-Activities.png" /&gt;
&lt;/p&gt;
&lt;p&gt;
Due to browser page size I&amp;#8217;ve excluded information such as how long I did these activities were as well as when I was doing them.
&lt;/p&gt;
&lt;p&gt;
In addition to the activity tracking performed by Time Sink, Timing has some &lt;a href="http://timingapp.com/faq.php#compatibility"&gt;application-specific&lt;/a&gt; functionality that allows it to better track what you are doing inside an app.
&lt;/p&gt;


&lt;!-- more --&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;From Activity Tracking To Category Tracking&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;The real power of these apps is that they allow you to categorize your activities. For example, you can specify that time spent browsing Facebook is socializing while time spent on Github is developing and exploring open-source.
&lt;/p&gt;
&lt;p&gt;
My open source development category includes:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Time spent browsing Github.
&lt;/li&gt;
&lt;li&gt;Time spent editing files in &lt;code&gt;$HOME/coding&lt;/code&gt;, the root of all of my open-source Github projects.
&lt;/li&gt;
&lt;li&gt;Time spent in a shell while the current directory is in &lt;code&gt;$HOME/coding&lt;/code&gt; directory or one of its subdirectories.
&lt;/li&gt;
&lt;li&gt;Other stuff not worth describing here.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Due to its fine-granularity and inability to associate activities across apps, the activity tracking data is not that useful. But, once it is categorized, called &lt;i&gt;Pooling&lt;/i&gt; by Time Sink, it starts to provide much more useful information. Consider this screen snapshot:
&lt;img src="http://www.neilsmithline.com/assets/screen-snapshots/Time-Sink-Activities.png"  alt="http://www.neilsmithline.com/assets/screen-snapshots/Time-Sink-Activities.png" /&gt;
&lt;/p&gt;
&lt;p&gt;
In it you can see that I was spending time on time management. This included time spent in three different apps.
&lt;/p&gt;
&lt;p&gt;
Both Time Sink and Timing have a convenient, drag-and-drop mechanism for adding activities to categories.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;Choosing Between Timing And Time Sink&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt;Today, the end of my 2-week trial period, I decided to purchase Time Sink because of its ability to automatically export data into a CSV file. Besides the automatic scheduling, Time Sink allows you to specify what data is exported as well as whether you want the export to include all data that Time Sink has stored or only data since the last automated export. Being that I want to use &lt;a href="http://orgmode.org"&gt;Org Mode&lt;/a&gt; as my data repository, this data exporting feature sealed the deal for me.
&lt;/p&gt;
&lt;p&gt;
That said, I feel that Timing and Time Sink are on par with each other. Each app costs &amp;lt; $10US so cost is not a factor. Each app has its own pros and cons. Time Sink just fit my specific needs.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;Analyzing The Data&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;

&lt;p&gt;To state the obvious, collecting time usage data is only useful if you can analyze it such that it improves your time management skills. This is where Org Mode comes into play. With a bit of tweaking, the CSV importer from &lt;a href="https://github.com/novoid/Memacs"&gt;Memacs&lt;/a&gt; will be able to import this data into Org Mode.
&lt;/p&gt;
&lt;p&gt;
Org Mode provides a rich set of features regarding scheduling and time management:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Standard task/to-do list management features.
&lt;/li&gt;
&lt;li&gt;Comparing actual time spent v. estimated time.
&lt;/li&gt;
&lt;li&gt;Identifying if you are falling behind on a long-term task.
&lt;/li&gt;
&lt;li&gt;Summarizing your time usage.
&lt;/li&gt;
&lt;li&gt;Sophisticated tracking of repeating tasks.
&lt;/li&gt;
&lt;li&gt;An integrated archive management framework that allows you to focus on the most pertinent information while maintaining all historical data.
&lt;/li&gt;
&lt;li&gt;Tons more.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-6" class="outline-2"&gt;
&lt;h2 id="sec-6"&gt;Early Payoffs&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-6"&gt;

&lt;p&gt;Being as I&amp;#8217;m planning on using Org Mode to perform data analysis and I am not yet able to import Time Sink data into Org Mode, one would think that there would be no immediate benefit of having this system working. I thought that would be the case. But I was wrong.
&lt;/p&gt;
&lt;p&gt;
For some time I&amp;#8217;ve used a timer that pops up every 15 minutes just to remind me that time is passing. I call it my &lt;i&gt;Focus Alert&lt;/i&gt; timer as it reminds me to make sure I&amp;#8217;m doing what I should be doing. When I&amp;#8217;m notified I can stand up and stretch, check the clock to make sure I&amp;#8217;m not late for something, make sure I&amp;#8217;m working on my highest priority task, etc&amp;hellip;
&lt;/p&gt;
&lt;p&gt;
Today I modified my Focus Alert (a small shell script) so that it helps me track my time with Time Sink. Before today&amp;#8217;s modification, my Focus Alert simply popped up a notification box that I had to click to close. As you may imagine, clicking quickly became second-nature.
&lt;/p&gt;
&lt;p&gt;
Starting today, my Focus Alert interrupts my work and displays the Time Sink application. While I can immediately switch back to whatever I was doing before the notification, it is rather difficult not to notice Time Sink&amp;#8217;s data. For example, about two sentences ago my Focus alert went off. As you can see in this screenshot of the relevant part of the Time Sink window:
&lt;img src="http://www.neilsmithline.com/assets/screen-snapshots/Time-Sink-Blog-Posting.png"  alt="http://www.neilsmithline.com/assets/screen-snapshots/Time-Sink-Blog-Posting.png" /&gt;
&lt;/p&gt;
&lt;p&gt;
I&amp;#8217;ve spent about an hour on this blog posting. As Time Sink is kind enough to distinguish wall-clock time from actual activity time, that hour is a very reliable statement about my activity.
&lt;/p&gt;
&lt;p&gt;
Being that I don&amp;#8217;t think this blog posting is worth more than an hour of my, I would have allocated 30-45 minutes top, I&amp;#8217;m ending the posting here.&lt;sup&gt;&lt;a class="footref" name="fnr.1" href="#fn.1"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;
&lt;p&gt;
I hope to follow-up this posting with more blog postings as well as &lt;a href="http://www.neilsmithline.com/time-tracking-experiments/journal.html"&gt;journal&lt;/a&gt; entries as I try to understand what I&amp;#8217;m doing and then make myself more efficient.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-7" class="outline-2"&gt;
&lt;h2 id="sec-7"&gt;UPDATE &lt;span class="timestamp-wrapper"&gt; &lt;span class="timestamp"&gt;2012-07-22 Sun 15:50&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-7"&gt;

&lt;p&gt;Sacha Chua (&lt;a href="http://sachachua.com/blog/"&gt;blog&lt;/a&gt;, &lt;a href="https://twitter.com/sachac"&gt;twitter&lt;/a&gt;) responded to one of my &lt;a href="https://twitter.com/neil_smithline/status/225408627643650048"&gt;tweets&lt;/a&gt; about integrating Org Mode and Quantified Self. She pointed me towards this &lt;a href="http://sachachua.com/blog/2012/05/quantified-awesome-blogging-wpm-and-the-speed-of-reflection/"&gt;blog posting&lt;/a&gt;. In it she discusses how she uses Org Mode to track her blog writing time. Not only does she use Org Mode to track her activities, she uses it to track her &lt;a href="http://en.wikipedia.org/wiki/Wpm"&gt;WPM&lt;/a&gt; while writing blog posts. She averages 16 WPM while blogging.
&lt;/p&gt;

&lt;div id='footnotes'&gt;
&lt;h4 class='footnotes'&gt;Footnotes: &lt;/h4&gt;
&lt;div id='text-footnotes'&gt;
&lt;p class="footnote"&gt;&lt;sup&gt;&lt;a class="footnum" name="fn.1" href="#fnr.1"&gt;1&lt;/a&gt;&lt;/sup&gt; After reading Sacha&amp;#8217;s post, I decided to calculate my WPM for this blog post. It turns out that I typed 15 WPM (actually 14.79729729&amp;hellip;). I&amp;#8217;ll have to readjust my estimates for blogging as I don&amp;#8217;t think I can hope to outperform the industrious Sacha Chua. Especially being that she types 110 WPM at full speed!
&lt;/p&gt;


&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=06QTDX5ldR4:xG49qlWxVmg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=06QTDX5ldR4:xG49qlWxVmg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=06QTDX5ldR4:xG49qlWxVmg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/06QTDX5ldR4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/07/21/desktop-time-tracking/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Bookifying News]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/efdEQqfvhJU/" />
    <updated>2012-07-15T10:09:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/07/15/bookifying-news</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;Bookifying News&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;I frequently find it convenient to take a &lt;i&gt;website on the road&lt;/i&gt;. That is, I want a website or part of a website in a convenient, portable, easily accessible format on my &lt;a href="http://en.wikipedia.org/wiki/Asus_Eee_Pad_Transformer"&gt;Asus Transformer&lt;/a&gt; tablet. The Transformer has &lt;a href="http://en.wikipedia.org/wiki/802.11n"&gt;WiFi&lt;/a&gt; but no &lt;a href="http://en.wikipedia.org/wiki/GSM_services#Data_transmission"&gt;mobile data&lt;/a&gt;. Without a portable means of accessing a website, the lack of data plan would dramatically limit the usability of my tablet.
&lt;/p&gt;
&lt;p&gt;
I have taken to &lt;i&gt;bookifying&lt;/i&gt; websites that I have an interest in staying up to date with (eg: &lt;a href="http://xkcd.com"&gt;XKCD&lt;/a&gt;). For most sites, I only care about the newest postings. I convert the newest posting into an &lt;a href="http://en.wikipedia.org/wiki/EPUB"&gt;epub&lt;/a&gt; book, load it onto my tablet, and then read it using one an &lt;a href="http://en.wikipedia.org/wiki/Ebook_reader"&gt;ebook reader&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Besides bookifying the newest articles on &lt;a href="http://lifehacker.com"&gt;LifeHacker&lt;/a&gt;, I have also bookified entire websites.
&lt;/p&gt;
&lt;p&gt;
The cool part is, this process requires a one-time configuration and then works automatically. That is, the entire web sites sit on my tablet and old website articles are automatically replaced by the new ones. 
&lt;!-- more --&gt;

&lt;/p&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;The Process&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;The bookification process utilizes the following tools:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;The &lt;a href="http://www.wikipedia.com/Foss"&gt;FOSS&lt;/a&gt; epub creation and library management tool &lt;a href="http://en.wikipedia.org/wiki/Calibre_(software)"&gt;Calibre&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://www.jrtstudio.com/CheetahSync"&gt;Cheetah Sync&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/File_synchronization"&gt;file-synchronization&lt;/a&gt; application for &lt;a href="http://en.wikipedia.org/wiki/Android_(operating_system)"&gt;Android&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://play.google.com/store/apps/details?id=com.flyersoft.moonreaderp&amp;amp;feature=related_apps#?t=W251bGwsMSwxLDEwOSwiY29tLmZseWVyc29mdC5tb29ucmVhZGVycCJd"&gt;Moon+&lt;/a&gt; Android book reader.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Calibre comes packed with features for downloading new postings on a website, converting them to an epub book, and then managing the library it creates. It has nice extras such as updating sites on a customizable schedule and allowing you to specify how many ebooks of a site you wish to keep (eg: just today&amp;#8217;s publication or an entire week&amp;#8217;s worth).
&lt;/p&gt;
&lt;p&gt;
Cheetah Sync provides WiFi folder synchronization between your desktop (Mac OS X or Windows) and your Android tablet. This synchronization can happen on a schedule or manually to reduce battery usage.
&lt;/p&gt;
&lt;p&gt;
Moon+ is one of a large number of Android book readers. It seems to facilitate being used on a rotating library such as Calibre&amp;#8217;s by monitoring a directory on the file system and responding appropriately to changes.
&lt;/p&gt;
&lt;p&gt;
The end product of this is the LifeHacker website on my Transformer:
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;p&gt;&lt;img src="http://farm9.staticflickr.com/8284/7576840720_3b50e3b359_z.jpg"  alt="http://farm9.staticflickr.com/8284/7576840720_3b50e3b359_z.jpg" /&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
As a bonus, Calibre comes with a built-in epub book reader that you can run on your desktop:
&lt;/p&gt;

&lt;div style="text-align: center"&gt;
&lt;p&gt;&lt;img src="http://farm9.staticflickr.com/8015/7576921304_54fbbc35b6.jpg"  alt="http://farm9.staticflickr.com/8015/7576921304_54fbbc35b6.jpg" /&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
The output is less-cluttered that the site; seeming like a &lt;a href="http://readability.com"&gt;Readibility&lt;/a&gt; or &lt;a href="http://instapaper.com"&gt;InstaPaper&lt;/a&gt;
version of the all new content on the site.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;Books And Websites&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;Besides using Calibre to create epub books, it also does a good job of managing existing ones. For example, &lt;a href="http://www.sapphiresteel.com"&gt;SapphireSteel Software&lt;/a&gt; (whose name is an esoteric reference to a late 1970&amp;#8217;s British &lt;a href="http://en.wikipedia.org/wiki/Sapphire_&amp;amp;_Steel"&gt;TV show&lt;/a&gt;) have published an epub book called &lt;a href="http://www.sapphiresteel.com/The-Little-Book-Of-Ruby"&gt;The Little Book Of Ruby&lt;/a&gt;. I&amp;#8217;m learning Ruby and sometimes it is nice to be able to look up something when I&amp;#8217;m not near a WiFi connection and don&amp;#8217;t want to use my mobile WiFi hotspot as that tends to get costly quickly.
&lt;/p&gt;
&lt;p&gt;
Calibre also provides a means for bookifying entire websites or a specified portion of them. This works by creating a temporary copy of the website on your computer and then converting it to epub format with Calibre.
&lt;/p&gt;
&lt;p&gt;
Calibre provides its own &lt;a href="http://manual.calibre-ebook.com/cli/web2disk.html"&gt;web2disk&lt;/a&gt; utility that can download a website to your local disk. Sites such as &lt;a href="http://www.teleread.com/drm/the-abcs-of-format-conversion-for-the-kindle-sony-and-nook-plus-some-calibre-tips/"&gt;this one&lt;/a&gt; cover the details of this conversion. 
&lt;/p&gt;
&lt;p&gt;
I happen to be familiar with the more fleible but more complex Linux program &lt;a href="http://curl.haxx.se/docs/manpage.html"&gt;curl(1)&lt;/a&gt; and tend to use that to download an entire website. This &lt;a href="https://www.google.com/webhp?ie=UTF-8&amp;amp;ion=1#hl=en&amp;amp;newwindow=1&amp;amp;q=download+website+using+curl&amp;amp;qscrl=1&amp;amp;oq=download+website+using+curl&amp;amp;fp=1"&gt;Google search&lt;/a&gt; has numerous references on using curl to download a website.
&lt;/p&gt;
&lt;p&gt;
While Moon+ is my preference for ebook news due to its responsiveness in dealing with an externally managed library, I prefer uploading my books to &lt;a href="http://amazon.com"&gt;Amazon&lt;/a&gt;&amp;#8217;s Kindle library. For me, the Kindle&amp;#8217;s synchronization of bookmarks, notes, and current reading location are of much greater importance when I&amp;#8217;m reading a book than when I&amp;#8217;m reading a website. I use the &lt;a href="http://www.amazon.com/gp/feature.html/ref=kcp_and_ln_ar?docId=165849822"&gt;Kindle for Android&lt;/a&gt; app on my tablet and smartphone and the &lt;a href="http://www.amazon.com/gp/feature.html/ref=sv_kstore_1?ie=UTF8&amp;amp;docId=1000493771"&gt;Kindle for desktop or browser&lt;/a&gt; from my computer.
&lt;/p&gt;
&lt;p&gt;
While Kindle doesn&amp;#8217;t directly support the epub format, there are &lt;a href="http://techsupport.foreverwarm.com/how-to-read-epub-books-on-your-kindle"&gt;simple directions&lt;/a&gt; for converting epub ebooks to Kindle format using Calibre. This is a page from the &lt;a href="http://www.orgmode.org"&gt;Org Mode&lt;/a&gt; website ebook on my Transformer Kindle:
&lt;/p&gt;

&lt;div style="text-align: center"&gt;
&lt;p&gt;&lt;img src="http://farm9.staticflickr.com/8167/7577094056_656f76bc81.jpg"  alt="http://farm9.staticflickr.com/8167/7577094056_656f76bc81.jpg" /&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=efdEQqfvhJU:to5LvgMNAeQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=efdEQqfvhJU:to5LvgMNAeQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=efdEQqfvhJU:to5LvgMNAeQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/efdEQqfvhJU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/07/15/bookifying-news/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Yahoo! Forgets To Proofread Emails?]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/J2jImZj96-0/" />
    <updated>2012-07-01T21:33:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/07/01/yahoo-cancellation-notice</id>
    <content type="html">&lt;p&gt;
&lt;b&gt;Update: &lt;span class="timestamp-wrapper"&gt; &lt;span class="timestamp"&gt;2012-07-04 Wed&lt;/span&gt;&lt;/span&gt;&lt;/b&gt; Today &lt;a href="http://en.wikipedia.org/wiki/Igoogle"&gt;iGoogle&lt;/a&gt; had a notice at the top saying tat Google was discontinuing the service in &lt;b&gt;November 2013&lt;/b&gt;! The cancellation notice had this &lt;a href="http://bit.ly/O5prY1"&gt;Learn more&lt;/a&gt; link. Yahoo!&amp;#8217;s cancellation notice looks even worse when in the shadow of Google&amp;#8217;s.
&lt;/p&gt;

&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;Yahoo! Notification&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;&lt;a href="http://yhoo.it/Lr5viI"&gt;Yahoo! Groups&lt;/a&gt; is &lt;a href="http://yhoo.it/Lr5mfc"&gt;Yahoo!&lt;/a&gt;&amp;#8217;s version of public groups or forums. I used to think that it was one of the better group sites so I tended to use it. Over time I thought that it fell behind the pack and I stopped using it. I never deleted any of my groups. They had no confidential data and they were ocassionally handy to have around for historical purposes.
&lt;/p&gt;
&lt;p&gt;
On June 29 I received an email from &lt;a href="http://yhoo.it/Lr5mfc"&gt;Yahoo!&lt;/a&gt; informing me that they are shutting down some of their group features. 
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;Is There A Proofreader In The House?&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;I frequently notice errors in emails I get but I know that I frequently send emails with errors in them. Most emails are just not worth the trouble of iterating on until it is perfect. But I typically expect large companies to send professional looking emails. The email Yahoo! sent me was anything but professional.
&lt;/p&gt;
&lt;p&gt;
Rather than list the problems, I think looking at my annotations of their email is simpler:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.neilsmithline.com/assets/images/YahooGroupsClosing.png"  alt="http://www.neilsmithline.com/assets/images/YahooGroupsClosing.png" /&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;5 Days &amp;ndash; You Gotta&amp;#8217; Be Kidding&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;


&lt;!-- more --&gt;
&lt;p&gt;
Ignoring the formatting mistakes, Yahoo! gave me only five days to backup my data before the service was to be shutdown and all data erased. Five days? If you don&amp;#8217;t count the weekend and the July 4 US holiday, then they gave me two days to get my data.
&lt;/p&gt;
&lt;p&gt;
Furthermore, while they state that I should backup my data, they don&amp;#8217;t provide any directions or pointers telling me how to do such. 
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;Conclusion&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt;This was one email regarding one of the ?hundreds? of services Yahoo! offers. As such, I don&amp;#8217;t want to make broad generalizations about Yahoo! based on this email. That said, for several years I have been concerned with relying too much on Yahoo! services because I feel the company is not doing well. In particular, I have avoided any serious use of &lt;a href="http://bit.ly/Lr7of6"&gt;Yahoo! Pipes&lt;/a&gt;, a tool that allows you to quickly create implement and deploy data processing services.
&lt;/p&gt;
&lt;p&gt;
Being that Yahoo! seems to feel that five days is enough warning to shut down a service, I&amp;#8217;ll now be extra certain not to use Yahoo! for anything that I care about losing. This just reinforces my decision to only use &lt;i&gt;Yahoo! Pipes&lt;/i&gt; for quick prototyping. It is a shame because &lt;i&gt;Yahoo! Pipes&lt;/i&gt; are a wonderful tool.b
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=J2jImZj96-0:OmP9qnZuDMc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=J2jImZj96-0:OmP9qnZuDMc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=J2jImZj96-0:OmP9qnZuDMc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/J2jImZj96-0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/07/01/yahoo-cancellation-notice/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[The New, Privacy Invading, Facebook Like Button]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/LiXTrePSQ_8/" />
    <updated>2012-06-14T10:51:01-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/06/14/the-new-privacy-invading-facebook-like-button</id>
    <content type="html">&lt;p&gt;
(&lt;a href="http://bit.ly/NADZTP"&gt;Background information&lt;/a&gt; about online advertising.)
&lt;/p&gt;

&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;Facebook Keeping Tabs On You&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;&lt;a href="http://on.fb.me/L787EG"&gt;Facebook&lt;/a&gt; has announced that it will sell user &lt;a href="http://on.mash.to/L789wg"&gt;tracking information&lt;/a&gt; to its
advertisers. Facebook, following in the steps of other large web &lt;a href="http://bit.ly/NAEA84"&gt;advertising publishers&lt;/a&gt; such as &lt;a href="http://bit.ly/Kk80BT"&gt;Google&lt;/a&gt;, claims that &lt;a href="http://bit.ly/NAyR1R"&gt;targetted advertisements&lt;/a&gt; are a &lt;i&gt;win-win&lt;/i&gt; deal.
Advertisers win because they are able to provide ads that have a greater chance of
being &lt;a href="http://bit.ly/L78I9p"&gt;clicked&lt;/a&gt; and, hopefully, higher profit for the advertiser.
&lt;/p&gt;
&lt;p&gt;
Users win because they see ads that they are more pertinent to their interests. For
example, a user who frequents technology websites may not have a strong interest in
an ad for laundry detergent. But that same user may appreciate ads about the newest
gadgets.
&lt;/p&gt;
&lt;p&gt;
So, &lt;i&gt;win-win&lt;/i&gt;! Everybody&amp;#8217;s happy.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;Even I Can Count To Three&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;


&lt;p&gt;
The phrase &lt;i&gt;win-win&lt;/i&gt; implies that there are two involved parties. Facebook, Google, and other companies that track users for targeted ads seem to forget to mention that there are three involved parties:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The advertiser
&lt;/li&gt;
&lt;li&gt;The user
&lt;/li&gt;
&lt;li&gt;The publisher, that is the company selling the advertising
&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;
Perhaps &lt;i&gt;win-win-win&lt;/i&gt; is a more apropos statement than &lt;i&gt;win-win&lt;/i&gt;.  The advertiser wins because their ads have a higher click-through rate, users win because they see ads that they are more interested in, and the publisher wins because they can charge a premium for targeted ads. For years Google has been running an instantaneous, automated &lt;a href="http://bit.ly/NAzmZX"&gt;auction&lt;/a&gt; so that Google gets the highest price possible for its ads.
&lt;/p&gt;
&lt;p&gt;
A higher click-through rate is especially important for Facebook. Besides Facebook&amp;#8217;s &lt;a href="http://engt.co/NAAf4x"&gt;new obligation&lt;/a&gt; to its shareholders, Facebook has a notoriously low click-through rate. From a 2010 &lt;a href="http://tcrn.ch/NAzZ5N"&gt;TechCrunch article&lt;/a&gt;:
&lt;/p&gt;&lt;blockquote&gt;

&lt;p&gt;Biggest [advertising presence] doesn&amp;#8217;t mean most profitable. Facebook might be serving up more ads than almost anyone else, but they are still selling at very low ad rates because they perform poorly for the most part. If Facebook can figure out a way to make the ads on its site become more relevant and useful, it has a lot of room to boost its ad rates.
&lt;/p&gt;
&lt;/blockquote&gt;




&lt;!-- more --&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;Facebook&amp;#8217;s Dilemma&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;While Facebook is forced to look for ways to increase their revenue via targeted
advertising, users tend to feel that having their internet usage being tracked is a
&lt;a href="http://bit.ly/NAFtxi"&gt;privacy invasion&lt;/a&gt;. As user tracking becomes more accurate, and hence more valuable to
Facebook and other advertising publishers, it is also viewed by users as a greater
invasion of privacy.
&lt;/p&gt;
&lt;p&gt;
For years Facebook has been tracking users&amp;#8217; activities as they roam the pages of Facebook. Facebook has also been gathering information about what non-Facebook pages users &lt;a href="http://bit.ly/KIZZ8L"&gt;like&lt;/a&gt;. These two types of tracking have a common property:
&lt;/p&gt;&lt;blockquote&gt;

&lt;p&gt;Facebook only tracks users when they interact with Facebook.
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;
Whether the interaction is on the Facebook site or on another site where a user does a Facebook share or like.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;Facebook&amp;#8217;s Bait And Switch&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;


&lt;p&gt;
The change in user tracking that Facebook announced is that they will track users even if they do not interact directly with Facebook. Facebook will now gather users&amp;#8217; behavior whenever a user visits a site that has any Facebook code on it. That includes every page that has the ubiquitous:
&lt;img src="http://upload.wikimedia.org/wikipedia/commons/1/13/Facebook_like_thumb.png"  alt="http://upload.wikimedia.org/wikipedia/commons/1/13/Facebook_like_thumb.png" /&gt; 
button.
&lt;/p&gt;
&lt;p&gt;
For years, Facebook has been facilitating websites to use its &lt;i&gt;Like&lt;/i&gt; button as well as social widgets and other means of &lt;a href="http://bit.ly/KJ4alc"&gt;Facebook integration&lt;/a&gt; with your site. Facebook has discussed the &lt;a href="http://bit.ly/KJ4Zdz"&gt;many benefits&lt;/a&gt; this brings to website publishers.
&lt;/p&gt;
&lt;p&gt;
Facebook&amp;#8217;s change in user tracking has many ramifications:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;After years of facilitating Facebook integration with websites, Facebook has
     unilaterally decided to make every one of those sites a data collector for
     Facebook. 
&lt;/li&gt;
&lt;li&gt;Once Facebook starts gathering this data, Websites with Facebook integration will be providing Facebook with valuable information without receiving any compensation for that information.
&lt;/li&gt;
&lt;li&gt;Short of not using Facebook, users cannot effectively &lt;a href="http://bit.ly/KJ7Inj"&gt;opting out&lt;/a&gt; of this data tracking.
&lt;/li&gt;
&lt;li&gt;Some sites will have to update their privacy policy to reflect Facebook&amp;#8217;s new data collection.
&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;
Furthermore, Facebook says that this change will happen within the &lt;a href="http://bloom.bg/KJ6CI8"&gt;next few weeks&lt;/a&gt;, leaving users and websites little time to react to the change. 
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;Alternates&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;

&lt;p&gt;Even if a website decided to make changes to their site, there are few options to the &lt;i&gt;Like&lt;/i&gt; button that do not involve severing all Facebook integration. One solution would be to replace the &lt;i&gt;Like&lt;/i&gt; button, along with badges from other sites, with a generic &lt;a href="http://bit.ly/KJ91ma"&gt;social bookmarking widget&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
That said, only &lt;a href="http://brightpinkstudio.com/pinkink/resources/social-bookmarking-widgets/3/"&gt;five of the top ten&lt;/a&gt; social bookmarking widgets do not add tracking to their own widgets.
&lt;/p&gt;
&lt;p&gt;
The bottom line is that Facebook, likely due to pressure from their recent IPO and their &lt;a href="http://bit.ly/KJ9Ds6"&gt;plummeting stock price&lt;/a&gt;, has decided to enlist, rather, &lt;i&gt;to draft&lt;/i&gt; millions of sites into providing Facebook with valuable information at the cost of invading the users of those sites.
&lt;/p&gt;
&lt;p&gt;
As this change in policy seems to leave Facebook as the only clear winner with users and other websites as losers, I think the phrase &lt;i&gt;win-lose-lose&lt;/i&gt; is more appropriate Though probably not a good sales pitch.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-6" class="outline-2"&gt;
&lt;h2 id="sec-6"&gt;Update &lt;span class="timestamp-wrapper"&gt; &lt;span class="timestamp"&gt;2012-06-14 Thu 12:39&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-6"&gt;

&lt;p&gt;Just saw that Facebook allowed its users to &lt;a href="http://huff.to/JSfscI"&gt;vote&lt;/a&gt; on the changes to its privacy policy. That said, comparing an old and a proposed privacy policy and understanding what the ramifications are is a very difficult task. Especially when there is little publicity about the voting process.
&lt;/p&gt;
&lt;p&gt;
If if you heard about the voting, waded the through the privacy policy&amp;#8217;s legal jargon, understood how the change would affect you, and decided to vote, your vote wouldn&amp;#8217;t have counted.
&lt;/p&gt;
&lt;p&gt;
Facebook said that they would consider any vote on their privacy policy as &lt;i&gt;advisory&lt;/i&gt; unless a third of their 900M active users voted. The lack of publicity around the privacy policy change and  &lt;a href="http://onforb.es/KYar2D"&gt;serious questions&lt;/a&gt; about the veracity of Facebook&amp;#8217;s claim of 900M active users all but guaranteed that, whatever the votes were, they would be &lt;i&gt;advisory&lt;/i&gt;.
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=LiXTrePSQ_8:E7d89m4JhsI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=LiXTrePSQ_8:E7d89m4JhsI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=LiXTrePSQ_8:E7d89m4JhsI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/LiXTrePSQ_8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/06/14/the-new-privacy-invading-facebook-like-button/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[SPG: The Secure Password Generator]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/nScQ0fAI36s/" />
    <updated>2012-06-10T16:48:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/06/10/secure-password-generator</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;As Users, We Must Expect Our Passwords To Be Compromised&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;It is an unfortunate fact that, if you create accounts on websites, some of your passwords will be stolen. For example:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;There has been a lot of recent press about &lt;a href="http://linkd.in/Mz4gjU"&gt;LinkedIn&lt;/a&gt;&amp;#8217;s recent 6.5M &lt;a href="http://yhoo.it/Mz4o2T"&gt;stolen passwords&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;In the week since LinkedIn&amp;#8217;s attack became public, &lt;a href="http://bit.ly/Mz4yHu"&gt;eHarmony&lt;/a&gt; lost 1.5M passwords in an &lt;a href="http://lat.ms/Mz4I1y"&gt;unrelated attack&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;Earlier in the year, an undisclosed number of &lt;a href="http://bit.ly/LLAaXu"&gt;Zappos&lt;/a&gt; 24M users had their &lt;a href="http://bit.ly/LLAfdJ"&gt;passwords compromised&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://bit.ly/LLB5Hl"&gt;attack&lt;/a&gt; on Gawker Media&amp;#8217;s collection of popular sites (&lt;a href="http://gaw.kr/LLBedR"&gt;Gawker&lt;/a&gt;, &lt;a href="http://bit.ly/LLBf1y"&gt;Lifehacker&lt;/a&gt;, &lt;a href="http://bit.ly/LLBfhZ"&gt;Gizmodo&lt;/a&gt;, &lt;a href="http://bit.ly/LLBh9N"&gt;io9&lt;/a&gt;,&lt;a href="http://bit.ly/LLBhqe"&gt; Jalopnik&lt;/a&gt;, &lt;a href="http://bit.ly/LLBfyC"&gt;Kotaku&lt;/a&gt;, &lt;a href="http://deadsp.in/LLBfyD"&gt;Deadspin&lt;/a&gt;, and &lt;a href="http://bit.ly/LLBhqh"&gt;Fleshbot&lt;/a&gt;) in late 2010 that compromised 1.3M accounts shows that this is not a new phenomenon. 
&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;Cascading Damages&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;Having your password stolen from a website is a problem. But if you use the same password for many sites, the problem becomes a nightmare. I know that everyone tells you to use &lt;a href="http://bit.ly/KWPdld"&gt;strong passwords&lt;/a&gt; and to use a different password for each website &amp;ndash; but few people do. A quick look at these &lt;a href="http://bit.ly/KWPowF"&gt;Google search results&lt;/a&gt; should be convince you that people just don&amp;#8217;t follow that advice.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;The Reason Behind The Mega-Password Thefts&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;Despite every assurance made by websites (eg: &lt;a href="http://bit.ly/LLEqX3"&gt;LinkedIn&lt;/a&gt;&amp;#8217;s recent message), the only way a website can lose millions of passwords is if they just didn&amp;#8217;t bother to follow standard security procedures for storing your password. So LinkedIn, Gawker, Zappos, etc.., didn&amp;#8217;t care about your password&amp;#8217;s security until a breach made it into the headlines.
&lt;!-- more --&gt;

As revolting as that fact is, it is accurate.
&lt;/p&gt;
&lt;p&gt;
The trick to securely storing a user&amp;#8217;s password is rather simple: don&amp;#8217;t store the user&amp;#8217;s password as it can&amp;#8217;t be stolen if it is never stored. 
&lt;/p&gt;&lt;blockquote&gt;

&lt;p&gt;Huh?
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;
You heard me correctly. Websites should store a &amp;lt;geek vernacular warning&amp;gt; &lt;i&gt;salted hash&lt;/i&gt; of your password rather than your password. Understanding the math and computer science behind salted hashes is unimportant. All you need to know is that the technology exists. If you are curious, you can read this &lt;a href="http://bit.ly/LLGvlN"&gt;OWASP article&lt;/a&gt; about salted hashes.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;An Ounce Of Prevention&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt;The only way to protect yourself against these thefts is to, as everyone will tell you, use a unique, strong password for every site. Don&amp;#8217;t worry, I won&amp;#8217;t preach to you. You know that this is what should be done and I know that you know that this should be done.
&lt;/p&gt;
&lt;p&gt;
There are two problems with this:
&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;It is difficult to keep track of so many passwords.
&lt;/li&gt;
&lt;li&gt;People are astoundingly bad at creating secure passwords.
&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;
&lt;a href="http://bit.ly/KWS3GH"&gt;Other than that, how was the play, Mrs. Lincoln?&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;Tools And Reprogramming Are The Answer&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;

&lt;p&gt;It turns out that the best solution to managing your passwords involves the use of tools and reprogramming. The tools are used to help you create unique passwords as well as remember them. The tools can be simple. For example, a handful of &lt;a href="http://bit.ly/KWRhcK"&gt;dice&lt;/a&gt; can be used to generate unique and secure passwords.
&lt;/p&gt;
&lt;p&gt;
The reprogramming part is the more difficult. It involves you reprogramming your brain so that you protect yourself. Think of it as &lt;i&gt;safe surfing&lt;/i&gt;.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-6" class="outline-2"&gt;
&lt;h2 id="sec-6"&gt;The Answer Is&amp;hellip;&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-6"&gt;

&lt;p&gt;The answer is going to be in my next blog posting. I&amp;#8217;ll present several tools and strategies, including one that I&amp;#8217;m currently developing, that work better than carrying around a handful of &lt;a href="http://bit.ly/KWRc90"&gt;zocchihedrons&lt;/a&gt; :-)
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=nScQ0fAI36s:f3DFYWsL_K0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=nScQ0fAI36s:f3DFYWsL_K0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=nScQ0fAI36s:f3DFYWsL_K0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/nScQ0fAI36s" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/06/10/secure-password-generator/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[My First Ruby Project]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/HndNr7UcDSk/" />
    <updated>2012-06-01T19:18:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/06/01/first-ruby-project</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;The Project&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;Typically, even my pet projects have a specific goal in mind. I don&amp;#8217;t write a spec for my personal projects, there&amp;#8217;s just a, maybe slightly fuzzy, goal. Generally I want something that will be useful. I&amp;#8217;ll work on a project until:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;The project does everything I hoped for. Maybe even more!
&lt;/li&gt;
&lt;li&gt;I run out of spare time to work on it. This doesn&amp;#8217;t happen as often as you may imagine. I really enjoy coding. So, after a tiring day of coding at the office, I come home to relax and work on one of my pet projects. If it was any different, then I have no right to call my blog &lt;a href="http://bit.ly/yGGszW"&gt;My Geekdom&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;I decide that I did a poor job picking a pet project as they&amp;#8217;re supposed to be fun and this projects isn&amp;#8217;t. So long!
&lt;/li&gt;
&lt;li&gt;I get stuck such that proceeding will require more effort than I feel it&amp;#8217;s worth. That said, hopefully I learned something working on the project.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
But, unlike my typical pet projects, my goal with my new project is rather amorphous. I want to analyze some data. At time of writing this, I have just shy of 5K records totally 181MB of data. 
&lt;/p&gt;
&lt;p&gt;
Leaving the details for a later posting, each record is a snapshot of the state of my &lt;a href="http://bit.ly/Kfv0n2"&gt;Mac OS X&lt;/a&gt; computer. I&amp;#8217;ve been collecting, and am continuing to collect, samples every five minutes since the beginning of March. At least every five minutes that my computer isn&amp;#8217;t &lt;a href="http://bit.ly/LUSEY8"&gt;sleeping&lt;/a&gt; or hanging.
&lt;/p&gt;
&lt;p&gt;
I decided to collect the samples because I was getting downright frustrated with the performance of &lt;a href="http://bit.ly/LUT7tx"&gt;Mozilla&lt;/a&gt;&amp;#8217;s &lt;a href="http://bit.ly/HzqbTy"&gt;Firefox&lt;/a&gt; browser. For reasons that are off-topic for this posting, I feel a strong interest in making sure that Firefox continues to be successful. 
&lt;/p&gt;
&lt;p&gt;
For years I thought Firefox was the bomb. Starting about 9-12 months ago I started to notice that Firefox was routinely using all the resources on my computer. This concerned me because &lt;a href="http://bit.ly/LUUGHN"&gt;Google&lt;/a&gt;&amp;#8217;s &lt;a href="http://bit.ly/LUUHLP"&gt;Chrome&lt;/a&gt; browser was starting to have enough functionality to be a primary browser.
&lt;/p&gt;
&lt;p&gt;
Being that I wanted Firefox to stay competitive, I decided to try to stay with it. As Mozilla changed their release model, I started to use &lt;a href="http://bit.ly/LUV1u1"&gt;Aurora&lt;/a&gt; and &lt;a href="http://bit.ly/LUV4Ga"&gt;Firefox Beta&lt;/a&gt; and provide lots of feedback. The newer versions also seemed to consume a more reasonable amount of my computer&amp;#8217;s resources. Being that the Firefox team was working hard at fixing performance problems, especially memory leaks, I stayed with Firefox. (See &lt;a href="#sec-5"&gt;Reference: Articles About Firefox&amp;#8217;s Memory Leaks And Repair Efforts&lt;/a&gt; for information about FF&amp;#8217;s memory leaks.)
&lt;!-- more --&gt;

Around the beginning of this calendar year I started to think that Firefox wasn&amp;#8217;t getting faster and may have been getting slower. That said, I can be a pretty heavy user of my computer. Running FF with a couple of dozen add-ons is typical. Also, my experience with performance tuning has taught me that I don&amp;#8217;t know enough to make accurate guesses. Guessing can be used to lead your performance tuning investigations, but you always need hard data.
&lt;/p&gt;
&lt;p&gt;
After a bit of thought, I decided to collect some data and see if I can convince myself that Firefox is or is not the problem. There are, of course, simpler solutions to tracking a performance problem than sampling your entire process every five minutes for months. But this is a pet project. It wouldn&amp;#8217;t be any fun if I just switched from Firefox to Chrome to see if I notice a difference.
&lt;/p&gt;
&lt;p&gt;
Now that I have accumulated a few months of the data, I need to try to analyze the data and see what, if any, conclusions I can make from it. I have some ideas about where to start my data analysis and will just need to follow the path they outline. In short, I&amp;#8217;m prepared to &lt;a href="http://en.wikipedia.org/wiki/MacGyverism#MacGyverisms"&gt;MacGyver&lt;/a&gt; the analysis as I go along.
&lt;/p&gt;
&lt;p&gt;
My new pet project is the exploration of these data samples.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;The Programming Language&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;Forensic performance analysis is never simple. For this project I anticipate that the difficulties will be in determining what types of data analyses are required. I&amp;#8217;m hoping the actual coding will be relatively simple as there is no need for network interaction, provide real time responses, or even have a &lt;a href="http://bit.ly/n1i2v2"&gt;GUI&lt;/a&gt;. As long as I don&amp;#8217;t need to do very complex statistical analyses, the choice programming language won&amp;#8217;t likely matter to much.
&lt;/p&gt;
&lt;p&gt;
So I have chosen to implement this project in &lt;a href="http://bit.ly/LUK5N0"&gt;Ruby&lt;/a&gt;. I&amp;#8217;m certain I could implement it faster in any of a few dozen other programming languages but I chose Ruby for two reasons:
&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;This is a personal project. One of my main goals is to have fun. Being that I don&amp;#8217;t know Ruby, learning it will be more fun. Especially being that I haven&amp;#8217;t learned a new language in a year or so.
&lt;/li&gt;
&lt;li&gt;Ruby is a new-ish language, growing in popularity, likely to be around for awhile, so it seems like something I should learn or at least be familiar with.
&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;
Ruby isn&amp;#8217;t wholly unfamiliar to me. I&amp;#8217;ve made a few small (very small) changes to the &lt;a href="http://bit.ly/JBwXrU"&gt;org-ruby&lt;/a&gt; &lt;a href="http://bit.ly/M5PRvb"&gt;gem&lt;/a&gt;. Based on that experience, I think that the syntax of Ruby is kind of strange but the functionality it provides seems comparable to other languages such as C and Java. I just have to learn the new syntax. Unlike C and Java, Ruby has &lt;a href="http://bit.ly/M5T4ei"&gt;dynamic typing&lt;/a&gt;. But languages that I&amp;#8217;m fluent in, such as Lisp, Python, Bash, and AWK have dynamic typing. Doesn&amp;#8217;t seem a problem.
&lt;/p&gt;
&lt;p&gt;
But the structure of a Ruby application, at least the structure of the org-ruby gem, feels different to me than the structure of programs I&amp;#8217;ve seen in other languages. Sure Ruby has classes and modules and functions and inheritance as many other languages do. But the design of the org-ruby gem feels a bit unusual to me. 
&lt;/p&gt;
&lt;p&gt;
I think that part of the atypicality of the design of the org-ruby gem is that it is a parser that is written in a manner that is not familiar to me. I have a strong background in designing and implementing programming languages, their associated runtimes, IDE&amp;#8217;s, and such. In my world, there are only a few ways to implement a &lt;a href="http://bit.ly/JBxKsI"&gt;parser&lt;/a&gt; and org-ruby doesn&amp;#8217;t use any of them. 
&lt;/p&gt;
&lt;p&gt;
That said, I don&amp;#8217;t think the feeling of unfamiliarity stems from org-ruby&amp;#8217;s parser not being a &lt;a href="http://bit.ly/JBxTfU"&gt;recursive descent parser&lt;/a&gt; or implemented with a &lt;a href="http://bit.ly/JBxXMI"&gt;parser generator&lt;/a&gt; from a &lt;a href="http://bit.ly/JBxYAi"&gt;formal grammar&lt;/a&gt;. I&amp;#8217;ve seem plenty of really terrible parser implementations that left queasy but didn&amp;#8217;t feel unfamiliar.
&lt;/p&gt;
&lt;p&gt;
Not only do I not think that org-ruby gem is terrible, I think it has a certain elegance to its design. 
&lt;/p&gt;
&lt;p&gt;
Having eliminated other possibilities, I&amp;#8217;m left to think that the feeling of unfamiliarity must stem from Ruby itself.
&lt;/p&gt;
&lt;p&gt;
For example, C and Pascal have a similar feel when you use them. So too do &lt;a href="http://bit.ly/JByk9Q"&gt;object oriented&lt;/a&gt; languages such as Java and C++. While not OO, C and Pascal are somewhat similar to Java and C++. But a Scheme application doesn&amp;#8217;t feel anything like a C application (at least not if you understand how to program in Scheme). While I don&amp;#8217;t have a word for it, I think that Ruby leads to a different way of writing applications than languages that I&amp;#8217;m familiar with.. 
&lt;/p&gt;
&lt;p&gt;
While I&amp;#8217;m not sure what that difference is, I hope to figure it out as I move through this project. In the end, I don&amp;#8217;t want to have a great &amp;#8220;Java program&amp;#8221; that happens to have been written using Ruby syntax. I want to have a great Ruby program &amp;ndash; period.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;The Project&amp;#8217;s Current Progress&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;&amp;#8220;Not much&amp;#8221; seems to sum up my current project. While I&amp;#8217;ve been collecting data for months and easing myself into Ruby by working on the org-ruby gem, I just started coding for this project a few hours ago. All I&amp;#8217;ve done so far is write a tiny class to hold a line of data output by the &lt;a href="http://bit.ly/M5V9H3"&gt;ps(1)&lt;/a&gt; program:
&lt;/p&gt;


&lt;pre class="src src-ruby-mode"&gt;&lt;span class="linenr"&gt; 1:  &lt;/span&gt;class PSDataLine
&lt;span class="linenr"&gt; 2:  &lt;/span&gt;  attr_accessor :pid
&lt;span class="linenr"&gt; 3:  &lt;/span&gt;  attr_accessor :stat
&lt;span class="linenr"&gt; 4:  &lt;/span&gt;  attr_accessor :time
&lt;span class="linenr"&gt; 5:  &lt;/span&gt;  attr_accessor :elapsed_time
&lt;span class="linenr"&gt; 6:  &lt;/span&gt;  attr_accessor :virtual_size
&lt;span class="linenr"&gt; 7:  &lt;/span&gt;  attr_accessor :rss
&lt;span class="linenr"&gt; 8:  &lt;/span&gt;  attr_accessor :percent_cpu
&lt;span class="linenr"&gt; 9:  &lt;/span&gt;  attr_accessor :percent_mem
&lt;span class="linenr"&gt;10:  &lt;/span&gt;  attr_accessor :command
&lt;span class="linenr"&gt;11:  &lt;/span&gt;
&lt;span class="linenr"&gt;12:  &lt;/span&gt;  # Create the object
&lt;span class="linenr"&gt;13:  &lt;/span&gt;  def initialize(line_string)
&lt;span class="linenr"&gt;14:  &lt;/span&gt;    line = line_string.split(' ')
&lt;span class="linenr"&gt;15:  &lt;/span&gt;    @pid = line[0]
&lt;span class="linenr"&gt;16:  &lt;/span&gt;    @stat = line[1]
&lt;span class="linenr"&gt;17:  &lt;/span&gt;    @time = line[2]
&lt;span class="linenr"&gt;18:  &lt;/span&gt;    @elapsed_time = line[3]
&lt;span class="linenr"&gt;19:  &lt;/span&gt;    @virtual_size = line[4]
&lt;span class="linenr"&gt;20:  &lt;/span&gt;    @rss = line[5]
&lt;span class="linenr"&gt;21:  &lt;/span&gt;    @percent_cpu = line[6]
&lt;span class="linenr"&gt;22:  &lt;/span&gt;    @percent_mem = line[7]
&lt;span class="linenr"&gt;23:  &lt;/span&gt;    @command = line[8]
&lt;span class="linenr"&gt;24:  &lt;/span&gt;  end
&lt;span class="linenr"&gt;25:  &lt;/span&gt;end
&lt;/pre&gt;


&lt;p&gt;
I know it isn&amp;#8217;t much but I still learned writing it. For example, when I was tinkering with the org-ruby gem, I just copied and pasted code, looked up some details in the Ruby library, etc&amp;hellip; Being that I was modifying existing code, I never learned even the basic syntax. 
&lt;/p&gt;
&lt;p&gt;
For example, in order to write my &lt;code&gt;PSDataLine&lt;/code&gt; class, I needed to learn how Ruby uses syntax to determine if an identifier is a local variable, an instance variable, a global variable, or a constant. (My thanks to the &lt;a href="http://bit.ly/JBzTER"&gt;Rubyist&lt;/a&gt; for the good reference.)
&lt;/p&gt;
&lt;p&gt;
I&amp;#8217;m pretty busy this week so I don&amp;#8217;t think I&amp;#8217;ll make much progress on it. I was only able to get this work done by staying up till midnight on a Friday night and squeezing in time for a proofreading today.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;Process Data&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt;While I&amp;#8217;ve only begun writing my program and haven&amp;#8217;t reached any conclusions about anything yet, I do have lots of data. If you have an interest in seeing what my computer&amp;#8217;s been up to you can view the process data, read about my sampling mechanism, and copy the data from my &lt;a href="http://bit.ly/M1nUBf"&gt;process-data&lt;/a&gt; Github repository.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;Reference: Articles About Firefox&amp;#8217;s Memory Leaks And Repair Efforts&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;


&lt;ul&gt;
&lt;li&gt;A &lt;a href="http://bit.ly/LsNgcq"&gt;blog posting&lt;/a&gt; posting by Mozillian Nicholas Nethercote. A &lt;a href="http://bit.ly/LsNhNi"&gt;second posting&lt;/a&gt; of Nicholas about weeks 49 &amp;amp; 50 of the Mozilla effort to reduce the memory footprint.
&lt;/li&gt;
&lt;li&gt;A different engineer&amp;#8217;s &lt;a href="http://bit.ly/LsNgZS"&gt;blog posting&lt;/a&gt; discussing the hunt for memory leaks in Firefox.
&lt;/li&gt;
&lt;li&gt;Another posting from Nicholas regarding the great [[http://bit.ly/LsNjF0][performance improvements in Firefox V7. - A September 26, 2011 &lt;a href="http://bit.ly/LsNkJ8"&gt;article&lt;/a&gt; in &lt;a href="http://bit.ly/LsPLeE"&gt;CRN&lt;/a&gt; discussing the lack of progress Mozilla has been making. Even if you ignore any opinions in the article, it has a lot of facts and links.
&lt;/li&gt;
&lt;li&gt;A &lt;a href="http://bit.ly/LsNkZB"&gt;Firefox Forum posting&lt;/a&gt; expressing user frustration.
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=HndNr7UcDSk:4hTt5gJNmsQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=HndNr7UcDSk:4hTt5gJNmsQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=HndNr7UcDSk:4hTt5gJNmsQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/HndNr7UcDSk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/06/01/first-ruby-project/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Org-Mode + t Makes Tweeting Easy]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/KE1hxvFaISc/" />
    <updated>2012-05-27T18:23:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/05/27/org-mode-plus-t-makes-tweeting-easy</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-3"&gt;
&lt;h3 id="sec-1"&gt;Update &lt;span class="timestamp-wrapper"&gt; &lt;span class="timestamp"&gt;2012-06-04 Mon 00:57&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-1"&gt;

&lt;p&gt;You can download the code from its &lt;a href="http://cnet.co/M2O9L8"&gt;Github repository&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;Motivation&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;After yesterday&amp;#8217;s &lt;a href="http://www.neilsmithline.com/blog/2012/05/26/octopress-is-pretty-great" title="Posting about Octopress"&gt;ranting about Octopress&lt;/a&gt;, it occurred to me that while I now own the content of my blog postings, I don&amp;#8217;t own the content of my &lt;a href="http://bit.ly/JvoqLE"&gt;tweets&lt;/a&gt;. I&amp;#8217;m sure that there&amp;#8217;s some way to convince &lt;a href="http://bit.ly/Jvotaj"&gt;Twitter&lt;/a&gt; to give me my tweets, but why should I rely on them to store my tweets.
&lt;/p&gt;
&lt;p&gt;
The obvious answer is that my tweets should be created on my computer and then sent to Twitter. 
&lt;/p&gt;
&lt;p&gt;
It should be noted that I&amp;#8217;m not interested in implementing a full Twitter client. There are more than enough of those. I&amp;#8217;m interested in having my tweets, or at least the bulk of my tweets, in a simple and easily accessible format.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;The Answer Must Be Cheap&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;While I want to author and store my tweets locally, it is not a high priority task for me. Whatever solution I come up with must add little or no overhead to my tweeting workflow, must be simple to implement, and cannot require ongoing tinkering to keep working.
&lt;/p&gt;
&lt;p&gt;
Being that my relationship with &lt;a href="http://bit.ly/zhYdcB"&gt;Org Mode&lt;/a&gt; is rather simple: The more I learn about it the more of my life I want to be based on Org Mode. Org Mode just seems to make everything easier. So I decided to use Org Mode for the author, publication, and storage of my tweets. The system I&amp;#8217;m describing has these properties:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;It took me just a few hours to design, implement, test, and begin using it for tweeting.
&lt;/li&gt;
&lt;li&gt;Besides not adding overhead to my tweeting, it has made tweeting dramatically simpler.
&lt;/li&gt;
&lt;li&gt;The entire implementation is a single file of &lt;a href="http://bit.ly/wTaGtn"&gt;elisp&lt;/a&gt; that is 120 lines long. 50 of those lines are standard Emacs header comments that are automatically created. The implementation, along with its documentation, is only 70 lines long. While a small code base isn&amp;#8217;t one of my goals, not needing ongoing tinkering is. It is hard to imagine that 70 lines of code will require too much tinkering.
&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- more --&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;Advantages Of Org Mode&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;Before continuing, you should know a few facts about Org Mode:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;At its core, Org Mode is an &lt;a href="http://bit.ly/MSMf12"&gt;outliner&lt;/a&gt; on steroids. This works great for me as I tend to organize my thoughts as trees. I&amp;#8217;m obvious not alone as the &lt;a href="http://bit.ly/MSMf12"&gt;outliner&lt;/a&gt; page on &lt;a href="http://bit.ly/KWo5OA"&gt;Wikipedia&lt;/a&gt; has a list of many outliner applications along with &lt;a href="http://bit.ly/KWoa4F"&gt;references&lt;/a&gt; to many outliners that are designed to implement specific functionality. 
&lt;/li&gt;
&lt;li&gt;Org Mode augments its outlining functionality with a &lt;a href="http://bit.ly/MSKKjm"&gt;task management system&lt;/a&gt; (&lt;a href="http://bit.ly/MSKKjm"&gt;details&lt;/a&gt;).
&lt;/li&gt;
&lt;li&gt;Org Mode has a &lt;a href="http://bit.ly/MSNhKm"&gt;template&lt;/a&gt; based &lt;a href="http://bit.ly/MSN7CO"&gt;data capturing&lt;/a&gt; system that allows for the easy capturing of data into a consistent format.
&lt;/li&gt;
&lt;li&gt;Org Mode is implemented in &lt;a href="http://bit.ly/MSNvkN"&gt;GNU Emacs&lt;/a&gt;. Besides the fact that I spend nearly all of my non-browser computer time in Emacs, Emacs has a &lt;a href="http://bit.ly/MSNVrv"&gt;rich extension mechanism&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;The Storage Structure Of Tweets&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt;Each tweet would be an outline entry whose title would be a small description of the tweet plus some other information to be discussed later. The body for each outline entry would be the tweet. In Org Mode this would look like:
&lt;/p&gt;&lt;pre class="example"&gt;
* My First Tweet
  This is my first tweet using Org Mode.
&lt;/pre&gt;


&lt;p&gt;
While this works fine for one tweet, after 50 or 100 tweets, things are going to get pretty messy. But, as Org Mode is an outliner, it supports the nesting of outline entries via both direct data entry as well as through Org Mode&amp;#8217;s capturing mechanism. You just need to provide Org Mode with a string that describes the data you want to capture and the outline format for that data.
&lt;/p&gt;
&lt;p&gt;
While, for the moment, sparing you the ugliness of the capture configuration string, I&amp;#8217;ll tell you that Org Mode supports a date tree outline format.
&lt;/p&gt;&lt;pre class="example"&gt;
* 2012
*** 2012-05 May
***** 2012-05-26 Saturday
******* My First Tweet
        This is my first tweet using Org Mode!
***** 2012-05-27 Sunday
******* My Second Tweet
        This is now my 2nd tweet using Org Mode!
&lt;/pre&gt;


&lt;p&gt;
Being an outliner, Org Mode supports the &lt;a href="http://bit.ly/KWoekU"&gt;folding&lt;/a&gt; of the outline. That is, you can collapse the outline to hide parts of it that you are not immediately interested in. For example, let&amp;#8217;s say that, being today is Monday, I don&amp;#8217;t want to be bothered looking at my tweets from Saturday Or Sunday. No problem. When you fold the outline headings for Saturday and Sunday, the list of tweets will look like this:
&lt;/p&gt;&lt;pre class="example"&gt;
* 2012
*** 2012-05 May
***** 2012-05-26 Saturday ...
***** 2012-05-27 Sunday ...
&lt;/pre&gt;


&lt;p&gt;
The &amp;#8220;&amp;hellip;&amp;#8221; is Org Mode&amp;#8217;s way to let you know that this entry has been folded.
&lt;/p&gt;
&lt;p&gt;
Keep in mind that I get all of this storage mechanism from Org Mode for free. All I needed to do was create a single configuration string for it.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;Capturing Tweets&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;

&lt;p&gt;A simple yet highly functional storage mechanism is fine but what I&amp;#8217;m looking for is to reduce my tweeting overhead. This means that the workflow is what I care about. 
&lt;/p&gt;
&lt;p&gt;
The first part of the workflow is the &amp;#8220;capturing&amp;#8221; of my tweets. Org Mode&amp;#8217;s capturing mechanism is rather rich. It allows me to capture data (ie: to tweet) from Emacs with a couple of keystrokes. It also allows me to capture data, including an URL and highlighted text from my browser by clicking on a bookmarklet.
&lt;/p&gt;
&lt;p&gt;
When I initiate a tweet capture, I&amp;#8217;m initially prompted for a &amp;#8220;title&amp;#8221;. That is the descriptive text for the tweet. In the above example, &amp;#8220;My First Tweet&amp;#8221; is a title. After entering my title, I&amp;#8217;m given an &lt;a href="http://bit.ly/KWpdBF"&gt;Emacs buffer&lt;/a&gt;, basically a new Emacs window, in which to type my tweet.
&lt;/p&gt;
&lt;p&gt;
When I&amp;#8217;m done typing my tweet, a couple of keystrokes tells Org Mode that it should add the tweet to my tweet file and save the file. 
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-6" class="outline-2"&gt;
&lt;h2 id="sec-6"&gt;Tweeting&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-6"&gt;

&lt;p&gt;Now that I&amp;#8217;ve captured my tweet, I need to actually tweet it. This is where some of the wonders of Emacs come into play. Emacs has lots of &lt;a href="http://bit.ly/KWpRPv"&gt;hooks&lt;/a&gt; that allow you to insert code into the workflow. Org Mode adds many hooks of its own.
&lt;/p&gt;
&lt;p&gt;
Without boring you with the exact details, by using the appropriate hooks I have set up Emacs to take special actions whenever a file is saved that ends in &amp;#8220;-update.org&amp;#8221;. I used the file naming convention of &amp;#8220;-update&amp;#8221; instead of &amp;#8220;-tweet&amp;#8221; in case I decide to add other types of status messages at a later date.
&lt;/p&gt;
&lt;p&gt;
Being as I was going for simple, I decided that Emacs would not talk directly to Twitter. Instead, I have Emacs use the wonderfully intuitive, functional, and efficient &lt;a href="http://bit.ly/KGlf2s"&gt;t application&lt;/a&gt;. For my purposes, &lt;code&gt;t&lt;/code&gt;&amp;#8217;s &lt;a href="http://bit.ly/xOIkfJ"&gt;CLI&lt;/a&gt; is perfect. Once you&amp;#8217;ve signed into Twitter with &lt;code&gt;t&lt;/code&gt;, it will tweet for you with the simple command line of:
&lt;/p&gt;&lt;pre class="example"&gt;
t update This is my tweet text.
&lt;/pre&gt;


&lt;p&gt;
That seems about as simple as it can get.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-7" class="outline-2"&gt;
&lt;h2 id="sec-7"&gt;Tracking Tweet Status&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-7"&gt;

&lt;p&gt;Being that I&amp;#8217;m storing more than one tweet in a file, it is important that I know which tweets have been tweeted and which ones haven&amp;#8217;t. This is another place where I get to leverage the wonders of Org Mode.
&lt;/p&gt;
&lt;p&gt;
Beyond outlining, Org Mode supports a simple yet highly functional and customizable &lt;a href="http://bit.ly/KWrJrE"&gt;task management system&lt;/a&gt;. The customizability allows you to define task states well beyond the typical &amp;#8220;open&amp;#8221; and &amp;#8220;closed&amp;#8221; states of many other task managers. 
&lt;/p&gt;
&lt;p&gt;
I used the task management to teach Org Mode about status update tasks. A status update task can be in one of two states: &lt;code&gt;POST&lt;/code&gt; and &lt;code&gt;DONE&lt;/code&gt;. When it is in the &lt;code&gt;POST&lt;/code&gt; state, it needs to be posted. The &lt;code&gt;DONE&lt;/code&gt; state means it has already been posted. Org Mode&amp;#8217;s slogan is 
&lt;/p&gt;&lt;pre class="example"&gt;
Org: Your Life in Plain Text
&lt;/pre&gt;

&lt;p&gt;and they mean it.
&lt;/p&gt;
&lt;p&gt;
To indicate a tweet&amp;#8217;s, ie: a task&amp;#8217;s, state, you simply add the state to the outline header line. For example, using the example from above, if I had already posted my first tweet but not my second, the outline would look like this:
&lt;/p&gt;&lt;pre class="example"&gt;
* 2012
*** 2012-05 May
***** 2012-05-26 Saturday
******* =DONE= My First Tweet
        This is my first tweet using Org Mode!
***** 2012-05-27 Sunday
******* =POST= My Second Tweet
        This is now my 2nd tweet using Org Mode!
&lt;/pre&gt;


&lt;p&gt;
When I use Org Mode&amp;#8217;s capturing mechanism to add my new tweet to the file, it automatically adds the state of &lt;code&gt;POST&lt;/code&gt; to each new tweet. As mentioned above, when the tweet file is saved it executes my code. While I have 70 lines of code, only two functions consisting of a total of 45 lines is needed to post my tweets. The remaining 35 lines are configuration that, via Emacs and Org Mode&amp;#8217;s hooks, makes sure that my code is called whenever the tweet file is saved. 
&lt;/p&gt;
&lt;p&gt;
The first function, all 9 lines of it, simply asks Org Mode to loop through all tweets (ie: outline headings) in the &lt;code&gt;POST&lt;/code&gt; state and call my second function on each of those tweets. The second function calls the CLI t to execute the tweet. This 28 line function that actually does the tweeting is really rather simple. Only 10 lines of it are related to actually tweeting. The remainder of the function is error handling in case, for some reason, my tweet fails.
&lt;/p&gt;
&lt;p&gt;
After successfully tweeting a status update, I tell Org Mode to change the tweet&amp;#8217;s state from &lt;code&gt;POST&lt;/code&gt; to &lt;code&gt;DONE&lt;/code&gt;. That&amp;#8217;s all there is to it.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-8" class="outline-2"&gt;
&lt;h2 id="sec-8"&gt;Some Nice Freebies&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-8"&gt;

&lt;p&gt;Besides the data capturing, the ease of calling an external program, the automatic outline maintenance, the automatic state tracking (ie: &lt;code&gt;POST&lt;/code&gt; and &lt;code&gt;DONE&lt;/code&gt;), and the automatic execution of my tweeting code whenever the tweet file is saved, the Emacs and Org Mode&amp;#8217;s richness provide other nice features:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Twitter&amp;#8217;s 140 character limit per tweet is easily eyeballed while you are typing in Emacs as the editor tells you how long a line is. I have, of course, implemented a character count error check before tweeting, but it is nice to catch the problem when you are typing. 
&lt;/li&gt;
&lt;li&gt;Automated highlighting of tweets.
&lt;/li&gt;
&lt;li&gt;A common problem with the 140 character limit on tweets is that URLs can be very long. Emacs helps here with its &lt;a href="http://bit.ly/wSSiWH"&gt;Bitly library&lt;/a&gt; (courtesy of me :-). This shortens URLs in Emacs, using Bitly, with two keystrokes. (Bitly happens to be my current URL shortener of choice.)
&lt;/li&gt;
&lt;li&gt;Org Mode has the ability to automatically record a variety of times associated with each task. I have set up Org Mode to record the time the tweet was entered by me as well as the time that it actually got tweeted.
&lt;/li&gt;
&lt;li&gt;Org Mode allows you to &lt;a href="http://bit.ly/KWtipB"&gt;tag&lt;/a&gt; (aka: &amp;#8220;label&amp;#8221; or &amp;#8220;categorize&amp;#8221;) each outline item. I have leveraged this in anticipation of extending the tweeting system to include status updates to other services than Twitter. Also, in the future I may want to be able to manage multiple Twitter accounts. I&amp;#8217;m not sure that I&amp;#8217;ll ever implement that functionality, but thought I&amp;#8217;d throw it in as preparing for it is essentially free. I currently label each status update with two labels. The first label describes the type of status update. In this case it is &amp;#8220;TWEET&amp;#8221; to designate that I want to update Twitter. The second label is &amp;#8220;NS&amp;#8221; to indicate that I want to update the status of my &lt;a href="http://bit.ly/KWtyVp"&gt;@neil_smithline&lt;/a&gt; Twitter account.
&lt;/li&gt;
&lt;li&gt;Emacs is my tweet editor. For those of you who don&amp;#8217;t know Emacs as well as those of you that know Emacs and hate it, I&amp;#8217;m sure you wouldn&amp;#8217;t want to edit tweets in Emacs. But I have been using Emacs for 25+ years and still think it is pretty slick. Besides the functionality discussed above, Emacs gives me &lt;a href="http://bit.ly/KWtPb0"&gt;spell checking/correction&lt;/a&gt;, the ability to easily change the case of something I&amp;#8217;ve mistyped, functionality based on English grammar (eg: the ability to move, delete, or even transpose words or sentences), etc&amp;hellip;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-9" class="outline-2"&gt;
&lt;h2 id="sec-9"&gt;A Sneak Peek&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-9"&gt;

&lt;p&gt;After all my blathering, I thought that a screenshot of my tweets would be nice. This screenshot shows tweets for the past three days. I have folded the tweets from Saturday so that they are easy to ignore. For the sake of this picture, I have unfolded my tweets from Sunday so that it shows what a posted tweet looks like. Finally, I have a tweet for today that is queued up to announce this blog posting. 
&lt;/p&gt;
&lt;p&gt;
As you look at this screenshot, remember that almost all of this is automatically generated. For example, for the final tweet I had to enter the title &amp;#8220;Tweeting From Emacs&amp;#8221; (this can actually be blank but I think the title makes it more useful) and the actual tweet. Everything else, including the Bitly URL shortening, comes for free.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.neilsmithline.com/assets/screen-snapshots/tweets-screenshot.png"  alt="http://www.neilsmithline.com/assets/screen-snapshots/tweets-screenshot.png" /&gt;
&lt;span style="color:#F8F8F8;"&gt;For Technorati: PHTDYXEZKM3Q&lt;/span&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=KE1hxvFaISc:3PVGUq0Ovcc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=KE1hxvFaISc:3PVGUq0Ovcc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=KE1hxvFaISc:3PVGUq0Ovcc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/KE1hxvFaISc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/05/27/org-mode-plus-t-makes-tweeting-easy/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Octopress Is Pretty Great]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/ZC-zedHqH94/" />
    <updated>2012-05-26T13:32:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/05/26/octopress-is-pretty-great</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;Jekyll Overview&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;I have simply fallen in love with &lt;a href="http://bit.ly/KT1aFT"&gt;Octopress&lt;/a&gt;. I think I mentioned previously that Octopress is an auto-configuration tool wrapped around &lt;a href="http://bit.ly/Jm1bmc"&gt;Jekyll&lt;/a&gt;. And Jekyll is the technology behind &lt;a href="http://bit.ly/Krch8n"&gt;Github pages&lt;/a&gt;. As such, if you use Jekyll for your blogging platform, you can preview your blog locally, push it to Github, and let Github do all the page serving. 
&lt;/p&gt;
&lt;p&gt;
This isn&amp;#8217;t actually as much work for the Github servers as you may think. Jekyll is a &lt;a href="http://bit.ly/KrdOeu"&gt;static&lt;/a&gt; &lt;a href="http://bit.ly/KrdUmf"&gt;blogging system&lt;/a&gt; with no &lt;a href="http://bit.ly/KrdX1s"&gt;CMS support&lt;/a&gt;. A static blog needs to be &lt;a href="http://bit.ly/Kre8tB"&gt;compiled&lt;/a&gt; whenever content is modified, but once compiled, the only thing the server needs to do is serve the pages. Dynamic blogging systems such as &lt;a href="http://bit.ly/KreoZJ"&gt;Wordpress&lt;/a&gt; and &lt;a href="http://bit.ly/KreuAH"&gt;Joomla&lt;/a&gt; are programs that run on the server and work interactively with the web server to produce each page.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;Configuration&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;Octopress&amp;#8217;s biggest addition to Jekyll is that it automagically configures Jekyll for you. I have found that configuring Jekyll is a bit of a pain. Jekyll decided to trade easy configuration for flexibility. This is a common decision in applications and one I can&amp;#8217;t really argue with.
&lt;!-- more --&gt;

But Octopress packages a mostly configured Jekyll installation in a neat little package. The introductory paragraph on &lt;a href="http://bit.ly/KT1aFT"&gt;Octopress.org&lt;/a&gt; states:
&lt;/p&gt;&lt;blockquote&gt;

&lt;p&gt;Octopress is a framework designed by Brandon Mathis for Jekyll, the blog aware static site generator powering Github Pages. To start blogging with Jekyll, you have to write your own HTML templates, CSS, Javascripts and set up your configuration. But with Octopress All of that is already taken care of. Simply clone or fork Octopress, install dependencies and the theme, and you&amp;#8217;re set.
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;
While that may sound a bit intimidating to the less-computer literate, the Octopress site carefully steps you through the process. I&amp;#8217;ve installed and used Wordpress, Joomla, &lt;a href="http://bit.ly/KrgcC1"&gt;Drupal&lt;/a&gt;, &lt;a href="http://bit.ly/wq2Ien"&gt;Nanoblogger&lt;/a&gt;, and many other blogging systems. I can say that Octopress is, by far, the easiest. 
&lt;/p&gt;
&lt;p&gt;
The above quote states three steps for installing Octopress but there are actually a few more steps:
&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;Install Git
&lt;/li&gt;
&lt;li&gt;Clone or fork Octopress
&lt;/li&gt;
&lt;li&gt;Install dependencies
&lt;/li&gt;
&lt;li&gt;Install theme
&lt;/li&gt;
&lt;li&gt;Configure your blog
&lt;/li&gt;
&lt;li&gt;Configure deployment
&lt;/li&gt;
&lt;/ol&gt;



&lt;/div&gt;

&lt;div id="outline-container-2-1" class="outline-3"&gt;
&lt;h3 id="sec-2-1"&gt;Git&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-1"&gt;

&lt;p&gt;If you don&amp;#8217;t have &lt;a href="http://bit.ly/KrgU2a"&gt;Git&lt;/a&gt; installed, you need to install it. This was a trivial task for most users but, thanks to the clever folk at Github, has become idiot-proof. Github created a &lt;a href="http://bit.ly/KrhqgF"&gt;Mac OS X&lt;/a&gt; and &lt;a href="http://windows.github.com/"&gt;Windows&lt;/a&gt; application that allows easy use of Github. These make installing and using Git user-friendly for those who prefer to avoid &lt;a href="http://bit.ly/xOIkfJ"&gt;CLI&lt;/a&gt;s.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2-2" class="outline-3"&gt;
&lt;h3 id="sec-2-2"&gt;Clone Or Fork Octopress&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-2"&gt;

&lt;p&gt;Cloning Octopress, simpler than forking it, is a single command line 
&lt;/p&gt;&lt;pre class="example"&gt;
git clone git://github.com/imathis/octopress.git octopress
&lt;/pre&gt;

&lt;p&gt;It takes only a few mouse clicks if you are using one of Github&amp;#8217;s applications to do the clone. 
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2-3" class="outline-3"&gt;
&lt;h3 id="sec-2-3"&gt;Install Dependencies&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-3"&gt;

&lt;p&gt;Installing the dependencies is, yet again, a few simple CLI commands described in an easy-to-read style on Octopress&amp;#8217;s &lt;a href="http://bit.ly/LExpsY"&gt;setup&lt;/a&gt; page.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2-4" class="outline-3"&gt;
&lt;h3 id="sec-2-4"&gt;Install The Theme&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-4"&gt;

&lt;p&gt;Installing the theme is a single CLI command:
&lt;/p&gt;&lt;pre class="example"&gt;
rake install
&lt;/pre&gt;

&lt;p&gt;There are additional theme installation options but you can simply ignore them as the defaults work well. In a subsequent blog post I&amp;#8217;ll discuss how I have made a minor alteration to the Octopress installation that allows me to entirely change my theme as often as I like without losing any data. Simple theme changes (eg: page colors) are easy to make at anytime. 
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2-5" class="outline-3"&gt;
&lt;h3 id="sec-2-5"&gt;Configure Your Blog&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-5"&gt;

&lt;p&gt;Configuring your blog is perhaps the most complicated step in the entire installation process. You&amp;#8217;ll need to open a text editor such as &lt;a href="http://bit.ly/LEyD7l"&gt;Textedit&lt;/a&gt; on a Mac or &lt;a href="http://bit.ly/LEyRvo"&gt;Notepad&lt;/a&gt; on Windows. 
&lt;/p&gt;
&lt;p&gt;
The configuration file is written in a format called &lt;a href="http://bit.ly/LEzjd3"&gt;YAML&lt;/a&gt;. That sounds a lot scarier than it actually is. Octopress&amp;#8217;s &lt;a href="http://bit.ly/Mlynfm"&gt;configuration page&lt;/a&gt; states that you just need to edit the existing &lt;code&gt;_config.yml&lt;/code&gt;, and modify the following lines:
&lt;/p&gt;&lt;pre class="example"&gt;
url:                # For rewriting urls for RSS, etc
title:              # Used in the header and title tags
subtitle:           # A description used in the header
author:             # Your name, for RSS, Copyright, Metadata
simple_search:      # Search engine for simple site search
description:        # A default meta description for your site
subscribe_rss:      # Url for your blog's feed, defauts to /atom.xml
subscribe_email:    # Url to subscribe by email (service required)
email:              # Email address for the RSS feed if you want it.
&lt;/pre&gt;


&lt;p&gt;
Several of the configuration options have default values or can be left empty.
&lt;/p&gt;
&lt;p&gt;
This configuration step in Octopress differs from other blogging systems only in that you have to use Textedit or Notepad to enter the data. Many other systems allow you to enter the data into a &lt;a href="http://bit.ly/n1i2v2"&gt;GUI&lt;/a&gt; or a web page. 
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2-6" class="outline-3"&gt;
&lt;h3 id="sec-2-6"&gt;Configuring Deployment&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-6"&gt;

&lt;p&gt;Configuring your deployment, the final setup action, involves telling Octopress what computer is going to &lt;a href="http://bit.ly/LECz8n"&gt;host&lt;/a&gt; your blog. While you can run your blog right on your desktop or laptop, it will only be visible by other people in your home or office. This is helpful if you want to preview your blog before &amp;#8220;publishing&amp;#8221; it so the rest of the world can see it but when you want to publish your blog you will need to have access to a hosting computer (AKA: a server) that is on the internet &lt;a href="http://bit.ly/LEIgTI"&gt;24x7&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Getting access to a server can be less than straightforward and almost always costs money. But this is rather simple with Octopress because:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Octopress is a static blog. This is compared to a dynamic blog that requires programs to interact with the server. Once Octopress has done its job, you just need to put the blog into the right location on your server and everything will magically work.
&lt;/li&gt;
&lt;li&gt;Octopress, the blogging system that tries to make configuration easy, has carefully documented, in easy-to-read text, three different ways to &lt;a href="http://bit.ly/LEGcuN"&gt;host your blog&lt;/a&gt; on a server. Two of them are absolutely free: Github itself (the one I use) and &lt;a href="http://bit.ly/LEGIsK"&gt;Heroku&lt;/a&gt;. The third strategy using &lt;a href="http://bit.ly/LEIdHt"&gt;rsync&lt;/a&gt; is a bit more complex and typically costs some money to use. That being said, the documentation guides you to a hosting company that charges only $5 a month for server access. Unless you &lt;b&gt;know&lt;/b&gt; that you need a server for something besides hosting a blog, I strongly recommend going with one of the other options. 
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
As I said, I am using Github to host my blog. It takes exactly one line to configure your blog to use Github. I haven&amp;#8217;t used the other deployment mechanisms but Heroku seems to be of equal complexity while rsync definitely requires more work and a greater knowledge of computers.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2-7" class="outline-3"&gt;
&lt;h3 id="sec-2-7"&gt;Configuration Summary&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-2-7"&gt;

&lt;p&gt;While there is a lot of descriptive text above, the entire configuration process took me a couple of hours the first time and about 20 minutes the second time. Unless you are like me and enjoy trying stupid things, you&amp;#8217;ll only need to install it once :-) I would imagine that a non-technical users could easily install Octopress in half a day.
&lt;/p&gt;
&lt;p&gt;
The only exception that I can think of would be if you&amp;#8217;re on a Windows computer and have lots of difficulties installing the dependencies. Mac OSX and Linux come with most of the dependencies pre-installed. I don&amp;#8217;t think that Windows does.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;It&amp;#8217;s Blogging Time!&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;Before you can actually start to blog, you need to choose an editor and a markup language. While you can change these at anytime, you need one of each to blog. I&amp;#8217;ll discuss this in a subsequent blog posting where I discuss my personal Octopress configuration.
&lt;/p&gt;
&lt;p&gt;
Now that everything is configured, it&amp;#8217;s time to blog. While this involves using the command line, it is a trivial usage. When you want to create a new post you execute the command:
&lt;/p&gt;&lt;pre class="example"&gt;
rake 'new_post[Name Of My Post]'
&lt;/pre&gt;

&lt;p&gt;The reason why that is the magical incantation to create a new post is unimportant. All you need to do is remember (or be able to lookup) that command.
&lt;/p&gt;
&lt;p&gt;
When the &lt;code&gt;rake&lt;/code&gt; command finishes, it will tell you the name of the file for your new posting. Just open the file and start typing. If you want to see a preview of your blog before publishing it to the server, run the command
&lt;/p&gt;&lt;pre class="example"&gt;
rake preview
&lt;/pre&gt;


&lt;p&gt;
Then you can open your web browser to &lt;a href="http://localhost:4000"&gt;http://localhost:4000&lt;/a&gt; to see your blog. I strongly recommend that you copy-and-paste that URL and then bookmark it. 
&lt;/p&gt;
&lt;p&gt;
Once you are ready to publish your blog to the world, execute the command
&lt;/p&gt;&lt;pre class="example"&gt;
rake gen_deploy
&lt;/pre&gt;

&lt;p&gt;And &lt;i&gt;voila&lt;/i&gt;! You have updated your blog.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;Octopress Summary&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;


&lt;/div&gt;

&lt;div id="outline-container-4-1" class="outline-3"&gt;
&lt;h3 id="sec-4-1"&gt;Cons&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-4-1"&gt;


&lt;/div&gt;

&lt;div id="outline-container-4-1-1" class="outline-4"&gt;
&lt;h4 id="sec-4-1-1"&gt;Configuration&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-4-1-1"&gt;

&lt;p&gt;Configuring Octopress is definitely more complex than configuring a blog on Blogger.com or a similar service. If you are looking for the easiest solution, no-frills solution, go with one of those.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-1-2" class="outline-4"&gt;
&lt;h4 id="sec-4-1-2"&gt;Single Computer Publishing&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-4-1-2"&gt;

&lt;p&gt;While I haven&amp;#8217;t seen it explicitly stated in any documentation for Octopress or Jekyll, they really are intended to publish new posts from a single computer. You can author the posts on any computer or network service. The first option that jumps into my head is &lt;a href="http://bit.ly/KTgaWb"&gt;Google Docs&lt;/a&gt;. But to publish (ie: to deploy) your site from more than one computer will definitely require extra configuration, computer skills, and tinkering. If you absolutely must &lt;i&gt;publish&lt;/i&gt; from multiple computers, the online blogging systems may be a better choice.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-2" class="outline-3"&gt;
&lt;h3 id="sec-4-2"&gt;Pros&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-4-2"&gt;


&lt;/div&gt;

&lt;div id="outline-container-4-2-1" class="outline-4"&gt;
&lt;h4 id="sec-4-2-1"&gt;Configuration&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-4-2-1"&gt;

&lt;p&gt;While configuring a blog on a site like Blogger is definitely easier than configuring Octopress, if Blogger doesn&amp;#8217;t meet your needs, I think Octopress is easier to manage than all Joomla, Drupal, and all of its competitors &amp;ndash; at least the ones I&amp;#8217;ve seen.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-2-2" class="outline-4"&gt;
&lt;h4 id="sec-4-2-2"&gt;Content Possession&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-4-2-2"&gt;

&lt;p&gt;When you use a site like Blogger.com, the content you have posted is in the possession of Blogger. They determine how they will store your content, how they will let you export it, modify it, delete it, etc&amp;hellip; But with Octopress, you are always in possession of your content. In order to have your blog visible on the web, you must deploy it to a server, but that is just a copy of your content. You are always in possession of the original content.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-2-3" class="outline-4"&gt;
&lt;h4 id="sec-4-2-3"&gt;Content Accessibility&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-4-2-3"&gt;

&lt;p&gt;Whether you are using an online blogging service such as Blogger.com or hosting your own blogging application such as Joomla or Drupal, your postings are typically not stored in a convenient manner. Even if the blogging system lets you get access to all of your content, the content is frequently meaningless or difficult to use.
&lt;/p&gt;
&lt;p&gt;
But with Octopress, the content for each posting is in a file. One file for each posting. While I&amp;#8217;ve not discussed choosing an editor or a markup language in this posting, it is your choice of editor and markup language that determine what you can do with your content.
&lt;/p&gt;
&lt;p&gt;
For example, I was blogging with Nanoblogger for a few months. As it required continual tinkering, I moved to Octopress. Like Octopress, Nanoblogger lets you choose your editor and markup language. Because both blogging systems give you accessibility to your content, I was able to convert about 20 Nanoblogger postings into Octopress postings in about 20 minutes. I imagine it would have taken less computer-savvy users as long as 2-3 minutes a posting. 
&lt;/p&gt;
&lt;p&gt;
The one-file-one-posting principal of Octopress, and Nanoblogger, make life so much simpler.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-2-4" class="outline-4"&gt;
&lt;h4 id="sec-4-2-4"&gt;And It Looks Good Too!&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-4-2-4"&gt;

&lt;p&gt;Even after customizing them, I find that Wordpress blogs tend to be drap and all look like &lt;a href="http://bit.ly/KThoAU"&gt;this&lt;/a&gt; and that Blogger.com blogs require lots of tinkering but still tend to look like &lt;a href="http://bit.ly/KThtVf"&gt;this&lt;/a&gt;. On the other hand, Octopress blogs tend to look like the &lt;a href="http://bit.ly/KT1aFT"&gt;Octopress homepage&lt;/a&gt; or my &lt;a href="http://bit.ly/yGGszW"&gt;blog&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
IMO, Octopress looks great out of the box. I am partial to using dark themes where black, white, and shades of gray are the main colors. It took me about 10 minutes to change the default &lt;a href="http://bit.ly/KT1aFT"&gt;colors for Octopress&lt;/a&gt; to use my preferred &lt;a href="http://bit.ly/yGGszW"&gt;color pallette&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4-2-5" class="outline-4"&gt;
&lt;h4 id="sec-4-2-5"&gt;It Will Grow With You&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-4-2-5"&gt;

&lt;p&gt;I think that Octopress&amp;#8217;s greatest features are the above mentioned ease-of-configuration and the fact that, while it is hidden from you, it is built on a very strong blogging engine, Jekyll. So, if you wake up one day and say &amp;#8220;Gee. I wish my blog could do XYZ.&amp;#8221;, the odds are that it can. Just google &amp;#8220;Jekyll blogs XYZ&amp;#8221; and, at least for reasonable XYZs, you&amp;#8217;ll find that instructions about reconfiguring your blog so it can do XYZ.
&lt;/p&gt;
&lt;p&gt;
There are also many discussion groups, forums, and helpful Jekyll users in the blogosphere that can offer suggestions, provide pointers, or even make a small modification to Octopress/Jekyll so that XYZ is easy to do.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;Future Postings About Octopress&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;

&lt;p&gt;This is now my second posting about Octopress. My } discussed my initial opinions about Octopress. They were largely positive but so too were my } of Nanoblogger. 
&lt;/p&gt;
&lt;p&gt;
At the time of writing this blog posting I&amp;#8217;m certain that I&amp;#8217;m going to love Octopress. (Though, if I change my mind, I am in possession of my own content so it is easy to switch to another platform.)
&lt;/p&gt;
&lt;p&gt;
My next posting about Octopress will explain the minor modifications I have made to Octopress. I made these modifications to accomplish two goals:
&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;Allow me to easily use &lt;a href="http://bit.ly/zhYdcB"&gt;Org Mode&lt;/a&gt; as my markup language and &lt;a href="http://emacswiki.org"&gt;Emacs&lt;/a&gt; as my editor. While I simply love this setup, I imagine that it will only be of interest to preexisting Emacs users.
&lt;/li&gt;
&lt;li&gt;Keep my content totally separate from the Octopress&amp;#8217;s content. By this I mean that if, you were to burn my computer as I&amp;#8217;m typing these very words, I could have Octopress up and running on a new computer with all of my content, including postings, images, etc.., in about 20 minutes. IMO, this an improvement on Octopress&amp;#8217;s configuration and should probably be changed in Octopress.
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=ZC-zedHqH94:RUbBQ5u3jmU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=ZC-zedHqH94:RUbBQ5u3jmU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=ZC-zedHqH94:RUbBQ5u3jmU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/ZC-zedHqH94" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/05/26/octopress-is-pretty-great/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[YANBT: Yet Another New Blogging Technology]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/HNfnWopMnVM/" />
    <updated>2012-05-14T12:36:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/05/14/new-blog-tech</id>
    <content type="html">&lt;div id="outline-container-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;NanoBlogger Was Killing Me&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;

&lt;p&gt;&lt;a href="http://bit.ly/wq2Ien"&gt;NanoBlogger&lt;/a&gt; really looked cool to me 
(&lt;a href="http://www.neilsmithline.com/blog/categories/blogging-tech"&gt;my postings about why I liked it&lt;/a&gt;):
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Small
&lt;/li&gt;
&lt;li&gt;Most functionality provided via plugins
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bit.ly/xOIkfJ"&gt;CLI&lt;/a&gt; only
&lt;/li&gt;
&lt;li&gt;It is &lt;a href="http://bit.ly/Mlkg9X"&gt;FOSS&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;Produced a static site (ie: only serves static pages)
&lt;/li&gt;
&lt;li&gt;It was built on &lt;a href="http://bit.ly/JbQmzE"&gt;Bash&lt;/a&gt; &amp;ndash; I thought this was the coolest
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
I liked it so much that I wrote a CLI for it that was better suited to my personal workflow. I also spent some time integrating it with Emacs. But it had endless problems.
&lt;/p&gt;
&lt;p&gt;
It was slow, it did not do anything automatically, frequently required rebuilding of the entire blog, was hard to view on my local machine, isn&amp;#8217;t really being maintained, doesn&amp;#8217;t have a real templating system, breaks the RSS feed on special characters such as etc&amp;hellip;
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;Where Next&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;

&lt;p&gt;Over the past few weeks I&amp;#8217;ve been looking around for a new blogging system. The only real contender seemed to be &lt;a href="http://bit.ly/Jm1bmc"&gt;Jekyll&lt;/a&gt;. It is written in &lt;a href="http://bit.ly/KAfYv0"&gt;Ruby&lt;/a&gt; and used by Github to power Github Pages. It has so many contributors to it that its &lt;a href="http://bit.ly/JetyoE"&gt;Github repository&lt;/a&gt; has, at the moment, 50+ pull requests.
&lt;/p&gt;
&lt;p&gt;
I had nearly chosen Jekyll when I moved to NanoBlogger. I found that the discussion about moving to Jekyll on the &lt;a href="http://bit.ly/JH7cIy"&gt;0xdecafbad.com&lt;/a&gt; blog really aligned with my thoughts.
&lt;/p&gt;
&lt;p&gt;
But, after playing with it a bit, I found that Jekyll was difficult to configure. And I just so liked the Bash thing that NanoBlogger had that I decided to go with NanoBlogger. But now I&amp;#8217;m wasting too much of my time fighting with Nanoblogger and I should reconsider Jekyll.
&lt;!-- more --&gt;

This time, when I was researching Jekyll, I found &lt;a href="http://bit.ly/KT1aFT"&gt;Octopress&lt;/a&gt;. Octopress is Jekyll on steroids. It provides an automated configuration and maintenance system that takes the pain out of using Jekyll.
&lt;/p&gt;
&lt;p&gt;
So now I&amp;#8217;m giving Octopress/Jekyll a try. I&amp;#8217;ll see how it goes. Configuring a site with a &lt;i&gt;hello world&lt;/i&gt; blog entry only took a couple of hours. Most of that was just downloading Octopress and reading the docs to figure out what to do. It turned out that configuration was running three &lt;a href="http://bit.ly/KT2jxn"&gt;rake&lt;/a&gt; commands. 
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;Converting From Nanoblogger To Jekyll&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;

&lt;p&gt;Because NanoBlogger blog entries are plain text with markup, converting my entire old blog to Octopress was fairly easy as Octopress also uses plain text with markup for blog entries. I ran into two snags. The first one was in Emacs&amp;#8217; &lt;a href="http://bit.ly/zhYdcB"&gt;Org Mode&lt;/a&gt;, my authoring tool. It broke when you had a &amp;#8220;+&amp;#8221; in the path name of your input files (in my case, in the path of my blog). It took me several hours to find the bug. Once I found it, it was easy to patch and I sent my fix to be included in subsequent Org Mode releases.
&lt;/p&gt;
&lt;p&gt;
The second problem was a bit trickier. Octopress was breaking on some of my blog&amp;#8217;s generated HTML files. The error message gave me the line number and the character number in that line that was causing the error but it omitted to give me the file name. I believe the technical term for that is &amp;#8220;Oops!&amp;#8221;.
&lt;/p&gt;
&lt;p&gt;
To find the file that was casing the problem I started to remove blog files using a &lt;a href="http://bit.ly/KT3gpo"&gt;binary search&lt;/a&gt;-ish style to track the problem file down. This proved more difficult than I thought it should. After much frustration, it occurred to me that the problem was in many blog entries so the binary search wasn&amp;#8217;t so helpful. So I wiped my blog and started adding one posting at a time. 
&lt;/p&gt;
&lt;p&gt;
Even after I found the first posting that caused Octopress, actually Jekyll, to crash, I couldn&amp;#8217;t figure out what was wrong with the file. The error message said something about non-ASCII characters but I only had ASCII, or so I thought. It turned out that I had copied and pasted some text from my browser and it had inserted a hyphen (-) that was not the ASCII hyphen. To me, they looked identical. 
&lt;/p&gt;
&lt;p&gt;
Despite knowing what the problem was, I couldn&amp;#8217;t automate Emacs or grep to find the offensive hyphens. In Emacs, the search treated ASCII and non-ASCII hyphens the same. I forget the problems I had with grep but I couldn&amp;#8217;t get it to work either. This meant I was going to have to add one entry at a time to my blog to track down the other problems. Thank you &amp;ndash; NOT!
&lt;/p&gt;
&lt;p&gt;
But Jekyll is written in Ruby and Ruby is a scripting language so I have the source code for Jekyll. Being that the error message included a full stack trace, I figured I could update the error message. In the end I just ended up making Jekyll a bit more verbose: it announces which file it is about to process with the message:
:Processing file &lt;i&gt;myfile&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
Then I added all my blog entries, ran Jekyll, got the same error message with only the line and character position, but now had the name of the file it was processing when it had a problem.
&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div id="outline-container-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;Plain Text Blogs Rock!&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;

&lt;p&gt; After correcting a couple of entries I noticed that the problem only occurred on hyphens (-) and single quotes (&amp;#8216;). Being that both NanoBlogger and Octopress/Jekyll use plain text files for their input, I had a whole bunch of tools to help me fix the problem. 
&lt;/p&gt;
&lt;p&gt;
 In the end I ended up turning Emacs failure to distinguish between the ASCII and non-ASCII versions of these characters to my advantage. I did a search-and-replace on all my blog entries replacing hyphens with hyphens and single quotes with single quotes. While Emacs&amp;#8217; search found both ASCII and non-ASCII characters, it always replaced them with what I typed as the replacement, ASCII.
&lt;/p&gt;
&lt;p&gt;
Then, &lt;i&gt;voila&lt;/i&gt;, there was my blog. And my blog looked way better in Octopress than NanoBlogger. Check out a NanoBlogger &lt;a href="http://bit.ly/wq2Ien"&gt;sample blog&lt;/a&gt; and an Octopress &lt;a href="http://bit.ly/KT1aFT"&gt;sample blog&lt;/a&gt;. Huge difference. Also, excluding the weak error message from Jekyll (I&amp;#8217;ll file a bug report on that and I suspect someone will fixed it as Jekyll is so heavily used), I didn&amp;#8217;t need to do a thing to build and publish the blog. Octopress even pushes the blog to Github automatically. I had written a script to do this automatically for NanoBlogger, but I&amp;#8217;d much rather use someone else&amp;#8217;s perfectly good solution rather than writing my own.
&lt;/p&gt;
&lt;p&gt;
I think I&amp;#8217;m going to be very happy with Octopress.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=HNfnWopMnVM:UqUpsAYd0H4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=HNfnWopMnVM:UqUpsAYd0H4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=HNfnWopMnVM:UqUpsAYd0H4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/HNfnWopMnVM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/05/14/new-blog-tech/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[SparkleShare Doesn't Sparkle]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/uUmQhvqXGBs/" />
    <updated>2012-05-09T23:12:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/05/09/sparkleshare-bomb</id>
    <content type="html">&lt;p&gt;
Based on a LifeHacker posting, I previously blogged about giving SparkleShare a try.. It was cool. A free Dropbox with private hosting. So I installed, configured, and started using SparkleShare. While I was quite excited when I embarked upon my journey using SparkleShare, things didn&amp;#8217;t work out as well as I had hoped.
&lt;/p&gt;
&lt;p&gt;
I quickly found out that SparkleShare doesn&amp;#8217;t handle symbolic links. Not at all. There&amp;#8217;s no workaround. The problem is that SparkleShare relies on Git for synchronization and Git doesn&amp;#8217;t support symbolic links. At least for me, this rendered SparkleShare useless.
&lt;/p&gt;
&lt;p&gt;
When I moved to Dropbox directory, what I had been using for synchronization before SparkleShare, had no files in it, just a bunch of symbolic links. But with SparkleShare, you have to move all your directories into your SparkleShare directory and then scatter symbolic links around your system where the you want the directories to be. This caused a variety of minor but really annoying problems.
&lt;/p&gt;
&lt;p&gt;
But SparkleShare totally fails if you want to synchronize a directory that has symbolic links in it. SparkleShare&amp;#8217;s forum was covered with complaints about the symbolic link problem.
&lt;/p&gt;
&lt;p&gt;
I am currently using the following scheme for file distribution/backups:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;I&amp;#8217;m using rsync to keep my media, bin directory, dot-files, and the like in sync on all my computers.
&lt;/li&gt;
&lt;li&gt;For actual backups, I&amp;#8217;ve been using Crashplan for years and couldn&amp;#8217;t be happier.
&lt;/li&gt;
&lt;li&gt;And, in the past week or two, I&amp;#8217;ve put Dropbox synchronization back into the mix to manage synchronization between Org Mode files on my computers and MobileOrg files on my Android. Despite the strong cult following that Dropbox has, synching with my mobile seems to be the only effective use I can find for it.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=uUmQhvqXGBs:MNTP4fFMe6A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=uUmQhvqXGBs:MNTP4fFMe6A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=uUmQhvqXGBs:MNTP4fFMe6A:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/uUmQhvqXGBs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/05/09/sparkleshare-bomb/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Blackberry's Manufacturer RIM Nearly RIP]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/y93KiKo5UfY/" />
    <updated>2012-03-31T20:35:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/03/31/rim-rip</id>
    <content type="html">&lt;p&gt;
&lt;b&gt;RIM No Longer A Viable Company&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://bit.ly/HAtKtt"&gt;RIM&lt;/a&gt;, arguably the manufacturer of the first successful smartphone, the &lt;a href="http://bit.ly/HAub73"&gt;Blackberry&lt;/a&gt;, has not only lost its market lead, but is facing a rather unpredictable future. RIM&amp;#8217;s new CEO, &lt;a href="http://bit.ly/HAuOO6"&gt;Thorsten Heins&lt;/a&gt;, &lt;a href="http://www.washingtonpost.com/business/rim-charts-risky-survival-plan-while-opening-door-to-sale/2012/03/31/gIQAJYZRnS_story.html?tid=pm_business_pop"&gt;has stated&lt;/a&gt; that RIM is open to acquisition. At least for the short-term, his statements have led to a one-day, 5% bounce back of the stock price which was down 70% in the 12 months.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;RIM&amp;#8217;s History&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
For those of you that are unaware of RIM&amp;#8217;s history, it got its start in &lt;a href="http://en.wikipedia.org/wiki/Canada"&gt;Canada&lt;/a&gt; as a &lt;a href="http://bit.ly/H9vfx5"&gt;2-way pager&lt;/a&gt; provider. In 1999, RIM moved into the smartphone market with its first Blackberry and immediately achieved market dominance. 
&lt;/p&gt;


&lt;!-- more --&gt;

&lt;p&gt;
Factors that led to their dominance included:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Intelligent Marketing: One example was a giving away pre-1.0 Blackberries to attendees of the 1999 &lt;a href="http://en.wikipedia.org/wiki/JavaOne"&gt;JavaOne&lt;/a&gt; conference. I imagine that there wasn&amp;#8217;t a better set of &lt;a href="http://en.wikipedia.org/wiki/Software_release_life_cycle#Beta"&gt;beta testers&lt;/a&gt; than the gadget geeks that attended JavaOne (myself include). 
&lt;/li&gt;
&lt;li&gt;Sales Channels: RIM was selling its 2-way pagers to professionals who had a need to be in constant communication such as doctors, attorneys, business executives, and law enforcement. With the introduction of the Blackberry, RIM just added a better product to offer those same professionals. Sure it was more expensive, but 2-way pagers were already fairly costly. They were the perfect audience to market smartphones to.
&lt;/li&gt;
&lt;li&gt;First To Market: In 1999, most mobile providers were focused on upgrading their networks from analog to digital. Once the digital networks were in place, new functionality such as internet access would be easy to providing. But upgrading networks takes time. It involves men climbing towers, FCC regulations, local zoning laws, etc. But RIM didn&amp;#8217;t have to do this.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;b&gt;RIM&amp;#8217;s Brilliance&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
In what I consider a spectacular marketing and technological move, RIM started providing internet service over their existing 2-way pager network. While only a short-term solution as the 2-way pager network was designed for low-bandwidth usage, it was instantaneous. The first Blackberry was basically a 2-way pager with a good sized screen and full QWERTY keyboard. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;What Went Wrong&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
RIM&amp;#8217;s mistake was that they didn&amp;#8217;t learn from prior boom-to-bust technology companies. RIM seems to have perfectly followed the (mis)steps of Digital Electronics. While IBM has survived, it lost its market dominance in a sector, twice. The first time as a manufacture of mainframes in the 1970&amp;#8217;s and then again as a PC manufacturer in the 1980&amp;#8217;s. Apollo Computers, SGI, Xerox, all leaders at one time, are either gone or no longer of interest. 
&lt;/p&gt;
&lt;p&gt;
All of these companies suffered from a similar set of mistakes including:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Overconfidence: Each company thought that they were invulnerable. IBM is perhaps the best example. In the 1970&amp;#8217;s, when an IT manager had to make a decision about what gigantic computer to buy, they often said &amp;#8220;Nobody ever got fired for choosing IBM.&amp;#8221;. 
&lt;/li&gt;
&lt;li&gt;Lack of Foresight: Technology and markets change and so too must your company. Clearly RIM, along with its arch-rival Palm, both missed the boat. Phones went from being personal communication devices to be tiny, fit-in-your-pocket, computers. 
&lt;/li&gt;
&lt;li&gt;Unwillingness to Self-Cannibalize: In order to stay ahead of the technology market, you must be willing to come out with products that are better and cheaper than your existing products. HP and Goodyear are two companies that get this. Within a product line, HP routinely comes out with a better and cheaper printer than the one they currently have on the market. They know that it is going to kill sales of their existing printer. But HP also knows that when their customers need a new printer, it will be an HP printer. I know that Goodyear isn&amp;#8217;t considered a technology company, but their product, tires, involve high-tech materials and manufacturing processes. The CEO of Goodyear once asked how do you keep a company in business when you know that your next product is going to be cheaper, better, and last longer than your current product? While I think that HP and Goodyear would both prefer to keep selling their old products, they know better. It seems RIM didn&amp;#8217;t.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;b&gt;The Final Outcome&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
In the end, RIM, the makers of the Blackberry that was a status symbol for business executives in the 1990&amp;#8217;s, has all but been put out of business by Apple, a waning computer company in 1990, and Google, a non-existent company in 1990. 
&lt;/p&gt;
&lt;p&gt;
The trick to surviving in the high-tech marketplace is simple. All you need to do is realize that your market share is never safe, that there is always another company working on something that is better than what you have, and that you must act if you are fighting for your life, all-day, everyday. 
&lt;/p&gt;


&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=y93KiKo5UfY:wZfsrbf30ZU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=y93KiKo5UfY:wZfsrbf30ZU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=y93KiKo5UfY:wZfsrbf30ZU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/y93KiKo5UfY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/03/31/rim-rip/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Automated Gvoice And Gmail To Gcal]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/oDkpiOl7uV4/" />
    <updated>2012-03-31T16:14:00-04:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/03/31/gmail2gcal</id>
    <content type="html">&lt;p&gt;
I seem able to hold incredibly large amounts of technical details in my head. In contrast to this, I&amp;#8217;m excited when I can remember what year my kids were born in. From my viewpoint, this is just the way I have always been. From the viewpoint of people in my personal life, it can be frustrating.
&lt;/p&gt;
&lt;p&gt;
Being the technophile that I am, I&amp;#8217;ve incorporated many electronic assistive technologies into my life. In 1989 I got my first &lt;a href="http://en.wikipedia.org/wiki/Personal_digital_assistant"&gt;PDA&lt;/a&gt;. It was about the size and weight of a half-brick. But I could carry it wherever I went and it would ring to remind me to do things. What a deal!
&lt;/p&gt;
&lt;p&gt;
My newest electronic assistive technology is a rather complete phone and SMS management system. Its features are:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;I have a permanent record of every incoming or outgoing call or SMS.
&lt;/li&gt;
&lt;li&gt;My mobile phone rings whenever I get an incoming call or SMS.
&lt;/li&gt;
&lt;li&gt;My home phone rings whenever I get a call.
&lt;/li&gt;
&lt;li&gt;My mobile rings and gives me a notification whenever I get a call or SMS.
&lt;/li&gt;
&lt;li&gt;My computer rings and gives me a pop-up whenever I get a call or SMS.
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;i&gt;This blog entry is unfinished. It will be updated or followed up with a second blog entry shortly.&lt;/i&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=oDkpiOl7uV4:garOO5Z8dKk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=oDkpiOl7uV4:garOO5Z8dKk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=oDkpiOl7uV4:garOO5Z8dKk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/oDkpiOl7uV4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/03/31/gmail2gcal/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Cloud Computing: How Expensive Is A Rainy Day?]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/PsgJT0dfPgk/" />
    <updated>2012-02-29T11:42:35-05:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/02/29/azure-sunny-day</id>
    <content type="html">&lt;p&gt;
According to &lt;a href="http://bit.ly/zc1OOr"&gt;The Register&lt;/a&gt; (via &lt;a href="http://bit.ly/wzufGC"&gt;Slashdot&lt;/a&gt;), Microsoft&amp;#8217;s cloud computing platform, Azure, has been down, and I mean &lt;a href="http://dictionary.reference.com/browse/kaput"&gt;kaput&lt;/a&gt;, for 8+ hours. Worse yet, Azure&amp;#8217;s status page that tells its customers about outages and expected repair times, to which I won&amp;#8217;t provide a link, has now been &lt;a href="http://en.wikipedia.org/wiki/Slashdotted"&gt;Slashdotted&lt;/a&gt; and is down.
&lt;/p&gt;
&lt;p&gt;
Less than a year ago, &lt;a href="http://bit.ly/Ay7loE"&gt;AWS&lt;/a&gt; suffered a significant, though less serious, &lt;a href="http://bit.ly/yNzqJy"&gt;outage&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
While highly-distributed, cloud-based computing is clearly the future of IT, how can an organization understand the costs and prepare for the unavoidable outages? With the relative newness of 3^rd party cloud services, what statistics are useful.
&lt;!-- more --&gt;

For example, let&amp;#8217;s consider a fictitious service cloud service Neil&amp;#8217;s Cloud Computing or NCC. NCC is a more established cloud computing service. Its detailed records shows that it has been open for 1,701 days (approximately 4.7 years). In that time it has steadily grown to here it now runs tens of millions of instances of virtual computers, services tens of billions requests each day, and has never had a serious outage. 
&lt;/p&gt;
&lt;p&gt;
To be generous, let&amp;#8217;s define a &lt;i&gt;serious outage&lt;/i&gt; as any outage that renders key parts of the site unusable to a significant portion of the site&amp;#8217;s users and lasts a minimum of five minutes. We&amp;#8217;ll consider any outage less than that a &lt;i&gt;tolerable outage&lt;/i&gt;. 
&lt;/p&gt;
&lt;p&gt;
Even with all of this information, how can you calculate the cost of moving your enterprise to a cloud computing platform in general or NCC&amp;#8217;s in specific (let&amp;#8217;s assume that NCC is the best service you can find - after all, it is named after me). Even if your is willing to ignore all costs associated with the generously named &lt;i&gt;tolerable outages&lt;/i&gt;, how can you know NCC&amp;#8217;s 1,701 days of uptime mean that it will have another 4.7 years of uptime? How can you know it will be up tomorrow?
&lt;/p&gt;
&lt;p&gt;
The answer is simple: You can&amp;#8217;t! Just as it says on the bottom of financial documents, past performance is no guarantee of future results.
&lt;/p&gt;
&lt;p&gt;
But, when it comes to managing an enterprise, &amp;#8220;can&amp;#8217;t&amp;#8221; means things like &amp;#8220;can&amp;#8217;t go faster than the speed of light&amp;#8221;. Everything else is just &amp;#8220;How much?&amp;#8221;. How much does our current IT solution cost? How much would a cloud computing solution cost? How much do our current outages cost us? What are the odds of having a &lt;i&gt;serious outage&lt;/i&gt; if we moved to the cloud and how much would that cost us? Etc&amp;hellip;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=PsgJT0dfPgk:KynSs4q_MP8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=PsgJT0dfPgk:KynSs4q_MP8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=PsgJT0dfPgk:KynSs4q_MP8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/PsgJT0dfPgk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/02/29/azure-sunny-day/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Smartphones Everywhere]]></title>
    <link href="http://feedproxy.google.com/~r/MyGeekdom/~3/fMYNyoCyYEo/" />
    <updated>2012-02-22T13:38:14-05:00</updated>
    <id>http://www.neilsmithline.com/blog/2012/02/22/smartphones</id>
    <content type="html">&lt;p&gt;
Interpreting this chart from &lt;a href="http://blog.nielsen.com/nielsenwire/online_mobile/survey-new-u-s-smartphone-growth-by-age-and-income/"&gt;Nielsen&lt;/a&gt; (via &lt;a href="http://www.wired.com/epicenter/2012/02/smartphone-buying-machine/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+wired/index+(Wired:+Index+3+(Top+Stories+2))"&gt;Wired&lt;/a&gt;) does not require any great amount of effort.
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;p&gt;&lt;img src="http://www.wired.com/images_blogs/epicenter/2012/02/Smartphone-Income-and-Age.jpg"  alt="http://www.wired.com/images_blogs/epicenter/2012/02/Smartphone-Income-and-Age.jpg" /&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
It can be summarized by any of the following sentences:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;The greater your income the more likely you are to have a smartphone.
&lt;/li&gt;
&lt;li&gt;Young adults are more likely to have smartphones than older adults.
&lt;/li&gt;
&lt;li&gt;Smartphones are only for the young and get outgrown by the old. (Nah! But it is a valid interpretation of the chart.)
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
But I think the graph can best be summarized by:
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;p&gt;&lt;b&gt;Smartphones are where it is at today; and tomorrow, even more so.&lt;/b&gt;
&lt;/p&gt;
&lt;/div&gt;



&lt;!-- more --&gt;
&lt;p&gt;
Perhaps not the best grammar but I think it gets the point across. It becomes even more dramatic when you look at the number of people who have acquired smartphones in the past three months:
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;p&gt;&lt;img src="http://blog.nielsen.com/nielsenwire/wp-content/uploads/2012/02/SmartPhone_Recent-acquirers-age1.png"  alt="http://blog.nielsen.com/nielsenwire/wp-content/uploads/2012/02/SmartPhone_Recent-acquirers-age1.png" /&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
As &lt;a href="http://www.imdb.com/title/tt0059968/quotes"&gt;Robin&lt;/a&gt; would &lt;a href="http://en.wikipedia.org/wiki/Batman_(TV_series)#.22Holy_.......2C_Batman.21.22"&gt;say&lt;/a&gt;: Holy &lt;a href="http://dictionary.reference.com/browse/ubiquitous+computing?qsrc=2446"&gt;ubiquitous computing&lt;/a&gt;, Batman!
&lt;/p&gt;
&lt;p&gt;
It seems clear that this is where the money is. This means that some subset of technologies such as &lt;a href="http://en.wikipedia.org/wiki/Html5"&gt;HTML5&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Virtuality_(computing)"&gt;virtual computing&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Scala_(programming_language)"&gt;Scala&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Hadoop"&gt;Hadoop&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Amazon_Web_Services"&gt;AWS&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Couchdb"&gt;CouchDB&lt;/a&gt;, to name just a few, are going to be the technologies of tomorrow.
&lt;/p&gt;
&lt;p&gt;
In my lifetime, I have seen computers revolutionize society in several different ways.
&lt;/p&gt;&lt;dl&gt;
&lt;dt&gt;&lt;a href="#Http-en.wikipedia.org-wiki-Back_office"&gt;Back office&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Back office computerization led to the popularization of &lt;a href="http://en.wikipedia.org/wiki/Automated_teller_machine"&gt;ATMs&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Credit_card"&gt;credit cards&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Fed_Ex"&gt;Fed Ex&lt;/a&gt; and its overnight delivery service, and set the stage for the online marketplace we are familiar with today.
&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Personal_computer"&gt;Personal computers&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Personal computers introduced computing to the public. When I was in school, I would get bonus points for typing my homework assignments. Today, homework assignments must be printed from a &lt;a href="http://en.wikipedia.org/wiki/Word_processor"&gt;word processor&lt;/a&gt; if not submitted electronically.
&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/World_wide_web"&gt;The web&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;The web, for the first time ever, connected the back office directly to consumers in the comfort of their own home. ATMs allowed you to get 24x7 access to your bank account, but you needed to be at an ATM. PCs gave you access to many digital technologies, but having multiple computers interact was difficult, slow, and frequently expensive. But throw in the web and suddenly: &lt;b&gt;BOOM!&lt;/b&gt; You have the &lt;a href="http://en.wikipedia.org/wiki/Online_shopping"&gt;online shopping&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Video_gaming"&gt;video gaming&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Video_on_demand"&gt;video on demand&lt;/a&gt; that we live in today.
&lt;/dd&gt;
&lt;/dl&gt;


&lt;p&gt;
As a diehard nerd, I&amp;#8217;m thrilled to have lived through these technical revolutions. Not only have I lived through them, but I&amp;#8217;ve had the honor of having been an early consumer and even helped develop some of them. So, with great joy, and without trying to sound too greedy, I am joyous that the next revolutionary wave is coming to shore. And it is called &lt;i&gt;ubiquitous computing&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
I don&amp;#8217;t claim to be the &lt;a href="http://article.wn.com/view/2012/02/02/Did_the_Groundhog_see_his_shadow_2012_Punxsutawney_Phil_twee/"&gt;prognosticator of prognosticators&lt;/a&gt;. &lt;a href="http://www.wikipedia.com"&gt;Wikipedia&lt;/a&gt;&amp;#8217;s page on ubiquitous computing was created &lt;a href="http://en.wikipedia.org/w/index.php?title=Ubiquitous_computing&amp;amp;action=history"&gt;two years ago&lt;/a&gt;. I&amp;#8217;m just happy to be around to be part of it and hope that I get a chance to &lt;a href="http://bit.ly/zN6qBU"&gt;surf the wave&lt;/a&gt;.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=fMYNyoCyYEo:vMYshFmRsgI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=fMYNyoCyYEo:vMYshFmRsgI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MyGeekdom?a=fMYNyoCyYEo:vMYshFmRsgI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MyGeekdom?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MyGeekdom/~4/fMYNyoCyYEo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.neilsmithline.com/blog/2012/02/22/smartphones/</feedburner:origLink></entry>
  
</feed>
