<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8951599490492075117</id><updated>2025-06-04T01:31:59.023-04:00</updated><category term="internet"/><category term="technology"/><category term="how to"/><category term="youtube"/><category term="DNS"/><category term="music"/><category term="programming"/><category term="systems administration"/><category term="Gaming"/><category term="Movember"/><category term="books"/><category term="health"/><category term="movies"/><category term="news"/><category term="prostate cancer"/><category term="review"/><category term="BIND"/><category term="MMO"/><category term="business"/><category term="interview"/><category term="money"/><category term="politics"/><category term="remix"/><category term="video"/><category term="Afilias"/><category term="Apple"/><category term="Barry Shell"/><category term="Buzz Aldrin"/><category term="CIRA"/><category term="Cosmos"/><category term="DNS poisoning"/><category term="DNS security"/><category term="DNSSEC"/><category term="Dan Pink"/><category term="Dave Eggers"/><category term="Deb Matthews"/><category term="Esterian Conquest"/><category term="EuroIX"/><category term="FreeNAS"/><category term="Hacker News"/><category term="IXP"/><category term="Jack Conte"/><category term="Jesse Brown"/><category term="KOTOR"/><category term="Kobold2D"/><category term="Ladar Levison"/><category term="Lavabit"/><category term="Maurice Sendak"/><category term="Max Records"/><category term="Nominum"/><category term="O&#39;Reilly"/><category term="Obama"/><category term="PIR"/><category term="PSA"/><category term="PSA test"/><category term="Planetary Society"/><category term="RSS"/><category term="Search Engine"/><category term="Spike Jonze"/><category term="Star Wars"/><category term="Stephen Hawking"/><category term="TED"/><category term="The Hacker Blog"/><category term="Tom Tovar"/><category term="USA"/><category term="Weakerthans"/><category term="Where The Wild Things Are"/><category term="Xcode"/><category term="Ze Frank"/><category term="animation"/><category term="arts"/><category term="cloud computing"/><category term="cocos2d"/><category term="collaboration"/><category term="community service"/><category term="curling"/><category term="gifts"/><category term="incentives"/><category term="internet security"/><category term="kutiman"/><category term="lightning"/><category term="motorcycle"/><category term="network administration"/><category term="new year&#39;s"/><category term="open source"/><category term="photography"/><category term="physics"/><category term="recycling"/><category term="reference"/><category term="ruby"/><category term="satire"/><category term="science"/><category term="screen capture"/><category term="screen casting"/><category term="security"/><category term="social science"/><category term="space"/><category term="stop motion"/><category term="travel"/><category term="web"/><title type='text'>Matt Pounsett</title><subtitle type='html'>Random musings about life, technology, or other things worth mentioning.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-4658313296526454289</id><published>2022-12-28T18:06:00.001-05:00</published><updated>2022-12-28T18:06:12.508-05:00</updated><title type='text'>Blog Relaunch</title><content type='html'>&lt;p&gt;&amp;nbsp;For various reasons I&#39;m shutting down this Blogspot site, and redirecting traffic back to my personal web site.&amp;nbsp; I&#39;ve got a new post &lt;a href=&quot;https://www.conundrum.com/blog/2022/Dec/blog-relaunch/&quot;&gt;there&lt;/a&gt; explaining this in more detail.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/4658313296526454289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2022/12/blog-relaunch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/4658313296526454289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/4658313296526454289'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2022/12/blog-relaunch.html' title='Blog Relaunch'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-2617822781465470852</id><published>2019-03-13T16:16:00.001-04:00</published><updated>2019-03-13T17:17:31.460-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="how to"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="network administration"/><category scheme="http://www.blogger.com/atom/ns#" term="systems administration"/><title type='text'>Using LTE for Out of Band</title><content type='html'>It&#39;s generally good practice to make sure that any network you&#39;re responsible for maintaining can be reached in the event of a failure of either the main Internet (transit) connection, or failure (or misconfiguration) of the routing equipment. Sometimes it&#39;s not feasible to have a second transit connection or redundant networking hardware, and so you need to get creative.&lt;br /&gt;
&lt;br /&gt;
One of my clients is a not-for-profit with constrained financial resources. We wanted to have a way in to the network in the event of a failure of the main router, or in case someone (likely me) fat-fingers something and breaks the router config. And, while having a second transit connection would be nice, it&#39;s just not something we can fit in the budget at the moment.&lt;br /&gt;
&lt;br /&gt;
So, we had to get creative.&lt;br /&gt;
&lt;br /&gt;
Before I came on board, they had purchased a consumer-grade LTE modem with the intention of using that as the backup access into the network, but hadn&#39;t actually set it up yet. This blog post covers the steps I took to get it working.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Overview&lt;/h3&gt;
&lt;div&gt;
The data centre in question is in the US, so we&#39;re using a simple T-mobile pay-as-you-go data service. This service is designed for &lt;i&gt;outgoing&lt;/i&gt;&amp;nbsp;connections, and doesn&#39;t provide a publicly-reachable IP address that I could ssh to from outside the LTE network, so I need to set up some sort of tunnel to give me an endpoint on the Internet I can connect to that gets leads inside the client&#39;s network. &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ssh&lt;/span&gt; itself is the obvious choice to set up that tunnel.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve set the tunnel up to provide access to one of the client&#39;s administrative hosts, which has serial access to about half the network equipment (including the main router). From that vantage point I should be able to fix most configuration issues that would prevent me from accessing the network through the normal transit connection, and can troubleshoot upstream transit problems as if I were standing there in the data centre.&lt;br /&gt;
&lt;br /&gt;
The modem can be put into bridge mode, but can still have an IP address to manage its configuration. The LTE network wants to use DHCP to give our server an address. So, we&#39;ll have the slightly unusual configuration of having both a static and DHCP address on the server interface that the modem is connected to. The server has other duties though, so we&#39;ll have to make sure that things like the default route and DNS configuration aren&#39;t overwritten; that requires some extra changes to the DHCP client config.&lt;br /&gt;
&lt;br /&gt;
And finally, for the tunnel to work we need a host somewhere out on the Internet that we can still reach when the &#39;home&#39; network goes down. In the rest of this post I&#39;m going to refer to our local administrative host as HOST_A and the remote host we&#39;re using for a tunnel endpoint as HOST_B. We&#39;ll need some static routes on HOST_A that send all traffic for HOST_B through the LTE network, and then we can construct the ssh tunnel which we&#39;ll use to proxy back into HOST_A.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Setting up the Modem&lt;/h3&gt;
The modem we&#39;re using is a &lt;a href=&quot;https://amzn.to/2TAbHCm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Netgear LB2120 LTE Modem&lt;/a&gt;&amp;nbsp;with an external antenna, to get around any potential interference from the cabinet itself, or the computer equipment and wiring inside. We have pretty good reception (4-5 bars) from just placing the antenna on top of the cabinet.&lt;br /&gt;
&lt;br /&gt;
The modem&#39;s LAN port is connected directly to an ethernet port on HOST_A. We could also have run that connection through a VLAN on our switches, but since the router and the server are in the same cabinet that would only serve to increase the possible ways this could fail, while providing no benefit. The main point here is that the router is going to provide its own network, so it&#39;s best not to have it on the same physical network (or VLAN) with other traffic.&lt;br /&gt;
&lt;br /&gt;
This modem is designed to be able to take over in the event of the failure of a terrestrial network, which is what the WAN port is used for. But we don&#39;t want to use that here, so that port is left empty.&lt;br /&gt;
&lt;br /&gt;
Connect to the modem&#39;s web interface (for this model, the default IP address and password are printed on the back).&lt;br /&gt;
&lt;br /&gt;
In the Settings:Mobile tab, take a look a the APN details. This probably defaults to IPv4 only, so if you want to try to get IPv6 working (more on that later) you&#39;ll have to update the PDP and PDP Roaming configuration here. In the Advanced tab, you want to put the modem into Bridge mode (which will also disable the DHCP server), and you may want to give it a different static address. The modem&#39;s default network overlaps with private address space we already use, so I&#39;m going to use 172.16.0.0/30 as an example point-to-point network to communicate with the modem. For that, you&#39;d set the modem&#39;s IP address to 172.16.0.1 and its netmask to 255.255.255.252. Once you submit the configuration changes, the modem should restart.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Setting up the Server&lt;/h3&gt;
The server needs to have a static IP address on the point-to-point network for configuring the modem as well as a DHCP address assigned by the LTE network. Because we may want to bring these up and down separately, I suggest putting the DHCP address on a virtual interface. You also need to configure a static route on the DHCP-assigned interface that points to HOST_B, so that any outbound traffic from HOST_A to HOST_B goes across the LTE network instead of using your normal Internet links. On a Debian host, &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;/etc/network/interfaces.d/LTE.conf&lt;/span&gt; might look something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;auto eth3
iface eth3 inet static
 address 172.16.0.2/30

auto eth3:0
iface eth3:0 inet dhcp
 post-up ip route add 192.0.2.1/32 dev eth3:0
 post-down ip route del 192.0.2.1/32 dev eth3:0&lt;/pre&gt;
&lt;br /&gt;
You&#39;ll also need to modify &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;/etc/dhcp/dhclient.conf&lt;/span&gt; to disable some of the changes that it normally makes to the system. The default request sent by the Debian &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;dhclient&lt;/span&gt; includes the following options:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;request subnet-mask, broadcast-address, time-offset, routers,
   domain-name, domain-name-servers, domain-search, host-name,
   dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
   netbios-name-servers, netbios-scope, interface-mtu,
   rfc3442-classless-static-routes, ntp-servers;&lt;/pre&gt;
&lt;br /&gt;
I&#39;ve modified ours to remove the &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;routers&lt;/span&gt;, &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;domain-name&lt;/span&gt;, &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;domain-name-servers&lt;/span&gt;, &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;domain-search&lt;/span&gt;, &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;dhcp6.name-servers&lt;/span&gt;, &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;dhcp6.domain-search&lt;/span&gt;, &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;dhcp6.fqdn&lt;/span&gt;, and &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;dhcp6.sntp-servers&lt;/span&gt; options. You also need to block changes to&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;/etc/resolv.conf&lt;/span&gt;. Even though you&#39;ve told&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;dhclient&lt;/span&gt;&amp;nbsp;not to request those options, the server may still supply them and&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;dhclient&lt;/span&gt;&amp;nbsp;will happily apply them unless you explicitly tell it not to.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;request subnet-mask, broadcast-address, time-offset, host-name,
    netbios-name-servers, netbios-scope, interface-mtu,
    rfc3442-classless-static-routes;

supersede domain-name &quot;example.net&quot;;
supersede domain-name-servers 198.51.100.1, 198.51.100.2;&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Setting up the Tunnel&lt;/h3&gt;
For this, you want to create an unprivileged user that doesn&#39;t have access to anything sensitive. For the purposes of this post I&#39;ll call the user &#39;workhorse&#39;. Set up the &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;workhorse&lt;/span&gt; user on both hosts; generate an SSH key without a passphrase for that user on HOST_A, and put the public half in the &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;workhorse&lt;/span&gt; user&#39;s &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;authorized_keys&lt;/span&gt; file on HOST_B.&lt;br /&gt;
&lt;br /&gt;
We&#39;re going to use &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;SSH&lt;/span&gt; to set up the tunnel, but we need something to maintain the tunnel in the event it drops for some reason. There is a handy programme called &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;a href=&quot;https://www.harding.motd.ca/autossh/&quot; target=&quot;_blank&quot;&gt;autossh&lt;/a&gt;&lt;/span&gt; which does the job well. In addition to setting up the tunnel we need for access to HOST_A, it will also set up an additional tunnel that it uses to echo data back and forth between HOST_A and HOST_B to monitor its own connectivity, and restart the tunnel if necessary. We can combine that monitor with &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;SSH&lt;/span&gt;&#39;s own &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ServerAliveInterval&lt;/span&gt; and &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ServerAliveCountMax&lt;/span&gt; settings to be pretty sure that the tunnel will be up unless there&#39;s a serious problem with the LTE network or modem.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve chosen to run &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;autossh&lt;/span&gt; from &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;cron&lt;/span&gt; on every reboot, so I created an &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;/etc/cron.d/ssh-tunnel&lt;/span&gt; file on HOST_A that looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;@reboot workhorse autossh -f -M 20000 -qN4 -o &quot;ServerAliveInterval 60&quot; -o &quot;ServerAliveCountMax 3&quot; -R &#39;*:20022:localhost:22&#39; HOST_B&lt;/pre&gt;
&lt;br /&gt;
The &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;-f&lt;/span&gt; option backgrounds &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;autossh&lt;/span&gt;.&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;-M 20000&lt;/span&gt; sets up a listening port at HOST_B:20000 which sends data back to HOST_A:20001 for &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;autossh&lt;/span&gt; to use to monitor the connection. You can explicitly specify the HOST_A port as well, if you prefer. The remaining options are standard &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ssh&lt;/span&gt; options which &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;autossh&lt;/span&gt; passes on. Note that in my case HOST_B has an IPv6 address, but I haven&#39;t configured the tunnel interface for IPv6, so I&#39;m forcing &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ssh&lt;/span&gt; to use IPv4.&lt;br /&gt;
&lt;br /&gt;
You may need to modify the &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;sshd_config&lt;/span&gt; on HOST_B to set&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;GatewayPorts yes&lt;/span&gt;, depending on the default configuration. Otherwise you won&#39;t get a remotely accessible port on HOST_B.&lt;br /&gt;
&lt;br /&gt;
Instead of using &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;cron&lt;/span&gt;, you could also use something like &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;a href=&quot;http://supervisord.org/&quot; target=&quot;_blank&quot;&gt;supervisord&lt;/a&gt;&lt;/span&gt;&amp;nbsp;or&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;systemd&lt;/span&gt; to start (and re-start if necessary) the &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;autossh&lt;/span&gt; process.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Using the Setup&lt;/h3&gt;
&lt;div&gt;
Once this is all put together, you should be able to ssh to port 20022 on HOST_B, and wind up with a shell on HOST_A.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;matt@chani.conundrum.com:~
16:05:58 (3130) % ssh -p 20022 HOST_B
The authenticity of host &#39;[HOST_B]:20022 ([192.0.2.1]:20022)&#39; can&#39;t be established.
ECDSA key fingerprint is SHA256:4v+NbLg2QYqe43WFR9QKXaVwCpcc71u5jJmxJdZVITQ.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added &#39;[HOST_B]:20022,[192.0.2.1]:20022&#39; (ECDSA) to the list of known hosts.
Linux HOST_A 4.9.0-6-amd64 x86_64 GNU/Linux

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Mar 13 18:02:09 2019 from 216.235.10.40

