<?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>Never Say Devil</title>
	<atom:link href="http://blog.nsdev.org/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.nsdev.org</link>
	<description>Get a hoop, I feel like jumping!</description>
	<lastBuildDate>Tue, 17 Aug 2010 19:04:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Beethoven&#8217;s hidden song inside Moonlight Sonata</title>
		<link>http://blog.nsdev.org/?p=276</link>
		<comments>http://blog.nsdev.org/?p=276#comments</comments>
		<pubDate>Tue, 17 Aug 2010 19:04:52 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Art]]></category>
		<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=276</guid>
		<description><![CDATA[I was messing around one day, with the kids, and we were changing the tempo on our home Casio Electronic Piano. It had Moonlight Sonata built into it as a demo song, and we had tried playing it at 255 bpm. Suddenly a completely different song emerged, and I found it really exciting and unexpected. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D276">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D276&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>I was messing around one day, with the kids, and we were changing the tempo on our home Casio Electronic Piano. It had Moonlight Sonata built into it as a demo song, and we had tried playing it at 255 bpm. Suddenly a completely different song emerged, and I found it really exciting and unexpected. The kids and I listened to it over and over again amazed that the song had been structured in such a way that by increasing the tempo, a hidden song was perceived.</p>

	<p>So, a while ago I decided to find a <span class="caps">MIDI</span> rendition of Moonlight Sonata and run it through Propellerhead Reason, and produce a couple of MP3s showing the original file, and the faster one. I&#8217;ve attached links to those, here. Enjoy.</p>

	<p><a href='http://nsdev.org/~neal/Sonata/MoonlightSonata95bpm.mp3' >Moonlight Sonata 95bpm</a><br />
<a href='http://nsdev.org/~neal/Sonata/MoonlightSonata255bpm.mp3' >Moonlight Sonata 255bpm</a></p>

	<p>As near as I can figure, this provides some proof that Beethoven planned his songs by producing a framework that is a song in its own right. Then an embellishment layer was applied to that song to fill in the gaps as the appropriate tempo was applied. I wonder how many other songs follow this pattern?</p>

	<p>Please be kind, this is on my home server, and likely won&#8217;t stand up to diggs, boing boings, or slashdotting. Mirror first before advertising elsewhere, thanks.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=276</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://nsdev.org/~neal/Sonata/MoonlightSonata95bpm.mp3" length="11149828" type="audio/mpeg" />
<enclosure url="http://nsdev.org/~neal/Sonata/MoonlightSonata255bpm.mp3" length="4157538" type="audio/mpeg" />
		</item>
		<item>
		<title>Android 2.2 Breaks &#8220;Say Time&#8221; Application</title>
		<link>http://blog.nsdev.org/?p=264</link>
		<comments>http://blog.nsdev.org/?p=264#comments</comments>
		<pubDate>Sun, 18 Jul 2010 01:03:51 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=264</guid>
		<description><![CDATA[So, I&#8217;ve upgraded my phone to Android 2.2 and noticed that my Say Time application stopped working. So I did some research into why. Apparently the old system of MEDIA_BUTTON intent priorities wasn&#8217;t good enough for Google and they decided to change it to another, very different, method. Here&#8217;s how it works: Any Android application [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D264">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D264&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>So, I&#8217;ve upgraded my phone to Android 2.2 and noticed that my Say Time application stopped working. So I did some research into <a href="http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html">why</a>. Apparently the old system of <span class="caps">MEDIA</span>_BUTTON intent priorities wasn&#8217;t good enough for Google and they decided to change it to another, very different, method. Here&#8217;s how it works:</p>

	<p><ul></p>
	<p><li>Any Android application can request that it become the current MediaButtonReceiver. This puts that application onto the stack and it becomes the <span class="caps">SOLE</span> receiver of media button presses.</li><br />
<li>If another application comes along and requests to be the MediaButtonReceiver, the current application is never sent any <span class="caps">MEDIA</span>_BUTTON events.</li><br />
</ul></p>

	<p>In my application, I had simply set it to be a <span class="caps">MEDIA</span>_BUTTON intent receiver with a high priority. And then when I got a press, I would either abort the broadcast (become the sole receiver) or choose not to abort the broadcast (passing it on to any other applications interested in getting <span class="caps">MEDIA</span>_BUTTON presses). This allowed my application to cooperate nicely with other applications using that button (on the headset) as input.</p>

	<p>Now, my application is no longer able to easily cooperate with other applications. I could start a thread that calls registerMediaButtonReciever() and makes sure my application is always the <span class="caps">SOLE</span> receiver, then unregister again to allow the last receiver to get their presses again. When the unregister is called, the previous application that has registered becomes the <span class="caps">SOLE</span> receiver once again. But, the fact that I have to have a thread running all the time whether the button is pressed or not means my application will consume battery power, and I don&#8217;t like that.</p>

	<p>I looked at the source code for the Music application, and it calls registerMediaButtonReceiver() every time a new music track begins playing. This basically steals the <span class="caps">MEDIA</span>_BUTTON events from any other application that might want to get them.</p>

	<p>I have no idea how I would be able to influence Google to change their <span class="caps">API</span> to allow some way of knowing when another application has registered thereby replacing the current media button receiver. I think if I had that type of <span class="caps">API</span>, I would be able to avoid having to write a thread to set it all the time.</p>

	<p>I&#8217;ll be trying the thread approach, and hopefully it solves my problem without becoming a battery drain. If anyone has any other ideas, please let me know. Thanks.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=264</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SayTime v1.2.0</title>
		<link>http://blog.nsdev.org/?p=260</link>
		<comments>http://blog.nsdev.org/?p=260#comments</comments>
		<pubDate>Sun, 13 Jun 2010 21:22:08 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=260</guid>
		<description><![CDATA[Today I worked on SayTime for a little while and added a Settings menu item so that you can set which trigger(s) you want to use, how long the application will ignore triggers, and whether to pass the button broadcasts on to other applications in the phone or to cancel the broadcasts while the application [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D260">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D260&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>Today I worked on SayTime for a little while and added a Settings menu item so that you can set which trigger(s) you want to use, how long the application will ignore triggers, and whether to pass the button broadcasts on to other applications in the phone or to cancel the broadcasts while the application is sleeping.</p>

	<p>If you can think of any more settings you&#8217;d like, I&#8217;d be happy to try and work them into the application.</p>

	<p>Update: Apparently a German fellow thinks my program sucks. Well, at least that&#8217;s something. <img src='http://blog.nsdev.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=260</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SMS To Twitter Gateway Source Code</title>
		<link>http://blog.nsdev.org/?p=257</link>
		<comments>http://blog.nsdev.org/?p=257#comments</comments>
		<pubDate>Tue, 08 Jun 2010 03:11:02 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=257</guid>
		<description><![CDATA[I&#8217;ve created a GitHub page with the SmsTweeter application, and so you can dig into the source code of it, if you like. I&#8217;ll be using GitHub as the place where the code for this application is maintained. I expect I won&#8217;t have a lot of time to maintain this, but it does work, and [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D257">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D257&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>I&#8217;ve created a GitHub page with the <a href="http://github.org/thorinside/SmsTweeter">SmsTweeter</a> application, and so you can dig into the source code of it, if you like. I&#8217;ll be using GitHub as the place where the code for this application is maintained. I expect I won&#8217;t have a lot of time to maintain this, but it does work, and it might be useful for someone else.</p>

	<p>I will be releasing the application on the Android Market as soon as I give it a bit of polish and make an icon for it.</p>

	<p>Enjoy.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=257</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android SMS to Twitter Gateway</title>
		<link>http://blog.nsdev.org/?p=246</link>
		<comments>http://blog.nsdev.org/?p=246#comments</comments>
		<pubDate>Sun, 30 May 2010 17:05:16 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=246</guid>
		<description><![CDATA[Recently, when my wife and I went on a trip to New York, we wanted our son to be able to SMS us without incurring the extra high costs associated with international SMS messages. I looked around for solutions to the problem and found nothing that did what I was looking for. Here&#8217;s what I [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D246">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D246&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>Recently, when my wife and I went on a trip to New York, we wanted our son to be able to <span class="caps">SMS</span> us without incurring the extra high costs associated with international <span class="caps">SMS</span> messages. I looked around for solutions to the problem and found nothing that did what I was looking for. Here&#8217;s what I wanted to do:</p>

	<p><ul></p>
	<p><li>I wanted my son to be able to <span class="caps">SMS</span> me for free.</li><br />
<li>I wanted to be able to know my son had SMSed me, and be able to respond to him for free.</li><br />
</ul></p>

	<p>My wife and I both have Android based phones. I have a little bit of skill in trying to write Android applications. Since it is Java, which I&#8217;ve got a lot of experience with, I have been able to write small applications that seem to work. I figured I&#8217;d be able to leave my wife&#8217;s Android phone at home attached to WiFi and make it into a gateway for <span class="caps">SMS</span> messages.</p>

	<p>I have found that Direct Messages do <span class="caps">NOT</span> currently support the new Annotation feature. This is a real problem. Because of this, I don&#8217;t believe I can use this feature for my implementation and will have to look at other ways of doing this.</p>

	<p>So I set out to design and implement something that would allow <span class="caps">SMS</span> messages to be forwarded to somewhere on the internet, and then when responded to on the internet would cause the gateway to send those <span class="caps">SMS</span> messages back to the original sender. But what would I use for the &#8216;internet&#8217; portion of the application? I could have written a small <span class="caps">TCP</span>/IP socket server to do this, or, use something that is already on the internet and running 24/7. I chose Twitter as the forwarding service. So the application was starting to look like the following:</p>

	<p><ul></p>
	<p><li>Sending phone sends an <span class="caps">SMS</span> to gateway phone.</li><br />
<li>Gateway phone recieves <span class="caps">SMS</span> message.</li></p>
        <li>Gateway uses a preconfigured Twitter account (the <span class="caps">SMS</span> forwarding account) to Direct Message another Twitter account (the receiving account).</li><br />
<li>Recieving Twitter user sends a reply to the Direct Message</li><br />
<li>Gateway detects the reply to the direct message.</li><br />
<li>Gateway forwards the reply text as an <span class="caps">SMS</span> to the original sending phone number.</li><br />
<li>Sending phone receives the <span class="caps">SMS</span> from the gateway phone.</li><br />
</ul>

	<p>So, there are a few problems with this that don&#8217;t seem to be easy to solve with the current Twitter APIs. First, the gateway must poll for DM replies. Second, the DM messages do not carry any information related to exactly which message is being replied to. This is where Twitter&#8217;s new Annotation feature (due to be released soon) may come in handy.</p>

	<p>Using Annotations, the original sender of the <span class="caps">SMS</span> message could be tagged to the Direct Message. I would hope that the annotation would also be passed on to the DM reply when the user replies to the DM, however it may be up to the twitter client to be able to handle the annotations in this fashion.</p>

	<p>If that is the case, it may be necessary to write a specialized twitter client that knows how to handle the annotations, and makes sure the annotation is copied from the original DM and passed to the reply DM so that the gateway knows who the message is intended for (knows the original <span class="caps">SMS</span> phone number).</p>

	<p><h3>During the Twitter Annotation Hackfest</h3></p>

	<p>My first question at the hackfest was whether Twitter Annotations are carried on Direct Messages. The answer was a resounding <strong>No</strong>. So, I needed to rethink the initial design ideas, and take a step back, coming at it from another angle.</p>

	<p>So, Direct Messages wouldn&#8217;t help me. How could I do a very similar thing using just Twitter Status messages. Accounts can be marked so that their timelines are private. This is of course optional. No matter, the content of a stream is like a subscription. Why not just post the SMSs coming into the gateway as status updates. Then if we annotate each status update with information about the original <span class="caps">SMS</span> phone number, we can direct replies back to the original phone.</p>

	<p>The only drawbacks to this are that the replies will now be public unless both user accounts have a private timeline, and the phone number is also available if the <span class="caps">SMS</span> forwarding account has a public timeline. The latter can be solved with some encryption of the phone number information.</p>

	<p>What does this look like now?</p>

	<p><ul></p>
	<p><li>Phone sends <span class="caps">SMS</span> message to the gateway Android phone.</li><br />
<li>Gateway Android phone updates a Twitter status for a special <span class="caps">SMS</span> account. Applying an annotation referring to the sender phone number</li></p>
        <li>Any twitter user subscribed to that <span class="caps">SMS</span> account&#8217;s twitter feed will be notified of the new <span class="caps">SMS</span> in their friend stream.</li><br />
<li>Any user can reply to the status updates. As long as the reply is valid, the <span class="caps">SMS </span>Gateway program will detect them.</li>
        <li><span class="caps">SMS </span>Gateway program polls for replies until 10 minutes of inactivity occurs.</li>
        <li>When a new reply is detected, the original status message is fetched from Twitter, and the annotations are used to determine where the <span class="caps">SMS</span> reply needs to be sent.</li><br />
<li><span class="caps">SMS </span>Message is sent to the original sender.</li><br />
</ul>

	<p>In this way, we have established a way for <span class="caps">SMS</span> to get into Twitter and be responded to by anyone subscribed to the Gateway&#8217;s twitter account. This could allow for a &#8216;help desk&#8217; like model. But of course the original idea was to provide a way so that international <span class="caps">SMS</span> charges could be avoided for people with internet access.</p>

	<p>Of course, the application developed at the hackfest will only be useful if Twitter releases their annotation feature as planned, sometime later this year. I&#8217;ve had a great time at the hackfest and look forward to seeing the demonstrations.</p>

 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=246</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SayTime 1.1.0</title>
		<link>http://blog.nsdev.org/?p=244</link>
		<comments>http://blog.nsdev.org/?p=244#comments</comments>
		<pubDate>Sat, 29 May 2010 16:54:45 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[saytime]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=244</guid>
		<description><![CDATA[A small update to the SayTime application to allow it to be run on Android 2.1 based phones. I have recently updated my phone to 2.1, and have been missing the ability to ask what time it is without taking my phone out of my pocket all the time. Other than the update to the [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D244">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D244&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>A small update to the SayTime application to allow it to be run on Android 2.1 based phones. I have recently updated my phone to 2.1, and have been missing the ability to ask what time it is without taking my phone out of my pocket all the time. Other than the update to the new <span class="caps">API</span>, nothing else has changed.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=244</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SayTime for Android</title>
		<link>http://blog.nsdev.org/?p=241</link>
		<comments>http://blog.nsdev.org/?p=241#comments</comments>
		<pubDate>Mon, 29 Mar 2010 04:38:58 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[saytime]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=241</guid>
		<description><![CDATA[I&#8217;ve been developing a small Android application for my own personal use for the last few months. The recent release of the paid market applications has recently got me interested in writing code for Android again, so I thought I&#8217;d spend the day to simplify the application, and make it available for free. This application [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D241">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D241&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>I&#8217;ve been developing a small Android application for my own personal use for the last few months. The recent release of the paid market applications has recently got me interested in writing code for Android again, so I thought I&#8217;d spend the day to simplify the application, and make it available for free.</p>

	<p>This application only runs on Android 1.5 right now. See the previous post for the reason why that&#8217;s an issue for me.</p>

	<p>The application listens for button presses on the headset (media) button, and speaks the time. It also has a small application where you can touch the clock and it will speak the time. That&#8217;s all it does. It is currently written to work with either the Text To Speech Extended library, or if you have it installed, the Donut Backport of the Pico <span class="caps">TTS </span>(which you can buy on the appstore for $0.99).</p>

	<p>When you press the media button, the <span class="caps">LED</span> light on the phone will turn green. When you let go of the button, the light will turn violet and you&#8217;ll have 30 seconds to press it to control other applications like the music player. SayTime will eat the first button press, and set a 30 second timer. After 30 seconds the violet <span class="caps">LED</span> will go off and you will be able to ask for the time again.</p>

	<p>Sure, it&#8217;s complicated. But it&#8217;s better than interrupting your music to hear the time. I&#8217;ve been my own beta tester for many commutes. Listening to music, and periodically wondering what time it is, and pressing the button. It works for me. I hope someone else finds it useful.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=241</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rogers and the Squashing of Personal Freedom</title>
		<link>http://blog.nsdev.org/?p=233</link>
		<comments>http://blog.nsdev.org/?p=233#comments</comments>
		<pubDate>Tue, 09 Feb 2010 04:54:25 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Corporate Evil]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[evil]]></category>
		<category><![CDATA[htc dream]]></category>
		<category><![CDATA[rogers]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=233</guid>
		<description><![CDATA[Rogers Completely Screws Canadians, leaving them out in the cold without their data plans in one of the worst public relations moves in recent recorded Canadian history.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D233">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D233&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>Most of the people who know me have already heard this story, over and over, until their ears have been bleeding. I&#8217;m afraid I&#8217;m probably getting quite the reputation as an obsessive compulsive because of it too. That&#8217;s really just too bad, folks. Here&#8217;s another dose of crazy for you. First I&#8217;ll set the stage for those of you who might not know what&#8217;s been going on up here in Canada.</p>

	<p>Last year, around June, 2009, I was excited to hear that Rogers Wireless, one of the two major wireless carriers in Canada, released the first Android powered phones the <span class="caps">HTC </span>Dream and the <span class="caps">HTC </span>Magic. My friend Andy, on TMobile in the US had had a <span class="caps">G1 </span>(HTC Dream) for nearly a year at that point, so we were already far behind the technology curve as usual. Being Canadian we&#8217;re used to this, of course: many of us are still trapping for furs and selling them to the Hudson&#8217;s Bay Company. I decided to sell my snowshoes and buy a cellphone contract.</p>

	<p>I quickly learned what a joy this little cellphone could be. I began to develop small programs that showed my location on a map, and learned as much as I could about the technology, the operating system, and how even how to compile the operating system from source code and deploy parts of it to my phone. The platform was sufficiently malleable to allow quite a bit of experimentation. People from all over the world began brewing their own Android OS variants, and I tried many of these out on my phone, but I always came back to a distribution called <a href="http://www.cyanogenmod.com/">CyanogenMod</a>, produced by <a href="http://twitter.com/cyanogen">Steve Kondik</a>. His Donut based (Android 1.6) distribution was consistently faster than the stock operating system my phone came with, and I learned to make it even faster by employing a 10 <span class="caps">MB </span>(on a phone even 10 MB of extra <span class="caps">RAM</span> is a noticable improvement) modification to the kernel&#8230; stealing <span class="caps">RAM</span> from the 3D Graphics processor and giving it back to the operating system (like Robin Hood stealing from the rich&#8230; a little). I even started writing an application that would speak the current time through the headphones when the headset button was pressed, so I didn&#8217;t have to take my phone out of my pocket while commuting in<a href="http://en.wikipedia.org/wiki/Climate_of_the_Arctic"> Canada&#8217;s frigid winter weather</a>.</p>

	<p>In September of last year, a bug was found and fixed in the Android operating system. The problem was that if you had your <span class="caps">GPS</span> enabled on your phone, and you made a 911 call, your phone might lock up. The danger being: you might freeze to death before they could send help. CyanogenMod had the bug fixed and out to the masses within a few days. Updates were quick due to an efficient over-the-net software distribution mechanism called <a href="http://www.cyanogenmod.com/tag/cm-updater">CmUpdater</a>.</p>

	<p>Recently my world was shattered by an upgrade that <a href="http://www.youtube.com/watch?v=7yiTRsazsCM">Rogers Wireless</a> decided to force upon its customers. Here&#8217;s how they did it: they first cut off all of the <span class="caps">HTC </span>Dream and <span class="caps">HTC </span>Magic users&#8217; data plans. Never mind that they may have been trying to navigate through the Northern Tundra using Google Maps, or waiting for that email about their profits from selling their beaver pelts. Rogers said &#8216;No Data For You!&#8217; until every user upgraded their phones using software not even compatible with Windows 7. They did promise one month credit on our Data plans. The upgrade, that was supposed to take 20 minutes, ended up taking me well over two hours to do my wife&#8217;s phone and mine. I guess that&#8217;s worth a free month on each of our data plans?</p>

	<p>After the upgrade, I found that I was no longer able to use CyanogenMod! They had patched all of the holes that allowed those freedoms. They had pretended to fix a 911 bug and had instead turned my lovely phone into an antiquarian communications device. The new world of Android 1.6, and the promises of Android 2.1 are no longer available to me. Rogers had thrown me outside in the cold Canadian winter without my coat on, and left my there to die a lonely death while waiting for my three year contract to run out so that I would then be eligible for an upgrade.</p>

	<p>Rogers has told me that they will not supply an upgrade from Android 1.5 to Android 1.6 on the <span class="caps">HTC </span>Dream due to a &#8216;memory limitation&#8217; on this device. Strange that I was able to run Android 1.6 on this device just fine for many months. Rogers has now been telling us that they are <a href="http://androidandme.com/2010/01/carriers/rogers-wireless-to-upgrade-dream-owners-to-magic/">willing to upgrade our phones</a> to <span class="caps">HTC </span>Magic devices, and that they will be updating the Magic phones to Android 2.1 sometime in the future. There&#8217;s two problems with this plan. The first is that I prefer a device with a physical keyboard, which the Dream has and the Magic does not. The second problem with this plan is that while the upgrade to the Magic is free, Rogers will be &#8216;resetting&#8217; our contracts another 3 years from the date of the swap. Why would I want to be stuck with a smartphone for three years when the current rate of progress on these devices is so high? In three years I&#8217;ll have a phone that manufactures beaver pelts from yogurt atoms, and sells the results on eBay without any user interaction whatsoever. Does it really make any sense to lock me into a device for three years?</p>

	<p>I guess I shouldn&#8217;t have signed a contract with Rogers, should I? So, what should I do about this problem? I&#8217;ve decided to be as vocal as I can about it and have contacted Rogers to begin escalating the issue until I am satisfied once again. I figure I have nearly three years. So this weekend I began my small campaign. Here&#8217;s a few of my favourite quotes so far:</p>

	<p><blockquote>We are very sorry that we are unable to assist you further with this<br />
matter; and hope you will remain loyal to Rogers to allow us to<br />
provide you with superior customer service down the road.</blockquote></p>

	<p>I love the dismissive tone here. You can be assured that they will hear a great deal from me on this matter.</p>

	<p>I&#8217;ll leave you with some late breaking news. If you don&#8217;t upgrade your phone to the latest firmware, <a href="http://forum.xda-developers.com/showthread.php?p=5575737#post5575737">Rogers will keep your data plan cut off</a>. If you upgrade your phone&#8217;s radio software but leave CyanogenMod on your phone you will still have your data plan cut off. This reminds me, very much, of the type of warfare that the satellite providers used to do against the various satellite hacking devices out there. It&#8217;s just like Rogers is sending out Electronic Counter Measures against people who like to have a newer version of the Android operating system. That, in my opinion, is definitely not a crime.</p>

	<p>The only way to get your data plan back is to comply with Rogers and install their Mandatory Upgrade (read downgrade). I have to be clear, I have complied with the upgrade orders, and my data plan is working fine. They have even stopped sending me several text messages and phoning my cellphone twice a day. So that&#8217;s good. They&#8217;re no longer harassing me. However now my phone is as useless as a skipping stone for killing beavers with.</p>

	<p>I will be writing emails to the office of the president, and the office of the ombudsman starting tomorrow. Next I will be phoning them. I must have developed a form of <span class="caps">OCD</span> late in life. Or it has quietly been simmering for a long time. Either way, I&#8217;m not going to sit idly by and watch while Canadians everywhere are being frozen. We deserve better customer service than this!</p>

	<p><span class="caps">UPDATE</span>:</p>

	<p>Rogers told me to contact <span class="caps">HTC</span> tech support. <span class="caps">HTC</span> has said they can&#8217;t do anything without the express permission of Rogers. I have just got off the phone with Rogers tech support and have been told that there is a <a href="http://www.rogers.com/htcwaiver">waiver</a> form that can be signed by users who do not wish to upgrade their phones to the latest Rogers Mandatory User Update. This doesn&#8217;t help me, but it may allow <span class="caps">HTC</span> to provide me with a fix to solve the issue I have with not being able to flash my firmware any more. I will continue to pursue that angle of it. Thanks to Ian M. at Rogers tech support for being so helpful.</p>

	<p><span class="caps">ANOTHER UPDATE</span>:</p>

	<p><span class="caps">HTC</span> has flat out told me they will not be producing any more software for the <span class="caps">HTC </span>Dream. I guess they&#8217;ve moved on now that their new products are coming out with Android 2.1 on them. Oh well, I guess it&#8217;s back to learning to re-love the Android 1.5 again. I doubt very much that Rogers will find a way to help me with these issues either. I guess I&#8217;ll just have to hope for another local root exploit in the Linux kernel this version of the phone is released with.</p>

	<p><span class="caps">YET ANOTHER UPDATE</span>:</p>

	<p>Absolutely no response from <span class="caps">HTC</span> so far. My wife&#8217;s <span class="caps">HTC </span>Dream has been malfunctioning since the <span class="caps">RUU</span> update, so she phoned Rogers to get a replacement. I got onto the call and talked the <span class="caps">CSR</span> into replacing my Dream with an <span class="caps">HTC </span>Magic. My friend Denis has one and seemed quite happy with it. Rogers has committed to upgrading it to Android 2.1 which is really all I want in the end. So I&#8217;ll wait for it to be delivered, and hopefully Rogers will stick to their promises in the future. I wonder if the phrase &#8216;I dearly hope this call is being recorded because I really want your management to hear how truly terrible my customer satisfaction experience has been.&#8217; helped with getting the Magic well after any replacement plan was over. Rogers, I&#8217;m still watching you, but you&#8217;re not in my bad books anymore. Keep it up. Please, listen to those of us who want to help with Android Open Source development and build in a way to allow us to do so without becoming criminals in the process. Thanks.</p>

	<p>I am also not the only one out there who&#8217;s upset. Here&#8217;s a link to a <a href="http://www.fabianrodriguez.com/blog/2010/02/17/rogers-canada-how-not-to-sell-android/">blog posting</a> collecting the works of all of us &#8216;complainers&#8217;. I feel much better knowing I&#8217;m not the only one in Canada with these feelings.</p>

 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=233</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Complexities of Life</title>
		<link>http://blog.nsdev.org/?p=231</link>
		<comments>http://blog.nsdev.org/?p=231#comments</comments>
		<pubDate>Wed, 09 Dec 2009 04:34:59 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[everything]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[universe]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=231</guid>
		<description><![CDATA[Yes, it has been quite a while since I wrote an entry, dear diary. It is not that you have offended me, or that you have forsaken me, or even ignored me. My life, of which you are blissfully unaware, has been quite busy of late. Yes, quite busy. First, I left my old job [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D231">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D231&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>Yes, it has been quite a while since I wrote an entry, dear diary. It is not that you have offended me, or that you have forsaken me, or even ignored me. My life, of which you are blissfully unaware, has been quite busy of late. Yes, quite busy.</p>

	<p>First, I left my old job working on computer-vision related software for automated security camera surveillance. I had worked on that software for the bulk of five years. It seems like quite a long time to be working on the same thing, at least for me. I suppose many other people spend 10, 15, even 25 years or more at the same job. I&#8217;m afraid that would drive me completely cuckoo. I took a job at a small Calgary firm specializing in enabling medical imaging applications to be distributed to less powerful computers, even over the web. It seems a very promising business to be in, and I look forward to helping out as much as I can.</p>

	<p>I&#8217;ve been writing most of the software I&#8217;ve needed to write using Microsoft Silverlight 3. These medical imaging applications really work well over Silverlight. Much faster than the old Flash applications that they were written in. Though, I really wish we had a graphic designer familiar with Silverlight on the team. I find it really hard to stand in both the designer and the developer camps. I&#8217;ve been doing some evaluation of Silverlight 4, and I am really happy that it is going to mean very few changes to our existing code base.</p>

	<p>So, sometime along the way, Bonnie and I decided it was time to look into selling our house and moving into another, larger, one. We found a house we liked, and we had to sell our old house in order to make an acceptable offer on this house. We did that in 4 days on the market. We were able to get a very good price for our old house, and so we were able to afford to move into a house that is in a more interesting neighborhood, closer to malls, restaurants, libraries, pools, and so on. I can walk to the train (or take a bus in 5 minutes if it&#8217;s cold). And my commute has gone from 3 hours per day down to a little under 2. It seems like a lot, but really it&#8217;s not so bad, I don&#8217;t have to do very much so I get a lot of music listening and reading done.</p>

	<p>Bonnie and I were scheduled to go on a vacation after we sold our house, but Aedan and I both came down with <span class="caps">H1N1</span> and we had to cancel the trip. We&#8217;ll go sometime in the spring instead. I think it&#8217;ll work out a lot better that way.</p>

	<p>All of this happened between September 15th and the start of December. And so, now, it&#8217;s snowy, cold, and nearly Christmas again. Time for work Christmas parties, and lots of squeaky boots on ice and snow.</p>


 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=231</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blessed Relief</title>
		<link>http://blog.nsdev.org/?p=228</link>
		<comments>http://blog.nsdev.org/?p=228#comments</comments>
		<pubDate>Fri, 21 Aug 2009 15:43:58 +0000</pubDate>
		<dc:creator>thorinside</dc:creator>
				<category><![CDATA[Announcement]]></category>

		<guid isPermaLink="false">http://blog.nsdev.org/?p=228</guid>
		<description><![CDATA[So, my wife didn&#8217;t like seeing a picture of me, sick in bed and all ugly, on the blog every morning when she logged in, so I&#8217;ve nuked that post. You&#8217;re welcome.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D228">
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.nsdev.org%2F%3Fp%3D228&amp;style=normal" height="61" width="50" />
			</a>
		</div>	<p>So, my wife didn&#8217;t like seeing a picture of me, sick in bed and all ugly, on the blog every morning when she logged in, so I&#8217;ve nuked that post. You&#8217;re welcome.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blog.nsdev.org/?feed=rss2&amp;p=228</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
