<?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>Matt Keally&#039;s Blog &#187; programming</title>
	<atom:link href="http://www.keally.org/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.keally.org</link>
	<description>Life of the ABD grad student...</description>
	<lastBuildDate>Sat, 10 Dec 2011 02:55:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Introducing FeedMod: Clean out your Facebook News Feed</title>
		<link>http://www.keally.org/2010/12/08/introducing-feedmod-clean-out-your-facebook-news-feed/</link>
		<comments>http://www.keally.org/2010/12/08/introducing-feedmod-clean-out-your-facebook-news-feed/#comments</comments>
		<pubDate>Wed, 08 Dec 2010 20:32:51 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[machinelearning]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[socialnetworking]]></category>
		<category><![CDATA[statistics]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=1370</guid>
		<description><![CDATA[In my last post, I wrote about the shortcomings of email and why I think it should be replaced to reduce spam and misuse.  Someone then commented that he found Facebook spam to be much more of a pain than email spam, considering that Gmail did a solid job of spam filtering.  While the focus [...]]]></description>
			<content:encoded><![CDATA[<p>In my last post, I wrote about the <a href="http://www.keally.org/2010/11/18/email-is-broken-a-case-study/">shortcomings of email</a> and why I think it should be replaced to reduce spam and misuse.  Someone then commented that he found <a href="http://www.keally.org/2010/11/18/email-is-broken-a-case-study/#comment-407">Facebook spam to be much more of a pain than email spam</a>, considering that Gmail did a solid job of spam filtering.  While the focus of my post was more on curbing misuse rather than spam, the comment got me thinking.  First, I wondered how this guy got spam on Facebook.  I never get any poorly written posts on my news feed or in my inbox begging me to buy some Viagra knockoff.  Then, I realized that perhaps the commenter&#8217;s definition of spam is different than my own.</p>
<p>Within the past few days, my news feed has been jammed with these &#8220;numbers&#8221; posts.  For the most part, it&#8217;s been people who I haven&#8217;t seen or talked to in years posting a status update with a number followed by a random out of context comment that makes no sense to me.  It&#8217;s been getting so bad that one of my Facebook friends posted that he would defriend anyone that posted another &#8220;numbers&#8221; status update.  While these people aren&#8217;t trying to sell me Viagra, the effect is the same as email spam: annoyance and frustration.</p>
<p>It&#8217;s no surprise that the top reason for defriending is &#8220;<a href="http://www.physorg.com/news205501416.html">frequent, unimportant posts</a>.&#8221;  Others, as well as myself, are getting frustrated with junk like these &#8220;numbers&#8221; posts and are on the brink of defriending the perpetrators.  To solve this, I propose FeedMod, a Facebook news feed moderation system to remove the garbage and push the good stuff to the top.</p>
<h2>Disclaimer</h2>
<p>I have absolutely zero experience with the Facebook API, so I have no idea how much of this is possible.  We&#8217;ll see.</p>
<h2>How it works</h2>
<p>My proposal is to borrow from the <a href="http://slashdot.org/moderation.shtml">Slashdot moderation system</a>.  Facebook already has a &#8220;like&#8221; button, but it&#8217;s inconclusive that by clicking it, similar posts will be given priority in the news feed.  There is also an &#8220;x&#8221; for each post, but clicking this seems heavy-handed, since it appears to blot out most posts from that particular friend.  Instead, FeedMod participants will moderate each post with a positive, neutral, or negative descriptor.  The results of this moderation is to flush out the good posts and hide the bad ones.</p>
<p>Unlike the Slashdot system, every news feed post can always be moderated by a FeedMod user.  With Slashdot, the goal is to have publicly acceptable posts float to the top, hence the need for randomly selected moderators to avoid gaming the system.  With FeedMod, however, the goal is to have posts acceptable to individual users float to the top, so users should be able to moderate everything in order to provide as much training information as possible.  Perhaps later the moderation can extend across groups of friends so that certain Facebook users can be recognized as having posts liked or disliked by all of their friends.</p>
<h3>Label each post as good, bad, or neutral</h3>
<p>I would keep all the positive Slashdot post descriptors: informative, insightful, interesting, and funny.  I would keep one neutral descriptor, such as &#8220;normal&#8221; or &#8220;neutral.&#8221;  Also, I would modify the negative descriptors from what is used on Slashdot so that they are more appropriate for social networking and individual preferences: out of context, spam, unintelligible, and troll.  Most news feed posts that annoy me either fall into the &#8220;unintelligible&#8221; or &#8220;out of context&#8221; categories: posts that make no sense due to poor writing skills or lack of background information since I don&#8217;t live every minute of my life with the poster.  Stuff like the &#8220;numbers&#8221; posts would fall into the &#8220;spam&#8221; category and posts from friends looking to incite others (usually politics) would get labeled &#8220;troll.&#8221;</p>
<h3>Customized News Feed</h3>
<p>As a FeedMod user labels each news feed post with a descriptor, the news feed becomes customized to the user&#8217;s preferences.  This is the tricky part, because I&#8217;m not sure if the Facebook API will allow me to rip out the text of each post and store it in a database.  If I&#8217;m able to do that, I can try to model a user&#8217;s feed preferences based on the friends they mod as mostly positive or negative and the likelihood that a new post from a particular friend will be acceptable.  I could go a step further and find keywords or topics that are found in good and bad posts, allowing new posts to be shown or hidden in the feed based on their content.</p>
<h3>If all else fails, defriend</h3>
<p>I should definitely be able to rank a user&#8217;s friends by the number of positive, neutral, and negative posts.  That way, after a few weeks of modding posts in the news feed, a user can have a top 5 and bottom 5 list of the most liked and most offensive friends.  Then, the user can just defriend those bottom 5 and see an increase in the news feed quality.  There can also be rankings by each specific positive or negative descriptor as well as ranking by post volume.</p>
<h2>What&#8217;s Next?</h2>
<p>When time permits, I&#8217;ll try to figure out what the Facebook API is capable of and hopefully be able to attach moderation descriptors to each news feed post.  With that, I&#8217;ll be able to find the friends whose posts I like the most as well as the least.  Learning preferences will be more difficult, especially if the API has limitations on what can be accessed in a user&#8217;s news feed.  Why Facebook hasn&#8217;t already implemented a better news feed moderation system is beyond me.  I&#8217;m sure they&#8217;ve at least considered it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2010/12/08/introducing-feedmod-clean-out-your-facebook-news-feed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Email is Broken: A Case Study</title>
		<link>http://www.keally.org/2010/11/18/email-is-broken-a-case-study/</link>
		<comments>http://www.keally.org/2010/11/18/email-is-broken-a-case-study/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 23:28:17 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mess]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[tinyos]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=1353</guid>
		<description><![CDATA[Facebook&#8217;s &#8220;email&#8221; announcement is generating quite the buzz.  Some speculate that Gmail and Hotmail will soon be on their deathbeds.  While Mark Zuckerberg describes email as &#8220;slow and formal,&#8221; there is a much more pertinent problem: email abuse and misuse.  Anyone with an email account gets bucketfuls of spam every day.  I know I do. [...]]]></description>
			<content:encoded><![CDATA[<p>Facebook&#8217;s <a href="http://www.telegraph.co.uk/technology/facebook/8136764/Facebooks-email-service-is-about-capturing-the-next-generation-of-web-users.html">&#8220;email&#8221; announcement</a> is generating quite the buzz.  Some speculate that Gmail and Hotmail will soon be on their deathbeds.  While Mark Zuckerberg describes email as &#8220;slow and formal,&#8221; there is a much more pertinent problem: email abuse and misuse.  Anyone with an email account gets bucketfuls of spam every day.  I know I do.</p>
<p>With email nearly as old as the internet, the protocol still in use today assumes that: 1) All users trust each other, and 2) All users have a moderate level of skill to send and receive email properly.  The failure of the first assumption has led to the high levels of spam and phishing emails we see today.  There is no trust: how does anyone know that a link supposedly send by a friend isn&#8217;t a botnet client?  The failure of the second assumption is just as bad: how many <a href="http://hamptonroads.com/2010/10/beach-gop-chairman-agrees-resign-over-racist-email">jobs have been lost</a> due to a hasty &#8220;reply all&#8221; click?  The remainder of this post will focus on the second assumption: email misuse.</p>
<h2>Mailing List Misuse</h2>
<p>The timing of Facebook&#8217;s email announcement coincided with an incident that really demonstrates that it&#8217;s well past time for email to die.  I have subscribed to a fair number of mailing lists throughout the past 15 years or so I&#8217;ve been using email.  As per Wikipedia, electronic mailing lists fall into <a href="http://en.wikipedia.org/wiki/Electronic_mailing_list">two categories</a>: 1) Discussion lists, and 2) Announcement lists.  Discussion lists, such as the <a href="http://www.tinyos.net/scoop/special/support.html#mailing-lists">TinyOS programming help</a> mailing list, allow all subscribers to send questions to everyone else in the list.  Someone poses a question in the email, puts the mailing list address in the &#8220;to&#8221; header, and once sent, all other subscribers get the email.  Anyone with an answer &#8220;replies all&#8221; to the list so that everyone can benefit from the discussion.</p>
<p>Announcement lists, on the other hand, are only a one-way broadcast.  Only a single owner is permitted to send announcements to all subscribers on the list with the recipients unable to reply to all.  That&#8217;s the idea, anyway.</p>
<p>In September, I joined an alumni mailing list which I would estimate has at least several hundred subscribers.  The list owner sent out regular updates at an interval of roughly once per two weeks, as illustrated in the figure below.  However, following the most recent announcement, chaos ensued.  On September 15th (see figure), a subscriber learned that he could &#8220;reply all&#8221; to the list and not only email the list owner, but all of the other subscribers as well.  For whatever reason, the announcement list was set up like a discussion list, allowing any subscriber to reply.  It only got worse from there.</p>
<p style="text-align: center;">
<div id="attachment_1357" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.keally.org/wp-content/uploads/2010/11/sendRate_450.png"><img class="size-full wp-image-1357" title="Mailing List Volume" src="http://www.keally.org/wp-content/uploads/2010/11/sendRate_450.png" alt="" width="450" height="308" /></a><p class="wp-caption-text">Once one subscriber hit &quot;Reply All&quot;, the rest is history...</p></div>
<p>Soon, a torrent of emails followed in the steps of the first subscriber as one person after another typed up a response and hit &#8220;reply all.&#8221;  Being an alumni list, the discussion circulated among a group of individuals of about the same class year, discussing subjects that made no sense to anyone else.  The responses quickly got out of hand: through the afternoon of September 15th, the sending rate soared to well past 1 email per minute.</p>
<div id="attachment_1360" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.keally.org/wp-content/uploads/2010/11/absTime_450.png"><img class="size-full wp-image-1360" title="Email frequency and subject." src="http://www.keally.org/wp-content/uploads/2010/11/absTime_450.png" alt="" width="450" height="151" /></a><p class="wp-caption-text">After the initial rush of random discussion, complaints ensued.</p></div>
<p>Following a mad surge of random discussion on the 15th and another resurgence on the afternoon of the 16th, subscribers began to email the list complaining about the onslaught.  One after another, again surging past the rate of 1 email per minute, subscribers demanded that they be unsubscribed and that the discussion be taken to a message board.  Finally, the message was heard: everything died down and stopped completely by the evening of the 16th.</p>
<p>So what went wrong?  First, the list owner should have ensured that he was the only one able to send emails to the list.  Second, a significant number of subscribers emailed the list in an attempt to unsubscribe instead of emailing the list owner.  Both mishaps plus the breach of protocol for announcement lists made things quite a mess in only a few hours.</p>
<p>Some other interesting statistics can be computed in the aftermath.  Since the list&#8217;s inception, about 10% of the total volume can be attributed to announcements, 50% for misuse/discussion, and 40% for complaints about the discussion.  Next, we show the age distribution of senders:</p>
<div id="attachment_1363" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.keally.org/wp-content/uploads/2010/11/ageCdf_450.png"><img class="size-full wp-image-1363" title="Age Distribution of Senders" src="http://www.keally.org/wp-content/uploads/2010/11/ageCdf_450.png" alt="" width="450" height="320" /></a><p class="wp-caption-text">The misuse is confined to the 45+ age group.</p></div>
<p>Since this is an alumni list, I was able to determine the age of just about every sender within two or three years, however, beyond some quick Googling, about 2% of the senders have an undetermined age.  The above figure shows that those who abused the mailing list for discussion are all older than 45.  Conversely, there is a roughly even distribution of age for those complaining.  There is also slightly lower percentage of users under 45.  From the figure, we can conclude that the younger generations are savvy enough to avoid either: 1) Misusing the announcement list as a discussion list, or 2) Sending the list an unsubscribe email instead of the owner.</p>
<p>Another interesting fact is that 37% of all senders used a business email address to reply to the list.  37% of senders used their business email for personal reasons!  That&#8217;s insane.  Another 9% had nasty hundred word &#8220;disclaimer&#8221; signatures at the end of their messages.  Stuff like: &#8220;THIS IS A LEGALLY PRIVILEGED AND CONFIDENTIAL COMMUNICATION THAT IS  INTENDED TO BE VIEWED ONLY BY THE INTENDED RECIPIENT&#8230;ANY DISSEMINATION, DISTRIBUTION, OR COPYING OF THIS  TRANSMISSION IS STRICTLY PROHIBITED.&#8221;  I think the distribution and copying prohibition went out the window the minute they hit &#8220;reply all.&#8221;  It&#8217;s a wonder more people don&#8217;t get busted for stuff they put in emails.</p>
<p>In conclusion, this case study demonstrates exactly why email ought to be abandoned.  There are too many avenues for abuse, misuse, and unintended consequences.  It would be nice to see Facebook come up with something appropriate for today&#8217;s internet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2010/11/18/email-is-broken-a-case-study/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Q&amp;A: TOSSIM</title>
		<link>http://www.keally.org/2010/10/21/qa-tossim/</link>
		<comments>http://www.keally.org/2010/10/21/qa-tossim/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 17:04:07 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[q+a]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tinyos]]></category>
		<category><![CDATA[wirelesssensornetworks]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=1335</guid>
		<description><![CDATA[I&#8217;ve been pretty busy lately to post much, but I think I&#8217;ll try something new. Since, I receive a lot of questions regarding TinyOS, I&#8217;ll post my responses here instead of via email so that more people can benefit (if I&#8217;ve got time). The first question: When using python (tossim) to test the application code [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been pretty busy lately to post much, but I think I&#8217;ll try something new.  Since, I receive a lot of questions regarding TinyOS, I&#8217;ll post my responses here instead of via email so that more people can benefit (if I&#8217;ve got time).  The first question:</p>
<blockquote><p>When using python (tossim) to test the application code written using nesC, how did you make nesC code and python dependent on each other or how did you control the nesC code from python? Did you use swig to export the interfaces from C to python or ran the application code directly on nesC by hard-coding them thus making nesC and python independent?</p></blockquote>
<p>The <a href="http://docs.tinyos.net/index.php/TOSSIM">TinyOS tutorial for TOSSIM</a> does a pretty good job of explaining this.  The idea is to write your TinyOS application code as if for a real mote.  Then you can compile it for TOSSIM:</p>
<pre>$ make micaz sim
</pre>
<p>This will automatically create the wrappers needed for your TinyOS program to interact with Python.  You don&#8217;t need to do anything with SWIG yourself, the TinyOS makefile does this all for you.</p>
<blockquote><p>My goal here is to compute throughput, packet delivery ratio, end-to-end delay for an arbitrary number of nodes say 10 to 50.</p></blockquote>
<p>You can access nesC variables directly from a Python script that runs your simulation.  You can easily access a sequence number variable or a variable that tracks the number of retransmissions of a specific node in the simulation.  Again, the TinyOS TOSSIM tutorial explains this in greater detail, but in your Python script you can have something like:</p>
<pre>
<pre>m = t.getNode(0)
v = m.getVariable("MyAppC.seq")
</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2010/10/21/qa-tossim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 7 vs. Ubuntu 10.04</title>
		<link>http://www.keally.org/2010/05/23/windows-7-vs-ubuntu-10-04/</link>
		<comments>http://www.keally.org/2010/05/23/windows-7-vs-ubuntu-10-04/#comments</comments>
		<pubDate>Sun, 23 May 2010 22:57:35 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opinions]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[troubleshooting]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=1245</guid>
		<description><![CDATA[A few years ago, I was simultaneously running machines with OS X, Windows XP, and Linux.  After giving up PC gaming and my Macbook started aging, I switched to Linux exclusively, since it had nearly everything I needed for school/work.  I did however, keep a Windows XP partition on my laptop for PowerPoint presentations since [...]]]></description>
			<content:encoded><![CDATA[<p>A few years ago, I was simultaneously running machines with OS X, Windows XP, and Linux.  After giving up PC gaming and my Macbook started aging, I switched to Linux exclusively, since it had nearly everything I needed for school/work.  I did however, keep a Windows XP partition on my laptop for PowerPoint presentations since I find Open Office to be seriously lacking.  Using Linux almost exclusively worked pretty well for the last couple years and I managed never to have touched Windows Vista.</p>
<p>Since the release of Windows 7, I&#8217;ve heard plenty of good reviews about this latest Windows version and I decided to give it a try.  A month ago, I installed it on my MSI netbook so I could travel lightweight and give a paper presentation using PowerPoint.  Shortly thereafter, Ubuntu released its latest version into the wild and after using both Windows and Linux for about a month, I&#8217;ve been able to come up with some strong and weak points on both.  Some of my comments apply to Windows and Linux in general and not just to these latest versions or distributions.</p>
<h2>Windows 7</h2>
<h3>Pros</h3>
<ul>
<li>A solid UI.  I&#8217;m a real fan of the Aero theme, system fonts, and improved start menu.  The taskbar really takes the cake by using icons and clustering multiple instances of the same program.  Hovering over the taskbar gives a cool preview of each open window.</li>
<li>Fast.  My netbook with Windows 7 feels just as responsive as it did when it ran Linux.  Boot times are a little slower, however.</li>
<li>Robustness.  I had no difficulty with the Windows 7 install on my netbook and Microsoft even provides a Windows 7 CD to USB image utility for netbooks.  Unlike my Ubuntu experience, there aren&#8217;t any weird hacks to go through in order to get your display or wireless connection working correctly following a fresh install.  Furthermore, I haven&#8217;t encountered any system crashes and Windows seems to keep any malfunctioning program from taking down the whole system.</li>
<li>Good hardware support.  I plug in a camera and it&#8217;s automatically recognized and drivers are installed from the internet.  I plug in an external monitor or projector and the correct model is detected and my desktop is extended on to it with the correct resolution.  It&#8217;s great for presentations since there isn&#8217;t much fiddling with the projector or Control Panel settings to get everything looking good.</li>
<li>Software availability.  Everything has a Windows version, even most open source software.  I find that most developers put more effort into Windows versions since that&#8217;s what most people are running.  For example, I&#8217;ve had fewer crashes and slowdowns with the Windows versions of Firefox and Skype.  The Windows version of Skype is also much more polished than its Linux counterpart.  Furthermore, many software programs are only available on Windows.  MS Office, despite its incredible price tag, is still far superior to Open Office, and of course, only runs on Windows.</li>
<li>Games.  Most of the latest AAA titles are available for Windows, a few might be available for Mac, and I&#8217;ve heard of only one or two released right off the bat for Linux.  If you&#8217;re into PC gaming, Windows is the only way to go.</li>
</ul>
<h3>Cons</h3>
<ul>
<li>Lack of a centralized software repository.  This makes it a real pain to download and  install software since I have to go to a separate website for each program I want to install, find the download page, and click through a bunch of installation dialogs.  Even worse is that nearly every Windows program I install runs a background process on startup that constantly checks for updates and bogs down my system.  Also because of this lack of a centralized repository, programs inconsistently install themselves in many different places.</li>
<li>Difficult to configure system settings.  The Control Panel is a real maze of links, buttons, and dialogs which are dumbed down at the highest level and utterly confusing once I drill down into specific settings.  Some settings can&#8217;t even be accessed with the Control Panel: for example, I still find myself using msconfig.exe to remove unwanted startup items.</li>
<li>Windows Update is still very intrusive.  A large number of updates require me to reboot and will display a nag timer forcing me to do so.  I really don&#8217;t like the OS to get in the way and nag at me.  Some of the system updates take quite awhile to install and can bring my system to a crawl.</li>
<li>Libraries.  This feature, which wasn&#8217;t in XP, is similar to Unix symlinks.  A library clusters together files and folders from several locations in the filesystem, making it unclear where the files are really located.  I would prefer that all my music, movies, or PowerPoint slideshows be stored in a single location in the directory structure such that I can easily back everything up or find something via Windows Explorer.  Windows seems to want you to not have any knowledge about its directory structure and instead rely on searches and libraries.</li>
<li>Developer Tools.  This is the exception to the software availability and quality rule.  I&#8217;ve been using Eclipse for Linux and Windows and it works well enough on both platforms with plugins for Subversion and LaTeX editing.  However, other tools such as a basic text editor, LaTeX compiler, and command line tools such as make are either lacking or nonexistent.  I find it much easier to work with the command line than a GUI when creating plots with Gnuplot and documents with LaTeX.  I can quickly switch from one thing to the next without clicking through a whole pile of menus and dialogs.</li>
</ul>
<h2>Ubuntu 10.04</h2>
<h3>Pros</h3>
<ul>
<li>A centralized software repository.  This is the main reason I like Debian and its variants so much. &#8220;apt-get install&#8221; will give me any program I want and provide automatic updates.  Removal is just as easy.</li>
<li>Fast boot times.  On my 3 year old laptop, Ubuntu is up and running in 30 seconds or less from the moment I hit the power button.</li>
<li>Easy to configure and control.  Adjusting a system setting is easily performed from a GUI tool or from the command line.  Configurations are stored in well documented text files as opposed to the nasty Windows Registry.  It&#8217;s really easy to track down where a program&#8217;s install directory is located and tweak something.</li>
<li>A customizable UI.  The sheer number of themes available is astounding, with Compiz providing some really cool desktop visual effects that rivals anything Windows has to offer.</li>
<li>Enthusiastic user base (support).  I&#8217;ve found that tons other Linux enthusiasts are more than willing to help with problems on message boards and websites.  For things I&#8217;ve had trouble with, a quick google search or message board post will return tons of answers with other people who had the exact same problem and had already solved it.  With Windows issues, answers seem a lot more difficult to come by and the user base isn&#8217;t nearly as friendly.</li>
<li>Developer Tools.  Just about everything under the sun is readily available for developers in Linux, including a plethora of compilers, text editors, and command line tools.  Working from the command line makes things a snap compared to painstakingly navigating through different dialogs and menus.</li>
</ul>
<h3>Cons</h3>
<ul>
<li>New software versions take time to be added to the repository.  For example, Firefox 3.6 has been out for months but was only recently included in the 10.04 Lucid Lynx release.  Prior to that, I had to compile and install Firefox 3.6 from source.</li>
<li>Installation headaches still persist.  With every Ubuntu release, something doesn&#8217;t work post-install.  With 10.04, it was my video drivers.  During the upgrade process from 9.10, the installer whined about my video drivers and supposedly aborted the install.  Upon rebooting my computer, however, it was clear that the install had not aborted and my display was completely messed up.  After rebooting again, Ubuntu downloaded and installed the required video drivers automatically.  Also, Ubuntu now tries on boot to mount a remote drive in my /etc/fstab for which I don&#8217;t have a saved key, halting the boot process until I manually override the mounting process.</li>
<li>Software quality and robustness.  Productivity software, such as Open Office, isn&#8217;t nearly as capable or as featureful as Microsoft Office.  I&#8217;ve had trouble with Flash causing browser crashes and other programs crashing all on their own which run stably in Windows.  I&#8217;ve had a heck of a time figuring out why some fonts are rendered terribly and look blurry in some programs, among other things.  More effort should be placed on creating polished products in order for open source software to really take off.</li>
<li>Lacking hardware support.  This goes with the above bullet: I plug in an external monitor or projector and I still have to fidget with resolutions and positioning to get everything to work.  Suspending to disk often borks the external monitor configuration and then I have to do it all over again.</li>
</ul>
<p>In all, I can&#8217;t say that either the latest Windows or Linux versions are better.  Windows provides a more robust and polished solution, while Linux gives more power and control to its users.  I find Linux to be a better choice for development, but Windows is the clear winner for gaming.  Both Windows 7 and Ubuntu 10.04 run reasonably fast &#8212; Windows 7 does quite well on my netbook, but Ubuntu clearly takes the cake with boot times.  Until open source software takes quality up a notch and Windows provides a better development environment, I&#8217;ll probably be dual booting, running virtual machines, or using multiple computers with both operating systems.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2010/05/23/windows-7-vs-ubuntu-10-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Low Level Serial Control in TinyOS</title>
		<link>http://www.keally.org/2010/03/30/low-level-serial-control-in-tinyos/</link>
		<comments>http://www.keally.org/2010/03/30/low-level-serial-control-in-tinyos/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 16:38:20 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tinyos]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[wirelesssensornetworks]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=1137</guid>
		<description><![CDATA[It&#8217;s been awhile since my last TinyOS post, but a new project required me to return to programming motes.  In this case, we needed to send ASCII characters over the serial port to the PC, bypassing the default TinyOS serial stack. The TinyOS serial stack is designed to work with Active Messages so that packets [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been awhile since my last TinyOS post, but a new project required me to return to programming motes.  In this case, we needed to send ASCII characters over the serial port to the PC, bypassing the default TinyOS serial stack.</p>
<p>The <a href="http://www.tinyos.net/tinyos-2.x/doc/html/tep113.html">TinyOS serial stack</a> is designed to work with Active Messages so that packets received over the radio can be easily forwarded on to the PC.  To that end, the high-level serial and radio components provide the same interfaces.  The TinyOS serial stack has layers for packet formatting, error checking, and a read/write buffer.  However, for our project, we wanted to simplify the PC side so we didn&#8217;t have to use the TinyOS JNI libraries to receive TinyOS Active Message packets.  A simple program to read ASCII characters over the serial connection would suffice for our purposes &#8212; <a href="http://en.wikipedia.org/wiki/Minicom">Minicom</a> does this quite well and is easily installed on Ubuntu Linux and can be configured to read from attached USB devices.</p>
<p>The goal was to produce a TinyOS component that provided a command for transmitting ASCII character strings over the serial connection to a PC.  The  implementation is very similar to the <a href="http://www.keally.org/2009/06/15/bci-pulse-oximeter-in-tinyos-2-1/"><span style="color: #000000;">Pulse Oximeter</span></a> code I wrote for Atmel-based devices, however this time I targeted MSP430-based devices, such as the TelosB or Tmote Sky.  The implementation uses the <code>Msp430Uart1C</code> component for accessing the serial connection.  This component provides the <code>UartByte</code> or <code>UartStream</code> interfaces for reading and writing and the <code>Resource</code> interface for gaining control of the UART.  <code>Msp430Uart1C</code> also provides the <code>Msp430UartConfigure</code> interface for setting the baud rate.</p>
<p>The control flow for writing a character string is as follows: First, request the UART resource.  Second, when the resource has been granted, call <code>UartStream.send()</code> to transmit the string.  Lastly, when <code>UartStream.sendDone()</code> is signaled, signal the higher level application that the character string has been sent or an error message if something went wrong.  In my <code>SerialAscii</code> module, I have the following command to send a character string:</p>
<pre>  command error_t SerialAscii.sendAscii(char *str)
  {
    bufferLength = strlen(str);
    if(bufferLength &gt; BUFFER_SIZE)
      return FAIL;
    memcpy(strBuffer,str,bufferLength);  // copy string into a buffer
    call Resource.request(); // request access to the UART
    return SUCCESS;
  }</pre>
<p>I copy the string into a buffer to keep the application from modifying it before being transmitted.  When the resource request is granted, I transmit the string:</p>
<pre>  event void Resource.granted()
  {
    error_t result = call UartStream.send(strBuffer,bufferLength);
    if(result == FAIL)
      post sendDoneFailTask();  // return failure message to the user if something bad happened
  }</pre>
<p>Lastly, when the string is sent, I release the resource and signal the higher level application:</p>
<pre>  async event void UartStream.sendDone(uint8_t *buf, uint16_t len, error_t error)
  {
    // call Resource.release() in each of these tasks
    if(error == SUCCESS)
      post sendDoneSuccessTask(); // signal SerialAscii.sendAsciiDone(SUCCESS);
    else
      post sendDoneFailTask(); // signal SerialAscii.sendAsciiDone(FAIL);
  }</pre>
<p>I&#8217;ve made my code available <a href="http://www.cs.wm.edu/~makeal/projects/serialAscii/SerialAscii.tar.gz">here</a>.  Let me know if you find any bugs or have any comments or suggestions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2010/03/30/low-level-serial-control-in-tinyos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Freedom or Stability?</title>
		<link>http://www.keally.org/2010/01/30/freedom-or-stability/</link>
		<comments>http://www.keally.org/2010/01/30/freedom-or-stability/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 22:03:07 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[troubleshooting]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=1093</guid>
		<description><![CDATA[Windows and Mac users can download and install the newest Firefox version with a couple of mouse clicks.  With Ubuntu Linux, however, no Firefox 3.6 is available in the Canonical package repository.  Even worse, none of the developers plan to add any new Firefox versions to the repository until the next Ubuntu release.  So, I [...]]]></description>
			<content:encoded><![CDATA[<p>Windows and Mac users can download and install the newest Firefox version with a couple of mouse clicks.  With Ubuntu Linux, however, no Firefox 3.6 is available in the Canonical package repository.  Even worse, none of the developers plan to add any new Firefox versions to the repository until the next Ubuntu release.  So, I attempted to install precompiled versions from the Mozilla website and the Ubuntu Firefox development build repository, but both installs really messed up the fonts, making them blurry and hard to read.</p>
<p>I tried desperately to fix the fonts, summoning the help of the Ubuntu forums.  I tried <a href="http://ubuntuforums.org/showthread.php?t=1200992">editing font rendering settings</a> in my local .fonts.conf.  I <a href="http://ubuntuforums.org/showthread.php?t=1389077">deleted the font cache</a> and reconfigured fontconfig.  I tried <a href="http://ubuntuforums.org/showpost.php?p=8746650&amp;postcount=381">adjusting a font quality parameter</a> in Firefox&#8217;s about:config. For some forums posters, these solutions worked.  For me, nothing seemed to help.  Finally, I was able to get Firefox 3.6 installed with normal fonts by downloading and compiling the source code and installing the binaries compiled on my own system.</p>
<p><a href="http://blogs.computerworld.com/15443/talling_firefox_3_6_one_more_reason_linux_isnt_ready_for_the_prime_time_mass_market">I&#8217;m not the only one</a> who is frustrated by this.  This was probably the first time I&#8217;ve resorted to compiling a third party application from source since first using Ubuntu and Debian in 2006.  Normally, it&#8217;s just <code>apt-get install</code> whatever program you want.  The package manager automatically updates everything and keeps out of my way, rarely nagging to reboot unless the kernel was updated.  The package repository was one of the main reasons I switched to Linux in the first place: an easy, single step way to install anything and keep it up to date.  No hunting for a download website somewhere on the internet or clicking through a bunch of dialogs in an install wizard.</p>
<p>With such lag before new third party applications get added to the Ubuntu software repository, plenty argue that Linux isn&#8217;t ready for the mainstream.  I agree completely.  Most people will have to go through similar steps as I to get many of the latest third party applications installed, and it can be a real pain.  However, in Linux, I am free (as in speech) to customize or rewrite any part of the operating system and share my changes with others.  It also gives me a free (as in beer), top notch development environment for my work.  The problem is that such freedom comes at a cost: tinkering to get everything to work correctly.  Every time I&#8217;ve upgraded to the latest Ubuntu version, something doesn&#8217;t work and has to be fixed.  In another example, I recently installed the netbook remix version on my netbook and was rewarded by a flickering screen, which was fixed with a BIOS update.</p>
<p>Mainstream users just don&#8217;t want to be faced with flickering screens and BIOS updates, they want something that just works.  Consequently, they are willing to give up some of that freedom (as in speech and beer) to have a device that boots normally and doesn&#8217;t have font rendering issues when they install the latest version of a program.  Such users are better off with an Apple, and indeed Apple charges them a price in terms of money and control.</p>
<p>The iPad has <a href="http://www.fsf.org/news/ibad_launch">launched a storm of controversy</a> over its lack of user control.  Essentially, the device is a large iPhone, except there is no phone.  All applications must be purchased from the Apple-controlled App Store.  The real question is: do  mainstream users really need fine-grained control over their devices?  One comment on a <a href="http://apple.slashdot.org/story/10/01/28/1434222/iPad-Is-a-Huge-Step-Backward?art_pos=3">Slashdot post</a> really makes an interesting argument:</p>
<blockquote><p>What has choice done? It&#8217;s given us the chaos of spam, malware, worms  etc&#8230;  The average consumer should get a locked down device such  as what Apple are proposing, a limited device with a closed market. And  you do realise this is really no different to a games console.  Full  blown computers should be reserved for those of us who know how to  manage them responsibly&#8230;Computers as they are today are simply too complex and difficult to  manage for the average consumer, so you either give them something  simple or you take the management out of their hands.</p></blockquote>
<p>Combined with the &#8220;Linux is not for mainstream&#8221; argument, this really makes the case that perhaps devices that work well but allow little user freedom may be the best for most people.  Most of the time, it&#8217;s the best choice for me.  I&#8217;ve got a phone, media player, GPS device, and others that I want to just work and perform a very specific function.  In these cases, I would rather they perform their jobs reliably than be extensively customizable.  However, I do think that the option to exercise greater control should be there for those who want it, no matter how few.  In the case of PCs, I&#8217;ll take that option, stick to Linux, and keep compiling from source when I have to.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2010/01/30/freedom-or-stability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BCI Pulse Oximeter in TinyOS 2.1</title>
		<link>http://www.keally.org/2009/06/15/bci-pulse-oximeter-in-tinyos-2-1/</link>
		<comments>http://www.keally.org/2009/06/15/bci-pulse-oximeter-in-tinyos-2-1/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 00:33:54 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[mts310]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[school]]></category>
		<category><![CDATA[tinyos]]></category>
		<category><![CDATA[wirelesssensornetworks]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=748</guid>
		<description><![CDATA[After days of getting lost in TinyOS 1.1 and 2.1 low level hardware abstractions, the Harvard design BCI pulse oximeter now works in TinyOS 2.1. Prior to writing the driver/interface code, I had to procure the pulseox hardware.  Detailed descriptions of hardware, software, and applications are found at the Harvard CodeBlue website.  I first ordered [...]]]></description>
			<content:encoded><![CDATA[<p>After days of getting lost in TinyOS 1.1 and 2.1 low level hardware abstractions, the Harvard design BCI pulse oximeter now works in TinyOS 2.1.</p>
<p>Prior to writing the driver/interface code, I had to procure the pulseox hardware.  Detailed descriptions of hardware, software, and applications are found at the <a href="http://fiji.eecs.harvard.edu/CodeBlue">Harvard CodeBlue website</a>.  I first ordered a <a href="http://www.smiths-medical.com/bci-oem/">Smiths Medical OEM Digital Micro Power Pulse Oximeter Board</a>.  I was able to get in contact with sales staff by emailing Smiths Medical.  The pulseox board comes with a finger sensor and runs about $200.</p>
<p>Next, I needed an interface board to connect the BCI pulseox board to the 51 pin connector on the Crossbow IRIS.  The Harvard CodeBlue source code has documentation for a PCB layout and suggests that you order the PCB from an online manufacturer.  You also have to purchase some other components that must be soldered onto the interface board.  Fortunately, I was able to &#8220;skip&#8221; this step with the help of <a href="http://www.cs.virginia.edu/~ls2ef/">Leo Selavo</a>, who graciously supplied me with two interface boards.  He emphasized that soldering the components onto the interface board requires a lot of skill and experience and if I were to try on my own that I would most likely break the PCB or components several times until I got it right.  The setup with pulseox board, interface board, IRIS mote, and finger sensor is illustrated below:</p>
<div id="attachment_752" class="wp-caption aligncenter" style="width: 410px"><a rel="attachment wp-att-752" href="http://www.keally.org/2009/06/15/bci-pulse-oximeter-in-tinyos-2-1/bciirissm/"><img class="size-full wp-image-752" title="Pulse Oximeter on IRIS" src="http://www.keally.org/wp-content/uploads/2009/06/bciIrisSm.jpg" alt="Pulse Oximeter on IRIS" width="400" height="300" /></a><p class="wp-caption-text">Pulse Oximeter on IRIS</p></div>
<p>With the pulseox board, interface board, and of course IRIS mote, I was ready to get my heart rate.  The biggest challenge still lay ahead: writing code to interface with the pulseox.  The CodeBlue pulseox code was written in 2005 for TinyOS 1.0.  All of the low level UART and mote hardware interfaces have changed drastically since then, so the old code wouldn&#8217;t just work right out of the box.  I had seen plenty of posts on the CodeBlue mailing list about implementations for the pulseox in TinyOS 2.x, but nobody had bitten the bullet and actually written anything.</p>
<p>What I wanted was to be able to use the pulseox like a sensor on the MTS300/310 sensorboard: call a Pulse.read() or Oxygen.read() command and get back a uint16_t with pulse or blood oxygen saturation.  This is fairly straightforward since I had experience <a href="2009/05/14/mts300310-sensorboard-sampling-multiple-sensors-simultaneously/">modifying the MTS310 sensorboard code to power on the sensors manually</a>.  I created configurations PulseC and OxygenC to provide SplitControl and Read interfaces to power on the sensor and read, respectively.  I then wired PulseC and OxygenC to a PulseoxP, which functioned as an intermediary between the application and the low-level pulseox driver code.  Like in the original CodeBlue source, I created a BciC configuration and BciP implementation to communicate with the pulseox directly through the UART and return data back to PulseoxP.</p>
<p>The key changes between the CodeBlue TinyOS 1.0 code and my implementation are all found in BciP (or BCIM.nc in the original CodeBlue source).  Two issues come to mind.  First, setting the mote hardware pins is done differently in TinyOS 2.1.  Calls like TOSH_SET_PW0_PIN() are replaced by abstractions.  I had to wire MicaBusC.PW0 to the GeneralIO interface in BciC and then call GeneralIO.set() in BciP.</p>
<p>The second difference is with the UART.  TinyOS 1.0 uses the HPLUART interface for low level UART communication, but this has been replaced by Atm128Uart0C for the Atmel 1281 architecture.  The CodeBlue source code initializes the low level UART to its default state, turns it off, and then sets the hardware registers to the desired UART configuration so that the mote can communicate with the pulseox board.  After figuring out what the CodeBlue UART configuration code did, I can&#8217;t believe that you can actually write to the registers directly!  Imagine if you could do that with user-level code on a PC!  To enable transmissions and reception along with interrupts for the UART in TinyOS 1.x, you had to do the following:<br />
<code><br />
// Enable tx/rx interrupts and tx/rx<br />
outp(((1 &lt;&lt; RXCIE) | (1 &lt;&lt; TXCIE) | (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN)) ,UCSR0B);<br />
</code><br />
TinyOS 1.0 uses the outp() macro to set bits of a given register, but this macro does not exist in TinyOS 2.x.  Instead, the UART register bits are configured in a struct with fields for each bit in the register.  For the above example in TinyOS 2.1, the following union represents the control register in Atm128Uart.h:<br />
<code><br />
/* UART Control Register */<br />
typedef union {<br />
struct Atm128_UCSRB_t {<br />
uint8_t txb8  : 1;  //!&lt; UART Transmit Data Bit 8<br />
uint8_t rxb8  : 1;  //!&lt; UART Receive Data Bit 8<br />
uint8_t ucsz2 : 1;  //!&lt; UART Character Size (Bit 2)<br />
uint8_t txen  : 1;  //!&lt; UART Transmitter Enable<br />
uint8_t rxen  : 1;  //!&lt; UART Receiver Enable<br />
uint8_t udrie : 1;  //!&lt; USART Data Register Enable<br />
uint8_t txcie : 1;  //!&lt; UART TX Complete Interrupt Enable<br />
uint8_t rxcie : 1;  //!&lt; UART RX Complete Interrupt Enable<br />
} bits;<br />
uint8_t flat;<br />
} Atm128UartControl_t;<br />
</code><br />
The flat uint8_t is a real slick way to convert all the elements in the struct to a single word, which can then be written to the register.  Following the code that initializes the UART in tos/chips/atm128/HplAtm128UartP.nc, I was able to configure the UART to run with the pulseox board requirements: 4800 baud, double rate, transmission and reception interrupts enabled, no parity checking, 1 stop bit, and 8 bit word size.  So, with the previous example to enable transmissions and reception, you do the following in TinyOS 2.x:<br />
<code><br />
Atm128UartControl_t ctrl;<br />
ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:1, txcie:1, rxen:1, txen:1};<br />
UCSR0B = ctrl.flat; // ctrl.flat<br />
</code><br />
I ran my concerns by the CodeBlue mailing list, which elicited a reply from <a href="http://www.eecs.harvard.edu/~mdw/">Prof. Matt Welsh</a> that I was headed in the right direction.  I finished my implementation, worked out some compile errors, and loaded the new pulseox and general data collection code onto a mote to see what would happen.  Almost never does my TinyOS code run correctly on the first try &#8212; usually I spend hours or days debugging, but this time it was magic.  A number jumped onto the screen in the data column of my PC Java application, which was connected wirelessly though a base station mote to the pulseox mote.  The sensor readings seemed reasonable for a heart rate, for jumping up and down and breathing hard made it go up and laying down and trying to breathe slowly made it slow down.</p>
<div id="attachment_753" class="wp-caption aligncenter" style="width: 471px"><a rel="attachment wp-att-753" href="http://www.keally.org/2009/06/15/bci-pulse-oximeter-in-tinyos-2-1/pulseoxdata/"><img class="size-full wp-image-753" title="Pulse Oximeter data returned to PC" src="http://www.keally.org/wp-content/uploads/2009/06/pulseoxData.jpg" alt="Pulse Oximeter Reading" width="461" height="77" /></a><p class="wp-caption-text">Pulse Oximeter Reading</p></div>
<p>I have made my <a href="http://www.cs.wm.edu/~makeal/projects/pulseox/pulseox.zip">code available here</a> and any feedback, suggestions, or questions are encouraged.  To use it, place the pulseox directory into the tos/sensorboards directory in TinyOS 2.x.  In the makefile for your application, add the line &#8220;SENSORBOARD=pulseox&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2009/06/15/bci-pulse-oximeter-in-tinyos-2-1/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>MTS300/310 Sensorboard: Sampling multiple sensors simultaneously</title>
		<link>http://www.keally.org/2009/05/14/mts300310-sensorboard-sampling-multiple-sensors-simultaneously/</link>
		<comments>http://www.keally.org/2009/05/14/mts300310-sensorboard-sampling-multiple-sensors-simultaneously/#comments</comments>
		<pubDate>Thu, 14 May 2009 21:27:23 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[mts310]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tinyos]]></category>
		<category><![CDATA[wirelesssensornetworks]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=680</guid>
		<description><![CDATA[My current project involves sampling data with the Crossbow Iris and MTS310 sensorboard. I wish to sample data at regular intervals, say 20ms, using all available modalities on the MTS310: x and y-axis accelerometer, x and y-axis magnetometer, light, temperature, and acoustic. Every 20ms, a timer fires and collects data samples from each sensor using [...]]]></description>
			<content:encoded><![CDATA[<p>My current project involves sampling data with the <a href="http://www.xbow.com/Products/productdetails.aspx?sid=264">Crossbow Iris</a> and <a href="http://www.xbow.com/Products/productdetails.aspx?sid=177">MTS310 sensorboard</a>.  I wish to sample data at regular intervals, say 20ms, using all available modalities on the MTS310: x and y-axis accelerometer, x and y-axis magnetometer, light, temperature, and acoustic.  Every 20ms, a timer fires and collects data samples from each sensor using the Read interface.  As it turns out, the current TinyOS 2.x code for the MTS300/310 does not allow this.</p>
<p>I found that every time I called Read.read() for some of the sensors, that there would often be a delay in getting my data back with Read.readDone().  This delay was because each call to Read.read() would power on the sensor, requiring a warm-up time before a sample could be retrieved.  While the warm-up time for the accelerometer is 17ms, the warm-up time for the light sensor is an excruciatingly long 1200ms!  So, I would call Read.read() at 20ms intervals, but have to wait over a second to get data from the light sensor.  When the data sample is returned at Read.readDone(), the sensor would power off again, thus requiring another warm-up the next time a sample is requested.  Basically, the constant warm-up lag in the current TinyOS code prevents sampling at a reasonably fast rate using Read.</p>
<p>I also found that if I wished to get both axes of the accelerometer or magnetometer simultaneously, that only one axis would ever return data.  The accelerometer, magnetometer, and light/photo sensors use the ArbitratedResource interface to block all other sensors that use the same resource when one sensor has a lock on the resource.  If the x-axis accelerometer was sampling with Read.read(), it would have a lock on a UQ_ACCEL_RESOURCE identifier, preventing the y-axis from sampling simultaneously, since its resource is also identified by UQ_ACCEL_RESOURCE.  I wasn&#8217;t the only one with these problems, as illustrated by <a href="https://www.millennium.berkeley.edu/pipermail/tinyos-help/2009-January/037930.html">this TinyOS mailing list post</a>.  The mailing list poster also points out that the ReadStream interface blocks data sampling for all sensors but the first one that calls it: if you try using ReadStream to get streaming data for the accelerometer x-axis and the magnetometer x-axis, the call to ReadStream.read() for the accelerometer would block the sampling of the magnetometer if it was called first.  With ReadStream, all sensors use the same resource identifier, so when one is sampling, it has the lock, and all others must wait.  The resource arbitration effectively prevents multiple sensors from sampling data simultaneously using ReadStream.</p>
<p>This automated power control for Read as well as the blocking for Read and ReadStream really limits the functionality of the sensorboard.  Initially, I thought it was a hardware constraint.  You would think that since the board has all those sensors on it, the manufacturers would have designed it such that you can use all the sensors at the same time.  It turns out, that it isn&#8217;t a hardware problem &#8212; it&#8217;s just that the MTS300/310 sensorboard code is written so you can only effectively use one sensor at a time.  I managed to change this by modifiying the behavior of the Read.read() of every MTS sensor.</p>
<p>The current TinyOS code uses SplitControlPowerManagerC to power on the sensor when you call Read.read().  Read.read() triggers the power manager to call the sensor&#8217;s SplitControl interface.  Supposedly, when Read.readDone() is signaled and the sensor data is ready, the power manager will keep the sensor powered on for some amount of time in case the sensor is needed again &#8212; this is from the comments in PowerManagerP.nc.   However, from my testing, there is no evidence that the sensor stays on after Read.readDone() is signaled.  The warm-up routine starts all over again the next time Read.read() is called.  It&#8217;s possible that 20ms is too much time between samples, but it appears from the power manager code that the sensor is turned off immediately if no resource requests for that sensor are pending.  Currently, I can&#8217;t find anywhere in the MTS310 sensorboard code or in the power manager code where some kind of backoff timer is set before powering down the sensor.</p>
<p>To that end, I eliminated this automated power control through the power manager.  I altered each sensor&#8217;s interface in the mts300 code library so that each sensor provided a SplitControl interface.  This now allows me to manually power on each sensor I want to use before I start sampling.  I then have a timer call Read.read() at regular intervals for each sensor I want, which returns the data with Read.readDone().  When I&#8217;m done sampling, I can turn the sensors off.</p>
<p>The current code is more a less a hack and has a weird side effect.  For example, since the x and y-axis accelerometers use the same AccelP module with the same SplitControl power interface, only one accelerometer has to call SplitControl.start() to turn the sensor on.  The same goes for the magnetometer and the light/photo sensors, as well as for calling SplitControl.stop() to power down the sensors.  Otherwise, the warm-up/power on sequence is triggered twice for the same sensor if you want to use both axes of the accelerometer or magnetometer, or wish to use both light and temperature sensors. <em>Edit: this issue has been fixed in the code.  Calling SplitControl.start() for both axes of the accelerometer/magnetometer will only run the power on sequence once, but both calls will return SplitControl.startDone().  The same applies for SplitControl.stop().</em></p>
<p>The modified sensorboard code can be <a href="http://www.cs.wm.edu/~makeal/projects/mts310/mts310.zip">downloaded here</a>, which is a zipped directory of all the mts300 sensor code, but changed to mts310.  Just unzip it into the tos/sensorboards directory.  The configurations AccelXC, AccelYC, MagXC, MagYC, MicC, PhotoC, and TempC have all been modified to provide the SplitControl interface, so for example you can call AccelXC.start() to power on the accelerometer, then AccelXC.read() to get data, and then AccelXC.stop() to power the accelerometer off.  I&#8217;ve used this extensively with the accelerometers, magnetometers, acoustic, and light sensors and it seems to work without any issues.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2009/05/14/mts300310-sensorboard-sampling-multiple-sensors-simultaneously/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Defusing the Binary Bomb</title>
		<link>http://www.keally.org/2009/05/12/defusing-the-binary-bomb/</link>
		<comments>http://www.keally.org/2009/05/12/defusing-the-binary-bomb/#comments</comments>
		<pubDate>Tue, 12 May 2009 17:56:15 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[school]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=672</guid>
		<description><![CDATA[Looking for the &#8220;secret defusion phrases&#8221; for the binary bomb project? I&#8217;m not going to just spit them out for you.  What is the challenge in just typing in the answers?  Despite an earlier post about the binary bomb when I took a Computer Architecture class, you will not find the answers here. To solve [...]]]></description>
			<content:encoded><![CDATA[<p>Looking for the &#8220;secret defusion phrases&#8221; for the <a href="http://www.cs.wm.edu/~lowekamp/classes/304-F07/labs/bomblab.pdf">binary bomb project</a>?  I&#8217;m not going to just spit them out for you.  What is the challenge in just typing in the answers?  Despite an <a href="http://www.keally.org/2003/10/12/congratulations-youve-defused-the-bomb/">earlier post about the binary bomb</a> when I took a Computer Architecture class, you will not find the answers here.</p>
<p>To solve it, you can do the same thing I did: disassemble the binary and use the debugger.  Be sure to set a breakpoint so that you won&#8217;t set off the bomb accidentally.  As long as you&#8217;ve got that breakpoint set, you&#8217;ll never lose any points.  Step through the assembly code line by line and try to figure out how the input is manipulated.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2009/05/12/defusing-the-binary-bomb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One reason grad school is different</title>
		<link>http://www.keally.org/2009/05/06/one-reason-grad-school-is-different/</link>
		<comments>http://www.keally.org/2009/05/06/one-reason-grad-school-is-different/#comments</comments>
		<pubDate>Wed, 06 May 2009 19:42:21 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[knee]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[school]]></category>
		<category><![CDATA[surgery]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.keally.org/?p=653</guid>
		<description><![CDATA[My sister (and others) have been complaining about the gobs of work they&#8217;ve got to get done during exam period. There are papers, projects, and of course, exams. My case is somewhat different. I remember how it seemed all kinds of massive projects and papers were due right before or during exams, and then I [...]]]></description>
			<content:encoded><![CDATA[<p>My sister (and others) have been complaining about the gobs of work they&#8217;ve got to get done during exam period.  There are papers, projects, and of course, exams.  My case is somewhat different.  I remember how it seemed all kinds of massive projects and papers were due right before or during exams, and then I would have to suffer through a whole ton of exams.  It was a huge weight off my back when it was done.  </p>
<p>But now, it&#8217;s almost worse.  I started working on my current project in September, right after my knee surgery.  It&#8217;s been going for nine months and now I am finally cramming all of those nine months into ten pages or less, double column.</p>
<p>To put this in perspective for an undergrad: take all the papers, all the projects, all the homework assignments, and all the exams, tests, and quizzes in the last two semesters and make them all due next week.  That is the weight of what I am working on.  It nags at me every day that I have been working for so long and have nothing to show for it.  I think about it in bed before I go to sleep, I think about it when I wake up, I think about it when I&#8217;m in the shower, and I think about it when I&#8217;m on the bike.  As an undergrad and even for the first part of grad school, I got closure incrementally: with periodic assignments and tests and at the finish of each semester when classes end.  Closure is now when I get a paper out, and the time span for that seems indefinite.</p>
<p>My first project and paper was faster &#8212; it took a semester and a summer.  However, I&#8217;m still dealing with that project now &#8212; I&#8217;m going to present it at SECON and when I do, it will almost be a year since the first version of the paper went out.</p>
<p>It seems most undergrads treat papers lightly: &#8220;Oh, I can crank out a ten page paper in a few hours and still get an A&#8230;&#8221;  I was the same way &#8212; it was spit something out as fast as possible to get it over with, but put enough effort into it to get a decent grade.  Now, papers are everything.  The paper is how everyone else sees your work.  I may have spent the past nine months creating something that could have huge implications for the future of wireless sensor networks, but nobody but my adviser would know about it unless I tell them in a paper.  The reviewers will lay the smack down on you if you try to whip out a paper in a matter of hours.  Yesterday, I spent six hours writing and got out about five paragraphs.  They were five critical paragraphs about the core of what I did, and they had better be comprehensive and understandable from the perspective of an outsider.</p>
<p>I find it hard to tell the story of my project, but I think the difficulty is from inexperience.  There are key things that reviewers look for that I must give special attention in addressing.  Because of this, there is a pretty rigid way to write a research paper, but even then I find it difficult.  It is hard to convey specific algorithmic details, yet be concise and easy to understand.  I have to remember the main selling points of my work and refer back to them throughout the paper.  For these projects, I find the initial problem discovery, solution design, and implementation to be interesting and sometimes even fun.  Enough experience programming and thinking about solutions to problems has helped with that, but I haven&#8217;t done much writing.</p>
<p>With time, I imagine writing will get easier.  I will know exactly what to do.  With my current paper, I&#8217;m almost there.  I&#8217;m almost to the point where I feel good about what I have written and know that everything will turn out okay.  I just have to keep working and get it done.  Then there will be some closure.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.keally.org/2009/05/06/one-reason-grad-school-is-different/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