matt@HOST_A:~
20:05:59 (618) %&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Why no IPv6?&lt;/h3&gt;
&lt;div&gt;
T-Mobile support IPv6 on their LTE networks, so I have the APN for our modem set to IPV4V6 PDP. The server configuration has been a problem, however.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As with IPv4, we don&#39;t want to get a default route for our LTE network because that would interfere with the normal traffic of the server. It seems like disabling the acceptance of &lt;a href=&quot;https://en.wikipedia.org/wiki/Neighbor_Discovery_Protocol&quot; target=&quot;_blank&quot;&gt;Router Advertisement&lt;/a&gt; (RA) messages should be all that&#39;s necessary, but for some reason that entirely disables &lt;a href=&quot;https://en.wikipedia.org/wiki/IPv6#Stateless_address_autoconfig&quot; target=&quot;_blank&quot;&gt;SLAAC address assignment&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;% cat /etc/network/interfaces.d/LTE.conf

auto eth3
iface eth3 inet static
 address 172.16.0.2/30

auto eth3:0
iface eth3:0 inet dhcp
 post-up ip route add 192.0.2.1/32 dev eth3:0
 post-down ip route del 192.0.2.1/32 dev eth3:0

iface eth3:0 inet6 auto
 pre-up /sbin/sysctl -w net.ipv6.conf.eth3.accept_ra=0
 post-up ip route add 2001:db8::1//128 dev eth3:0
 post-down ip route del 2001:db8::1/128 dev eth3:0&lt;/pre&gt;
&lt;br /&gt;
I have also tried using DHCPv6 (&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;iface eth3:0 inet6 dhcp&lt;/span&gt;, above) but that also fails to get the configuration I want, and also causes &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ifup&lt;/span&gt; to return a fail condition when configuring the interface. At least the above SLAAC problem has the feature of failing silently, so I can leave the configuration in place without causing problems with interface management.&lt;br /&gt;
&lt;br /&gt;
Perhaps you can find the right combination of options to make it work!&amp;nbsp; I invite you to follow up, if you do.&lt;br /&gt;
&lt;br /&gt;
Good luck!</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/2617822781465470852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2019/03/lte-out-of-band.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/2617822781465470852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/2617822781465470852'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2019/03/lte-out-of-band.html' title='Using LTE for Out of Band'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-8487120969692776526</id><published>2017-07-10T17:39:00.000-04:00</published><updated>2019-03-13T17:41:46.160-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DNS"/><category scheme="http://www.blogger.com/atom/ns#" term="DNS poisoning"/><category scheme="http://www.blogger.com/atom/ns#" term="DNS security"/><category scheme="http://www.blogger.com/atom/ns#" term="Hacker News"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="internet security"/><category scheme="http://www.blogger.com/atom/ns#" term="The Hacker Blog"/><title type='text'>The .io Error: A Problem With Bad Optics, But Little Substance</title><content type='html'>EDIT:&amp;nbsp; There are several comments on this post (and sent to me privately) which correctly note that I&#39;ve overlooked an important variation in the behaviour of recursive servers, that would affect the ability of this hijack to succeed.&amp;nbsp; I&#39;m leaving the post up as-is because I think it demonstrates just how complicated the DNS is, and just how easy it is for anyone (even someone who knows it inside and out) to miss something important.&lt;br /&gt;
&lt;br /&gt;
Original article below the jump...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
It&#39;s been a while since I&#39;ve posted anything here. Being busy with work and various other projects, nothing has quite risen to the level of &lt;i&gt;gotta write about it&lt;/i&gt; to get me writing, until now.&lt;br /&gt;
&lt;br /&gt;
This morning, someone at work drew my attention to &lt;a href=&quot;https://thehackerblog.com/the-io-error-taking-control-of-all-io-domains-with-a-targeted-registration/&quot; target=&quot;_blank&quot;&gt;a post on The Hacker Blog&lt;/a&gt; that they thought warranted some attention. For those who haven&#39;t seen it, it purports to describe how the author managed to almost hijack most of the DNS traffic for the .io Top Level Domain. The post has started to receive a bit of &lt;a href=&quot;https://news.ycombinator.com/item?id=14737322&quot; target=&quot;_blank&quot;&gt;attention&lt;/a&gt; &lt;a href=&quot;https://twitter.com/eastdakota/status/884492932329349121&quot; target=&quot;_blank&quot;&gt;elsewhere&lt;/a&gt;, and while it describes a definite mistake on the part of the Backend Registry Operator for the .io TLD, it definitely does not constitute the catastrophe implied by the article.&lt;br /&gt;
&lt;br /&gt;
The problem with the article stems from the author&#39;s misunderstanding of how delegations in DNS actually work, and the part that the behaviour of both recursive and authoritative name servers has to play in the described &quot;hijack.&quot; The author assumes that because he&#39;s able to register a domain name that matches several of the authoritative name server names for the .io TLD that it is &quot;likely that clients will randomly select our hijacked nameservers over any of the legitimate nameservers...&quot; This is wrong.&lt;br /&gt;
&lt;br /&gt;
The author demonstrates his &quot;hijack&quot; by pasting these results to a DNS query:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.8.3-P1 &amp;lt;&amp;lt;&amp;gt;&amp;gt; NS ns-a1.io
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 8052
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;ns-a1.io.          IN  NS

;; ANSWER SECTION:
ns-a1.io.       86399   IN  NS  ns2.networkobservatory.com.
ns-a1.io.       86399   IN  NS  ns1.networkobservatory.com.

;; Query time: 4 msec
;; SERVER: 2604:5500:16:32f9:6238:e0ff:feb2:e7f8#53(2604:5500:16:32f9:6238:e0ff:feb2:e7f8)
;; WHEN: Wed Jul  5 08:46:44 2017
;; MSG SIZE  rcvd: 84

&lt;/pre&gt;
In order to poison a DNS server, you must understand the normal queries that would typically be sent by that server and be in a position to answer one of them with a crafted response, or be in a position to trigger specific abnormal queries that will elicit your poisoning response. The problem with the example query is that it would never be sent by a typical client, without some sort of abnormal prompting. &lt;br /&gt;
&lt;br /&gt;
Since the author doesn&#39;t claim any ability to trigger unusual queries in arbitrary recursive servers, in order to evaluate the attack we should look at typical queries that would be sent by a recursive name server trying to look up an .io domain. To see what would actually happen in his attack, let&#39;s see what would happen if someone were to look up the A record for &#39;bit.io&#39; (the first .io domain that popped into my head). We&#39;ll assume an empty cache in order to give the attacker the greatest advantage, but skip the &lt;a href=&quot;https://tools.ietf.org/html/rfc8109&quot; target=&quot;_blank&quot;&gt;root priming query&lt;/a&gt; for simplicity, and because it wouldn&#39;t be relevant here.&lt;br /&gt;
&lt;br /&gt;
The first query that will be sent is to the root. Because recursive servers are normally trying to get the most work done with the least effort, they always send the query for the information they&#39;re actually interested in, and deal with whatever response they get (an exception to this is a new option in the lookup algorithm called &lt;a href=&quot;https://tools.ietf.org/html/rfc7816&quot; target=&quot;_blank&quot;&gt;Query Minimisation&lt;/a&gt;, but it would have no effect on this). Therefore, the server does not ask the root for the .io name servers; instead, it asks for the A record for bit.io.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.11.1-P1 &amp;lt;&amp;lt;&amp;gt;&amp;gt; @a.root-servers.net +norec IN A bit.io.
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 21410
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 7, ADDITIONAL: 13

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;bit.io.    IN A

;; AUTHORITY SECTION:
io.   172800 IN NS a0.nic.io.
io.   172800 IN NS b0.nic.io.
io.   172800 IN NS c0.nic.io.
io.   172800 IN NS ns-a1.io.
io.   172800 IN NS ns-a2.io.
io.   172800 IN NS ns-a3.io.
io.   172800 IN NS ns-a4.io.

;; ADDITIONAL SECTION:
a0.nic.io.  172800 IN A 65.22.160.17
b0.nic.io.  172800 IN A 65.22.161.17
c0.nic.io.  172800 IN A 65.22.162.17
ns-a1.io.  172800 IN A 194.0.1.1
ns-a2.io.  172800 IN A 194.0.2.1
ns-a3.io.  172800 IN A 74.116.178.1
ns-a4.io.  172800 IN A 74.116.179.1
a0.nic.io.  172800 IN AAAA 2a01:8840:9e::17
b0.nic.io.  172800 IN AAAA 2a01:8840:9f::17
c0.nic.io.  172800 IN AAAA 2a01:8840:a0::17
ns-a1.io.  172800 IN AAAA 2001:678:4::1
ns-a2.io.  172800 IN AAAA 2001:678:5::1

;; Query time: 23 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Mon Jul 10 16:06:40 EDT 2017
;; MSG SIZE  rcvd: 422
&lt;/pre&gt;
&lt;br /&gt;
The root servers respond with a delegation to the .io name servers. So far this meets with the attacker&#39;s requirements.&lt;br /&gt;
&lt;br /&gt;
For the second query, the client will select one of the .io name servers in the previous response, and send it the same query.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.11.1-P1 &amp;lt;&amp;lt;&amp;gt;&amp;gt; @a0.nic.io. +norec IN A bit.io.
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 15355
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 3, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;bit.io.    IN A

;; AUTHORITY SECTION:
bit.io.   86400 IN NS ns1.dreamhost.com.
bit.io.   86400 IN NS ns3.dreamhost.com.
bit.io.   86400 IN NS ns2.dreamhost.com.

;; Query time: 25 msec
;; SERVER: 65.22.160.17#53(65.22.160.17)
;; WHEN: Mon Jul 10 16:08:47 EDT 2017
;; MSG SIZE  rcvd: 102
&lt;/pre&gt;
&lt;br /&gt;
The name server responds with the list of name servers for the bit.io domain. Note the very important difference between this and the example given in the original article. The list of .io name servers are nowhere to be seen. The client will go on and ask one of the Dreamhost name servers the same question:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.11.1-P1 &amp;lt;&amp;lt;&amp;gt;&amp;gt; @ns1.dreamhost.com. +norec IN A bit.io.
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23214
;; flags: qr aa; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 2800
;; QUESTION SECTION:
;bit.io.    IN A

;; AUTHORITY SECTION:
bit.io.   14400 IN SOA ns1.dreamhost.com. hostmaster.dreamhost.com. 2014052400 18794 1800 1814400 14400

;; Query time: 62 msec
;; SERVER: 64.90.62.230#53(64.90.62.230)
;; WHEN: Mon Jul 10 16:11:12 EDT 2017
;; MSG SIZE  rcvd: 99
&lt;/pre&gt;
&lt;br /&gt;
It turns out there is no A record for bit.io, so the client is going to be disappointed. More importantly, it will not be poisoned with the attacker&#39;s NS set. The only set of name servers in this query chain to give the list of .io name servers was the root, and the contents of the root zone are unaffected by what you can convince your Registrar to pass up to your Registry, or your Registry to put in their zone.&lt;br /&gt;
&lt;br /&gt;
The key element here is that the name servers for the .io TLD don&#39;t respond with their own NS set in their response. The only way you&#39;re likely to get that response out of those servers is to specifically ask, and that&#39;s a query rarely performed by your typical recursive DNS server. Even then, the author&#39;s attack doesn&#39;t work.&lt;br /&gt;
&lt;br /&gt;
Let&#39;s use a concrete example. Here&#39;s a nearly-empty zone I just created for the TLD &quot;myTLD&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;$TTL 3600
@               IN  SOA ns1.localhost.myTLD. hostmaster.localhost.myTLD. (
                        2017071000  ; serial
                        12h         ; refresh
                        15m         ; retry
                        2w          ; expiry
                        1h )        ; negative TTL

                IN  NS  ns1.localhost.myTLD.
                IN  NS  ns2.localhost.myTLD.
                IN  NS  ns3.localhost.myTLD.

ns1.localhost   IN  A   127.0.0.1
ns2.localhost   IN  A   127.0.0.2
ns3.localhost   IN  A   127.0.0.3

