<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>paul schreiber &#187; tech</title>
	<atom:link href="http://paulschreiber.com/blog/category/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://paulschreiber.com</link>
	<description>tagline goes here</description>
	<lastBuildDate>Wed, 18 Jan 2012 04:06:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>TurboVote at Harvard and Personal Democracy Forum</title>
		<link>http://paulschreiber.com/blog/2011/06/07/turbovote-harvard-pdf/</link>
		<comments>http://paulschreiber.com/blog/2011/06/07/turbovote-harvard-pdf/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 15:53:14 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=2165</guid>
		<description><![CDATA[On May 24, Seth Flaxman and I told the story of TurboVote Berkman Center for Internet &#38; Society: Yesterday, we talked TurboVote at Personal Democracy Forum:]]></description>
			<content:encoded><![CDATA[<p>On May 24, Seth Flaxman and I told the story of TurboVote <a href="http://cyber.law.harvard.edu/">Berkman Center for Internet &amp; Society</a>:</p>
<p><embed src="http://wilkins.law.harvard.edu/events/luncheons/2011-05-24_turbovote/2011-05-24_turbovote640.mov" width="640" height="496" /></p>
<p>Yesterday, we talked TurboVote at Personal Democracy Forum:</p>
<p><iframe width="640" height="385" src="http://cdn.livestream.com/embed/pdf2011?layout=4&#038;clip=pla_aa63ff33-941f-4a5a-9f2d-4428575a82ba&#038;color=0xe7e7e7&#038;autoPlay=false&#038;mute=false&#038;iconColorOver=0x888888&#038;iconColor=0x777777&#038;allowchat=true" style="border:0;outline:0" frameborder="0" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2011/06/07/turbovote-harvard-pdf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://wilkins.law.harvard.edu/events/luncheons/2011-05-24_turbovote/2011-05-24_turbovote640.mov" length="545470544" type="video/quicktime" />
		</item>
		<item>
		<title>Mind WIND Mobile stick phones home</title>
		<link>http://paulschreiber.com/blog/2011/05/18/mind-wind-mobile-stick-phones-home/</link>
		<comments>http://paulschreiber.com/blog/2011/05/18/mind-wind-mobile-stick-phones-home/#comments</comments>
		<pubDate>Wed, 18 May 2011 17:20:12 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[phones]]></category>
		<category><![CDATA[tech]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=2150</guid>
		<description><![CDATA[I recently purchased a new internet stick from WIND. It&#8217;s a Huawei E1691. In addition to improving the device hardware, they also replaced the software. Instead of a slow Java monstrosity, it&#8217;s now a Windows XP-clone written in QT. Ugh. &#8230; <a href="http://paulschreiber.com/blog/2011/05/18/mind-wind-mobile-stick-phones-home/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I recently purchased a new internet stick from WIND. It&#8217;s a Huawei E1691. In addition to improving the device hardware, they also replaced the software.</p>
<p>Instead of a slow Java monstrosity, it&#8217;s now a Windows XP-clone written in QT. Ugh. Today I discovered it has a built in auto-updater. Every now and then, it checks in with update-america.huaweidevice.com.</p>
<blockquote class="code">192.168.001.102.62516-077.222.090.003.00080: POST /america/UrlCommand/CheckNewVersion.aspx HTTP/1.1
Content-Type: text/xml
Content-Length: 476
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en,*
User-Agent: Mozilla/5.0
Host: update-america.huaweidevice.com:80
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;root&gt;
&lt;rule name=&quot;DashBoard&quot;&gt;21.003.27.06.562&lt;/rule&gt;
&lt;rule name=&quot;DeviceName&quot;&gt;E1691&lt;/rule&gt;
&lt;rule name=&quot;FirmWare&quot;&gt;11.126.15.02.562&lt;/rule&gt;
&lt;rule name=&quot;HardWare&quot;&gt;CD98TCPU&lt;/rule&gt;
&lt;rule name=&quot;IMEI&quot;&gt;HEX:434D98558CE2B347B456..&lt;/rule&gt;
&lt;rule name=&quot;IMSI&quot;&gt;HEX:A7F1D92A82C8D8FE..&lt;/rule&gt;
&lt;rule name=&quot;Language&quot;&gt;English&lt;/rule&gt;
&lt;rule name=&quot;Network&quot;&gt;tele.ring&lt;/rule&gt;
&lt;rule name=&quot;OS&quot;&gt;MAC&lt;/rule&gt;
&lt;/root&gt;
077.222.090.003.00080-192.168.001.102.62516: HTTP/1.1 200 OK
Date: Wed, 18 May 2011 17:03:42 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=ac1su3ngww23xc2mouoosxfu; path=/; HttpOnly
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Content-Length: 69
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;root&gt;&lt;status&gt;1&lt;/status&gt;&lt;/root&gt;
</blockquote>
<p>Checking for software updates is fine. Good, in fact. Apple does it. Google does it. Adobe does. But the software shouldn&#8217;t be sending private information such as my IMEI, and it definitely shouldn&#8217;t be sending those kind of details in the clear.</p>]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2011/05/18/mind-wind-mobile-stick-phones-home/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HOWTO setup multistage deployment with Capistrano</title>
		<link>http://paulschreiber.com/blog/2011/02/12/howto-setup-multistage-deployment-with-capistrano/</link>
		<comments>http://paulschreiber.com/blog/2011/02/12/howto-setup-multistage-deployment-with-capistrano/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 01:24:29 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[public service announcement]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[multistage]]></category>
		<category><![CDATA[production]]></category>
		<category><![CDATA[staging]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=2013</guid>
		<description><![CDATA[When I wrote about deploying PHP sites with Capistrano, step 6 was a bit of a throwaway — hey, here's a quick hack for handling multistage deployment. I'd been using variants of that technique for quite some time but figured &#8230; <a href="http://paulschreiber.com/blog/2011/02/12/howto-setup-multistage-deployment-with-capistrano/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When I wrote about <a href="http://paulschreiber.com/blog/2009/03/15/howto-deploy-php-sites-with-capistrano-2/">deploying PHP sites with Capistrano</a>, step 6 was a bit of a throwaway — hey, here's a quick hack for handling multistage deployment. I'd been using variants of that technique for quite some time but figured there must be a better way. There is: <a href="http://weblog.jamisbuck.org/2007/7/23/capistrano-multistage">Capistrano multistage</a>. There is even <a href="https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension">documentation</a> for this. But it misses a few steps.</p>
<h3>How to setup multistage deployment with Capistrano</h3>
<ol>
<li>Install capistrano and capistrano multistage</li>
<li>Capify your project</li>
<li>Set up the <code>deploy/</code> directory</li>
<li>Create the deployment recipes</li>
</ol>
<p>In my Rails-based example, we'll have two stages: <em>staging</em> and <em>production</em>. You can name your stages whatever you want. However, don’t name one of your stages <em>stage</em> — that's a reserved word. Call it <em>staging</em>.</p>
<h3>Install capistrano and capistrano multistage</h3>
<p><code>gem install capistrano
<br />gem install capistrano-ext</code></p>
<h3>Capify your project</h3>
<p><code>capify .</code></p>
<h3>Set up the <code>deploy</code> directory</h3>
<p><code>
mkdir config/deploy
<br />touch config/deploy/staging.rb
<br />touch config/deploy/production.rb
</code>
</p>
<h3>Create the deployment recipes</h3>
<p>You’re going to edit three files: <code>deploy.rb</code>, <code>staging.rb</code> and <code>production.rb</code>:</p>
<h4>deploy.rb</h4>
<blockquote class="code">set :stages, %w(staging production)
set :default_stage, "production"
require 'capistrano/ext/multistage'
<br />default_run_options[:pty] = true
<br />set :application, "myproject"
set :use_sudo, false
set :keep_releases, 5
<br />set :repository,  "https://somewhere/svn/myproject/trunk"
set :scm, :subversion
set :scm_username, "me"
set :deploy_via, :export
<br /># this is useful in a shared hosting environment, where you have your own JAVA_HOME or GEM_HOME.
# otherwise, just set RAILS_ENV
set(:rake) { "JAVA_HOME=#{java_home} GEM_HOME=#{gem_home} RAILS_ENV=#{rails_env} /usr/bin/env rake" }
<br /># since :domain is defined in another file (staging.rb and production.rb),
# we need to delay its assignment until they're loaded
set(:domain) { "#{domain}" }
role(:web) { domain }
role(:app) { domain }
role(:db, :primary => true) { domain }
<br />namespace :deploy do
  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
  end
end
<br /># for some reason, this isn't enabled by default
after "deploy:update", "deploy:cleanup"
<br /># here is an example task which uses rake, as defined above
after "deploy:migrate", "load_sample_fixtures"
desc "load sample fixtures"
task :load_sample_fixtures do
  run "cd #{current_release}; FIXTURES=samples #{rake} db:fixtures:load"
end
</blockquote>
<h4>staging.rb</h4>
<blockquote class="code">set :deploy_to, "/path/to/#{application}-stage"
# My Rails app uses RJB, so it needs to know where Java lives
set :java_home, "/path/to/java-6-openjdk"
set :domain, "testing.myserver.ca"
set :user, "paul"
set :rails_env, "staging"
# I am root on my staging server and have all the right gems installed
# so I don't need GEM_HOME to be overridden
set :gem_home, nil
</blockquote>
<h4>production.rb</h4>
<blockquote class="code">set :deploy_to, "/home/myuser/#{application}"
set :java_home, "/home/myuser/sw/jdk"
set :domain, "www.myserver.ca"
set :user, "myuser"
set :rails_env, "production"
set :gem_home, "/home/myuser/ruby/gems/"
<br /># in a shared hosting environment, you often need to specify your own passenger configuration
desc "copy the .htaccess file (passenger configuration); setup_load_paths.rb (sets GEM_HOME)"
namespace :deploy do
  task :copy_htaccess do
    run "cp #{current_release}/config/htaccess_production #{current_release}/public/.htaccess"
    run "mv #{current_release}/config/production_setup_load_paths.rb #{current_release}/config/setup_load_paths.rb"
  end
end
<br />after "deploy:update_code", "deploy:copy_htaccess"
</blockquote>
<p>Now, you’re set. You can deploy with <code>cap deploy</code> (for the default stage, production), or <code>cap staging deploy</code>. <a href="http://macromates.com/">TextMate</a>'s Capistrano plugin handles this gracefully, presenting you with a dialog listing the available stages.</p>]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2011/02/12/howto-setup-multistage-deployment-with-capistrano/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Dear Adobe: please don&#8217;t crash while logging</title>
		<link>http://paulschreiber.com/blog/2011/02/03/dear-adobe-please-dont-crash-while-logging/</link>
		<comments>http://paulschreiber.com/blog/2011/02/03/dear-adobe-please-dont-crash-while-logging/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 16:31:35 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[broken]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[tech]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=1902</guid>
		<description><![CDATA[I recently upgraded my copy of Creative Suite to CS5. When you install CS5 Design Premium, you don&#8217;t just get Photoshop, InDesign, Illustrator and the like. You also get a ton of other bits, like Adobe Help (despite the existence &#8230; <a href="http://paulschreiber.com/blog/2011/02/03/dear-adobe-please-dont-crash-while-logging/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I recently upgraded my copy of Creative Suite to CS5. When you install CS5 Design Premium, you don&#8217;t just get Photoshop, InDesign, Illustrator and the like. You also get a ton of other bits, like Adobe Help (despite the existence of a built-in Help Viewer), Adobe Application Manager and CS5ServiceManager.</p>
<p>Many of these strike me as unnecessary. But they&#8217;re also poorly written. Background processes like this shouldn&#8217;t crash. And they&#8217;re really shouldn&#8217;t crash <em>writing log files</em>.</p>
<p>Here&#8217;s the first of two crashes in six hours:</p>
<blockquote><p><code>Process:         CS5ServiceManager [9272]<br />
Path:            /Library/Application Support/Adobe/CS5ServiceManager/CS5ServiceManager.app/Contents/MacOS/CS5ServiceManager<br />
Identifier:      com.adobe.csi.CS5ServiceManager<br />
Version:         ??? (5.0.1.137)<br />
Code Type:       X86 (Native)<br />
Parent Process:  ??? [1]</p>
<p>Date/Time:       2011-02-01 20:19:32.291 -0500<br />
OS Version:      Mac OS X 10.6.6 (10J567)<br />
Report Version:  6</p>
<p>Exception Type:  EXC_BAD_ACCESS (SIGBUS)<br />
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000000<br />
Crashed Thread:  5</p>
<p>...snip...</p>
<p>Thread 5 Crashed:<br />
0   ???                           	0000000000 0 + 0<br />
1   libstdc++.6.dylib             	0x9783fd7a d_name + 164<br />
2   libstdc++.6.dylib             	0x9783f3f4 d_type + 657<br />
3   libstdc++.6.dylib             	0x97843189 d_demangle + 747<br />
4   ...adobe.csi.CS5ServiceManager	0x00021094 vcfoundation::impl::UTF8Builder::Append(vcfoundation::data::IVCString*, vcfoundation::util::VCRange) + 174<br />
5   ...adobe.csi.CS5ServiceManager	0x00014d92 vcfoundation::util::BackTrace::Describe(vcfoundation::data::IVCStringAppender&#038;) + 34<br />
6   ...adobe.csi.CS5ServiceManager	0x00021e09 vcfoundation::data::IVCStringAppender::AppendFormat(char const*, char*) + 143<br />
7   ...adobe.csi.CS5ServiceManager	0x00021e5e vcfoundation::data::IVCStringAppender::AppendFormat(char const*, ...) + 34<br />
8   ...adobe.csi.CS5ServiceManager	0x00014c90 vcfoundation::util::StdStreamLog::Log(vcfoundation::util::IVCLog::Level, char const*, char*) + 452<br />
9   libSystem.B.dylib             	0x937d4be8 free + 244<br />
</code>
</p></blockquote>
<p>Examining the crashed thread, we can make a few observations:</p>
<ul>
<li>Adobe seems to have invented their own string-handling library</li>
<li>Appending strings can cause a crash</li>
<li>Adobe is using C++</li>
<li>This crash happening <em>logging</em></li>
<li>This crash happening … <em>writing a crash report?</em></li>
</ul>
<p>The only way <em>I&#8217;ve</em> crashed a log call is with a format string error. And format string problems? They&#8217;re often security holes. Can anyone tell if this might be exploitable?</p>
<p>And did they really invent their own crash reporter? And is that what&#8217;s crashing?</p>
<p>Dear Adobe: <a href="http://site.icu-project.org/">the wheel is already round</a>. If you&#8217;re going to litter my computer with crap, it better be rock solid.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2011/02/03/dear-adobe-please-dont-crash-while-logging/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WordPress batch upgrade</title>
		<link>http://paulschreiber.com/blog/2011/01/02/wordpress-batch-upgrade/</link>
		<comments>http://paulschreiber.com/blog/2011/01/02/wordpress-batch-upgrade/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 06:45:37 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[public service announcement]]></category>
		<category><![CDATA[tech]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=1864</guid>
		<description><![CDATA[If you run a web server and have multiple installations of WordPress, upgrading them all is a pain. Wouldn&#8217;t it be nice if you could update a dozen WP installs at once? Wouldn&#8217;t it be even better if you could &#8230; <a href="http://paulschreiber.com/blog/2011/01/02/wordpress-batch-upgrade/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you run a web server and have multiple installations of WordPress, upgrading them all is a pain. </p>
<p>Wouldn&#8217;t it be nice if you could update a dozen WP installs at once? Wouldn&#8217;t it be even better if you could update the Akismet plugin at the same time? (WordPress releases independently of Akimset, and their subversion tags doesn&#8217;t track Akismet&#8217;s trunk).</p>
<p>Now you can. Inspired by <a href="http://birdhouse.org/software/2010/08/wordpress-mass-management/">Scot Hacker&#8217;s WordPress Mass Management Tools</a>, I created <a href="https://github.com/paulschreiber/misc/tree/master/python/wordpress">wp-upgrade</a>.</p>
<h3>Usage</h3>
<p><code>$ cd /path/to/wp-upgrade<br />
$ sudo ./wp-upgrade.py 3.0.4<br />
</code></p>
<h3>Configuration</h3>
<p>You need to configure two files before starting:</p>
<ul>
<li><code>sites.txt</code> a tab-delimited file with information about the sites you&#8217;ll be upgrading (path, url, email address of owner, userid of owner)</li>
<li><code>wp-upgrade.txt</code> an email with instructions to your users</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2011/01/02/wordpress-batch-upgrade/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GenerationX updated for Snow Leopard</title>
		<link>http://paulschreiber.com/blog/2010/12/25/generationx-updated-for-snow-leopard/</link>
		<comments>http://paulschreiber.com/blog/2010/12/25/generationx-updated-for-snow-leopard/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 23:16:09 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[tech]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=1845</guid>
		<description><![CDATA[When you work on your family tree — or genealogy project — you&#8217;ll work with GEDCOM files. Sites like Geni and ancestry.com can export (and sometimes) import these files. There are a few Mac programs for editing GEDCOM files: Reunion &#8230; <a href="http://paulschreiber.com/blog/2010/12/25/generationx-updated-for-snow-leopard/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When you work on your family tree — or genealogy project — you&#8217;ll work with <a href="http://en.wikipedia.org/wiki/GEDCOM">GEDCOM files</a>. Sites like <a href="http://www.geni.com/">Geni</a> and <a href="http://www.ancestry.com/">ancestry.com</a> can export (and sometimes) import these files.</p>
<p>There are a few Mac programs for editing GEDCOM files: <a href="http://www.leisterpro.com/">Reunion</a> ($100), <a href="http://www.myheredis.com/">Heredis</a> ($70), <a href="http://www.syniumsoftware.com/macfamilytree/">MacFamilyTree</a> ($50) and <a href="http://www.geditcom.com/">GEDitCOM II</a> ($65).</p>
<p><a href="https://github.com/paulschreiber/GenerationX/blob/master/GenerationX.app.zip"><img style="float: right;" src="http://paulschreiber.com/wp-content/uploads/2010/12/GenerationX.png" alt="" title="GenerationX" width="128" height="128" class="alignnone size-full wp-image-1846" /></a> These are varying degrees of nice, but overkill if you just need to read a file or two. A while ago, Chris Hagedorn wrote <a href="http://thenowhereman.com/hacks/">GenerationX</a>, a <em>free</em> GEDCOM reader.</p>
<p>But Chris ceased development on GenerationX. He left two versions: 2.4.1 and a beta of 3.0. GenerationX was PowerPC-only and crashed on launch under Snow Leopard. The version 3 beta had some expiry code in it; it was set to expire in 2006.</p>
<p>I downloaded a copy of the GenerationX source, fixed a bunch of the errors and warnings and <a href="https://github.com/paulschreiber/GenerationX/">put my fork on GitHub</a>. It looks like this:<br />
<img src="http://paulschreiber.com/wp-content/uploads/2010/12/Screen-shot-2010-12-25-at-5.57.41-PM.png" alt="" title="Sample GEDCOM" width="778" height="564" class="alignnone size-full wp-image-1847" /></p>
<p>It&#8217;s definitely beta quality. Hopefully someone who&#8217;s a solid Cocoa engineer will fork the project and take it over.</p>
<p><a href="https://github.com/paulschreiber/GenerationX/blob/master/GenerationX.app.zip">Download GenerationX 3.0 beta</a>. This is a universal binary that runs on Snow Leopard.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2010/12/25/generationx-updated-for-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HP&#8217;s Epic DFS fail</title>
		<link>http://paulschreiber.com/blog/2010/12/14/hps-epic-dfs-fail/</link>
		<comments>http://paulschreiber.com/blog/2010/12/14/hps-epic-dfs-fail/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 22:41:43 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[broken]]></category>
		<category><![CDATA[tech]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=1821</guid>
		<description><![CDATA[In hardware engineering lingo, DFS is &#8220;design for serviceability.&#8221;]]></description>
			<content:encoded><![CDATA[<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/OpCJzdWxEbQ?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/OpCJzdWxEbQ?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<p>In hardware engineering lingo, DFS is &#8220;design for serviceability.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2010/12/14/hps-epic-dfs-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to solve the &#8220;undefined method `deep_symbolize_keys&#8217; for nil:NilClass&#8221; error in Rails</title>
		<link>http://paulschreiber.com/blog/2010/12/09/how-to-solve-the-undefined-method-deep_symbolize_keys-for-nilnilclass-error-in-rails/</link>
		<comments>http://paulschreiber.com/blog/2010/12/09/how-to-solve-the-undefined-method-deep_symbolize_keys-for-nilnilclass-error-in-rails/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 03:39:38 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[public service announcement]]></category>
		<category><![CDATA[tech]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=1813</guid>
		<description><![CDATA[I was trying to migrate a table in my Rails app and got this error: undefined method `deep_symbolize_keys' for nil:NilClass It&#8217;s a strange error, and there weren&#8217;t very many hits on Google. A lighthouse ticket provided a clue. The problem &#8230; <a href="http://paulschreiber.com/blog/2010/12/09/how-to-solve-the-undefined-method-deep_symbolize_keys-for-nilnilclass-error-in-rails/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I was trying to migrate a table in my Rails app and got this error:<br />
  <code>undefined method `deep_symbolize_keys' for nil:NilClass</code></p>
<p>It&#8217;s a strange error, and there weren&#8217;t very many hits on Google. A <a href="http://railsdog.lighthouseapp.com/projects/31096/tickets/1607-generating-an-extension-has-some-issues">lighthouse ticket</a> provided a clue.</p>
<p>The problem wasn&#8217;t one of my plugins or gems — it was i18n itself. Upgrading from 0.4.1 to 0.5.0 solved my problem. (I am using Rails 2.3.10.)</p>
<p>Here&#8217;s the full stack trace:</p>
<blockquote class="code"><p>
$ rake db:migrate RAILS_ENV=production  &#8211;trace<br />
(in /home/loranaw/apply/releases/20101210024212)<br />
** Invoke db:migrate (first_time)<br />
** Invoke environment (first_time)<br />
** Execute environment<br />
rake aborted!<br />
undefined method `deep_symbolize_keys&#8217; for nil:NilClass<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/backend/simple.rb:34:in `store_translations&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/backend/base.rb:215:in `load_file&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/backend/base.rb:215:in `each&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/backend/base.rb:215:in `load_file&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/backend/base.rb:21:in `load_translations&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/backend/base.rb:21:in `each&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/backend/base.rb:21:in `load_translations&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/backend/simple.rb:57:in `init_translations&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/backend/simple.rb:40:in `available_locales&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n/config.rb:38:in `available_locales&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.1/lib/i18n.rb:35:in `available_locales&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:226:in `valid_locale?&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:243:in `parse_extensions&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:233:in `split&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:118:in `initialize&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:92:in `new&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:92:in `create_template&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:87:in `templates_in_path&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:86:in `each&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:86:in `templates_in_path&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/template.rb:69:in `load!&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.10/lib/active_support/dependencies.rb:173:in `to_proc&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/paths.rb:40:in `each&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.10/lib/action_view/paths.rb:40:in `load!&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rails-2.3.10/lib/initializer.rb:402:in `load_view_paths&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rails-2.3.10/lib/initializer.rb:194:in `process&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rails-2.3.10/lib/initializer.rb:113:in `send&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rails-2.3.10/lib/initializer.rb:113:in `run&#8217;<br />
/home/loranaw/apply/releases/20101210024212/config/environment.rb:9<br />
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require&#8217;<br />
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.10/lib/active_support/dependencies.rb:182:in `require&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.10/lib/active_support/dependencies.rb:547:in `new_constants_in&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.10/lib/active_support/dependencies.rb:182:in `require&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rails-2.3.10/lib/tasks/misc.rake:4<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain&#8217;<br />
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:607:in `invoke_prerequisites&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:604:in `each&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:604:in `invoke_prerequisites&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:596:in `invoke_with_call_chain&#8217;<br />
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run&#8217;<br />
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/bin/rake:31<br />
/usr/bin/rake:19:in `load&#8217;<br />
/usr/bin/rake:19
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2010/12/09/how-to-solve-the-undefined-method-deep_symbolize_keys-for-nilnilclass-error-in-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The FCC just sold you out</title>
		<link>http://paulschreiber.com/blog/2010/12/02/the-fcc-just-sold-you-out/</link>
		<comments>http://paulschreiber.com/blog/2010/12/02/the-fcc-just-sold-you-out/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 00:40:43 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[politics]]></category>
		<category><![CDATA[tech]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=1811</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/gyGTD6yvBUo?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/gyGTD6yvBUo?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2010/12/02/the-fcc-just-sold-you-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fixing the mysterious &#8220;Element script is missing required attribute src&#8221; error</title>
		<link>http://paulschreiber.com/blog/2010/12/02/fixing-the-mysterious-element-script-is-missing-required-attribute-src-error/</link>
		<comments>http://paulschreiber.com/blog/2010/12/02/fixing-the-mysterious-element-script-is-missing-required-attribute-src-error/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 17:33:09 +0000</pubDate>
		<dc:creator>paulschreiber</dc:creator>
				<category><![CDATA[broken]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">http://paulschreiber.com/?p=1797</guid>
		<description><![CDATA[Suppose you're using the W3C validator to validate HTML5. Here's a sample document: &#60;!doctype html&#62; &#60;html lang=&#34;en&#34; xml:lang=&#34;en&#34;&#62; &#60;head&#62; &#60;meta charset=&#34;utf-8&#34; /&#62; &#60;title&#62;Hello&#60;/title&#62; &#60;script type=&#34;text/javascript&#34; charset=&#34;utf-8&#34;&#62; //&#60;![CDATA[ var foo = 1; //]]&#62; &#60;/script&#62; &#60;/head&#62; &#60;body&#62; &#60;/body&#62; &#60;/html&#62; Everything looks right, &#8230; <a href="http://paulschreiber.com/blog/2010/12/02/fixing-the-mysterious-element-script-is-missing-required-attribute-src-error/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Suppose you're using the <a href="http://validator.w3.org/">W3C validator</a> to validate HTML5. Here's a sample document:</p>
<blockquote><p><code>&lt;!doctype html&gt;<br />
&lt;html lang=&quot;en&quot; xml:lang=&quot;en&quot;&gt;<br />
&lt;head&gt;<br />
	&lt;meta charset=&quot;utf-8&quot; /&gt;<br />
	&lt;title&gt;Hello&lt;/title&gt;<br />
	&lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;<br />
	//&lt;![CDATA[<br />
		var foo = 1;<br />
	//]]&gt;<br />
	&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
</code>
</p></blockquote>
<p>Everything looks right, but you get this mysterious error:</p>
<blockquote><p>
Line 6, Column 48: Element script is missing required attribute src.<br />
	<code>&lt;script type="text/javascript" charset="utf-8"&gt;</code>
</p></blockquote>
<p>But you don't want or need an src attribute, because your JavaScript is inline. The solution is not to add the src attribute, but to <em>remove the charset attribute</em>.</p>
<p>(Note: a <a href="http://bugzilla.validator.nu/show_bug.cgi?id=794">bug has been filed</a> and this will be fixed in a future release.)</p>
]]></content:encoded>
			<wfw:commentRss>http://paulschreiber.com/blog/2010/12/02/fixing-the-mysterious-element-script-is-missing-required-attribute-src-error/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

