<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5540414336321135811</id><updated>2026-03-11T03:01:42.911-07:00</updated><category term="blogging-tech"/><category term="tech"/><category term="nanoblogger"/><category term="projects"/><category term="cloud-computing"/><category term="coding"/><category term="jekyll"/><category term="octopress"/><category term="twitter"/><category term="emacs"/><category term="firefox"/><category term="macosx"/><category term="mozilla"/><category term="organization"/><category term="orgmode]"/><category term="programming-languages"/><category term="python"/><category term="ruby"/><title type='text'>My Geekdom</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default?alt=atom'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-6671838247161448255</id><published>2013-03-12T16:51:00.000-07:00</published><updated>2013-03-12T16:51:14.236-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging-tech"/><category scheme="http://www.blogger.com/atom/ns#" term="cloud-computing"/><category scheme="http://www.blogger.com/atom/ns#" term="jekyll"/><category scheme="http://www.blogger.com/atom/ns#" term="octopress"/><category scheme="http://www.blogger.com/atom/ns#" term="projects"/><category scheme="http://www.blogger.com/atom/ns#" term="twitter"/><title type='text'>Blurring Static And Dynamic Blogs</title><content type='html'>&lt;br /&gt;
&lt;div id=&quot;outline-container-1&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-1&quot;&gt;Static Blogging&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;&lt;br /&gt;
&lt;p&gt;I&#39;ve discussed the pros and cons about static blogging &lt;a href=&quot;http://www.neilsmithline.com/blog/categories/blogging-tech/&quot;&gt;many times&lt;/a&gt; before. In summary, the cons are that, well that your blog is static. No surprise there.&lt;br /&gt;
&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;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-2&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-2&quot;&gt;Website Hosting&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-2&quot;&gt;&lt;br /&gt;
&lt;p&gt;Unless you are self-hosting your &lt;a href=&quot;http://octopress.org&quot;&gt;Octopress&lt;/a&gt; or &lt;a href=&quot;http://jekyllrb.com&quot;&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&#39;s not my problem. I just use their (free) services.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I understand that website hosting isn&#39;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&#39;s no blog.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-3&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-3&quot;&gt;JavaScript Helps&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-3&quot;&gt;&lt;br /&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=&quot;http://github.com&quot;&gt;Github&lt;/a&gt; repositories. This is dynamic data that Octopress implements with some JavaScript.&lt;br /&gt;
&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;br /&gt;
&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&#39;s source at or before publication time, it is assuredly &lt;i&gt;static data&lt;/i&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;But client-side JavaScript (ie: JavaScript running in the user&#39;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;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-4&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-4&quot;&gt;Pushing Beyond Web Hosting JavaScript&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-4&quot;&gt;&lt;br /&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;br /&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;br /&gt;
&lt;p&gt;Integrate with external web services and let them do the work for you.&lt;br /&gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&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&#39;t tweet about my new blog postings or search through my website. Fortunately, there are services that will happily do that for you.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-4-1&quot; class=&quot;outline-3&quot;&gt;&lt;h3 id=&quot;sec-4-1&quot;&gt;Site Search&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-4-1&quot;&gt;&lt;br /&gt;
&lt;p&gt;This blog&#39;s search functionality is provided by Google. Dynamic blogging systems such as &lt;a href=&quot;http://joomla.org&quot;&gt;Joomla&lt;/a&gt; have a large array of &lt;a href=&quot;http://extensions.joomla.org/extensions/search-a-indexing&quot;&gt;search extensions&lt;/a&gt; that you can run on your server to provide various searching features. I&#39;m sure that they provide a much larger set of functionality than my site&#39;s Google search provides. &lt;br /&gt;
&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&#39;s search functionality. The site comes preconfigured for Google site search. That works for me.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-4-2&quot; class=&quot;outline-3&quot;&gt;&lt;h3 id=&quot;sec-4-2&quot;&gt;Automated Tweeting&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-4-2&quot;&gt;&lt;br /&gt;
&lt;p&gt;There are many ways to tweet via an email message but there is no way, at least none that I&#39;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;br /&gt;
&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=&quot;http://feedburner.com/&quot;&gt;FeedBurner&lt;/a&gt;. If you&#39;re unfamiliar with FeedBurner, it provides a web service that takes your site&#39;s RSS/Atom feed as input and adds value to that feed. My site&#39;s RSS feed is &lt;a href=&quot;http://feeds.feedburner.com/MyGeekdom&quot;&gt;http://feeds.feedburner.com/MyGeekdom&lt;/a&gt;. Assuming you don&#39;t have uncommon browser settings, if you visit that URL  you will see something that looks like: &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.neilsmithline.com/assets/screen-snapshots/feedburner.png&quot;  alt=&quot;http://www.neilsmithline.com/assets/screen-snapshots/feedburner.png&quot; /&gt;&lt;br /&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=&quot;https://twitter.com/neil_smithline/status/227220890109218816&quot;&gt;like this one&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-4-3&quot; class=&quot;outline-3&quot;&gt;&lt;h3 id=&quot;sec-4-3&quot;&gt;Tracking &quot;The Buzz&quot;&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-4-3&quot;&gt;&lt;br /&gt;
&lt;p&gt;&quot;The Buzz&quot;, also known as &quot;Trending&quot; or simply &quot;current events&quot;, is a term to describe what is popular on the internet at any given moment. While tracking all of the internet&#39;s news doesn&#39;t seem appropriate for a blog, tracking news related to your blog posting may be desirable.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Courtesy of &lt;a href=&quot;http://socialmention.com&quot;&gt;SocialMention&lt;/a&gt;, many of my blog postings have current news in the sidebar (see &lt;a href=&quot;http://www.neilsmithline.com/blog/2012/07/15/bookifying-news/&quot;&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;br /&gt;
&lt;/p&gt;&lt;p&gt;For example, by tracking several popular bookmarking sites such as &lt;a href=&quot;http://delicious.com&quot;&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&#39;t send a tweet whenever they bookmark a site.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;While it may be redundant to state,&lt;br /&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;br /&gt;
&lt;p&gt;Displaying current events on your blog postings means that they will always have current information.&lt;br /&gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;This means that there&#39;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;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-5&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-5&quot;&gt;The Age Of Cloud Computing&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-5&quot;&gt;&lt;br /&gt;
&lt;p&gt;While my blog is far from a large operation, the advent of &lt;a href=&quot;http://en.wikipedia.org/wiki/Cloud_computing&quot;&gt;cloud computing&lt;/a&gt; has made these dynamic features possible. From tiny systems like my blog to large systems like Google&#39;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;br /&gt;
&lt;/p&gt;&lt;p&gt;While I don&#39;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 &quot;minimal maintenance&quot;.&lt;br /&gt;
&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&#39;m sure that this is but a small sampling of the different ways to use dynamic data in static blogs.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/6671838247161448255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2013/03/blurring-static-and-dynamic-blogs.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/6671838247161448255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/6671838247161448255'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2013/03/blurring-static-and-dynamic-blogs.html' title='Blurring Static And Dynamic Blogs'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-1470054842373877597</id><published>2013-03-12T16:48:00.002-07:00</published><updated>2013-03-12T16:48:38.028-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging-tech"/><category scheme="http://www.blogger.com/atom/ns#" term="jekyll"/><category scheme="http://www.blogger.com/atom/ns#" term="octopress"/><title type='text'>Octopress Is Pretty Great</title><content type='html'>&lt;div class=&quot;outline-2&quot; id=&quot;outline-container-1&quot;&gt;&lt;h2 id=&quot;sec-1&quot;&gt;Jekyll Overview&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;&lt;br /&gt;
I have simply fallen in love with &lt;a href=&quot;http://bit.ly/KT1aFT&quot;&gt;Octopress&lt;/a&gt;. I think I mentioned previously that Octopress is an auto-configuration tool wrapped around &lt;a href=&quot;http://bit.ly/Jm1bmc&quot;&gt;Jekyll&lt;/a&gt;. And Jekyll is the technology behind &lt;a href=&quot;http://bit.ly/Krch8n&quot;&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;br /&gt;
&lt;br /&gt;
This isn&#39;t actually as much work for the Github servers as you may think. Jekyll is a &lt;a href=&quot;http://bit.ly/KrdOeu&quot;&gt;static&lt;/a&gt; &lt;a href=&quot;http://bit.ly/KrdUmf&quot;&gt;blogging system&lt;/a&gt; with no &lt;a href=&quot;http://bit.ly/KrdX1s&quot;&gt;CMS support&lt;/a&gt;. A static blog needs to be &lt;a href=&quot;http://bit.ly/Kre8tB&quot;&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=&quot;http://bit.ly/KreoZJ&quot;&gt;Wordpress&lt;/a&gt; and &lt;a href=&quot;http://bit.ly/KreuAH&quot;&gt;Joomla&lt;/a&gt; are programs that run on the server and work interactively with the web server to produce each page.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-2&quot; id=&quot;outline-container-2&quot;&gt;&lt;h2 id=&quot;sec-2&quot;&gt;Configuration&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-2&quot;&gt;&lt;br /&gt;
Octopress&#39;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&#39;t really argue with.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
But Octopress packages a mostly configured Jekyll installation in a neat little package. The introductory paragraph on &lt;a href=&quot;http://bit.ly/KT1aFT&quot;&gt;Octopress.org&lt;/a&gt; states:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&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&#39;re set.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
While that may sound a bit intimidating to the less-computer literate, the Octopress site carefully steps you through the process. I&#39;ve installed and used Wordpress, Joomla, &lt;a href=&quot;http://bit.ly/KrgcC1&quot;&gt;Drupal&lt;/a&gt;, &lt;a href=&quot;http://bit.ly/wq2Ien&quot;&gt;Nanoblogger&lt;/a&gt;, and many other blogging systems. I can say that Octopress is, by far, the easiest. &lt;br /&gt;
&lt;br /&gt;
The above quote states three steps for installing Octopress but there are actually a few more steps:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Install Git&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Clone or fork Octopress&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Install dependencies&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Install theme&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Configure your blog&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Configure deployment&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-2-1&quot;&gt;&lt;h3 id=&quot;sec-2-1&quot;&gt;Git&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-2-1&quot;&gt;&lt;br /&gt;
If you don&#39;t have &lt;a href=&quot;http://bit.ly/KrgU2a&quot;&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=&quot;http://bit.ly/KrhqgF&quot;&gt;Mac OS X&lt;/a&gt; and &lt;a href=&quot;http://windows.github.com/&quot;&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=&quot;http://bit.ly/xOIkfJ&quot;&gt;CLI&lt;/a&gt;s.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-2-2&quot;&gt;&lt;h3 id=&quot;sec-2-2&quot;&gt;Clone Or Fork Octopress&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-2-2&quot;&gt;&lt;br /&gt;
Cloning Octopress, simpler than forking it, is a single command line &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;git clone git://github.com/imathis/octopress.git octopress
&lt;/pre&gt;&lt;br /&gt;
It takes only a few mouse clicks if you are using one of Github&#39;s applications to do the clone. &lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-2-3&quot;&gt;&lt;h3 id=&quot;sec-2-3&quot;&gt;Install Dependencies&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-2-3&quot;&gt;&lt;br /&gt;
Installing the dependencies is, yet again, a few simple CLI commands described in an easy-to-read style on Octopress&#39;s &lt;a href=&quot;http://bit.ly/LExpsY&quot;&gt;setup&lt;/a&gt; page.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-2-4&quot;&gt;&lt;h3 id=&quot;sec-2-4&quot;&gt;Install The Theme&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-2-4&quot;&gt;&lt;br /&gt;
Installing the theme is a single CLI command:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;rake install
&lt;/pre&gt;&lt;br /&gt;
There are additional theme installation options but you can simply ignore them as the defaults work well. In a subsequent blog post I&#39;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;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-2-5&quot;&gt;&lt;h3 id=&quot;sec-2-5&quot;&gt;Configure Your Blog&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-2-5&quot;&gt;&lt;br /&gt;
Configuring your blog is perhaps the most complicated step in the entire installation process. You&#39;ll need to open a text editor such as &lt;a href=&quot;http://bit.ly/LEyD7l&quot;&gt;Textedit&lt;/a&gt; on a Mac or &lt;a href=&quot;http://bit.ly/LEyRvo&quot;&gt;Notepad&lt;/a&gt; on Windows. &lt;br /&gt;
&lt;br /&gt;
The configuration file is written in a format called &lt;a href=&quot;http://bit.ly/LEzjd3&quot;&gt;YAML&lt;/a&gt;. That sounds a lot scarier than it actually is. Octopress&#39;s &lt;a href=&quot;http://bit.ly/Mlynfm&quot;&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;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&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&#39;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;br /&gt;
&lt;br /&gt;
Several of the configuration options have default values or can be left empty.&lt;br /&gt;
&lt;br /&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=&quot;http://bit.ly/n1i2v2&quot;&gt;GUI&lt;/a&gt; or a web page. &lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-2-6&quot;&gt;&lt;h3 id=&quot;sec-2-6&quot;&gt;Configuring Deployment&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-2-6&quot;&gt;&lt;br /&gt;
Configuring your deployment, the final setup action, involves telling Octopress what computer is going to &lt;a href=&quot;http://bit.ly/LECz8n&quot;&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 &quot;publishing&quot; 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=&quot;http://bit.ly/LEIgTI&quot;&gt;24x7&lt;/a&gt;.&lt;br /&gt;
&lt;br /&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;br /&gt;
&lt;br /&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;br /&gt;
&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=&quot;http://bit.ly/LEGcuN&quot;&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=&quot;http://bit.ly/LEGIsK&quot;&gt;Heroku&lt;/a&gt;. The third strategy using &lt;a href=&quot;http://bit.ly/LEIdHt&quot;&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;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&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&#39;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;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-2-7&quot;&gt;&lt;h3 id=&quot;sec-2-7&quot;&gt;Configuration Summary&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-2-7&quot;&gt;&lt;br /&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&#39;ll only need to install it once :-) I would imagine that a non-technical users could easily install Octopress in half a day.&lt;br /&gt;
&lt;br /&gt;
The only exception that I can think of would be if you&#39;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&#39;t think that Windows does.&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-2&quot; id=&quot;outline-container-3&quot;&gt;&lt;h2 id=&quot;sec-3&quot;&gt;It&#39;s Blogging Time!&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-3&quot;&gt;&lt;br /&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&#39;ll discuss this in a subsequent blog posting where I discuss my personal Octopress configuration.&lt;br /&gt;
&lt;br /&gt;
Now that everything is configured, it&#39;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;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;rake &#39;new_post[Name Of My Post]&#39;
&lt;/pre&gt;&lt;br /&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;br /&gt;
&lt;br /&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;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;rake preview
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Then you can open your web browser to &lt;a href=&quot;http://localhost:4000/&quot;&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;br /&gt;
&lt;br /&gt;
Once you are ready to publish your blog to the world, execute the command&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;rake gen_deploy
&lt;/pre&gt;&lt;br /&gt;
And &lt;i&gt;voila&lt;/i&gt;! You have updated your blog.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-2&quot; id=&quot;outline-container-4&quot;&gt;&lt;h2 id=&quot;sec-4&quot;&gt;Octopress Summary&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-4&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-4-1&quot;&gt;&lt;h3 id=&quot;sec-4-1&quot;&gt;Cons&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-4-1&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-4&quot; id=&quot;outline-container-4-1-1&quot;&gt;&lt;h4 id=&quot;sec-4-1-1&quot;&gt;Configuration&lt;/h4&gt;&lt;div class=&quot;outline-text-4&quot; id=&quot;text-4-1-1&quot;&gt;&lt;br /&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;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-4&quot; id=&quot;outline-container-4-1-2&quot;&gt;&lt;h4 id=&quot;sec-4-1-2&quot;&gt;Single Computer Publishing&lt;/h4&gt;&lt;div class=&quot;outline-text-4&quot; id=&quot;text-4-1-2&quot;&gt;&lt;br /&gt;
While I haven&#39;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=&quot;http://bit.ly/KTgaWb&quot;&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;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-4-2&quot;&gt;&lt;h3 id=&quot;sec-4-2&quot;&gt;Pros&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-4-2&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-4&quot; id=&quot;outline-container-4-2-1&quot;&gt;&lt;h4 id=&quot;sec-4-2-1&quot;&gt;Configuration&lt;/h4&gt;&lt;div class=&quot;outline-text-4&quot; id=&quot;text-4-2-1&quot;&gt;&lt;br /&gt;
While configuring a blog on a site like Blogger is definitely easier than configuring Octopress, if Blogger doesn&#39;t meet your needs, I think Octopress is easier to manage than all Joomla, Drupal, and all of its competitors – at least the ones I&#39;ve seen.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-4&quot; id=&quot;outline-container-4-2-2&quot;&gt;&lt;h4 id=&quot;sec-4-2-2&quot;&gt;Content Possession&lt;/h4&gt;&lt;div class=&quot;outline-text-4&quot; id=&quot;text-4-2-2&quot;&gt;&lt;br /&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… 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;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-4&quot; id=&quot;outline-container-4-2-3&quot;&gt;&lt;h4 id=&quot;sec-4-2-3&quot;&gt;Content Accessibility&lt;/h4&gt;&lt;div class=&quot;outline-text-4&quot; id=&quot;text-4-2-3&quot;&gt;&lt;br /&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;br /&gt;
&lt;br /&gt;
But with Octopress, the content for each posting is in a file. One file for each posting. While I&#39;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;br /&gt;
&lt;br /&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;br /&gt;
&lt;br /&gt;
The one-file-one-posting principal of Octopress, and Nanoblogger, make life so much simpler.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-4&quot; id=&quot;outline-container-4-2-4&quot;&gt;&lt;h4 id=&quot;sec-4-2-4&quot;&gt;And It Looks Good Too!&lt;/h4&gt;&lt;div class=&quot;outline-text-4&quot; id=&quot;text-4-2-4&quot;&gt;&lt;br /&gt;
Even after customizing them, I find that Wordpress blogs tend to be drap and all look like &lt;a href=&quot;http://bit.ly/KThoAU&quot;&gt;this&lt;/a&gt; and that Blogger.com blogs require lots of tinkering but still tend to look like &lt;a href=&quot;http://bit.ly/KThtVf&quot;&gt;this&lt;/a&gt;. On the other hand, Octopress blogs tend to look like the &lt;a href=&quot;http://bit.ly/KT1aFT&quot;&gt;Octopress homepage&lt;/a&gt; or my &lt;a href=&quot;http://bit.ly/yGGszW&quot;&gt;blog&lt;/a&gt;.&lt;br /&gt;
&lt;br /&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=&quot;http://bit.ly/KT1aFT&quot;&gt;colors for Octopress&lt;/a&gt; to use my preferred &lt;a href=&quot;http://bit.ly/yGGszW&quot;&gt;color pallette&lt;/a&gt;.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-4&quot; id=&quot;outline-container-4-2-5&quot;&gt;&lt;h4 id=&quot;sec-4-2-5&quot;&gt;It Will Grow With You&lt;/h4&gt;&lt;div class=&quot;outline-text-4&quot; id=&quot;text-4-2-5&quot;&gt;&lt;br /&gt;
I think that Octopress&#39;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 &quot;Gee. I wish my blog could do XYZ.&quot;, the odds are that it can. Just google &quot;Jekyll blogs XYZ&quot; and, at least for reasonable XYZs, you&#39;ll find that instructions about reconfiguring your blog so it can do XYZ.&lt;br /&gt;
&lt;br /&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;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;outline-2&quot; id=&quot;outline-container-5&quot;&gt;&lt;h2 id=&quot;sec-5&quot;&gt;Future Postings About Octopress&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-5&quot;&gt;&lt;br /&gt;
This is now my second posting about Octopress. My {{{relative_url(2012/05/14/new-blog-tech, First Posting, first posting)}}} discussed my initial opinions about Octopress. They were largely positive but so too were my {{{relative_url(/blog/2011/12/07/new-blog-tech, Nanoblogger Posting, initial impressions)}}} of Nanoblogger. &lt;br /&gt;
&lt;br /&gt;
At the time of writing this blog posting I&#39;m certain that I&#39;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;br /&gt;
&lt;br /&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;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Allow me to easily use &lt;a href=&quot;http://bit.ly/zhYdcB&quot;&gt;Org Mode&lt;/a&gt; as my markup language and &lt;a href=&quot;http://emacswiki.org/&quot;&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;br /&gt;
&lt;/li&gt;
&lt;li&gt;Keep my content totally separate from the Octopress&#39;s content. By this I mean that if, you were to burn my computer as I&#39;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&#39;s configuration and should probably be changed in Octopress.&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/1470054842373877597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2013/03/octopress-is-pretty-great.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/1470054842373877597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/1470054842373877597'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2013/03/octopress-is-pretty-great.html' title='Octopress Is Pretty Great'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-7280276989947448017</id><published>2012-06-01T16:55:00.000-07:00</published><updated>2013-03-12T16:56:10.453-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="firefox"/><category scheme="http://www.blogger.com/atom/ns#" term="macosx"/><category scheme="http://www.blogger.com/atom/ns#" term="mozilla"/><category scheme="http://www.blogger.com/atom/ns#" term="programming-languages"/><category scheme="http://www.blogger.com/atom/ns#" term="projects"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby"/><title type='text'>My First Ruby Project</title><content type='html'>&lt;div id=&quot;outline-container-1&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-1&quot;&gt;The Project&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;&lt;br /&gt;
&lt;p&gt;Typically, even my pet projects have a specific goal in mind. I don&#39;t write a spec for my personal projects, there&#39;s just a, maybe slightly fuzzy, goal. Generally I want something that will be useful. I&#39;ll work on a project until:&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The project does everything I hoped for. Maybe even more!&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;I run out of spare time to work on it. This doesn&#39;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=&quot;http://bit.ly/yGGszW&quot;&gt;My Geekdom&lt;/a&gt;. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;I decide that I did a poor job picking a pet project as they&#39;re supposed to be fun and this projects isn&#39;t. So long!&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;I get stuck such that proceeding will require more effort than I feel it&#39;s worth. That said, hopefully I learned something working on the project.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&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;br /&gt;
&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=&quot;http://bit.ly/Kfv0n2&quot;&gt;Mac OS X&lt;/a&gt; computer. I&#39;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&#39;t &lt;a href=&quot;http://bit.ly/LUSEY8&quot;&gt;sleeping&lt;/a&gt; or hanging.&lt;br /&gt;
&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=&quot;http://bit.ly/LUT7tx&quot;&gt;Mozilla&lt;/a&gt;&#39;s &lt;a href=&quot;http://bit.ly/HzqbTy&quot;&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;br /&gt;
&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=&quot;http://bit.ly/LUUGHN&quot;&gt;Google&lt;/a&gt;&#39;s &lt;a href=&quot;http://bit.ly/LUUHLP&quot;&gt;Chrome&lt;/a&gt; browser was starting to have enough functionality to be a primary browser.&lt;br /&gt;
&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=&quot;http://bit.ly/LUV1u1&quot;&gt;Aurora&lt;/a&gt; and &lt;a href=&quot;http://bit.ly/LUV4Ga&quot;&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&#39;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=&quot;#sec-5&quot;&gt;Reference: Articles About Firefox&#39;s Memory Leaks And Repair Efforts&lt;/a&gt; for information about FF&#39;s memory leaks.)&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Around the beginning of this calendar year I started to think that Firefox wasn&#39;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&#39;t know enough to make accurate guesses. Guessing can be used to lead your performance tuning investigations, but you always need hard data.&lt;br /&gt;
&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&#39;t be any fun if I just switched from Firefox to Chrome to see if I notice a difference.&lt;br /&gt;
&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&#39;m prepared to &lt;a href=&quot;http://en.wikipedia.org/wiki/MacGyverism#MacGyverisms&quot;&gt;MacGyver&lt;/a&gt; the analysis as I go along.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;My new pet project is the exploration of these data samples.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-2&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-2&quot;&gt;The Programming Language&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-2&quot;&gt;&lt;br /&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&#39;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=&quot;http://bit.ly/n1i2v2&quot;&gt;GUI&lt;/a&gt;. As long as I don&#39;t need to do very complex statistical analyses, the choice programming language won&#39;t likely matter to much.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So I have chosen to implement this project in &lt;a href=&quot;http://bit.ly/LUK5N0&quot;&gt;Ruby&lt;/a&gt;. I&#39;m certain I could implement it faster in any of a few dozen other programming languages but I chose Ruby for two reasons:&lt;br /&gt;
&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&#39;t know Ruby, learning it will be more fun. Especially being that I haven&#39;t learned a new language in a year or so.&lt;br /&gt;
&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;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Ruby isn&#39;t wholly unfamiliar to me. I&#39;ve made a few small (very small) changes to the &lt;a href=&quot;http://bit.ly/JBwXrU&quot;&gt;org-ruby&lt;/a&gt; &lt;a href=&quot;http://bit.ly/M5PRvb&quot;&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=&quot;http://bit.ly/M5T4ei&quot;&gt;dynamic typing&lt;/a&gt;. But languages that I&#39;m fluent in, such as Lisp, Python, Bash, and AWK have dynamic typing. Doesn&#39;t seem a problem.&lt;br /&gt;
&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&#39;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;br /&gt;
&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&#39;s, and such. In my world, there are only a few ways to implement a &lt;a href=&quot;http://bit.ly/JBxKsI&quot;&gt;parser&lt;/a&gt; and org-ruby doesn&#39;t use any of them. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;That said, I don&#39;t think the feeling of unfamiliarity stems from org-ruby&#39;s parser not being a &lt;a href=&quot;http://bit.ly/JBxTfU&quot;&gt;recursive descent parser&lt;/a&gt; or implemented with a &lt;a href=&quot;http://bit.ly/JBxXMI&quot;&gt;parser generator&lt;/a&gt; from a &lt;a href=&quot;http://bit.ly/JBxYAi&quot;&gt;formal grammar&lt;/a&gt;. I&#39;ve seem plenty of really terrible parser implementations that left queasy but didn&#39;t feel unfamiliar.&lt;br /&gt;
&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;br /&gt;
&lt;/p&gt;&lt;p&gt;Having eliminated other possibilities, I&#39;m left to think that the feeling of unfamiliarity must stem from Ruby itself.&lt;br /&gt;
&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=&quot;http://bit.ly/JByk9Q&quot;&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&#39;t feel anything like a C application (at least not if you understand how to program in Scheme). While I don&#39;t have a word for it, I think that Ruby leads to a different way of writing applications than languages that I&#39;m familiar with.. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;While I&#39;m not sure what that difference is, I hope to figure it out as I move through this project. In the end, I don&#39;t want to have a great &quot;Java program&quot; that happens to have been written using Ruby syntax. I want to have a great Ruby program &amp;ndash; period.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-3&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-3&quot;&gt;The Project&#39;s Current Progress&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-3&quot;&gt;&lt;br /&gt;
&lt;p&gt;&quot;Not much&quot; seems to sum up my current project. While I&#39;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&#39;ve done so far is write a tiny class to hold a line of data output by the &lt;a href=&quot;http://bit.ly/M5V9H3&quot;&gt;ps(1)&lt;/a&gt; program:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;src src-ruby-mode&quot;&gt;&lt;span class=&quot;linenr&quot;&gt; 1:  &lt;/span&gt;class PSDataLine
&lt;span class=&quot;linenr&quot;&gt; 2:  &lt;/span&gt;  attr_accessor :pid
&lt;span class=&quot;linenr&quot;&gt; 3:  &lt;/span&gt;  attr_accessor :stat
&lt;span class=&quot;linenr&quot;&gt; 4:  &lt;/span&gt;  attr_accessor :time
&lt;span class=&quot;linenr&quot;&gt; 5:  &lt;/span&gt;  attr_accessor :elapsed_time
&lt;span class=&quot;linenr&quot;&gt; 6:  &lt;/span&gt;  attr_accessor :virtual_size
&lt;span class=&quot;linenr&quot;&gt; 7:  &lt;/span&gt;  attr_accessor :rss
&lt;span class=&quot;linenr&quot;&gt; 8:  &lt;/span&gt;  attr_accessor :percent_cpu
&lt;span class=&quot;linenr&quot;&gt; 9:  &lt;/span&gt;  attr_accessor :percent_mem
&lt;span class=&quot;linenr&quot;&gt;10:  &lt;/span&gt;  attr_accessor :command
&lt;span class=&quot;linenr&quot;&gt;11:  &lt;/span&gt;
&lt;span class=&quot;linenr&quot;&gt;12:  &lt;/span&gt;  # Create the object
&lt;span class=&quot;linenr&quot;&gt;13:  &lt;/span&gt;  def initialize(line_string)
&lt;span class=&quot;linenr&quot;&gt;14:  &lt;/span&gt;    line = line_string.split(&#39; &#39;)
&lt;span class=&quot;linenr&quot;&gt;15:  &lt;/span&gt;    @pid = line[0]
&lt;span class=&quot;linenr&quot;&gt;16:  &lt;/span&gt;    @stat = line[1]
&lt;span class=&quot;linenr&quot;&gt;17:  &lt;/span&gt;    @time = line[2]
&lt;span class=&quot;linenr&quot;&gt;18:  &lt;/span&gt;    @elapsed_time = line[3]
&lt;span class=&quot;linenr&quot;&gt;19:  &lt;/span&gt;    @virtual_size = line[4]
&lt;span class=&quot;linenr&quot;&gt;20:  &lt;/span&gt;    @rss = line[5]
&lt;span class=&quot;linenr&quot;&gt;21:  &lt;/span&gt;    @percent_cpu = line[6]
&lt;span class=&quot;linenr&quot;&gt;22:  &lt;/span&gt;    @percent_mem = line[7]
&lt;span class=&quot;linenr&quot;&gt;23:  &lt;/span&gt;    @command = line[8]
&lt;span class=&quot;linenr&quot;&gt;24:  &lt;/span&gt;  end
&lt;span class=&quot;linenr&quot;&gt;25:  &lt;/span&gt;end
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I know it isn&#39;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;br /&gt;
&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=&quot;http://bit.ly/JBzTER&quot;&gt;Rubyist&lt;/a&gt; for the good reference.)&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I&#39;m pretty busy this week so I don&#39;t think I&#39;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;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-4&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-4&quot;&gt;Process Data&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-4&quot;&gt;&lt;br /&gt;
&lt;p&gt;While I&#39;ve only begun writing my program and haven&#39;t reached any conclusions about anything yet, I do have lots of data. If you have an interest in seeing what my computer&#39;s been up to you can view the process data, read about my sampling mechanism, and copy the data from my &lt;a href=&quot;http://bit.ly/M1nUBf&quot;&gt;process-data&lt;/a&gt; Github repository.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-5&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-5&quot;&gt;Reference: Articles About Firefox&#39;s Memory Leaks And Repair Efforts&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-5&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;A &lt;a href=&quot;http://bit.ly/LsNgcq&quot;&gt;blog posting&lt;/a&gt; posting by Mozillian Nicholas Nethercote. A &lt;a href=&quot;http://bit.ly/LsNhNi&quot;&gt;second posting&lt;/a&gt; of Nicholas about weeks 49 &amp;amp; 50 of the Mozilla effort to reduce the memory footprint.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;A different engineer&#39;s &lt;a href=&quot;http://bit.ly/LsNgZS&quot;&gt;blog posting&lt;/a&gt; discussing the hunt for memory leaks in Firefox.&lt;br /&gt;
&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=&quot;http://bit.ly/LsNkJ8&quot;&gt;article&lt;/a&gt; in &lt;a href=&quot;http://bit.ly/LsPLeE&quot;&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;br /&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;http://bit.ly/LsNkZB&quot;&gt;Firefox Forum posting&lt;/a&gt; expressing user frustration.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/7280276989947448017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2012/06/my-first-ruby-project.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/7280276989947448017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/7280276989947448017'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2012/06/my-first-ruby-project.html' title='My First Ruby Project'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-8610207680605421104</id><published>2012-05-27T16:49:00.000-07:00</published><updated>2013-03-12T16:49:45.725-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging-tech"/><category scheme="http://www.blogger.com/atom/ns#" term="emacs"/><category scheme="http://www.blogger.com/atom/ns#" term="orgmode]"/><category scheme="http://www.blogger.com/atom/ns#" term="projects"/><category scheme="http://www.blogger.com/atom/ns#" term="twitter"/><title type='text'>Org-Mode + t Makes Tweeting Easy</title><content type='html'>&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;outline-container-1&quot; class=&quot;outline-3&quot;&gt;&lt;h3 id=&quot;sec-1&quot;&gt;Update &lt;span class=&quot;timestamp-wrapper&quot;&gt; &lt;span class=&quot;timestamp&quot;&gt;2012-06-04 Mon 00:57&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-1&quot;&gt;&lt;br /&gt;
&lt;p&gt;You can download the code from its &lt;a href=&quot;http://cnet.co/M2O9L8&quot;&gt;Github repository&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-1&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-1&quot;&gt;Motivation&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;&lt;br /&gt;
&lt;p&gt;After yesterday&#39;s &lt;a href=&quot;{{ root_url }}/blog/2012/05/26/octopress-is-pretty-great&quot; title=&quot;Posting about Octopress&quot;&gt;ranting about Octopress&lt;/a&gt;, it occurred to me that while I now own the content of my blog postings, I don&#39;t own the content of my &lt;a href=&quot;http://bit.ly/JvoqLE&quot;&gt;tweets&lt;/a&gt;. I&#39;m sure that there&#39;s some way to convince &lt;a href=&quot;http://bit.ly/Jvotaj&quot;&gt;Twitter&lt;/a&gt; to give me my tweets, but why should I rely on them to store my tweets.&lt;br /&gt;
&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;br /&gt;
&lt;/p&gt;&lt;p&gt;It should be noted that I&#39;m not interested in implementing a full Twitter client. There are more than enough of those. I&#39;m interested in having my tweets, or at least the bulk of my tweets, in a simple and easily accessible format.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-2&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-2&quot;&gt;The Answer Must Be Cheap&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-2&quot;&gt;&lt;br /&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;br /&gt;
&lt;/p&gt;&lt;p&gt;Being that my relationship with &lt;a href=&quot;http://bit.ly/zhYdcB&quot;&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&#39;m describing has these properties:&lt;br /&gt;
&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;br /&gt;
&lt;/li&gt;
&lt;li&gt;Besides not adding overhead to my tweeting, it has made tweeting dramatically simpler.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;The entire implementation is a single file of &lt;a href=&quot;http://bit.ly/wTaGtn&quot;&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&#39;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;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-3&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-3&quot;&gt;Advantages Of Org Mode&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-3&quot;&gt;&lt;br /&gt;
&lt;p&gt;Before continuing, you should know a few facts about Org Mode:&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;At its core, Org Mode is an &lt;a href=&quot;http://bit.ly/MSMf12&quot;&gt;outliner&lt;/a&gt; on steroids. This works great for me as I tend to organize my thoughts as trees. I&#39;m obvious not alone as the &lt;a href=&quot;http://bit.ly/MSMf12&quot;&gt;outliner&lt;/a&gt; page on &lt;a href=&quot;http://bit.ly/KWo5OA&quot;&gt;Wikipedia&lt;/a&gt; has a list of many outliner applications along with &lt;a href=&quot;http://bit.ly/KWoa4F&quot;&gt;references&lt;/a&gt; to many outliners that are designed to implement specific functionality. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Org Mode augments its outlining functionality with a &lt;a href=&quot;http://bit.ly/MSKKjm&quot;&gt;task management system&lt;/a&gt; (&lt;a href=&quot;http://bit.ly/MSKKjm&quot;&gt;details&lt;/a&gt;).&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Org Mode has a &lt;a href=&quot;http://bit.ly/MSNhKm&quot;&gt;template&lt;/a&gt; based &lt;a href=&quot;http://bit.ly/MSN7CO&quot;&gt;data capturing&lt;/a&gt; system that allows for the easy capturing of data into a consistent format.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Org Mode is implemented in &lt;a href=&quot;http://bit.ly/MSNvkN&quot;&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=&quot;http://bit.ly/MSNVrv&quot;&gt;rich extension mechanism&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-4&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-4&quot;&gt;The Storage Structure Of Tweets&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-4&quot;&gt;&lt;br /&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;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;example&quot;&gt;* My First Tweet
  This is my first tweet using Org Mode.
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&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&#39;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;br /&gt;
&lt;/p&gt;&lt;p&gt;While, for the moment, sparing you the ugliness of the capture configuration string, I&#39;ll tell you that Org Mode supports a date tree outline format.&lt;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;example&quot;&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;br /&gt;
&lt;br /&gt;
&lt;p&gt;Being an outliner, Org Mode supports the &lt;a href=&quot;http://bit.ly/KWoekU&quot;&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&#39;s say that, being today is Monday, I don&#39;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;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;example&quot;&gt;* 2012
*** 2012-05 May
***** 2012-05-26 Saturday ...
***** 2012-05-27 Sunday ...
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The &quot;&amp;hellip;&quot; is Org Mode&#39;s way to let you know that this entry has been folded.&lt;br /&gt;
&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;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-5&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-5&quot;&gt;Capturing Tweets&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-5&quot;&gt;&lt;br /&gt;
&lt;p&gt;A simple yet highly functional storage mechanism is fine but what I&#39;m looking for is to reduce my tweeting overhead. This means that the workflow is what I care about. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The first part of the workflow is the &quot;capturing&quot; of my tweets. Org Mode&#39;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;br /&gt;
&lt;/p&gt;&lt;p&gt;When I initiate a tweet capture, I&#39;m initially prompted for a &quot;title&quot;. That is the descriptive text for the tweet. In the above example, &quot;My First Tweet&quot; is a title. After entering my title, I&#39;m given an &lt;a href=&quot;http://bit.ly/KWpdBF&quot;&gt;Emacs buffer&lt;/a&gt;, basically a new Emacs window, in which to type my tweet.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;When I&#39;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;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-6&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-6&quot;&gt;Tweeting&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-6&quot;&gt;&lt;br /&gt;
&lt;p&gt;Now that I&#39;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=&quot;http://bit.ly/KWpRPv&quot;&gt;hooks&lt;/a&gt; that allow you to insert code into the workflow. Org Mode adds many hooks of its own.&lt;br /&gt;
&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 &quot;-update.org&quot;. I used the file naming convention of &quot;-update&quot; instead of &quot;-tweet&quot; in case I decide to add other types of status messages at a later date.&lt;br /&gt;
&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=&quot;http://bit.ly/KGlf2s&quot;&gt;t application&lt;/a&gt;. For my purposes, &lt;code&gt;t&lt;/code&gt;&#39;s &lt;a href=&quot;http://bit.ly/xOIkfJ&quot;&gt;CLI&lt;/a&gt; is perfect. Once you&#39;ve signed into Twitter with &lt;code&gt;t&lt;/code&gt;, it will tweet for you with the simple command line of:&lt;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;example&quot;&gt;t update This is my tweet text.
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;That seems about as simple as it can get.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-7&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-7&quot;&gt;Tracking Tweet Status&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-7&quot;&gt;&lt;br /&gt;
&lt;p&gt;Being that I&#39;m storing more than one tweet in a file, it is important that I know which tweets have been tweeted and which ones haven&#39;t. This is another place where I get to leverage the wonders of Org Mode.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Beyond outlining, Org Mode supports a simple yet highly functional and customizable &lt;a href=&quot;http://bit.ly/KWrJrE&quot;&gt;task management system&lt;/a&gt;. The customizability allows you to define task states well beyond the typical &quot;open&quot; and &quot;closed&quot; states of many other task managers. &lt;br /&gt;
&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&#39;s slogan is &lt;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;example&quot;&gt;Org: Your Life in Plain Text
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;and they mean it.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;To indicate a tweet&#39;s, ie: a task&#39;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;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;example&quot;&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;br /&gt;
&lt;br /&gt;
&lt;p&gt;When I use Org Mode&#39;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&#39;s hooks, makes sure that my code is called whenever the tweet file is saved. &lt;br /&gt;
&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;br /&gt;
&lt;/p&gt;&lt;p&gt;After successfully tweeting a status update, I tell Org Mode to change the tweet&#39;s state from &lt;code&gt;POST&lt;/code&gt; to &lt;code&gt;DONE&lt;/code&gt;. That&#39;s all there is to it.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-8&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-8&quot;&gt;Some Nice Freebies&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-8&quot;&gt;&lt;br /&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&#39;s richness provide other nice features:&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Twitter&#39;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;br /&gt;
&lt;/li&gt;
&lt;li&gt;Automated highlighting of tweets.&lt;br /&gt;
&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=&quot;http://bit.ly/wSSiWH&quot;&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;br /&gt;
&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;br /&gt;
&lt;/li&gt;
&lt;li&gt;Org Mode allows you to &lt;a href=&quot;http://bit.ly/KWtipB&quot;&gt;tag&lt;/a&gt; (aka: &quot;label&quot; or &quot;categorize&quot;) 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&#39;m not sure that I&#39;ll ever implement that functionality, but thought I&#39;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 &quot;TWEET&quot; to designate that I want to update Twitter. The second label is &quot;NS&quot; to indicate that I want to update the status of my &lt;a href=&quot;http://bit.ly/KWtyVp&quot;&gt;@neil_smithline&lt;/a&gt; Twitter account.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Emacs is my tweet editor. For those of you who don&#39;t know Emacs as well as those of you that know Emacs and hate it, I&#39;m sure you wouldn&#39;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=&quot;http://bit.ly/KWtPb0&quot;&gt;spell checking/correction&lt;/a&gt;, the ability to easily change the case of something I&#39;ve mistyped, functionality based on English grammar (eg: the ability to move, delete, or even transpose words or sentences), etc&amp;hellip;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;outline-container-9&quot; class=&quot;outline-2&quot;&gt;&lt;h2 id=&quot;sec-9&quot;&gt;A Sneak Peek&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-9&quot;&gt;&lt;br /&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;br /&gt;
&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 &quot;Tweeting From Emacs&quot; (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;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.neilsmithline.com/assets/screen-snapshots/tweets-screenshot.png&quot;  alt=&quot;http://www.neilsmithline.com/assets/screen-snapshots/tweets-screenshot.png&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;color:#F8F8F8;&quot;&gt;For Technorati: PHTDYXEZKM3Q&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/8610207680605421104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2012/05/org-mode-t-makes-tweeting-easy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/8610207680605421104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/8610207680605421104'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2012/05/org-mode-t-makes-tweeting-easy.html' title='Org-Mode + t Makes Tweeting Easy'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-125065584382487015</id><published>2012-03-31T16:54:00.000-07:00</published><updated>2013-03-12T16:54:53.325-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cloud-computing"/><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="organization"/><category scheme="http://www.blogger.com/atom/ns#" term="tech"/><title type='text'>Automatefd Gvoice And Gmail To Gcal</title><content type='html'>I seem able to hold incredibly large amounts of technical details in my head. In contrast to this, I&#39;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;br /&gt;
&lt;br /&gt;
Being the technophile that I am, I&#39;ve incorporated many electronic assistive technologies into my life. In 1989 I got my first &lt;a href=&quot;http://en.wikipedia.org/wiki/Personal_digital_assistant&quot;&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;br /&gt;
&lt;br /&gt;
My newest electronic assistive technology is a rather complete phone and SMS management system. Its features are:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I have a permanent record of every incoming or outgoing call or SMS.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;My mobile phone rings whenever I get an incoming call or SMS.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;My home phone rings whenever I get a call.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;My mobile rings and gives me a notification whenever I get a call or SMS.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;My computer rings and gives me a pop-up whenever I get a call or SMS.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&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;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/125065584382487015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2012/03/automatefd-gvoice-and-gmail-to-gcal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/125065584382487015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/125065584382487015'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2012/03/automatefd-gvoice-and-gmail-to-gcal.html' title='Automatefd Gvoice And Gmail To Gcal'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-6773951459413523720</id><published>2012-02-15T16:45:00.000-08:00</published><updated>2013-03-12T16:46:59.591-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging-tech"/><category scheme="http://www.blogger.com/atom/ns#" term="nanoblogger"/><category scheme="http://www.blogger.com/atom/ns#" term="tech"/><title type='text'>Blog In A Box (actually, a repo)</title><content type='html'>&lt;br /&gt;
&lt;p&gt;As I have been developing my blog&#39;s technology, I have been surprised at the lack of a pre-packaged &lt;a href=&quot;http://en.wikipedia.org/wiki/Blog&quot;&gt;blogging&lt;/a&gt; solution for &lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt;&#39; &lt;a href=&quot;http://orgmode.org/&quot;&gt;Org Mode&lt;/a&gt;. Org Mode is simply a wonderful tool for organizing thoughts, ideas, text, links, etc&amp;hellip; While Org Mode has a rather difficult learning curve, its motto, &lt;i&gt;Your life in plain text.&lt;/i&gt;, seems to be accurate.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Spurred by ideas from &lt;a href=&quot;http://decafbad.com&quot;&gt;0xDECAFBAD.com&lt;/a&gt; and code from &lt;a href=&quot;http://nanoblogger.sourceforge.net/&quot;&gt;NanoBlogger&lt;/a&gt; (NB), I&#39;ve gone about creating an Org Mode-based blogging system. And, if you are reading this, it is actually working. While NB and Org Mode do all the heavy lifting, I&#39;ve simply added some glue to hook them together. What I have is far from a perfect solution, but it seems to work pretty well. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;There is a bit of a UI problem in that the Org Mode editing has a general look-and-feel like that seems like a typical Org Mode editor with a NanoBlogger posting jammed in. That&#39;s not surprising as, to save development time, I&#39;ve basically just jammed a NanoBlogger posting into an Org Mode buffer.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The other problem that I have with the system is that there is no way to automatically detect the difference between postings that have been published and those that have not published (ie: drafts). Unless you take extra care when publishing your blog, all postings, whether or not they are drafts, will be posted.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Once I&#39;ve fixed these two problems I will have a simple but reasonably functional blog system. By &quot;simple&quot; I mean that it is based off of NanoBlogger, a minimal blogging platform. That being said, the &lt;a href=&quot;http://nanoblogger.sourceforge.net/&quot;&gt;goals&lt;/a&gt; of NB are simple goals compared to most blogging systems. If you want a richer blogging system then NB isn&#39;t for you.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The &lt;i&gt;glue&lt;/i&gt; that I&#39;ve written to connect NB with Org Mode is a shell script and some &lt;a href=&quot;http://en.wikipedia.org/wiki/Elisp&quot;&gt;elisp&lt;/a&gt; code. Combined they are only a few hundred lines of extensively-commented code. The entire NanoBlogger installation, living up to its name, is only 844K. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Being that NB is so very compact, my shell scripts and elisp code are small, everything is in plain text files, and that &lt;a href=&quot;http://github.com&quot;&gt;Github&lt;/a&gt; provides simple and free hosting of both the blogging system and the blog, I&#39;m going to merge my entire blogging system, minus Emacs, with my blog and put it into a single Github repository. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Once that is done, anyone who wants to try my blogging technology should only have to do a few simple steps:&lt;br /&gt;
  # Fork my blog to their own Github repository.&lt;br /&gt;
  # Clone their copy of my blog to their computer.&lt;br /&gt;
  # Delete my blog postings (I&#39;m assuming people will want to create their own postings and not republish mine).&lt;br /&gt;
  # Run emacs and load the single elisp glue file I&#39;ve created.&lt;br /&gt;
  # Start blogging.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I believe that it will take less than 10 minutes to get a blog up-and-running. That is longer than it takes to get a hosted blog on &lt;a href=&quot;http://www.blogger.com&quot;&gt;Blogger&lt;/a&gt; but much, much faster than most self-hosted mechanisms such as &lt;a href=&quot;http://www.movabletype.com/&quot;&gt;MovableType&lt;/a&gt;. The only prerequisites for this blogging system are&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Bash and the other common shell script utilities that are required by NanoBlogger such as sed and awk.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;A reasonably modern GNU Emacs. It comes with Org Mode pre-installed.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;i&gt;git&lt;/i&gt; command-line program.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Being that this blogging system is only aimed at Emacs users, it is certain that they&#39;ll have Emacs already installed on their machine. It is also very likely that they&#39;ll have bash and the shell script utilities. Maybe they&#39;ll have git or maybe they&#39;ll need to install it. It is a simple installation.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;There is no need to install a local web server for staging. Provided you have versions from this decade, there is no need to ensure you have the right version of any of this software. Managing versions of installed software can be a major pain for many systems (eg: Python based-apps). You also have full access to your blog&#39;s data without having to export anything (everything is already in plain text files) or provide a credit card (Github is free).&lt;br /&gt;
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/6773951459413523720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2012/02/blog-in-box-actually-repo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/6773951459413523720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/6773951459413523720'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2012/02/blog-in-box-actually-repo.html' title='Blog In A Box (actually, a repo)'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-1797764188970681244</id><published>2012-02-14T16:33:00.000-08:00</published><updated>2013-03-12T16:37:15.157-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging-tech"/><category scheme="http://www.blogger.com/atom/ns#" term="nanoblogger"/><category scheme="http://www.blogger.com/atom/ns#" term="tech"/><title type='text'>My New Blogging Technology</title><content type='html'>As I&#39;ve discussed in previous &lt;a href=&quot;http://www.neilsmithline.com/archives/blog&quot;&gt;postings about this blog&#39;s technology&lt;/a&gt;, this is a static blog written with NanoBlogger. NanoBlogger is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Command-line_interface&quot;&gt;CLI&lt;/a&gt; driven blogging system. Alas, I have found the &lt;a href=&quot;http://nanoblogger.sourceforge.net/docs/nanoblogger.html&quot;&gt;NanoBlogger manual&lt;/a&gt; to be difficult to follow and the syntax of the CLI to be non-intuitive. (See the footnote &lt;a href=&quot;https://github.com/Neil-Smithline/nbc&quot;&gt;here&lt;/a&gt; regarding the existing CLI.) On the upside, NanoBlogger is a CLI system which makes it easy to modify. &lt;br /&gt;
&lt;br /&gt;
I started out with a few small helper scripts, eventually merging them into a single helper script. As I was using that script and learning more about NanoBlogger, I found myself writing smaller helper scripts for my big helper script. Eventually, I was never calling my original, large helper script directly.&lt;br /&gt;
&lt;br /&gt;
At this point it became clear that some refactoring was needed. So I refactored. I came up with a single shell script call &lt;i&gt;nbc.sh&lt;/i&gt; that does all the work and a series of shell scripts that simply call nbc.sh.&lt;br /&gt;
&lt;br /&gt;
The key idea behind nbc.sh, or simply &lt;i&gt;nbc&lt;/i&gt;, is that the scripts that call it are trivial. By &quot;trivial&quot; I mean that each script is only a few lines long, all the side scripts have identical content, and, if not for the semantics of &lt;a href=&quot;http://en.wikipedia.org/wiki/Git_(software)&quot;&gt;Git&lt;/a&gt;, would simply be multiple symbolic links to the same program.&lt;br /&gt;
&lt;br /&gt;
As you can see below, the code for the side scripts simply stores the command name, &lt;i&gt;$0&lt;/i&gt;, of the side script that was called and then calls the &lt;i&gt;nbc.sh&lt;/i&gt; script that is in the same directory as the side script. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;#!/bin/sh

# Code to load include file.
ORIG_ARG_0=&quot;$0&quot;
NBDIR=${0%/*}
. ${NBDIR}/nbc.sh
&lt;/pre&gt;&lt;br /&gt;
This means that as I continue to add functionality to nbc, all I need to do is copy one of the side scripts to the filename of the new command I added. &lt;br /&gt;
&lt;br /&gt;
While I won&#39;t discuss the exact naming scheme used for these side scripts in detail in this posting, I will say that I have tried to systematic in how the scripts are named. Once you learn a few abbreviations (eg: &quot;e&quot; for &quot;Entry&quot; or &quot;Entries&quot;, &quot;u&quot; for &quot;Update&quot;) and the rules for combining those abbreviations (standard &lt;a href=&quot;http://en.wikipedia.org/wiki/Reverse_Polish_Notation&quot;&gt;RPN&lt;/a&gt;), you will know the names of all the commands, what each command does, and the type and order of arguments each command takes.&lt;br /&gt;
&lt;br /&gt;
I still need to write richer documentation for nbc and its side scripts, but I can finish this posting off with some concrete examples.&lt;br /&gt;
&lt;br /&gt;
NB supports an &quot;update&quot; command that essentially tells NB to rebuild the blog from scratch. The syntax of this command is:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;nb update
&lt;/pre&gt;&lt;br /&gt;
My nbc version of this command is:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;nbu
&lt;/pre&gt;&lt;br /&gt;
All of the commands for nbc start with the letters &quot;nb&quot;. The letter &quot;U&quot; is the abbreviation for &quot;Update&quot;. So &quot;nbu&quot; tells nb to run the update command. As I said, the code for nbu and the other side scripts are trivial and given above. As far as examples go, nbu is not very exciting. But the nbc&#39;s CLI for creating tags is a bit more exciting.&lt;br /&gt;
&lt;br /&gt;
NB&#39;s syntax for creating tags, as documented in its manual, is:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;nb --title &amp;lt;tag-name&amp;gt; add tag
&lt;/pre&gt;&lt;br /&gt;
Gosh! That&#39;s both tough to remember and tough to type. In nbc, the command for adding a tag is &lt;i&gt;nbga&lt;/i&gt;. All commands start with &quot;nb&quot;. After that, the &quot;g&quot; means that we are talking about &quot;taGs&quot;. The &quot;a&quot; stands for &quot;Add&quot;. The syntax for the command is &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;nbga &amp;lt;tag list&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Besides being much easier to type and remember, it allows a tag list as compared to a single tag name. That is, you can create multiple tags in a single command rather than needing to call nb once for each new tag.&lt;br /&gt;
&lt;br /&gt;
In NBC, a tag list is a comma-separated list of one or more tag names. So &quot;tag1&quot; is a tag list and &quot;tag1,tag2,tag3&quot; is also a tag list. If you prefer you can space-separate the tag list but you need to ensure that you pass the entire tag list as the first argument to nbga. &lt;br /&gt;
&lt;br /&gt;
As the operations become more complex, NBC&#39;s simplifications become greater and more obvious. My next posting about NBC will discuss some of these simplifications.&lt;br /&gt;
&lt;br /&gt;
If you wish to use NBC, look at the source code, or tell me why NBC sucks, you can get the scripts at &lt;a href=&quot;https://github.com/Neil-Smithline/nbc&quot;&gt;https://github.com/Neil-Smithline/nbc&lt;/a&gt;.&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/1797764188970681244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2012/02/as-ive-discussed-in-previous-postings.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/1797764188970681244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/1797764188970681244'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2012/02/as-ive-discussed-in-previous-postings.html' title='My New Blogging Technology'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-9197284606453501725</id><published>2012-02-03T16:42:00.000-08:00</published><updated>2013-03-12T16:44:14.740-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging-tech"/><category scheme="http://www.blogger.com/atom/ns#" term="tech"/><title type='text'>This Blog Is Now Hosted For Free (and it&#39;s slashdot proof too)</title><content type='html'>&lt;br /&gt;
While there are many free or nearly free blog hosting sites available, most of them come with a long list of restrictions. Either they restrict you to using their blogging software, throw ads on your pages, give you the &quot;unlimited bandwidth&quot; plan that they&#39;ll cut off if your site gets too much traffic, limit you to only the ugly themes, etc.&lt;br /&gt;
&lt;br /&gt;
But &lt;a href=&quot;http://www.neilsmithline.com/&quot;&gt;www.neilsmithline.com&lt;/a&gt; is now hosted on a site that charges me nothing, doesn&#39;t put ads on my pages, couldn&#39;t care less about the theme I use, and, should I ever be lucky enough, survive &lt;a href=&quot;http://en.wikipedia.org/wiki/Slashdotting&quot;&gt;slashdotting&lt;/a&gt;. The only restriction is that my blog has to be static. Being that I already had a static blog (see &lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=5540414336321135811#about-this-blogs-tech.org&quot;&gt;previous posting&lt;/a&gt;), this was no problem for me at all. I&#39;ve used lots of dynamic blogs (&lt;a href=&quot;http://en.wikipedia.org/wiki/Drupal&quot;&gt;Drupal&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Wordpress&quot;&gt;WordPress&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Joomla&quot;&gt;Joomla&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Blogger_(service)&quot;&gt;Blogger&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Movable_Type&quot;&gt;Movable Type&lt;/a&gt;, etc.) and just found that &quot;dynamic&quot; is a short way of saying that the blogging system is going to do what it wants and not what I want.&lt;br /&gt;
&lt;br /&gt;
Along with the free hosting I get automatic version control, well-managed collaboration (not that I have any collaborators), data redundancy, eternal archiving (I probably won&#39;t need it that long but it&#39;s nice to know that nothing will get lost), and the ability to get a copy of my data onto my local machine whenever I want it.&lt;br /&gt;
&lt;br /&gt;
My choice of blogging technology was largely influenced by these two blog postings, &lt;a href=&quot;http://decafbad.com/blog/2011/06/08/further-jekyll-notes&quot;&gt;1&lt;/a&gt; and &lt;a href=&quot;http://decafbad.com/blog/2011/06/08/moved-to-jekyll&quot;&gt;2&lt;/a&gt;, and email conversations I had with their author, &lt;a href=&quot;https://plus.google.com/114487965928288927815/about&quot;&gt;Les Orchard&lt;/a&gt;. While Les went with &lt;a href=&quot;https://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt;, I preferred the simpler &lt;a href=&quot;http://nanoblogger.sourceforge.net/&quot;&gt;NanoBlogger&lt;/a&gt;. Les uses &lt;a href=&quot;http://github.com/&quot;&gt;Github.com&lt;/a&gt; for versioning his blog but hosts his blog on his own site as he wants full control of what is published. I simply couldn&#39;t agree with him more. &lt;br /&gt;
&lt;br /&gt;
When I moved to my new blogging framework, I quickly got my blog up and running using NanoBlogger for site generation and sftp to publish it to my VPS. Today I investigated replacing sftp with Github and its notification framework. This would essentially mirror Les&#39;s blog system except that I am running NanoBlogger locally while he runs Jekyll. &lt;br /&gt;
&lt;br /&gt;
As I was investigating using Github for transportation and archiving of my blog, I decided to take another look at &lt;a href=&quot;http://pages.github.com/&quot;&gt;Github Pages&lt;/a&gt;. And then, like a lightning bolt, it occurred to me. When I publish my blog by pushing it to Github, if the repository has the magic name of &lt;i&gt;neil-smithline.github.com&lt;/i&gt;, then Github would publish my blog at &lt;a href=&quot;http://neil-smithline.github.com/&quot;&gt;http://neil-smithline.github.com/&lt;/a&gt; automatically. There simply was no benefit to serve my blog from my VPS as Github would do it far better than I could on my VPS.&lt;br /&gt;
&lt;br /&gt;
The only problem I foresee is that I run more than just my blog on &lt;a href=&quot;http://www.nelismithline.com/&quot;&gt;www.neilsmithline.com&lt;/a&gt;. But the other applications I run are only for my private use so I can just map them to another sub-domain such as &lt;i&gt;whatever.neilsmithline.com&lt;/i&gt;. For example, I&#39;ve been playing with a cloud-based bookmarking system, &lt;a href=&quot;http://www.phoboslab.org/projects/asaph&quot;&gt;Asaph&lt;/a&gt;, that allows you to run your own cloud bookmark server. But I can access it at and, if you have an interest, can view it at: &lt;a href=&quot;http://www2.neilsmithline.com/asaph/&quot;&gt;http://www2.neilsmithline.com/asaph/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
All-in-all, it&#39;s like a nerd&#39;s dream come true :-D&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UPDATED: Sat Feb 11 13:12:02 EST 2012&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
There seems to be another problem with hosting my blog on Github. While practically all of Github requires SSL, there appears to be no way to get a Github hosted website to use SSL. Thinking about it, the task seems inherently difficult. Github makes all of its sources file public but you must protect your site&#39;s SSL private key. Currently, all site information is stored in the Github repository. A private SSL key could only be added if Github updated their configuration to allow the key to be stored out-of-band (ie: not in the repository).</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/9197284606453501725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2012/02/this-blog-is-now-hosted-for-free-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/9197284606453501725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/9197284606453501725'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2012/02/this-blog-is-now-hosted-for-free-and.html' title='This Blog Is Now Hosted For Free (and it&#39;s slashdot proof too)'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-8012698988996136124</id><published>2012-02-01T16:52:00.000-08:00</published><updated>2013-03-12T16:55:50.184-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="tech"/><title type='text'>Nastiest Hack I&#39;ve Seen In Awhile</title><content type='html'>&lt;br /&gt;
&lt;p&gt;I was reading about &lt;a href=&quot;http://code.google.com/p/android-scripting&quot;&gt;SL4A&lt;/a&gt;, also known as &lt;a href=&quot;http://android.com&quot;&gt;Android&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Scripting_language&quot;&gt;Scripting Languages&lt;/a&gt;. They are a set of &lt;a href=&quot;http://en.wikipedia.org/wiki/Quick_and_dirty&quot;&gt;quick-and-dirty&lt;/a&gt; ports of programming languages to the Android that interact with the Android &lt;a href=&quot;http://en.wikipedia.org/wiki/Operating_system&quot;&gt;OS&lt;/a&gt;. I just stumbled upon this &quot;&lt;a href=&quot;http://code.google.com/p/android-scripting/issues/detail?id=184&quot;&gt;issue page&lt;/a&gt;&quot; (it&#39;s more like a &lt;a href=&quot;http://en.wikipedia.org/wiki/Internet_forum&quot;&gt;forum&lt;/a&gt; than a bug report). &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The developer is trying to run something on his Android, which is basically &lt;a href=&quot;http://en.wikipedia.org/wiki/Linux&quot;&gt;Linux&lt;/a&gt;, that requires &lt;a href=&quot;http://en.wikipedia.org/wiki/Superuser&quot;&gt;superuser&lt;/a&gt; permissions. As the responses started to build upon each other, one user suggested starting his shell script with the following lines (the actual posting was in Android&#39;s flavor of &lt;a href=&quot;http://en.wikipedia.org/wiki/Python_(programming_language)&quot;&gt;Python&lt;/a&gt; but I&#39;ve converted it to &lt;a href=&quot;http://linux.die.net/man/1/su&quot;&gt;bash(1)&lt;/a&gt; to make it more accessible):&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;src src--n&quot;&gt;#!/bin/sh
if [ &lt;span style=&quot;background-color: #228800;&quot;&gt;&quot;$USER&quot;&lt;/span&gt; != &lt;span style=&quot;background-color: #228800;&quot;&gt;&quot;root&quot;&lt;/span&gt; ]; then
    exec sudo $SHELL -c &lt;span style=&quot;background-color: #228800;&quot;&gt;&quot;`cat /proc/$$/cmdline | tr &#39;\000&#39; &#39; &#39;`&quot;&lt;/span&gt; root
fi
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I simply couldn&#39;t help being entertained at how revolting but equally brilliant that code is. But, I started thinking (always something dangerous) about how much I hate having to deal with stupid commands. For example, this is the output of running &lt;a href=&quot;http://linux.die.net/man/8/apt-get&quot;&gt;apt-get(8)&lt;/a&gt; without proper permission:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;example&quot;&gt;$ apt-get install foobar
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Being as I often write shell scripts with calls to &lt;a href=&quot;http://linux.die.net/man/8/sudo&quot;&gt;sudo(8)&lt;/a&gt; in the script, I decided that imitation is the best response to being revolted (I know my mom said something like that :-).&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So I expanded upon the existing code, making it a full shell script utility. You can look the code or grab a copy at my &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; &lt;a href=&quot;https://github.com/Neil-Smithline&quot;&gt;page&lt;/a&gt; in the &lt;a href=&quot;https://github.com/Neil-Smithline/rerunasroot&quot;&gt;rerunasroot&lt;/a&gt; repository. I&#39;ll be using it in the future.&lt;br /&gt;
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/8012698988996136124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2012/02/nastiest-hack-ive-seen-in-awhile.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/8012698988996136124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/8012698988996136124'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2012/02/nastiest-hack-ive-seen-in-awhile.html' title='Nastiest Hack I&#39;ve Seen In Awhile'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-3633686098000909587</id><published>2011-12-10T16:38:00.000-08:00</published><updated>2013-03-12T16:41:58.196-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging-tech"/><category scheme="http://www.blogger.com/atom/ns#" term="nanoblogger"/><category scheme="http://www.blogger.com/atom/ns#" term="tech"/><title type='text'>Seems It Really Works</title><content type='html'>&lt;br /&gt;
Well, it appears this actually does work. I seem to be having a few&lt;br /&gt;
issues integrating with &lt;a href=&quot;http://nanoblogger.sourceforge.net/&quot;&gt;NanoBlogger&lt;/a&gt; but I&#39;m sure I&#39;ll work those out.&lt;br /&gt;
The problems that I&#39;ve seen are:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;It seems that adding or even updating a new entry is as costly&lt;br /&gt;
as rebuilding the entire blog from scratch. Right now, that&#39;s&lt;br /&gt;
OK. But what am I going to do when I have 10, or 100 postings?&lt;br /&gt;
I hope NanoBlogger can handle this.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;NB seems to assume that its input files are hand-written in&lt;br /&gt;
some legacy text editor called &lt;a href=&quot;http://www.vim.org/&quot;&gt;Vim&lt;/a&gt; or something :-). While my&lt;br /&gt;
strategy of using &lt;a href=&quot;http://www.gnu.org/s/emacs/&quot;&gt;GNU Emacs&lt;/a&gt;&#39; &lt;a href=&quot;http://orgmode.org/&quot;&gt;Org Mode&lt;/a&gt; keeps the flavor of NB in&lt;br /&gt;
that it is written in a simple markup language, it doesn&#39;t seem&lt;br /&gt;
to fit the NB model perfectly. There is nothing wrong with NB&#39;s&lt;br /&gt;
markup, it is just that Org Mode&#39;s markup can easily be&lt;br /&gt;
exported to virtually every other markup on the planet. So I&lt;br /&gt;
just need to learn Org Mode markup, write my content in Org&lt;br /&gt;
Mode, and then publish that data into whatever format I choose.&lt;br /&gt;
Seems a better solution but NB isn&#39;t quite prepared for it.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;I would still like better integration with Org Mode and NB. The&lt;br /&gt;
steps I&#39;ve used to produce this entry are:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Ran a little shell script I wrote to create a new NB&lt;br /&gt;
entry. All I do is give the shell script the title of the&lt;br /&gt;
Org Mode file I want to store the new entry in and it&lt;br /&gt;
does its magic, leaving me with an Org Mode skeleton for&lt;br /&gt;
NB.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Edit the Org Mode file just created.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Use Org Mode to publish the entry. This just stores it in&lt;br /&gt;
my local NB folder.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;nb update&lt;/code&gt; to have my changes put into the local&lt;br /&gt;
copy of the blog.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;nb preview&lt;/code&gt; to view the changes before publishing.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;nb publish&lt;/code&gt; to update my blog.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
So, while they&#39;re are still some problems,  I have to say I love it.&lt;br /&gt;
The advantages of using Org Mode and the simple NB blogging engine on&lt;br /&gt;
both my local and production server is way cool.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://orgmode.org/&quot;&gt;Org Mode&lt;/a&gt; is actually way cool. I&#39;ve only started using it in the past&lt;br /&gt;
year and will likely spend years learning it as it supports so many&lt;br /&gt;
features. But, like all well-designed pieces of software, you don&#39;t&lt;br /&gt;
need to learn it all at once. I&#39;ll yabber about Org Mode another day.&lt;br /&gt;
In any case, I&#39;m real happy with my blog and the ease with which I can&lt;br /&gt;
add postings to it.</content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/3633686098000909587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2011/12/seems-it-really-works.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/3633686098000909587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/3633686098000909587'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2011/12/seems-it-really-works.html' title='Seems It Really Works'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5540414336321135811.post-1302008853816196008</id><published>2011-12-07T16:27:00.000-08:00</published><updated>2013-03-12T16:38:16.445-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging-tech"/><category scheme="http://www.blogger.com/atom/ns#" term="nanoblogger"/><category scheme="http://www.blogger.com/atom/ns#" term="tech"/><title type='text'>New NanoBlogger Command-Line</title><content type='html'>&lt;br /&gt;
My hope is that I can write this entry in &lt;a href=&quot;http://www.gnu.org/s/emacs/&quot;&gt;GNU Emacs&lt;/a&gt;&#39; &lt;a href=&quot;http://orgmode.org/&quot;&gt;Org Mode&lt;/a&gt; and have it auto-published into this &lt;a href=&quot;http://www.neilsmithline.com/&quot;&gt;blog&lt;/a&gt;. If you are reading this, then I have succeeded.&lt;br /&gt;
&lt;br /&gt;
This is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Website#Static_website&quot;&gt;static blog&lt;/a&gt;. That is, the server side is all &lt;a href=&quot;http://en.wikipedia.org/wiki/HTML&quot;&gt;HTML&lt;/a&gt;. It can be served by virtually any web server. This makes it incredibly convenient for testing and deploying. When I am writing blog entries, I&#39;m just typing in Emacs. I then save the entries and use Org Mode plus some personalized tweaks to &lt;a href=&quot;http://orgmode.org/org.html#Publishing&quot;&gt;publish&lt;/a&gt; them to a local directory as something close to HTML.&lt;br /&gt;
&lt;br /&gt;
These HTMLish files are then fed into &lt;a href=&quot;http://nanoblogger.sourceforge.net/&quot;&gt;NanoBlogger&lt;/a&gt;. NanoBlogger is the magic tool that turns a few HTMLish files into a fully functional website. NanoBlogger accepts HTML for the text af entries but wants some simply formatted &lt;a href=&quot;http://en.wikipedia.org/wiki/Metadata&quot;&gt;metadata&lt;/a&gt; added to the file.&lt;br /&gt;
&lt;br /&gt;
The Metadata is needed to help NanoBlogger out because, as its name implies, is a teeny-tiny blog engine. As a comparison, my installation of NanoBlogger is 768K (yes, that&#39;s &quot;K&quot;). I also have installations of Drupal at (14M) and Joomla (107M). &lt;br /&gt;
&lt;br /&gt;
The &lt;a href=&quot;http://en.wikipedia.org/wiki/.txt&quot;&gt;.txt&lt;/a&gt; source for each NanoBlogger posting is a file with the body of the entry in HTML embedded but all the cruft that tends to come before and after the body of a web page is simply not there. The easiest way to get an understanding of it is to view the &lt;a href=&quot;http://nanoblogger.sourceforge.net/articles/example.txt&quot;&gt;metadata source&lt;/a&gt; for this &lt;a href=&quot;http://nanoblogger.sourceforge.net/articles/example/&quot;&gt;sample posting&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
So you&#39;re saying &quot;Big deal.&quot; or &quot;Who needs yet another file format?&quot; But it is a big deal. What most &lt;a href=&quot;http://en.wikipedia.org/wiki/Younglings#Ranks_of_Jedi&quot;&gt;younglings&lt;/a&gt; have never learned is that &lt;a href=&quot;http://en.wikipedia.org/wiki/WYSIWYG&quot;&gt;WYSIWYG&lt;/a&gt; is a distraction from actual content production. Content production is not the same as formatting and editing and, at least in my experience, uses very different parts of the brain. So the less formatting you do while producing content, the better your content will be (at least if you have my brain :-).&lt;br /&gt;
&lt;br /&gt;
While it has largely been lost with the popularization of the &lt;a href=&quot;http://wikipedia.org/&quot;&gt;Wikipedia&lt;/a&gt;, initially, &lt;a href=&quot;http://en.wikipedia.org/wiki/Wikipedia:Cheatsheet&quot;&gt;Wiki markup&lt;/a&gt; was intended to simplify editing but also served to separate the content production from formatting. While NanoBlogger expects these HTMLish files as input, it is designed to generate them from any number of simpler input formats.&lt;br /&gt;
&lt;br /&gt;
These simpler input formats are quite unlike HTML as they are, well they&#39;re simpler. The default input format is the rather famous &lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;Markdown&lt;/a&gt; though many other formats are supported by NanoBlogger or the community. This &lt;a href=&quot;http://www.lifehack.org/articles/productivity/use-markdown-for-easy-web-writing.html&quot;&gt;article&lt;/a&gt; seems to do a good job explaining the benefits of simple languages such as Markdown.&lt;br /&gt;
&lt;br /&gt;
It took me but a few hours to create a converter for &lt;a href=&quot;http://www.gnu.org/s/emacs/&quot;&gt;GNU Emacs&lt;/a&gt;&#39; &lt;a href=&quot;http://orgmode.org/&quot;&gt;Org Mode&lt;/a&gt; to NanoBlogger.&lt;br /&gt;
&lt;br /&gt;
While not nearly as &lt;a href=&quot;http://en.wikipedia.org/wiki/Cool_(aesthetic)&quot;&gt;cool&lt;/a&gt; as what I&#39;ve discussed above NanoBlogger has yet another advantage: it produces a static site. On my local machine (&lt;a href=&quot;http://support.apple.com/kb/SP546&quot;&gt;17&quot; MacBook Pro&lt;/a&gt;), I can view the entire site without running a &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_server&quot;&gt;web server&lt;/a&gt;. I simply go to &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_server&quot;&gt;Firefox&lt;/a&gt; (actually &lt;a href=&quot;http://www.mozilla.org/en-US/firefox/aurora/&quot;&gt;Firefox Aurora&lt;/a&gt;) and visit the &lt;a href=&quot;http://en.wikipedia.org/wiki/URL&quot;&gt;URL&lt;/a&gt;, specifically, the &lt;a href=&quot;http://en.wikipedia.org/wiki/File_url&quot;&gt;file URL&lt;/a&gt; of my blog. For me, I visit &lt;code&gt;file://Users/neil/www-nb&lt;/code&gt;, and then I can see my entire blog through the magic of a static websites, &lt;a href=&quot;http://en.wikipedia.org/wiki/File_url&quot;&gt;file URLs&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Relative_URL#Absolute_and_relative_URLs&quot;&gt;relative URLs&lt;/a&gt;. </content><link rel='replies' type='application/atom+xml' href='http://www.neilsmithline.com/feeds/1302008853816196008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.neilsmithline.com/2011/12/my-hope-is-that-i-can-write-this-entry.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/1302008853816196008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5540414336321135811/posts/default/1302008853816196008'/><link rel='alternate' type='text/html' href='http://www.neilsmithline.com/2011/12/my-hope-is-that-i-can-write-this-entry.html' title='New NanoBlogger Command-Line'/><author><name>Neil Smithline</name><uri>http://www.blogger.com/profile/04483184531065457561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>