example         IN  NS  ns1.example.myTLD.
example         IN  NS  ns2.example.myTLD.
ns1.example     IN  A   192.0.2.1
ns2.example     IN  A   192.0.2.2&lt;/pre&gt;
&lt;br /&gt;
The zone contains only those things necessary to make it a valid zone, plus one delegation for example.myTLD. The Hacker Blog author&#39;s attack was to add a delegation for one of the name servers. Here&#39;s what that would look like in the above zone:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;ns1.localhost   IN  NS  ns1.attacker.example.com.
ns1.localhost   IN  NS  ns2.attacker.example.com.
&lt;/pre&gt;
&lt;br /&gt;
Note that this creates a conflict in the zone. There is both a delegation and an A record for ns1.localhost.myTLD. In all authoritative DNS servers this converts that A record from an authoritative record in the zone to an &quot;&lt;a href=&quot;https://tools.ietf.org/html/draft-hoffman-dns-terminology-02#page-9&quot; target=&quot;_blank&quot;&gt;occluded name&lt;/a&gt;.&quot; In simple terms, the A record is hidden by the presence of a delegation at the same point in the tree.&lt;br /&gt;
&lt;br /&gt;
Querying this zone for the A record for www.example.myTLD has the same results as for bit.io in the above tests, but what happens if we query this TLD name server for its own NS set?&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.11.1-P1 &amp;lt;&amp;lt;&amp;gt;&amp;gt; -p 5053 @localhost +norec IN NS myTLD.
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 5117
;; flags: qr aa; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 17c0de220c7de23977eeeabd5963eb3576021df81bbff58f (good)
;; QUESTION SECTION:
;myTLD.    IN NS

;; ANSWER SECTION:
myTLD.   3600 IN NS ns1.localhost.myTLD.
myTLD.   3600 IN NS ns2.localhost.myTLD.
myTLD.   3600 IN NS ns3.localhost.myTLD.

;; ADDITIONAL SECTION:
ns2.localhost.myTLD. 3600 IN A 127.0.0.2
ns3.localhost.myTLD. 3600 IN A 127.0.0.3

;; Query time: 0 msec
;; SERVER: 127.0.0.1#5053(127.0.0.1)
;; WHEN: Mon Jul 10 17:01:41 EDT 2017
;; MSG SIZE  rcvd: 158
&lt;/pre&gt;
&lt;br /&gt;
The occluded A record is not returned in the result, but neither is anything from the attacker&#39;s delegation. To get that, you have to ask specifically for that domain name:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.11.1-P1 &amp;lt;&amp;lt;&amp;gt;&amp;gt; -p 5053 @localhost +norec IN A ns1.localhost.myTLD.
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 15774
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 2dcb47dea6b96a9c075f84a15963ebcf3878b68057c0ef7c (good)
;; QUESTION SECTION:
;ns1.localhost.myTLD.  IN A

;; AUTHORITY SECTION:
ns1.localhost.myTLD. 3600 IN NS ns2.attacker.example.com.
ns1.localhost.myTLD. 3600 IN NS ns1.attacker.example.com.

;; Query time: 0 msec
;; SERVER: 127.0.0.1#5053(127.0.0.1)
;; WHEN: Mon Jul 10 17:04:15 EDT 2017
;; MSG SIZE  rcvd: 132
&lt;/pre&gt;
&lt;br /&gt;
And again, this is not a query that is normally going to be sent by any recursive name server trying to look up &#39;www.example.myTLD.&#39; That client just wouldn&#39;t care. What the author succeeds in doing is to add a delegation to the .io zone. What he needs to do, to redirect any traffic at all, is to get an &lt;i&gt;address&lt;/i&gt; into the .io zone. This is not going to happen with the method he&#39;s used.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In theory, getting an address for one of the TLDs nameservers into the TLD zone might be possible if he can register a host record with his registrar, but success assumes several things:&lt;/div&gt;
&lt;div&gt;

