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

<channel>
	<title>Craig&#039;s Linked List</title>
	<atom:link href="http://www.craigslinkedlist.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.craigslinkedlist.com</link>
	<description>Casual Software Encounters</description>
	<lastBuildDate>Sat, 10 Jul 2010 20:13:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Play-By-Play: Layout</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-layout/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-layout/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 20:09:24 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=455</guid>
		<description><![CDATA[I want to use HAML for my templates. I already have it installed; all I need to do now is convert the scaffolded ERB layout. html2haml app/views/layouts/application.html.erb app/views/layouts/application.haml One other thing I like to do is have the &#60;title&#62; and topmost &#60;h1&#62; tags have the same content. This is generally considered (by the SEO black-magicians) [...]]]></description>
				<content:encoded><![CDATA[<p>I want to use <a href="http://haml-lang.com/">HAML</a> for my templates. I already have it installed; all I need to do now is convert the scaffolded ERB layout.</p>
<pre>
html2haml app/views/layouts/application.html.erb app/views/layouts/application.haml
</pre>
<p>One other thing I like to do is have the &lt;title&gt; and topmost &lt;h1&gt; tags have the same content. This is generally considered (by the SEO black-magicians) to be good SEO practice. It&#8217;s easily achieved by having a  @page_title variable set by each view, and then by having the layout display it in title and header.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-layout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play-By-Play: Heroku Setup</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-heroku-setup/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-heroku-setup/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 20:02:30 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=452</guid>
		<description><![CDATA[Setting up the project is easy enough: heroku create softcraft-bakery Heroku creates a git repo for each project. I want to keep my main git repo on github. Add the heroku remote: git remote add heroku git@heroku.com:softcraft-bakery.git git push heroku master That gives me: -----> Heroku receiving push ! Heroku push rejected, no Rails or [...]]]></description>
				<content:encoded><![CDATA[<p>Setting up the project is easy enough:</p>
<pre>
heroku create softcraft-bakery
</pre>
<p>Heroku creates a git repo for each project. I want to keep my main git repo on github. </p>
<p>Add the heroku remote:</p>
<pre>
  git remote add heroku git@heroku.com:softcraft-bakery.git
  git push heroku master
</pre>
<p>That gives me:</p>
<pre>
-----> Heroku receiving push
 !     Heroku push rejected, no Rails or Rack app detected.
</pre>
<pre>
This is caused by rails files being in a subdirectory of my git project. I don't want to mess around trying to figure out how to support an unexpected configuration, so I'll move everything up a level:
<p>
rm README
rm .gitignore
git mv bakery/* .
git commit -a -m "Moved rails files up a level"

git push heroku
</p>
Output:
<p>
-----> Heroku receiving push
-----> Gemfile detected, running Bundler
-----> Bundler works best on the Bamboo stack.  Please migrate your app:

http://docs.heroku.com/bamboo

       Unresolved dependencies detected; Installing...
       Fetching source index from http://rubygems.org/
       Resolving dependencies
       Installing abstract (1.0.0) from system gems 
       Installing actionmailer (3.0.0.beta3) from rubygems repository at http://rubygems.org/ /usr/local/lib/ruby/site_ruby/1.8/rubygems/installer.rb:186:in `install': actionmailer requires Ruby version >= 1.8.7 (Gem::InstallError)
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/source.rb:42:in `install'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/installer.rb:30:in `run'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/installer.rb:18:in `each'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/installer.rb:18:in `run'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/installer.rb:6:in `install'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/cli.rb:60:in `install'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/vendor/thor/task.rb:33:in `send'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/vendor/thor/task.rb:33:in `run'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/vendor/thor/invocation.rb:109:in `invoke'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/vendor/thor/invocation.rb:116:in `call'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/vendor/thor/invocation.rb:116:in `invoke'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/vendor/thor.rb:137:in `start'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/vendor/thor/base.rb:378:in `start'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/lib/bundler/vendor/thor.rb:124:in `start'
       	from /usr/local/lib/ruby/gems/1.8/gems/bundler-0.9.9/bin/bundle:11
       	from /usr/local/bin/bundle:19:in `load'
       	from /usr/local/bin/bundle:19
       FAILED: Have you updated to use a 0.9 Gemfile?

http://docs.heroku.com/gems#gem-bundler

</p>
Now I have to set the Heroku "stack" (runtime environment &#038; versions):
</pre>
<pre>
heroku stack:migrate bamboo-ree-1.8.7
</pre>
<p><a href="http://softcraft-bakery.heroku.com/">Success! </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-heroku-setup/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Play-by-Play: Rails Setup</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-rails-setup/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-rails-setup/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 05:32:53 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=449</guid>
		<description><![CDATA[I still don&#8217;t have an official name for this project, so I&#8217;ll call it &#8220;bakery&#8221; in the interim. rails bakery git add bakery git commit -a -m "Basic Rails install" rails server This is new: there&#8217;s a single execution point for rails tasks. It&#8217;s nice to not have to type script/... all the time Fire [...]]]></description>
				<content:encoded><![CDATA[<p>
I still don&#8217;t have an official name for this project, so I&#8217;ll call it &#8220;bakery&#8221; in the interim.</p>
<pre>
rails bakery
git add bakery
git commit -a -m "Basic Rails install"
rails server
</pre>
<p>This is new: there&#8217;s a single execution point for rails tasks. It&#8217;s nice to not have to type <code>script/...</code> all the time
</p>
<p>
Fire up http://0.0.0.0:3000/ and see that it&#8217;s working.
</p>
<h2>Gem Updates</h2>
<p>
Update <a href="http://haml-lang.com/">haml</a>/<a href="http://sass-lang.com/">sass</a>:</p>
<pre>
sudo gem update haml
</pre>
<p>Add &#8220;gem haml&#8221; to Gemfile (another new feature).
</p>
<p>
Update Ryan Bates&#8217; <a href="http://github.com/ryanb/nifty-generators">Nifty Generators</a>. They&#8217;re nifty. Especially when generating.</p>
<pre>
sudo gem install nifty-generators
</pre>
<p>Add &#8220;gem nifty-generators&#8221; to the Gemfile.
</p>
<p>
Also update <code>autotest</code> and <code>shoulda</code>
</p>
<h2>Hello World</h2>
<p>
Time to get a Hello World going. It&#8217;s not working until I see Hello World.
</p>
<p>
First, unpack the gems. How do I do that again?</p>
<pre>
rake -T gem
/Users/craig/Documents/SoftCraft/projects/bakery/rails/bakery/db/schema.rb doesn't exist yet. Run "rake db:migrate" to create it then try again. If you do not intend to use a database, you should instead alter /Users/craig/Documents/SoftCraft/projects/bakery/rails/bakery/config/boot.rb to limit the frameworks that will be loaded
</pre>
<p>Fair enough.</p>
<pre>
rake db:migrate
(in /Users/craig/Documents/SoftCraft/projects/bakery/rails/bakery)
</pre>
<pre>
rake -T gem
(in /Users/craig/Documents/SoftCraft/projects/bakery/rails/bakery)
rake rails:freeze:gems  # The rails:freeze:gems is deprecated, please use bundle install instead
</pre>
<p>More Rails 3 changes. Looks like <a href="http://yehudakatz.com/2010/04/12/some-of-the-problems-bundler-solves/">freezing isn&#8217;t necessary any more</a>. That&#8217;s good; I never liked it anyway.
</p>
<p>
Now, I need a &#8220;Hello World&#8221; page. That means I need a HomeController for the root route.</p>
<pre>
rails generate controller Home
</pre>
</p>
<p>
Now I need a view. Since Home is a singleton controller, that&#8217;s the <code>show</code> view. Whip up Add <code>views/home/show.haml</code> and dump in <code>Hello World</code>.
</p>
<p>
Now I need a route. In the new Rails 3 routing DSL that&#8217;s done by:</p>
<pre>
root :to => "home#show"
</pre>
</p>
<p>
Lastly, I need to delete <code>public/index.html</code>.
</p>
<p>Hit localhost:3000 and it works!</p>
<h2>Shoulda</h2>
<p>
Looks like <a href="http://groups.google.com/group/shoulda/browse_thread/thread/b2d866fc1574211a">Shoulda isn&#8217;t Rails 3 compatible yet</a>.</p>
<pre>
DEPRECATION WARNING: RAILS_ROOT is deprecated! Use Rails.root instead. (called from join at /Users/craig/.bundle/ruby/1.8/bundler/gems/shoulda-b8b6cad61981d47356de06c2a5586e281938c94e-rails3/lib/shoulda/autoload_macros.rb:40)
/Users/craig/.bundle/ruby/1.8/bundler/gems/shoulda-b8b6cad61981d47356de06c2a5586e281938c94e-rails3/lib/shoulda/autoload_macros.rb:40:in `join': can't convert #<class :0x1ae9718> into String (TypeError)
	from /Users/craig/.bundle/ruby/1.8/bundler/gems/shoulda-b8b6cad61981d47356de06c2a5586e281938c94e-rails3/lib/shoulda/autoload_macros.rb:40:in `autoload_macros'
</class></pre>
</p>
<p>
I go to <a href="http://www.railsplugins.org/plugins/27-shoulda?version_id=302">report this bug</a>. Of course, when I register with RailsPlugins, I get this:</p>
<blockquote><p>
We are sorry to say that something in our code went bang!
</p></blockquote>
<p>Screw it, I&#8217;ll avoid Shoulda in the interim. Instead, I&#8217;ll create a regular Test::Unit controller test.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-rails-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play-by-Play: Ruby, Rails, and Heroku Versions</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-ruby-rails-and-heroku-versions/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-ruby-rails-and-heroku-versions/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 05:09:08 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=445</guid>
		<description><![CDATA[First, update to macports 1.8.2. Ruby Update sudo port install ruby I&#8217;m going to get 1.8.7 p249 p249 &#8220;has marshaling bugs that crash Rails 3.0.0&#8220; Get RVM to help manage the versions. bash < > $HOME/$profile done Is this necessary? Should it be in .bash_profile? (Probably not as it references .bash_profile). I&#8217;m still fairly new [...]]]></description>
				<content:encoded><![CDATA[<p>
First, <a href="http://www.macports.org/install.php ">update to macports 1.8.2</a>.
</p>
<h2>Ruby Update</h2>
<pre>
sudo port install ruby
</pre>
<p>I&#8217;m going to get 1.8.7 p249</p>
<ul>
<li>p249 &#8220;<a href="http://guides.rails.info/3_0_release_notes.html#rails-3-requires-at-least-ruby-187">has marshaling bugs that crash Rails 3.0.0</a>&#8220;</li>
<li>Get <a href="http://rvm.beginrescueend.com/rvm/install/">RVM</a> to help manage the versions.
<pre>
bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
if [[ -s "$HOME/.rvm/scripts/rvm" ]]  ; then source "$HOME/.rvm/scripts/rvm" ; fi
source ~/.rvm/scripts/rvm
rvm notes
</pre>
<p>Add to .profile:</p>
<pre>
for profile in .bash_profile .bashrc ; do echo 'if [[ -s "$HOME/.rvm/scripts/rvm" ]]  ; then source "$HOME/.rvm/scripts/rvm" ; fi' >> $HOME/$profile done
</pre>
<p>Is this necessary? Should it be in .bash_profile? (Probably not as it references .bash_profile). I&#8217;m still fairly new to UNIX and so don&#8217;t know my profile consequences off by heart.
</li>
</ul>
<p>
I&#8217;m not going to get into ruby 1.9 as <a href="http://guides.rails.info/3_0_release_notes.html#upgrading-to-rails-3">Rails 3 isn&#8217;t stable on 1.9.1 (1.9.2 only)</a> and <a href="http://docs.heroku.com/rails3">Heroku only supports 1.9.1</a>.
</p>
<h2>Rails 3</h2>
<p>I&#8217;m preferring Rails 3 as:</p>
<ul>
<li>It&#8217;s definitely the way of the future.
<ul>
<li>There&#8217;s quite a few new APIs &mdash; meaning old ones will be abandoned. Rails doesn&#8217;t sit still.</li>
<li>The API appears to be improved all the way around; it&#8217;s more fun to use.</li>
</ul>
</li>
<li>It should be stable &#038; released by the time I&#8217;m ready to launch.</li>
</ul>
<p>But which ruby version should I be using? All seem to have potential for issues. I&#8217;ll run 1.8.7@249 and see if it works.</p>
<h2>Rubygems</h2>
<p>
RubyGems update, attempt 1:</p>
<pre>
 gem update --system
 Updating RubyGems
 /opt/local/lib/ruby/site_ruby/1.8/rubygems/spec_fetcher.rb:245: [BUG] Segmentation fault
 ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin9]
Abort trap
</pre>
</p>
<p>
I didn&#8217;t sudo, and it gave me a segfault instead of a real error <img src='http://www.craigslinkedlist.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  <br />
Attempt #2, this time with sudo:</p>
<pre>
 sudo gem update --system
Password:
Updating RubyGems
Updating rubygems-update
Successfully installed rubygems-update-1.3.7
Updating RubyGems to 1.3.7
Installing RubyGems 1.3.7
RubyGems 1.3.7 installed
Successfully uninstalled gemcutter-0.1.6
Successfully uninstalled gemcutter-0.3.0
...
</pre>
</p>
<h2>Update Rails</h2>
<pre>
gem install rails --pre
...
Installing ri documentation for rails-3.0.0.beta3...
File not found: lib
</pre>
<p>
<a href="http://www.ruby-forum.com/topic/209450">Found the issue here</a>. How did we ever develop software before Google?<br />
This might <a href="http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/c93b987a3d9193b3">not be a big deal</a> after all.
</p>
<h2>Heroku</h2>
<p>
I&#8217;m going to try Heroku for deployment/hosting. <br />
First, I need <a href="http://rubygems.org/gems/bundler/versions/0.9.5">Bundler</a>:</p>
<pre>
sudo gem install bundler
/opt/local/lib/ruby/site_ruby/1.8/rubygems/spec_fetcher.rb:254: warning: getc is obsolete; use STDIN.getc instead
</pre>
<p>I hate warnings.
</p>
<p>
Next is the <a href="http://docs.heroku.com/heroku-command">Heroku gem</a>:</p>
<pre> 
sudo gem install heroku
</pre>
</p>
<p>
Time to read up on the <a href="http://docs.heroku.com/quickstart">Heroku quickstart</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-ruby-rails-and-heroku-versions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play-by-Play: Initial Git</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-initial-git/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-initial-git/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 05:04:25 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=441</guid>
		<description><![CDATA[Time to set up a GitHub project. Github is, at the very least, a good offsite storage system for the source code. cd "/Users/craig/Documents/SoftCraft/projects/bakery/" mkdir rails cd rails touch README touch .gitignore gitx git add . git commit -a -m "Initial commit" git remote add origin git@github.com:softcraft-development/bakery.git git push origin master And we&#8217;re in business! [...]]]></description>
				<content:encoded><![CDATA[<p>
Time to set up a GitHub project. Github is, at the very least, a good offsite storage system for the source code.</p>
<pre>
cd "/Users/craig/Documents/SoftCraft/projects/bakery/"
mkdir rails
cd rails
touch README
touch .gitignore
gitx
git add .
git commit -a -m "Initial commit"
git remote add origin git@github.com:softcraft-development/bakery.git
git push origin master
</pre>
<p>And <a href="http://github.com/softcraft-development/bakery/commit/598f8cdf6636093cf6476683157693fa7b9d7e25">we&#8217;re in business</a>!
</p>
<p>
Update .git/config with a couple of nice features:</p>
<pre>
[alias]
  undo = reset --hard HEAD
  wipe = clean -f -d
</pre>
</p>
<p>
While I&#8217;m at it, I&#8217;ll <a href="http://code.google.com/p/git-osx-installer/downloads/list?can=3">update my copy of git too</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-initial-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play-by-Play: Units of Measurement</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-units-of-measurement/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-units-of-measurement/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 04:55:37 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=438</guid>
		<description><![CDATA[Ok, time to get down to coding. (Actually, I started coding a month ago. I&#8217;ve been keeping a development log since the start; I&#8217;m just getting to posting it now.) I&#8217;ll be dealing with measurements quite a bit for ingredients and nutritionals, so I&#8217;ll want a measurement library. Google up &#8220;Ruby Measurement.&#8221; ruby-measure looks like [...]]]></description>
				<content:encoded><![CDATA[<p>
Ok, time to get down to coding.
</p>
<p>
(Actually, I started coding a month ago. I&#8217;ve been keeping a development log since the start; I&#8217;m just getting to posting it now.)
</p>
<p>
I&#8217;ll be dealing with measurements quite a bit for ingredients and nutritionals, so I&#8217;ll want a measurement library.<br />
Google up &#8220;Ruby Measurement.&#8221;<br />
<a href="http://github.com/mrkn/ruby-measure">ruby-measure</a> looks like what I want, but it&#8217;s undocumented. That&#8217;s a deal-breaker.
</p>
<p>
Google &#8220;ruby units of measurement&#8221;<br />
Found <a href="http://www.sciwerks.com/blog/category/ruby/ruby-units/">ruby-units</a>.<br />
Its old; last updated Oct 2006. That&#8217;s a bad sign.<br />
(<em>Update</em>: I eventually found the <a href="http://github.com/olbrich/ruby-units">github project</a>; it was last updated in March of 2010.)<br />
The documentation appears to be OK.<br />
Can it do density calculations? (Divide mass by volume to get density).<br />
It looks like it&#8217;s worth looking into.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-units-of-measurement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play-by-Play: Fixed and Unknown Costs</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-fixed-and-unknown-costs/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-fixed-and-unknown-costs/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 05:23:32 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[business-analysis]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=433</guid>
		<description><![CDATA[Unlike the variable costs, some costs are roughly constant regardless of how many customers you have. Paying for these costs is why it&#8217;s so important to have high margins and high customer volume; there&#8217;s a hurdle to overcome before the business is bottom-line profitable. Legal Legal costs aren&#8217;t much fun but they are necessary. I&#8217;m [...]]]></description>
				<content:encoded><![CDATA[<p>
Unlike the <a href="/posts/play-by-play-variable-costs-and-margin/">variable costs</a>, some costs are roughly constant regardless of how many customers you have. Paying for these costs is why it&#8217;s so important to have high margins and high customer volume; there&#8217;s a hurdle to overcome before the business is bottom-line profitable.
</p>
<h3>Legal</h3>
<p>
Legal costs aren&#8217;t much fun but they are necessary. I&#8217;m estimating roughly $1000 per year in <em>basic</em> legal costs. If I actually get sued then it&#8217;s another ball game entirely. The lesson here is &#8220;Don&#8217;t Get Sued.&#8221; Also, there&#8217;s roughly another $1000 in one-time legal fees during incorporation.
</p>
<h3>Insurance</h3>
<p>
Liability and business insurance are good safety nets to have; they will hedge against potentially catastrophic losses. I&#8217;m estimating $2000 per year based on some personal liability quotes I&#8217;ve received already.
</p>
<p><h3>Accounting</h3>
</p>
<p>
I do all my own accounting and taxes for my sole-proprietor consulting business, but corporate accounting makes me shudder. $1000 a year paid to a professional accountant is plenty, assuming that I have someone else do the actual bookkeeping. I&#8217;m fine with doing that myself for the short term.
</p>
<h3>Graphic &amp; User Interface Design</h3>
<p>
I&#8217;m not the worst designer in the world, but I&#8217;m a long way from being <em>great</em>. Having a pleasing and usable interface is critical to any modern product. I&#8217;m going to budget $1000 for the initial design, with more as the business &#038; feature set grows.
</p>
<h2>Not the Whole Story</h2>
<p>There are other costs that I&#8217;m intentionally leaving out.</p>
<h3>Cost to Acquire a Customer</h3>
<p>
This is a fancy way to say &#8220;advertising.&#8221; You have to get your product into the minds of your potential customers, and doing so will incur some cost. Word-of-mouth is by far the best and cheapest way to accomplish this, but it&#8217;s also the hardest &mdash; especially when you&#8217;re first starting out. Google AdWords is the easy route, but lately I&#8217;ve been hearing rumblings about how it&#8217;s not really all it&#8217;s cracked up to be. I&#8217;ve got some other ideas too; I&#8217;ll save those for another post.
</p>
<p>
The take away here is that it&#8217;s <em>very</em> hard for me to estimate what these costs will be in advance. Remember that the goal here is not just getting people to visit the site, but turning them into paying customers. Lots of companies have gone broke before figuring out how to do that effectively.
</p>
<h3>Support Costs</h3>
<p>
Customers need help &mdash; or eventually they won&#8217;t be your customers any more. The trouble is that it&#8217;s hard gauge how much money you&#8217;ll need to spend to keep your customers satisfied. It&#8217;s a combination of the number of customers you have, the fraction that experience trouble, and the time you need to spend to resolve the troubles. This is why user experience &amp; interface design are so important; your application needs to be easy to use so that you&#8217;re not burning time, money, and support on frustrated users.
</p>
<p>
For the time being, I&#8217;m going to handle all support myself via email. Doing it myself isn&#8217;t very cost effective but it is low-risk in terms of cash. When the business gets big enough to warrant it I&#8217;ll look at hiring someone else to handle it; then I can concentrate on more value-adding activities.
</p>
<h3>Development</h3>
<p>
This is the big one. The tradeoff for the amazingly high profit margin on software is the amazingly high cost to create the product in the first place. I&#8217;ve already sunk &#8220;several thousands&#8221; of dollars into this project and it&#8217;s not even off the ground yet.
</p>
<p>
The trick here is that, as long as <em>I&#8217;m</em> the one who is doing the development, those costs are all phony. All I&#8217;m really spending is my time. I&#8217;m not emptying my wallet for someone else and I&#8217;m not paying taxes (yet) on the work I&#8217;m doing. My spent time isn&#8217;t valueless, but it&#8217;s a long ways off from risking my house and retirement as startup capital.
</p>
<h2>What Am I Missing?</h2>
<p>These costs are just the ones off the top of my head. I&#8217;m deliberately not over-analyzing the business model because the unknown aspects are so big. However, if you&#8217;ve got a important point that I&#8217;ve missed, please feel free to share.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-fixed-and-unknown-costs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play-by-Play: Variable Costs and Margins</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-variable-costs-and-margin/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-variable-costs-and-margin/#comments</comments>
		<pubDate>Mon, 31 May 2010 05:15:39 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[business-analysis]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=427</guid>
		<description><![CDATA[I did the revenue analysis; now it&#8217;s time for the expenses. Variable Costs These are expenses that are directly proportional to the number of customers you have. More customers = more variable costs. Hosting For a cloud-based web application, the costs are pretty small. Heroku charges]]></description>
				<content:encoded><![CDATA[<p>
I did the <a href="/posts/play-by-play-revenue-model-indecently-expose">revenue analysis</a>; now it&#8217;s time for the expenses.
</p>
<h2>Variable Costs</h2>
<p>These are expenses that are directly proportional to the number of customers you have. More customers = more variable costs.</p>
<h3>Hosting</h3>
<p>
For a <a href="/posts/play-by-play-the-architecture/">cloud-based web application</a>, the costs are pretty small. <a href="http://heroku.com">Heroku</a> charges <a href="http://heroku.com/pricing#koi-1-0>$19 per month</a>, plus variable fees for higher-concurrency. These fees are based on per-second usage, so they scale directly with customers/sales. They&#8217;re also very cheap: 5 cents per dyno per hour; a <a href="http://docs.heroku.com/dynos">dyno</a> can handle around 10 to 50 customers per second. Given that I&#8217;m only expecting 250 non-heavy-duty customers total, the variable costs should be tiny. I&#8217;d guess that the app could be hosted for less than $100/month, or $1200 a year. The cost per customer is about $5 per year. Chump change.
</p>
<h3>Payment Fees</h3>
<p>
I&#8217;ll need a merchant account to accept credit cards.  I have some quotes for roughly 15 cents + 3% per transaction + $30/month (though the actual amounts vary a bit with provider, volume, and monthly fee). That&#8217;s about $4700/year, though with this sort of volume I could probably get a lower transaction fee for lower overall costs. It&#8217;s also about $19 per customer per year.</p>
<h3>Billing</h3>
<p>
Over and above the merchant account fees are the payment gateway fees. I&#8217;m looking at <a href="http://chargify.com/pricing-and-signup/">Chargify</a> as it has a good reputation. It costs $50 for up to $500 users; for my 250 users that&#8217;s $0.20/user&#8230; basically not worth considering.
</p>
<h2>Gross Margin</h2>
<p>
So if revenue per customer is about $520 per year, and the variable costs per customer are $25 per year, then the gross yearly margin per customer is $495. The margin rate is an astonishing <em>95%</em>. For reference, a lot of businesses run on margins of 20% or less; really high-volume ones often have margins in the low single digits. That&#8217;s the beauty of software: once you build the thing, it costs nearly nothing to supply it to your customers.
</p>
<p>
Next up: fixed costs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-variable-costs-and-margin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play-by-Play: Revenue Model, Indecently Exposed</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-revenue-model-indecently-expose/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-revenue-model-indecently-expose/#comments</comments>
		<pubDate>Sat, 29 May 2010 05:48:57 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[business-analysis]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=420</guid>
		<description><![CDATA[I want to publish some analysis regarding the costs of running this business/application. However, to make any real impact, I have to publish the revenue numbers too. I originally said I wasn&#8217;t going to do that, but I think it&#8217;s worth doing so now given my next post. That, and Teflon Ted said I&#8217;d be [...]]]></description>
				<content:encoded><![CDATA[<p>
I want to publish some analysis regarding the costs of running this business/application. However, to make any real impact, I have to publish the revenue numbers too. I originally <a href="/posts/play-by-play-business-analysis-update/">said I wasn&#8217;t going to do that</a>, but I think it&#8217;s worth doing so now given my next post. That, and <a href="http://trak3r.blogspot.com/">Teflon Ted</a> <a href="/posts/play-by-play-business-analysis-update#comment-24256">said I&#8217;d be uncool</a> if I didn&#8217;t.
</p>
<h2>Answers to My Questions</h2>
<p>
<strong>Q: How much on ingredients does the bakery spend?</strong>
</p>
<blockquote><p>
Depending on the quality of ingredients anywhere from $1000.00 &#8211; $5000.00 per week
</p></blockquote>
<p>
<strong>Q:How much of the overall waste could be eliminated through better<br />
planning (via the product we want to build)?</strong></p>
<blockquote><p>
I would say that there is always waste, any more than 10% can be very detrimental to a small bakery, especially on a daily basis.<br />
I think if done properly and the bakery is actually planning and following their projections the waste could be brought down to 3-5 %
</p></blockquote>
<h2>Running the Numbers</h2>
</p>
<p>
Conservatively: $1000 in ingredients per week * 5% minimum reduction in waste = $50/week in potential savings to the customer. That&#8217;s about $2600/year.
</p>
<p>
Multiply $2600 by some number <em>A</em>, which is the percentage of this savings that you can successfully extract from the customer. I&#8217;ve been ballparking this number at 20% for no good reason other than the result seems palatable to me. $2600 * 20% = $520/year, or $43/month.
</p>
<p>
There are about <a href="/posts/play-by-play-business-analysis/">25,000 bakeries in Canada and the US</a>. Multiply this by some number <em>B</em>, which is your customer conversion rate. I&#8217;ve been using <em>B</em> = 1% as a suitably low number. 25,000 * 1% = 250 customers, which seems pretty attainable.
</p>
<p>
250 customers * $520/year = $130,000.
</p>
<p>
The real revenue number is 65 million * <em>AB</em> (minimum). Increase <em>A</em> and <em>B</em> to increase the total revenue.
</p>
<p>
That&#8217;s a brief look at the revenue side. Next come <a href="/posts/play-by-play-variable-costs-and-margin/">the expenses</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-revenue-model-indecently-expose/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Play-by-Play: The Architecture</title>
		<link>http://www.craigslinkedlist.com/posts/play-by-play-the-architecture/</link>
		<comments>http://www.craigslinkedlist.com/posts/play-by-play-the-architecture/#comments</comments>
		<pubDate>Wed, 26 May 2010 05:07:20 +0000</pubDate>
		<dc:creator>Craig</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[play-by-play]]></category>

		<guid isPermaLink="false">http://www.craigslinkedlist.com/?p=413</guid>
		<description><![CDATA[A pay-as-you-go service goes hand-in-hand with a web-based application; it&#8217;s much harder to make a viable one-time-purchase web service or a pay-as-you-go desktop application. This choice of architecture has several benefits of its own: Lower (nearly zero) maintenance for the customer. There&#8217;s no software to install and no servers to operate. Easier compatibility concerns for [...]]]></description>
				<content:encoded><![CDATA[<p>
A <a href="/posts/play-by-play-revenue-model/">pay-as-you-go service</a> goes hand-in-hand with a web-based application; it&#8217;s much harder to make a viable one-time-purchase web service or a pay-as-you-go desktop application. This choice of architecture has several benefits of its own:
</p>
<ul>
<li>Lower (nearly zero) maintenance for the customer. There&#8217;s no software to install and no servers to operate.</li>
<li>Easier compatibility concerns for the developer. Modern web development is very consistent across platforms (assuming you choose not to support Internet Explorer 6 or less. Even if you target modern Windows exclusively (and that probably means abandoning the huge XP installed base), desktop software has to contend with a huge number of variables for each local installation.</li>
<li>Easier distribution of changes, fixes, and enhancements. This is critical for any agile &amp; responsive business.</li>
<li>Greater possibility for interaction with the customer. You get a certain amount of feedback automatically, just through usage logs.</li>
</ul>
<p>
Of course, there are some major downsides:
</p>
<ul>
<li>The customer must have a useful Internet connection at their place of work. My domain expert says that this isn&#8217;t much of an obstacle; most bakeries have them anyway for things like email. Still, it will be useful to keep offline / non-browser modes in mind: I&#8217;m thinking of printed sheets and smartphone apps as future directions.</li>
<li>The application won&#8217;t be able to take advantage of some features on the local computer. This has been getting less important over the years, but there&#8217;s still a few technologies that simply won&#8217;t work through a browser. Scanner support is probably the biggest one I can think of. However, that&#8217;s probably not important for this particular product.</li>
</ul>
<p>
One of the biggest advantages though is that my own <em>personal</em> strengths lie with web-based application development. This is a big factor on a small, speculative project like this. However, it should <em>not</em> be the deciding factor; if the product and market do not fit the developer, then you need to either change developers or change products.
</p>
<p>
I&#8217;ll be using a cloud-based hosting service to start out with. Cloud-based services offer the greatest scalability. In the early days of an application, this means scaling <em>down</em> rather than <em>up</em>; there won&#8217;t necessarily be enough traffic to warrant a full-size server (even a virtual server). A cloud service will also scale up nicely through the first phase of growth. After a certain level of traffic, a full server will become more cost effective &mdash; but that&#8217;s quite a ways off (and getting further away by the year). Since traffic effectively means revenue, migrating to a new server platform will be one of those &#8220;good problems to have&#8221;.
</p>
<p>
In my next post, I put some <a href="/posts/play-by-play-revenue-model-indecently-expose/">real numbers</a> against the architecture.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craigslinkedlist.com/posts/play-by-play-the-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
