<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>almost effortless</title>
	
	<link>http://almosteffortless.com</link>
	<description>æ + internet = ♥</description>
	<lastBuildDate>Fri, 26 Jun 2009 15:04:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/almosteffortless" type="application/rss+xml" /><item>
		<title>Config vars and Heroku</title>
		<link>http://almosteffortless.com/2009/06/25/config-vars-and-heroku/</link>
		<comments>http://almosteffortless.com/2009/06/25/config-vars-and-heroku/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 02:52:04 +0000</pubDate>
		<dc:creator>Trevor</dc:creator>
				<category><![CDATA[El Dorado]]></category>
		<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1479</guid>
		<description><![CDATA[I don't really care for the suggested approach in the Heroku docs for setting configuration variables locally. I have an open-source project that I'm working to get onto Heroku, so I decided to do a little work to come up with a solution that I prefer. I think this would work well for open source [...]]]></description>
			<content:encoded><![CDATA[<p>I don't really care for the <a href="http://docs.heroku.com/config-vars#local-setup ">suggested approach</a> in the <a href="http://heroku.com">Heroku</a> docs for setting configuration variables locally. I have an open-source project that I'm working to get onto Heroku, so I decided to do a little work to come up with a solution that I prefer. I think this would work well for open source projects, as well as projects with multiple developers. </p>
<p>Here's the basic idea: </p>
<p>You have a config file that contains all of your local configuration variables. It looks a lot like database.yml.</p>
<pre class="ruby">&nbsp;
<span style="color:#008000; font-style:italic;"># config/config.yml</span>
&nbsp;
development:
  session_key: example_development
  session_secret: ESl6X3oKM1i1RRrD2QLwUUzz9jr1zxNO
  domain: http://example.<span style="color:#9900CC;">com</span>
&nbsp;
test:
  session_key: example_test
  session_secret: vrwPpJTvwnMVLP1wTSgqigSl7PMI7QcE
  domain: http://example.<span style="color:#9900CC;">com</span>
&nbsp;
production:
  session_key: <span style="color:#008000; font-style:italic;"># any string identifying your app</span>
  session_secret: <span style="color:#008000; font-style:italic;"># a random, secret string at least 32 characters long</span>
  domain: <span style="color:#008000; font-style:italic;"># http://example.com</span>
  mailer: <span style="color:#008000; font-style:italic;"># noreply@example.com</span>
&nbsp;</pre>
<p>You perform a little trickery in environment.rb to prefer the Heroku ENV storage of config vars (in the production environment), but you fall back to your config.yml if the config vars aren't found in ENV (in the development and test environments). </p>
<pre class="ruby">&nbsp;
<span style="color:#008000; font-style:italic;"># config/environment.rb</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Rails::Initializer</span>.<span style="color:#9900CC;">run</span> <span style="color:#9966CC; font-weight:bold;">do</span> |config|
  <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'yaml'</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># support yaml and heroku config vars, preferring ENV for heroku</span>
  CONFIG = <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">YAML</span>.<span style="color:#9900CC;">load_file</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'config/config.yml'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span>RAILS_ENV<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">merge</span><span style="color:#006600; font-weight:bold;">&#40;</span>ENV<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  config.<span style="color:#9900CC;">action_controller</span>.<span style="color:#9900CC;">session</span> = <span style="color:#006600; font-weight:bold;">&#123;</span>
    <span style="color:#ff3333; font-weight:bold;">:key</span> =&gt; CONFIG<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'session_key'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
    <span style="color:#ff3333; font-weight:bold;">:secret</span> =&gt; CONFIG<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'session_secret'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>Then, you create a rake task (<i>rake heroku:config</i>) that can be used to send all of the config vars for your production environment up to Heroku. This task can be invoked once to set things up, but can also be run again if you need to make any additions or changes. </p>
<pre class="ruby">&nbsp;
<span style="color:#008000; font-style:italic;"># lib/tasks/heroku.rake</span>
&nbsp;
namespace <span style="color:#ff3333; font-weight:bold;">:heroku</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  task <span style="color:#ff3333; font-weight:bold;">:config</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Reading config/config.yml and sending config vars to Heroku...&quot;</span>
    CONFIG = <span style="color:#CC00FF; font-weight:bold;">YAML</span>.<span style="color:#9900CC;">load_file</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'config/config.yml'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'production'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    command = <span style="color:#996600;">&quot;heroku config:add&quot;</span>
    CONFIG.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span>|key, val| command &lt;&lt; <span style="color:#996600;">&quot; #{key}=#{val} &quot;</span> <span style="color:#9966CC; font-weight:bold;">if</span> val <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#CC0066; font-weight:bold;">system</span> command
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>This way, you've got all of your config vars stored with the project (.gitignored, of course)...</p>
<pre class="bash">&nbsp;
<span style="color: #808080; font-style: italic;"># .gitignore</span>
&nbsp;
/tmp/**/*
/log/*
*.log
/tmp/restart.txt
/config/config.yml
/config/database.yml
/db/*.sqlite3
&nbsp;</pre>
<p>...and you can easily set what you need on Heroku, like so:</p>
<pre class="bash">&nbsp;
$ rake heroku:config
Reading config/config.yml and sending config vars to Heroku...
Adding config vars:
  session_key =&gt; example_production
  session_secret =&gt; 1WlkMkYYi5611vtF...0ZMS2G3Xl67s4lEIK4sj65
  domain =&gt; http://example.com
  mailer =&gt; noreply@example.com
Restarting app...<span style="color: #000000; font-weight: bold;">done</span>.
&nbsp;</pre>
<p>The result is a pretty nice, I think. </p>
<p>You can see the installation and deployment instructions for my open source project <a href="http://github.com/trevorturk/eldorado/tree/master">El Dorado</a> if you're curious about the overall flow. </p>
<p>I'd love to get some feedback on this approach, but I really like it so far :) </p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/06/25/config-vars-and-heroku/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Install Ruby Enterprise, Phusion Passenger and El Dorado on Debian Lenny</title>
		<link>http://almosteffortless.com/2009/06/24/install-ruby-enterprise-phusion-passenger-and-el-dorado-on-debian-lenny/</link>
		<comments>http://almosteffortless.com/2009/06/24/install-ruby-enterprise-phusion-passenger-and-el-dorado-on-debian-lenny/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 20:32:47 +0000</pubDate>
		<dc:creator>Timothy O'Connell</dc:creator>
				<category><![CDATA[El Dorado]]></category>
		<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1461</guid>
		<description><![CDATA[These instructions require and assume the following:

You're running Debian Lenny and you've got root access
You've got a functioning apache2 installation
You know the basics of working on the command line (i.e. how to edit files, execute commands, etc.)

If the above is true of your situation, read on to learn how to install Ruby Enterprise, Phusion Passenger [...]]]></description>
			<content:encoded><![CDATA[<p>These instructions require and assume the following:
<ul>
<li>You're running Debian Lenny and you've got <em>root</em> access</li>
<li>You've got a functioning <em>apache2</em> installation</li>
<li>You know the basics of working on the command line (i.e. how to edit files, execute commands, etc.)</li>
</ul>
<p>If the above is true of your situation, read on to learn how to install <em>Ruby Enterprise</em>, <em>Phusion Passenger</em> and <em>El Dorado</em> from scratch in a sort of "one-off" setting where you've got one server and you want it to run one site.</p>
<p><strong>NB:</strong> These instructions don't use <em>git</em> or <em>capistrano</em>. The instructions contained in the <em>El Dorado</em> README describe how to install <em>El Dorado</em> using those tools. Using them makes for an easier and cleaner installation. It also makes for easier scalability, upgrading and patching: I highly recommend using those tools. </p>
<ol>
<li><strong>Resolve Dependencies</strong></li>
<p>The first thing you'll need to do, even before installing <em>RE</em> or <em>PP</em>, is make sure that you've got the development files for the databases that <em>RE</em> and <em>PP</em> applications use:
<pre>apt-get install libsqlite3-ruby postgresql-8.3-plruby libmysql-ruby libmysqlclient15-dev postgresql-server-dev-8.3 libsqlite3-dev</pre>
<p>If you don't resolve these dependencies now, you'll get a message during the <em>RE</em> installation that prompts you to install gems for mysql, postgres, etc. and then, when you go to install those gems, you'll get an error like this:
<pre>ERROR:  Error installing mysql:
	ERROR: Failed to build gem native extension.</pre>
<p>So just go ahead and resolve those dependencies in advance.</p>
<li><strong>Install <em>Ruby Enterprise</em></strong></li>
<p>The best practice for this, as far as I know, is to install the current stable release of <em>RE</em> in <em>/opt/</em>. First, download the release you plan to use:
<pre>lana:~# cd /opt
lana:/opt# wget http://rubyforge.org/frs/download.php/58677/ruby-enterprise-1.8.6-20090610.tar.gz</pre>
<p> Once that's down, untar it and execute the installer script:
<pre>lana:/opt# tar -zxvf ruby-enterprise-1.8.6-20090610.tar.gz
[...]
lana:/opt# cd ruby-enterprise-1.8.6-20090610/
lana:/opt/ruby-enterprise-1.8.6-20090610# ./installer</pre>
<p>That should run, after a few tappings of ye olde Enter key, to its error-free conclusion. If, during the installation, the installer finds that you're missing software packages, the installer will bail and you'll be given some commands that fill those holes. Resolve those dependencies and finish the installation.</p>
<p>At the end of the installation, you'll be given some syntax that will automatically install <em>PP</em>. You'll use that in the next step.</p>
<li><strong>Install <em>Phusion Passenger</em></strong></li>
<p>Use the automatically generated syntax:
<pre>lana:/opt/ruby-enterprise-1.8.6-20090610# /opt/ruby-enterprise-1.8.6-20090610/bin/passenger-install-apache2-module</pre>
<p>Again, the installer will bail and prompt you to resolve dependencies if you've got any:
<pre>Installation instructions for required software

 * To install Apache 2 development headers:
   Please run apt-get install apache2-prefork-dev as root.

 * To install Apache Portable Runtime (APR) development headers:
   Please run apt-get install libapr1-dev as root.

 * To install Apache Portable Runtime Utility (APU) development headers:
   Please run apt-get install libaprutil1-dev as root.</pre>
<p>Resolve dependencies and finish the installation. </p>
<p>Once it's finished, you'll be given some lines to add to your "Apache configuration file". The best file to add these lines to is <em>/etc/apache2/httpd.conf</em>.</p>
<p>Just don't forget that you added them there (as opposed to somewhere else), as you'll need to modify them if you upgrade <em>RE</em>. </p>
<p>You'll also probably want to go ahead and add the following lines while you've got the file open:
<pre>PassengerPoolIdleTime 14400
PassengerMaxInstancesPerApp 2</pre>
<p>Those lines do exactly what it looks like they do. They're also very sensible settings to start with, as they'll prevent <em>El Dorado</em> from hogging a bunch of system resources, etc. right off the bat. </p>
<p>You can find <a href="http://www.modrails.com/documentation/Users%20guide.html#_resource_control_and_optimization_options">more information here</a>.</p>
<p>Finally, your <em>/etc/apache2/httpd.conf</em> file should look something like this:
<pre>PassengerPoolIdleTime 14400
PassengerMaxInstancesPerApp 2

LoadModule passenger_module /opt/ruby-enterprise-1.8.6-20090610/lib/ruby/gems/1.8/gems/passenger-2.2.4/ext/apache2/mod_passenger.so
PassengerRoot /opt/ruby-enterprise-1.8.6-20090610/lib/ruby/gems/1.8/gems/passenger-2.2.4
PassengerRuby /opt/ruby-enterprise-1.8.6-20090610/bin/ruby</pre>
<p>Once you've made those changes, you're ready to begin installing <em>El Dorado</em>.</p>
<p>When it exits, the <em>PP</em> installer will show you some sample syntax for how to write an apache configuration file for your first application. You can ignore that for now, as we're going to come back to it later.</p>
<li><strong>Install <em>El Dorado</em></strong></li>
<p>First, get the latest release of the software from Trevor's <em>github</em>: <a href="http://github.com/trevorturk/eldorado/tree/master">http://github.com/trevorturk/eldorado/tree/master</a></p>
<p>Once you've got the URL of the latest release, switch from <em>root</em> to a less privileged user, make a folder in your home dir for the site, download the latest release of <em>El Dorado</em> to that directory and untar it:
<pre>
toconnell@lana:~$ mkdir example.com
toconnell@lana:~$ cd example.com
toconnell@lana:~/example.com$ wget wget http://download.github.com/trevorturk-eldorado-a37d0c71e928f605d111d5f48b5786ff613bf676.tar.gz
tar -zxvf trevorturk-eldorado-a37d0c71e928f605d111d5f48b5786ff613bf676.tar.gz
</pre>
<p>Now, get all of those files out of that big, ugly directory and into the current working directory and ditch those old files:
<pre>toconnell@lana:~/example.com$ mv trevorturk-eldorado-a37d0c71e928f605d111d5f48b5786ff613bf676/* .
toconnell@lana:~/example.com$ rm -rf trevorturk-eldorado-a37d0c71e928f605d111d5f48b5786ff613bf676*</pre>
<p>Now, follow the instructions in the README and copy the example <em>yml</em> files to the places where the application will look for real, non-example files:
<pre>toconnell@lana:~/example.com$ cp config/database.example.yml config/database.yml
toconnell@lana:~/example.com$ cp config/config.example.yml config/config.yml</pre>
<p>Now, use your favorite editor to edit the last stanza in <em>config/config.yml</em> so that it matches the information of your site:
<pre>production:
  session_key: example_production
  session_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  # Replace these X's and make this string (at least) 32 random alpha-numerics for good site security
  domain: http://example.com
  mailer: noreply@example.com  </pre>
<p><strong>NB:</strong> There are "dev" and "test" entries in this default file. If you're not planning on doing anything development related with this installation, you can safely delete those entries.</p>
<p>Once you've edited that file, that's it, so far as the non-<em>git</em> installation is concerned. To get <em>El Dorado</em> up and running, you'll need to do some minor database tasks. Those are covered in the next section.</p>
<li><strong>Configure the Database</strong></li>
<p>Since MySQL is deprecated, I'll be using PostgreSQL for the remainder of these instructions.</p>
<p>If you look at <em>config/database.yml</em>, you'll notice that it's essentially a blank template:
<pre>development:
  adapter: sqlite3
  database: db/development.sqlite3
  timeout: 5000
  # adapter: mysql
  # database: eldorado_development
  # username:
  # password:
  # host: localhost

test:
  adapter: sqlite3
  database: db/test.sqlite3
  timeout: 5000

production:
  adapter:
  database:
  username:
  password:
  host:</pre>
<p>First, edit that file:
<pre>production:
  adapter: postgresql
  database: example
  username: example
  password: XXXXXXXXXXXXXXXXXXXX
  host: localhost</pre>
<p><strong>NB:</strong> Again: once you've added your "production" entries to this file, you can feel free to delete the "test" and "dev" lines, as they do nothing and could cause confusion down the line.</p>
<p>Now, create the database and the user:
<pre>toconnell@lana:~/example.com$ sudo su postgres -c "createuser example"
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
toconnell@lana:~/example.com$ sudo su postgres -c "createdb example"</pre>
<p>Next, start the postgres monitor as the postgres user and make the a few changes:
<pre>toconnell@lana:~/example.com$ sudo su postgres -c psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

postgres=# ALTER USER example PASSWORD 'XXXXXXXXXXXXXXXXXXXX';
ALTER ROLE
postgres=# ALTER DATABASE example OWNER TO example;
ALTER DATABASE</pre>
<p>Now, if you've got your Postgres database configured correctly and your new user can access your new postgres database, you're ready to rake the <em>El Dorado</em> production database:
<pre>toconnell@lana:~/example.com$ /opt/ruby-enterprise-1.8.6-20090610/bin/rake rake db:schema:load RAILS_ENV=production</pre>
<p>Once the database is successfully raked, all you've got to do to finish up is configure Apache. </p>
<li><strong>Apache Configuration</strong></li>
<p>The following assumes that you're doing apache the "Debian way".</p>
<p>If this is true, the first thing you'll do is create a symlink in <em>/var/www/</em> that points at your install directory:
<pre>lana:/var/www# ln -s /home/toconnell/example.com/</pre>
<p>Next, create a file in <em>/etc/apache2/sites-available</em> with the name of your site and then create a symlink to it in <em>/etc/apache2/sites-enabled</em>.</p>
<p>The file should look something like this:
<pre>#
# example.com
#
&nbsp;
&lt;VirtualHost *:80&gt;
  ServerName example.com
  ServerAlias www.example.com
  ServerAdmin youremail@example.com
  DocumentRoot /home/toconnell/example.com/public
&nbsp;
  &lt;Directory &quot;/var/www/example.com&quot;&gt;
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
  &lt;/Directory&gt;
&nbsp;
  RewriteEngine On
&nbsp;
  RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
  RewriteRule ^(.*)$ http://example.com$1 [R=301,L]
&nbsp;
  RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
  RewriteCond %{SCRIPT_FILENAME} !maintenance.html
  RewriteRule ^.*$ /system/maintenance.html [L]
&nbsp;
  ErrorLog /var/log/apache2/example_error_log
  CustomLog /var/log/apache2/example_access_log combined
  RewriteLog /var/log/apache2/example_rewrite_log
  RewriteLogLevel 9
&nbsp;
&lt;/VirtualHost&gt;</pre>
<p>NB: I've added some <em>apache</em> custom logging. Logs are good.</p>
<p>Once you've got the file in <em>/etc/apache2/sites-available</em> and the symlink in <em>/etc/apache2/sites-enabled</em> that points at that file, you should be ready to restart apache and get rolling:
<pre>lana:/etc/logrotate.d# /etc/init.d/apache2 reload</pre>
</ol>
<p>And that, as they say, is that. Once you reload apache, provided that your DNS is set up correctly and you haven't got any system problems beyond the scope of this document, your single instance of <em>El Dorado</em> should be ready for prime time.</p>
<p>Navigate to your site in your browser and create an administrative account: the first user who attempts to login will be the administrator. Once you've got your admin created, you're ready to start tweaking your new <em>El Dorado</em> site's appearance and adding users.</p>
<p>A note on upgrades: if you find you need/want to upgrade an  instance of <em>El Dorado</em> that has been installed thus, consult the README. The basic gist is that you're going to want to download/copy the new source/program files over the old ones (while being careful not to erase your user-uploaded files) and then run <code>rake db:migrate RAILS_ENV=production</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/06/24/install-ruby-enterprise-phusion-passenger-and-el-dorado-on-debian-lenny/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 6-22-09</title>
		<link>http://almosteffortless.com/2009/06/22/weekly-digest-6-22-09/</link>
		<comments>http://almosteffortless.com/2009/06/22/weekly-digest-6-22-09/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 02:21:44 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1454</guid>
		<description><![CDATA[How to speed up gem installs 10x
Answer: Turn off ri and rdoc installation.
Perch
Perch is a really little content management system for when you (or your clients) need to edit content without the hassle of setting up a big CMS.
Installing Ruby on Rails and PostgreSQL on OS X, Third Edition
Over the past few years, I’ve helped [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://buddingrubyist.com/2009/02/14/how-to-speed-up-gem-installs-10x/">How to speed up gem installs 10x</a></p>
<blockquote><p>Answer: Turn off ri and rdoc installation.</p></blockquote>
<p><a href="http://grabaperch.com/">Perch</a></p>
<blockquote><p>Perch is a really little content management system for when you (or your clients) need to edit content without the hassle of setting up a big CMS.</p></blockquote>
<p><a href="http://www.robbyonrails.com/articles/2008/01/22/installing-ruby-on-rails-and-postgresql-on-os-x-third-edition">Installing Ruby on Rails and PostgreSQL on OS X, Third Edition</a></p>
<blockquote><p>Over the past few years, I’ve helped you walk through the process of getting Ruby on Rails up and running on Mac OS X. The last version has been getting a lot of comments related to issues with the new Apple Leopard, so I’m going this post will expand on previous installation guides with what’s working for me as of January 2008.</p></blockquote>
<p><a href="http://factoryjoe.com/blog/2009/06/16/thoughts-on-opera-unite/">Thoughts on Opera Unite</a></p>
<blockquote><p>Opera’s CEO Jon von Tetzchner claims that “Opera Unite now decentralizes and democratizes the cloud." I call bullshit. Opera Unite does indeed rely on a P2P-like network to function, but the big problem is that you must push all your traffic through Opera’s proxy service.</p></blockquote>
<p><a href="http://lesscss.org/">LESS - Leaner CSS</a></p>
<blockquote><p>Less is Leaner css. Less extends css by adding: variables, mixins, operations and nested rules. Less uses existing css syntax. This means you can migrate your current .css files to .less in seconds and there is virtually no learning curve.</p></blockquote>
<p><a href="http://news.ycombinator.com/item?id=660679">YC Company Hosting Stats</a></p>
<blockquote><p>[Interesting stats and discussion on hosting.]</p></blockquote>
<p><a href="http://jameswilding.net/2009/06/13/rip/">Rip: a RubyGems Replacement?</a></p>
<blockquote><p>This makes package management as simple as passing files between friends. Email me your latest library, and I can run rip install path/to/lib. That’s it — you don’t need spec files, and you don’t need to build anything before your send me your code.</p></blockquote>
<p><a href="http://en.wikipedia.org/wiki/BigTable">BigTable</a></p>
<blockquote><p>BigTable is a fast and extremely large-scale DBMS. However, it departs from the typical convention of a fixed number of columns, instead described by the authors as "a sparse, distributed multi-dimensional sorted map", sharing characteristics of both row-oriented and column-oriented databases. BigTable is designed to scale into the petabyte range across "hundreds or thousands of machines, and to make it easy to add more machines [to] the system and automatically start taking advantage of those resources without any reconfiguration".</p></blockquote>
<p><a href="http://news.ycombinator.com/item?id=659696">Opera Unite reinvents the Web: a Web server on the Web browser</a></p>
<blockquote><p>[Very interesting possibilities here. Making it easier for people to serve content on the web can only lead to good things.]</p></blockquote>
<p><a href="http://github.com/tenderlove/markup_validity/tree/master">tenderlove's markup_validity</a></p>
<blockquote><p>Test for valid markup with test/unit or rspec</p></blockquote>
<p><a href="http://hemlock-kills.com/">Hemlock</a></p>
<blockquote><p>Hemlock is an open-source framework that combines the richness of Flash with the scalability of XMPP, facilitating a new class of web applications where multiple users can interact in real time. Games, workspace collaboration, educational tools… The only limit is your imagination.</p></blockquote>
<p><a href="http://www.infoq.com/news/2009/06/rip">Rip: A New Package Management System for Ruby</a></p>
<blockquote><p>But why a completely new package manager? What's wrong with RubyGems? We asked one of Rip's developers, Chris Wanstrath...</p></blockquote>
<p><a href="http://martinfowler.com/articles/rubyAtThoughtWorks.html">Ruby at ThoughtWorks</a></p>
<blockquote><p>ThoughtWorks started using Ruby for production projects in 2006, from then till the end of 2008 we had done 41 ruby projects. In preparation for a talk at QCon I surveyed these projects to examine what lessons we can draw from the experience. I describe our thoughts so far on common questions about Ruby's productivity, speed and maintainability.</p></blockquote>
<p><a href="http://www.mail-archive.com/dri-devel@lists.sourceforge.net/msg39091.html">[git pull] drm-next</a></p>
<blockquote><p>See? All the rules really are pretty simple. There's that somewhat subtle<br />
interaction between "keep your own history clean" and "never try to clean<br />
up _other_ proples histories", but if you follow the rules for pulling,<br />
you'll never have that problem.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/06/22/weekly-digest-6-22-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GitHub Protip: Follow other users</title>
		<link>http://almosteffortless.com/2009/06/11/github-protip-follow-other-users/</link>
		<comments>http://almosteffortless.com/2009/06/11/github-protip-follow-other-users/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 03:38:29 +0000</pubDate>
		<dc:creator>Trevor</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1424</guid>
		<description><![CDATA[Inspired by this post, I thought I'd share a tip that helps me get the most out of GitHub. 
Don't just follow the projects that you're interested in &#8212; follow other users. Here's a list of people that I'm following. They're constantly turning me on to new and interesting projects, because I get to see [...]]]></description>
			<content:encoded><![CDATA[<p>Inspired by <a href="http://themomorohoax.com/2009/04/12/how-to-keep-up-with-ruby-7-people-to-follow-on-github">this post</a>, I thought I'd share a tip that helps me get the most out of <a href="http://github.com">GitHub</a>. </p>
<p>Don't just follow the projects that you're interested in &mdash; <i>follow other users</i>. Here's a list of people that <a href="http://github.com/trevorturk">I'm following</a>. They're constantly turning me on to new and interesting projects, because I get to see everything they're working on, and everything they're following. </p>
<p>&nbsp;</p>
<div class="followers">
<ul>
<li>
      <a href="http://github.com/technoweenie" rel="contact" title="technoweenie"><img alt="" height="24" src="http://www.gravatar.com/avatar/821395fe70906c8290df7f18ac4ac6cf?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/mattpolito" rel="contact" title="mattpolito"><img alt="" height="24" src="http://www.gravatar.com/avatar/f9961873414a964cb8aa6d81aa2e2293?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/ryanb" rel="contact" title="ryanb"><img alt="" height="24" src="http://www.gravatar.com/avatar/8dbf316d36ff66aad4869a4fc3cfbd37?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/rails" rel="contact" title="rails"><img alt="" height="24" src="http://www.gravatar.com/avatar/30f39a09e233e8369dddf6feb4be0308?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/engineyard" rel="contact" title="engineyard"><img alt="" height="24" src="http://www.gravatar.com/avatar/0acd291e0507eb03e5e6e961eddfa6b3?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/courtenay" rel="contact" title="courtenay"><img alt="" height="24" src="http://www.gravatar.com/avatar/6962eeda5d20190857026da4621b9f9f?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/defunkt" rel="contact" title="defunkt"><img alt="" height="24" src="http://www.gravatar.com/avatar/b8dbb1987e8e5318584865f880036796?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/thoughtbot" rel="contact" title="thoughtbot"><img alt="" height="24" src="http://www.gravatar.com/avatar/def5902fe210ca1cb5152621f1effc89?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/lifesnapz" rel="contact" title="lifesnapz"><img alt="" height="24" src="http://www.gravatar.com/avatar/8bd63181ef9f7e7f682a82b6196bcc0a?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/bmizerany" rel="contact" title="bmizerany"><img alt="" height="24" src="http://www.gravatar.com/avatar/1a250566b475961b9b36abf359950c76?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/ezmobius" rel="contact" title="ezmobius"><img alt="" height="24" src="http://www.gravatar.com/avatar/64193462abf6bab535b4e0eb7a260558?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/svenfuchs" rel="contact" title="svenfuchs"><img alt="" height="24" src="http://www.gravatar.com/avatar/402602a60e500e85f2f5dc1ff3648ecb?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/marcel" rel="contact" title="marcel"><img alt="" height="24" src="http://www.gravatar.com/avatar/aefec48f6f83b6ead722c625c8edf78b?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/NZKoz" rel="contact" title="NZKoz"><img alt="" height="24" src="http://www.gravatar.com/avatar/efa76b164a7de4a5730e4fa397cc4425?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/gbuesing" rel="contact" title="gbuesing"><img alt="" height="24" src="http://www.gravatar.com/avatar/e3e98bfa99e82ac8b0cb63660dc23b14?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/wycats" rel="contact" title="wycats"><img alt="" height="24" src="http://www.gravatar.com/avatar/428167a3ec72235ba971162924492609?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/mojombo" rel="contact" title="mojombo"><img alt="" height="24" src="http://www.gravatar.com/avatar/25c7c18223fb42a4c6ae1c8db6f50f9b?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/drnic" rel="contact" title="drnic"><img alt="" height="24" src="http://www.gravatar.com/avatar/cb2b768a5e546b24052ea03334e43676?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/github" rel="contact" title="github"><img alt="" height="24" src="http://www.gravatar.com/avatar/f63f20f3843f43fae28d77233e5db5d4?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/37signals" rel="contact" title="37signals"><img alt="" height="24" src="http://www.gravatar.com/avatar/349210726e1ce6aa21840f665749fe0d?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/mbleigh" rel="contact" title="mbleigh"><img alt="" height="24" src="http://www.gravatar.com/avatar/795160eca476a92b560a724869d3d942?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/lifo" rel="contact" title="lifo"><img alt="" height="24" src="http://www.gravatar.com/avatar/a05834e9b5954947eb0ba3b570c47d5e?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/dhh" rel="contact" title="dhh"><img alt="" height="24" src="http://www.gravatar.com/avatar/ed9635566b34ade32274f510f0f9a6d2?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/why" rel="contact" title="why"><img alt="" height="24" src="http://www.gravatar.com/avatar/76edd1c1ba31a43789fd42c90733f8b7?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/josh" rel="contact" title="josh"><img alt="" height="24" src="http://www.gravatar.com/avatar/bbe5dc8dcf248706525ab76f46185520?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/joshsusser" rel="contact" title="joshsusser"><img alt="" height="24" src="http://www.gravatar.com/avatar/9f0f89bbd9e1ecfbaab6584e429b7a2f?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/schacon" rel="contact" title="schacon"><img alt="" height="24" src="http://www.gravatar.com/avatar/9375a9529679f1b42b567a640d775e7d?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/mattetti" rel="contact" title="mattetti"><img alt="" height="24" src="http://www.gravatar.com/avatar/c69521d6e22fc0bbd69337ec8b1698df?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/zdzolton" rel="contact" title="zdzolton"><img alt="" height="24" src="http://www.gravatar.com/avatar/946696209f50381fc280e4c0a85cceb8?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/scottymac" rel="contact" title="scottymac"><img alt="" height="24" src="http://www.gravatar.com/avatar/b1fca7961834295e14e61dd389989cc1?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/chneukirchen" rel="contact" title="chneukirchen"><img alt="" height="24" src="http://www.gravatar.com/avatar/7264fb16beeea92b89bb42023738259d?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/bumi" rel="contact" title="bumi"><img alt="" height="24" src="http://www.gravatar.com/avatar/fd9aebbd7d8fcd1e7aa3838b49815635?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/jnunemaker" rel="contact" title="jnunemaker"><img alt="" height="24" src="http://www.gravatar.com/avatar/e13c31390e0369fcd5972292ce0e7b92?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/NickCampbell" rel="contact" title="NickCampbell"><img alt="" height="24" src="http://www.gravatar.com/avatar/54c1d4d9c1fadb93f045616682f9706d?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/yfactorial" rel="contact" title="yfactorial"><img alt="" height="24" src="http://www.gravatar.com/avatar/abaf52cd995f15b141560c4d001a8495?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/tobi" rel="contact" title="tobi"><img alt="" height="24" src="http://www.gravatar.com/avatar/94eb1850ba7cf818144aec68cf8f20aa?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/jamis" rel="contact" title="jamis"><img alt="" height="24" src="http://www.gravatar.com/avatar/992fe8c19bbbc27f2b562a9f96efc03d?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/FooBarWidget" rel="contact" title="FooBarWidget"><img alt="" height="24" src="http://www.gravatar.com/avatar/204784d162fece694532d2ef5cdc5ca5?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/nakajima" rel="contact" title="nakajima"><img alt="" height="24" src="http://www.gravatar.com/avatar/3399cbfb9e5fec93c324789b29309911?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/notahat" rel="contact" title="notahat"><img alt="" height="24" src="http://www.gravatar.com/avatar/c9c7a65848f13e2b1a226bbe43bc3672?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/rtomayko" rel="contact" title="rtomayko"><img alt="" height="24" src="http://www.gravatar.com/avatar/abfc88b96ae18c85ba7aac3bded2ec5e?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/mislav" rel="contact" title="mislav"><img alt="" height="24" src="http://www.gravatar.com/avatar/8f93a872e399bc1353cc8d4e791d5401?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/jeremymcanally" rel="contact" title="jeremymcanally"><img alt="" height="24" src="http://www.gravatar.com/avatar/6d3c187a8b3ef53b08e3e7e8572c4fea?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/mattly" rel="contact" title="mattly"><img alt="" height="24" src="http://www.gravatar.com/avatar/de032f4237a3c33f1557fe668bed37aa?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/dchelimsky" rel="contact" title="dchelimsky"><img alt="" height="24" src="http://www.gravatar.com/avatar/5d38ab152e1e3e219512a9859fcd93af?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/topfunky" rel="contact" title="topfunky"><img alt="" height="24" src="http://www.gravatar.com/avatar/a9d024f5032b8de04d7c74528beb77ab?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/mischa" rel="contact" title="mischa"><img alt="" height="24" src="http://www.gravatar.com/avatar/ff937b6907db49432c980f2b6a5c7e71?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/jeremy" rel="contact" title="jeremy"><img alt="" height="24" src="http://www.gravatar.com/avatar/24d2f8804e6bb4b7ea6bd11e0a586470?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/entp" rel="contact" title="entp"><img alt="" height="24" src="http://www.gravatar.com/avatar/a99bd98f4ed85c0cb1be50e9f1a46eae?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/rack" rel="contact" title="rack"><img alt="" height="24" src="http://www.gravatar.com/avatar/5f4c764ffac5f39a327ff00942a01515?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/sinatra" rel="contact" title="sinatra"><img alt="" height="24" src="http://www.gravatar.com/avatar/049b3d4227187b11c5c5ae4df472fda7?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/toconnell" rel="contact" title="toconnell"><img alt="" height="24" src="http://www.gravatar.com/avatar/3a435b21a323d931cd9a1c566de8c38b?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/jchris" rel="contact" title="jchris"><img alt="" height="24" src="http://www.gravatar.com/avatar/f73048cc21035713618d5ffa690001f4?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/adamwiggins" rel="contact" title="adamwiggins"><img alt="" height="24" src="http://www.gravatar.com/avatar/fcafc7eab67d34d48b14f9d70bc05713?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/giraffesoft" rel="contact" title="giraffesoft"><img alt="" height="24" src="http://www.gravatar.com/avatar/aefacc79816f2a05349cb22868d16ce3?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/iamwilhelm" rel="contact" title="iamwilhelm"><img alt="" height="24" src="http://www.gravatar.com/avatar/887ce7326836f3941ea12d7585386ba0?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/joshbuddy" rel="contact" title="joshbuddy"><img alt="" height="24" src="http://www.gravatar.com/avatar/c7e2ce5b40f683dfb6c1bdf5e6af0c72?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/binarylogic" rel="contact" title="binarylogic"><img alt="" height="24" src="http://www.gravatar.com/avatar/328f0bb678423fcea01ebe3b0edc74e6?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/methodmissing" rel="contact" title="methodmissing"><img alt="" height="24" src="http://www.gravatar.com/avatar/28314d64ae18c43f6b5428dc00a48e6e?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/DrBold" rel="contact" title="DrBold"><img alt="" height="24" src="http://www.gravatar.com/avatar/900a334a70ad697b08f30adf28267231?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/brynary" rel="contact" title="brynary"><img alt="" height="24" src="http://www.gravatar.com/avatar/535d73db0b47b6f745e9981e80dabdb4?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/igrigorik" rel="contact" title="igrigorik"><img alt="" height="24" src="http://www.gravatar.com/avatar/a17f0025641b4be419a6cd3845e55dd2?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/ajordan" rel="contact" title="ajordan"><img alt="" height="24" src="http://www.gravatar.com/avatar/c00720d07e1123b054935d0dcb2428ca?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/dejan" rel="contact" title="dejan"><img alt="" height="24" src="http://www.gravatar.com/avatar/0970bae1e752f9bafbddf62c07db66ad?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/grosser" rel="contact" title="grosser"><img alt="" height="24" src="http://www.gravatar.com/avatar/59436ecd4fe6ad7c34f67654d839f05f?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/actionrails" rel="contact" title="actionrails"><img alt="" height="24" src="http://www.gravatar.com/avatar/c644c5f20b9004567404677d9840589e?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/qrush" rel="contact" title="qrush"><img alt="" height="24" src="http://www.gravatar.com/avatar/eb8975af8e49e19e3dd6b6b84a542e26?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/jeresig" rel="contact" title="jeresig"><img alt="" height="24" src="http://www.gravatar.com/avatar/b3e04a46e85ad3e165d66f5d927eb609?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/ddollar" rel="contact" title="ddollar"><img alt="" height="24" src="http://www.gravatar.com/avatar/d7210ed93db93fbfa3de0c2215d83b9a?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
<li>
      <a href="http://github.com/Shopify" rel="contact" title="Shopify"><img alt="" height="24" src="http://www.gravatar.com/avatar/c5c29e455b8c4f05112abbc01af58a29?s=24&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-24.png" width="24" /></a>
      </li>
</ul>
</div>
<p>Dig around the users that I follow, check out what they're been up to, and try it out. If you find that your feed becomes a bit much to manage, try subscribing to your personal RSS feed. There's a link on the home page when you're logged in. </p>
<p>Thanks, GitHub. You're the best. </p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/06/11/github-protip-follow-other-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatically Rotate your Log Files in Development</title>
		<link>http://almosteffortless.com/2009/06/11/automatically-rotate-your-log-files-in-development/</link>
		<comments>http://almosteffortless.com/2009/06/11/automatically-rotate-your-log-files-in-development/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 02:51:40 +0000</pubDate>
		<dc:creator>Trevor</dc:creator>
				<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1395</guid>
		<description><![CDATA[I'm trying to save hard drive space, since I've got this super small (and fast?) SSD hard drive on the way. I noticed that I was using a TON of space to store totally worthless logs for my Rails apps. Now, I know I could set up proper log rotation, but I don't feel like [...]]]></description>
			<content:encoded><![CDATA[<p>I'm trying to save hard drive space, since I've got this super small (and fast?) SSD hard drive on the way. I noticed that I was using a TON of space to store totally worthless logs for my Rails apps. Now, I know I could set up proper log rotation, but I don't feel like going through the trouble for my local machine. </p>
<p>Here's a quick tip I picked up <a href="http://marklunds.com/articles/one/410">here</a> that will set your logs to automatically rotate in the test and development environments. Just add the following line to these files:</p>
<ul>
<li>config/development.rb</li>
<li>config/test.rb</li>
</ul>
<pre>config.logger = Logger.new(config.log_path, 2, 20.megabytes)</pre>
<p>Make sure you've got these in your .gitignore file as well:</p>
<pre>/log/*
*.log</pre>
<p>That will keep your log files under control, but with plenty of room for digging in if need be. </p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/06/11/automatically-rotate-your-log-files-in-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speed up your Apache/Passenger Rails app in 2min</title>
		<link>http://almosteffortless.com/2009/06/11/speed-up-your-apachepassenger-rails-app-in-2min/</link>
		<comments>http://almosteffortless.com/2009/06/11/speed-up-your-apachepassenger-rails-app-in-2min/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 02:39:44 +0000</pubDate>
		<dc:creator>Trevor</dc:creator>
				<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1402</guid>
		<description><![CDATA[Here's a quick tip for speeding up your Apache/Passenger powered Rails app. It'll take you about 2 minutes, and I guarantee you'll notice the speed-up. 

SSH onto your VPS
Run the following commands: "a2enmod expires" and "a2enmod deflate"

Now, open up your Apache vhost config for your Rails app. Add the following:

Then, restart Apache by running: "/etc/init.d/apache2 [...]]]></description>
			<content:encoded><![CDATA[<p>Here's a quick tip for speeding up your Apache/Passenger powered Rails app. It'll take you about 2 minutes, and I guarantee you'll notice the speed-up. </p>
<ul>
<li>SSH onto your VPS</li>
<li>Run the following commands: "a2enmod expires" and "a2enmod deflate"</li>
</ul>
<p>Now, open up your Apache vhost config for your Rails app. Add the following:</p>
<p><script src="http://gist.github.com/128392.js"></script></p>
<p>Then, restart Apache by running: "/etc/init.d/apache2 restart"</p>
<p>This will gzip your html, css, and javascript. It'll also add far future expires headers for the appropriate cacheable filetypes. There's no downside, and it only takes a second. Bang for buck. </p>
<p><b>Edit</b>: Check the comments for some possible downsides... ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/06/11/speed-up-your-apachepassenger-rails-app-in-2min/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 6-11-09</title>
		<link>http://almosteffortless.com/2009/06/11/weekly-digest-6-11-09/</link>
		<comments>http://almosteffortless.com/2009/06/11/weekly-digest-6-11-09/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 02:09:12 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1398</guid>
		<description><![CDATA[In this edition, Timothy moves to Washington DC and Trevor trims down his "watch list" on GitHub and shares many interesting projects with you via his delicious feed. 
Trevor's Links
Email. Twice daily. No more, no less.
So, using some motivation from The Four Hour Workweek1, I opted to come back to the studio and change my [...]]]></description>
			<content:encoded><![CDATA[<p>In this edition, Timothy moves to Washington DC and Trevor trims down his "watch list" on <a href="http://github.com/trevorturk">GitHub<a> and shares many interesting projects with you via his <a href="http://delicious.com/trevorturk">delicious</a> feed. </p>
<h3>Trevor's Links</h3>
<p><a href="http://www.robbyonrails.com/articles/2009/06/10/email-twice-daily-no-more-no-less">Email. Twice daily. No more, no less.</a></p>
<blockquote><p>So, using some motivation from The Four Hour Workweek1, I opted to come back to the studio and change my behavior. That morning, I emailed my entire team and my clients to let them know that I would only be checking my email at 10am and 4pm each day.</p></blockquote>
<p><a href="http://blog.linkibol.com/post/How-to-Build-a-Popularity-Algorithm-You-can-be-Proud-of.aspx">How to Build a Popularity Algorithm You can be Proud of</a></p>
<blockquote><p>Many web sites allow users to casts vote on items. These visitors' votes are then often used to detect the items' "popularity" and hence rank the rated items accordingly. And when "rank" comes into play things gets tricky...</p></blockquote>
<p><a href="http://forum.nin.com/bb/read.php?9,731489">Online communities, etc.</a></p>
<blockquote><p>Anyway, I'm bored on a long bus drive and there's no real moral to the story here, just writing. I will be tuning out of the social networking sites because at the end of the day it's now doing more harm than good in the bigger picture and the experiment seems to have yielded a result. Idiots rule.</p></blockquote>
<p><a href="http://marklunds.com/articles/one/410">Really Simple Rails Log Rotatation</a></p>
<blockquote><p>I always used logrotate Linux tool to setup log rotation for my Rails apps which has worked fine although it required finding some external config file and understanding its config options and syntax. [Great tip for development/test environments. Might not be a good idea in production?]</p></blockquote>
<p><a href="http://justinblanton.com/2009/03/instapaper-bookmarklet">Instapaper bookmarklet, modified to close the current tab</a></p>
<blockquote><p>I modified the bookmarklet slightly so that the tab closes immediately, without disturbing the pop-up. This way, saving something for later is one simple action, instead of two.</p></blockquote>
<p><a href="http://delicioussafari.com/">DeliciousSafari</a></p>
<blockquote><p>Use and create Delicious bookmarks from the Safari web browser.</p></blockquote>
<p><a href="http://blog.leetsoft.com/2009/6/2/so-about-this-shopify-platform">So, about this Shopify Platform</a></p>
<blockquote><p>The Shopify platform allows any programmer to create applications that integrate natively with the administration interface or storefront. These applications can be written in any language and communicate with Shopify using our handcrafted REST API. We even provide some amazing rails generators to get started quickly.</p></blockquote>
<p><a href="http://jamesgolick.com/2009/6/4/introducing-trample-a-better-load-simulator.html">Introducing Trample: A Better Load Simulator</a></p>
<blockquote><p>Most load sim tools make requests to a static list of urls. They spawn n threads and make requests to the urls on the list in succession, in each thread. Unfortunately, though, if your applicaition makes use of any kind of caching (including your database's internal caching facilities), this kind of load simulation is unrealistic.</p></blockquote>
<p><a href="http://www.tosback.org/timeline.php">TOSBack | The Terms-Of-Service Tracker</a></p>
<blockquote><p>TOSBack keeps an eye on 44 website policies. Every time one of them changes, you'll see an update here.</p></blockquote>
<p><a href="http://blog.twitter.com/2009/06/not-playing-ball.html">Twitter Blog: Not Playing Ball</a></p>
<blockquote><p>We do recognize an opportunity to improve Twitter user experience and clear up confusion beyond simply removing impersonation accounts once alerted. We'll be experimenting with a beta preview of what we're calling Verified Accounts this summer.</p></blockquote>
<p><a href="http://code.google.com/p/cdto/">cdto</a></p>
<blockquote><p>Fast mini application that opens a Terminal.app window cd'd to the front most finder window. This app is designed (including it's icon) to placed in the finder window's toolbar.</p></blockquote>
<h3>Trevor's GitHub Links</h3>
<p><a href="http://github.com/quirkey/sammy/tree/master">quirkey's sammy</a></p>
<blockquote><p>Sammy is a tiny javascript framework built on top of jQuery inspired by Ruby's Sinatra.</p></blockquote>
<p><a href="http://github.com/kabuki/heresy/tree/master">kabuki's heresy</a></p>
<blockquote><p>Heresy is a schema free wrapper around your database, heavily inspired by both CouchDB and FriendFeed.</p></blockquote>
<p><a href="http://github.com/paulmars/seven_minute_abs/tree/master">paulmars's seven_minute_abs</a></p>
<blockquote><p>ab testing for rails</p></blockquote>
<p><a href="http://github.com/binarylogic/searchlogic/tree/v2">binarylogic's searchlogic at v2</a></p>
<blockquote><p>Searchlogic has been completely rewritten for v2. It is much simpler and has taken an entirely new approach. To give you an idea, v1 had ~2300 lines of code, v2 has ~350 lines of code.</p></blockquote>
<p><a href="http://github.com/semanticart/is_paranoid/tree/master">semanticart's is_paranoid</a></p>
<blockquote><p>ActiveRecord 2.3 compatible gem "allowing you to hide and restore records without actually deleting them." Yes, like acts_as_paranoid, only implemented differently...</p></blockquote>
<p><a href="http://github.com/brynary/webrat/tree/master">brynary's webrat</a></p>
<blockquote><p>Webrat - Ruby Acceptance Testing for Web applications.</p></blockquote>
<p><a href="http://github.com/mbleigh/twitter-auth/tree/master">mbleigh's twitter-auth</a></p>
<blockquote><p>Standard authentication stack for Rails using Twitter to log in.</p></blockquote>
<p><a href="http://github.com/courtenay/splam/tree/master">courtenay's splam</a></p>
<blockquote><p>Simple, pluggable, easily customizable score-based spam filter plugin for Ruby-based applications.</p></blockquote>
<p><a href="http://github.com/jeremy/ruby-prof/tree/master">jeremy's ruby-prof</a></p>
<blockquote><p>a fast code profiler for Ruby</p></blockquote>
<p><a href="http://github.com/nakajima/roleful/tree/master">nakajima's roleful</a></p>
<blockquote><p>Generic roles for you and your objects.</p></blockquote>
<p><a href="http://github.com/37signals/wysihat/tree/master">37signals's wysihat</a></p>
<blockquote><p>A WYSIWYG JavaScript framework</p></blockquote>
<p><a href="http://github.com/binarylogic/authlogic/tree/master">binarylogic's authlogic</a></p>
<blockquote><p>A clean, simple, and unobtrusive ruby authentication solution.</p></blockquote>
<p><a href="http://github.com/joshuaclayton/blueprint-css/tree/master">joshuaclayton's blueprint-css</a></p>
<blockquote><p>A CSS framework that aims to cut down on your CSS development time.</p></blockquote>
<p><a href="http://github.com/stephencelis/dots/tree/master">stephencelis's dots</a></p>
<blockquote><p>Free progress dots for your scripts. Test::Unit-style.</p></blockquote>
<p><a href="http://github.com/wycats/merb-extlib/tree/master">wycats's merb-extlib</a></p>
<blockquote><p>Ruby core extensions library extracted from Merb core.</p></blockquote>
<p><a href="http://github.com/jodosha/plugin_migrations/tree/master">jodosha's plugin_migrations</a></p>
<blockquote><p>Rake tasks for running plugin migrations.</p></blockquote>
<p><a href="http://github.com/tcocca/acts_as_follower/tree/master">tcocca's acts_as_follower</a></p>
<blockquote><p>A Plugin to add "Follow" functionality for models</p></blockquote>
<p><a href="http://github.com/mojodna/active_queue/tree/master">mojodna's active_queue</a></p>
<blockquote><p>A toolkit for queueing tasks and creating worker processes</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/06/11/weekly-digest-6-11-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 5-31-09</title>
		<link>http://almosteffortless.com/2009/05/31/weekly-digest-5-31-09/</link>
		<comments>http://almosteffortless.com/2009/05/31/weekly-digest-5-31-09/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 02:42:04 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1387</guid>
		<description><![CDATA["Weekly" ]]></description>
			<content:encoded><![CDATA[<p>"Weekly" <- in scare-quotes</p>
<h3>Trevor's Links</h3>
<p><a href="http://factoryjoe.com/blog/2009/05/26/stowe-boyd-launches-microsyntax-org/">Stowe Boyd launches Microsyntax.org</a></p>
<blockquote><p>Stowe Boyd launched Microsyntax.org... a number of ideas for making posts on Twitter contain more information than what is superficially presented, and this new effort should create a space in which ideas, research, proposals and experiments can be made and discussed.</p></blockquote>
<p><a href="https://payments.amazon.com/sdui/sdui/business?sn=paynow/subscription">Amazon Payments Account Management</a></p>
<blockquote><p>Amazon Simple Pay Subscriptions enables you to charge your customers on a recurring basis using a single authorization from the customer. It is for those who offer digital content subscriptions, collect membership dues on a periodic basis, or provide premium services on their website.</p></blockquote>
<p><a href="http://www.siliconvalleywatcher.com/mt/archives/2009/05/7_great_reasons.php">7 Great Reasons Not To Take VC Money</a></p>
<blockquote><p>Raising venture capital for early stage start-ups seems to be the prevailing path for most entrepreneurs; however, most would-be founders should reconsider.</p></blockquote>
<p><a href="http://jcs.biologists.org/cgi/content/full/121/11/1771">The importance of stupidity in scientific research</a></p>
<blockquote><p>The crucial lesson was that the scope of things I didn't know wasn't merely vast; it was, for all practical purposes, infinite. That realization, instead of being discouraging, was liberating. If our ignorance is infinite, the only possible course of action is to muddle through as best we can.</p></blockquote>
<p><a href="http://themomorohoax.com/2009/05/21/when-to-use-self-in-ruby-rails-models">When to use self in Rails models</a></p>
<blockquote><p>When I started with Rails, half the words in my models were self. This wasn’t necessary. Now, when I edit code by other people, I find myself constantly deleting “self” from their code.</p></blockquote>
<p><a href="http://themomorohoax.com/2009/05/21/ruby-code-should-be-as-clear-as-english-the-guy-on-the-street-test">The random person test</a></p>
<blockquote><p>Why not try to write code that future programmers will thank me for because it was so clear and obvious? Programmer skill should be measured not only in the complexity of the problems that they can solve, but in the clarity of their solutions.</p></blockquote>
<p><a href="http://www.contrast.ie/blog/patience-and-hard-work/">Patience and hard work</a></p>
<blockquote><p>There is a gaping chasm between a web app sitting on a server somewhere, and the ingredients of a business. Establishing a brand, getting the right kind of people to listen, and growing your own customer-base doesn’t happen as a by product of really sweet Javascript effects.</p></blockquote>
<p><a href="http://radar.oreilly.com/2009/05/google-wave-what-might-email-l.html">Google Wave: What Might Email Look Like If It Were Invented Today</a></p>
<blockquote><p>Google wants other providers to adopt Wave - the protocol allows federation between independent Wave clouds. The team hopes that Wave will become as ubiquitous and interoperable as email and instant messaging, not just a Google product.</p></blockquote>
<p><a href="http://news.ycombinator.com/item?id=629040">Ask HN: I'm Tired of Hacking. What Do I Do? Please Advise.</a></p>
<blockquote><p>I just can't do it anymore. I hate sitting on my ass all day writing some code. My neck has been hurting for two years for spending so many hours in front of the computer. I kind of have been hating my career for a couple of years now and I have no clue about what I should do.</p></blockquote>
<p><a href="http://merbist.com/2009/05/27/macruby-changing-the-ruby-ecosystem/">MacRuby, changing the Ruby ecosystem</a></p>
<blockquote><p>MacRuby is an Apple-sponsored, open source, full Ruby implementation on top of  Objective-C runtime. In other words, whatever code runs on Ruby 1.9, should/will run on MacRuby. Yes, you read correctly, MacRuby can/will be able to run all your Ruby code.</p></blockquote>
<p><a href="http://www.bitcetera.com/en/techblog/2009/05/27/mac-friendly-autotest/">Mac-friendly Autotest</a></p>
<blockquote><p>ZenTest’s autotest is great, but it has one drawback: In order to detect whether you have modified a file, it relies on filesystem polling. In other words it constantly traverses the filesystem and thus causes a lot of CPU and harddrive load.</p></blockquote>
<p><a href="http://railstips.org/2009/5/15/include-verse-extend-in-ruby">Include vs Extend in Ruby</a></p>
<blockquote><p>Now that we know the difference between an instance method and a class method, let’s cover the difference between include and extend in regards to modules. Include is for adding methods to an instance of a class and extend is for adding class methods. Let’s take a look at a small example.</p></blockquote>
<p><a href="http://railstips.org/2009/5/11/class-and-instance-methods-in-ruby">Class and Instance Methods in Ruby</a></p>
<blockquote><p>Class methods can only be called on classes and instance methods can only be called on an instance of a class. It’s simple when you understand it, but I remember being confused when I was learning Ruby. Hope this helps. If I was unclear or incorrect at any point above, let me know. [Nice, easy to follow overview.]</p></blockquote>
<p><a href="http://simonwillison.net/2009/May/19/djng/">djng—a Django powered microframework</a></p>
<blockquote><p>djng is my experiment to see what Django would like without settings.py and with a whole lot more turtles. It’s Yet Another Python Microframework.</p></blockquote>
<p><a href="http://www.holovaty.com/writing/django-two-phased-rendering/">Django tip: Caching and two-phased template rendering</a></p>
<blockquote><p>We've launched user accounts at EveryBlock and we faced the interesting problem of needing to cache entire pages except for "You're logged in as [username]" bit top page. The solution ended up using is two-phased template rendering.</p></blockquote>
<p><a href="http://www.scribd.com/doc/3188436/Assembling-Pages-Last-Edge-Caching-ESI-and-Rails">Assembling Pages Last: Edge Caching, ESI and Rails</a></p>
<blockquote><p>[Good overview of ESI pros/cons.]</p></blockquote>
<p><a href="http://factoryjoe.com/blog/2009/05/18/the-open-social-web/">The open, social web</a></p>
<blockquote><p>If I told you that the iPhone was the best example of the success of standards and open source, you’d probably laugh at me, but check it out...</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://hostingfu.com/article/server-monitoring-cacti-serverstats">Server Monitoring with Cacti + ServerStats | HostingFu</a></p>
<blockquote><p>This is kind of cool: if you've got a computer somewhere on your local network and you want the laity to have access to rough stats, all you've got to do is fire this package up, tweak xinetd a little bit, and voila--your boss can look over your shoulder from the comforts of his own office.</p></blockquote>
<p><a href="http://www.slicehost.com/articles/2009/5/19/slicehost-for-android">Slicehost for Android // Slicehost - VPS Hosting</a></p>
<blockquote><p>Trevor pointed me in the direction of this one. It's a neat little app--very minimalist and very Linux-y--that lets you check on your bandwidth, slice stats (e.g. mem/proc/distro name and version) and gives you the option to do a remote /sbin/poweroff or an /sbin/shutdown -h now. Very neat.</p></blockquote>
<p><a href="http://threatpost.com/blogs/research-password-secret-question-woefully-insecure">Research: Password 'secret question' woefully insecure</a></p>
<blockquote><p>Let's get a movement going here: if enough Internet types spread the word that no one in their right mind or who possesses any kind of meaningful credential endorses "secret questions" and that, in fact, the research shows that they make accounts _less_ secure, maybe we can kick up enough dust to get rid of them.</p></blockquote>
<p><a href="http://www.cmdln.org/2009/05/19/three-letters/">Three Letters</a></p>
<blockquote><p>This take on the classic joke has a sysadmin slant; guaranteed to be appreciated by everyone from Exchange rebooters in silk cravats to consolemen who live on the metal.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/05/31/weekly-digest-5-31-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Samba: change a Windows user’s hashed password. And then change it back.</title>
		<link>http://almosteffortless.com/2009/05/21/samba-change-a-windows-users-hashed-password-and-then-change-it-back/</link>
		<comments>http://almosteffortless.com/2009/05/21/samba-change-a-windows-users-hashed-password-and-then-change-it-back/#comments</comments>
		<pubDate>Thu, 21 May 2009 16:54:36 +0000</pubDate>
		<dc:creator>Timothy O'Connell</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1379</guid>
		<description><![CDATA[File this one under "hacks". Cross-list it under "more basic administrative tasks you can't do on Windows".
Here's the situation: you're the admin of a Windows domain where the Domain Controller is a Linux box serving Samba. Your problem, other than the fact that you're surrounded by Windows users, is that you've got a user who's [...]]]></description>
			<content:encoded><![CDATA[<p>File this one under "hacks". Cross-list it under "more basic administrative tasks you can't do on Windows".</p>
<p>Here's the situation: you're the admin of a Windows domain where the Domain Controller is a Linux box serving Samba. Your problem, other than the fact that you're surrounded by Windows users, is that you've got a user who's password you don't know and, for whatever reason, you need to log onto your Windows domain <em>as</em> that user: a simple <em>RUNAS</em> won't cut it this time. </p>
<p>Normally, you'd just nuke his password, change it to "password" (or whatever), log on as him, do your dirty, sinful business, log off, expire his password and then send him an email telling him that his password has been changed to "password" and that he'll be prompted to change it at his next log on.</p>
<p>But what if that wasn't an option? What if you needed to log on to your domain as that user and it was important that he be none the wiser?</p>
<h2>Grab the Hashes</h2>
<p>First, use your favorite smbldap-type tool to get the current password info on the user you're fixin' to use:
<pre>frances:~# smbldap-usershow toconnell
<strong>dn: uid=toconnell,ou=Users,dc=domain,dc=com</strong>
objectClass: top,person,organizationalPerson,inetOrgPerson,posixAccount,shadowAccount,sambaSamAccount
cn: toconnell
sn: toconnell
givenName: toconnell
uid: toconnell
uidNumber: 1007
[...]
sambaPwdCanChange: 1202398556
sambaPwdMustChange: 9223372036854775807
<strong>sambaLMPassword: BE41CD009FF0812C718CCFD7D98A52AA
sambaNTPassword: 9454453CBC8A48DEF442F6B0A10B3EAA</strong>
sambaPwdLastSet: 1202398556
<strong>userPassword: {SSHA}baSDvXS6C6DSBNkJGyEYplprZ3wslAa/</strong></pre>
<p>Copy everything that's bolded and stick it somewhere safe. That <em>dn</em> information is going to be necessary later on, as it contains the ldap tags that you'll need to specify the record you want to modify; those hashes at the bottom are the user's original passwords and, when you want to cover your tracks later on, you'll need that info.</p>
<p>Now that you've got those hashes, you're free to nuke the user's password (again, using your favorite smbldap-type-tool or however else you like to reset passwords), log in as him, do whatever you have to do, and then log out:
<pre>frances:~# smbldap-passwd toconnell
Changing UNIX and samba passwords for toconnell
New password:
Retype new password:
</pre>
<p>Once you're out, you're going to want to set his password back to what it once was. This is where <em>ldapmodify</em> comes into play.</p>
<h2>Kerberos</h2>
<p>Before you can do that, however, you'll need to get a <em>kerberos</em> ticket. This is because you'll need to be <em>kerberos</em>-authenticated to make your ldap modifications stick. So, first things first, get yourself an admin <em>kerberos</em> ticket:
<pre>frances:~# kinit toconnell/admin
Password for toconnell/admin@DOMAIN.COM:
frances:~# </pre>
<h2>ldapmodify</h2>
<p>A quick glance at the man page for <em>ldapmodify</em> shows that the most convenient way to make changes to an ldap entry is to use the <em>-f</em> flag and an input file. The example in the man page for how to construct the input file is this:
<pre> dn: cn=Modify Me,dc=example,dc=com
           changetype: modify
           replace: mail
           mail: modme@example.com
           -
           add: title
           title: Grand Pooba</pre>
<p>So, using the data we got above, we're going to make a similar file containing the original hashes from our target user in order to change his password back to what it used to be:
<pre>dn: uid=toconnell,ou=Users,dc=domain,dc=com
changetype: modify
replace: sambaLMPassword
sambaLMPassword: BE41CD009FF0812C718CCFD7D98A52AA
-
replace: sambaNTPassword
sambaNTPassword: 9454453CBC8A48DEF442F6B0A10B3EAA</strong>
-
replace: userPassword
userPassword: {SSHA}abSDvXS6C6DSBNkJGyEYplprZ3wslAa/</pre>
<p>Remember to include those "-" characters and to give them their own line: if you fail to do that, you'll get mystery errors about unknown types, etc.</p>
<p>Once you've got your file, fire off your changes like this:
<pre>ldapmodify -f /path/to/file</pre>
<p>And that's all you've got to do. When the original user attempts to log in with his old password, everything will look perfectly normal to him: you never saw his password in plaintext and, as far as he's concerned, none of this ever happened.</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/05/21/samba-change-a-windows-users-hashed-password-and-then-change-it-back/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 5-17-09</title>
		<link>http://almosteffortless.com/2009/05/17/weekly-digest-5-17-09/</link>
		<comments>http://almosteffortless.com/2009/05/17/weekly-digest-5-17-09/#comments</comments>
		<pubDate>Mon, 18 May 2009 02:55:44 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1375</guid>
		<description><![CDATA[Trevor's Links
Interview with Ian Hickson, editor of the HTML 5 specification
You’ve heard it’s coming in 2012. Or maybe 2022. It’s certainly not ready yet, but some parts are already in browsers now so for the standards-savvy developers, the future is worth investigating today. Ian “Hixie” Hickson, editor of the HTML 5 specification, hopes that the [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://www.webstandards.org/2009/05/13/interview-with-ian-hickson-editor-of-the-html-5-specification/">Interview with Ian Hickson, editor of the HTML 5 specification</a></p>
<blockquote><p>You’ve heard it’s coming in 2012. Or maybe 2022. It’s certainly not ready yet, but some parts are already in browsers now so for the standards-savvy developers, the future is worth investigating today. Ian “Hixie” Hickson, editor of the HTML 5 specification, hopes that the spec will go to Last Call Working Draft in October this year.</p></blockquote>
<p><a href="http://www.rubyinside.com/the-mega-railsconf-2009-round-up-1757.html">The Mega RailsConf 2009 Round Up</a></p>
<blockquote><p>A week ago, RailsConf 2009 kicked off in Las Vegas. As usual, it didn't fall short on drama, interesting sessions, and inspiration for the 1000+ attendees. This post is an after-event summary and long-term source of links to the best RailsConf 2009 related content found so far.</p></blockquote>
<p><a href="http://www.37signals.com/svn/posts/1728-nuts-bolts-campfire-loves-erlang">Nuts & Bolts: Campfire loves Erlang</a></p>
<blockquote><p>Erlang definitely isn’t a replacement for Rails, but it is a fantastic addition to our collective toolbox for problems that Rails wasn’t designed to address. It’s always easier to work with the grain than against it, and adding more tools makes that more likely.</p></blockquote>
<p><a href="http://tango.freedesktop.org/Tango_Icon_Theme_Guidelines">Tango Icon Theme Guidelines</a></p>
<blockquote><p>The Tango icon theme's goal is to make applications not seem alien on any desktop. A user running a multiplatform application should not have the impression that the look is unpolished and inconsistent with what he or she is used to. While this isn't about merging styles of all desktop systems, we do aim to not be drastically different on each platform.</p></blockquote>
<p><a href="http://lifehacker.com/5240827/rightzoom-makes-the-os-x-maximize-button-more-like-windows">RightZoom Makes the OS X Maximize Button More Like Windows</a></p>
<blockquote><p>Mac OS X only: System utility RightZoom runs in the background and modifies the OS X maximize behavior to fill the whole screen—perfect for readers that recently made the switch to Mac.</p></blockquote>
<p><a href="http://railscasts.com/episodes/158-factories-not-fixtures">Railscasts - Factories not Fixtures</a></p>
<blockquote><p>Fixtures are external dependencies which can make tests brittle and difficult to read. In this episode I show a better alternative using factories to generate the needed records. [I prefer Machinist to Factory Girl, but this is a particularly good episode all around.]</p></blockquote>
<p><a href="http://github.com/rails/rails/commit/4932f7b38f72104819022abca0c952ba6f9888cb">db/seeds.rb in Rails</a></p>
<blockquote><p>Added db/seeds.rb as a default file for storing seed data for the database. Can be loaded with rake db:seed (or created alongside the db with db:setup). (This is also known as the "Stop Putting Gawd Damn Seed Data In Your Migrations" feature) [DHH]</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://www.matasano.com/log/1674/the-security-implications-of-google-native-client/">The Security Implications Of Google Native Client</a></p>
<blockquote><p>This is a really cool from Matasano about how things like ActiveX and Java work from the perspective of someone trying to execute compiled code from a remote source without giving away the whole store, security-wise. Nice pictures, very informative.</p></blockquote>
<p><a href="http://www.debianadmin.com/how-to-add-date-and-time-to-your-bash-history-file.html">How to Add Date And Time To Your Bash History file -- Debian Admin</a></p>
<blockquote><p>This is a neat one-liner for your .bashrc that just might make your .bash_history a little more searchable. Add it to your custom .bashrc lines.</p></blockquote>
<p><a href="http://www.irbs.net/internet/postfix/0608/1651.html">Postfix main.cf analysis</a></p>
<blockquote><p>Here's the setup: the one dude pastes his postconf -n and the other dude does through it, telling him what's what. Kind of a cross between a postmortem and an x-ray. Useful to test your postfix knowledge/skills.</p></blockquote>
<p><a href="http://seerofsouls.com/wiki/How-Tos/SplitScreenVi">SoS Wiki - - Split Screen Vi</a></p>
<blockquote><p>If you use vi/vim and you don't do split screen, you are, in the immortal words of whatever Internet meme, doing it wrong. Study up!</p></blockquote>
<p><a href="http://www.howtogeek.com/howto/ubuntu/set-gmail-as-default-mail-client-in-ubuntu/">Set Gmail as Default Mail Client in Ubuntu :: the How-To Geek</a></p>
<blockquote><p>This is a neat little trick for writing a line or two of bash that will allow you to use gmail (via firefox) as your default email client in a gnome environment. It wouldn't take much to adapt the instructions for other desktop environments. (Props to Artie for sending this my way)</p></blockquote>
<p><a href="http://www.securityfocus.com/brief/957">Reports: Thief holds Virginia medical data ransom</a></p>
<blockquote><p>I guess, technically, that since I'm on the side of the law by virtue of my professional situation, I ought to regard this as terrifying or reprehensible or something. But you gotta admit: something about the idea of a blackhat utterly pwning someone's network to the extent of the pwnage described here is really, really exciting.</p></blockquote>
<p><a href="http://www.cyberciti.biz/faq/postfix-backup-mx-server-anti-spam/">Postfix Backup MX eMail Server Anti-Spam Configuration</a></p>
<blockquote><p>The English is a little messy on this one, but the conf text is right on. This is a nice little list of basic (yet above and beyond "stock") config options for reducing shenanigans and closing commonly exploited gaps.</p></blockquote>
<p><a href="http://snippets.dzone.com/posts/show/4819">Restore a single table from a large MySQL backup</a></p>
<blockquote><p>I'm not sure that I understand the ruby syntax completely, but people are passing this link around, so this is my obligatory bump.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/05/17/weekly-digest-5-17-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stupid Linux Tricks: Basic Server Hardening (Debian Lenny)</title>
		<link>http://almosteffortless.com/2009/05/15/stupid-linux-tricks-basic-server-hardening-debian-lenny/</link>
		<comments>http://almosteffortless.com/2009/05/15/stupid-linux-tricks-basic-server-hardening-debian-lenny/#comments</comments>
		<pubDate>Fri, 15 May 2009 21:02:22 +0000</pubDate>
		<dc:creator>Timothy O'Connell</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1353</guid>
		<description><![CDATA[Due to recent events involving some computers I administer, I've become very interested in security. Basically, I've dodged enough bullets thanks to little more than beginner's luck and I figure that it's about time to take responsibility for the safety and security of my computers. 
Since I was interested in hardening up two Debian boxes [...]]]></description>
			<content:encoded><![CDATA[<p>Due to recent events involving some computers I administer, I've become very interested in security. Basically, I've dodged enough bullets thanks to little more than beginner's luck and I figure that it's about time to take responsibility for the safety and security of my computers. </p>
<p>Since I was interested in hardening up two Debian boxes running Lenny, I started off by taking a look at the <a href="http://www.debian.org/doc/manuals/securing-debian-howto/securing-debian-howto.en.ps">Securing Debian Manual</a>, <a href="http://www.linuxquestions.org/questions/linux-security-4/security-references-45261/">this very helpful page on LQ</a> and the results of a <em>tiger</em> audit. </p>
<p>Do this to generate a tiger audit of your server:
<pre># aptitude install tiger
tiger -E</pre>
<p>The "-E" gets you what's called an "explanation report", which will be useful in helping you understand what can be some fairly cryptic output.</p>
<p>Additionally, the package version of <em>tiger</em> comes with some nice default settings for the main executable and for <em>tigercron</em>, which, as you might imagine, runs some minor scans on a pre-defined schedule. </p>
<p>At any rate, once I had my audit and had picked up a few bright ideas from the SDM, I made a number of changes to all of my web-facing production machines. What follows are some things that you might want to consider doing on your Debian Lenny servers:</p>
<h3><strong>Users and Permissions</strong></h3>
<ol>
<li><strong>Password Audit:</strong> first, I decided to get to know my user accounts a little better. This meant running <em>john</em> (formerly "john the ripper", a password cracker that reads hashed passwords and tries to decipher them) against my <em>/etc/shadow</em> to see who was using dictionary-based passwords and who was using other types of insecure passwords:
<pre># aptitude install john
# john /etc/shadow </pre>
<p>This took a while to run--a little over a day, but I had it <em>nice</em>d pretty high--but of the 10 user accounts it cracked, it was good to know which ones were using hilariously insecure passwords and which ones probably weren't going to cracked by your garden variety brute force password cracker. </li>
<p><strong>NB:</strong> if you run <em>john</em> against your <em>/etc/shadow</em> and realize that you've got a problem child on your hands, there's always <em>chroot</em>. Here is <a href="http://www.howtoforge.com/chroot_ssh_sftp_debian_etch">a really good how-to on chroot-jailing</a> a user.</p>
<li><strong>The Prunening:</strong> odds are, if you've been living on a system for more than a few months, you've accumulated some users (either from software that you've installed and then removed or by meeting user/developer needs, etc.) that aren't doing anything. One of the basic tenets of server security is having the smallest amount of users with the least amount of access to the smallest number of programs possible.
<p>In some environments, you've simply got to have a bunch of users in your <em>/etc/passwd</em>. In most situations, however, it makes good sense to just hit all the derelicts with a <em>userdel</em> and only having to worry about angry users not having enough access (rather than having to worry about unauthorized users having too much access).</li>
</ol>
<h3>Keeping Script Kiddies Under Control</h3>
<p>In my (admittedly limited) experience, the most trouble you're going to run into from script kiddies are anonymous, unfocused attacks that attempt to gain access to your machine via either a.) the <em>/tmp</em> directory, b.) DoS-based exploints or c.) application attacks like SQL injections, XSS or directory traversal attacks. </p>
<p>Since guarding against application attacks is something that programmers are supposed to be handling, I decided to focus on stopping <em>/tmp</em> abuse and trying to stymie DoS attacks.</p>
<ol>
<li><strong>Mounting <em>/tmp</em> with <em>noexec</em></strong>: in this age of VPSes and shared hosting, it's more often the case than not that you won't get to decide how your machine is partitioned. If, like me, you live on <a href="http://slicehost.com">Slicehost</a> and you're running Debian, your partition scheme looks like this:
<pre>lana:/# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              19G  9.0G  8.9G  51% /
tmpfs                 256M     0  256M   0% /lib/init/rw
udev                  256M   20K  256M   1% /dev</pre>
<p>What this means is that you've got your  <em>/tmp</em> directory on your <em>/</em> partition. Which partition is, by necessity, allows files to be executable.</p>
<p>And that, as I have learned (the hard way), is bad news. What this means is that, you've got a directory on your <em>/</em> partition--the partition where all your apps and data probably live--that is writable/readable by every Li, Ivan and Harry from Taipei to Yaktusk. And if one of the thousands of bots who knocks on your door every month knows how to write to <em>/tmp</em> and you don't catch him right away, it's pretty much game over for your TLD or your IP Address: one day, you'll wake up and find that your info is on every spam list on the Internet because your server has been under remote control via IRC for the last three weeks and now your full time job is trying to get your info <em>off</em> of those lists while planning a full OS re-install.</p>
<p>Ideally, you would be able <em>/tmp</em> its own partition and mount that partition with <i>noexec</i>. And while it would be optimal, it sometimes isn't an option if you're a part of the VPS set. </p>
<p>And if you can't control your installation or maybe you just can't take down a production server, what you can do is warn your users/developers that you're about to cause a little temporary chaos (get it? <em>temporary</em> chaos?), move your existing <em>/tmp</em> to some place else and create a small filesystem that you <em>can</em> mount <em>noexec</em> to use as <em>/tmp</em>. On Debian Lenny, that would look approximately like this:
<pre>gonzo:/# mv /tmp /old_tmp
# dd if=/dev/zero of=/.tmpfs bs=1024 count=1000000
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 29.1302 s, 35.2 MB/s
gonzo:/# mkfs.ext3 -j .tmpfs
[...]
gonzo:/# mount -o loop,noexec,nosuid,rw /.tmpfs /tmp/
gonzo:/# mv /old_tmp/* /tmp/.</pre>
<p><em>Et voila!</em> You've got a 1GB "drive" that's mounted <em>noexec</em> at <em>/tmp</em> that's ready to roll out. Any attempts to execute anything on that partition will result in a bad interpreter error. Check it:
<pre>gonzo:/# ls -l tmp/
total 20
-rwxr-xr-x 1 root root    37 2009-05-15 14:54 executeMe.py
drwx------ 2 root root 16384 2009-05-15 14:51 lost+found
gonzo:/# test/executeMe.py
bash: test/executeMe.py: /usr/bin/env: bad interpreter: Permission denied</pre>
<p>All you've got to do now is add that mount info to your <em>fstab</em> and you're ready to start sleeping at night again:
<pre>/.tmpfs           /tmp            ext3    loop,nosuid,noexec,rw  0      0</pre>
<p><strong>NB:</strong> don't forget that <em>/tmp</em> wants to have the sticky bit turned on (i.e. be chmoded to 1777). Also don't forget to make <em>/var/tmp</em> a symlink that points to <em>/tmp</em>.<br />
Also: props to <a href="http://blogs.techrepublic.com.com/opensource/?p=171">Vincent Danen's post on <em>/tmp</em></a> at TechRepublic for the idea.
</li>
<li><strong>mod_evasive to Prevent DoS</strong>: after a recent DoS experience, I decided to install Apache <em>mod_evasive</em> to reduce the risk of getting flat-lined/broad-sided by DoS/DDoS attacks:
<pre># aptitude install libapache2-mod-evasive</pre>
<p>The beauty of using packaged software is that that's really all you have to do: <em>apt</em> will copy the files, create the symbolic links and restart apache for you. Nice.</li>
<li><strong>sysctl real-time kernel Modifications:</strong> Additionally, you might also want to use a slightly obscure command called <em>sysctl</em> (which modifies kernel perameters while the kernel is running, so consider yourself warned) to take a precaution against a DoS tactic called "syn flooding":
<pre># sysctl -w net.ipv4.tcp_syncookies=1</pre>
<p>This is a sort of controversial measure--apparently it defies some RFC docs for TCP/IP--but setting <em>tcp_syncookies</em> to False has yet to have affected any of my computers.</p>
<p>There are a number of additional security features you can activate with this command; Google it and prepared to be awed by some of the features of your OS you can control in real-time with <em>sysctl</em>.</li>
</ol>
<h3>For the Tin-foil Hat Crowd</h3>
<p>What follows are non-specific countermeasures and settings that, while obscure and probably unlikely to save you from becoming an unwitting member of some Russian bot master's herd, might help you feel more secure in the knowledge that even if someone does get non-root shell access, he's probably not going to be able to do too much damage.</p>
<ol>
<li><strong>Add <code>/usr/bin/mesg n</code> to <em>root</em>'s <em>.bashrc</em> File:</strong><br />
executing <em>mesg n</em> on log in, prevents an admittedly rare exploit through which other users can execute arbitrary code as <em>root</em> by sending messages to his terminal.</li>
<li><strong>Modify <em>/etc/inittab</em> to Prevent Non-root Users from Rebooting the System with <em>ctrl+alt+del</em>.</strong> In the stock <em>/etc/inititab</em> on Debian Lenny, you've got this line:
<pre># What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now</pre>
<p>Which is hardly optimal: this lets pretty much anyone who figures out a way to execute programs in <em>/etc/sbin</em> reboot the system. I changed it to:
<pre>ca:12345:ctrlaltdel:/bin/false</pre>
</li>
<li><strong>SMTPD Settings</strong> If you run <em>postfix</em>, you should probably check up on your relay settings and update your external blacklist providers if you haven't done it in a while. Your mail server is the world's first line of defense against everything from phishing/spear-phishing to headline-making super worms:
<pre>smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks,
  reject_unauth_destination,
  reject_unauth_pipelining,
  reject_invalid_hostname,
  reject_rbl_client sbl-xbl.spamhaus.org,
  reject_rbl_client cbl.abuseat.org,
  reject_rbl_client bl.spamcop.net,
  reject_rbl_client zen.spamhaus.org
smtpd_helo_required = yes
disable_vrfy_command = yes

smtpd_data_restrictions =
            reject_unauth_pipelining,
            permit
</pre>
<p>That <code>smtpd_help_required</code> line might not seem like anything special, but I have a script that parses <em>/var/log/mail.log</em> output and, when you do get a spammer that responds to the <code>helo</code> request, a lot of times he'll come back with his actual domain. </p>
<p>It's fun for research/study/personal amusement reasons, basically.</li>
</ol>
<p>While some people might say that the above is overkill--that it's just not worth the time and effort to audit and harden at this level--but I'd say that this level of focus on security isn't so much "overkill" as it is "a pretty good start." </p>
<p>Because my thinking is that if you've got the root password, you're probably already the anxious type. And at the very least, being a little bit OCD about security on your all-important, mission-critical application servers might help you feel a little less anxious. Which is definitely worth the effort.</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/05/15/stupid-linux-tricks-basic-server-hardening-debian-lenny/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Do This: Spamassassin (Debian, Postfix)</title>
		<link>http://almosteffortless.com/2009/05/12/do-this-spamassassin-debian-postfix/</link>
		<comments>http://almosteffortless.com/2009/05/12/do-this-spamassassin-debian-postfix/#comments</comments>
		<pubDate>Tue, 12 May 2009 17:06:22 +0000</pubDate>
		<dc:creator>Timothy O'Connell</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1348</guid>
		<description><![CDATA[There's a great episode of MASH in which the over-zealous paranoid-schizophrenic Colonel Flagg, in an attempt to coerce the impossibly calm and notoriously imperturbable Dr Stanley Freedman into collusion with one or another of his hare-brained schemes, asks the psychiatrist: "You wanna do your self a favor?"
"Why Not?" replies the doc. "Who deserves one more?"
If [...]]]></description>
			<content:encoded><![CDATA[<p>There's a great episode of MASH in which the over-zealous paranoid-schizophrenic Colonel Flagg, in an attempt to coerce the impossibly calm and notoriously imperturbable Dr Stanley Freedman into collusion with one or another of his hare-brained schemes, asks the psychiatrist: "You wanna do your self a favor?"</p>
<p>"Why Not?" replies the doc. "Who deserves one more?"</p>
<p>If you've got a Debian Lenny box out in the wild serving your email with <em>postfix</em> and you're <strong>not</strong> using spamassassin as a filter,  you really ought to consider doing yourself a favor and throwing that spamassassin piece into the mix: it only takes a second, it will increase security for your users-- hardening up your network little bit--and make the world a slightly better place for everyone.</p>
<ol>
<li>If you're OK with letting <em>aptitude</em> resolve your dependencies and manage your packages, all you need to do is install a single package:
<pre># aptitude install spamassassin</pre>
</li>
<li>Once that's done, crack open <em>/etc/default/spamassassin</em> with your favorite editor and enable it to run as a daemon and update itself automatically:
<pre># Change to one to enable spamd
#ENABLED=0
ENABLED=1

# Cronjob
# Set to anything but 0 to enable the cron job to automatically update
# spamassassin's rules on a nightly basis
#CRON=0
CRON=1</pre>
<p>(<em>spamd</em> is an old name for spamassassin: you'll notice a lot of the RHEL/CentOS/Fedora boxes out there running <em>spamd</em>.</li>
<li>Take a look at <em>/etc/spamassassin/local.cf</em>: there are some fun options that you can uncomment and enable in there. My personal favorite one is:
<pre>rewrite_header Subject *****SPAM*****</pre>
<p>This does what it sounds like it does and rewrites the headers of suspicious emails: you can then easily configure your email client to recognize these headers and filter accordingly. Pretty sweet.</li>
<li>Start spamassassin:
<pre># /etc/init.d/spamassassin start</pre>
</li>
<li>At this point, we're going to edit some <em>postfix</em> conf files, but we need to check on something first. Make sure <em>SA</em> is running, spawning children and listening on the right port:
<pre># netstat -anp |grep spam
tcp        0      0 127.0.0.1:783           0.0.0.0:*               LISTEN      11724/spamd.pid
unix  2      [ ACC ]     STREAM     LISTENING     9096119  1717/master         private/spamassassin
unix  3      [ ]         STREAM     CONNECTED     9757173  30093/spamd child
unix  3      [ ]         STREAM     CONNECTED     9757172  11724/spamd.pid  </pre>
</li>
<li>Noting that <em>SA</em> is listening on 783, tack the following on to the bottom of your <em>/etc/postfix/master.cf</em>:
<pre>spamassassin unix -     n       n       -       -       pipe
        user=nobody argv=/usr/bin/spamc -f -e
        /usr/sbin/sendmail -oi -f ${sender} ${recipient}</pre>
</li>
<li> Now find the SMTP/SMTPS lines in your <em>/etc/postfix/master.cf</em> and add the following option:
<pre>-o content_filter=spamassassin</pre>
<p> Assuming you're doing SMTP and SMTPS, you'll have something like this at the top of your <em>/etc/postfix/master.cf</em>:
<pre>smtp      inet  n       -       -       -       -       smtpd     -o content_filter=spamassassin
smtps     inet  n       -       -       -       -       smtpd     -o content_filter=spamassassin</pre>
</li>
<li> Reload Postfix:
<pre># postfix reload</pre>
</li>
</ol>
<p>And that's it: you're done.</p>
<p>If you can bear in mind that no spam-detection scheme is perfect, my guess is that you'll be pleased with your decision to set up <em>SA</em>: some spam will make it through, of course, but most of makes it through will come a.) as plaintext with escaped characters and b.) a lengthy disclaimer and an itemized spam "score":
<pre>Spam detection software, running on the system "molly", has
identified this incoming email as possible spam.  The original message
has been attached to this so you can view it (if it isn't spam) or label
similar future email.  If you have any questions, see
the administrator of that system for details.

Content preview:  Having trouble viewing this email? Click here! pharmacy medicine
   cabinet FSA home medical vitamins personal care diet & fitness men's SALE
   Get 80% Discount TODAY: This email was sent to you by drugstore.com. To ensure
   delivery to your inbox (not junk folders), please add drugstore@e.drugstore.com
   to your address book. [...] 

Content analysis details:   (13.5 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
 2.0 URIBL_BLACK            Contains an URL listed in the URIBL blacklist
                            [URIs: lewdozed.cn]
 0.5 FH_HELO_EQ_D_D_D_D     Helo is d-d-d-d</pre>
<p>...and so on.</p>
<p>So go ahead: do yourself a favor.</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/05/12/do-this-spamassassin-debian-postfix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 5-3-09</title>
		<link>http://almosteffortless.com/2009/05/03/weekly-digest-5-3-09/</link>
		<comments>http://almosteffortless.com/2009/05/03/weekly-digest-5-3-09/#comments</comments>
		<pubDate>Sun, 03 May 2009 23:36:02 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1332</guid>
		<description><![CDATA[Apologies for the 3 week gap in "weekly" posts. I was taking a vacation in Hawaii (pics!) and took a bit of time to enjoy life offline :)
Trevor's Links
Geocities: Lessons So Far
Geocities was once called Beverly Hills Internet. The company was founded in 1994 but it wasn’t until mid-1995 that they publically offered what people [...]]]></description>
			<content:encoded><![CDATA[<p>Apologies for the 3 week gap in "weekly" posts. I was taking a vacation in Hawaii (<a href="http://picasaweb.google.com/trevorturk/Hawaii#">pics!</a>) and took a bit of time to enjoy life offline :)</p>
<h3>Trevor's Links</h3>
<p><a href="http://ascii.textfiles.com/archives/1961">Geocities: Lessons So Far</a></p>
<blockquote><p>Geocities was once called Beverly Hills Internet. The company was founded in 1994 but it wasn’t until mid-1995 that they publically offered what people now think of as a Geocities trademark: free webpages, or “homesteads”. [An article about the Archive Team trying to save Geocities content before Yahoo takes it down.]</p></blockquote>
<p><a href="http://www.readwriteweb.com/archives/how_the_oauth_security_battle_was_won_open_web_sty.php">How the OAuth Security Battle Was Won, Open Web Style - ReadWriteWeb</a></p>
<blockquote><p>At some point in conversation Hammer-Lahav realized that the problem went far beyond the Twitter implementation. The OAuth protocol had an inherent vulnerability; big companies like Google, Netflix and Yahoo had implemented OAuth and scores of tiny startups had too... OAuth has support, but it doesn't have a centralized authority ready to deal with problems like this. Over the next week a story unfolded as the community moved to deal with the security issue. It's a dramatic story.</p></blockquote>
<p><a href="http://www.reddit.com/r/AskReddit/comments/8ft5j/tell_me_your_best_worst_joke_reddit/">Tell me your best worst joke, Reddit.</a></p>
<blockquote><p>[Includes such classics as: What's brown and sticky? A stick. --- Why does Snoop carry around an umbrella? Fo Drizzle. --- and, my personal favorite: Two snares and a cymbal fall off a cliff.]</p></blockquote>
<p><a href="http://bigbangtechnology.com/blog/post/welcome_to_the_anti-pitch">Welcome to the Anti-Pitch</a></p>
<blockquote><p>We're sick and tired of hack developers ripping off naive clients. And while I'm completely disgusted by some of the horror-stories I've heard lately, clients keep asking the wrong questions. As real developers, it's our responsibility to make the tough decision to speak the truth. This is an example of what we call the anti-pitch. [Excellent. I'm using this technique next time I'm dealing with potential clients.]</p></blockquote>
<p><a href="http://www.businessinsider.com/what-twitter-looks-like-for-twitter-employees-screenshots-2009-4">What Twitter Looks Like For Twitter Employees</a></p>
<blockquote><p>...hackers sent them screenshots from the site Twitter employees use to manage the microblogging service, admin.twitter.com... [It's amazing to see all of the back-end stuff necessary to run something so "simple" as Twitter.]</p></blockquote>
<p><a href="http://mad.ly/2009/05/01/honeypot-filter-as-a-rack-middleware/">Honeypot filter as a Rack middleware</a></p>
<blockquote><p>Our site’s suggestion box got hammered by a spambot recently, so I created this simple Rack middleware to protect our app from any requests that include a honeypot field.</p></blockquote>
<p><a href="http://github.com/rails/rails/commit/72160d9f89481ea60c8268ff026099f07b1e5ed6">Rails Edge: Implement FooController.action(:name)</a></p>
<blockquote><p>Rails actions are now Rack endpoints, and can be retrieved via FooController.action(name) and called with an env.</p></blockquote>
<p><a href="http://paulbuchheit.blogspot.com/2009/04/make-your-site-faster-and-cheaper-to.html">Make your site faster and cheaper to operate in one easy step</a></p>
<blockquote><p>Is your web server using using gzip encoding? Surprisingly, many are not. I just wrote a little script to fetch the 30 external links off news.yc and check if they are using gzip encoding. Only 18 were, which means that the other 12 sites are needlessly slow, and also wasting money on bandwidth.</p></blockquote>
<p><a href="http://www.contrast.ie/blog/passenger-command-line-done-right/">Passenger: Command line done right</a></p>
<blockquote><p>What’s really great about Passenger is that the attention to detail doesn’t end at the installer. The Linux process list is a list of programs that are currently running. Usually, programs are shown in this list by their command line name, often an indecipherable mix of letters and numbers. Passenger processes are easy to spot and easy to understand. Human readable names in a machine-centred interface.</p></blockquote>
<p><a href="http://www.subtraction.com/2009/04/30/muxtape-pushes-play-again">Muxtape Pushes Play Again</a></p>
<blockquote><p>Muxtape’s stock parts are highly regimented, allowing bands to express themselves with freedom, though not completely freely. Every component is 300 pixels square, and there is virtually zero layout flexibility; you can have whatever arrangement you like, so long as it comes in rows of three. What’s more, for now there are no ‘social’ components to draw upon; no commenting, no friending, no favoriting, etc. The new Muxtape platform is nothing if not regimented.</p></blockquote>
<p><a href="http://www.randsinrepose.com/archives/2009/04/30/an_aspirational_twitter.html">An Aspirational Twitter</a></p>
<blockquote><p>Tweetie is a desktop version of an application of the same name for the iPhone which, in my limited experience, is the first time an application has migrated from the phone to the desktop. As a friend mentioned, “Platform merge in progress!” and he’s right... When I use Tweetie, I’m reminded that a maniacal attention to detail not only makes you want to reach out and touch the digitally untouchable, it describes the familiar as the new, and, most importantly, it speaks of an aspirational future.</p></blockquote>
<p><a href="http://github.com/adamsanderson/open_gem/tree/master">adamsanderson's open_gem</a></p>
<blockquote><p>Gem Command to easily open a ruby gem with the editor of your choice. [Awesome. See the Issues tab for detail, but you need to set GEM_OPEN_EDITOR to 'mate' in your bash profile despite what the instructions might say.]</p></blockquote>
<p><a href="http://www.atebits.com/tweetie-mac/">Tweetie for Mac</a></p>
<blockquote><p>You can download the free version, which is ad-supported, and try it out for as long as you want. [The only Twitter client I've been able to use, aside from Tweetie on the iPhone.]</p></blockquote>
<p><a href="http://railspikes.com/2009/4/3/rails-test-benchmarks">Benchmarking your Rails tests</a></p>
<blockquote><p>The first step to faster tests is knowing what is slow. Fortunately, this is dead simple with the test_benchmark plugin by Tim Connor, and originally built by Geoffrey Groschenbach. Install the plugin, and when you run your tests via Rake, you’ll see handy output showing you the slowest tests, and the slowest test classes.</p></blockquote>
<p><a href="http://daringfireball.net/2009/04/twitter_clients_playground">Twitter Clients Are a UI Design Playground</a></p>
<blockquote><p>But perhaps the most important factor that has made Twitter such a rich category for client software is that there is so little friction to switch between apps. There’s nothing to import or export, and zero commitment.</p></blockquote>
<p><a href="http://www.techcrunch.com/2009/04/17/venture-capital-down-50-it’s-not-just-the-recession-folks/">Venture Capital Down 50%. It’s Not Just the Recession, Folks.</a></p>
<blockquote><p>There’s a huge difference between what venture capitalists say and what they do. [VC] fell off a cliff in 2001 and 2002 and it’s falling off a cliff now.</p></blockquote>
<p><a href="http://afreshcup.com/2009/04/28/a-painful-decision/">A Painful Decision</a></p>
<blockquote><p>I can’t reveal details without breaking confidences, but suffice it to say that a significant number of Rails core contributors - with leadership (if that’s the right word) from DHH - apparently feel that being unwelcoming and “edgy” is not just acceptable, but laudable. The difference between their opinions and mine is so severe that I cannot in good conscience remain a public spokesman for Rails. So, effective immediately, I’m resigning my position with the Rails Activists. [I haven't gotten up to speed with the controversy around this issue, but I can say for certain that Mike Gunderloy stepping back from his participation in the Rails community is a real serious bummer.]</p></blockquote>
<p><a href="http://blog.heroku.com/archives/2009/4/24/commercial_launch/">Heroku - Commercial Launch</a></p>
<blockquote><p>We have over 25,000 apps running on the platform today, and many of our users have been asking for pricing and paid services for some time now. So today we’re pleased to announce that we are officially out of beta and available for commercial use.</p></blockquote>
<p><a href="http://greyscalegorilla.com/blog/2009/04/16/shakeitphoto-launches/#comment-2253">ShakeItPhoto Launches</a></p>
<blockquote><p>It’s been 3 months in the making and 3 months of waiting for Apple approval, but wait no more… ShakeItPhoto is ready for download at the iTunes App store for the low price of 99 cents. Take a photo and shake it like a polaroid to make it develop!</p></blockquote>
<p><a href="http://github.com/blog/411-github-issue-tracker">GitHub Issue Tracker</a></p>
<blockquote><p>It gives us great pleasure to announce our integrated issue tracking system! On repository pages you’ll now see an “Issues” tab in the top menu.</p></blockquote>
<p><a href="http://blog.phusion.nl/2009/04/16/phusions-one-year-anniversary-gift-phusion-passenger-220/">Phusion Passenger 2.2.0 w/ Nginx support</a></p>
<blockquote><p>After spending weeks on further development and intensive testing, we’ve now come to the point wherein we have the distinct honor to announce Phusion Passenger for Nginx as an addition to the Phusion Passenger server line-up.. Our thanks goes out to Engine Yard for financially sponsoring this first release of Phusion Passenger for Nginx, as well as all the people who have in some way donated in the past for making this release possible in the first place.</p></blockquote>
<p><a href="http://www.codinghorror.com/blog/archives/001255.html">Is Open Source Experience Overrated?</a></p>
<blockquote><p>Just as commercial software can't possibly exist without customers, perhaps open source experience is only valid if you work on a project that attains some moderate level of critical mass and user base. Remember, shipping isn't enough. Open source or not, if you aren't building software that someone finds useful, if you aren't convincing at least a small audience of programmers that your project is worthwhile enough to join... then what are you really doing?</p></blockquote>
<p><a href="http://giantrobots.thoughtbot.com/2009/4/15/rails-2-3-2-upgrade-gotchas">Rails 2.3.2 upgrade gotchas</a></p>
<blockquote><p>With the latest stable release of rails out the door for about a month, we’ve had a chance to upgrade the bulk of the applications we maintain to 2.3.2.1. Here are some “gotchas”, aka issues, aka roadblocks to Strategic Enterprise Adoption that we discovered while upgrading some of them.</p></blockquote>
<p><a href="http://themomorohoax.com/2009/04/14/the-problem-with-project-management-tools">Draft: The problem with Project Management tools</a></p>
<blockquote><p>While I agree that it’s important to release code, I think pivotal and other similar tools lead to a mindset where releasing code is in itself the unit progress. But, as any successful team will tell you, completed tickets and releases released are horrible units of progress, since unless your customers love every single thing you do (they don’t), your unit of measurement becomes the amount of features and changes deployed.</p></blockquote>
<p><a href="http://blog.saush.com/2009/04/clone-tinyurl-in-40-lines-of-ruby-code/">Clone TinyURL in 40 lines of Ruby code</a></p>
<blockquote><p>I wrote Snip with Sinatra then deployed it up to Heroku so this is also a good excuse also to describe Heroku, a truly amazing service for the Ruby programming community. The total number of lines in Snip is actually 43, in a single file named snip.rb. including the view template and layout. [It's amazing what you can accomplish with Sinatra and Heroku.]</p></blockquote>
<p><a href="http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/">ruby gc tuning</a></p>
<blockquote><p>In my experience, a typical production Rails app on Ruby 1.8 can recover 20% to 40% of user CPU by applying Stefan Kaes's Railsbench GC patch to the Ruby binary, and using the following environment variables...</p></blockquote>
<p><a href="http://themomorohoax.com/2009/04/12/customer-driven-iteration-vs-whiteboard-driven-iteration">Customer driven iteration vs Whiteboard driven iteration</a></p>
<blockquote><p>Customer driven iteration takes customer validation rather than released features as its core unit of progress. It assumes that you have not accomplished anything and therefore cannot feel good until your metrics tell you that your market will use and pay for your stuff.</p></blockquote>
<p><a href="http://www.techcrunch.com/2009/04/11/can-the-statusphere-save-journalism/">Can the Statusphere Save Journalism?</a></p>
<blockquote><p>...the discussion shifted to deep conversation about the future of journalism in the era of socialized media with one simple question, “are newspapers worth saving?” Walt thought for no more than two seconds and assertively replied, “It’s the wrong question to ask. The real question we should ask is if whether or not we can save good journalism.”</p></blockquote>
<p><a href="http://www.techcrunch.com/2009/03/10/are-blogs-losing-their-authority-to-the-statusphere/">Are Blogs Losing Their Authority To The Statusphere?</a></p>
<blockquote><p>Attention is engaged at the point of introduction, and for many of us, we’re presented with worthwhile content outside of our RSS readers or favorite bookmarks. Relevant and noteworthy updates are now curated by our peers and trusted or respected contacts in disparate communities that change based on our daily click paths... Retweets (RT) and favorites in Twitter, Likes and comments in FriendFeed and Facebook, posting shortened links that connect friends and followers back to the source post, have changed our behavior and empowered our role in defining the evolution of the connectivity and dissemination of information.</p></blockquote>
<p><a href="http://github.com/jamis/safe_mass_assignment/tree/master">jamis's safe_mass_assignment</a></p>
<blockquote><p>ActiveRecord plugin for allowing (careful) mass assignment of protected attributes, separate from values provided via users of your application.</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://www.wains.be/index.php/2009/04/24/howto-setting-up-dns2tcp/">Sébastien Wains » Howto : setting up dns2tcp</a></p>
<blockquote><p>For the "I can't browse from work" crowd or the "stuck behind the Great Firewall of China" set, there are any number of high-visibility, high-availability solutions: tor, your buddy's apache proxy, etc. For those who want to try an obscurity/security/proxy solution that's a little closer to the metal, there's dns2tcp via ssh which, predictably, sends your encrypted traffic from your computer out of your network as a dns request and returns it the same way: you're secure going out and you're not sending up big, "hey everybody: look at my port 80 requests!" red flags to the secret police or the sysadmin or whomever. Cool stuff.</p></blockquote>
<p><a href="http://www.ibm.com/developerworks/web/library/wa-secureweb/?ca=dgr-lnxw82Web-Secure&S_TACT=105AGX59&S_CMP=grsitelnxw82">Securing a Web server</a></p>
<blockquote><p>This is a pretty good read: it's got a little too much depth to be considered a crash course, but it's too abstract to be a tutorial or how-to. A nice, mid-level view of best security practices.</p></blockquote>
<p><a href="http://www.dailykos.com/story/2009/3/26/713407/-Twitter-+-StimulusConservative-Stupidity">Twitter + Stimulus = Conservative Stupidity</a></p>
<blockquote><p>Normally I wouldn't bookmark DailyKos--that would be kind of like bookmarking HuffPo or Reddit--but this is a neat little article about social engineering / industrial espionage that involves exploiting confirmation bias among partisans. Short read. Good read.</p></blockquote>
<p><a href="http://lifehacker.com/5219538/should-comic-sans-be-banned">Lifehacker - Should Comic Sans Be "Banned"? - Fonts</a></p>
<blockquote><p>This made me laugh out loud. It may make you laugh out loud as well.</p></blockquote>
<p><a href="http://www.cometdocs.com/">Convert files and data online</a></p>
<blockquote><p>Supposedly this is the best online format converter. Handy in a pinch (or if you're tired of your CLI converters screwing the pooch on higher ascii and spitting out comic book character swears in place of kanji).</p></blockquote>
<p><a href="http://www.cmdln.org/2009/04/16/testing-mail-servers-with-swaks/">Testing mail servers with swaks</a></p>
<blockquote><p>At first glance, this looks like a "for Dummies" tutorial for a piece of software that is, essentially, "telnet for Dummes". But swak lets you do something that you can't (easily) do with plain, old-fashioned telnet. You can, for instance, set a timeout time, specify authentication types, etc. with a commandline flag or two. Handy if you're troubleshooting that new mail server install or doing some eyeball/ball park benchmarking.</p></blockquote>
<p><a href="http://www.dcs.qmul.ac.uk/~norman/papers/qa_metrics_article/index_qa_met.htm">Introduction to Quality Assurance and Metrics</a></p>
<blockquote><p>If you're looking for a no-bullshit crash course in QA/QC that has decent depth, look no further.</p></blockquote>
<p><a href="http://www.akihabaranews.com/en/news_details.php?id=17969">Fujitsu Develops High-Speed Image-Capture Technology for Palm Vein Biometric Authentication : Akihabara News .com</a></p>
<blockquote><p>Palm vein biometric authentication? Seriously? I mean, I guess super-futuristic biometric auth devices that scan _inside_ the body for unique identifiers are kind of cool in an aesthetic sense, but they're certainly not very cool from a security sense: I thought we had agreed as a global society that physical objects, no matter how apparently unique they are, are unsuitable for secure auth because they are, at the end of the day, still just objects. And all objects can be replicated.</p></blockquote>
<p><a href="http://consumerist.com/5200818/reader-finds-card-skimmer-on-bank-atm">Skimmers: Reader Finds Card Skimmer On Bank ATM</a></p>
<blockquote><p>First reaction: "wow that's totally awesome--I can't believe someone came up with this." Two seconds later's reaction: "wow, my opinion of the human race just got ratcheted down a peg or two: I can't believe it took us this long to invent the ATM card data skimmer."</p></blockquote>
<p><a href="http://www.smirkingchimp.com/thread/21289">The peasant mentality lives on in America</a></p>
<blockquote><p>You know, three weeks ago, I had no idea who Matt Taibbi was. Then, courtesy of reddit, I got put on to his write-up of the Meltdown and I've been hooked. This guy hits hard, doesn't pull punches and walks the stylistic tightrope between the unnaturally polite tenor of expose journalism and the warbling catachresis of incendiary blogging.</p></blockquote>
<p><a href="http://www.slate.com/id/2216218/">What happens if I don't pay my taxes?</a></p>
<blockquote><p>This is a good article because a.) it's timely and b.) is written from a hacker perspective/mentality. It starts with the question, "what is the nature of the system?" and then wonders about different methods of potentially short-circuiting it or circumventing aspects of it. Kind of makes taxes fun. Almost.</p></blockquote>
<p><a href="http://www.debian-administration.org/article/What_to_do_when_the_root_partition_is_full">What to do when the root partition is full?</a></p>
<blockquote><p>This is a good list of comments to scroll through as it discusses Linux mounting tricks, how to use LVM and, basically, lists reasons why not to panic. And, I don' t know about you, but the fewer reasons I have to panic, the better.</p></blockquote>
<p><a href="http://www.akihabaranews.com/en/news_details.php?id=17938">Thanko's Latest 4GB Necktie Camera</a></p>
<blockquote><p>Yeah, it's basically just a flat camera and a necktie that's been cut open in the back, but the idea is still totally effinf awesome.</p></blockquote>
<p><a href="http://www.howtoforge.com/a-short-introduction-to-cron-jobs">A Short Introduction To Cron Jobs</a></p>
<blockquote><p>There are two reasons that introductory level, "how to" type documents for the basics of Linux administration are so ubiquitous: those reasons are that they're useful for experienced users to a.) write and b.) comment upon and they're useful for inexperienced users looking things up. This one is about cron and using crontab. And it's a great example of that.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/05/03/weekly-digest-5-3-09/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Audit my Server – A guide to performing a quick and thorough security audit on your web-facing server</title>
		<link>http://almosteffortless.com/2009/04/29/audit-my-server-a-guide-to-performing-a-quick-and-thorough-security-audit-on-your-web-facing-server/</link>
		<comments>http://almosteffortless.com/2009/04/29/audit-my-server-a-guide-to-performing-a-quick-and-thorough-security-audit-on-your-web-facing-server/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 20:26:01 +0000</pubDate>
		<dc:creator>Timothy O'Connell</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1305</guid>
		<description><![CDATA[Security audits are a necessity.
Unfortunately, due to the constantly changing array of exploits and threats coming at your Internet-facing server from all over the world, there's no best practices manual for a security audit. This is because no one knows exactly what level of openness is appropriate/optimal on a given application server. 
But you gotta [...]]]></description>
			<content:encoded><![CDATA[<p>Security audits are a necessity.</p>
<p>Unfortunately, due to the constantly changing array of exploits and threats coming at your Internet-facing server from all over the world, there's no best practices manual for a security audit. This is because no one knows exactly what level of openness is appropriate/optimal on a given application server. </p>
<p>But you gotta start somewhere. Because if you're just blithely running an un-hardened *nix server with stock configurations for service apps like <em>Apache</em> and <em>ssh</em>, you're pretty much giving away the store.</p>
<p>What follows is a short how-to dealing with how to get started, security-auditing-wise. It is by no means comprehensive and is only intended to provide a "leg up" for those who feel like they ought to be auditing their servers but aren't sure where to start. I'll be using Debian systems running the current stable release (i.e. Lenny) to demonstrate the techniques, but I'll try to keep things as OS agnostic as possible: most of the packaged software I describe below can be found in your generic, mainstream <em>fedora</em> repo.</p>
<p>The methodology will be to start from the outside and work inward. I recently saw a <em>Linux Journal</em> article that described doing things the opposite way (or at least that's the impression with which I was left), and that doesn't make much sense to me. From where I'm standing, it seems that if you're conducting a security audit, you ought to start out by looking at your server the same way everyone else does.</p>
<p>Accordingly, we'll begin from the outside and from as basic a perspective as possible: scanning ports and checking for known vulnerabilities and obvious mis-configurations. Once we've got a little perspective on how our server looks to the script kiddies and botnets of the world, we'll do some web-server specific scanning to attempt to detect vulnerable plugins, apache mis-configurations and application-level security holes. After that, we'll finish by checking for rootkits and doing some internal auditing.</p>
<p><BR><BR><br />
<strong>OpenVAS: Port Probe and All-purpose scan</strong><br />
The first thing to do is to scan your ports. </p>
<p>The odds are good that if you've got a server out there on the Internet (in the DMZ of your intranet or in a hosting company's rack, for example) that it's got a bunch of open ports. You've probably got one or two listening for HTTP requests, one or two listening for SSH requests and so on. What you probably <em>haven't</em> got is a good idea of how those ports look to  the world.</p>
<p>So the first part of any security audit is the portscan. In olden times, you'd use a combination of <em>telnet</em> and <em>nmap</em> for this: <em>nmap</em> would handle the port scanning and tell you which ports were listening/open and then you'd use your expert knowledge of various network protocols to use a <em>telnet</em>-like program to check out those ports and see what sort of access and information they were offering to the world.</p>
<p>There are, fortunately, labor-saving apps that will do the scanning and auditing for you. A few months back, you would have been using <em>nessus</em>, as it was the big name in F/OSS auditing. <em>nessus</em>, however, has gone commercial (proprietary and closed) and a new, open project (GPL) called <em>OpenVAS</em> has taken its place.</p>
<p>For anything other than security auditing, using commercial software is probably OK. At the very least it's not <em>always</em> counter-productive to use non-F/OSS for non-security-related tasks. In the case of security-related apps, however, it just doesn't make any sense to take a chance on using software that isn't available for public scrutiny.</p>
<p>At any rate, if you're familiar with the way that <em>nessus</em> works, you'll be happy to know that the big ideas and the general methodology/procedure behind using <em>OpenVAS</em> are essentially the same. If you're unfamilar with programs like <em>nessus</em> and <em>OpenVAS</em>, here's how they work, from an administrator/auditor's perspective:
<ol>
<li>Set up a server</li>
<li>Use a client to tell the server to probe the target site</li>
<li>View the audit report on the client</li>
</ol>
<p>At present, if you're using the stock stable/unstable Debian repositories, you haven't got access to the packaged version of the OpenVAS server. That being the case, we're going to go ahead and get a little bit heroic here and do this the Cowboy Way (i.e. from source). </p>
<ol>
<li><strong>Dependencies and Source Files</strong></li>
<p>Make sure that you've got the following packages (some of which the openvas developers list as dependencies, some of which you'll need to compile anything from source) before proceeding:<br />
<code>molluska:/opt/# aptitude install libgnutls-dev libpcap-dev libgpgme11 libgpgme11-dev  libglib2.0 libglib2.0-dev build-essential bison</code></p>
<p>Now that that's handled, there are four "modules" that are required to run an OpenVAS server. The openvas developers say that you've got to install the modules in the following order:
<ol>
<li>openvas-libraries </li>
<li>openvas-libnasl </li>
<li>openvas-server </li>
<li>openvas-plugins</li>
</ol>
<p>So that's what wer're going to do. I like to do this sort of thing in<em>/opt</em>, but it really doesn't matter where this happens.</p>
<p>Get the files:<br />
<code>molluska:/opt/openvas# wget http://wald.intevation.org/frs/download.php/572/openvas-libraries-2.0.2.tar.gz<br />
molluska:/opt/openvas# wget http://wald.intevation.org/frs/download.php/561/openvas-libnasl-2.0.1.tar.gz<br />
molluska:/opt/openvas# wget http://wald.intevation.org/frs/download.php/562/openvas-server-2.0.1.tar.gz<br />
molluska:/opt/openvas# wget http://wald.intevation.org/frs/download.php/576/openvas-plugins-1.0.6.tar.gz</code><br />
<strong>NB:</strong> these URL's are for the version that was current when this was written--no guarantees that they'll be there two hours from now.</p>
<li><strong>./configure && make && make install</strong></li>
<p>Now, we start the compilation process which, thanks to our having resolved the dependencies enumerated above, should go off without a hitch:<br />
<code>molluska:/opt/openvas# tar -zxvf  openvas-libraries-2.0.2.tar.gz<br />
[...]<br />
molluska:/opt/openvas# cd openvas-libraries-2.0.2<br />
molluska:/opt/openvas/openvas-libraries-2.0.2# ./configure<br />
[...]<br />
molluska:/opt/openvas/openvas-libraries-2.0.2# make<br />
[...]<br />
molluska:/opt/openvas/openvas-libraries-2.0.2# make install</code></p>
<p>Once you've successfully installed the openvas libraries, you'll be prompted to modify <em>/etc/ld.so.conf</em> by adding the line "<code>/usr/local/lib</code>" to it and running <strong>ldconfig</strong> to update your linker. Do that, and then repeat the steps described above (untar, configure, make, make install) in the other three folders to finish installing the <em>OpenVAS</em> modules.</p>
<li><strong>Add a User and Generate an SSL Cert</strong></li>
<p>Once you've got everything installed, you'll need to create two things: an <em>OpenVAS</em> user and an SSL certificate. Fortunately, both of these tasks have been nearly fully automated and all you'll have do to get the job done is execute a couple of binaries (which should be on your path, now that you've installed everything according to the above instructions) and follow some on-screen prompts:
<pre>molluska:/opt/openvas# openvas-adduser
[...]
molluska:/opt/openvas# openvas-mkcert
[...]</pre>
<p>And that's it. Make a note of the paths that the <strong>openvas-mkcert</strong> program gives you at the end of the certificate creation (as you might need to specify them at some later time; you won't need them again to follow these instructions). </p>
<li><strong>Fire it up</strong></li>
<p>Once you've got all your modules installed, your certificate created and your user added, it's time to fire up the server/daemon. The smartest way to do this is to pseudo-daemonize it and tail its output while it loads plugins:<code>molluska:/# nohup openvasd &<br />
[1] 4508<br />
molluska:/# nohup: ignoring input and appending output to `nohup.out'<br />
molluska:/# tail -f nohup.out </code></p>
<p>Should get you something like this:<code>tail -f nohup.out<br />
Loading the plugins... 714 (out of 10558) </code></p>
<p>...and so on. Once the plugins are all the way loaded, fire off a quick <code>ps</code> to make sure that the server is running and maybe a quick <code>netstat</code> to make sure you know what port it's listening at, and that's it: you're done with the server side of things and ready to move on to the client and auditing part.
<pre>molluska:/opt/openvas# ps aux |grep openvas
root     26129  1.1  0.2  16296    76 ?        S    06:29   1:46 openvasd: waiting for incoming connections
molluska:/opt/openvas# netstat -anp |grep openvas
tcp        0      0 0.0.0.0:9390            0.0.0.0:*               LISTEN      26129/openvasd: wai
</pre>
</ol>
<p>Installing the <em>OpenVas</em> client is much easier. </p>
<p>While there is a packaged version of the <em>OpenVAS</em> client app, we're going to install one from source (mostly so our version of the server matches with our version of the client; this is mostly me being OCD, however, and you can probably get away with using the packaged version). To install the client, we'll follow the same steps as above, but on a different machine:
<pre>gonzo:/opt/openvas-client# wget http://wald.intevation.org/frs/download.php/575/openvas-client-2.0.3.tar.gz
[...]
gonzo:/opt/openvas-client# tar -zxvf openvas-client-2.0.3.tar.gz
[...]
gonzo:/opt/openvas-client# cd openvas-client-2.0.3
gonzo:/opt/openvas-client/openvas-client-2.0.3# ./configure
[...]
gonzo:/opt/openvas-client/openvas-client-2.0.3# make
[...]
gonzo:/opt/openvas-client/openvas-client-2.0.3# make install</pre>
<p><strong>NB:</strong> you may, depending on your client system, have to resolve some GTK dependencies and other build/compiler dependencies like the ones listed above: <code>libgtk2.0-dev</code> should solve most of your gtk problems, if you're running Debian Lenny.</p>
<p>Once the GUI client is installed, start it up:
<pre>toconnell@gonzo:~$ sudo aptitude install openvas-client
[...]
toconnell@gonzo:/opt/openvas-client/openvas-client-2.0.3/bin$ ./OpenVAS-Client &</pre>
<p><a href="http://almosteffortless.com/wp/wp-content/files/openvastutorial1.png"><div id="attachment_1314" class="wp-caption alignright" style="width: 224px"><img src="http://almosteffortless.com/wp/wp-content/files/openvastutorial1.png" alt="Connection Screen, OpenVAS GUI Client" title="openvastutorial1" width="214" class="size-full wp-image-1314" /><p class="wp-caption-text">Connection Screen, OpenVAS GUI Client</p></div></a><br />
Once the GUI client is up and running, click the connect icon at the top of the interface (looks like two gray tubes colliding) to open the window that allows you to specify your newly install server's location and settings. Fill in the blanks and connect:</p>
<p>Once your client is connected with your server, you're ready to fill in the blanks and start your first round of tests. This is fairly self-explanatory and, honestly, you wouldn't be reading this if you couldn't figure out simple GUI interfaces: specify your target (i.e. the server you're auditing), make sure that all the plugins are enabled and then click the life preserver to start the "Scan Assistant" and execute the scan. Follow the on-screen prompts: easy as apple pie.</p>
<p>The best thing to do, once your scan starts, is probably to go do something else and come back in a little bit: in my experience these scans can take anywhere from 15 to 45 minutes, depending on your server and your pipe: my server is an old Linksys NSLU2 and my pipe is a consumer-grade Speakeasy residential connection, so I'm used to waiting close to an hour for the scan to finish. Using corporate resources will result in less idle time.<br />
<a href="http://almosteffortless.com/wp/wp-content/files/openvastutorial21.png"><div id="attachment_1323" class="wp-caption alignleft" style="width: 310px"><img src="http://almosteffortless.com/wp/wp-content/files/openvastutorial21-300x158.png" alt="OpenVAS scan results report" title="openvastutorial21" width="300" height="158" class="size-medium wp-image-1323" /><p class="wp-caption-text">OpenVAS scan results report</p></div></a></p>
<p>Once the scan is done, you're treated to a report view. This is what we've been after all long. In it, you'll see a full run-down of what ports on your server are open and what open ports are listening for what. Additionally, you'll be treated to helpful recommendations about how to close security holes. And while closing those holes is beyond the scope of this article, I will say that almost every recommendation I've gotten from an OpenVAS report has been sane, been sensible and lead to a harder server.</p>
<p><BR><BR></p>
<p><strong><em>nikto</em>: Web-server Specific Auditing</strong><br />
The second thing to do, in order to perform a robust audit of your system, is to hit it with <em>nikto</em> (http://www.cirt.net/nikto2).</p>
<p><em>nikto</em>, unlike <em>OpenVAS</em> doesn't require a server/client hook-up: just install the client with <em>apt</em> and fire off some tests, writing the output from those tests to plaintext files:
<pre>molluska:/# aptitude install nikto
molluska:/# nikto -h newathens.org -p 80 -output nikto_na80 && nikto -h newathens.org -p 443 -output nikto_na443</pre>
<p>You'll get helpful output that points you towards an obvious solution like this:
<pre>+ mod_ssl/2.2.9 appears to be outdated (current is at least 2.8.30) (may depend on server version)</pre>
<p>And you'll also get put on notice if you've got paths/folders/files with names that automatic exploiters and scripts tend to look for:
<pre>+ OSVDB-3092: GET /login/ : This might be interesting...</pre>
<p>...to script kiddies and Chinese botnets. </p>
<p>You'll also get put on notice if you've got too much of your software's installation defaults hanging out in the open:
<pre>+ OSVDB-3233: GET /icons/README : Apache default file found.</pre>
<p><BR><BR></p>
<p><strong>Server-side Checks</strong></p>
<p><strong>chkrootkit</strong><br />
There are a few utilities that allow you to perform quick server-side audits of your security situation. Some of them, like <em>rkhunter</em> will run daily (like <em>logwatch</em> or <em>apticron</em>) and tell you if they've identified any new chinks in your armor. The first one to install and run is <em>chkrootkit</em>.
<pre>molly:/# aptitude install chkrootkit
[...]
molly:/# chkrootkit</pre>
<p>This is a great place to start your internal audit because it'll tell you if you've picked up any known bugs and whether anything weird, filesystem-wise, appears to be going on with your computer. </p>
<p>The best use for this app is to give you a very quick idea of what sort of shape you're in. If you've got a system littered with suspicious files, odd-looking binaries, etc., you know exactly where to start plugging holes.</p>
<p><strong>rkhunter</strong><br />
While we're on the subject of checking for root kits, let's do <em>rkhunter</em>:
<pre>molly:/# aptitude install rkhunter
[...]
molly:/# rkhunter --update
molly:/# rkhunter --check</pre>
<p>This gets you a quick check of all your important binaries (to make sure they look like they're supposed to look, i.e. that they haven't been replaced by scripted exploits or an intruder with something that opens a back door) and a quick scan for known exploits of the rootkit variety. You'll also be told whether you're running <em>inetd/xinetd</em> (which tends to open ports in a manner whose security can be less than "ironclad") and other fun facts about potential vulnerabilities. </p>
<p>The best thing to do with this report is think long and hard about what ports/resources/pathways you actually want to make available to the Internet and then start disabling services. Once you've spent some time with that, you're pretty well on your way to having an idea of exactly how hard your server is and how much work you've got to do to keep it safe.</p>
<p>If anyone has any ideas about other utilities or techniques for security auditing, please feel encouraged to share them in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/04/29/audit-my-server-a-guide-to-performing-a-quick-and-thorough-security-audit-on-your-web-facing-server/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>YUM for Weekend Warriors</title>
		<link>http://almosteffortless.com/2009/04/27/yum-for-weekend-warriors/</link>
		<comments>http://almosteffortless.com/2009/04/27/yum-for-weekend-warriors/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 16:38:48 +0000</pubDate>
		<dc:creator>Timothy O'Connell</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Red Hat]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1293</guid>
		<description><![CDATA[Generally speaking, I'm a Debian guy. 
Sure, I'll mess around on the CentOS box under my desk on the production RHEL servers at work a little bit, but Red Hat is largely terra incognita for me and Debian is where I'm comfortable doing my admin thing and managing packages. I know apt. I am comfortable [...]]]></description>
			<content:encoded><![CDATA[<p>Generally speaking, I'm a Debian guy. </p>
<p>Sure, I'll mess around on the CentOS box under my desk on the production RHEL servers at work a little bit, but Red Hat is largely <em>terra incognita</em> for me and Debian is where I'm comfortable doing my admin thing and managing packages. I know <em>apt</em>. I am comfortable with <em>apt</em>. And while I wouldn't describe using <em>yum</em> as something that makes me <em>un</em>comfortable, when I do have to use it, I find myself spending more time Googling and forum-searching than I'd like. </p>
<p>I'm beginning to accept that this is no one's fault but my own. </p>
<p>And so the purpose of this article, therefore, is not a.) to point fingers, b.) to compare <em>apt</em> to <em>yum</em> or c.) to explain <em>yum</em> from the perspective of someone who is accustomed to doing things the Debian way. The Internet is <em>littered</em> with stuff like that like the intersection of Paradise and Tropicana are littered with advertisements for escorts. </p>
<p>In <em>this</em> post you'll find some novice-level trouble-shooting tips, reminders and pointers for the casual <em>yum</em> user that are intended to help reduce the occurrence of forehead-slaps and to decrease the amount of time spent tailing logs and Googling obscure error messages.</p>
<ol>
<li><strong>Preemptive Troubleshooting.</strong></li>
<p>It's not in the documentation, but I have noticed that a lot of dependency issues and version consistency problems are resolved by tossing off the following <em>yum</em> command and then trying again:
<pre> # yum clean packages</pre>
<p>It has become my general practice to do this before I do anything else. It's a nice preemptive step.</p>
<p>I've noticed that it's generally not the advice of performance-minded (read: impatient) admins to do the more scorched-Earth <code>yum clean all</code>, as this empties caches, dbcaches (i.e. sqlite files) and can causes longer <code>check-update</code> times.</p>
<li><strong>filelists.xml.gz Download Times out.</strong></li>
<p>Let's say you're doing a <code>yum update</code> or a <code>yum upgrade</code> and you get some output like this:</p>
<pre>filelists.xml.gz          100% |=========================| 1.4 MB    00:01
filelists.xml.gz          100% |=========================| 1.3 MB    01:48
http://apt.sw.be/redhat/el5/en/i386/dag/repodata/filelists.xml.gz: [Errno 4] Socket Error: timed out
Trying other mirror.</pre>
<p>There are good odds, especially if you're using non-standard repositories, that you copied/pasted some text into your <code>yum.conf</code> from somewhere out there on the Internets. If you did, there are even better odds that the text you copied includes something about using GPG to authenticate the repo. If you've got lines like that, you'll need the repository's key. </p>
<p>Generally speaking, you can navigate to a repository's http site and find the URL for their public key. Once you've got that, all it takes to import it is one of these:
<pre># rpm --import http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt</pre>
<li><strong>Know your repositories</strong></li>
<p>You can save a lot of backtracking/head-scratching time if, before searching for a package on a machine you don't visit that often, you toss off a quick <code>yum repolist</code>. This handy feature will spit out the names and statuses of all of the repositories in all the files in your <code>/etc/yum.repos.d/</code> directory and prevent you from doing that thing where you don't realize that you've only got the default CentOS repositories enabled but can't seem to figure out why the eff your <em>yum</em> search for <code>htop</code> just turned up a big goose-egg.</p>
<li><strong>Automatic Notifications</strong></li>
<p>If, like me, you're coming at <em>yum</em> from a Debian perspective, one of the first things you'll do when you start administering an <em>RPM</em>-based system is to install the <em>apticron</em>-equivalent known as <em>yum-updatesd</em> (<code># yum install yum-updatesd.noarch</code>). Something you might forget, however, is that the default behavior of <em>yum-updatesd</em> is to <strong>not</strong> send emails.</p>
<p>Don't forget to edit <code>/etc/yum/yum-updatesd.conf</code> such that
<pre>mit_via = dbus</pre>
<p> looks like
<pre>mit_via = email</pre>
<p> or you won't get those all-important package update emails.
</ol>
<p>And that's about all that's coming to mind right now.</p>
<p>If anyone else can think of some things that you consistently forget--and then suddenly remember, 20 minutes later--to do when you're working with <em>yum</em>, feel free to leave a comment.</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/04/27/yum-for-weekend-warriors/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Administering Firefox: pushing browser preferences</title>
		<link>http://almosteffortless.com/2009/04/15/administering-firefox-pushing-browser-preferences/</link>
		<comments>http://almosteffortless.com/2009/04/15/administering-firefox-pushing-browser-preferences/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 19:47:18 +0000</pubDate>
		<dc:creator>Timothy O'Connell</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Firefox]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1290</guid>
		<description><![CDATA[This blog is going to end with a question that I have been unable, after countless minutes of Googling, to answer satisfactorily. It will start, however, with some givens.
I already know that if you want to alter the default settings for all profiles that will be created by a given Firefox installation in the future, [...]]]></description>
			<content:encoded><![CDATA[<p>This blog is going to end with a question that I have been unable, after countless minutes of Googling, to answer satisfactorily. It will start, however, with some givens.</p>
<p>I already know that if you want to alter the default settings for all profiles that will be created by a given Firefox installation in the future, you add the line for the preference that you want to effect those profiles to the file <em>FIREFOX_ROOT/defaults/profile/prefs.js</em>. </p>
<p>Similarly, I already also know that if you want to push a preference to all currently existing users on the machine, you add the line for that preference to <em>FIREFOX_ROOT/deftauls/pref/firefox.js</em>.</p>
<p>The caveat there, of course, is that if the user of the profile have already changed a preference in his personal prefs.js (i.e. the one in <em>HOMEDIR/.mozilla/firefox/RANDOMALPHANUMERICS.USERNAME/prefs.js</em>) and it conflicts with your preference in the (global) firefox.js, then you (the admin) are SOL, because the program will defer to the user's personal prefs.js file.</p>
<p>Which brings us to the question: is there a way (short of writing a script to parse individual user's personal prefs.js files and modify them as needed) to push a preference to all users of a given Firefox installation?</p>
<p>Full disclosure: I'm posing this question for two reasons. The first reason is that I'm sort of passive-aggressive with Firefox: ours is a very love-hate relationship. The second reason is that I honestly don't think that what I'm describing--i.e. adding a preference to one, "master" preferences file that effects all users of a given installation, regardless of their personal prefs.js file--can be done.</p>
<p>Am I missing something? Maybe even something truly forehead-slap-worthy that's at the top of all the documentation? Or is this a real limitation of the program?</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/04/15/administering-firefox-pushing-browser-preferences/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 4-12-09</title>
		<link>http://almosteffortless.com/2009/04/12/weekly-digest-4-12-09/</link>
		<comments>http://almosteffortless.com/2009/04/12/weekly-digest-4-12-09/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 02:21:53 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1285</guid>
		<description><![CDATA[Trevor's Links
Scarling
I've heard there's a big migration of ruby people to scala, and so the first thing I would say to the ruby people is that this is no panacea. It's not ruby on a JVM; it's an entirely new langauge, with much stronger java roots than any other language, so familiarity with java is [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://robey.lag.net/2008/05/07/scarling.html">Scarling</a></p>
<blockquote><p>I've heard there's a big migration of ruby people to scala, and so the first thing I would say to the ruby people is that this is no panacea. It's not ruby on a JVM; it's an entirely new langauge, with much stronger java roots than any other language, so familiarity with java is probably more helpful than python or ruby. On the other hand, if ruby whetted your appetite for functional programming, scala has more of that than ruby and python combined, and seems to live up to its promise of exposing the wonders of java's scalability and rock-solid virtual machine and garbage collector.</p></blockquote>
<p><a href="http://www.chadfowler.com/2009/4/1/20-rails-development-no-no-s">20 Rails Development No-No's</a></p>
<blockquote><p>Rails programmers: what's an example of one thing you find in other people's Rails code that you (almost) always consider to be wrong?</p></blockquote>
<p><a href="http://github.com/github/jquery-relatize_date/blob/0c50ec25162900f4a0cfd4a854cd5aa39ffa8ff0/jquery.relatize_date.js">github's jquery-relatize_date</a></p>
<blockquote><p>jQuery version of technoweenie's relative date js library.</p></blockquote>
<p><a href="http://pragdave.blogs.pragprog.com/pragdave/2009/04/twitter-should-move-away-from-ruby.html">PragDave: Twitter Should Move Away from Ruby</a></p>
<blockquote><p>Oh dear. The chattering classes are at it, talking about how the Twitter folks are dissing Ruby by announcing the replacement of some Ruby code with Scala code. [Don't miss the comments!]</p></blockquote>
<p><a href="http://www.readwriteweb.com/archives/building_sites_around_social_objects_live_from_web.php">Building Sites Around Social Objects</a></p>
<blockquote><p>Define Your Object. Define Your Verbs. Make the Objects Shareable. [I like the first 3 of these 5 principles.]</p></blockquote>
<p><a href="http://www.soundamus.net/">soundamus</a></p>
<blockquote><p>A personalized feeds of new and upcoming music releases. [Amazing!]</p></blockquote>
<p><a href="http://blip.tv/file/1957362">Behind the scenes of EveryBlock.com</a></p>
<blockquote><p>Adrian Holovaty, co-author of the Django web framework, takes you under the hood of EveryBlock.com, a Knight Foundation News Challenge startup which rounds up local news and information, and is powered 100% by Python and Django.</p></blockquote>
<p><a href="http://www.downloadsquad.com/2009/04/06/dls-interview-posterous-co-founder-sachin-agarwal/">Posterous Co-Founder Sachin Agarwal</a></p>
<blockquote><p>Garry and I both went to Stanford and majored in Computer Science. When I graduated, I worked at Apple on Final Cut Pro for 6 years which was all the way up to starting Posterous. I was building the real-time playback engine and effects architecture. That didn't have a direct impact on the formation of Posterous, except that we're definitely Apple people at heart, and we want to be the Apple of blogging. We want to make the simplest, most beautiful site out there, and make it accessible to the masses.</p></blockquote>
<p><a href="http://iphoneonrails.com/">iPhone on Rails and ObjectiveResource</a></p>
<blockquote><p>ObjectiveResource is an Objective-C port of Ruby on Rails' ActiveResource. It provides a way to serialize objects to and from Rails' standard RESTful web-services (via XML or JSON) and handles much of the complexity involved with invoking web-services of any language from the iPhone.</p></blockquote>
<p><a href="http://overhrd.com/slicehost/">Slicehost iPhone App</a></p>
<blockquote><p>A simple tool for managing your Slicehost account.</p></blockquote>
<p><a href="http://auto_html.rors.org/">auto_html</a></p>
<blockquote><p>auto_html is a Rails plugin that let users embed HTML by providing URL of links, images, youtube, vimeo, deezer,...</p></blockquote>
<p><a href="http://github.com/ricardochimal/taps/tree/master">ricardochimal's taps at master</a></p>
<blockquote><p>A simple database agnostic import/export app to transfer data to/from a remote database.</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://ncomment.com/blog/2009/04/08/war-13/">War (1/3) | ncomment blogspam</a></p>
<blockquote><p>This is awesome.</p></blockquote>
<p><a href="http://foxnewsboycott.com/">Fox News Boycott -</a></p>
<blockquote><p>This is mostly a solidarity bookmarking, but the site is actually useful, insofar as it contains a list of corporate sponsors of Fox News.</p></blockquote>
<p><a href="http://danieltenner.com/posts/0007-dealing-with-impossible-crises.html">Dealing with impossible crises</a></p>
<blockquote><p>Generally speaking, I skim life advice links from Reddit, chuckle to myself about how such a self-absorbed community of self-declared geniuses, free-thinkers and savants consistently manages to recommend self help 101 articles about basic life skills as if they were the original wise sayings of the Lord Buddha and move on. But this one's got two cherry pieces of advice and a fun anecdote about how you can +1 your fast talk skill: 1.) stay calm and polite, 2.) go into all conflicts assuming that you have already lost. Resolving oneself to failure and thus resetting the criteria for success according to your own rules is the original life skill.</p></blockquote>
<p><a href="http://www.howtoforge.com/how-to-set-up-a-postfix-autoresponder-with-autoresponse">How To Set Up A Postfix Autoresponder With Autoresponse | HowtoForge - Linux Howtos and Tutorials</a></p>
<blockquote><p>This is a sweet little CLI autoresponder app for use with postfix that you can set up for all users on your box and modify at the line or via email. Effin' sweet.</p></blockquote>
<p><a href="http://androidcommunity.com/android-tethering-apps-pulled-from-market-20090331/">Android tethering apps pulled from Market</a></p>
<blockquote><p>While totally unsurprising, this is still mildly infuriating. The only thing that makes it less than intolerably annoying is the fact that Google is kind of on the level about it: T-mobile's TOS (which I agreed to obey at some point, I'm sure) forbid certain kinds of tethering, so Google had to pull the app. But the tether developer makes a good point: does this effect the whole market place? Or is market place going to be restricted by service provider in the future?</p></blockquote>
<p><a href="http://www.nytimes.com/2009/04/07/business/media/07paper.html?_r=3">Associated Press Seeks More Control of Content on Web</a></p>
<blockquote><p>Well, I guess that's it for the AP, then. It's probably for the best: they were really making a nuisance of themselves lately anyway (with that whole &quot;Hope&quot; poster biz) and we'll certainly be better off without them.</p></blockquote>
<p><a href="http://adweek.blogs.com/adfreak/2009/04/viagra-always-has-such-wonderful-gift-ideas.html">AdFreak: Viagra always has such wonderful gift ideas</a></p>
<blockquote><p>There's nothing I love more than when Madison Avenue just straight goes for broke on a Mega Corp account and puts out an ad so utterly inane and puerile that you want to tell everyone you know about it. Call it a consciousness hack. And consider my private system exploited.</p></blockquote>
<p><a href="http://www.schneier.com/blog/archives/2009/04/who_should_be_i.html">Schneier on Security: Who Should be in Charge of U.S. Cybersecurity?</a></p>
<blockquote><p>This, for the record, is the ultimate talking point on Internet security: it's a network everyone uses that depends on an infrastructure managed and maintained by everyone and it is therefore everyone's responsibility to improve the quality and security of the network and its users. And this is why BS says the NSA shouldn't be Obama's go-to agency for &quot;cybersecurity&quot;. They keep secrets. Secrets ruin the Internet. Don't believe me? Consider Microsoft's legacy of pissing in the pool in misguided and stupid attempts to deliver security through obscurity.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/04/12/weekly-digest-4-12-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time Bomb Test</title>
		<link>http://almosteffortless.com/2009/04/05/time-bomb-test/</link>
		<comments>http://almosteffortless.com/2009/04/05/time-bomb-test/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 20:33:02 +0000</pubDate>
		<dc:creator>Trevor</dc:creator>
				<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1264</guid>
		<description><![CDATA[Sometimes you come across something in the Rails changelog that suggests a config change before upgrading to the next version. Sometimes you only have time to put some code together quickly, but you know that you really should go back and refactor it soon. How and where can you remind yourself about this stuff? 
I'm [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes you come across something in the Rails changelog that suggests a config change before upgrading to the next version. Sometimes you only have time to put some code together quickly, but you know that you really should go back and refactor it soon. How and where can you remind yourself about this stuff? </p>
<p>I'm not sure where I originally came across this concept, but I think it's worth sharing again anyway. I'll even give it a name this time. <b>Time Bomb Tests</b>: easy cheesy reminders you can put into your test suite. They'll sit there like little time bomb reminders - exploding only when you need them to. </p>
<p><embed src="http://media.mtvnservices.com/mgid:uma:video:mtv.com:9770" width="512" height="319" type="application/x-shockwave-flash" flashVars="configParams=vid%3D9770%26uri%3Dmgid%3Auma%3Avideo%3Amtv.com%3A9770%26startUri={startUri}" allowFullScreen="true" allowScriptAccess="always" base="."></embed></p>
<pre class="ruby">&nbsp;
<span style="color:#008000; font-style:italic;"># test/integration/time_bomb_test.rb</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'test_helper'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> TimeBombTest &lt; <span style="color:#6666ff; font-weight:bold;">ActionController::IntegrationTest</span>
&nbsp;
  test <span style="color:#996600;">&quot;stuff to do with next rails upgrade&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    flunk <span style="color:#9966CC; font-weight:bold;">if</span> Rails.<span style="color:#9900CC;">version</span> != <span style="color:#996600;">'2.2.2'</span>
    <span style="color:#008000; font-style:italic;"># rename application.rb to application_controller.rb</span>
    <span style="color:#008000; font-style:italic;"># etc...</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  test <span style="color:#996600;">&quot;stuff I'm putting off today, but really should do eventually&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    flunk <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">now</span> &gt; <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'5/1/2009'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># optimize that thing marked HACK in the user model</span>
    <span style="color:#008000; font-style:italic;"># etc...</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p><b>Update</b>: Check out <a href="http://github.com/jeremymcanally/">jeremymcanally</a>'s <a href="http://github.com/jeremymcanally/deprecate/tree/master">deprecate</a>, which appears to have been partially inspired by this post. It allows you to deprecate (primarily) test code after a certain date, version, or other arbitrary condition is met.</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/04/05/time-bomb-test/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 4-5-09</title>
		<link>http://almosteffortless.com/2009/04/05/weekly-digest-4-5-09/</link>
		<comments>http://almosteffortless.com/2009/04/05/weekly-digest-4-5-09/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 20:12:27 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1266</guid>
		<description><![CDATA[Trevor's Links
Twitter on Scala
...it has been such a success that our plan for the long run is to move more and more of our architecture into Scala. The vast majority of our traffic is API requests, and we want most of those to be served by Scala, either at an edge cache layer or a [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://www.artima.com/scalazine/articles/twitter_on_scala.html">Twitter on Scala</a></p>
<blockquote><p>...it has been such a success that our plan for the long run is to move more and more of our architecture into Scala. The vast majority of our traffic is API requests, and we want most of those to be served by Scala, either at an edge cache layer or a web application layer. Hopefully by the end of 2009 the majority of users’ interactions with Twitter are going to be Scala-powered.</p></blockquote>
<p><a href="http://unlimitednovelty.com/2009/04/twitter-blaming-ruby-for-their-mistakes.html">Twitter: blaming Ruby for their mistakes?</a></p>
<blockquote><p>In conclusion... is Ruby a bad language for writing message queues in? Yes, there are much better choices. Message queues are a particularly performance critical piece of software... but message queues aren't something you should be writing yourself. This speaks much more to Twitter's culture of NIH than it does to Ruby as a language... Is Ruby a bad language for writing long-running processes? Absolutely not. JRuby provides state-of-the-art garbage collection algorithms available in the JVM to the Ruby world. These are the exact same technologies that are available in Scala. JRuby addresses all of their concerns for long-running processes, but they don't bother to mention it and instead just point out the problems of the de facto Ruby interpreter. [Very interesting comments.]</p></blockquote>
<p><a href="http://blog.obiefernandez.com/content/2009/04/my-reasoned-response-about-scala-at-twitter.html">Obie Fernandez: My Reasoned Response about Scala at Twitter</a></p>
<blockquote><p>I'm glad that Twitter is working to resolve its scaling issues. It's a service that I love and use on a daily basis and from which I have benefitted immensely. As far as I'm concerned, Twitter is a case-study in how Ruby on Rails does scale, even in their hands... My interest in the question of Ruby vs. Scala at Twitter had mostly consisted of curiosity and amusement, at least until last night.</p></blockquote>
<p><a href="http://al3x.net/2009/04/04/reasoned-technical-discussion.html">Mending The Bitter Absence of Reasoned Technical Discussion</a></p>
<blockquote><p>Social media (blogs, community news sites like Reddit and Hacker News, Twitter and such) have swept in to fill a vacuum between peer-reviewed academic journals and water cooler conversation amongst software engineers... in theory, we should be more informed as a professional than we ever have been... In practice, the conversations that are most widely heard in the tech community are full of inaccuracies, manufactured drama, ignorance, and unbridled opinion. In discussing these Internet-spanning debates with non-technical friends, comparisons to Hollywood tabloids come first to mind. It’s a time sink for an industry that should be a shining example of how to use the newest of media for constructive debate.</p></blockquote>
<p><a href="http://ksuther.com/chax/">Chax</a></p>
<blockquote><p>Chax is a collection of minor modifications and additions that make using Apple's iChat more enjoyable.</p></blockquote>
<p><a href="http://pycon.blip.tv/file/1951296/">PyCon Keynote</a></p>
<blockquote><p>Reddit's Steve Huffman and Alexis Ohanian. [They briefly discuss the infamous &quot;gst&quot; user around 15 minutes in.]</p></blockquote>
<p><a href="http://joshua.schachter.org/2009/04/on-url-shorteners.html">on url shorteners</a></p>
<blockquote><p>URL shortening services have been around for a number of years. Their original purpose was to prevent cumbersome URLs from getting fragmented by broken email clients that felt the need to wrap everything to an 80 column screen. But it's 2009 now, and this problem no longer exists. Instead it's been replaced by the SMS-oriented 140 character constraints of sites like Twitter.</p></blockquote>
<p><a href="http://www.37signals.com/svn/posts/1657-the-real-world-a-video-of-davids-talk-at-fowa-dublin">The Real World: A video of David's talk at FOWA Dublin - (37signals)</a></p>
<blockquote><p>Execution and Perseverance are the keys to running a successful business.</p></blockquote>
<p><a href="http://railslab.newrelic.com/2009/04/01/the-state-of-the-stack-a-ruby-on-rails-benchmarking-report">The State of the Stack: A Ruby on Rails Benchmarking Report</a></p>
<blockquote><p>New Relic helps more than 1500 organizations manage their Ruby on Rails applications. This gives us unique insight into how thousands of applications are deployed. Many of our customers have opted in to have their performance data shared with the Rails Core Team to aid in their ongoing work on the platform. In addition to that data we also aggregate information on the versions of OS, Ruby, and Rails used and the various plugins deployed.</p></blockquote>
<p><a href="http://blog.digg.com/?p=591">DiggBar Launches Today!</a></p>
<blockquote><p>Starting today, we’ll begin rolling out a new product we are calling the DiggBar.  Before we dive into the details, check out this short video overview...</p></blockquote>
<p><a href="http://news.cnet.com/8301-1001_3-10209580-92.html">Google uncloaks once-secret server</a></p>
<blockquote><p>Google is tight-lipped about its computing operations, but the company for the first time on Wednesday revealed the hardware at the core of its Internet might at a conference here about the increasingly prominent issue of data center efficiency.</p></blockquote>
<p><a href="http://paulgraham.com/5founders.html">Five Founders</a></p>
<blockquote><p>Few know this, but one person, Paul Buchheit, is responsible for three of the best things Google has done. He was the original author of GMail, which is the most impressive thing Google has after search. He also wrote the first prototype of AdSense, and was the author of Google's mantra &quot;Don't be evil.&quot;</p></blockquote>
<p><a href="http://www.37signals.com/svn/posts/1661-follow-up-on-get-satisfaction-or-else">Follow-up on &quot;Get Satisfaction, Or Else...&quot;</a></p>
<blockquote><p>Customer support is my job, and I take it very seriously, and I am very, very good at it. To have another website undermine that job which leads to a customer with 1) a bad experience, 2) a bad impression of our company, 3) a bad impression of my work…well, it’s infuriating. Not only was I angry on the customer’s behalf, I was angry on behalf of our company to see our name and logo plastered all over a site we had never known about until then.</p></blockquote>
<p><a href="http://adam.blog.heroku.com/past/2009/4/2/ambient_intimacy/">Ambient Intimacy</a></p>
<blockquote><p>“Ambient intimacy” is a good term to describe how Twitter, Flickr, blogs, and other modern communications technologies keep us in touch with one another. The term I’ve been using for this is “passive communication.”</p></blockquote>
<p><a href="http://news.ycombinator.com/item?id=542336">Hacker News on Daring Fireball's Complex</a></p>
<blockquote><p>We advise startups to launch when they've added a quantum of utility: when there is at least some set of users who would be excited to hear about it, because they can now do something they couldn't do before.</p></blockquote>
<p><a href="http://www.stevenberlinjohnson.com/2009/03/the-following-is-a-speech-i-gave-yesterday-at-the-south-by-southwest-interactive-festival-in-austiniif-you-happened-to-being.html">stevenberlinjohnson.com: Old Growth Media And The Future Of News</a></p>
<blockquote><p>...there are really two worst case scenarios that we’re concerned about right now, and it's important to distinguish between them. There is panic that newspapers are going to disappear as businesses. And then there’s panic that crucial information is going to disappear with them, that we’re going to suffer as culture because newspapers will no long be able to afford to generate the information we’ve relied on for so many years.</p></blockquote>
<p><a href="http://www.37signals.com/svn/posts/1650-get-satisfaction-or-else">Get Satisfaction, Or Else...</a></p>
<blockquote><p>We shouldn’t be forced to scour the internet finding sites that claim they are doing support for us when they’re not. It’s not fair to us and it’s not fair to customers to make something look like an official support site when it’s not. This should be entirely opt-in for a company and it’s not. In fact, it’s worse than that because if you don’t opt-in, they make negative claims about your company’s commitment to customers. [See also: http://news.ycombinator.com/item?id=540540]</p></blockquote>
<p><a href="http://giantrobots.thoughtbot.com/2009/3/30/2009-rubyist-guide-mac-os-x-development-environment">2009 Rubyist's guide to a Mac OS X development environment</a></p>
<blockquote><p>My hard drive kicked the bucket recently. From scratch, here’s how I quickly got my Ruby web development environment into ship-shape form The Thoughtbot Way. Many of these instructions are specific to Mac OS X 10.5 (Leopard). Some of them are opinionated (Vim over Textmate). Pick-and-choose what you need but this is everything that I use happily day-to-day right now.</p></blockquote>
<p><a href="http://groups.google.com/group/rails-oceania/browse_thread/thread/a1cf7ba3a84408e">redirect_to HTTP POST</a></p>
<blockquote><p>...the problem is that redirect_to doesn't seem to preserve the HTTP method. This is ok for the faked-up methods eg using &quot;_method=delete&quot;  but if the URL a person asked for was a POST it fails miserably with a routing error... [Checking out some of these solutions, but for now I'm just working around it by only storing the original request if it's a GET request.]</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://hugeurl.com/">HugeURL</a></p>
<blockquote><p>This is a triumph of the human spirit if I ever saw one.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/04/05/weekly-digest-4-5-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 3-29-09</title>
		<link>http://almosteffortless.com/2009/03/29/weekly-digest-3-29-09/</link>
		<comments>http://almosteffortless.com/2009/03/29/weekly-digest-3-29-09/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 22:36:12 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1260</guid>
		<description><![CDATA[Trevor's Links
Ron Carmel explains 2D Boy by the numbers
2D Boy's Ron Carmel opened up this year's Independent Games Summit hoping to somewhat demystify the process of starting your own indie studio (which he summarized with the following three steps: &#34;save money, quit your job, and make a game&#34;), and in doing so divulged their own [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://www.offworld.com/2009/03/indie-games-summit-ron-carmel.html">Ron Carmel explains 2D Boy by the numbers</a></p>
<blockquote><p>2D Boy's Ron Carmel opened up this year's Independent Games Summit hoping to somewhat demystify the process of starting your own indie studio (which he summarized with the following three steps: &quot;save money, quit your job, and make a game&quot;), and in doing so divulged their own by-the-numbers breakdown of how their goo-built world was formed.</p></blockquote>
<p><a href="http://giantrobots.thoughtbot.com/2009/3/27/tuning-the-toad">Tuning the Toad</a></p>
<blockquote><p>As we wrote just over two weeks ago, Hoptoad was having a hard time keeping up performance when certain websites were submitting thousands of errors at the same time. Fixing this became out highest priority and, as I promised then, we will outline the changes we made that have helped us to be able to weather the error storm.</p></blockquote>
<p><a href="http://www.thesimpledollar.com/2009/03/26/most-time-management-is-rubbish-here-are-ten-things-that-work-for-me/">Most Time Management Is Rubbish.  Here Are Ten Things That Work for Me.</a></p>
<blockquote><p>Over the last few years, I’ve read a ton of time management books and tried out literally hundreds of systems and standalone ideas for maximizing the effectiveness of my time, particularly in terms of my work.</p></blockquote>
<p><a href="http://powazek.com/posts/1889">Now is a Great Time to Be a Media Maker</a></p>
<blockquote><p>The distance we’ve come in the decade and a half since I was driving newspapers over highway 17 in a VW Bug is astonishing. I look at the tools available to media makers today and can hardly imagine a more ideal environment. So why is it that all we hear about the media industry is doom?</p></blockquote>
<p><a href="http://intridea.com/2009/3/23/twitter-auth-for-near-instant-twitter-apps">TwitterAuth: For Near-Instant Twitter Apps</a></p>
<blockquote><p>The public beta of Twitter OAuth support has been released and I’m excited to introduce a new library that I’ve been working on called TwitterAuth. TwitterAuth is a Rails plugin that provides a full external authentication stack for Rails applications utilizing Twitter. Think of it as “Twitter Connect” for Rails, letting you create an application that may be logged into using only Twitter credentials.</p></blockquote>
<p><a href="http://www.neeraj.name/blog/articles/829-how-to-handle-exception-while-developing-api-in-ruby-on-rails">How to handle exception while developing api in ruby on rails</a></p>
<blockquote><p>If the request was made for an html page then rails will handle the exception and will show the appropriate error page depending on if you are running in development or production mode. However for .xml there is an issue. If it is an API request then ,in the case of an error, you still need to send an xml response with the error message. Question is how to handle exception in a generic way.</p></blockquote>
<p><a href="http://joehewitt.com/post/the-three20-project/">The Three20 Project</a></p>
<blockquote><p>Last week I released my first iPhone open source project, Facebook Connect for iPhone, and today I'm ready to start talking about the next one. Five months ago I talked about open-sourcing as much of the Facebook iPhone app as I could, and as you can see by the delay, that has turned out to be easier said than done.</p></blockquote>
<p><a href="http://scobleizer.com/2009/03/21/why-facebook-has-never-listened-and-why-it-definitely-wont-start-now/">Why Facebook has never listened and why it definitely won’t start now</a></p>
<blockquote><p>Let’s say you’re walking down University Ave. in Palo Alto, California in a couple of years (or, really, any street in the world) and you’re hungry. You pull out your iPhone or Palm Pre or Android or Blackberry or Windows Mobile doohickey and click open the Facebook application. Then you type “sushi near me.” It answers back “within walking distance are two sushi restaurants that more than 20 of your friends have liked.”</p></blockquote>
<p><a href="http://www.shirky.com/weblog/2009/02/why-small-payments-wont-save-publishers/">Why Small Payments Won’t Save Publishers</a></p>
<blockquote><p>Meanwhile, back in the real world, the media business is being turned upside down by our new freedoms and our new roles. We’re not just readers anymore, or listeners or viewers. We’re not customers and we’re certainly not consumers. We’re users. We don’t consume content, we use it, and mostly what we use it for is to support our conversations with one another, because we’re media outlets now too. When I am talking about some event that just happened, whether it’s an earthquake or a basketball game, whether the conversation is in email or Facebook or Twitter, I want to link to what I’m talking about, and I want my friends to be able to read it easily, and to share it with their friends.</p></blockquote>
<p><a href="http://antoniocangiano.com/2009/03/23/rubys-biggest-challenge-for-2009/">Ruby’s Biggest Challenge for 2009</a></p>
<blockquote><p>When new developers come to the Ruby world, lets greet them with Ruby 1.9.x. In the long term, doing so will improve our growth as a community more than any marketing effort ever could (and the two efforts are not mutually exclusive either). Ultimately, Ruby’s biggest challenge may just be our greatest opportunity to improve.</p></blockquote>
<p><a href="http://www.shirky.com/weblog/2009/03/newspapers-and-thinking-the-unthinkable/">Newspapers and Thinking the Unthinkable</a></p>
<blockquote><p>With the old economics destroyed, organizational forms perfected for industrial production have to be replaced with structures optimized for digital data. It makes increasingly less sense even to talk about a publishing industry, because the core problem publishing solves — the incredible difficulty, complexity, and expense of making something available to the public — has stopped being a problem.</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://androidguys.com/?p=4263">T-Mobile &quot;My Account&quot; App</a></p>
<blockquote><p>This another of those &quot;it should have come out with the launch of the phone, but what they hey--now that it's out, all's forgiven&quot; kind of apps. Basically, it's your complete T-Mobile account data in application form. Very Apple-like.</p></blockquote>
<p><a href="http://www.itpro.co.uk/610284/the-politics-of-the-command-line">The politics of the command line</a></p>
<blockquote><p>Pass this along to friends and family who need a primer in F/OSS, GNU, etc. Tell them that taking 10 minutes to read it carefully is easier than watching an hour long Stallman documentary. For a number of reasons.</p></blockquote>
<p><a href="http://img523.imageshack.us/img523/434/foxnews152b.jpg">Fox News Pictographic Synopsis</a></p>
<blockquote><p>Normally I try not to think or care about infotainment--I just sort of hope Jon Stewart and Bill O'Reilly will cancel each other out and the whole phenomenon will un-happen--but this is too good a compilation of Fox News screencaps to leave it un-bookmarked.</p></blockquote>
<p><a href="http://www.collisiondetection.net/mt/archives/2009/03/teleportation_t.php">Teleportation, the last battle, and the Creator talks: How the world ends inside an online game</a></p>
<blockquote><p>This is a fun blurb from CT on &quot;eschatology as a design challenge&quot; that, unlike good sci-fi, suggests an interesting idea, hangs just enough metal on it to make it run and then walks away from it without beating it to death.</p></blockquote>
<p><a href="http://www.nytimes.com/2009/03/25/opinion/25desantis.html?_r=1">Op-Ed Contributor - Dear A.I.G., I Quit! - NYTimes.com</a></p>
<blockquote><p>lolcano. Nice try, PR guys, but if a heartfelt resignation letter full of dubious logic, apple pie cliches and evasive non-facts is the best you can do by way of laying out a decoy and deploying chaff, then you have, once again, failed utterly to succeed.</p></blockquote>
<p><a href="http://www.schneier.com/blog/archives/2009/03/election_fraud.html">Election Fraud in Kentucky</a></p>
<blockquote><p>Normally I wouldn't bookmark a Schneier post, but this one is kind of special. Using clips from other articles, he basically makes the point (in a very reductive, minimalist, Bonsai-gardener kind of way) that the security &quot;industry&quot; is 90% sales, 5% hype and 5% actual security solutions: there's a lot of talk about the implications of this, the vetting of that and what it boils down to is the fact that the entire commercial edifice is just an elaborate front end for one poorly designed user interface.</p></blockquote>
<p><a href="http://www.akihabaranews.com/en/news_details.php?id=17807">Core Duo Vista Powered Super Famicom</a></p>
<blockquote><p>I'm pretty sure that this is a modern computer inside a Super Famicom case. Which, I'm also pretty sure, makes it the coolest case mod I've seen in a long, long time.</p></blockquote>
<p><a href="http://www.bloomberg.com/apps/news?pid=20601087&amp;sid=a1ZHoYNn6uAE&amp;refer=home">Hitachi Settles Price-Fixing Case for $31 Million</a></p>
<blockquote><p>In case you didn't know, Korea's LG, China's Chunghwa and Japan's Sharp constitute something of a cartel. Not unlike the old-timey RAM cartel, these Mega Corps work as a sort of monopoly of convenience, setting (i.e. fixing) prices on LCD's in everything from phones to monitors in order to maintain a balance between profitability and existential security (too much freedom in the marketplace, while potentially good for consumers, isn't in the best interest of government-subsidized Mega Corps whose business models depend on anti-competitive legislation in order to maintain profitability). Add Hitachi to the list.</p></blockquote>
<p><a href="http://www.pfspear.net/projects/gcalcron">gcalcron</a></p>
<blockquote><p>This is a fun kind of &quot;get your toes wet with linux&quot; type of project that you could suggest to your &quot;I want to learn about linux, but I'm not ready to junk my MacBook just yet&quot; friends. The gist is that you &quot;install&quot; this cat's .py script on your remote machine and this script acts as an interface between the box and a Google calendar you set up. You enter bash commands into the calendar entries and it uses the times you set with the gCal interface to tell cron when to pop them off. What it lacks in simplicity (by being an incredibly convoluted &quot;work around&quot; for spending 10 minutes with the cron man page) it makes up for in colorful, user-friendliness.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/03/29/weekly-digest-3-29-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Randomize Filename in Paperclip</title>
		<link>http://almosteffortless.com/2009/03/22/randomize-filename-in-paperclip/</link>
		<comments>http://almosteffortless.com/2009/03/22/randomize-filename-in-paperclip/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 02:23:56 +0000</pubDate>
		<dc:creator>Trevor</dc:creator>
				<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1247</guid>
		<description><![CDATA[Here's a quick tip that Jonathan Yurek, author of Paperclip, was kind enough to help me with. It's a simple way to have a randomized filename for uploaded content. This is useful for security through obscurity, especially when used with Paperclip's id_partition interpolation helper:
&#160;
class Photo &#60; Asset
&#160;
  has_attached_file :image, :path =&#62; &#34;:class/:attachment/:id_partition/:basename_:style.:extension&#34;
&#160;
  before_create [...]]]></description>
			<content:encoded><![CDATA[<p>Here's a quick tip that Jonathan Yurek, author of <a href="http://thoughtbot.com/projects/paperclip">Paperclip</a>, was kind enough to <a href="http://groups.google.com/group/paperclip-plugin/browse_thread/thread/c45922d0dc2fee83/984c3087c4b12c63#984c3087c4b12c63">help me with</a>. It's a simple way to have a randomized filename for uploaded content. This is useful for security through obscurity, especially when used with Paperclip's <i>id_partition</i> interpolation helper:</p>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Photo &lt; Asset
&nbsp;
  has_attached_file <span style="color:#ff3333; font-weight:bold;">:image</span>, <span style="color:#ff3333; font-weight:bold;">:path</span> =&gt; <span style="color:#996600;">&quot;:class/:attachment/:id_partition/:basename_:style.:extension&quot;</span>
&nbsp;
  before_create <span style="color:#ff3333; font-weight:bold;">:randomize_file_name</span>
&nbsp;
private
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> randomize_file_name
    extension = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">extname</span><span style="color:#006600; font-weight:bold;">&#40;</span>image_file_name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">downcase</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">image</span>.<span style="color:#9900CC;">instance_write</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:file_name</span>, <span style="color:#996600;">&quot;#{ActiveSupport::SecureRandom.hex(16)}#{extension}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>That would, for example, change an uploaded image named "DS_100.JPG" into:</p>
<p>http://example.com/photos/images/000/001/204/e15f64f5e7gjdo3e4ae58f4ed9j925f5.jpg</p>
<p>That makes it effectively impossible to guess the location of an image, provided that you don't allow people to browse around the directories on your server. This is the same method of privacy protection that Flickr uses, and it ought to be enough for most non-governmental privacy needs :)</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/03/22/randomize-filename-in-paperclip/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 3-22-09</title>
		<link>http://almosteffortless.com/2009/03/22/weekly-digest-3-22-09/</link>
		<comments>http://almosteffortless.com/2009/03/22/weekly-digest-3-22-09/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 02:12:28 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1249</guid>
		<description><![CDATA[Trevor's Links
Twitter OAuth Ruby Example
This is the first of what I hope to be several examples of using OAuth as a developer. Our OAuth server implementation is in open beta and I want to show an example of how to use it. As the implementation is still in beta, feedback is appreciated as you begin [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://apiwiki.twitter.com/OAuth+Example+-+Ruby">Twitter OAuth Ruby Example</a></p>
<blockquote><p>This is the first of what I hope to be several examples of using OAuth as a developer. Our OAuth server implementation is in open beta and I want to show an example of how to use it. As the implementation is still in beta, feedback is appreciated as you begin your integration. If all goes well I'll post on using OAuth from other languages in the future.</p></blockquote>
<p><a href="http://mwrc2009.confreaks.com/13-mar-2009-11-55-the-great-rails-refactor-yehuda-katz.html">The Great Rails Refactor</a></p>
<blockquote><p>Yehuda Katz at Confreaks: MountainWest RubyConf 2009.</p></blockquote>
<p><a href="http://www.kottke.org/09/03/google-reader-hacks">Google Reader hacks</a></p>
<blockquote><p>I've come up with a system that seems to work for me on OS X, at least for extensive testing purposes...</p></blockquote>
<p><a href="http://gitready.com/beginner/2009/03/13/smartly-save-stashes.html">smartly save stashes in git</a></p>
<blockquote><p>I seem to be using stashing more and more, and I’ve found that seeing the stash list output looking like this isn’t very helpful...</p></blockquote>
<p><a href="http://railstips.org/2009/3/12/3-simple-guidelines-for-contributing">3 Simple Guidelines for Contributing</a></p>
<blockquote><p>I promise you that if you do these three things each time you contribute to a project, your changes will not only get pulled in faster, but you will become a more rounded and skilled programmer.</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://www.reddit.com/comments/85jy2/i_left_a_linux_machine_online_with_ssh_open_for_a/">I left a linux machine online with ssh open for a day. It dropped incoming login attempts after the username. These are the usernames tried. : reddit.com</a></p>
<blockquote><p>I know it's kind of weirdly meta and redundant to bookmark a reddit, but this one has a list of names that might be useful in creating a security policy for linux user names on  Internet-facing boxes.</p></blockquote>
<p><a href="http://zerophyte.com/blog/2009/03/13/nslu2-lenny-upgrade-solving-the-possible-network-problem/">NSLU2 Debian Lenny Upgrade - solving the possible network problem</a></p>
<blockquote><p>I'm bookmarking this because it taught me something I managed to not learn in spite of having had a slug on my home network for over a year now. To wit: if you bork your network setup, reboot your slug and find that you can no longer dial in with SSH, simply power it down, pull the USB drive you're using as /, slot it up in another machine and edit your slug's conf files in your favorite editor. Nice.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/03/22/weekly-digest-3-22-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 3-15-09</title>
		<link>http://almosteffortless.com/2009/03/15/weekly-digest-3-15-09/</link>
		<comments>http://almosteffortless.com/2009/03/15/weekly-digest-3-15-09/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 02:34:24 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1244</guid>
		<description><![CDATA[Trevor's Links
timocratic's test_benchmark
Rails plugin (and/or ruby gem) for benchmarking your test::units. [This has to be one of the best gems I've come across in a while. A+++]
Slow tests are a bug
Most Rails projects I’ve worked on have ended up at around 3,000-15,000 lines of code, with a roughly as many lines of test code, and [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://github.com/timocratic/test_benchmark/tree/master">timocratic's test_benchmark</a></p>
<blockquote><p>Rails plugin (and/or ruby gem) for benchmarking your test::units. [This has to be one of the best gems I've come across in a while. A+++]</p></blockquote>
<p><a href="http://railspikes.com/2009/3/10/slow-tests-are-a-bug/comments/1927#comment-1927">Slow tests are a bug</a></p>
<blockquote><p>Most Rails projects I’ve worked on have ended up at around 3,000-15,000 lines of code, with a roughly as many lines of test code, and most have test suites that take a minute or more to run. Our test suite for Tumblon, for instance, churns along for 2.5 minutes. This is a too slow. And slow tests are a problem for at least two reasons: they slow down your development and decrease code quality. [Note the awesome plugin linked in the comments!]</p></blockquote>
<p><a href="http://its.arubything.com/2009/2/4/sinatra-block-parameters">Sinatra block parameters</a></p>
<blockquote><p>The latest master Sinatra now supports optional block parameters. It captures any parameters in the URL and passes them into the block that defines the action.</p></blockquote>
<p><a href="http://www.paperplanes.de/2009/3/13/when_overusing_self_turns_into_self_pity.html">When Overusing self Turns Into self.pity</a></p>
<blockquote><p>Wow, so simple. Much easier on the eyes, and the intention is clear right from the start. My rule is simple: When assigning to an instance variable, use self, calling a method on the other hand should stand all by itself. Now, you could argue, that assigning to an instance variable using its accessor is also a method call, but if you really want to argue about that, you should really read this blog entry again.</p></blockquote>
<p><a href="http://www.intridea.com/posts/temporarily-disable-activerecord-callbacks">Temporarily disable ActiveRecord callbacks</a></p>
<blockquote><p>I was recently working on a client project and I had to create a rake task to import a large set of data from a spreadsheet.  One of the models that was being imported had an after_save callback that sent out an email notification.  I didn't really want 3500 emails to be sent out whenever this rake task was ran, so I needed to disable the callback while the import task was running.</p></blockquote>
<p><a href="http://lab.arc90.com/2009/03/readability.php">Readability</a></p>
<blockquote><p>Reading anything on the Internet has become a full-on nightmare. As media outlets attempt to eke out as much advertising revenue as possible, we're left trying to put blinders on to mask away all the insanity that surrounds the content we're trying to read.</p></blockquote>
<p><a href="http://www.pluginaweek.org/2009/03/08/state_machine-one-machine-to-rule-them-all/">state_machine</a></p>
<blockquote><p>After 2 1/2 years... I’m finally officially announcing a project I’ve been quietly working on: state_machine... This is a project which has undergone many rounds of rewrites, but which has finally met its goal, in my opinion, to become the easiest, sexiest, yet most powerful state machine library for the Ruby language.</p></blockquote>
<p><a href="http://www.economist.com/science/displaystory.cfm?story_id=13176775">The size of social networks - Primates on Facebook</a></p>
<blockquote><p>Several years ago an anthropologist concluded that the cognitive power of the brain limits the size of the social network that an individual of any given species can develop. Extrapolating from the brain sizes and social networks of apes, Dr Dunbar suggested that the size of the human brain allows stable networks of about 148. Rounded to 150, this has become famous as “the Dunbar number”.</p></blockquote>
<p><a href="http://cameronmoll.com/archives/2009/03/5_p_of_twitter/">The 5 P's of Twitter's runaway success</a></p>
<blockquote><p>Actually, I think we enjoy claiming we can’t describe what Twitter is, yet a closer inspection of it yields not only a better understanding of it but also why it’s become so prevalent in the media lately. And when that kind of inspection occurs, it’s not surprising to the inspector why Twitter is where it’s at today.</p></blockquote>
<p><a href="http://battellemedia.com/archives/004832.php">Twitter = YouTube</a></p>
<blockquote><p>YouTube now gets more searches than Yahoo, Google's closest search rival. YouTube was the single fastest growing new form of search on the Web, and Google pretty much outflanked (and outspent) everyone to buy it. Not to get into video monetization, per se, but to harvest and control the most important emerging form of search. In short, Google could not afford to NOT own YouTube.</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://survivingthemiddleclasscrash.wordpress.com/2009/02/05/the-multiple-ways-monsanto-is-putting-normal-seeds-out-of-reach/">Monsanto is Putting Normal Seeds Out of Reach</a></p>
<blockquote><p>This week's &quot;Rage at the Mega Corps like Lear on the Heath&quot; post is about Agricultural Goliath, Monsanto. Monsanto, a Mega Corp whose operational expenses are almost fully subsidized by our federal government here in the States, has gained much notoriety for sabotaging independent farming operations and, more importantly, running anyone who doesn't farm their brand of genetically modified corn out of business by installing puppet legislators in important positions or simply using its powerful lobby to write its own legislation and have dupes (like Illinois' own Michael Madigan) push it through.</p></blockquote>
<p><a href="http://contxts.com/">contxts - mobile sms business cards</a></p>
<blockquote><p>This is my gadget/widget par excellence du jour: basically, you give their database your basic contact info and then, if anyone SMSes your username to 50500, they get your contact info back. Nifty.</p></blockquote>
<p><a href="http://stevesouders.com/hpws/rules.php">High Performance Web Sites</a></p>
<blockquote><p>This is a good checklist to run through whether you're working up a framework from scratch and need to keep optimization principles on a front burner or whipping up a quick, stop-gap kind of ap that needs to work lickety-split with a minimum of fuss.</p></blockquote>
<p><a href="http://www.cracked.com/article_17129_7-badass-cartoon-villains-who-lost-retarded-heroes.html">7 Badass Cartoon Villains Who Lost to Retarded Heroes</a></p>
<blockquote><p>What else can you say about cracked.com? They're on focus, on message and on point.</p></blockquote>
<p><a href="http://www.h-online.com/news/Secure-deletion-a-single-overwrite-will-do-it--/112432">Secure deletion: a single overwrite will do it</a></p>
<blockquote><p>This article has some simple stats that supposedly debunk the urban legend that you've got to write zeroes (or whatever) over the whole disc to securely delete a HDD. It doesn't so much debunk, however, as it makes a point not unlike PGP's point: the obscurity provided by a single over-write is /pretty good/, but not perfect. Your best bet is still the Gauss rifle...I mean degausser.</p></blockquote>
<p><a href="http://www.wildwoodsurvival.com/survival/fire/basics/index.html">Wildwood Survival - Fire Basics</a></p>
<blockquote><p>The original survival skill is, of course, making fire. You can never know too many different ways to a.) start or b.) build a fire: file this under &quot;urban, suburban and rural survival tips&quot;</p></blockquote>
<p><a href="http://www.engadget.com/2009/03/09/24-samsung-ssds-get-strung-together-for-supercomputer-fun/">24 Samsung SSDs get strung together for supercomputer fun</a></p>
<blockquote><p>This is an article with still pictures (instead of moving ones) that outlines the viral video sweeping the Interwebs in which a plucky admin wires 24 flash drives into a single, desktop-size case.</p></blockquote>
<p><a href="http://www.thomsonchemmanoor.com/10-common-mistakes-using-robotstxt-on-your-website.html">10 common mistakes using robots.txt</a></p>
<blockquote><p>This is totally rudimentary--it's written more for the copyeditor/SEO enthusiast in your shop, not for the cowboy/console man--but it's a good reminder of syntax for ye olde robots.txt file. Remember: there's no notification if your robots.txt file doesn't parse right...except for deprecated levels of your site showing up in Google.</p></blockquote>
<p><a href="http://www.ducea.com/2009/03/08/mdadm-cheat-sheet/">Mdadm Cheat Sheet | MDLog:/sysadmin</a></p>
<blockquote><p>This will be utterly useless to anyone who isn't experimenting with software RAID on 2.26 kernels. For those of you who are just getting your feet wet with mdadm (e.g. YT), this crib-sheet is a nice resource. That might just point out some things you would otherwise have to plumb the dreaded man page for.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/03/15/weekly-digest-3-15-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nick and the Button</title>
		<link>http://almosteffortless.com/2009/03/12/nick-and-the-button/</link>
		<comments>http://almosteffortless.com/2009/03/12/nick-and-the-button/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 05:42:42 +0000</pubDate>
		<dc:creator>Trevor</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1226</guid>
		<description><![CDATA[Nick explains CLICK. 
I helped out with the clicking backend for the site. It's a disgusting mess of PHP and MySQL, or else I'd share the code... :P

It's amazing to think that this thing just under 3 million clicks! 
We've caught a few people cheating, and sparked some debate on Hacker News. Still, it looks [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://greyscalegorilla.com/blog/2009/03/10/gsg-cast-click-that-button-useless-passion-or-pure-awesomeness/">Nick explains CLICK</a>. </p>
<p>I helped out with the clicking backend for the site. It's a disgusting mess of PHP and MySQL, or else I'd share the code... :P</p>
<p><object width="400" height="250"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3553902&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=3553902&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="250"></embed></object></p>
<p>It's amazing to think that this thing just under 3 million clicks! </p>
<p>We've caught a few people <a href="http://twitter.com/schmidtwisser/statuses/1250008794">cheating</a>, and <a href="http://news.ycombinator.com/item?id=346869">sparked some debate on Hacker News</a>. Still, it looks like a lot of people <a href="http://search.twitter.com/search?q=clickthatbutton">really love to click</a> the stupid thing. There's just something about it...</p>
<p>Nick has been doing some <a href="http://greyscalegorilla.com/blog/">awesome screencasts</a> about productivity and some other stuff... You should go check them out if you're into <a href="http://en.wikipedia.org/wiki/Getting_Things_Done">GTD</a> or <a href="http://www.43folders.com/">Merlin Mann</a>.</p>
<p>After you watch the video - <a href="http://clickthatbutton.com/"><b>GO CLICK THAT BUTTON!</b></a></p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/03/12/nick-and-the-button/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Speeding up Paperclip Tests by… a LOT</title>
		<link>http://almosteffortless.com/2009/03/12/speeding-up-paperclip-tests-by-a-lot/</link>
		<comments>http://almosteffortless.com/2009/03/12/speeding-up-paperclip-tests-by-a-lot/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 00:06:57 +0000</pubDate>
		<dc:creator>Trevor</dc:creator>
				<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1218</guid>
		<description><![CDATA[Here's a quick little trick that I used to speed up my tests involving Paperclip by about 70%.
I posted it over on the Paperclip Google Group, which is a friendly and active place to hang out if you're a Paperclip user. 
Here's an example using Test::Unit, which is still my favorite way to test :)
&#160;
require [...]]]></description>
			<content:encoded><![CDATA[<p>Here's a quick little trick that I used to speed up my tests involving <a href="http://thoughtbot.com/projects/paperclip">Paperclip</a> by about 70%.</p>
<p>I posted it over on the <a href="http://groups.google.com/group/paperclip-plugin/browse_thread/thread/aaca746594fcc1b4">Paperclip Google Group</a>, which is a friendly and active place to hang out if you're a Paperclip user. </p>
<p>Here's an example using Test::Unit, which is still my favorite way to test :)</p>
<pre class="ruby">&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'test_helper'</span>
<span style="color:#9966CC; font-weight:bold;">class</span> PhotoTest &lt; <span style="color:#6666ff; font-weight:bold;">ActiveSupport::TestCase</span>
  setup <span style="color:#9966CC; font-weight:bold;">do</span>
    Photo.<span style="color:#9900CC;">any_instance</span>.<span style="color:#9900CC;">stubs</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:save_attached_files</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">returns</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    Photo.<span style="color:#9900CC;">any_instance</span>.<span style="color:#9900CC;">stubs</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:delete_attached_files</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">returns</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#6666ff; font-weight:bold;">Paperclip::Attachment</span>.<span style="color:#9900CC;">any_instance</span>.<span style="color:#9900CC;">stubs</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:post_process</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">returns</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># tests...</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>The really important bit is stubbing out the post_process method. That took my unit tests down from 51.77 to 15.14 seconds. That's a HUGE win, especially if you consider <a href="http://railspikes.com/2009/3/10/slow-tests-are-a-bug/comments/1927#comment-1927">slow tests to be a bug</a>. </p>
<p>I'm not sure what kind of impact this has on test coverage, so you may want to consider not stubbing out the Paperclip internals in every case. I've got some separate "remote" tests that I run before deployments that make me feel warm and fuzzy enough. Let me know what you think about it. I've had really good results so far!</p>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/03/12/speeding-up-paperclip-tests-by-a-lot/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TLS_PROTOCOL, “SSL3_GET_RECORD:wrong version number” and how to troubleshoot a borked Courier IMAP SSL setup.</title>
		<link>http://almosteffortless.com/2009/03/10/tls_protocol-ssl3_get_recordwrong-version-number-and-how-to-troubleshoot-a-borked-courier-imap-ssl-setup/</link>
		<comments>http://almosteffortless.com/2009/03/10/tls_protocol-ssl3_get_recordwrong-version-number-and-how-to-troubleshoot-a-borked-courier-imap-ssl-setup/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 19:58:11 +0000</pubDate>
		<dc:creator>Timothy O'Connell</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1211</guid>
		<description><![CDATA[I was recently doing some server hardening on the computer that serves my email when, upon attempting to check my admin account, I got the following completely unhelpful, vanilla "encryption protocol" error from Thunderbird:
Thunderbird can't connect securely to  because the site uses a security protocol which isn't enabled.
So, naturally, I whipped out T-bird's about:config, [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently doing some server hardening on the computer that serves my email when, upon attempting to check my admin account, I got the following completely unhelpful, vanilla "encryption protocol" error from Thunderbird:</p>
<blockquote><p>Thunderbird can't connect securely to <MAILSERVER> because the site uses a security protocol which isn't enabled.</p></blockquote>
<p>So, naturally, I whipped out T-bird's about:config, grepped the list for "ssl" and made sure that most of the contemporary ciphers were enabled (i.e. set to true). And once I was satisfied that things were on the up and up with my client, I decided to go have a look at the server.</p>
<p>Tailing <em>mail.log</em>, I noted this sort of thing happening over and over:
<pre>Mar 10 13:06:31 lana postfix/postfix-script[18701]: starting the Postfix mail system
Mar 10 13:06:31 lana postfix/master[18702]: daemon started -- version 2.5.5, configuration /etc/postfix
Mar 10 13:07:27 lana <strong>imapd-ssl: couriertls: connect: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher</strong></pre>
<p>This message sort of blew my mind: I was essentially being told that my client, a Debian (Lenny) workstation running Thunderbird, shared no openssl ciphers with my email server, a Debian (Lenny) box out in the wild. </p>
<p>Not being the sort to ignore log warnings, I decided to verify. From the client:</p>
<blockquote><p>gonzo:/# openssl ciphers<br />
DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5</p></blockquote>
<p>A fairly robust list. From the server:</p>
<blockquote><p>lana:/# openssl ciphers<br />
DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5</p></blockquote>
<p> Same cot-damn list. </p>
<p>"So what gives?"</p>
<p>I Googled around a bit and learned about "s_client", an argument for the openssl tool that lets you debug an SSL exchange. I ran the following on my client:<br />
<blockquote><strong>gonzo:/# openssl s_client -connect mail.XXXXXXX.com:993 -ssl3</strong></p></blockquote>
<p> It showed me that the port was open, but that there were handshake problems:
<pre>26282:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1053:SSL alert number 40
26282:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:530:</pre>
<p> From that cryptic output, I decided that it was time to dig into the SSL conf files over on the server. </p>
<p>After a little preliminary troubleshooting--a quick scan of <em>/etc/postfix/main.cf</em> and <em>/etc/postfix/master.cf</em> to check for obvious shenanigans--I decided to have a look at <em>/etc/courier/imapd-ssl</em> and found the source of my new SSL auth problem: I had, in my recent efforts beef up security, managed to overwrite my previous <em>/etc/courier/imapd-ssl</em> with a vanilla version of that conf file that had a big 'ol she in front of the argument that determines exactly which ciphers the IMAP daemon will use to authenticate requests:  <strong>TLS_PROTOCOL</strong> was commented completely out, as was <strong>TLS_STARTTLS_PROTOCOL</strong>.</p>
<p>I took a quick look at the surrounding comments in the conf file and set both of them to "SSL23":<br />
<blockquote>TLS_PROTOCOL=SSL23<br />
TLS_STARTTLS_PROTOCOL=SSL23</p></blockquote>
<p> I then reloaded postfix, attempted to connect with my client and, to my dismay, saw this roll up in the mail.log:
<pre>Mar 10 13:55:34 lana imapd-ssl: couriertls: connect: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number</pre>
<p>This message, while cryptic enough to send me off to scratch my head and pore over comments on OsDir and the Ubuntu fora, was one that I eventually figured out. It turns out that those two TLS protocol directives <strong>do not</strong> want to be identical.</p>
<p>So I chaged the file thus:<br />
<blockquote>TLS_STARTTLS_PROTOCOL=TLS1</p></blockquote>
<p>And, once I had reloaded the IMAP daemon and postfix, <em>voila</em>: a clean log-in!
<pre>Mar 10 13:56:52 lana imapd-ssl: Connection, ip=[::ffff:XX.XXX.XXX.XXX]
Mar 10 13:56:52 lana imapd-ssl: LOGIN, user=admin, ip=[::ffff:XX.XXX.XXX.XXX], port=[42130], protocol=IMAP</pre>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/03/10/tls_protocol-ssl3_get_recordwrong-version-number-and-how-to-troubleshoot-a-borked-courier-imap-ssl-setup/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 3-8-09</title>
		<link>http://almosteffortless.com/2009/03/08/weekly-digest-3-8-09/</link>
		<comments>http://almosteffortless.com/2009/03/08/weekly-digest-3-8-09/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 16:59:24 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1208</guid>
		<description><![CDATA[Trevor's Links
Letting things go
When you don’t have time for the things you really feel passionate about, look around yourself. What things are you hanging onto out of a false sense of obligation? Look beyond your assumptions, and you might be surprised at what can really go.
Rubular
Rubular is a Ruby-based regular expression editor. It's a handy [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://www.37signals.com/svn/posts/1611-letting-things-go">Letting things go</a></p>
<blockquote><p>When you don’t have time for the things you really feel passionate about, look around yourself. What things are you hanging onto out of a false sense of obligation? Look beyond your assumptions, and you might be surprised at what can really go.</p></blockquote>
<p><a href="http://rubular.com/">Rubular</a></p>
<blockquote><p>Rubular is a Ruby-based regular expression editor. It's a handy way to test regular expressions as you write them. [A+++]</p></blockquote>
<p><a href="http://schillmania.com/projects/soundmanager2/">SoundManager 2</a></p>
<blockquote><p>By wrapping and extending Flash 8's sound API, SoundManager 2 brings solid audio functionality to Javascript.</p></blockquote>
<p><a href="http://cameronmoll.com/archives/2009/03/5_p_of_twitter/">The 5 P's of Twitter's runaway success</a></p>
<blockquote><p>Actually, I think we enjoy claiming we can’t describe what Twitter is, yet a closer inspection of it yields not only a better understanding of it but also why it’s become so prevalent in the media lately. And when that kind of inspection occurs, it’s not surprising to the inspector why Twitter is where it’s at today.</p></blockquote>
<p><a href="http://battellemedia.com/archives/004832.php">Twitter = YouTube</a></p>
<blockquote><p>YouTube now gets more searches than Yahoo, Google's closest search rival. YouTube was the single fastest growing new form of search on the Web, and Google pretty much outflanked (and outspent) everyone to buy it. Not to get into video monetization, per se, but to harvest and control the most important emerging form of search. In short, Google could not afford to NOT own YouTube.</p></blockquote>
<p><a href="http://www.codinghorror.com/blog/archives/000922.html">Procrastination and the Bikeshed Effect</a></p>
<blockquote><p>This is one reason why I'm so down on architecture astronauts. I find that the amount of discussion on a software feature is inversely proportional to its value. Sure, have some initial discussion to figure out your direction, but the sooner you can get away from airy abstractions, and down to the nuts and bolts of building the damn thing, the better off you -- and your project -- will be.</p></blockquote>
<p><a href="http://www.mikeindustries.com/blog/archive/2009/03/last-rites">Last Rites</a></p>
<blockquote><p>The death of the newspaper is a depressing thing to absorb, but what’s much more disappointing to me is that I feel like news itself has been devalued. There’s an oversupply of news-”ish” information on the web, and people have decided — usually without realizing it — that free “news snacking” is a better value proposition than paying for in-depth reporting.</p></blockquote>
<p><a href="http://adam.blog.heroku.com/past/2009/3/2/database_versioning/">Database Versioning</a></p>
<blockquote><p>Migrations bother me. On one hand, migrations are the best solution we have for the problem of versioning databases. The scope of that problem includes merging schema changes from different developers, applying schema changes to production data, and creating a DRY representation of the schema. But even though migrations is the best solution we have, it still isn’t a very good one. [Nice comments on this one, too. Especially mine :P]</p></blockquote>
<p><a href="http://yehudakatz.com/2009/03/02/rack-as-a-transformative-figure/">Rack as a Transformative Figure</a></p>
<blockquote><p>In the next few months, Merb and Rails will be making their routers a shared Rack component, and the same is true for a number of smaller elements, like parameter parsing.</p></blockquote>
<p><a href="http://merbist.com/2009/03/02/merb-11-roadmap/">Merb 1.1 roadmap, Merb &amp; Rails3 news</a></p>
<blockquote><p>If we want to make every single application, a potential mountable app, we need to namespace our applications. This is something we already do with slices, but currently generated applications are not namespaced. We are planning on doing that for 1.1 (backward compatible) to make mountable apps easier.</p></blockquote>
<p><a href="http://jasonseifer.com/2009/02/22/offline-gem-server-rdocs">Offline Gem Server RDocs</a></p>
<blockquote><p>Get Sinatra, Rubygems, and Passenger working for offline RDocs? Count me in. I saw this and new I had to have it. I’ve been on some long plane rides recently and I frequently find myself wanting to look up something from a gem’s documentation while I’m coding. You can use the gem server command but that’s just such a pain to do every time you want to look something up.</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://smari.yaxic.org/blag/2009/03/06/microsoft-skull-fucks-icelands-economy-contracts-syphilis/">Microsoft Skull-fucks Iceland’s Economy, Contracts Syphilis</a></p>
<blockquote><p>Ignore the inflammatory title of this article, memorize the talking points and have them ready for your next family gathering or office meeting. This is a fantastic summary (in plan language) of the micro- and macro-economic strategery of MS coupled with a healthy dose of intelligent outrage.</p></blockquote>
<p><a href="http://scanwiches.com/">Scanwiches</a></p>
<blockquote><p>What can I say? I found this enlightening and humorous. Images of scanned cross-sections of sandwiches. Simple. Elegant. Sandwich-y.</p></blockquote>
<p><a href="http://androidguys.com/?p=3931">A Quick Look at Quick Uninstall</a></p>
<blockquote><p>As John mentions, &quot;Quick Uninstall&quot; for your Android phone will live about as long as it takes for Google to recognize that what it provides is a basic functionality and integrate it into the Android trunk. Until then, however, this software is must-have if you (like me) are constantly downloading and uninstalling.</p></blockquote>
<p><a href="http://www.ducea.com/2009/03/02/debian-lenny-pxe-installation-on-dell-poweredge-19502950-servers-bnx2-annoyances/">Debian Lenny PXE Installation on Dell PowerEdge 1950/2950 servers: bnx2 annoyances | MDLog:/sysadmin</a></p>
<blockquote><p>WARN: Lenny's installer no longer supports Broadcom's NetXtreme II. Seeing as how this NIC (or one of its family members) is in pretty much every Dell manufactured in the last five years, this is an important &quot;gotcha&quot;.  Especially if you're dumpster-diving in Corporate America's dustbins for your hardware like me.</p></blockquote>
<p><a href="http://www.slashfood.com/2009/02/27/the-cadbury-creme-egg-mcflurry/">The Cadbury Creme Egg McFlurry - Slashfood</a></p>
<blockquote><p>Sick.</p></blockquote>
<p><a href="http://consumerist.com/5162241/apple-cosmetic-damage-keeps-us-from-replacing-your-battery">Apple: Cosmetic Damage Keeps Us From Replacing Your Battery!</a></p>
<blockquote><p>This is not marked because I consider it significant: anyone who has ever dealt with the &quot;Genius Bar&quot; knows that Apple's repair/replacement arm is about as interested in helping you out as Apple's retail arm is interested in charging you a reasonable rate for their products. What /is/ significant about this article is that there are, evidently, still people in the world who don't know this from experience. Like, until I saw this, I was convinced that everyone already had a wealth of Genius Bar horror story anecdotes. You could not have argued with me. I was certain. And then I saw this...</p></blockquote>
<p><a href="http://lifehacker.com/5161563/prevent-firefox-from-hogging-memory-when-minimized">Firefox Tip: Prevent Firefox from Hogging Memory When Minimized</a></p>
<blockquote><p>This is kind of key: LifeHacker writes about the about:config entry that lets you prevent FF from continuing to use memory when minimized. This is key: particularly if a.) you're minimizing it (instead of, e.g. giving it its own desktop) or b.) you have a nasty habit of leaving tabs open to websites that either automatically refresh or host flash media, etc.</p></blockquote>
<p><a href="http://www.whitehouse.gov/blog/09/03/02/Cyber-review-underway/">The White House - Cyber review underway</a></p>
<blockquote><p>Mostly I'm bookmarking this because its use of the term &quot;cyberspace&quot; as the one word summary for &quot;communications and information infrastructure&quot; made me laugh. And reminded me of William Gibson's cameo on Oliver Stone's &quot;Wild Palms&quot; where Kim Catrall introduces Wm Gibson with something like, &quot;William invented the term 'cyberspace'&quot; and the Gibber respondes, &quot;And they won't let me forget it&quot; before sauntering awkwardly off camera.</p></blockquote>
<p><a href="http://www.ducea.com/2009/03/01/wordpress-mod_rewrite-rules-taking-over-mod_status/">Wordpress mod_rewrite rules taking over mod_status</a></p>
<blockquote><p>This is an interesting write-up of what happens if you've got a Wordpress install at the same TLD where you keep your Apache server-status page. Basically, Wordpress (quite correctly) ignores http requests for http://tld.com/server-status and dude shows you a sample apache rewrite for how to exempt requests for that specific URL from WP's automatic request redirection. Nice.</p></blockquote>
<p><a href="http://amog.com/entertainment/watchmen-movie-bomb/">Why The New Watchmen Movie Will Bomb</a></p>
<blockquote><p>I'm bookmarking this pretty much for the sole purpose of being able to come back to it next week and point out why thoughtful, delicate prognostication and careful made predictions are but a candle in the sunlight of enormous budgets. This movie will &quot;succeed&quot; commercially because it is massively over-funded. End of conversation.</p></blockquote>
<p><a href="http://www.bbspot.com/News/2009/03/authors-guild-speak-and-spell.html?from=rss">The Authors Guild Sets Sights on Speak and Spell</a></p>
<blockquote><p>So, here you've got a mildly derisive lampooning of the Author's Guild which, in the habit that the RIAA/MPAA have forced advocates of free expression/thought to become accustomed, seeks to portray the AG as a cartel and to represent their recent success in limiting the capabilities of the Kindle 2 as unfair or anti-competitive. And it's kind of funny. But it makes the wrong point. The AG, for sure, is in the moral/ethical/political/social/historical wrong. But the real point--the relevant point--is that the Amazon's desire to accommodate Mega Corp DRM schemes has finally been manifested in a design decision. That's the story here. Amazon put out a device that anti-DRM folks called flawed. Now we have a flaw to which we can point.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/03/08/weekly-digest-3-8-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 3-1-09</title>
		<link>http://almosteffortless.com/2009/03/01/weekly-digest-3-1-09/</link>
		<comments>http://almosteffortless.com/2009/03/01/weekly-digest-3-1-09/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 01:43:31 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1205</guid>
		<description><![CDATA[Trevor's Links
How FriendFeed uses MySQL to store schema-less data
After some deliberation, we decided to implement a &#34;schema-less&#34; storage system on top of MySQL rather than use a completely new storage system. This post attempts to describe the high-level details of the system. We are curious how other large sites have tackled these problems, and we [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://bret.appspot.com/entry/how-friendfeed-uses-mysql">How FriendFeed uses MySQL to store schema-less data</a></p>
<blockquote><p>After some deliberation, we decided to implement a &quot;schema-less&quot; storage system on top of MySQL rather than use a completely new storage system. This post attempts to describe the high-level details of the system. We are curious how other large sites have tackled these problems, and we thought some of the design work we have done might be useful to other developers.</p></blockquote>
<p><a href="http://www.37signals.com/svn/posts/1594-fit-to-be-used">Fit to be used</a></p>
<blockquote><p>We tend to think of usability as applying only to interfaces. But it’s so much more than that. It’s about delivering something that’s fit to be used. That means it’s about writing copy that’s understood the first time. It’s about requests that are as easy to accomplish as possible. It’s about manuals that are one page instead of 40. It’s about code that you can paste in and works right away. It’s about putting yourself in the other person’s shoes. It’s about looking into the future, foreseeing any potential obstacles, and removing them. And that’s a great way to get people on your side.</p></blockquote>
<p><a href="http://alexstaubo.github.com/keywurl/">Keywurl</a></p>
<blockquote><p>Keywurl adds simple way of performing searches in Safari by letting you type short keywords as queries. Type a keyword and a query in the address bar, and it will be expanded into a predefined search.</p></blockquote>
<p><a href="http://cleanair.highgroove.com/articles/2009/02/26/4-reasons-to-prototype-rapidly">4 Reasons to Prototype Rapidly</a></p>
<blockquote><p>Here are 4 reasons for prototyping applications first. By prototyping, I mean an emphasis on building working applications rapidly.</p></blockquote>
<p><a href="http://www.infoq.com/presentations/katz-couchdb-and-me">CouchDB and Me</a></p>
<blockquote><p>In this talk from RubyFringe, Damien Katz explains what drove him to create CouchDB, why he chose Erlang and more. [More personal than technical, but definitely worth watching.]</p></blockquote>
<p><a href="http://themomorohoax.com/2009/02/25/how-to-write-a-clean-ruby-dsl-part-2-line-by-line-with-machinist-rails">How to write a clean Ruby DSL - Part 2: Learning from Machinist</a></p>
<blockquote><p>So, that’s how machinist works. It extends ActiveRecord to give the #blueprint and #make methods, then inside those methods makes a calls a method on the lathe class, which makes a new lathe object which deals with autogenerating attributes that we didn’t specify in make.</p></blockquote>
<p><a href="http://weblog.jamisbuck.org/2009/2/25/net-ssh-capistrano-and-saying-goodbye">Net::SSH, Capistrano, and Saying Goodbye</a></p>
<blockquote><p>I’m ceasing development on SQLite/Ruby, SQLite3/Ruby, Net::SSH (and related libs, Net::SFTP, Net::SCP, etc.) and Capistrano. I will no longer be accepting patches, bug reports, support requests, feature requests, or general emails related to any of these projects.</p></blockquote>
<p><a href="http://ryandaigle.com/articles/2009/2/23/what-s-new-in-edge-rails-batched-find">Batched Find in Edge Rails</a></p>
<blockquote><p>Batched finds are best used when you have a potentially large dataset and need to iterate through all rows. If done using a normal find the full result-set will be loaded into memory and could cause problems. With batched finds you can be sure that only 1000 * (each result-object size) will be loaded into memory.</p></blockquote>
<p><a href="http://axonflux.com/building-and-scaling-a-startup">Building and Scaling a Startup on Rails</a></p>
<blockquote><p>There are a bunch of basic functional elements to building out a popular Rails app that I've never really seen explained in one place, but we had to learn the hard way while building Posterous. Here's a rundown of what we've learned...</p></blockquote>
<p><a href="http://www.paulgraham.com/13sentences.html">Startups in 13 Sentences</a></p>
<blockquote><p>One of the things I always tell startups is a principle I learned from Paul Buchheit: it's better to make a few people really happy than to make a lot of people semi-happy. I was saying recently to a reporter that if I could only tell startups 10 things, this would be one of them. Then I thought: what would the other 9 be?</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://www.telegraph.co.uk/news/newstopics/howaboutthat/4802067/Portable-toaster-invented-to-warm-up-packed-lunches.html">Portable toaster</a></p>
<blockquote><p>Ho-lee-shit. If this is real--&quot;this&quot; being a ceramic device with carbon nano tubes that can summon enough heat to toast bread but which does not require batteries--then there is no price under $150 that is unreasonable.</p></blockquote>
<p><a href="http://www.flickr.com/photos/8879260@N04/3309918346/in/pool-slashfood/">Mini Oreo's being dunked in milk cup on Flickr</a></p>
<blockquote><p>This is a cupcake--a real, life, edible cupcake--with a small cairn/navel/depression on its top that allows the user to fill the cupcake itself with milk. Must see.</p></blockquote>
<p><a href="http://blogs.koolwal.net/2009/02/25/installing-linux-on-usb-part-7-install-debian-linux-from-usb-drive/">HOWTO: Create a USB Debian Installation flash drive</a></p>
<blockquote><p>This is a drop-dead-simple guide in the plainest possible language to creating a bootable USB drive that will install Debian. Knowing how to do this is an important part of eliminating socially, environmentally and politically irresponsible RO media from the world.</p></blockquote>
<p><a href="http://blogs.msdn.com/larryosterman/archive/2005/06/24/432386.aspx">Why is the DOS path character &quot;&amp;#92;&quot;?</a></p>
<blockquote><p>Thanks Reddit! If you've ever wondered why all the paths on Windows machines are wrong, why the escape character on Windows is &quot;^&quot; and so on, please read this little piece.</p></blockquote>
<p><a href="http://www.marvell.com/featured/plugcomputing.jsp">Marvell: Plug Computing</a></p>
<blockquote><p>This is a computer in a wall wart. And that is about the greatest thing ever. Visions of an entire server farm only slightly larger than your average UPS are dancing through my head...</p></blockquote>
<p><a href="http://lists.backports.org/lurker-bpo/message/20090220.215045.8a623425.en.html">lenny-backports started</a></p>
<blockquote><p>Just a friendly reminder (to myself, mainly) to update those sources.list files to include the new Debian backports information: better now than in a head-long scramble to resolve a BS dependency six weeks from now.</p></blockquote>
<p><a href="http://www.gittlen.com/rollins.htm">Henry Rollins on Iron</a></p>
<blockquote><p>I...wow. Just...wow.</p></blockquote>
<p><a href="http://www.destructoid.com/things-we-can-ban-instead-of-videogames-122163.phtml">Things we can ban instead of videogames</a></p>
<blockquote><p>This article, which encourages people to reassess the risk posed by videogames in light of the risk posed by other, equally ubiquitous and multifarious social phenomena, reminds me of those Schneier articles where he harps on the fact that more people die in car crashes every month than have been killed by terrorists in the entire history of humanity.</p></blockquote>
<p><a href="http://www.howtoforge.com/watching-hard-drive-activity-with-iotop-on-ubuntu-8.10-and-debian-lenny">Watching Hard Drive Activity With iotop</a></p>
<blockquote><p>Have you ever suspected that disc I/O on your RAID card was shitty? Wanted to verify that those mysterious, seemingly read/write related errors were, in fact, related to poor disc I/O? Watch your array crash and burn in real time with iptop!</p></blockquote>
<p><a href="http://lifehacker.com/5158919/declutter-your-home-with-a-detailed-inventory">Clutter: Declutter Your Home with a Detailed Inventory</a></p>
<blockquote><p>I would hesitate to call this a revelation, but it does harp on a basic point of preparing to move (or help a loved one move): before you start packing, go through the place and eliminate redundancy. It seems obvious...until you're unpacking your third hardcover copy of _Paradise Lost_ and thinking to yourself, &quot;Jesus--I can't believe I just drove 30-some-odd pounds of John Milton across the country.&quot;</p></blockquote>
<p><a href="http://adweek.blogs.com/adfreak/2009/02/get-these-guys-for-your-next-video-game-ad.html">AdFreak: Get these guys for your next videogame ad</a></p>
<blockquote><p>So, some indie filmmaker/fanboy types whipped up this Halflife fan fiction video, it went viral and now they're trying to parley (what I'm sure they could insist on calling) their success as viral marketers into startup capital. And while I don't see nothin' wrong with turning your DIY/homebrew viral media project into a pay check, I think this is definitely going to come up the next time someone tries to convince me that the whole &quot;viral&quot; thing didn't jump the shark years ago.</p></blockquote>
<p><a href="http://www.guardian.co.uk/technology/2009/feb/19/insecure-passwords-conflickerb-worm">Read me first: Why do IT systems use insecure passwords?</a></p>
<blockquote><p>Schneier with a very brief piece on why sysadmins need to be the standard-bearers for the charge to convince users to a.) create better passwords and b.) stop trying to circumvent security measures for the sake of &quot;convenience&quot;.  I've been doing my fair share of evangelism. Have you?</p></blockquote>
<p><a href="http://www.theregister.co.uk/2009/02/12/nsa_offers_billions_for_skype_pwnage/">NSA offering 'billions' for Skype eavesdrop solution • The Register</a></p>
<blockquote><p>Courtesy of Schneier: apparently Skype is the go-to for secure voice communications. Good to know.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/03/01/weekly-digest-3-1-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 2-22-09</title>
		<link>http://almosteffortless.com/2009/02/22/weekly-digest-2-22-09/</link>
		<comments>http://almosteffortless.com/2009/02/22/weekly-digest-2-22-09/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 21:22:04 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1202</guid>
		<description><![CDATA[Trevor's Links
Untitled Document Syndrome
...the key is that it minimizes friction. There’s little friction to create a new note, and little friction to search for existing ones. And you never have to explicitly save anything.
GitHub at Startup Riot 2009
What went wrong? So many things. I could blame our market research or our promotional site, or our [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://daringfireball.net/2009/02/untitled_document_syndrome">Untitled Document Syndrome</a></p>
<blockquote><p>...the key is that it minimizes friction. There’s little friction to create a new note, and little friction to search for existing ones. And you never have to explicitly save anything.</p></blockquote>
<p><a href="http://gist.github.com/67060">GitHub at Startup Riot 2009</a></p>
<blockquote><p>What went wrong? So many things. I could blame our market research or our promotional site, or our target demographic, but really it’s our fault. We weren’t in love with FamSpam – we never were. We thought it was a great idea, and maybe it was, but it was a great idea for our parents. For our families. For other people. Not for us. It wasn’t a site I would check every day. It wasn’t something my friends would use ever. I’m going to continue, but to me this is the most important point so far. The biggest failure. I wasn’t in love with the company I was trying to build.</p></blockquote>
<p><a href="http://latimesblogs.latimes.com/technology/2009/02/twitter-creator.html">Twitter creator Jack Dorsey illuminates the site's founding document</a></p>
<blockquote><p>It was really SMS that inspired the further direction -- the particular constraint of 140 characters was kind of borrowed. You have a natural constraint with the couriers when you update your location or with IM when you update your status. But SMS allowed this other constraint, where most basic phones are limited to 160 characters before they split the messages. So in order to minimize the hassle and thinking around receiving a message, we wanted to make sure that we were not splitting any messages. So we took 20 characters for the user name, and left 140 for the content. That’s where it all came from.</p></blockquote>
<p><a href="http://stevenf.tumblr.com/post/78115371/stars">Stars</a></p>
<blockquote><p>The problem with rating systems in general is that only people who feel very strongly about something will take the time to rate it. For a five star scale, that suggests mostly one and five star ratings.</p></blockquote>
<p><a href="http://www.washingtonpost.com/wp-dyn/content/article/2009/02/16/AR2009021601565_5.html">A Virtual Unknown: Meet 'Moot,' the Secretive Internet Celeb Who Still Lives With Mom</a></p>
<blockquote><p>In this way, Poole's problem is the problem of the entire Internet, which is built on wireless connections and a lot of &quot;theoretically.&quot; It's where people spend time, make friends, play games, get news -- and yet despite all of that philosophical worth, the smartest minds in the country still struggle with how to make even the most successful sites profitable.</p></blockquote>
<p><a href="http://code.google.com/p/qsb-mac/">QSB</a></p>
<blockquote><p>Google Quick Search Box is an open source search box that allows you to search data on your computer and across the web. This app is very experimental, but through it you will be able to see many of the areas we are exploring: contextual search, actions, and extensibility. It is by no means feature-complete, but is a very good indication of things to come.</p></blockquote>
<p><a href="http://mooseyard.com/Jens/2009/02/what-will-web-30-be/">What will Web 3.0 be?</a></p>
<blockquote><p>I’ve been researching CouchDB this week, and I’m getting more and more excited by it the more I learn. It combines data storage, REST-based APIs, scalability and data propagation through replication, and even application hosting. It’s actually a lot like Google’s internal infrastructure, but in an open and modular form.</p></blockquote>
<p><a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html">The Law of Leaky Abstractions</a></p>
<blockquote><p>The law of leaky abstractions means that whenever somebody comes up with a wizzy new code-generation tool that is supposed to make us all ever-so-efficient, you hear a lot of people saying &quot;learn how to do it manually first, then use the wizzy tool to save time.&quot; Code generation tools which pretend to abstract out something, like all abstractions, leak, and the only way to deal with the leaks competently is to learn about how the abstractions work and what they are abstracting. So the abstractions save us time working, but they don't save us time learning.</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://arstechnica.com/tech-policy/news/2009/02/wipo-jackasscom-an-owner-a-real-jackass-but-can-keep-site.ars">WIPO: Jackass.com owner a real jackass, but can keep domain</a></p>
<blockquote><p>This is just funny. It's an Ars story about a judge who confirms the right of a no-name squatter to his ownership of the jackass.com TLD in the face of claims from Big Media that they ought to be the owners of the domain because...well...just BECAUSE! OK!? God!</p></blockquote>
<p><a href="http://artipc10.vub.ac.be/wordpress/work/updating-to-debian-lenny.html">Updating to Debian Lenny - upgrade hangs during LDAP</a></p>
<blockquote><p>This is another &quot;read this if you're upgrading to Lenny now that it's finally stable&quot; article. Contains a good warning about potential problems with LDAP.</p></blockquote>
<p><a href="http://www.ducea.com/2009/02/18/linux-tips-bash-completion-devfd62-no-such-file-or-directory/">Linux Tips: bash completion: /dev/fd/62: No such file or directory</a></p>
<blockquote><p>This happened to me. If you manage virtual computers that live on xen servers, it could happen to you.</p></blockquote>
<p><a href="http://arstechnica.com/gaming/news/2009/02/keeping-violent-media-away-from-kids-could-be-a-bad-idea.ars">Keeping violent media away from boys could be a bad idea</a></p>
<blockquote><p>To most sane people, the idea of keeping violent media out of the hands of impressionable children is as patently absurd as all other forms of censorship: the idea of raising children on strictly non-violent narratives means that you lose most of, if not all of the books that we regard (in the West, at least) as canonical. Bye-bye Iliad! Holler back, Star Wars: you will be missed. See-you-later, Old and New Testaments! This article from Ars describes the efforts of an author so dense that she actually feels the need to make the case _in favor_ of allowing children to consider violent media, lest they grow into extremely maladjusted adults who are utterly unprepared to make their way in a world in which violence is not only &quot;the supreme authority from which all other authority is derived&quot;, but also the implicit means and end of most pursuits in which they will find themselves engaged.</p></blockquote>
<p><a href="http://www.collisiondetection.net/mt/archives/2009/02/41_of_museums_d.php">41% of museums don't know how dogs actually walk</a></p>
<blockquote><p>This is a (weirdly) interesting article on a.) how dogs walk and b.) how to correctly represent that in various media. Kind of a ship-in-a-bottle piece, but still a good read.</p></blockquote>
<p><a href="http://www.biotele.com/magenta.html">Magenta Ain't A Colour</a></p>
<blockquote><p>Like optical illusions? Click here!</p></blockquote>
<p><a href="http://i.gizmodo.com/5154285/marioprincess-road-sign-is-the-pinnacle-of-sign-hacking">Hacks: Mario/Princess Road Sign</a></p>
<blockquote><p>I bookmark'd a link to hack-a-day or some other hacker site a while back about how to reset passwords on these things and program new messages. Now I am proud to bookmark this picture of one such hack.</p></blockquote>
<p><a href="http://tech.slashdot.org/firehose.pl?id=3443509&amp;op=view">Draconian DRM revealed in Windows 7</a></p>
<blockquote><p>Just switch already. They're eventually going to stop supporting the last functional version of Windows (i.e. Win2k) and then what? What will you do? Just bite the bullet, buy the MacBook and switch already.</p></blockquote>
<p><a href="http://ivanidris.net/wordpress/index.php/2009/02/03/sharpen-the-vim-saw">Sharpen the Vim saw</a></p>
<blockquote><p>More vim tips/tricks because you can never read too many vim tips/tricks pages. That is a fact.</p></blockquote>
<p><a href="http://www.finerrecliner.com/?p=263">Microsoft SharePoint Uses Hand Crafted GUIDs</a></p>
<blockquote><p>On the one hand, it was kind of cheering to learn that some lowly MS coder hand-translated these URI strings into l337-sp34k . On the other hand, it was depressing to remember that people are actually using Sharepoint in their daily lives.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/02/22/weekly-digest-2-22-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Digest, 2-15-09</title>
		<link>http://almosteffortless.com/2009/02/15/weekly-digest-2-15-09/</link>
		<comments>http://almosteffortless.com/2009/02/15/weekly-digest-2-15-09/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 02:46:10 +0000</pubDate>
		<dc:creator>Weekly Digest</dc:creator>
				<category><![CDATA[Weekly Digest]]></category>

		<guid isPermaLink="false">http://almosteffortless.com/?p=1197</guid>
		<description><![CDATA[Trevor's Links
Canonical URL Tag
The announcement from Yahoo!, Live &#38; Google that they will be supporting a new &#34;canonical url tag&#34; to help webmasters and site owners eliminate self-created duplicate content in the index is, in my opinion, the biggest change to SEO best practices since the emergence of Sitemaps.
Is the Relational Database Doomed? - ReadWriteWeb
Recently, [...]]]></description>
			<content:encoded><![CDATA[<h3>Trevor's Links</h3>
<p><a href="http://www.seomoz.org/blog/canonical-url-tag-the-most-important-advancement-in-seo-practices-since-sitemaps">Canonical URL Tag</a></p>
<blockquote><p>The announcement from Yahoo!, Live &amp; Google that they will be supporting a new &quot;canonical url tag&quot; to help webmasters and site owners eliminate self-created duplicate content in the index is, in my opinion, the biggest change to SEO best practices since the emergence of Sitemaps.</p></blockquote>
<p><a href="http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php">Is the Relational Database Doomed? - ReadWriteWeb</a></p>
<blockquote><p>Recently, a lot of new non-relational databases have cropped up both inside and outside the cloud. One key message this sends is, &quot;if you want vast, on-demand scalability, you need a non-relational database&quot;. If that is true, then is this a sign that the once mighty relational database finally has a chink in its armor? Is this a sign that relational databases have had their day and will decline over time? In this post, we'll look at the current trend of moving away from relational databases in certain situations and what this means for the future of the relational database.</p></blockquote>
<p><a href="http://gitready.com/advanced/2009/02/11/pull-with-rebase.html">git pull with rebase</a></p>
<blockquote><p>Users of Git are hopefully aware that a git pull does a git fetch to pull down data from the specified remote, and then calls git merge to join the changes received with your current branch’s work. However, that may not always be the best case. You can also rebase the changes in, and that may end up being a lot cleaner. This can be done simply by tacking on the --rebase option when you pull</p></blockquote>
<p><a href="http://intridea.com/2009/2/13/dead-simple-task-scheduling-in-rails?blog=company">Dead simple task scheduling in Rails</a></p>
<blockquote><p>Despite having only a one line mention near the bottom of the page, I decided to check out rufus-scheduler, and it turned out to be exactly what I was looking for.  There was no database table, queueing mechanism, or separate process to manage.  Just a simple scheduler to call out to your existing ruby code.</p></blockquote>
<p><a href="http://timothyfitz.wordpress.com/2009/02/09/what-webhooks-are-and-why-you-should-care/">What webhooks are and why you should care</a></p>
<blockquote><p>While there’s a lot of value in webhooks today, it’s the future that really interests me. Webhooks are composable. You’ll point a webhook at a site that will call other webhooks. It might process the data, record it, fork it off to multiple webhooks or something stranger still. Yahoo Pipes tried to do this, but ultimately you were limited to what Yahoo Pipes was designed to do. Webhooks can be integrated and implemented everywhere. They piggyback the fundamental decentralized nature of the web.</p></blockquote>
<p><a href="http://en.oreilly.com/rails2009/public/schedule/detail/7785">The Russian Doll Pattern: Mountable apps in Rails 3</a></p>
<blockquote><p>One of the hottest new features in Rails 3 is the ability to embed a Rails application in another Rails application. This allows the development of components that range from user authentication to a fully featured forum. These components can then be distributed as gems and fully integrated with another application. In fact, user private messaging could be a stand alone app, which is then mounted into a forum app, and finally mounted into your own custom app.</p></blockquote>
<p><a href="http://blog.yetisoftware.com/2009/02/07/receiving-emails-in-rails-using-gmail-imap-rest/comment-page-1/#comment-5">Receiving emails in Rails using Gmail &amp; IMAP, while staying efficient and RESTful</a></p>
<blockquote><p>For a recent project I had a need to receive emails (actually MMSs, but that’ll be the subject of a future post) in a Rails application. My requirements for the solution were: Shouldn’t require root access. Shouldn’t require firing up the Rails stack for every incoming email. Can be scheduled to run automatically.</p></blockquote>
<p><a href="http://factoryjoe.com/blog/2009/02/06/where-does-data-go-when-it-dies/">Where data goes when it dies and other musings</a></p>
<blockquote><p>The web is a fragile place it turns out, in spite of its redundancy and distributed design.</p></blockquote>
<p><a href="http://www.codinghorror.com/blog/archives/001224.html">The Elephant in the Room: Google Monoculture</a></p>
<blockquote><p>Now that Stack Overflow has been chugging right along for almost six months, allow me to share the last month of our own data. Currently, 83% of our total traffic is from search engines, or rather, one particular search engine: Google.</p></blockquote>
<p><a href="http://fhwang.net/2009/02/09/On-fixtures-and-first-time-testers">On fixtures and first-time testers</a></p>
<blockquote><p>But what I’ve never understood is why fixtures are actually easier for a noob than just creating the model in Ruby.</p></blockquote>
<p><a href="http://techno-weenie.net/2009/2/9/the-lie">The Lie</a></p>
<blockquote><p>I do agree with Francis on about everything else though: Fixtures do suck, and testing is really fucking hard. By the time you realize you’re getting into Fixture Hell, moving your monstrosity of an application off fixtures is a daunting task. My solution (and currently the ENTP way): Machinist.</p></blockquote>
<p><a href="http://www.randsinrepose.com/archives/2009/02/09/a_twitter_decision.html">A Twitter Decision</a></p>
<blockquote><p>When I look at Twitter, I see three early essential decisions about how Twitter allows you to craft a community. I believe much of Twitter’s continued success is due to definition and execution of these decisions.</p></blockquote>
<h3>Timothy's Links</h3>
<p><a href="http://androidcommunity.com/moto-android-based-ebook-reference-design-video-demo-20090213/">Moto Android-based eBook reference design</a></p>
<blockquote><p>Boo-yeah: this is my shit, this is what I'm talking about. The Kindle isn't a bad idea in and of itself, but closed software and tamper-proof OSes are the original bad idea and cancel out whatever promise that eBook might have held. Just wait until dudes get Android up and running on a Kindle-like device and watch the market for eReaders EXPLODE.</p></blockquote>
<p><a href="http://www.techzoom.net/publications/firefox-update-dynamics/index.en">Firefox (In)Security Update Dynamics Exposed</a></p>
<blockquote><p>Courtesy of Schneier, this is a (rather formal, white) paper that presents some research on just how up to date the majority of Firefox and Opera users are on any given day. If you're like me, you're running beta software (shit, probably alpha) when it comes to your browser, but you're responsible for the care and feeding of users running stable builds who might or might not have authority to patch/update them. This piece adds useful data to the conversation about either fact.</p></blockquote>
<p><a href="http://googlereader.blogspot.com/2009/01/what-we-did-on-our-winter-break.html">Official Google Reader Blog: What we did on our winter break</a></p>
<blockquote><p>If you live and die by Google Reader (like I do), you probably need to make some changes in your life--display some fucking adaptability, as the Bard advised--and stop being so utterly dependent upon a service that is entirely beyond your control. But until that happens, if you're like me and you're one of the thousands of people who subscribe to the RSS of the Reader team's blog, then it will be old news to you that they've made substantial improvements in recent days. If you're not like me, however, you might be interested in reading up on what they've done in recent times. Who knows--you might just ditch your current reader for the Good (or at least your mobile one).</p></blockquote>
<p><a href="http://www.1cast.com/">1Cast Home</a></p>
<blockquote><p>Apparently 1Cast (TV newsfeeds on your smartphone) is coming to Android. In a matter of moments. Can't say I'm super-excited myself--I prefer the written to the moving image--but it's nice to see the diff between iPhone apps and Android Marketplace get another line knocked off of it.</p></blockquote>
<p><a href="http://ichi2.net/anki/wiki/AndroidAnki">AndroidAnki - Anki Wiki</a></p>
<blockquote><p>This is the page for the only project I know of that is attempting to &quot;port&quot; anki to Android. Doing a good job so far, IMO.</p></blockquote>
<p><a href="http://www.webhostingunleashed.com/features/server-meltdowns-millions-020309/">11 Embarrassing Server Meltdowns that Cost Companies Millions - Web Hosting Unleashed</a></p>
<blockquote><p>This is a good one to read if you've recently broken the website and are feeling kind of shitty about having caused massive outages: there's no way your fuck-ups could ever be as bad as these.</p></blockquote>
<p><a href="http://venturebeat.com/2009/02/09/apple-asked-google-not-to-use-multi-touch-in-android-and-google-complied/">Source: Apple asked Google not to use multi-touch in Android, and Google complied » VentureBeat</a></p>
<blockquote><p>More grist for the rumor mill. This idea, i.e. that Apple made some kind of political or corporate power play to keep multi-touch (i.e. &quot;pinch&quot;) out of the Android OS, has been a scandal since before the release of the G1. I'm not sure if this makes me believe the conspiracy theories, but I think it's clear at this point that there were definitely some shady, backroom dealings going on at some point.</p></blockquote>
<p><a href="http://shell-sink.blogspot.com/">shell_sink</a></p>
<blockquote><p>So this is this utility that, after some software installation (mostly just some script copies) and an easy-peasy registration, adds a feature to your Google applications that records and indexes your command line usage. I'm trying it out for now--what could possibly go wrong with keeping an infinite bash history?--and it seems promising.</p></blockquote>
<p><a href="http://arstechnica.com/software/news/2009/02/google-turns-on-exchange-for-iphone-and-windows-mobile-users.ars">Google turns on Exchange for iPhone and Windows Mobile users - Ars Technica</a></p>
<blockquote><p>There is officially no reason to use a Microsoft program any longer. Thanks Google!</p></blockquote>
<p><a href="http://www.nytimes.com/2009/02/04/business/media/04adco.html">In the Ad Wars, Apple Still Has Microsoft’s Number</a></p>
<blockquote><p>This is a nice &quot;status of forces&quot; kind of report about how Apple and MS are still squaring off in the international marketing arena for the hearts and minds of people who don't care about computers. It's useful if, like me, you live in a bomb shelter of booze, Linux and uppers so deep beneath the surface of the Earth that not even the mighty Crispin Porter + Bogusky have developed a bunker-buster powerful enough to penetrate.</p></blockquote>
<p><a href="http://androidguys.com/?p=3576">App Review: Useful Switchers</a></p>
<blockquote><p>Useful Switchers creates shortcuts to some of the most frequently toggled system settings on the G1 (thus fixing the UI design failure of having to open the menu, press &quot;Settings&quot; and then navigate down two or more menus to find what you were looking for). Hot shit.</p></blockquote>
<p><a href="http://debaday.debian.net/2009/02/08/vnstat-a-console-based-network-traffic-monitor/">Debian Package of the Day » vnstat - a console-based network traffic monitor</a></p>
<blockquote><p>These guys continue to provide a quality service: I'd say a full 50% of the &quot;pacakges of the day&quot; they describe are ones I've never heard of before and which I will one day use again. vnstat is a utility for long-term (i.e. survives reboots) bandwidth usage monitoring. It may even help you kick your DIY bandwidth monitoring to the curb.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://almosteffortless.com/2009/02/15/weekly-digest-2-15-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