&lt;dl&gt;
&lt;dt&gt;That the .io TLD uses host records at all:&lt;/dt&gt;
&lt;dd&gt;Unbound by the same restrictions as the gTLDs, some ccTLDs don&#39;t bother with all of the bells and whistles of the EPP standards. I don&#39;t know about .io specifically, but there are some ccTLDs that do not allow the registration of host records.&lt;/dd&gt;
&lt;dt&gt;That the same restrictions are absent for host records as were for delegations:&lt;/dt&gt;
&lt;dd&gt;Assuming the Registry for .io uses host records, they may have a different set of criteria for allowing or disallowing the registration of host records than they do delegations. For example, it&#39;s unlikely you can register a host record that is not a subdomain of a domain you already have the delegation for, and it&#39;s not unreasonable to expect that the registry might require the host record to actually be a subdomain, and not be equal to the domain name.&lt;/dd&gt;
&lt;dt&gt;That the registry doesn&#39;t have safeguards in its publishing that prevent duplicate records for its name server set:&lt;/dt&gt;
&lt;dd&gt;Depending on how the Registry publishes its zone, it&#39;s possible (even likely) that the minimal set of records (the SOA, the apex NS set, and glue for the apex NS set) are handled differently during zone generation than delegations and their glue.  The former is likely a static set, and the latter would typically come out of a database.  Most Registries have safeguards in place to check the validity of a newly generated zone, and would be wise to include checks of the former &quot;minimal set&quot; in those tests.&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/8487120969692776526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2017/07/the-io-error-problem-with-bad-optics.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/8487120969692776526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/8487120969692776526'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2017/07/the-io-error-problem-with-bad-optics.html' title='The .io Error: A Problem With Bad Optics, But Little Substance'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-1739489596623203259</id><published>2016-02-27T19:49:00.000-05:00</published><updated>2016-02-27T19:49:29.005-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FreeNAS"/><category scheme="http://www.blogger.com/atom/ns#" term="how to"/><category scheme="http://www.blogger.com/atom/ns#" term="systems administration"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>Installing FreeNAS 9.3 Over the Network</title><content type='html'>As users of new Skylake (LGA1151) systems are discovering, Intel has completely removed &lt;a href=&quot;https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire)&quot; target=&quot;_blank&quot;&gt;EHCI&lt;/a&gt; support from the new architecture. XHCI (USB 3.0) is supposed to be completely backwards compatible to USB 2.0, but the lack of EHCI support has some less than pleasant effects on trying to &lt;i&gt;boot&lt;/i&gt; from USB using any OS that is expecting USB 2.0 support. Specifically, this means that GRUB 2 cannot currently boot an OS on XHCI-only systems, which makes installing FreeNAS &lt;a href=&quot;https://bugs.freenas.org/issues/12400&quot; target=&quot;_blank&quot;&gt;a bit of a pain&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
The symptom of this problem is that on XHCI systems the boot process will proceed up to the point where it tries to mount the root filesystem, and then it will die with an &quot;error 19&quot;.&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;Trying to mount root from cd9660:/dev/iso9660/FreeNAS_INSTALL []...
mountroot: waiting for device /dev/iso9660/FreeNAS_INSTALL ...
Mounting from cd9660:/dev/iso9660/FreeNAS_INSTALL failed with error 19.
&lt;/pre&gt;
&lt;br /&gt;
This is actually a problem that affects all XHCI systems, but if your system supports both EHCI and XHCI, you can disable XHCI in the BIOS to make USB booting work. Skylake systems, however, have no EHCI support at all, not even on the USB 2.0 motherboard headers, so this workaround isn&#39;t available.&lt;br /&gt;
&lt;br /&gt;
Some people have found success with PCI cards that add EHCI USB ports, but you have to use caution with this approach since many (most?) PCI USB cards don&#39;t provide &lt;i&gt;bootable&lt;/i&gt; USB ports. I didn&#39;t want to have to go pick up extra hardware just to install the OS, so I&#39;ve opted for another approach: load the installer over the network via &lt;a href=&quot;https://en.wikipedia.org/wiki/Preboot_Execution_Environment&quot; target=&quot;_blank&quot;&gt;PXE&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The FreeNAS developers use PXE booting when testing new builds, and there is a guide for &lt;a href=&quot;https://forums.freenas.org/index.php?threads/guide-pxe-how-to-install-freenas-9-2-0-over-the-network.17714/&quot; target=&quot;_blank&quot;&gt;doing this with FreeNAS 9.2&lt;/a&gt;. However, the guide is two years old and I found it to be missing several steps when trying to apply it to a current version of FreeNAS. It&#39;s even worse when trying to use current versions of the FreeNAS developers&#39; tools, as they&#39;re completely missing large sections of setup instruction (they&#39;re clearly not intended for use outside the project).&lt;br /&gt;
&lt;br /&gt;
So, I&#39;m publishing an update to the guide here. Eventually this will be out of date too, but hopefully it will save someone time down the road.&lt;br /&gt;
&lt;br /&gt;
If you want to follow this guide you will need:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;a FreeBSD server which will be your PXE and DHCP server&lt;/li&gt;
&lt;li&gt;a machine you want to install FreeNAS on (presumably you already have this, since you&#39;re reading this guide)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
Set up the BIOS&lt;/h3&gt;
You&#39;ll want to modify your system BIOS boot order on the NAS host to make sure that PXE (or Network) boot is enabled, and will be attempted before any other valid boot option (e.g. if there&#39;s an OS on any disk in your system, that disk should be ordered after the PXE boot).  Exactly how you do this is going to be specific to your BIOS.
&lt;br /&gt;
&lt;h3&gt;
Setting up the DHCP Server&lt;/h3&gt;
Install the isc-dhcp43-server package, and use a config file that looks mostly like the following. &amp;nbsp;Update it for the subnet you use on your network: &amp;nbsp;&quot;next-server&quot; should be the IP address of your PXE server.&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;subnet 192.168.57.0 netmask 255.255.255.0 {
    range 192.168.57.100 192.168.57.200;
    option subnet-mask 255.255.255.0;
    option routers 192.168.57.1;
    option broadcast-address 192.168.67.255;
    option domain-name-servers 192.168.57.1;
    option domain-name &quot;mydomain.com&quot;;

    next-server 192.168.57.10;
    filename &quot;boot/pxeboot&quot;;
    option root-path &quot;/tftpboot/installer/&quot;;
}&lt;/pre&gt;
&lt;h3&gt;
Prepare the Installer&lt;/h3&gt;
You need a copy of the FreeNAS installer ISO coped out onto the PXE server&#39;s filesystem.  The following pair of commands will get the current version I&#39;m using:
&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;mkdir -p /tftpboot/installer
fetch -o - http://download.freenas.org/9.3.1/latest/x64/FreeNAS-9.3-STABLE-201602031011.iso | bsdtar -x -f - -C /tftpboot/installer/
&lt;/pre&gt;
&lt;h3&gt;
Set up NFS&lt;/h3&gt;
First, permit the installer you just set up to be exported, and start up NFS.
&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;echo &#39;/tftpboot -ro -alldirs&#39; &amp;gt;&amp;gt; /etc/exports
echo &#39;nfs_server_enable=&quot;YES&quot;&#39; &amp;gt;&amp;gt; /etc/rc.conf
service nfsd start
&lt;/pre&gt;
Next, instruct the installer to mount its root filesystem from the NFS export you just setup.  Be sure to set the hostname of your pxeserver (or its IP address) correctly in the fstab entry.
&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;mkdir /tftpboot/installer/etc
echo &#39;pxeserver:/tftpboot/installer   /   nfs   ro   0 0&#39; &amp;gt;&amp;gt; /tftpboot/installer/etc/fstab&lt;/pre&gt;
&lt;h3&gt;
Setting up TFTP&lt;/h3&gt;
Modify the tftp lines in /etc/inetd.conf to look like the following:
&lt;br /&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;tftp  dgram  udp   wait  root  /usr/libexec/tftpd  tftpd -l -s /tftpboot/installer
tftp  dgram  udp6  wait  root  /usr/libexec/tftpd  tftpd -l -s /tftpboot/installer
&lt;/pre&gt;
Finally, enable inetd and test your tftp server:
&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;echo &#39;inetd_enable=&quot;YES&quot;&#39; &amp;gt;&amp;gt; /etc/rc.conf
service inetd start
tftp localhost
tftp&amp;gt; get boot/pxeboot
Received 231424 bytes during 0.0 seconds in 454 blocks
&lt;/pre&gt;
&lt;h3&gt;
Boot!&lt;/h3&gt;
That&#39;s it.  You should now be able to boot the installer over the network, and install FreeNAS on a disk installed in your NAS server. &amp;nbsp;Don&#39;t forget to consult the &lt;a href=&quot;https://www.freebsd.org/doc/handbook/&quot; target=&quot;_blank&quot;&gt;FreeBSD handbook&lt;/a&gt; section on &lt;a href=&quot;https://www.freebsd.org/doc/handbook/network-diskless.html&quot; target=&quot;_blank&quot;&gt;diskless booting&lt;/a&gt; if you need help troubleshooting anything. &amp;nbsp;After installing, you may need to alter the boot order again to ensure that your freshly installed OS is booted before PXE.&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/1739489596623203259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2016/02/installing-freenas-over-network.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/1739489596623203259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/1739489596623203259'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2016/02/installing-freenas-over-network.html' title='Installing FreeNAS 9.3 Over the Network'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-2511588636194880473</id><published>2013-10-11T22:04:00.000-04:00</published><updated>2013-10-11T22:04:13.648-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="business"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="interview"/><category scheme="http://www.blogger.com/atom/ns#" term="Ladar Levison"/><category scheme="http://www.blogger.com/atom/ns#" term="Lavabit"/><category scheme="http://www.blogger.com/atom/ns#" term="news"/><category scheme="http://www.blogger.com/atom/ns#" term="politics"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><title type='text'>Society&#39;s Bullies Hide Behind Secrecy</title><content type='html'>This week I had the privilege of being present at a discussion with Ladar Levison at a meeting of the North American Network Operators&#39; Group (&lt;a href=&quot;https://www.nanog.org/&quot; target=&quot;_blank&quot;&gt;NANOG&lt;/a&gt;), his first public appearance since the court documents related to his fight with the FBI were made public.&lt;br /&gt;
&lt;br /&gt;
For those not familiar with the case, Levison is the owner of Lavabit, a web-based email service designed to be secure against eavesdropping, even by himself. On August 8th this year he suddenly closed the service, posting an &lt;a href=&quot;http://bit.ly/17vM9le&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;oblique message&lt;/a&gt; on the front page of the &lt;a href=&quot;http://lavabit.com/&quot; target=&quot;_blank&quot;&gt;Lavabit website&lt;/a&gt;. The message explained only that he had closed the service because he had been left with a choice to &quot;become complicit in crimes against the American people or walk away from nearly ten years of hard work by shutting down Lavabit.&quot;&lt;br /&gt;
&lt;br /&gt;
There has been much speculation over the last couple of months that he had closed the service over a subpoena related to Edward Snowden&#39;s use of the service, and that an attached gag order similar to a National Security Letter (which were found to be unconstitutional in 2004) prevented him from speaking out about it.&lt;br /&gt;
&lt;br /&gt;
Much of that speculation was confirmed last week when the courts unsealed the documents relating to Levison&#39;s appeal of a July 16th court order, which required him to turn over cryptographic keys that would allow the FBI to spy on all of the service&#39;s traffic, not just the information specific to Snowden&#39;s use of the service, which was specified in the original warrant. Wired Magazine &lt;a href=&quot;http://bit.ly/GMifDU&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;published an article&lt;/a&gt; last week with most of the known details of the case, so I won&#39;t go into much more detail about that.
&lt;br /&gt;
&lt;br /&gt;
What I&#39;d like to highlight is the danger to information security, consumer confidence, and the technological economy as a whole, should Levison lose his fight with the FBI. &amp;nbsp;The keys being requested by the FBI would allow them access not only to all of the information related to the individual targeted by their warrant, but also every other customer&#39;s data, and the data of the business itself. &amp;nbsp; This is highly reminiscent of recent revelations regarding the NSA and the scope of their data collection. &amp;nbsp;If that sort of wide net is supported by the courts, the fight for any kind of personal privacy will be lost, and consumers will never be able to trust any company with ties to the United States with any data at all.&lt;br /&gt;
&lt;br /&gt;
This isn&#39;t just a problem in the United States. &amp;nbsp;Many of our online services eventually have dependencies on US companies. &amp;nbsp;In Canada, a huge percentage of our network traffic crosses into the US in order to cross the continent rather than remaining in Canada when moving between cities. &amp;nbsp;In other countries consumers rely on some of the more obvious US-based services (Facebook, Twitter, Google) but also many other services have less obvious dependencies, such as with services hosted by US-based data centres or on so-called &quot;cloud&quot; services with ties to the US.&lt;br /&gt;
&lt;br /&gt;
As Andrew Sullivan comments during the Q&amp;amp;A, overreaching orders such as these are an attack on the network, as surely as any criminal trying to break a network&#39;s security. &amp;nbsp;Our personal privacy and the security technologies that guarantee it face attacks by those who want easy access to everyone&#39;s information, under the pretence of protecting the very people whose privacy is being violated. &amp;nbsp;It is vitally important that other business owners, like Levison, step up and fight orders such as these, so that a real public debate can happen over whether we still feel personal privacy and personal freedoms still trump the government&#39;s desire to have it easy. &lt;br /&gt;
&lt;br /&gt;
At this point it is impossible to know whether any similar services have been compromised in the way the FBI has attempted with Lavabit. &amp;nbsp;I applaud the principled stance Levison is taking against this intrusion, and hope that, should I ever be in a similar position, I would have the strength to endure the long fight necessary to see it through.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;309&quot; src=&quot;//www.youtube.com/embed/uo9-0So2A_g&quot; width=&quot;550&quot;&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/2511588636194880473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2013/10/societys-bullies-hide-behind-secrecy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/2511588636194880473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/2511588636194880473'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2013/10/societys-bullies-hide-behind-secrecy.html' title='Society&#39;s Bullies Hide Behind Secrecy'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><thr:total>0</thr:total><georss:featurename>Chandler, AZ, USA</georss:featurename><georss:point>33.3061605 -111.84125019999999</georss:point><georss:box>33.093774499999995 -112.16397369999999 33.5185465 -111.5185267</georss:box></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-2667040025087083603</id><published>2013-07-03T01:21:00.000-04:00</published><updated>2013-07-03T01:49:25.908-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cocos2d"/><category scheme="http://www.blogger.com/atom/ns#" term="Gaming"/><category scheme="http://www.blogger.com/atom/ns#" term="how to"/><category scheme="http://www.blogger.com/atom/ns#" term="Kobold2D"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Xcode"/><title type='text'>Using Subversion With the Kobold2D Game Engine and Xcode</title><content type='html'>I&#39;ve been messing about with some basic MacOS and iOS game development lately, and at the moment I&#39;m working with the &lt;a href=&quot;http://www.kobold2d.com/&quot;&gt;Kobold2D&lt;/a&gt; game engine, which is (mostly) a refinement of &lt;a href=&quot;http://www.cocos2d-iphone.org/&quot;&gt;cocos2d&lt;/a&gt;. &amp;nbsp;I&#39;ve found however that in Kobold&#39;s quest to make initial setup of a project easier, it sidesteps some of the normal setup that Xcode does when you add a project or file. &amp;nbsp;Some of this, such as Project Summary info like the Application Category and Bundle Identifier is easily fixed after the fact. &amp;nbsp;Version control setup, on the other hand, is marginally more complicated than normal (at least with &lt;a href=&quot;http://subversion.apache.org/&quot;&gt;Subversion&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
With a bit of trial and error I think I&#39;ve got a working procedure to get a new Kobold project to play nicely with Subversion. &amp;nbsp;Here are my assumptions for these instructions; the more you deviate from these the less this will be relevant, and I&#39;ll leave variations as an exercise for the reader:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;You&#39;re running Xcode 4.6 (I&#39;m testing with 4.6.3)&lt;/li&gt;
&lt;li&gt;You&#39;ve got Kobold2D 2.1.0&lt;/li&gt;
&lt;li&gt;You already have a repository set up and waiting at version 0 (zero)&lt;/li&gt;
&lt;li&gt;We&#39;re creating a pong clone called &amp;nbsp;-- oddly enough -- &quot;pong&quot;&lt;/li&gt;
&lt;/ol&gt;
Any text here in &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;fixed width&lt;/span&gt; is intended to be cut and pasted directly into your Terminal if you desire. &amp;nbsp;However, I won&#39;t be held responsible if anything goes awry... I&#39;m trusting that you&#39;re using your head and paying attention before you run any of these commands.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;h4&gt;
Create a Kobold2D Project&lt;/h4&gt;
&lt;div&gt;
Run the Kobold2d Project Starter app. &amp;nbsp;Select the appropriate template (I&#39;m going with Physics-Box2D) and set the project name to &#39;pong&#39;. &amp;nbsp;You can also set your own Workspace name here if you want. &amp;nbsp;Make sure you uncheck &quot;Auto-Open Workspace&quot; because we don&#39;t want to have that open quite yet. &amp;nbsp;Click on the &quot;Create Project from Template&quot; button.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
Import the Project into Subversion&lt;/h4&gt;
&lt;div&gt;
In Terminal, set ~/Kobold2D/Kobold2D-2.1.0 as your current directory&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;cd ~/Kobold2D/Kobold2D-2.1.0&lt;/span&gt;&lt;/blockquote&gt;
Make a new directory structure with the usual &#39;trunk&#39;, &#39;branches&#39;, &#39;tags&#39; directory structure in it&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;mkdir -p pong-import/{trunk,branches,tags}&lt;/span&gt;&lt;/blockquote&gt;
&amp;nbsp;Move your new &#39;pong&#39; project into the new trunk directory&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;mv pong pong-import/trunk/&lt;/span&gt;&lt;/blockquote&gt;
Change directory into pong-import and import the project and directory structure into your repository&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;cd pong-import;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;svn import . https://svn.mydomain.com/pong/ -m &quot;Initial import&quot;&lt;/span&gt;&lt;/blockquote&gt;
Now delete this directory structure&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;cd ..;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;rm -Rf pong-import&lt;/span&gt;&lt;/blockquote&gt;
That&#39;s it for the Terminal.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Add The Repository to Xcode&lt;/h4&gt;
&lt;div&gt;
This is the only step that&#39;s exactly as it would usually be. &amp;nbsp;Go to the Xcode Organizer (menu Window -&amp;gt; Organizer) and select the Repositories tab. &amp;nbsp; Click on the + in the bottom left corner of the window and select Add Repository. &amp;nbsp; Follow the prompts to name the repository, give it the URI to the repository, add your authentication credentials, etc.. &amp;nbsp;For the purposes of the example, let&#39;s say the URI for your repository is &quot;https://svn.mydomain.com/pong/&quot;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;h4&gt;
Check Out a Working Copy&lt;/h4&gt;
&lt;div&gt;
While still in the Xcode Organizer Repositories tab, click on the expander arrow to the left of your &#39;pong&#39; repository. &amp;nbsp;It should show four folders: &amp;nbsp;&#39;Root&#39; in purple, and your &#39;Trunk&#39;, &#39;Branches&#39; and &#39;Tags&#39; directories in yellow. &amp;nbsp;Select &#39;Root&#39; and then click on &quot;Checkout&quot; in the button bar across the bottom of the Organizer.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This will open a standard Save dialogue. &amp;nbsp;Browse your way to ~/Kobold2D/Kobold2D-2.1.0/, type &#39;pong&#39; into the Save As field, and click on Checkout.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
Clean Up Your Workspace&lt;/h4&gt;
&lt;div&gt;
Return to your Kobold-2.1.0 folder in the Finder. &amp;nbsp;Open the &quot;Kobold2D.xcworkspace&quot; workspace, or your custom workspace if you created one.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You&#39;ll see your pong project listed, but it&#39;ll be in red. &amp;nbsp;That&#39;s because the files aren&#39;t where the automatically-created workspace expects to find them. &amp;nbsp; Right click on that and select Delete.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Then, right-click again and select Add Files to &quot;Kobold2D&quot; (or whatever the name of your workspace is). &amp;nbsp;Browse to ~/Kobold2D/Kobold2D-2.1.0/pong/trunk/pong, select &#39;pong.xcodeproj&#39; and click on Add.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
You&#39;re Done!&lt;/h4&gt;
&lt;div&gt;
You should now have a functioning Kobold2D project with all of the usual Xcode internal Subversion support available. &amp;nbsp;You should be able to pick a random file from your &#39;pong&#39; project files, right click it and go to Source Control -&amp;gt; Update Selected Files and cause Xcode to check if there are updates available for that file. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Good luck, and good gaming.&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/2667040025087083603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2013/07/using-subversion-with-kobold2d-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/2667040025087083603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/2667040025087083603'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2013/07/using-subversion-with-kobold2d-game.html' title='Using Subversion With the Kobold2D Game Engine and Xcode'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-3456412561135122340</id><published>2013-05-16T17:01:00.001-04:00</published><updated>2013-05-16T17:01:39.232-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arts"/><category scheme="http://www.blogger.com/atom/ns#" term="Jack Conte"/><category scheme="http://www.blogger.com/atom/ns#" term="money"/><category scheme="http://www.blogger.com/atom/ns#" term="movies"/><category scheme="http://www.blogger.com/atom/ns#" term="music"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Patronage in the Modern Era</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Pomplamoose&quot;&gt;Jack Conte&lt;/a&gt;, probably best known for popularizing the VideoSong music format with his &lt;a href=&quot;http://www.youtube.com/user/jackcontemusic&quot;&gt;catchy&lt;/a&gt;, &lt;a href=&quot;http://www.youtube.com/pomplamoosemusic&quot;&gt;clever songs&lt;/a&gt;, has launched a new service that might change the way artists of all kinds bring home the bacon.&lt;br /&gt;
&lt;br /&gt;
For years now, the issue of easily copied and distributed data has been plaguing artists and other copyright holders. &amp;nbsp;The arrival data and media sharing systems like BitTorrent and YouTube have been alternately heralded as the death of the music industry as we know it, and as field-levelling tools that would allow new artists of all kinds to connect with their fans. &lt;br /&gt;
&lt;br /&gt;
Either way, many people in film and music have been struggling with the problem of creating new funding models that don&#39;t rely on every fan paying a fixed fee for a CD or DVD, and that allow for fans to freely share media (because they&#39;re doing that anyway) while still letting the artists pay the rent.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve often thought one potential solution, however amusing it may sound, is to return to the centuries old practice of patronage. &amp;nbsp;In Medieval and Renaissance Europe, and earlier in Japan and other Southeast Asian countries, it was common for a wealthy individual to support an artist (or two) allowing them to produce plays, music, books, poetry, or paintings that wouldn&#39;t otherwise generate an income for the artist. &amp;nbsp;The model worked because artists could create art for art&#39;s sake without having to worry about whether it could be easily sold, the the patron received recognition for supporting a vital part of society.&lt;br /&gt;
&lt;br /&gt;
Conte seems to agree that this could work again, and has built a service to make it possible. &amp;nbsp;&lt;a href=&quot;http://www.patreon.com/&quot;&gt;Patreon&lt;/a&gt; allows fans to pledge an amount of money they choose, to be paid to their favourite artists every time the artist produces a piece of content. &amp;nbsp;It&#39;s crowd-sourced patronage that Conte likens to an ongoing Kickstarter for smaller projects, and several artists are already using it to get funding that would have been difficult or impossible to get before.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/OTQ8zMH35wc&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/3456412561135122340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2013/05/patronage-in-modern-era.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3456412561135122340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3456412561135122340'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2013/05/patronage-in-modern-era.html' title='Patronage in the Modern Era'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/OTQ8zMH35wc/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-8166943656353671520</id><published>2012-07-19T12:27:00.001-04:00</published><updated>2012-07-19T12:31:50.992-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="lightning"/><category scheme="http://www.blogger.com/atom/ns#" term="physics"/><category scheme="http://www.blogger.com/atom/ns#" term="science"/><title type='text'>Big Pretty Sky Sparks</title><content type='html'>A long long time ago, in a public school not too far from where I live now, what little we know about how lightning works was explained to me. &amp;nbsp;Apparently we still don&#39;t know a lot about how it works, but it seems we&#39;re a lot better at observing it than we used to be: I never actually got to see this particular behaviour of lightning in action before today. &amp;nbsp;My brother sent me a link to this video this morning.. it&#39;s a brilliant high-speed capture of a negative stepped ladder coming down from the clouds. &amp;nbsp;One branch makes contact with the ground and creates the path for a major return stroke. &amp;nbsp;This 33 second video covers about 0.13 seconds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;300&quot; mozallowfullscreen=&quot;&quot; src=&quot;http://player.vimeo.com/video/28457062?color=ffffff&quot; webkitallowfullscreen=&quot;&quot; width=&quot;400&quot;&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/8166943656353671520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2012/07/big-pretty-sky-sparks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/8166943656353671520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/8166943656353671520'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2012/07/big-pretty-sky-sparks.html' title='Big Pretty Sky Sparks'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-1849923863040170190</id><published>2011-09-09T18:51:00.005-04:00</published><updated>2011-09-09T20:03:05.152-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Esterian Conquest"/><category scheme="http://www.blogger.com/atom/ns#" term="Gaming"/><category scheme="http://www.blogger.com/atom/ns#" term="MMO"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>The One Where I Talk About A BBS Game</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;20 years ago I was, along with many of my friends, spending quite a lot of time on computer Bulletin Board Systems (BBSs).  Most of us had already been doing this for many years, and there were people out there who&#39;d been doing it even longer.  The BBS scene at the time was pretty sophisticated we thought.. it was becoming possible to do some really great things!  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the things that I thought was really great was playing computer games against other people in different places.  This idea was still pretty novel, as computer networking, the way we think of it today, simply wasn&#39;t possible with most home computers – what few even existed.  Most BBSes only had a single phone line for people to connect, and so out of necessity virtually every BBS game was turn-based, usually allowing a single turn per day.  So, every day, I had time set aside to dial in, see what had transpired since the previous day, and take my turns.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of my favourite games, and one of the few that I remember in any detail, was Esterian Conquest.  It was a multi-player take on some of the early empire-building &lt;a href=&quot;http://en.wikipedia.org/wiki/4X&quot;&gt;4X&lt;/a&gt; games, set in a small two-dimensional galaxy, where each player had to build a fleet of ships, and go forth and conquer by force or diplomacy.  Don&#39;t let the simple idea fool you though.. EC was a beast of a game, with simple rules that allowed for a plethora of complex results.  Early on, my nightly turn would take but a few minutes to think about and execute, but later in the game I could literally spend hours pouring over reports from my fleets, hand-drawing maps on graph paper based on the information they contained, and then planning out and tediously punching in new orders for all of my fleets and planets.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;About four years ago, while cleaning out boxes that had been in storage for ages, I came across a folder containing papers from the last game of EC I ever played.  There were printouts of reports covered in pencil notes about possible actions to take, maps with quick calculations of how long it would take my fleets to reach some hot-spot in the game galaxy, and sheet after sheet of new orders.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Fleet 66 join fleet 47&lt;/div&gt;&lt;div&gt;Fleet 32 reduce speed to 5&lt;/div&gt;&lt;div&gt;Fleet 73 move to star at (12,41)&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Everything about the game came back, and I started to wonder if it could somehow be resurrected.  I had heard years before that the source code to EC had been lost in an all-too-unfortunate hard drive crash, but digging around in more boxes I did manage to find a floppy disk with the copy I had for the BBS I&#39;d briefly run myself.  Sadly, it proved to be more work than I had time for to get a computer running that could both run modern networking &lt;b&gt;and&lt;/b&gt; connect that to an old DOS game.  So I decided that instead, I&#39;d just write my own.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I spent the next few months mapping out the game I&#39;d like to create.. what I thought at the time was probably the first ever Turn-based Strategy MMO.  I started writing documentation: how would I like the game to work?  After chatting about the idea with a friend of mine, he gave me a photo-copy of an old table-top game he&#39;d played called Stonova for ideas (it was based on Chris Wilkes&#39; &quot;Nova&quot;).  I worked out plans; I taught myself the math I&#39;d need for three dimensional navigation (I wanted my game to take place in a realistic three-dimensional galaxy).  But, when I really got down to it the game I had in mind would have required programming skills, particularly in the area of graphics, that I just didn&#39;t have the time to acquire.  The idea was grand, but it was beyond me at the time.  So I put the idea away for a while.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A couple of days ago, for no particular reason I can recall, I started thinking about this again.  My original idea had been too grand for my meagre programming skills.  But what if I scaled it down?  In the last few years it&#39;s been proven that web-based games can work, and do attract players.  So what if I ditched the desktop game idea, and went with the much easier to program web-based game?  Games like &lt;a href=&quot;http://www.travian.com/&quot;&gt;Travian&lt;/a&gt; certainly seem to attract players, and as the basic concepts go it isn&#39;t all that different from what I had in mind.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My game will be simpler than EC in places, and more involved in others.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In EC it was possible to send your ships to any point in the galaxy, and along the way they would send back reports if they came within sensor range of any other passing ship.  You could interrupt their orders mid-trip and have them pursue whom they spotted, or run away, or slow down and quietly follow at the edge of sensor range.  I think I will simplify that a lot, and very likely only allow travel to other stars, not the spaces between them.  Fleets will report on other fleets they find in their current star system, but I think I will drop the requirement to calculate intersecting flight paths, and handle changes in destination mid-flight.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;EC had a small number of fixed ship types that you could build, and assemble into fleets.  I think I&#39;d like to have a bit more range in this area, so I&#39;m going to design a technology research system that will allow players to concentrate on improving certain aspects of their ships.  Are you a fan of big weapons?  What happens when you go up against your opponent who has put all their research into heavily armoured ships?  Or, maybe you just want to build really fast ships that can run away easily when threatened.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;EC had no system of trade that I can recall.  My game will allow players to trade resources, and might even have some sort of in-game cash economy.  Perhaps you won&#39;t build warships at all, but will instead build big, fast transport ships and survive by supplying everyone with what they need... and paying tribute for &quot;protection&quot; where necessary.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;So, I&#39;ve started working on the idea again.  I have no idea what will come of it, or whether I&#39;ll even finish.  I haven&#39;t even got a name for it yet.. but I&#39;m curious to see what I can come up with.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/1849923863040170190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2011/09/one-where-i-talk-about-bbs-game.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/1849923863040170190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/1849923863040170190'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2011/09/one-where-i-talk-about-bbs-game.html' title='The One Where I Talk About A BBS Game'/><author><name>MSP</name><uri>http://www.blogger.com/profile/06592589764788936474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNCv0fvwwxeymDPt7mcgFYaWmy9jl8qhJVXdLFq64QfYhWsz5B5PuFfTAs8LKE-IzHFbq1Q6t-WXX-v-vzBC47VPO9Uo1YTcQEv1bqVIlaSTXiP7wCYXVp9A0_EdjUA/s113/phronqapalooza+square.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-6260433956124571568</id><published>2011-08-02T17:31:00.001-04:00</published><updated>2011-08-09T18:02:22.024-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="motorcycle"/><category scheme="http://www.blogger.com/atom/ns#" term="review"/><category scheme="http://www.blogger.com/atom/ns#" term="travel"/><title type='text'>Wherein I Keep My Stuff Dry in a Downpour</title><content type='html'>Last week I rode my bike from Toronto to Québec City and back for the &lt;a href=&quot;http://www.ietf.org/meeting/81/index.html&quot;&gt;81st IETF meeting&lt;/a&gt;. &amp;nbsp;This is only the second long ride I&#39;ve done (the first was to Ottawa in May), and the first where I didn&#39;t have complete control over which days I&#39;d be on the road – and thus, no control over what weather I&#39;d be riding in. &amp;nbsp;Seeing as it was a work trip, I&#39;d have to carry my laptop, and so some means of keeping it dry would be necessary.&lt;br /&gt;
&lt;br /&gt;
Since a laptop won&#39;t fit in my wee &lt;a href=&quot;http://ogio.com/moto/saddle-bag&quot;&gt;Ogio saddle bags&lt;/a&gt;, and neither they nor my laptop backpack are waterproof (and I didn&#39;t want to wear a backpack for 900km anyway) I needed something I could strap to my bike that would fit a long narrow piece of electronics, and keep it dry.&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/20110802-loaded-bike.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/20110802-loaded-bike.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Rain gear, water, and street boots in the saddle bags, spare gloves, &lt;br /&gt;
camera, maps, etc. in the tank bag, everything else in the Seal Line&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;My usual stop for such things is my local &lt;a href=&quot;http://www.mec.ca/&quot;&gt;MEC&lt;/a&gt;, as they rarely disappoint. &amp;nbsp;This visit was successful as always, and I walked out with a &lt;a href=&quot;http://www.mec.ca/Products/product_detail.jsp?PRODUCT%3C%3Eprd_id=845524442585989&amp;amp;FOLDER%3C%3Efolder_id=2534374302881200&quot;&gt;75 litre Seal Line&lt;/a&gt; zip dry bag. &amp;nbsp;At first glance in the store, and while packing, it seemed to be the ideal bag for what I wanted. &amp;nbsp;It&#39;s flat and wide, carries easily, holds a week of clothes plus my laptop, laptop bag, and some assorted cables and other gear, and most importantly zips air tight. &amp;nbsp;In fact, after strapping it to my bike I found I had to unzip it to let it deflate a bit.. this made the difference between it poking me in the back all the time and compressing neatly out of my way up on the passenger seat. &amp;nbsp;But, it hadn&#39;t really been tested yet... and it would be tested. &amp;nbsp;Oh, how it would be tested.&lt;br /&gt;
&lt;br /&gt;
On the ride home this past Friday, on the leg between Ottawa and Toronto, I ran into a pretty nasty rain storm. &amp;nbsp;Rain wasn&#39;t entirely unexpected.. I&#39;d been watching some weather move East toward me from Toronto for a couple days.. but the amount of rain was a huge surprise. &amp;nbsp;I haven&#39;t even been outside in a rain storm like this in a long time, let alone out on the highway. &amp;nbsp; As I was passing North of Kingston on Highway 7, Kingston was &lt;a href=&quot;http://ottawa.ctv.ca/servlet/an/local/CTVNews/20110729/OTT_Kingston_Roads_110729/20110729?hub=OttawaHome&amp;amp;utm_source=twitterfeed&amp;amp;utm_medium=twitter&quot;&gt;busy closing down several streets&lt;/a&gt; due to flooding. It was some nasty rain.&lt;br /&gt;
&lt;br /&gt;
But lo, and behold, upon my arrival home I found the inside of the dry bag to be.. well.. dry. &amp;nbsp;Bone dry. &amp;nbsp;Where the Ogio bags and me were both soaked, and even my supposedly rain-proof tank bag had some moisture in it, my laptop was saved. &amp;nbsp; Success!&lt;br /&gt;
&lt;br /&gt;
Now if only I could solve the problem of drying out the inside of my helmet in the middle of a downpour.</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/6260433956124571568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2011/08/wherein-i-keep-my-stuff-dry-in-downpour.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/6260433956124571568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/6260433956124571568'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2011/08/wherein-i-keep-my-stuff-dry-in-downpour.html' title='Wherein I Keep My Stuff Dry in a Downpour'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-3583232420449040152</id><published>2011-01-20T19:35:00.000-05:00</published><updated>2011-01-20T19:35:22.538-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="review"/><category scheme="http://www.blogger.com/atom/ns#" term="screen capture"/><category scheme="http://www.blogger.com/atom/ns#" term="screen casting"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><title type='text'>Screencasting for OSX</title><content type='html'>I spent some time this afternoon evaluating several screen casting apps for my Mac. It cost me a bunch of time, and a little bit of money, so I thought I&#39;d share my notes to potentially save someone some grief in the future.&lt;br /&gt;
&lt;br /&gt;
For those who haven&#39;t seen the term before, &quot;screen casting&quot; is recording video of all or part of a computer display, usually with some sort of voice over, for the purpose of doing a demonstration to be viewed at a later date. It&#39;s often done to demonstrate the use, or features, of a piece of software, but lately it&#39;s also gaining popularity for sharing things like gaming experiences on video sharing sites like Youtube and Vimeo.&lt;br /&gt;
&lt;br /&gt;
There appear to be all sorts of applications for doing this today, where there were only one or two a couple of years ago, and they have a fairly wide range in features and quality. Some of the applications I looked at also do &quot;screen grab&quot; (capturing a still image of the display) but I pretty much ignored this in all of them since MacOS comes with a perfectly good utility for this (Grab.app). Full reviews below the cut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/QuicktimeX-128x128.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/QuicktimeX-128x128.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Quicktime Player&lt;/b&gt;: The latest version of Quicktime Player is capable of recording the full screen with system audio and one other audio input. It&#39;s solid as a rock, records good quality, and comes free with OSX as of 10.6 (earlier versions of MacOS used Quicktime 7 which was very limited unless you purchased a Quicktime Pro license from Apple). Quicktime Player is good for what it does, but extremely limited in terms of its features.&lt;br /&gt;
&lt;br /&gt;
Score: C+&lt;br /&gt;
Cost: Free&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/Screenium-128x128.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/Screenium-128x128.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;a href=&quot;http://www.syniumsoftware.com/screenium/&quot;&gt;Screenium&lt;/a&gt;&lt;/b&gt;: This is the first third-party app I tried out. The general quality of the software is good; it&#39;s easy to navigate, has a fairly complete user manual available in the Help menu, and has some good features that aren&#39;t very common in other similar applications. There are one or two surprises in the user interface. For example, the video recording options are at the top of the main window, and other options like audio settings, whether to capture the mouse, etc. are further down the list. However, when you pick a video recording style it immediately wants to start recording, so you essentially have to do the setup for a particular recording from the bottom of the list up to the top, which is a bit counter-intuitive. On the plus side, it can record several different audio sources in the same video, which most screen casting applications don&#39;t seem to be able to do. Most are limited to system audio and one other input, assuming they can even do two at a time. Screenium requires an external driver for recording system audio, but the driver is freely available and easy to install. Screenium also claims to be able to record just a single window (as opposed to the entire display or a selected area of the display) however this feature doesn&#39;t seem to work; Screenium just records the entire display when I try to use it. I would probably have given it a higher score if it simply didn&#39;t claim to have the &quot;record a window&quot; feature rather than claim to have it but not work properly.&amp;nbsp;Recording an area of the screen that happens to overlap the window you want to record is a viable option, but getting this right is a bit fiddly as it&#39;s hard to spot if your selection is off by only a few pixels.&amp;nbsp;Screenium claims to be able to record video through a video camera, but it was unable to find my firewire iSight camera.&lt;br /&gt;
&lt;br /&gt;
Score: B-&lt;br /&gt;
Cost: US $30&lt;br /&gt;
Try before you buy: Yes&lt;br /&gt;
Version tested: 1.3.3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/iShowUHD-128x128.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/iShowUHD-128x128.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://www.shinywhitebox.com/home/home.html&quot;&gt;iShowU&lt;/a&gt;&lt;/b&gt;: iShowU is probably the most robust screen casting app out there. It has a huge number of features and dials for tweaking its behaviour, and comes in three flavours depending on how powerful a programme you need (regular iShowU, iShowU HD, and iShowU HD Pro – I tested out iShowU HD). iShowU can record an entire display (there&#39;s a menu option for which display if you have more than one), or a selectable region of a display. It can&#39;t record just a single window, but it will let you automatically set the recording region to overlap the current location of any window, so that&#39;s really only a semantic difference (as long as you don&#39;t move the window during recording). It also has several presets for input recording area and output video formats and dimensions.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;iShowU will record simultaneous video from the display and from an external camera, and will let you overlay the video from the external camera anywhere over the display recording, at any size you like. This is particularly useful for pre-recorded classroom type demonstrations where you want the instructor to be visible along with the content of the class or to do something like overlay simultaneous Sign Language translation without post-production editing. iShowU simultaneously records system audio and one external audio input, lets you set the recording level for both independently, and will let you select whether you want to monitor one or both of those inputs through the system audio output (speakers or headphones usually).&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;The HD Pro version integrates directly with Apple Pro applications like Final Cut, but is significantly more expensive than the other two options. I think it&#39;s worth the extra cost if you&#39;ll be doing a lot of screen casting and need to do any post-production editing.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Score: A&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Cost: US $20 (Classic) / US $30 (HD) / US $60 (HD Pro)&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Try before you buy: Yes&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Version tested: 2.1.5&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/Jing-128x128.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/Jing-128x128.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://www.techsmith.com/jing/&quot;&gt;Jing&lt;/a&gt;:&lt;/b&gt;&amp;nbsp;Jing had me annoyed right off the bat. &amp;nbsp;When you first start the application it runs a quick tutorial, and then &lt;i&gt;requires&lt;/i&gt; you to sign up for a personal account on screencast.com (Jing&#39;s image/movie sharing site) before it will let you even try the application. &amp;nbsp;This seems to me to be a ridiculous requirement if you have no intention of using their image sharing site. &amp;nbsp;I went ahead and signed up with some false/throwaway information in order to be able to at least demo the software.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Jing claims to comes in two flavours, Free and Pro, but the free version is essentially just a demo as there are several important features which are disabled, the application overlays ads on your captures, and pushes you to upgrade at every turn. &amp;nbsp;Shockingly, the Pro version is actually sold as a service, with a recurring fee, rather than as a piece of software with a single payment at the time of purchase. &amp;nbsp;I refused to pay the cost of the Pro version, so my review is based entirely on the free version.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;The free version of Jing is only capable of outputting Flash video, which eliminates most hope of doing any post production editing of your screencast. &amp;nbsp;The pro version can output MPEG-4 encoding, but it&#39;s not clear in what container (mpeg, mov, etc.). &amp;nbsp;It can only record one audio source, and the system audio doesn&#39;t appear to be among the options, so perish any hope of catching sound effects from your application or presentation. &amp;nbsp;Jing can capture an entire display (but won&#39;t let multi-display users pick which one.. it defaults to the display with the menu bar), a screen region, or any single window.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;The one thing Jing has going for it is that it integrates directly with screncast.com, Youtube, Twitter, Facebook and Flickr for uploading your captures directly from Jing immediately after you finish them.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Jing seems pretty bare bones, and there don&#39;t really seem to be any other features.&amp;nbsp;I didn&#39;t try the application long enough to discover if there were any bugs.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Score: D&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Cost: US $15/year&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Try before you buy: Yes&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Version tested: 2.4.30037&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/SnapzProX-128x128.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/SnapzProX-128x128.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://www.ambrosiasw.com/utilities/snapzprox/&quot;&gt;Snapz Pro X&lt;/a&gt;&lt;/b&gt;: &amp;nbsp;I didn&#39;t find this application terribly intuitive. &amp;nbsp;In addition to When you run it, it doesn&#39;t stay put; as soon as you take any action it exits, and you have to run it again to do the next thing. &amp;nbsp;To me, this seems to require that you do post production editing since there will be a bunch of fiddling around at the end of every video while you try to stop the recording.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Snapz can record full screen or a selected region, can record system audio as well as an external microphone, and has a huge number of output video formats. &amp;nbsp;It seems to me that it&#39;s too expensive for what it is though, which is fairly simple-minded but difficult to use.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Snapz also installs a kernel extension on the system, which I find a bit distasteful considering it&#39;s not required by any other screen capture tool I&#39;ve seen.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Score: C-&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Cost: US $70&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Try before you buy: Yes&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Version tested: 2.2.3&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/Screenflow-128x128.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/Screenflow-128x128.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://www.telestream.net/screen-flow/overview.htm&quot;&gt;Screenflow&lt;/a&gt;&lt;/b&gt;: Screenflow is billed as a professional screen casting app, but in my opinion it doesn&#39;t quite measure up to that, although it does have several interesting features not present in any of the other applications that I tested. &amp;nbsp; It will let you do multiple recordings, and edit them together within the application, including doing overlays of camera video and audio; you can add text bubbles and other non-video overlays; add transitions, and make use of several other post-production editing features. &amp;nbsp;It&#39;s missing some obvious things like recording only a region of the screen or only a window, but you can crop video after it&#39;s recorded so perhaps this won&#39;t feel like a limitation to some people.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;The interface is very intuitive and easy to use if you&#39;re at all familiar with timeline editors (video editors, audio editors, etc.) but may require some getting used to for the beginner.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;As a comparison, it&#39;s more powerful than than iShowU alone but wouldn&#39;t stand up to iShowU backed by a basic video editor such as iMovie or Final Cut.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Score: A&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Cost: US $100&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Try before you buy: Yes&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Version tested: 2.1.5&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/Screenflick-128x128.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/Icons/Applications/Screenflick-128x128.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://www.araelium.com/screenflick/&quot;&gt;Screenflick&lt;/a&gt;&lt;/b&gt;: Screenflick is basic, but a solid little screen casting application. &amp;nbsp;The interface is dead-easy to use, it covers all of the basic features (record full screen or selected area, show mouse/keyboard events, export various audio and video encodings, etc.), lets you preview your movies before exporting them, &amp;nbsp;and it&#39;s good and cheap. &amp;nbsp;If you only have simple requirements (such as showing your friends your latest Minecraft extravaganza) this is probably the app for you. &amp;nbsp;If you need something more feature rich, then I&#39;d go with one of the others.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Score: A-&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Cost: US $25 (seems to be on sale from $30)&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Try before you buy: Yes&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Version tested: 1.6.15&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/3583232420449040152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2011/01/screencasting-for-osx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3583232420449040152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3583232420449040152'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2011/01/screencasting-for-osx.html' title='Screencasting for OSX'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-9126812528626197436</id><published>2010-11-30T20:06:00.000-05:00</published><updated>2010-11-30T20:06:50.574-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="health"/><category scheme="http://www.blogger.com/atom/ns#" term="Movember"/><category scheme="http://www.blogger.com/atom/ns#" term="prostate cancer"/><title type='text'>No Mo&#39; Movember</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/20101130-Movember.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/20101130-Movember.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Well, it&#39;s over. &amp;nbsp; I think the mo turned out fairly well! It&#39;s too bad about the lighting in this last shot. &amp;nbsp;Unfortunately, it was so dark out today that I had no natural light at all in my livingroom, and so I either had to go with &#39;too dark&#39; or &#39;wow, is that what you look like under a flash?&#39; &amp;nbsp;I went with the former.&lt;br /&gt;
&lt;br /&gt;
I&#39;d like to thank everyone who&#39;s &lt;a href=&quot;http://bit.ly/9u5Svh&quot;&gt;donated&lt;/a&gt; so far; I&#39;ve managed to raise $260 at this point. &amp;nbsp;Donations are still open, if you haven&#39;t had a chance to &lt;a href=&quot;http://bit.ly/9u5Svh&quot;&gt;contribute&lt;/a&gt;, and I&#39;m pretty sure they will be at least until the end of the week.&lt;br /&gt;
&lt;br /&gt;
Thanks again everyone for helping out! &amp;nbsp;As promised, a time-lapse movie of the mo growth is forthcoming, but it&#39;s a bit of work to get the photos all lined up right, so it may take me a few days to get it out. &amp;nbsp; I&#39;ll be sure to post it here when it&#39;s done.&lt;br /&gt;
&lt;br /&gt;
Cheers!</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/9126812528626197436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/11/no-mo-movember.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/9126812528626197436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/9126812528626197436'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/11/no-mo-movember.html' title='No Mo&#39; Movember'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-1069715839668954434</id><published>2010-11-11T14:13:00.000-05:00</published><updated>2010-11-11T14:13:25.857-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="health"/><category scheme="http://www.blogger.com/atom/ns#" term="Movember"/><category scheme="http://www.blogger.com/atom/ns#" term="prostate cancer"/><title type='text'>Movember Update: Day 11</title><content type='html'>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/20101111-Movember.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/20101111-Movember.jpg&quot; width=&quot;150&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Movember Mugshot, Day 11&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;So, the Mo is progressing fairly well.&amp;nbsp; My hair is pretty light, so it doesn&#39;t show as well in the photograph as it does in real life, but it&#39;s coming along nicely.&amp;nbsp; Now that it actually shows up, I&#39;ll likely post updates somewhat more often than I have so far (which is not at all). I&#39;ve been taking daily photos, and when all is done I&#39;ll be putting together a quick little time lapse movie of my Mo growth.&amp;nbsp; It should be good for a laugh!&lt;br /&gt;
&lt;br /&gt;
I&#39;d like to say a big thanks to all the people who have donated so far!&amp;nbsp; I really appreciate your contribution!&amp;nbsp; For anyone who would like to donate to prostate cancer research, but hasn&#39;t had a chance yet, please drop by my personal &lt;a href=&quot;http://bit.ly/9u5Svh&quot;&gt;Movember page&lt;/a&gt;; your help will be greatly appreciated!</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/1069715839668954434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/11/movember-update-day-11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/1069715839668954434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/1069715839668954434'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/11/movember-update-day-11.html' title='Movember Update: Day 11'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-3122852829723789531</id><published>2010-11-11T12:00:00.000-05:00</published><updated>2010-11-11T12:00:47.654-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apple"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="RSS"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby"/><title type='text'>Escaping Mac Mail RSS</title><content type='html'>Don&#39;t get me wrong, the Mac Mail RSS reader is pretty good. If you&#39;ve just got the one computer, and don&#39;t have any desire to read your RSS feeds when you&#39;re away from home, then it&#39;s an excellent choice. It&#39;s shameful, however, that &lt;a href=&quot;https://www.me.com/&quot;&gt;MobileMe&lt;/a&gt; – Apple&#39;s service for syncing your data between Mac computers – doesn&#39;t even try to sync your RSS feeds between Mail clients.&lt;br /&gt;
&lt;br /&gt;
This lack of ability to keep the RSS feeds in my Mail client on my desktop and my laptop in sync (let alone on my iPad or iPhone) has led me to start looking for a replacement RSS reader. As disappointing as the lack of sync is, I quickly discovered the even more shocking reality that there&#39;s not even a way to export my RSS feeds from Mail. Go, look ... you won&#39;t find anything... I&#39;ll wait.&lt;br /&gt;
&lt;br /&gt;
As it happens, there&#39;s this standard, which is useful for moving RSS feed information around, called &lt;a href=&quot;http://www.opml.org/&quot;&gt;OPML&lt;/a&gt; (Outline Processor Markup Language), which is a subset of XML (eXtensible Markup Language). I&#39;m not a big fan of XML but there are times when it&#39;s useful, and in this case several major RSS readers have implemented an OPML import/export so that you can move your RSS feeds around. It would be really handy if Apple implemented this as well.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, Apple&#39;s oversights get worse. Not only can you not sync RSS feeds between computers, or export your RSS feeds, you can&#39;t even view the URL of your RSS feeds within Mail so that you could manually copy them to another device or program. Go Apple!&lt;br /&gt;
&lt;br /&gt;
This only leaves one option: manually digging through the files that Mail saves out to keep track of your feeds. This is a task that is beyond the average home computer user, which effectively means that most Mac users who start using Mac Mail as their RSS reader are stuck.&lt;br /&gt;
&lt;br /&gt;
Fortunately, I&#39;m not the average home computer user, and I know where to find these files that Apple writes, and I know how to read them .. so I could go in and cut and paste all those URLs into another reader. But I&#39;m too lazy for that, so I wrote a program to do it for me. This wasn&#39;t quite as easy as I expected, since reading in the XML plist files turned out to be a bit of a trick. As much as I don&#39;t like XML, trying to describe how I hate XML plist (the format Mail uses for these files) would completely derail this post – Apple really screwed the pooch on that one.&lt;br /&gt;
&lt;br /&gt;
Eventually I gave up on the program being super-portable, and just used someone else&#39;s library to read in the plist files. I had been hoping that I could post a script here that anyone could save on their Mac and run to generate an OPML file, but the plist debacle meant that other stuff would need to be installed. Oh well.&lt;br /&gt;
&lt;br /&gt;
In the end I got my OPML file, and I&#39;ve imported it into Google Reader. Several of the iPad RSS readers will import their feeds from Google, which works well enough. &lt;br /&gt;
&lt;br /&gt;
I&#39;m posting my script below, free to anyone for personal use. In order to make it work you&#39;ll need to first install two libraries on your system. &lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Making it Go&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
In &quot;Terminal&quot; (which you can find in Applications -&amp;gt; Utilities), type the following two commands:&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;gem install builder
gem install plist
&lt;/pre&gt;&lt;br /&gt;
Once you&#39;ve installed builder and plist, click on &lt;a href=&quot;http://mpounsett.s3.amazonaws.com/scripts/distrib/MacRSStoOPML.tar.gz&quot;&gt;this link&lt;/a&gt;.  It will download an archive file that contains the script. &amp;nbsp;When that&#39;s done, in your Downloads window double-click on the &quot;MacRSStoOPML.tar.gz&quot; entry; that will decompress the archive and show you a new Finder window with the archive you downloaded and the script that was in it. &amp;nbsp;Double-click on &quot;MacRSStoOPML&quot; (it&#39;ll have a grey box-like icon) to run it. &amp;nbsp;And you&#39;re done! &amp;nbsp;You should now have a file called &quot;opml.xml&quot; on your Desktop, which lists all of the RSS feeds you were reading in Mail.&lt;br /&gt;
&lt;br /&gt;
Happy reading!</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/3122852829723789531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/11/escaping-mac-mail-rss.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3122852829723789531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3122852829723789531'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/11/escaping-mac-mail-rss.html' title='Escaping Mac Mail RSS'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-181815996780469319</id><published>2010-11-03T03:02:00.001-04:00</published><updated>2010-11-03T03:03:08.968-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Deb Matthews"/><category scheme="http://www.blogger.com/atom/ns#" term="health"/><category scheme="http://www.blogger.com/atom/ns#" term="Movember"/><category scheme="http://www.blogger.com/atom/ns#" term="prostate cancer"/><category scheme="http://www.blogger.com/atom/ns#" term="PSA test"/><title type='text'>Mo Fruits, Mo Flowers, Mo Leaves, Mo Birds - Movember.</title><content type='html'>That&#39;s right, it&#39;s Movember again!&lt;br /&gt;
&lt;br /&gt;
For those that don&#39;t know, the month formerly known as November has been given over to the goal of raising awareness of prostate cancer, accomplished by men the world over&amp;nbsp; making a commitment to grow new moustaches (a &quot;Mo&quot;).&amp;nbsp; Much like the commitment to run or walk for charity, men commit to growing a moustache for 30 days to raise funds for cancer research.&amp;nbsp; Last year, global participation in Movember raised CDN $47 million!&lt;br /&gt;
&lt;br /&gt;
I&#39;m taking part for the first time this year, and a couple of mornings ago I got myself a nice clean shave.&amp;nbsp; I&#39;m now waiting for enough to grow in to start trying to decide what sort of mo I&#39;ll grow!&lt;br /&gt;
&lt;br /&gt;
Hopefully, a few of you will decide to support my face fuzz with a donation, which you can easily do &lt;a href=&quot;http://bit.ly/9u5Svh&quot;&gt;here&lt;/a&gt;. In return I&#39;ll commit to new growth on my face, and to regularly posting updates here and on my Movember page, which I&#39;m sure will generate much controversy and hilarity.&lt;br /&gt;
&lt;br /&gt;
The Movember movement aims to increase awareness of prostate cancer and to promote screening (testing before detection of any symptoms), for obvious reasons.&amp;nbsp; Unfortunately, here in Ontario not all men have equal access to the PSA test (Prostate-Specific Antigen test).&amp;nbsp; The Ontario Ministry of Health has chosen not to provide the PSA test as an early detection measure as they have with cervical and breast cancer screening.&amp;nbsp; The Ministry web site &lt;a href=&quot;http://www.health.gov.on.ca/english/public/pub/cancer/psa/psa_test/psa_faq.html#7&quot;&gt;says it best&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;In men without symptoms&lt;/i&gt; (screening), PSA testing is not paid for by the provincial health plan. A man can have the PSA test if he is willing to pay for the test himself. However, it is hoped he will make this decision only after discussion with his Health Care Provider.&lt;/blockquote&gt;&amp;nbsp;The Ministry&#39;s explanation for this is that they don&#39;t believe the current PSA test is reliable enough to be used as a screening measure.&amp;nbsp; The statistics they quote say that, of every 100 men over the age of 50 screened, 4 or 5 will have prostate cancer: three will be detected, and one or two will go undetected by the test.&amp;nbsp; That seems like a fairly decent result to me, when one in six men will be diagnosed with prostate cancer in his lifetime, and twelve Canadian men die of prostate cancer daily.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Perhaps some enterprising souls will write to the Minister and encourage her to support prostate cancer screening.&lt;br /&gt;
&lt;br /&gt;
In the mean time, please visit my &lt;a href=&quot;http://bit.ly/9u5Svh&quot;&gt;Movember page&lt;/a&gt;;&amp;nbsp; enjoy a few laughs at my expense, and please donate if you can.</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/181815996780469319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/11/mo-fruits-mo-flowers-mo-leaves-mo-birds.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/181815996780469319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/181815996780469319'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/11/mo-fruits-mo-flowers-mo-leaves-mo-birds.html' title='Mo Fruits, Mo Flowers, Mo Leaves, Mo Birds - Movember.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-24202086791212411</id><published>2010-08-06T09:08:00.000-04:00</published><updated>2010-08-06T09:08:31.533-04:00</updated><title type='text'>Pay-as-you-go iPad Service in the UK</title><content type='html'>&lt;a href=&quot;http://www.vodaphone.com/&quot;&gt;Vodaphone&lt;/a&gt; doesn&#39;t (and were rude about it), &lt;a href=&quot;http://orange.co.uk/&quot;&gt;Orange&lt;/a&gt; doesn&#39;t (you have to have a UK bank account), but &lt;a href=&quot;http://www.three.co.uk/&quot;&gt;Three&lt;/a&gt; does. I stopped looking after that. &lt;br /&gt;
&lt;br /&gt;
£10 for 1gig, £20 for 3gig. Seems to work quite well, too.</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/24202086791212411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/08/pay-as-you-go-ipad-service-in-uk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/24202086791212411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/24202086791212411'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/08/pay-as-you-go-ipad-service-in-uk.html' title='Pay-as-you-go iPad Service in the UK'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-3181854162668915405</id><published>2010-02-15T23:50:00.002-05:00</published><updated>2010-02-15T23:53:20.959-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="how to"/><category scheme="http://www.blogger.com/atom/ns#" term="photography"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Losing My Memories</title><content type='html'>Back at the beginning of January a horrible thing happened.  It was something that a lot of people fear in this day and age, but which few really believe will happen to them.  It happened to me though, and I had to find a way to recover from it.   Yes, I lost &lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;all&lt;/span&gt; of my digital photographs.&lt;br /&gt;
&lt;br /&gt;
The the complete details of how it happened are not terribly germane to the post but the short story is that, while moving to a new computer, for that brief period where a lot of this data existed only on my backup disk, a Windows installer decided it would like to reformat that backup disk for me.&lt;br /&gt;
&lt;br /&gt;
Recovering data from a reformatted drive can be tricky.  Without the original filesystem information you need some special tools to even find old files, let alone reassemble them into something recognizable.  But, with a bit of work I managed to get all of my images back, and this is the story of how I did that. &lt;br /&gt;
&lt;br /&gt;
The whole recovery story started off with a stroke of luck.  I happened to mention the demise of all of my photographs to a friend of mine, and he just happened to know of an incredibly useful tool for recovering my data.  He pointed me toward &lt;a href=&quot;http://www.cgsecurity.org/wiki/TestDisk&quot;&gt;TestDisk&lt;/a&gt; by Christophe Grenier.  TestDisk is rather badly named I think, because testing is the least of what it can do.  One of the key features that made my life far, far easier is its ability to do file type recognition when recovering files. &lt;br /&gt;
&lt;br /&gt;
When the filesystem information from a disk is lost, even if you&#39;re able to recover files, you can&#39;t always recover the file names; often that information is lost forever.  That means that recovered files will typically wind up with some sort of coded file name (usually just a number generated by the recovery program).  If you&#39;re recovering a very large disk, you can wind up with literally millions of files with completely nondescript file names.  It would be completely impractical to try and sort through an entire disk worth of files that way trying to find the pictures.&lt;br /&gt;
&lt;br /&gt;
Fortunately, TestDisk&#39;s ability to recognize file types based on the data in the file, rather than the file name, meant that I could tell it to only recover the JPEG images from the disk.  This way I wound up with a set of files where I definitely knew the type of each and every file.  And it just so happens that all of the digital cameras I&#39;ve owned work in JPEG.&lt;br /&gt;
&lt;br /&gt;
I knew I was still going to have a problem though.  Because this was my backup disk, which contained not only my Aperture database, but also all of my Time Machine data (a MacOS backup tool), what would be recovered in searching for all JPEG images would include all of the pictures in my Aperture database, but also my entire web browser cache, and any other little jpeg images stored on my disk as part of various applications, etc.  When the recovery ran, I ended up with a bunch of folders with a little under 35,000 pictures in them.  Now what? &lt;br /&gt;
&lt;br /&gt;
Well, the first thing I did was to try to eliminate any duplicate images.  Even though that would be a fairly simple script to write, I always google for these sorts of tools before I try to write them myself.  Usually, someone else has already written and posted the thing I need, and often it&#39;s better than I would have written on the first try.  This was just such a case, and I found a great little &lt;a href=&quot;http://www.perlmonks.org/?node_id=49198&quot;&gt;perl script&lt;/a&gt; that would search for and remove all the duplicate images. &lt;br /&gt;
&lt;br /&gt;
That got me down to a little over 20,000 images.  Still a lot, but far fewer than I had before.&lt;br /&gt;
&lt;br /&gt;
The next step was to try and separate out the original files downloaded from my cameras from all of the other random images.  For that, I did write my own script.  I scanned through all of the images to extract the original image date/time from the Exif data, reorganizing the images into directories by the day the picture was taken.  If an image had no original date in its Exif data, or no Exif data at all, then I assumed the file was not a photograph (or not one of my photographs) and put it off in a separate directory to be sorted through manually later.&lt;br /&gt;
&lt;br /&gt;
Here&#39;s the script I used:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: perl&quot;&gt;#!/usr/bin/perl

use strict;
use diagnostics;
use warnings;

use Date::Parse;
use File::Find;
use Image::ExifTool qw(:Public);
use POSIX qw(strftime);

my( $source_d      ) = &#39;/Users/matt/Desktop/Recovery/jpg/&#39;;
my( $base_dest_d   ) = &#39;/Users/matt/Desktop/Recovery/jpg-sorted/&#39;;

my( $dir_date_format  ) = &#39;%F&#39;;
my( $file_date_format ) = &#39;%Y%m%d-%H%M%S&#39;;

my( $nodate_i, $nodate_d ) = (0, 00);

if( ! -d $base_dest_d )           { mkdir $base_dest_d; }
if( ! -d $base_dest_d.&#39;NoDate/&#39; ) { mkdir $base_dest_d.&#39;NoDate/&#39;; }

sub wanted {
    my( $source_file ) = $File::Find::name;
    my( $source_date, $dest_d, $target_f );
    
    unless( -f $source_file ) { return; }
    unless( $source_file =~ /\.jpg$/ ) { return; }
    
    
    my( $info ) = ImageInfo($source_file);
    if( $info-&amp;gt;{DateTimeOriginal} ) {
        $source_date = str2time($info-&amp;gt;{DateTimeOriginal});

        $dest_d = $base_dest_d .
            strftime($dir_date_format, localtime($source_date));

        $target_f = strftime($file_date_format, localtime($source_date));

        # in addition to naming the file by date, give the image an index
        # number that advances if there is more than one image with the same 
        # date+time
        my( $target_i ) = 0;
        while( length($target_i)&amp;lt;2 ) { $target_i = &#39;0&#39;.$target_i; }
        while( -f $dest_d.&#39;/&#39;.$target_f.&#39;-&#39;.$target_i ) {
            $target_i++;
            while( length($target_i)&amp;lt;2 ) { $target_i = &#39;0&#39;.$target_i; }
        }

        $target_f = $target_f.&#39;-&#39;.$target_i;

    } else {
        # images with no date/time get put into subdirs, 100 images per
        # directory to keep the directory from getting too large
        $nodate_i++;
        if( $nodate_i &amp;gt; 100 ) { 
            $nodate_i = 1;
            $nodate_d++;
        }
        while( length($nodate_d)&amp;lt;3 ) { $nodate_d = &#39;0&#39;.$nodate_d; }
        $dest_d = $base_dest_d . &#39;NoDate/&#39; . $nodate_d;

        $target_f = $_;

    }

    if( ! -d $dest_d ) {
        mkdir $dest_d or die &quot;failed to create dest dir $dest_d: $!&quot;;
    }

    my( $final_file ) = sprintf( &quot;%s/%s&quot;, $dest_d, $target_f );
    printf &quot;%s: %s: %s\n&quot;,
        $_, $info-&amp;gt;{DateTimeOriginal} || &#39;NoDate&#39;, $final_file;

    link( $_, $final_file ) or die &quot;failed to link files $_:$final_file: $!&quot;;
}

find(\&amp;amp;wanted, $source_d );
&lt;/pre&gt;&lt;br /&gt;
This has left me with about 7,300 images sorted out into directories by the date the picture was taken, and about 13,600 in directories of images with no known shoot date.&amp;nbsp; This is far more manageable!&amp;nbsp; I&#39;ll probably still wind up doing a bunch of manual sorting of the images that are left, but now the task is much more approachable than it was in the beginning. &amp;nbsp; It&#39;s also possible I could find some other useful piece of Exif data to sort them by.</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/3181854162668915405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/02/losing-my-memories.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3181854162668915405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3181854162668915405'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/02/losing-my-memories.html' title='Losing My Memories'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-1418917876743839440</id><published>2010-02-09T17:51:00.004-05:00</published><updated>2010-02-09T18:14:58.070-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EuroIX"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="IXP"/><category scheme="http://www.blogger.com/atom/ns#" term="youtube"/><title type='text'>So Easy, an Adult Can Understand!</title><content type='html'>The Internet, explained to your mom.&lt;br /&gt;&lt;br /&gt;That&#39;s how I&#39;d describe &lt;a href=&quot;http://www.youtube.com/watch?v=a5837LcDHfE&quot;&gt;this video&lt;/a&gt; from &lt;a href=&quot;http://www.euro-ix.net/&quot;&gt;EuroIX&lt;/a&gt;, an association of European Internet Exchange Points (IXPs).  Don&#39;t worry if you don&#39;t know what an IXP is.. the video explains.&lt;br /&gt;&lt;br /&gt;I was all set to blog about this months ago, but then they took the video down in order to update and clarify a few things.  It&#39;s back up now, and so you get to enjoy its informational goodness.</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/1418917876743839440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/02/so-easy-adult-can-understand.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/1418917876743839440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/1418917876743839440'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/02/so-easy-adult-can-understand.html' title='So Easy, an Adult Can Understand!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-4036444351793944390</id><published>2010-02-08T11:21:00.001-05:00</published><updated>2014-10-27T17:14:21.811-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="news"/><category scheme="http://www.blogger.com/atom/ns#" term="satire"/><category scheme="http://www.blogger.com/atom/ns#" term="youtube"/><title type='text'>Reporting Made Easy</title><content type='html'>An amusingly self-referential new clip on how to report the news:&lt;br /&gt;
&lt;br /&gt;
&lt;object height=&quot;340&quot; width=&quot;560&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/aHun58mz3vI&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&quot;&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/aHun58mz3vI&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; height=&quot;340&quot; width=&quot;560&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/4036444351793944390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/02/reporing-made-easy.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/4036444351793944390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/4036444351793944390'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/02/reporing-made-easy.html' title='Reporting Made Easy'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-6275190201718614640</id><published>2010-02-05T13:10:00.000-05:00</published><updated>2010-02-05T13:10:00.202-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PSA"/><category scheme="http://www.blogger.com/atom/ns#" term="youtube"/><title type='text'>Safe Driving in the Home</title><content type='html'>A creatively conceived and beautifully shot PSA, from the Sussex Safer Roads Partnership in the UK.&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;560&quot; height=&quot;340&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/uBTwNaktp84&amp;hl=en_US&amp;fs=1&amp;rel=0&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/uBTwNaktp84&amp;hl=en_US&amp;fs=1&amp;rel=0&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;560&quot; height=&quot;340&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/6275190201718614640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/02/safe-driving-in-home.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/6275190201718614640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/6275190201718614640'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/02/safe-driving-in-home.html' title='Safe Driving in the Home'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-4739837347609601503</id><published>2010-02-03T12:25:00.000-05:00</published><updated>2013-07-03T01:24:08.936-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="collaboration"/><category scheme="http://www.blogger.com/atom/ns#" term="music"/><category scheme="http://www.blogger.com/atom/ns#" term="remix"/><category scheme="http://www.blogger.com/atom/ns#" term="Ze Frank"/><title type='text'>Share The Pain</title><content type='html'>Ze Frank is working on yet another cool collaborative, creative project.  If you&#39;re into music creation at all, consider contributing to the &lt;a href=&quot;http://www.zefrank.com/pain_pack/&quot;&gt;Pain Pack&lt;/a&gt;.  I&#39;ve just downloaded the audio sources and will be having a listen to see if I have any inspiration of my own.</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/4739837347609601503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/02/share-pain.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/4739837347609601503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/4739837347609601503'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/02/share-pain.html' title='Share The Pain'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-3331235593969699016</id><published>2010-02-02T23:16:00.004-05:00</published><updated>2011-01-20T19:56:00.971-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="animation"/><category scheme="http://www.blogger.com/atom/ns#" term="stop motion"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><category scheme="http://www.blogger.com/atom/ns#" term="youtube"/><title type='text'>Motion Doesn&#39;t Stop</title><content type='html'>An incredible stop-motion piece.  The time and planning (and rehearsal!) that must have gone into this is mind-boggling.&lt;br /&gt;
&lt;br /&gt;
&lt;object height=&quot;344&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/gVph_oJ62vQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&quot;&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/gVph_oJ62vQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; height=&quot;344&quot; width=&quot;425&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/3331235593969699016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/02/motion-doesnt-stop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3331235593969699016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/3331235593969699016'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/02/motion-doesnt-stop.html' title='Motion Doesn&#39;t Stop'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-7870447330191359388</id><published>2010-01-05T22:27:00.004-05:00</published><updated>2010-01-05T22:49:06.245-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gifts"/><category scheme="http://www.blogger.com/atom/ns#" term="money"/><category scheme="http://www.blogger.com/atom/ns#" term="new year&#39;s"/><title type='text'>Old Money for a New Year</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/100-rials.png&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 103px;&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/100-rials.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;On New Year&#39;s Eve, as I was taking a cab to the train station to pop out to London to spend the night socializing at a friend&#39;s place, my cab driver leaned over while at a stop light and handed me a small bill about the size of Canadian Tire money.  &quot;Here, take this, it will give you luck!&quot; he said.  &quot;And Happy New Year!&quot; &lt;br /&gt;&lt;br /&gt;As I would discover, the bill was 100 Iranian Rials, worth just slightly more than 1¢ Canadian.  Certainly not a large sum of money.  But I appreciate the notion of handing out cash to people as a sign of good luck.  We arrived very quickly after that at my destination, so I didn&#39;t get a chance to get an explanation of whether this was some sort of typical tradition, or if this was just his own idea and a way to dispose of some currency he couldn&#39;t possibly convert, but that wouldn&#39;t really change anything anyway.</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/7870447330191359388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/01/old-money-for-new-year.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/7870447330191359388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/7870447330191359388'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/01/old-money-for-new-year.html' title='Old Money for a New Year'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-5982650675042838006</id><published>2010-01-05T21:05:00.005-05:00</published><updated>2013-07-03T01:36:52.290-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Buzz Aldrin"/><category scheme="http://www.blogger.com/atom/ns#" term="Cosmos"/><category scheme="http://www.blogger.com/atom/ns#" term="Planetary Society"/><category scheme="http://www.blogger.com/atom/ns#" term="space"/><category scheme="http://www.blogger.com/atom/ns#" term="Stephen Hawking"/><title type='text'>Partying With the Greats in Space</title><content type='html'>I won&#39;t be able to make this, but I thought I&#39;d put it out there in case anyone on the West coast is interested.  &lt;a href=&quot;http://www.planetary.org/&quot;&gt;The Planetary Society&lt;/a&gt; will be &lt;a href=&quot;http://planetary.org/celebrate&quot;&gt;hosting an evening&lt;/a&gt; on the 15th with Stephen Hawking, who will be receiving the Cosmos Award, and Buzz Aldrin, who is celebrating his 80th birthday.  &lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Tickets will go quickly.. so jump now if you&#39;re interested!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/5982650675042838006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2010/01/i-wont-be-able-to-make-this-but-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/5982650675042838006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/5982650675042838006'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2010/01/i-wont-be-able-to-make-this-but-i.html' title='Partying With the Greats in Space'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8951599490492075117.post-227400616689469986</id><published>2009-12-17T23:29:00.008-05:00</published><updated>2009-12-18T18:03:09.018-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dave Eggers"/><category scheme="http://www.blogger.com/atom/ns#" term="Max Records"/><category scheme="http://www.blogger.com/atom/ns#" term="movies"/><category scheme="http://www.blogger.com/atom/ns#" term="review"/><category scheme="http://www.blogger.com/atom/ns#" term="Spike Jonze"/><category scheme="http://www.blogger.com/atom/ns#" term="Where The Wild Things Are"/><title type='text'>Where Wild Things Return Us Our Childhoods</title><content type='html'>Last spring I directed a &lt;a href=&quot;http://mpounsett.blogspot.com/2009/03/wild-thing-i-think-i-love-you.html&quot;&gt;bunch of excitement&lt;/a&gt; this way about the first trailer for &lt;span style=&quot;font-style: italic;&quot;&gt;Where The Wild Things Are&lt;/span&gt;, based on the &lt;a href=&quot;http://www.amazon.ca/gp/product/0060254920?ie=UTF8&amp;amp;tag=matthpouns-20&amp;amp;linkCode=xm2&amp;amp;camp=15121&amp;amp;creativeASIN=0060254920&quot;&gt;book of the same name&lt;/a&gt; by Maurice Sendak.  I finally got to see the movie last night, just barely squeaking in before it left the main theatres in the city.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://mpounsett.s3.amazonaws.com/blog-images/max.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 0pt 10px 10px; float: left; cursor: pointer; width: 150px; height: 190px;&quot; src=&quot;http://mpounsett.s3.amazonaws.com/blog-images/max.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; In addition to the excitement, I approached the whole thing with a little bit of fear, too.  &lt;i&gt;Wild Things&lt;/i&gt; is an iconic book from my childhood, and I had to wonder how it was going to be possible to fill a couple of hours from a 350 word story and still be true to the original.  Oh, also while not managing to look distractingly silly with people in Wild Thing suits. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happily, not only was the movie not a disappointment, it completely outstripped all my hopes.  &lt;a href=&quot;http://www.imdb.com/name/nm0005069/&quot;&gt;Jonze&lt;/a&gt; and &lt;a href=&quot;http://www.imdb.com/name/nm1101630/&quot;&gt;Eggers&lt;/a&gt; managed to add depth and detail to Max&#39;s life without breaking the feel of the original story.  They painted a picture of a wildly struggling young boy with all the fear and loneliness of a difficult life at home and the pure happiness and joy of his refuge in simplicity of childhood games and his own imagination.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.imdb.com/name/nm2504006/&quot;&gt;Max Records&lt;/a&gt; was a brilliant pick for Max.  He played the role honestly and perfectly, and incidentally, wins my award for best actor&#39;s name ever. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And the Wild Thing suits weren&#39;t distracting or silly in the least.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mpounsett.blogspot.com/feeds/227400616689469986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mpounsett.blogspot.com/2009/12/where-wild-things-return-us-our.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/227400616689469986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8951599490492075117/posts/default/227400616689469986'/><link rel='alternate' type='text/html' href='http://mpounsett.blogspot.com/2009/12/where-wild-things-return-us-our.html' title='Where Wild Things Return Us Our Childhoods'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>