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

<channel>
	<title>james m allen</title>
	<atom:link href="http://jamesmallen.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://jamesmallen.net</link>
	<description>teacher and computer scientist</description>
	<lastBuildDate>Sun, 05 Feb 2012 12:49:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Getting started with vim</title>
		<link>http://jamesmallen.net/2012/02/02/getting-started-with-vim/</link>
		<comments>http://jamesmallen.net/2012/02/02/getting-started-with-vim/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 15:27:37 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/?p=139</guid>
		<description><![CDATA[I decided it&#8217;s finally time that I learn to properly use a terminal-based editor other than nano, since nano is rather limited when it comes to editing source code. vim seemed like a good choice, but I was so daunted &#8230; <a href="http://jamesmallen.net/2012/02/02/getting-started-with-vim/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I decided it&#8217;s finally time that I learn to properly use a terminal-based editor other than nano, since nano is rather limited when it comes to editing source code. vim seemed like a good choice, but I was so daunted by it. Then I discovered vimtutor &#8211; it&#8217;s a tutorial that takes place entirely in vim, and it&#8217;s nicely paced!</p>
<p>If you&#8217;ve got vim installed on your machine, just run <code>vimtutor</code> at a command prompt and follow the instructions from there. Hello, cursor movement using letter keys!</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2012/02/02/getting-started-with-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PogoPlug as a Siri Proxy</title>
		<link>http://jamesmallen.net/2012/01/29/pogoplug-as-a-siri-proxy/</link>
		<comments>http://jamesmallen.net/2012/01/29/pogoplug-as-a-siri-proxy/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 22:27:54 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/?p=127</guid>
		<description><![CDATA[UPDATE 2012-02-03: I realized I forgot about installing the certificate on the non-4S device. Fixed! UPDATE 2012-02-04: amanpatel pointed out on the ArchLinuxArm forums that you need to make sure base-devel is installed. I&#8217;ve updated the prerequisites section to include &#8230; <a href="http://jamesmallen.net/2012/01/29/pogoplug-as-a-siri-proxy/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE 2012-02-03: I realized I forgot about installing the certificate on the non-4S device. Fixed!</strong></p>
<p><strong>UPDATE 2012-02-04: amanpatel pointed out on the ArchLinuxArm forums that you need to make sure base-devel is installed. I&#8217;ve updated the prerequisites section to include this.</strong></p>
<p>My wife got an iPhone 4S recently, which of course features Siri, the virtual assistant. I didn&#8217;t think I needed a 4S, but I was pretty jealous of Siri. Unfortunately, I don&#8217;t qualify for a discounted upgrade since I got my iPhone4 less than a year ago.</p>
<p>Enter <a href="http://blog.chpwn.com/post/14689740472">Spire</a> by <a href="https://twitter.com/#!/chpwn">@chpwn</a>. Spire lets you install Siri on a jailbroken iPhone, but it requires the use of a proxy that lets non-4S devices pretend to be a 4S. I found lots of instructions for getting a proxy up and running as a virtual machine, but I don&#8217;t like leaving full computers running all the time. I decided to figure out what would be required to make it work with what we had: a PogoPlug server.<span id="more-127"></span></p>
<p>Back in December I picked up a <a href="http://www.google.com/products/catalog?q=pogoplug+pink&amp;hl=en&amp;prmd=imvns&amp;resnum=1&amp;bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&amp;biw=1083&amp;bih=906&amp;um=1&amp;ie=UTF-8&amp;tbm=shop&amp;cid=8086923100599712541&amp;sa=X&amp;ei=RHklT877J8jj0gGZxND4CA&amp;ved=0CEYQ8wIwAA">PogoPlug</a> on sale for $20 shipped from J&amp;R Music/Computer World. $20 for a plug computer that can run a real version of Linux is an awesome deal (I&#8217;m excited about the Raspberry Pi, but that isn&#8217;t available yet). After trying out the installed version of Linux, I decided to put <a href="http://archlinuxarm.org/platforms/armv6/pogoplug-provideov3">ArchLinuxArm</a> on it for some more flexibility. It turns out this device is perfectly suited to act as a SiriProxy server!</p>
<h2>Necessary Items:</h2>
<ol>
<li>Device running ArchLinux (I used a PogoPlug B01 model for this, but I think any other ArchLinux machine will probably work as well)</li>
<li>USB hard disk or flash drive for keeping system files (there isn&#8217;t enough space on the internal flash memory for the entire system)</li>
<li>Router set to redirect traffic on ports 53 and 443 to your PogoPlug if your PogoPlug does not have an external IP address.</li>
<li>iPhone 4S (doesn&#8217;t need to be jailbroken)</li>
<li>iPhone 4 (jailbroken)</li>
</ol>
<div>Acknowledgements: https://gist.github.com/1552448</div>
<p>Okay, now for the work.</p>
<h2>Prerequisites</h2>
<ol>
<li>Make sure you&#8217;ve got your ArchLinux system up and running. I won&#8217;t go into that here &#8211; follow <a href="http://archlinuxarm.org/platforms/armv6/pogoplug-provideov3">the guide on the ArchLinuxArm site</a> if you&#8217;ve got the same PogoPlug model as me.</li>
<li>We&#8217;ve got to install a few packages (explanations for some of them are below). Luckily, pacman can handle these. Login to your box as root and run:
<pre>pacman -Sy dnsmasq git ruby zlib ruby-ncurses ruby-pkgconfig make base-devel</pre>
<p>Note that we will not be using rvm, as many other tutorials for this recommend. rvm is meant to simplify switching between various versions of ruby, but since we have limited resources on our PogoPlug, we&#8217;ll just be making sure that we&#8217;re running the correct version of Ruby system-wide.</li>
<li>We&#8217;ve also got to set up a few Ruby gems. These are pretty automated, but they took a while to complete on my pogoplug:
<pre>gem install rake bundler</pre>
</li>
<li>Make note of your external IP address. If your IP is not static, you&#8217;ll need to make sure you have some sort of dynamic DNS service in place so you can access your pogoplug from outside of your home network.</li>
</ol>
<h2>dnsmasq</h2>
<p><strong>dnsmasq </strong>is a simple DNS forwarder/rewriter. We will use this to spoof the iPhone 4S into talking to our SiriProxy instead of the real Siri servers.</p>
<ol>
<li>Edit <strong>/etc/dnsmasq.conf</strong> and create an entry to redirect <strong>guzzoni.apple.com</strong> to our server (replace <strong>XX.XX.XX.XX</strong>with your IP address), like so:
<pre class="brush: text; gutter: true"># Add domains which you want to force to an IP address here.
# The example below send any host in double-click.net to a local
# web-server.
#address=/double-click.net/127.0.0.1
address=/guzzoni.apple.com/XX.XX.XX.XX</pre>
</li>
<li>Test your configuration by running:
<pre>rc.d checkconfig dnsmasq</pre>
<p>You should receive the following message indicating it works:</p>
<pre>dnsmasq: syntax check OK.</pre>
</li>
<li>Start dnsmasq by running:
<pre>rc.d start dnsmasq</pre>
</li>
<li>You can test that dnsmasq is properly rewriting requests to guzzoni.apple.com by running the following in a Terminal app:
<pre>host guzzoni.apple.com XX.XX.XX.XX</pre>
<p>You should receive a response like the following:</p>
<pre>Using domain server:
Name: XX.XX.XX.XX
Address: XX.XX.XX.XX#53
Aliases:

guzzoni.apple.com has address XX.XX.XX.XX</pre>
<p>Your pogoplug&#8217;s IP address should be showing up in all three places.</li>
</ol>
<h2>Certificates</h2>
<p>SiriProxy uses certificates as part of spoofing the real Siri servers. This can cause some complications if you want to be able to use SiriProxy on your local LAN as well as on the Internet. The solution is to generate a dual certificate.</p>
<ol>
<li>Edit /etc/openssl.cnf. Look for:
<pre>commonName = Common Name (eg, YOUR name)
commonName_max = 64</pre>
<p>and replace it with:</p>
<pre>0.commonName = Common Name (eg, YOUR name)
0.commonName_default = your.dynamic.hostname.com
0.commonName_max = 64
1.commonName = Common Name (eg, YOUR name)
1.commonName_default = guzzoni.apple.com
1.commonName_max = 64</pre>
<p>Change <strong>your.dynamic.hostname.com</strong> to whatever dynamic hostname you are using (<a href="http://freedns.afraid.org/">http://freedns.afraid.org/</a> works really well for me).</li>
<li>Generate the certificates. You will be prompted to enter some things with the lines below &#8211; you should be able to leave most of them set to their default values just by hitting the enter key. The main exception is that you will need to type in passphrases during the generation process &#8211; just pick them when it asks you to come up with one, and re-enter it at the later phases that require it.
<pre>mkdir -p /root/.siriproxy
cd /root/.siriproxy

openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt

openssl genrsa -des3 -out server.key 4096

openssl req -new -key server.key -out server.csr

openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.passless.crt

openssl rsa -in server.key -out server.key.insecure

mv server.key server.key.secure
mv server.key.insecure server.passless.key</pre>
</li>
<li>Copy the ca.crt file to your desktop. I have an <a href="http://archlinuxarm.org/support/guides/applications/samba">SMB server</a> set up on my pogoplug that makes this very simple.</li>
</ol>
<h2>SiriProxy</h2>
<p>There are several forks of SiriProxy. I found the master branch in <a href="https://github.com/plamoni/SiriProxy">plamoni&#8217;s github</a>to work fine for our set up (just two people sharing a single key).</p>
<ol>
<li>Clone the SiriProxy code into /root/SiriProxy using git. (Note: because SiriProxy needs to listen on port 443, it needs to be run as root)
<pre>cd /root
git clone git://github.com/westbaer/SiriProxy.git</pre>
</li>
<li>Use rake to install siriproxy to /usr/lib for system-wide use:
<pre>rake install</pre>
</li>
<li>Bundle siriproxy (I guess this installs any plugins you&#8217;ve set up and updates the certificates. You should run this any time you generate new certificates or change the configuration, I think):
<pre>siriproxy bundle</pre>
</li>
<li>Start the siriproxy server:
<pre>siriproxy server</pre>
</li>
</ol>
<h2>iPhone 4S</h2>
<p>Remember, you don&#8217;t need to jailbreak the iPhone 4S for this to work!</p>
<h3>Install Certificate</h3>
<ol>
<li>E-mail the <strong>ca.crt</strong> file from above to an e-mail account on your iPhone 4S.</li>
<li>Open up the e-mail on your 4S device, then open the certificate by tapping it.</li>
<li>Install the certificate by tapping the <strong>Install</strong> button, then tap <strong>Done</strong>.</li>
</ol>
<h3>Change DNS</h3>
<ol>
<li>Open up the <strong>Settings</strong> app, and go into <strong>Wifi</strong> settings.</li>
<li>Tap on the blue arrow to the right of your wifi network&#8217;s name to get detailed settings.</li>
<li>In the <strong>DNS</strong> field, put the IP address of your pogoplug at the very beginning of the line.</li>
</ol>
<h3>Test SiriProxy</h3>
<ol>
<li>Open up Siri on your 4S device by holding down the Home button, and say &#8220;<strong>Test Siri Proxy.</strong>&#8221; Siri should respond with, &#8220;<strong>Siri Proxy is up and running!</strong>&#8221; You should also see a bunch of lines scroll by on the siriproxy server window.</li>
<li>If you don&#8217;t get anything, then double-check that you have completed everything above. You need your 4S device to have connected to the proxy in order for the rest of these steps to work.</li>
</ol>
<h2>iPhone 4 (not 4S)</h2>
<h3>INSTALL CERTIFICATE</h3>
<p><strong>UPDATE 2012-02-03: I had originally forgotten about this section.</strong></p>
<ol>
<li>E-mail the <strong>ca.crt</strong> file from above to an e-mail account on your iPhone 4S.</li>
<li>Open up the e-mail on your 4S device, then open the certificate by tapping it.</li>
<li>Install the certificate by tapping the <strong>Install</strong> button, then tap <strong>Done</strong>.</li>
</ol>
<h3>Install Siri</h3>
<p>Make sure your jailbroken phone (the one that doesn&#8217;t yet have Siri) is connected to Wifi. Spire will require ~100 MB of data to be downloaded, so this could take a while.</p>
<ol>
<li>Open up <strong>Cydia</strong>, and install the packages <strong>OpenSSH</strong>, <strong>Erica Utilities</strong>, and <strong>Spire</strong>. If you haven&#8217;t set up OpenSSH before and/or you haven&#8217;t set your passwords, you definitely want to do that. Refer to the <a href="http://cydia.saurik.com/openssh.html">Cydia guide</a> for more information on OpenSSH.</li>
<li>Go into the <strong>Settings</strong> app, and choose Spire. Enter <strong>https://your.dynamic.hostname.com</strong> as your proxy host, using the dynamic hostname you are using.</li>
<li>Go back to the main <strong>Settings</strong>, tap on <strong>General</strong>, then <strong>Siri</strong>, and turn Siri on.</li>
<li>Attempt to use Siri by holding down the Home button (the proximity sensor won&#8217;t work with non-4S devices).</li>
<li>After it fails, ssh into your non-4S device (default username: root, default password: alpine). You can get the IP address by looking at your Wifi settings details. Run the following command:
<pre>plutil -show /User/Library/Preferences/com.apple.assistant.plist</pre>
<p>You should get output that looks something like this:</p>
<pre>{
    Accounts =     {
        &quot;12345678-90AB-CDEF-01234-567890ABCDEF&quot; =         {
            &quot;Ace Host&quot; = &quot;665414ff-75ab-42b2-9473-5aa74fb11533&quot;;
            &quot;Assistant Identifier&quot; = &quot;&quot;;
            Hostname = &quot;https://your.dynamic.hostname.com&quot;;
            &quot;Last Assistant Data Anchor&quot; = &quot;&quot;;
            &quot;Last Sync Dates&quot; =             {
                &quot;com.apple.alarm.label&quot; = 2012-01-29 21:33:50 +0000;
                &quot;com.apple.contact.people&quot; = 2012-01-29 21:33:48 +0000;
                &quot;com.apple.media.entities&quot; = 2012-01-29 21:33:52 +0000;
                &quot;com.apple.reminder.list.name&quot; = 2012-01-29 21:33:50 +0000;
            };
            &quot;Speech Identifier&quot; = &quot;&quot;;
            &quot;Validation Expiration&quot; = 2012-01-30 22:01:50 +0000;
        };
    };
    &quot;Session Language&quot; = &quot;en-US&quot;;
}</pre>
<p>If you&#8217;re missing some of the above fields, don&#8217;t worry &#8211; we&#8217;re going to fix that. Pay careful attention to the first string of numbers and letters after the word &#8220;Accounts&#8221; (<strong>12345678-90AB-CDEF-01234-567890ABCDEF</strong> in the example above). This is your unique hex key.</li>
<li>Run the following commands to update your Siri plist file, replacing <strong>12345678-90AB-CDEF-01234-567890ABCDEF</strong> with your unique hex key from above (copy and paste!):
<pre>plutil -key &quot;Accounts&quot; -key &quot;784ECD19-25FD-46E3-A28A-92DFD892255F&quot; -key &quot;Ace Host&quot; -value &quot;&quot; /User/Library/Preferences/com.apple.assistant.plist

plutil -key &quot;Accounts&quot; -key &quot;784ECD19-25FD-46E3-A28A-92DFD892255F&quot; -key &quot;Assistant Identifier&quot; -value &quot;&quot; /User/Library/Preferences/com.apple.assistant.plist

plutil -key &quot;Accounts&quot; -key &quot;784ECD19-25FD-46E3-A28A-92DFD892255F&quot; -key &quot;Speech Identifier&quot; -value &quot;&quot; /User/Library/Preferences/com.apple.assistant.plist</pre>
</li>
<li>Open up Siri on your non-4S device by holding down the Home button, and say &#8220;<strong>Test Siri Proxy</strong>&#8221; just like you did before with the 4S device. Siri should respond with, &#8220;<strong>Siri Proxy is up and running!</strong>&#8221; If you made it this far, congratulations! Siri is working on your non-4S device!</li>
</ol>
<h2>Automating Services on the PogoPlug</h2>
<p>Okay, so we&#8217;ve got it up and running, but if we lose power everything crashes. It would be nice if we could ensure it was automatically started every time our PogoPlug rebooted. To do this, we need to add a daemon script for siriproxy and tell our pogoplug to automatically start dnsmasq and siriproxy.</p>
<p>First, let&#8217;s create an rc.d script for sirirproxy. This is based on the ArchLinux <a href="https://wiki.archlinux.org/index.php/Writing_rc.d_scripts">sample rc.d script</a> for crond. Edit /etc/rc.d/siriproxy to look like the following:</p>
<pre class="brush: bash; gutter: true">#!/bin/bash

. /etc/rc.conf
. /etc/rc.d/functions

DAEMON=siriproxy
ARGS=server

export HOME=/root
PID=`pidof -o %PPID /usr/bin/ruby /usr/bin/$DAEMON`

[ -r /etc/conf.d/$DAEMON ] &amp;&amp; . /etc/conf.d/$DAEMON

case &quot;$1&quot; in
  start)
    stat_busy &quot;Starting $DAEMON&quot;
    if [ -z &quot;$PID&quot; ] ; then
      $DAEMON $ARGS 1&gt;/dev/null 2&gt;/dev/null &amp;
      add_daemon $DAEMON
      stat_done
    else
      stat_fail
      exit 1
    fi
    ;;
  stop)
    stat_busy &quot;Stopping $DAEMON&quot;
    [ -n &quot;$PID&quot; ] &amp;&amp; kill $PID &amp;&gt; /dev/null
    if [ $? = 0 ]; then
      rm_daemon $DAEMON
      stat_done
    else
      stat_fail
      exit 1
    fi
    ;;
  restart)
    $0 stop
    sleep 1
    $0 start
    ;;
  *)
    echo &quot;usage: $0 {start|stop|restart}&quot;
esac</pre>
<p>You will also need to make this file executable:</p>
<pre>chmod a+x /etc/rc.d/siriproxy</pre>
<p>Now that we&#8217;ve got an rc.d script set up, let&#8217;s test it out.</p>
<pre>rc.d restart siriproxy</pre>
<p>Stopping siriproxy may fail, if it wasn&#8217;t already running. Starting siriproxy should print DONE.</p>
<p>Now we just need to make dnsmasq and siriproxy start automatically on boot. Edit /etc/rc.conf, and go down to the end where the start-up daemons are listed. Add dnsmasq and siriproxy inside these parentheses, like so:</p>
<pre>DAEMONS=(set-oxnas-mac !hwclock syslog-ng network netfs crond sshd openntpd samba dnsmasq siriproxy)</pre>
<p>(You may have other things listed differently &#8211; just make sure dnsmasq and siriproxy are in here).</p>
<p>Lastly, reboot your pogoplug by running the following:</p>
<pre>reboot</pre>
<p>Give it a minute or two to start up, then try out Siri on both your 4S device and your non-4S device by saying &#8220;Test Siri Proxy.&#8221; Make sure to pause a little bit between them &#8211; Apple has been known to ban Siri if it&#8217;s used too much.</p>
<p>One final note: it&#8217;s important that the 4S device connects to the proxy at least once a day. This is because it gets new keys from Apple every now and then, which it needs to share with the proxy server in order for the non-4S device to be able to use them.</p>
<p>I hope this helps someone!</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2012/01/29/pogoplug-as-a-siri-proxy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arcade</title>
		<link>http://jamesmallen.net/2011/11/01/arcade/</link>
		<comments>http://jamesmallen.net/2011/11/01/arcade/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 21:38:35 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/?p=149</guid>
		<description><![CDATA[I&#8217;ve been working on restoring old arcade machines as a hobby since 2010, and to document my work better I started a blog called 1up Arcade. Since it doesn&#8217;t really fit with the types of things I post over here, &#8230; <a href="http://jamesmallen.net/2011/11/01/arcade/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-150 alignright" title="IMG_3390" src="http://jamesmallen.net/wp-content/uploads/2012/01/IMG_3390-150x150.jpg" alt="" width="150" height="150" /></p>
<p>I&#8217;ve been working on restoring old arcade machines as a hobby since 2010, and to document my work better I started a blog called 1up Arcade. Since it doesn&#8217;t really fit with the types of things I post over here, I won&#8217;t be cross-posting, but if you&#8217;re interested in that sort of thing, you might want to check out <a href="http://www.1up-arcade.com">www.1up-arcade.com</a>. I take lots of pictures and I don&#8217;t speak in code! <img src='http://jamesmallen.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2011/11/01/arcade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Practical Computer Science (Education) with Python</title>
		<link>http://jamesmallen.net/2010/02/02/practical-computer-science-education-with-python/</link>
		<comments>http://jamesmallen.net/2010/02/02/practical-computer-science-education-with-python/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 21:48:26 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/?p=80</guid>
		<description><![CDATA[Yesterday I gave a presentation at the eTech Ohio conference titled &#8220;Practical Computer Science with Python.&#8221; For the past two years, I&#8217;ve been teaching computer science to upper schoolers at Hathaway Brown School in Shaker Heights, OH, and in the &#8230; <a href="http://jamesmallen.net/2010/02/02/practical-computer-science-education-with-python/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.python.org"><img class="size-full wp-image-90 alignleft" title="Python Logo" src="http://jamesmallen.net/wp-content/uploads/2010/02/python_logo.png" alt="" width="111" height="111" /></a>Yesterday I gave a presentation at the eTech Ohio conference titled &#8220;Practical Computer Science with Python.&#8221; For the past two years, I&#8217;ve been teaching computer science to upper schoolers at Hathaway Brown School in Shaker Heights, OH, and in the presentation I shared some of the reasons why I think Python is an excellent choice for a programming language in an Intro CS course.</p>
<p>I&#8217;ve uploaded the slides from the presentation for your convenience &#8211; next year, I&#8217;ll try to record any presentation(s) and put them online as well!</p>
<p><strong>Slides: </strong><a href="http://jamesmallen.net/wp-content/uploads/2010/02/Practical-Computer-Science-with-Python-eTech-2010.pdf">Practical Computer Science with Python (eTech 2010)</a></p>
<p><strong>Links:</strong></p>
<ul>
<li><a href="http://www.greenteapress.com/thinkpython/thinkpython.html">Think Python: How to Think Like a Computer Scientist</a> (free textbook, great for intro CS courses)</li>
<li><a href="http://www.python.org">Python</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2010/02/02/practical-computer-science-education-with-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Better 7-zip on Windows</title>
		<link>http://jamesmallen.net/2009/10/02/7zunarchiver/</link>
		<comments>http://jamesmallen.net/2009/10/02/7zunarchiver/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 19:39:46 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/?p=76</guid>
		<description><![CDATA[I use Macs and I use Windows PCs. Sometimes I have a choice &#8211; sometimes I don&#8217;t. Overall, I&#8217;m definitely more of a fan of the general &#8220;Mac&#8221; user experience &#8211; focusing on making things &#8220;just work&#8221; with sensible defaults, &#8230; <a href="http://jamesmallen.net/2009/10/02/7zunarchiver/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://jamesmallen.net/wp-content/uploads/2009/10/7zip_logo.png"><img class="alignleft size-full wp-image-94" title="7zip_logo" src="http://jamesmallen.net/wp-content/uploads/2009/10/7zip_logo.png" alt="" width="115" height="115" /></a>I use Macs and I use Windows PCs. Sometimes I have a choice &#8211; sometimes I don&#8217;t. Overall, I&#8217;m definitely more of a fan of the general &#8220;Mac&#8221; user experience &#8211; focusing on making things &#8220;just work&#8221; with sensible defaults, and using as few clicks as possible to get things done.</p>
<p>On Macs, there is a wonderful program called <a href="http://wakaba.c3.cx/s/apps/unarchiver.html">The Unarchiver</a> that &#8220;just works&#8221; for extracting ZIP files. It works very similar to the built-in unzipping functionality, but supports many more file formats. I love it &#8211; when I double-click on a compressed file, it expands it in the current folder, and it&#8217;s very smart about how to do that. If there&#8217;s only one file inside the compressed file, it puts it right in the current folder. If there&#8217;s more than one file, it puts it into an appropriately-named subfolder.<span id="more-76"></span></p>
<p>On Windows, <a href="http://www.7-zip.org/">7-zip</a> is probably the most versatile unarchiving program. 7-zip will extract practically anything you throw at it, and it also is great for creating archives as well. However, it&#8217;s double-click functionality feels very &#8220;Windows&#8221;-like &#8211; it opens up a file-manager style view, and then you have to decide what to do with it. If you set up the context menu, you can right-click on an archive and choose 7-zip -&gt; Extract Here, and it will sort of do what The Unarchiver does&#8230; but not really. It&#8217;s not smart about folder placement/creation, and did I mention you have to right-click then go through a submenu?</p>
<p>I decided to write a script in VBS that would work more like The Unarchiver, and bind this to the default action for double-clicking on any archive files. I&#8217;ve created an installer file that will copy the VBS script to your 7-zip folder, and optionally set up the file associations for you. I haven&#8217;t tested it thoroughly, but it appears to work fine on two of my computers.</p>
<p>Note that this requires that you have 7-zip installed. I recommend installing it to the default directory of C:\Program Files\7-zip, but if you install it somewhere else, just make sure to specify the real 7-zip directory in the 7zunarchiver installer.</p>
<p><a href="http://jamesmallen.net/wp-content/uploads/2009/10/7zUnarchiver.exe">7zUnarchiver Installer v1.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2009/10/02/7zunarchiver/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mobi2Kindle &#8211; MobiPocket books on Kindle</title>
		<link>http://jamesmallen.net/2009/08/14/mobi2kindle/</link>
		<comments>http://jamesmallen.net/2009/08/14/mobi2kindle/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 23:28:38 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[kindle]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[mobi2kindle]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/?p=69</guid>
		<description><![CDATA[Another year, another blog post! If you&#8217;re not interested in reading backstory and just interested in getting MobiPocket DRM-protected books onto your Kindle, check out the Mobi2Kindle page at Google Code. Not too long ago, I won an Amazon Kindle &#8230; <a href="http://jamesmallen.net/2009/08/14/mobi2kindle/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Another year, another blog post! If you&#8217;re not interested in reading backstory and just interested in getting MobiPocket DRM-protected books onto your Kindle, check out the <a href="http://code.google.com/p/mobi2kindle/">Mobi2Kindle</a> page at Google Code.</p>
<p>Not too long ago, I won an Amazon Kindle while attending the CS4HS workshop at CMU (Yay Google and other sponsors!). Perhaps not surprisingly, I fell in love with reading on it. I quickly looked for all the free e-books I could, discovering sites like <a href="http://www.mobileread.com/">MobileRead</a> and <a href="http://feedbooks.com/">FeedBooks</a>, with their ultra-sweet Kindle-based book browsers (Click and download right on the Kindle? Awesome!). However, their selections of recent works are certainly&#8230; lacking. Only a few authors have really embraced free e-book distribution, and while I do love <a href="http://feedbooks.com/author/93">Cory Doctorow</a>, my brain really craved more.</p>
<p><span id="more-69"></span>I investigated the <a href="http://www.heightslibrary.org">local library</a>, which has been a great source of mind-food ever since we moved to Cleveland a couple years ago. Alas, they had nothing expressly for the Kindle &#8211; though they did have an e-library with MobiPocket and Adobe EPub books. I had remembered reading somewhere that the Kindle could do MobiPocket, so I decided to investigate further.</p>
<p>I found out that <a href="http://igorsk.blogspot.com/">Igor Skochinsky</a> had done some investigations into the Kindle&#8217;s handling of MobiPocket DRM, and had put together a set of Python scripts that were supposedly able to convert normal MobiPocket DRM&#8217;d files into a format readable by the Kindle. I tried them out on my own, and lo and behold, I was reading Barack Obama&#8217;s book on my Kindle, straight from the library! Well, not <em>quite</em> straight from the library &#8211; it made some detours on my Mac, involving some Terminal usage and some copying-and-pasting. But it was still pretty sweet!</p>
<p>I decided that dealing with the command-line was not something my wife would be interested in doing, and so I decided to write a little AppleScript application that handled all the tedious stuff, like running the commands. This, in fact, only ended up taking me the lesser part of an afternoon, despite having never worked on a similar project before. However, the end result was a fancy little droplet, that I could simply drag and drop a PRC file onto and get an Amazon-compatible AZW file back.</p>
<p>I contacted Igor, and he gave me permission to redistribute his code. So I created a logo and a Google Code project, and am happy to share it with you, readers of the world! I give you:</p>
<p><a href="http://code.google.com/p/mobi2kindle/"><img class="size-full wp-image-71  alignnone" title="Mobi2Kindle" src="http://jamesmallen.net/wp-content/uploads/2009/08/m2k_logo.png" alt="Mobi2Kindle" width="54" height="55" />Mobi2Kindle!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2009/08/14/mobi2kindle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PEAR with XAMPP on Windows</title>
		<link>http://jamesmallen.net/2008/10/28/pear-with-xampp-on-windows/</link>
		<comments>http://jamesmallen.net/2008/10/28/pear-with-xampp-on-windows/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 14:00:34 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/2008/10/28/pear-with-xampp-on-windows/</guid>
		<description><![CDATA[Alas, I find myself having to do some work on a Windows machine. I also find myself needing some additional PEAR libraries that don&#8217;t come pre-installed as part of XAMPP. I found the below commands in a comment at http://www.tohir.co.za/2006/07/pear-on-xampp-windows.html, and &#8230; <a href="http://jamesmallen.net/2008/10/28/pear-with-xampp-on-windows/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Alas, I find myself having to do some work on a Windows machine. I also find myself needing some additional PEAR libraries that don&#8217;t come pre-installed as part of XAMPP. I found the below commands in a comment at <a href="http://www.tohir.co.za/2006/07/pear-on-xampp-windows.html">http://www.tohir.co.za/2006/07/pear-on-xampp-windows.html</a>, and have taken the liberty to &#8220;re-translate&#8221; them. These instructions will setup MDB2 and the MySQL MDB2 driver on your Windows XAMPP system.Open up a command prompt, and cd to your XAMPP PHP directory. Assuming XAMPP is on your C drive:
<pre>cd \xampp\php</pre>
<pre>go-pear</pre>
<pre>pear install MDB2</pre>
<pre>pear install pear/MDB2#mysql</pre>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2008/10/28/pear-with-xampp-on-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic vhosts with XAMPP on OS X (with special DNS sauce)</title>
		<link>http://jamesmallen.net/2008/09/28/dynamic-vhosts-with-xampp-on-os-x-with-special-dns-sauce/</link>
		<comments>http://jamesmallen.net/2008/09/28/dynamic-vhosts-with-xampp-on-os-x-with-special-dns-sauce/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 20:28:17 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/2008/09/28/dynamic-vhosts-with-xampp-on-os-x-with-special-dns-sauce/</guid>
		<description><![CDATA[I recently &#8220;refreshed&#8221; my Mac &#8211; I&#8217;d accumulated a fair amount of cruft in my attempts to install alternate versions of libraries, and decided that a fresh install of things would clear things up. I kept my wife&#8217;s user profile &#8230; <a href="http://jamesmallen.net/2008/09/28/dynamic-vhosts-with-xampp-on-os-x-with-special-dns-sauce/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I recently &#8220;refreshed&#8221; my Mac &#8211; I&#8217;d accumulated a fair amount of cruft in my attempts to install alternate versions of libraries, and decided that a fresh install of things would clear things up. I kept my wife&#8217;s user profile intact, since she hadn&#8217;t done anything funny in her user directories, but I decided to blow mine away and just put in the things I needed.</p>
<p>Being a web developer (if only part-time at the moment), I found myself having to remember how I went ahead and set up my testing environment so I could do rapid virtual host set-up, and I decided to write it down for posterity&#8217;s sake. This is just my own desired set-up &#8211; your own preferences may vary, but perhaps you&#8217;ll find this useful!</p>
<p><span id="more-63"></span>Some background: I work on sites for many different clients. When it comes to organizing things, I like keeping a folder for each client&#8217;s site (with documents, PSD files, etc.), along with a separate folder for the &#8220;web root&#8221; of the site. I usually keep the web root in Subversion as well (refer to <a href="http://jamesmallen.net/2007/11/11/subversion-on-os-x-with-scplugin-and-sshsvn/">my earlier article</a> for info on setting that up). With the instructions below, I&#8217;ll show you how to easily set things up so you can just create a new folder and have XAMPP automatically get you there, without having to edit any configuration files. With the special DNS sauce, I can even type in a URL like &#8220;http://jamesmallen.net.imac&#8221; and view my local test version of jamesmallen.net.</p>
<p>First off, you need XAMPP. I use the Mac version, available from <a href="http://www.apachefriends.org/en/xampp-macosx.html">Apache Friends</a>. I probably could use OS X&#8217;s built-in Apache server, but I prefer to keep this separate from my &#8220;system&#8221; files, so I can easily drop in different versions of things. XAMPP is nice and self-contained. If you decide to go with XAMPP, make sure you disable Apache by unchecking the &#8220;Web Sharing&#8221; option of the &#8220;Sharing&#8221; system preference pane.</p>
<p>With XAMPP&#8217;s default install, XAMPP will serve pages from /Applications/xampp/xamppfiles/htdocs. This isn&#8217;t a very convenient location, and besides that requires root access/su authentication to edit files. I prefer to keep different websites in my ~/Sites folder (which is part of my Time Machine backup), as I like to think of them as works-in-progress. Once you&#8217;ve decided where you want to put your sites, you need to create a new configuration file to have Apache include.</p>
<p>Save something like the following as a new file called <strong>/Applications/xampp/xamppfiles/etc/extra/httpd-dynamic-vhosts.conf</strong>:<br />
<code>UseCanonicalName Off<br />
VirtualDocumentRoot /Users/james/Sites/%-2+</p>
<p>Options Indexes FollowSymLinks ExecCGI Includes<br />
AllowOverride AuthConfig<br />
Order allow,deny<br />
Allow from all</p>
<p></code></p>
<p>You&#8217;ll want to replace &#8220;/Users/james/Sites&#8221; with whatever folder you&#8217;re using to keep all of your different domains. The <strong>%-2+</strong> indicates that you want to use all but the very last part of the domain name in determining what directory to use. I leave off the last part, because I want to type &#8220;http://mydomain.imac&#8221;, but I don&#8217;t want to have to include the &#8220;.imac&#8221; in every directory I create.</p>
<p>Now you need to include above .conf file, so add the following line to the bottom of <strong>/Applications/xampp/xamppfiles/etc/httpd.conf</strong>:<br />
<code>Include /Applications/xampp/etc/extra/httpd-dynamic-vhosts.conf</code></p>
<p>If you want to be able to access the default xampp htdocs, you&#8217;ll need to create a link to them. The following command in a terminal window will create a symbolic link, letting us keep things separated:<br />
<code>ln -s /Applications/xampp/xamppfiles/htdocs /Users/james/Sites/xampp</code></p>
<p>Again, replace &#8220;/Users/james/Sites&#8221; with whatever root you&#8217;re using.</p>
<p>Finally, the DNS sauce. This will depend on the capabilities of your router. I have an older Linksys WRT54G, which lets me run the most excellent <a href="http://www.polarcloud.com/tomato"></a>. If you don&#8217;t have a highly-configurable router, I highly suggest you get a cheap one that is compatible with Tomato &#8211; it&#8217;s wonderful to have all the power of a Linux box in such a low-power, always-on device. Tomato uses <a href="http://www.thekelleys.org.uk/dnsmasq/doc.html">dnsmasq</a> for DHCP services as well as DNS caching.</p>
<p>First, set up your development machine to have a static IP (using Tomato, you can do this by clicking on the particular machine in the &#8220;Device List&#8221;). Next, get into the advanced dnsmasq configuration by clicking on &#8220;Advanced,&#8221; then &#8220;DHCP / DNS&#8221; in the Tomato menus. Enable the &#8220;Internal Caching DNS Forwarder&#8221; if it isn&#8217;t already enabled, then add the following line to the Custom Configuration box:<br />
<code>address=/.imac/192.168.1.100</code></p>
<p>Replace &#8220;.imac&#8221; with whatever fake TLD you want to create (I used to use &#8220;.dev&#8221; before I started using multiple dev machines). Make sure it isn&#8217;t an ACTUAL TLD, or else you&#8217;ll cut yourself off from all sites that end with that! Also, replace the &#8220;192.168.1.100&#8243; with whatever static IP your dev machine has on the network.</p>
<p>Save the changes, wait for the services to restart, and then fire up XAMPP. I recommend using the XAMPP Control Panel.app to just start the services you need. Test things out by navigating to http://xampp.imac. If all is well, you should see the XAMPP splash page. Congratulations!</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2008/09/28/dynamic-vhosts-with-xampp-on-os-x-with-special-dns-sauce/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Final Cut Express Hates 12-Bit Audio</title>
		<link>http://jamesmallen.net/2008/04/23/final-cut-express-hates-12-bit-audio/</link>
		<comments>http://jamesmallen.net/2008/04/23/final-cut-express-hates-12-bit-audio/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 18:14:01 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/2008/04/23/final-cut-express-hates-12-bit-audio/</guid>
		<description><![CDATA[I&#8217;ve been doing a significant amount of video work lately. This led to my recent purchase of Final Cut Express (It is so wonderful having a brother-in-law who&#8217;s an Apple Store employee), and with it many changes to my typical &#8230; <a href="http://jamesmallen.net/2008/04/23/final-cut-express-hates-12-bit-audio/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been doing a significant amount of video work lately. This led to my recent purchase of Final Cut Express (It is so wonderful having a brother-in-law who&#8217;s an Apple Store employee), and with it many changes to my typical workflow. I&#8217;m used to using Sony&#8217;s Vegas Studio product for any editing that iMovie couldn&#8217;t handle, and while FCE shares many concepts, it also looks at them from a pretty different perspective.</p>
<p>My most recent project involves editing a slew footage of which I was not involved in shooting. One out of five cameras that were recording during the event (a musical) was shot using 12-bit audio. This is my first experience trying to use footage with 12-bit audio in FCE, and frankly, I&#8217;m not impressed.</p>
<p><span id="more-45"></span>It is my understanding that &#8220;12-bit audio&#8221; doesn&#8217;t tell the full story &#8211; besides having a &#8220;vertical&#8221; resolution of only twelve bits, it also has a lower sample rate than 16-bit DV audio. 12-bit has a sample rate of 32,000 Hz, whereas 16-bit has a sample rate of 48,000 Hz. So far, so good.</p>
<p>However, when I import the 12-bit tape into FCE, I get some serious synchronization issues. After about a minute of tape, they&#8217;re noticeable &#8211; by the end of the tape, the audio and video are off by more than a second. FCE has an &#8220;Easy Setup&#8221; option for importing 32KHz DV footage &#8211; I tried this setup, as well as the normal DV setup.</p>
<p>After fiddling with different settings, I came across an Apple KB article about <a href="http://docs.info.apple.com/article.html?artnum=61636">iMovie and 16-bit audio</a>. It describes similar symptoms when exporting a Quicktime movie from iMovie. I decided to try importing the problematic tapes into iMovie, and see if I could follow the suggested instructions for &#8220;converting&#8221; the tapes to 16-bit audio. I should mention that this was using iMovie (HD) &#8217;06.</p>
<p>Well, when I tried outputting the iMovie clips back to a new tape, they were being sent with only 12-bit audio, so no dice there. However, I think I found a workaround that fixes the audio sync issues.</p>
<ol>
<li>Import your DV clips using iMovie.</li>
<li>Save your iMovie project, and then find the .iMovieProject file in the Finder. Right-click it and choose &#8220;Show Package Contents&#8221;.</li>
<li>In the &#8220;Media&#8221; directory inside your iMovie project&#8217;s package, you should see a bunch of .dv files. FCE can work with these, but it doesn&#8217;t like to &#8211; you&#8217;ll have to render any audio before you can hear it, and playback will be SUPER-slow. To work with these files nicely in FCE, you need to convert them to Quicktime movies.</li>
<li>Open up <a href="http://www.squared5.com/">MPEG Streamclip</a> (It&#8217;s free, in case you don&#8217;t already have it). If you&#8217;ve only got one DV clip that you&#8217;re working with, just drag the .dv file to the main window. If you&#8217;re working with multiple files, open up a Batch List window (Cmd+B), and drag all the .dv files into the Batch list.</li>
<li>For your task, you want to &#8220;Export to Quicktime&#8221;, using the following settings:<br />
<img src="http://jamesmallen.net/wp-content/uploads/2008/04/picture-3.png" alt="picture-3.png" /></li>
<p>Note that here we&#8217;re converting the audio to 48 kHz. It may also work if you leave the sound setting at &#8220;Auto&#8221; (which will result in a file with 32 kHz sound) &#8211; this may be &#8220;truer&#8221; to the original footage, and you can leave the upsampling to FCE. YMMV.</p>
<li>You&#8217;ll also want to check out the DV Options by clicking the &#8220;Options&#8221; button at the top right, and make sure that you&#8217;re set up for 4:3 Interlaced (or 16:9, if you&#8217;re using anamorphic 16:9 footage):<br />
<img src="http://jamesmallen.net/wp-content/uploads/2008/04/picture-1.png" alt="picture-1.png" /></li>
<li>Now, start the conversion process, and when it&#8217;s finished, drag the new .mov files into Final Cut, just like importing any other hard disk footage. Voila! No more sound sync problems!</li>
</ol>
<p>I wish I knew why FCE had these issues in the first place &#8211; it seems like a rather significant oversight that projects can&#8217;t cope with these, especially since many consumer camcorders nowadays shoot with 12-bit audio by default. Oh well &#8211; in the future, I&#8217;ll try and make sure all the potential videographers for an event are consistent with 16-bit, now that I know what a pain it is to import.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2008/04/23/final-cut-express-hates-12-bit-audio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GPS</title>
		<link>http://jamesmallen.net/2008/04/14/gps/</link>
		<comments>http://jamesmallen.net/2008/04/14/gps/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 17:35:14 +0000</pubDate>
		<dc:creator>jma</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://jamesmallen.net/2008/04/14/gps/</guid>
		<description><![CDATA[GPS is a church in Cleveland Heights. The site uses WordPress to combine several different types of posts, including blog posts and videos. In order to encourage community interaction, it also features a browser-based chat box. http://www.gpsheights.org/]]></description>
			<content:encoded><![CDATA[<p><img src="http://jamesmallen.net/wp-content/uploads/2008/05/gps_large.jpg" class="bordered" alt="GPS" /></p>
<p><span id="more-52"></span></p>
<p>GPS is a church in Cleveland Heights. The site uses WordPress to combine several different types of posts, including blog posts and videos. In order to encourage community interaction, it also features a browser-based chat box.</p>
<p><a href="http://www.gpsheights.org/">http://www.gpsheights.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jamesmallen.net/2008/04/14/gps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

