<?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>steve hulet &#187; technical</title>
	<atom:link href="http://ideaharbor.org/notes/category/technical/feed" rel="self" type="application/rss+xml" />
	<link>http://ideaharbor.org/notes</link>
	<description>random notes mostly for myself</description>
	<lastBuildDate>Tue, 24 Jan 2012 01:52:37 +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>How To Fix &#8220;_arguments:comparguments:208: invalid argument: ARG&#8221; SVN Tab Completion Error</title>
		<link>http://ideaharbor.org/notes/technical/how-to-fix-_argumentscomparguments208-invalid-argument-arg-svn-tab-completion-error?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-fix-_argumentscomparguments208-invalid-argument-arg-svn-tab-completion-error</link>
		<comments>http://ideaharbor.org/notes/technical/how-to-fix-_argumentscomparguments208-invalid-argument-arg-svn-tab-completion-error#comments</comments>
		<pubDate>Tue, 24 Jan 2012 01:50:31 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=381</guid>
		<description><![CDATA[SVN 1.5 changed the Subversion help output to print ARG instead of arg. Unfortunately, the file which ZSH uses to parse the Subversion help output to generate the tab completion options was only looking for a lower case arg. The result is the error _arguments:comparguments:208: invalid argument: ARG when trying to tab-complete svn commands in [...]]]></description>
			<content:encoded><![CDATA[<p>SVN 1.5 <a href="https://svn.apache.org/viewvc?view=revision&#038;revision=863338">changed</a> the Subversion help output to print <code>ARG</code> instead of <code>arg</code>. Unfortunately, the file which ZSH uses to parse the Subversion help output to generate the tab completion options was only looking for a lower case <code>arg</code>. The result is the error <code>_arguments:comparguments:208: invalid argument: ARG</code> when trying to tab-complete <code>svn</code> commands in ZSH.</p>
<p><a href="http://zsh.cvs.sourceforge.net/viewvc/zsh/zsh/Completion/Unix/Command/_subversion?r1=1.24&#038;r2=1.25&#038;">The fix</a> was committed to the ZSH source in Jan 2008, but still has yet to make its way into all the machines being sold by hosting providers.</p>
<p>If you get stuck with a box with the new SVN but the old ZSH you can fix this yourself by editing <code>/usr/share/zsh/x.x.x/functions/_subversion</code> and replacing </p>
<blockquote><p><code>arg/:arg:</code></p></blockquote>
<p> with </p>
<blockquote><p><code>(arg|ARG)/:arg:</code></p></blockquote>
<p> both places it occurs. </p>
<p>Voilà! SVN tab completion works again.</p>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/how-to-fix-_argumentscomparguments208-invalid-argument-arg-svn-tab-completion-error/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Downloading Podcasts With CRON</title>
		<link>http://ideaharbor.org/notes/technical/downloading-podcasts-with-cron?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=downloading-podcasts-with-cron</link>
		<comments>http://ideaharbor.org/notes/technical/downloading-podcasts-with-cron#comments</comments>
		<pubDate>Fri, 04 Feb 2011 05:09:47 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=349</guid>
		<description><![CDATA[I used to open iTunes so I could click the &#8220;update&#8221; button to get the latest version of a podcast. Then I got tired of waiting for iTunes and decided I could keep my podcasts updated via CRON. Here&#8217;s the script I use which should work for most podcasts with an XML feed: wget --output-document=- [...]]]></description>
			<content:encoded><![CDATA[<p>I used to open iTunes so I could click the &#8220;update&#8221; button to get the latest version of a podcast. Then I got tired of waiting for iTunes and decided I could keep my podcasts updated via CRON. Here&#8217;s the script I use which should work for most podcasts with an XML feed:</p>
<blockquote><p><code>wget --output-document=- --quiet http://feeds.americanpublicmedia.org/MarketplacePodcast | grep mp3 | head -1 | sed -e "s/^.*\(http.*mp3\).*/\1/" | wget --input-file=- --quiet --output-document /tmp/marketplace.`date +\%Y-\%m-\%d`.mp3<br />
</code></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/downloading-podcasts-with-cron/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Connecting to MS SQL Server with Ruby on Rails</title>
		<link>http://ideaharbor.org/notes/technical/connecting-to-ms-sql-server-with-ruby-on-rails?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=connecting-to-ms-sql-server-with-ruby-on-rails</link>
		<comments>http://ideaharbor.org/notes/technical/connecting-to-ms-sql-server-with-ruby-on-rails#comments</comments>
		<pubDate>Fri, 01 Oct 2010 04:32:37 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=338</guid>
		<description><![CDATA[Tools If you&#8217;re running the Rails app on a Windows box you&#8217;ll first need the the DevKit toolkit in order to build gems: Regardless of platform you&#8217;ll need to install the ODBC Binding for Ruby and SQL Server 2005 and 2008 Adapter For ActiveRecord. Add the latter (at least) to your project by adding config.gem [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Tools</strong></p>
<p>If you&#8217;re running the Rails app on a Windows box you&#8217;ll first need the the  <a href="http://github.com/oneclick/rubyinstaller/wiki/Development-Kit">DevKit</a> toolkit in order to build gems:</p>
<p>Regardless of platform you&#8217;ll need to install the <a href="http://www.ch-werner.de/rubyodbc/">ODBC Binding for Ruby</a> and <a href="http://github.com/rails-sqlserver/activerecord-sqlserver-adapter">SQL Server 2005 and 2008 Adapter For ActiveRecord</a>. Add the latter (at least) to your project by adding <code>config.gem "activerecord-sqlserver-adapter"</code> to your <code>environment.rb</code> config section.</p>
<p><strong>Configuration</strong></p>
<p>On Linux we&#8217;ll need the <a href="http://www.freetds.org/">FreeTDS</a> libraries in order to talk to the MS SQL. You&#8217;ll need to add an entry to the <a href="http://www.freetds.org/userguide/freetdsconf.htm"><code>freetds.conf</code></a> file specifying how your database can be reached. Be sure to <a href="http://www.freetds.org/userguide/confirminstall.htm">confirm the installation</a> to make sure it&#8217;s possible to connect to the database.</p>
<p>To bridge the gap between Rails and FreeTDS you&#8217;ll need to add your database configuration settings to two additional files, <code>/etc/odbc.ini</code> and <code>/etc/odbcinst.ini</code>.</p>
<p>In <code>/etc/odbcinst.ini</code> add something to the effect of:</p>
<blockquote><p><code>[FreeTDS]<br />
Description     = TDS driver (Sybase/MS SQL)<br />
Driver          = /usr/lib64/libtdsodbc.so<br />
Setup           = /usr/lib64/libtdsS.so<br />
CPTimeout       =<br />
CPReuse         =<br />
FileUsage       = 1<br />
</code></p></blockquote>
<p>Make sure the Driver and Setup paths point to the actual libraries.</p>
<p>In <code>/etc/odbc.ini</code> add something to the effect of:</p>
<blockquote><p><code>[DSN_NAME]<br />
Driver          = FreeTDS<br />
Description     = ODBC connection via FreeTDS<br />
Trace           = No<br />
Servername      = SERVER_NAME<br />
Database        = DATABASE_NAME<br />
</code></p></blockquote>
<p>Then, in your <code>database.yml</code> file:</p>
<blockquote><p><code>development:<br />
  adapter: sqlserver<br />
  mode: ODBC<br />
  dsn: DSN_NAME<br />
  username: USER<br />
  password: PASS<br />
</code></p></blockquote>
<p>Customize the all-caps strings as needed, except the mode, which really is ODBC.</p>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/connecting-to-ms-sql-server-with-ruby-on-rails/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing Tomcat 6 on a cPanel Server</title>
		<link>http://ideaharbor.org/notes/technical/installing-tomcat-6-on-a-cpanel-server?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installing-tomcat-6-on-a-cpanel-server</link>
		<comments>http://ideaharbor.org/notes/technical/installing-tomcat-6-on-a-cpanel-server#comments</comments>
		<pubDate>Tue, 29 Jun 2010 01:01:00 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=329</guid>
		<description><![CDATA[The cPanel EasyApache system makes it easy to recompile Apache with various add-ons and modules. There&#8217;s even a checkbox for adding Tomcat. Unfortunately, this installs Tomcat 5.5, and I needed Tomcat 6.0. Here&#8217;s how I got it: 1) install Tomcat 5.5 using EasyApache (see this .pdf for details) 2) download and expand Tomcat 6 in [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.cpanel.net/documentation/easyapache/">cPanel EasyApache</a> system makes it easy to recompile Apache with various add-ons and modules. There&#8217;s even a checkbox for adding Tomcat. Unfortunately, this installs Tomcat 5.5, and I needed Tomcat 6.0. Here&#8217;s how I got it:</p>
<p>1) install Tomcat 5.5 using EasyApache (see <a href="http://docs.cpanel.net/twiki/pub/AllDocumentation/TrainingResources/TrainingSlides08/Tomcat.pdf">this .pdf</a> for details)</p>
<p>2) download and expand Tomcat 6 in <code>/usr/local/jakarta</code></p>
<p>3) change the <code>tomcat</code> symlink to point to your new version (i.e. <code>/usr/local/jakarta/apache-tomcat-6.0.XX</code>)</p>
<p>4) from <a href="http://trulymanaged.com/blog/installation-of-tomcat6/">http://trulymanaged.com/blog/installation-of-tomcat6/</a>:</p>
<p><code>#cd apache-tomcat-6.0.18<br />
# cd bin<br />
# tar xvfz jsvc.tar.gz<br />
# cd jsvc-src<br />
# chmod +x configure<br />
# ./configure<br />
# make<br />
# cp jsvc ..<br />
# cd ..</code></p>
<p>5) copy over any <code>Host</code> blocks from <code>tomcat/conf/server.xml</code> from the old Tomcat install to the new Tomcat install (you may or may not be able to set up new hosts through WHM)</p>
<p>6) copy over <code>conf/workers.properties</code> from the old Tomcat install to the new Tomcat install</p>
<p>7) start tomcat normally (<code>/usr/sbin/starttomcat</code>)</p>
<p>The <code>/manager/html/</code> Tomcat manager application doesn&#8217;t load, though, so it&#8217;s not perfect.  </p>
<p>If you ever need your old Tomcat back just stop Tomcat, flip the <code>tomcat</code> symlink back to the old install, and restart Tomcat.</p>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/installing-tomcat-6-on-a-cpanel-server/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Dreamhost to Google Apps naked domain name redirection</title>
		<link>http://ideaharbor.org/notes/technical/dreamhost-to-google-apps-naked-domain-name-redirection?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dreamhost-to-google-apps-naked-domain-name-redirection</link>
		<comments>http://ideaharbor.org/notes/technical/dreamhost-to-google-apps-naked-domain-name-redirection#comments</comments>
		<pubDate>Fri, 25 Jun 2010 05:36:23 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=325</guid>
		<description><![CDATA[I&#8217;ve had this problem twice in recent memory, which warrants taking notes. Dreamhost has a handy &#8220;Google Hosted&#8221; feature where with a single click they&#8217;ll completely configure your domain to use Google Apps. You can then use Google Sites and the rest of the Apps suite for your entire website. Unfortunately, while Google Sites allows [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had this problem twice in recent memory, which warrants taking notes.</p>
<p><a href="http://www.dreamhost.com/r.cgi?192161">Dreamhost</a> has a handy &#8220;Google Hosted&#8221; feature where with a single click they&#8217;ll completely configure your domain to use <a href="http://www.google.com/apps/intl/en/group/index.html">Google Apps</a>. You can then use Google Sites and the rest of the Apps suite for your entire website. Unfortunately, while Google Sites allows you to map a subdomain to a Google Site page, mapping <a href="http://www.google.com/support/blogger/bin/answer.py?hl=en&#038;answer=139485">naked domains</a> (e.g. example.com) are not supported. If one maps the <code>www</code> subdomain to a Google Site then the traditional <code>www.example.com</code> will resolve, but <code>example.com</code> gives a Google-served <a href="http://en.wikipedia.org/wiki/HTTP_404">404 error</a>. When using the Dreamhost &#8220;Google Hosted&#8221; feature all of the generated domain DNS records are non-editable, so you&#8217;re stuck with an <code>A</code> record which maps the domain to a nonexistent site.</p>
<p>My solution was to not use the Dreamhost &#8220;Google Hosted&#8221; feature at all, but to instead use the &#8220;DNS Only&#8221; option. I copied down all the generated DNS entries from the &#8220;Google Hosted&#8221; setup and manually recreated them, with one exception. The <code>A</code> record for the naked domain I directed to 174.129.25.170, which is the IP address of <a href="http://www.wwwizer.com/">WWWizer</a>, a free service which handily redirects any naked domain request the the corresponding <code>www</code> subdomain.</p>
<p>Now I have a site set up on my <code>www</code> subdomain with Google footing the hosting bill, and naked domain requests are seamlessly redirected to the <code>www</code>-based home page.</p>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/dreamhost-to-google-apps-naked-domain-name-redirection/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Enabling chat outside Google Apps</title>
		<link>http://ideaharbor.org/notes/technical/enabling-chat-outside-google-apps?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=enabling-chat-outside-google-apps</link>
		<comments>http://ideaharbor.org/notes/technical/enabling-chat-outside-google-apps#comments</comments>
		<pubDate>Thu, 29 Apr 2010 18:40:18 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=295</guid>
		<description><![CDATA[Google Apps users can chat with other users on the Google Talk network, but it&#8217;s also possible to set up federation on your domain to allow your users to chat with anyone using the XMPP protocol. The Google Help page on the topic, at http://www.google.com/support/a/bin/answer.py?hl=en&#038;answer=34143, is pretty weak. &#8220;If you require assistance making these changes [...]]]></description>
			<content:encoded><![CDATA[<p>Google Apps users can chat with other users on the Google Talk network, but it&#8217;s also possible to set up federation on your domain to allow your users to chat with anyone using the XMPP protocol.</p>
<p>The Google Help page on the topic, at <a href="http://www.google.com/support/a/bin/answer.py?hl=en&#038;answer=34143">http://www.google.com/support/a/bin/answer.py?hl=en&#038;answer=34143</a>, is pretty weak. &#8220;If you require assistance making these changes in your domain host account&#8221;, they offer, &#8220;we suggest contacting your domain host.&#8221;</p>
<p>The change involves adding SRV DNS records for your domain. The records to be added are:<br />
<code><br />
_xmpp-server._tcp.gmail.com. IN SRV 5 0 5269 xmpp-server.l.google.com.<br />
_xmpp-server._tcp.gmail.com. IN SRV 20 0 5269 xmpp-server1.l.google.com.<br />
_xmpp-server._tcp.gmail.com. IN SRV 20 0 5269 xmpp-server2.l.google.com.<br />
_xmpp-server._tcp.gmail.com. IN SRV 20 0 5269 xmpp-server3.l.google.com.<br />
_xmpp-server._tcp.gmail.com. IN SRV 20 0 5269 xmpp-server4.l.google.com.<br />
_jabber._tcp.gmail.com. IN SRV 5 0 5269 xmpp-server.l.google.com.<br />
_jabber._tcp.gmail.com. IN SRV 20 0 5269 xmpp-server1.l.google.com.<br />
_jabber._tcp.gmail.com. IN SRV 20 0 5269 xmpp-server2.l.google.com.<br />
_jabber._tcp.gmail.com. IN SRV 20 0 5269 xmpp-server3.l.google.com.<br />
_jabber._tcp.gmail.com. IN SRV 20 0 5269 xmpp-server4.l.google.com.<br />
</code><br />
where <em>gmail.com</em> is replaced by your apps domain name.</p>
<p><a href="http://en.wikipedia.org/wiki/SRV_record">Wikipedia</a> takes a SRV record in the form<br />
<code><br />
_sip._tcp.example.com. 86400 IN SRV 0 5 5060 sipserver.example.com.<br />
</code> </p>
<p>and breaks it down thusly:<br />
<code><br />
_Service._Proto.Name TTL Class SRV Priority Weight Port Target<br />
</code></p>
<p>Where:</p>
<blockquote>
<ul>
<li> <strong>Service</strong>: the symbolic name of the desired service.
</li>
<li> <strong>Proto</strong>: the transport protocol of the desired service; this is usually either TCP or UDP.
</li>
<li> <strong>Name</strong>: the domain name for which this record is valid.
</li>
<li> <strong>TTL</strong>: standard DNS time to live field.
</li>
<li> <strong>Class</strong>: standard DNS class field (this is always IN).
</li>
<li> <strong>Priority</strong>: the priority of the target host, lower value means more preferred.
</li>
<li> <strong>Weight</strong>: A relative weight for records with the same priority.
</li>
<li> <strong>Port</strong>: the TCP or UDP port on which the service is to be found.
</li>
<li> <strong>Target</strong>: the canonical hostname of the machine providing the service.
</li>
</ul>
</blockquote>
<p>Taking the first of the Google provided record definitions as an example,<br />
<code><br />
_xmpp-server._tcp.gmail.com. IN SRV 5 0 5269 xmpp-server.l.google.com.<br />
</code><br />
we have:</p>
<ul>
<li> <strong>Service</strong>: xmpp-server
</li>
<li> <strong>Proto</strong>: tcp
</li>
<li> <strong>Name</strong>: gmail.com.
</li>
<li> <strong>TTL</strong>: (none given)
</li>
<li> <strong>Class</strong>: IN
</li>
<li> <strong>Priority</strong>: 5
</li>
<li> <strong>Weight</strong>: 0
</li>
<li> <strong>Port</strong>: 5269
</li>
<li> <strong>Target</strong>: xmpp-server.l.google.com.
</li>
</ul>
<p>where, again, <em>gmail.com</em> is replaced by your Google Apps domain. </p>
<p>My DNS settings provider doesn&#8217;t offer a &#8220;Name&#8221; field while adding SRV records; instead they have a &#8220;Record/Hostname&#8221; field where the domain fixed but with the opportunity to enter a subdomain. This is usually not necessary with Google Apps, unless your primary Google Apps domain is actually a subdomain. For me I just left the &#8220;Record/Hostname&#8221; field blank and the &#8220;Name&#8221; was set correctly.</p>
<p>You can test that your new SRV records were created correctly using <a href="http://www.linuxcommand.org/man_pages/dig1.html">dig</a>:<br />
<code><br />
dig SRV _xmpp-server._tcp.gmail.com<br />
</code></p>
<p>You should get back, in the ANSWER SECTION, just what the Google Help page listed for that service (with a TTL added):<br />
<code><br />
_xmpp-server._tcp.gmail.com. 86400 IN	SRV 20 0 5269 xmpp-server1.l.google.com.<br />
_xmpp-server._tcp.gmail.com. 86400 IN	SRV 20 0 5269 xmpp-server2.l.google.com.<br />
_xmpp-server._tcp.gmail.com. 86400 IN	SRV 20 0 5269 xmpp-server3.l.google.com.<br />
_xmpp-server._tcp.gmail.com. 86400 IN	SRV 20 0 5269 xmpp-server4.l.google.com.<br />
_xmpp-server._tcp.gmail.com. 86400 IN	SRV 5 0 5269 xmpp-server.l.google.com.<br />
</code></p>
<p>If you don&#8217;t want to wait for the DNS updates to propagate you can ask your domains name server directly:<br />
<code><br />
dig @69.28.203.75 SRV _xmpp-server._tcp.gmail.com<br />
</code></p>
<p>Where 69.28.203.75 is replaced with the IP address of your domains name server.</p>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/enabling-chat-outside-google-apps/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shell Script</title>
		<link>http://ideaharbor.org/notes/technical/shell-script?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=shell-script</link>
		<comments>http://ideaharbor.org/notes/technical/shell-script#comments</comments>
		<pubDate>Mon, 15 Mar 2010 02:22:00 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=281</guid>
		<description><![CDATA[A fun little shell script: :(){:&#124;:&#038;};:]]></description>
			<content:encoded><![CDATA[<p>A fun little shell script:</p>
<p><code>:(){:|:&#038;};:</code></p>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/shell-script/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DVD Backups</title>
		<link>http://ideaharbor.org/notes/technical/dvd-backups?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dvd-backups</link>
		<comments>http://ideaharbor.org/notes/technical/dvd-backups#comments</comments>
		<pubDate>Fri, 05 Mar 2010 07:45:52 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=277</guid>
		<description><![CDATA[DVD Decrypter faithfully copies disks to drives. Mode ISO > Read will produce an .iso of a disk; a double-layer disk will produce an 8GB .iso. The File mode just copies all the files as-is straight from the disk into a VIDEO_TS folder. DVD Decrypter looks like it can also burn .isos by changing the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dvddecrypter.org.uk/">DVD Decrypter</a> faithfully copies disks to drives. Mode <code>ISO > Read</code> will produce an <code>.iso</code> of a disk; a double-layer disk will produce an 8GB <code>.iso</code>. The <code>File</code> mode just copies all the files as-is straight from the disk into a <code>VIDEO_TS</code> folder. DVD Decrypter looks like it can also burn <code>.iso</code>s by changing the <code>Mode</code> to <code>ISO > Write</code>, but I haven&#8217;t tried it yet. </p>
<p><a href="http://www.imgburn.com/">ImgBurn</a> is great for burning <code>.iso</code> files to a DVD. Just insert a DVD, choose your source file, and click the button.</p>
<p><a href="http://www.dvdshrink.org/">DVD Shrink</a> will create a 4GB <code>.iso</code> from a double-layer disk!</p>
<p>See:</p>
<p><a href="http://lifehacker.com/5444274/five-best-dvd+ripping-tools">http://lifehacker.com/5444274/five-best-dvd+ripping-tools</a><br />
<a href="http://lifehacker.com/5446090/best-dvd+ripping-tool-handbrake">http://lifehacker.com/5446090/best-dvd+ripping-tool-handbrake</a><br />
<a href="http://lifehacker.com/208866/hack-attack-one+click-dvd-rips">http://lifehacker.com/208866/hack-attack-one+click-dvd-rips</a><br />
<a href="http://www.softpedia.com/get/CD-DVD-Tools/CD-DVD-Rip-Other-Tools/DVD-Shrink.shtml">http://www.softpedia.com/get/CD-DVD-Tools/CD-DVD-Rip-Other-Tools/DVD-Shrink.shtml</a><br />
<a href="http://paininthetech.com/2006/04/30/how-to-back-up-a-dvd">http://paininthetech.com/2006/04/30/how-to-back-up-a-dvd</a></p>
<p>For encoding for iPhone I like that <a href="http://handbrake.fr/">HandBrake</a> has iPhone presets. Just open the disk, select the preset, and click Start. When it&#8217;s done just drag the .m4v into iTunes, sync, and go.</p>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/dvd-backups/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reusing stdout</title>
		<link>http://ideaharbor.org/notes/technical/reusing-stdou?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reusing-stdou</link>
		<comments>http://ideaharbor.org/notes/technical/reusing-stdou#comments</comments>
		<pubDate>Tue, 09 Feb 2010 20:12:18 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=259</guid>
		<description><![CDATA[stdout is nice&#8211;it let&#8217;s you see what&#8217;s going on. But what if you want to see what&#8217;s going on and also do something else with the same output. tee is useful for redirecting stdout to a file, but what if you want to send the same output to another command too, like mail? You disguise [...]]]></description>
			<content:encoded><![CDATA[<p><code>stdout</code> is nice&#8211;it let&#8217;s you see what&#8217;s going on. But what if you want to see what&#8217;s going on <em>and</em> also do something else with the same output. </p>
<p><code><a href="http://en.wikipedia.org/wiki/Tee_%28command%29">tee</a></code> is useful for redirecting <code>stdout</code> to a file, but what if you want to send the same output to another command too, like <code>mail</code>?</p>
<p>You disguise the command as a file, that&#8217;s what. Through <a href="http://tldp.org/LDP/abs/html/process-sub.html">process substitution</a> you can say things like</p>
<p><code>echo "hello world" | tee >(mail -s "notice")</code></p>
<p>and have the message go to <code>stdout</code> <em>and</em> your mail program. You can chain process substitutions to do as many different things with the same output as you want.</p>
<p>Process substitution is supported in <code>bash</code> and friends, but not, as far as I can see, in <code>sh</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/reusing-stdou/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu Personal Package Archives</title>
		<link>http://ideaharbor.org/notes/technical/ubuntu-personal-package-archives?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu-personal-package-archives</link>
		<comments>http://ideaharbor.org/notes/technical/ubuntu-personal-package-archives#comments</comments>
		<pubDate>Tue, 09 Feb 2010 03:58:12 +0000</pubDate>
		<dc:creator>hulet</dc:creator>
				<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://ideaharbor.org/notes/?p=256</guid>
		<description><![CDATA[Personal Package Archives make it easy for anyone to make software available through the apt system without the need to be accepted into the official repository. You can simply create a PPA and other people can add, or subscribe to them. Updates pushed to a PPA show up in users Update Managers alongside all of [...]]]></description>
			<content:encoded><![CDATA[<p>Personal Package Archives make it easy for anyone to make software available through the <code>apt</code> system without the need to be accepted into the official repository. You can simply create a PPA and other people can add, or subscribe to them. Updates pushed to a PPA show up in users Update Managers alongside all of the official updates. Ubuntu 9.10 makes PPAs easier than ever before. To add the PPA for Ubuntu Chromium &#8211; Dev Channel, just say</p>
<p><code>sudo add-apt-repository ppa:chromium-daily/dev</code></p>
<p>A few PPAs I like are</p>
<ul>
<li><a href="https://launchpad.net/~chromium-daily/+archive/dev">PPA for Ubuntu Chromium &#8211; Dev Channel</a></li>
<li><a href="https://launchpad.net/~shutter/+archive/ppa">PPA for Shutter Team</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ideaharbor.org/notes/technical/ubuntu-personal-package-archives/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

