<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Open Development</title>
	
	<link>http://www.odevelop.com/blog</link>
	<description>Tidbits on new technology, open-source software development, linux, and productivity hacks.</description>
	<lastBuildDate>Tue, 29 Mar 2011 23:00:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/OpenDevelopment" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="opendevelopment" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Maria Andersen on How to Personalize Education</title>
		<link>http://www.odevelop.com/blog/?p=426</link>
		<comments>http://www.odevelop.com/blog/?p=426#comments</comments>
		<pubDate>Tue, 29 Mar 2011 23:00:35 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[Academia]]></category>
		<category><![CDATA[acu]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[information]]></category>
		<category><![CDATA[maria andersen]]></category>
		<category><![CDATA[personalized learning]]></category>
		<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=426</guid>
		<description><![CDATA[Maria Andersen presents an innovative and practical solution for personalized learning and information management in her talk, &#8220;Where&#8217;s the &#8216;Learn This&#8217; button?&#8221; at ACU: You can read Maria&#8217;s article in PDF format here. It&#8217;s well worth your time.]]></description>
			<content:encoded><![CDATA[<p><a href="http://edgeoflearning.com/" target="_blank">Maria Andersen</a> presents an innovative and practical solution for personalized learning and information management in her talk, &#8220;Where&#8217;s the &#8216;Learn This&#8217; button?&#8221; at <a href="http://www.acu.edu/" target="_blank">ACU</a>:</p>
<p><iframe title="YouTube video player" width="560" height="349" src="http://www.youtube.com/embed/m5kAOE3x1aY?rel=0&amp;hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>You can read Maria&#8217;s <a href="http://teachingcollegemath.com/files/pdf/jf2011_andersen.pdf" target="_blank">article in PDF format here</a>. It&#8217;s well worth your time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=426</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DevCorner Interview</title>
		<link>http://www.odevelop.com/blog/?p=417</link>
		<comments>http://www.odevelop.com/blog/?p=417#comments</comments>
		<pubDate>Thu, 17 Feb 2011 19:56:23 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[Interning]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[intern]]></category>
		<category><![CDATA[interview]]></category>
		<category><![CDATA[techsmith]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=417</guid>
		<description><![CDATA[The  TechSmith Visual Lounge blog is running an story in which I speak to the topic of what it&#8217;s like to be an intern at TechSmith. (Short answer: it&#8217;s an awesome place to work!) Click here to read the article.]]></description>
			<content:encoded><![CDATA[<p><a href="http://visuallounge.techsmith.com/"><img id="vl-logo" class="AlignLeft" style="border: 0pt none;" src="http://visuallounge.techsmith.com/assets/img/structure/vl-logo.gif" border="0" alt="The Visual Lounge" width="143" height="137" /></a>The  <a href="http://visuallounge.techsmith.com/" target="_blank">TechSmith Visual Lounge</a> blog is running an story in which I speak to the topic of what it&#8217;s like to be an intern at TechSmith. (Short answer: it&#8217;s an awesome place to work!)</p>
<p class="entry-header"><a href="http://visuallounge.techsmith.com/2011/02/dev_corner_-_interview_with_ca.html">Click here to read the article.</a></p>
<p><br/><br/><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=417</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sustainable Structure in Agile Development</title>
		<link>http://www.odevelop.com/blog/?p=405</link>
		<comments>http://www.odevelop.com/blog/?p=405#comments</comments>
		<pubDate>Mon, 14 Feb 2011 03:39:00 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[Agile Practices]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[burnout]]></category>
		<category><![CDATA[relationships]]></category>
		<category><![CDATA[tasks]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=405</guid>
		<description><![CDATA[This past week I had the privilege of attending a talk at Hope College given by John Hauck, a manager of software research &#38; engineering LECO Corporation. John presented on various topics related to agile development and hiring practices, and had a good deal of sage advice for college students hoping to land a job [...]]]></description>
			<content:encoded><![CDATA[<p>This past week I had the privilege of attending a talk at <a href="http://www.hope.edu/" target="_blank">Hope College</a> given by <a href="http://www.linkedin.com/in/johnmichaelhauck" target="_blank">John Hauck</a>, a manager of software research &amp; engineering <a href="http://www.leco.com/index2.htm" target="_blank">LECO Corporation</a>. John presented on various topics related to agile development and hiring practices, and had a good deal of sage advice for college students hoping to land a job out of college (click on the image below to watch the entire presentation).</p>
<p style="text-align: center;"><a href="http://vimeo.com/19827977"><img class="AlignNone" style="border: 0pt none;" title="John Hauck on Software Development at LECO" src="http://content.screencast.com/users/c_07/folders/Snagit/media/44f34f2a-a23b-439c-8c51-ee63a8632350/02.13.2011-20.48.41.png" alt="John Hauck on Software Development at LECO" width="461" height="258" /></a></p>
<p>John&#8217;s direct but conversational way of speaking quickly grabbed my attention. One point that he made while summarizing scrum methodology to the audience took me a little off guard (around 13:02):</p>
<blockquote><p>&#8220;It&#8217;s in your face every day, and that&#8217;s kind of what agile does for the workplace: it focuses you on what you&#8217;re doing that day, [so that] you can&#8217;t come back in two weeks and say, &#8220;Oh, yeah, I forget to do that.&#8221; So that&#8217;s, I think, the biggest benefit for motivating, and the biggest way of getting burnt out because you&#8217;re always . . . working on these tasks that need to get done; you feel like a dog. So there needs to be a balance [in] that you need to be working on your agile, but you also need some free time . . . you need to do it [development] in a sustainable way.&#8221;</p></blockquote>
<p>As I told him in later in an email, I was somewhat taken aback to hear &#8220;burnout&#8221; and &#8220;agile&#8221; in practically the same sentence &#8212; if anything, I would have expected &#8220;waterfall&#8221; or some other top-down methodology to receive the blame, as it typically does. But could agile practices which claim to promote sustainability actually be a catalyst to such a state? In response, he excerpted a section from the Agile Manifesto&#8217;s &#8220;<a href="http://agilemanifesto.org/principles.html" target="_blank">Principles</a>&#8220;:</p>
<blockquote><p>Agile processes promote sustainable development.<br />
The sponsors, developers, and users should be able<br />
to maintain a constant pace indefinitely.</p></blockquote>
<p>As is evident from distress cries such as <a title="this example" href="http://stackoverflow.com/questions/1047112/does-anyone-else-get-worn-out-using-scrum-finishing-sprint-after-sprint" target="_blank">this example</a>, by-the-book scrum doesn&#8217;t necessarily always uphold this ideal. It is easy to see how sprint followed by sprint can be, well, rather breathtaking, and just as there are no silver bullets for  blossoming productivity, there are no easy answers for solving the  problem of burnout. (As one commenter in the aforementioned link quips, perhaps &#8220;sprints&#8221; should be treated more like &#8220;laps.&#8221;)</p>
<p>At work, we use an integrated tracking solution to log tasks and bugs, plan sprints, perform reporting, and hold each other accountable. After the novelty of using the system had worn off, I remember wondering if this task-based approach helps or hinders productivity. Obviously, we need to have a formal, collaborative way of keeping track of and sharing work between developers and managers, yet despite the fact that I crave the satisfaction of ticking off a completed task as much as the next guy, there is little fulfillment in doing so repetitively unless it is part of a clearer, larger goal. (Fortunately, my good employer goes through great lengths to ensure that we do not reach a point of feeling mechanical, for which I am blessed&#8230; still, it is an interesting topic of discussion.)</p>
<p>Perhaps mostly because for me, structure hasn&#8217;t really ever been a problem. I am a detail-oriented person by nature and I thrive in an organized environment (okay, so my computer science <em>compadres </em>might use a stronger adjective). I&#8217;m a self-described productivity enthusiast, sporting over 1,000 completed tasks last year on <a href="http://www.rememberthemilk.com" target="_blank">RTM</a> alone, combined with countless tasks tracked with the aid of <a href="http://www.odevelop.com/blog/?p=260" target="_blank">Grindstone 2</a> weighing in for a total of 853 hours, 48 minutes, and 44 seconds in 2010. My Google calendar is color-coded and is an essential part of every day, yet I am ever searching for new ways to optimize my efficiency. Heck, I even made myself a nice long list for <strong>Christmas break</strong>:</p>
<p style="text-align: center;"><img class="AlignNone aligncenter" title="Christmas break TODO list" src="http://content.screencast.com/users/c_07/folders/Snagit/media/1ce3d71a-c165-4610-ac23-919ba24d625d/02.13.2011-20.24.06.png" alt="Christmas break TODO list" width="530" height="262" /></p>
<p>So what&#8217;s the point of mentioning my lame Christmas break routine? Simply to point out that I&#8217;m learning, slowly, that as nice as it is to plan out the minutia of every day, this can easily lend itself to burnout (thankfully, a trip to Chicago to visit old friends, at the end of my vacation, re-awoken and livened my otherwise tired spirit). <strong>There is a beauty and a freedom to &#8220;unstructure,&#8221;</strong> not to mention the health benefits of it. John&#8217;s talk this past week merely put a different spin on this truism, studying the phenomenon in the environment of software development.</p>
<p>Simple pragmatic antidotes that agile typically employs are the discouragement of working late, encouragement of scheduling deliberate time off, and/or providing days to research a topic or technology of personal interest. In short, leading a balanced life seems to be the most basic step to combating burnout. What I would like to suggest in addition is perhaps a more immediately applicable solution; that is, that <strong>simply recognizing the value and meaning in workplace relationships can breathe life into a schedule that has become mundane.</strong></p>
<p>I would venture to say that most of us &#8212; certainly myself &#8212; who became developers did so not out of an overwhelming desire to interact with other humans, deal with team conflicts, and put up with the formalities and processes that are necessary to successfully deliver larger projects. Rather, we signed up out of love for hacking meaningful code, only to inevitably discover that communication skills are <a href="http://www.step-10.com/SoftwareProcess/General/ProcessAndPeople.html">just as important</a> as technical qualifications to the success of a software product. What if now, instead of kicking against this system &#8212; I speak principally to myself &#8212; we viewed it as our greatest ally to keeping our job satisfaction?</p>
<p>Holding each other accountable is not only a way to keep the current   iteration on track, it is also an opportunity to recognize that even the   most motivated of developers need mutual encouragement. It can be a reminder  that the deepest motivators are not salary or even feelings of  accomplishment and worth, but rather a more fundamental solidarity with humankind in an environment that fosters the formation and growth of inter- and cross-team relationships.</p>
<p>John&#8217;s argument acknowledges the necessity of this accountability, praising agile for promoting it on a daily basis, but also cautioning that a danger lies in allowing a methodology that we typically use to free us from top-down rigidity to become merely a means of dispassionately squeezing out more effective results.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=405</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Dropbox Client and VFS for Linux-Based Devices</title>
		<link>http://www.odevelop.com/blog/?p=358</link>
		<comments>http://www.odevelop.com/blog/?p=358#comments</comments>
		<pubDate>Wed, 22 Dec 2010 21:11:55 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[Academia]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[hope college]]></category>
		<category><![CDATA[maemo]]></category>
		<category><![CDATA[meego]]></category>
		<category><![CDATA[n900]]></category>
		<category><![CDATA[open-source]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=358</guid>
		<description><![CDATA[I couldn&#8217;t have asked for a better departmental senior seminar (CSCI 481 at Hope College) this semester. On the first day of class, the professor shared his &#8220;vision&#8221; with us of a Dropbox(TM) client for the Nokia N900 mobile device and those like it &#8212; the N900 is a smartphone which runs a Debian-based Linux [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://garage.maemo.org/projects/dboxtop"><img class="alignnone size-full wp-image-395" style="border: 0pt none;" title="dboxtop_promo" src="http://www.odevelop.com/blog/wp-content/uploads/2010/12/dboxtop_promo.png" alt="" width="533" height="122" /></a></p>
<p>I couldn&#8217;t have asked for a better departmental senior seminar (CSCI 481 at Hope College) this semester. On the first day of class, the professor shared his &#8220;vision&#8221; with us of a <a href="http://www.dropbox.com" target="_blank">Dropbox(TM)</a> client for the <a href="http://maemo.nokia.com/n900/" target="_blank">Nokia N900 mobile device</a> and those like it &#8212; the N900 is a smartphone which runs a Debian-based Linux variant &#8212; whereupon he essentially allowed us to devote nearly all of our in- and out-of-class time to the project for the entire semester! The result is a working implementation for the Linux desktop (not yet ported to the N900), that I am excited to describe in brief here.</p>
<h2>Project Goals</h2>
<p>So why another Dropbox client for Linux? The following goals set DBoxTop apart from the crowd:</p>
<ul>
<li><strong>Tight integration with the operating system</strong>. <a href="http://upload.wikimedia.org/wikipedia/commons/2/27/Maemo_logo_color.svg"><img class="AlignRight" style="border: 0pt none; margin-left: 10px; margin-right: 10px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Maemo_logo_color.svg/500px-Maemo_logo_color.svg.png" alt="File:Maemo logo color.svg" width="141" height="42" /></a>Existing projects that aim to bring <a href="http://www.dropbox.com" target="_blank">Dropbox</a> to <a href="http://maemo.org/" target="_blank">Maemo</a>/<a href="http://meego.com/" target="_blank">MeeGo</a>-based devices tend to act as file viewers from a client program of some sort. This was deemed to restrictive for our purposes, so we set out with the intention to implement our client as a Virtual File System (VFS) using the Linux <a href="http://en.wikipedia.org/wiki/GVFS" target="_blank">GVFS/GIO</a> libraries.</li>
<li><strong>Storage-sensitive caching.</strong> Since our primary targeted platform is a mobile device with limited storage, we want to allow the user to limit the size of locally cached files, and the program to smartly maintain this cache by replacing files that are used least often with incoming files that need to utilize the limited cache space.</li>
<li><strong>Local/remote transparency.</strong> The user should be able to interact with (e.g., move, copy, delete, rename, etc.) all files on his or her Dropbox account in exactly the same manner whether the files are cached locally or remotely. A natural corollary (don&#8217;t you love it when your textbooks use that phrase?) is that files should only be downloaded for operations that truly need them to be local, such as opening a file to read or write.</li>
</ul>
<p>Finally, we the source code developed in this process is and will remain a part of the open-source domain.</p>
<h2>Architecture</h2>
<p>Writing a virtual filesystem for DBoxTop requires a <em>daemon</em> in C that implements a common interface by which the operating system interacts with the filesystem. The way that this works in GVFS is that the first time a file is requested, a <em>master</em> daemon determines which implementation-specific daemon to launch by extracting the <em>protocol</em> out of the URI (smb://, ftp://, trash://, dboxtop://, etc.). The master daemon spawns the appropriate child daemon, whereupon the file viewer (Nautilus, a command window, or any other program accessing the file using the GIO API) communicates with the child daemon to present the files for user interaction.</p>
<p>Essentially, the role of the child daemon is to present the filesystem in a unified format, so that the view does not have to care about its specifics. The inherent beauty in this system is that a program needs only to know the URI for the file or folder to access and manipulate it. The diagram below illustrates the GVFS daemon system.</p>
<p><a href="http://www.odevelop.com/blog/wp-content/uploads/2010/12/virtual_file_system.png"><img class="size-full wp-image-360 alignnone" style="border: 0pt none;" title="virtual_file_system" src="http://www.odevelop.com/blog/wp-content/uploads/2010/12/virtual_file_system.png" alt="The Virtual Filesystem Daemon Model in GVFS" width="499" height="291" /></a></p>
<p>As an example, suppose that some application wishes to display the directory at dboxtop://Public/fun. Assuming that this is the first time in the user&#8217;s logon session that a file on this protocol has been accessed, the process looks something like this:</p>
<ol>
<li>The master GVFS daemon launches the appropriate <em>(dboxtop) </em>daemon and calls <strong>do_mount</strong> on it so that the child daemon can perform appropriate setup. At this point, the <em>dboxtop </em>daemon performs initialization tasks.</li>
<li>The master calls <strong>do_enumerate</strong> on the daemon to request the list of files, passing the path /Public/fun.</li>
<li>The child daemon requests a file listing from Dropbox (more on how this is done later), and returns the list of file and directory names (e.g., &#8220;image1.png,&#8221; &#8220;text_file.txt,&#8221; and &#8220;another_folder&#8221;).</li>
<li>For each of these names, the master daemon calls <strong>do_query_info</strong> on the child (dboxtop) daemon, requesting metadata such as the mime type, icon, creation date, and the size of the file.</li>
<li>The user now sees the file listing, complete with metadata, as if the files were part of the local filesystem (indeed, this is the whole point of a &#8220;virtual&#8221; filesystem). The communication flow for file operations is very similar to listing files.</li>
</ol>
<p>At the time of this writing,<img src="file:///C:/Users/c.flint/Documents/My%20Dropbox/School/Fall%2010/CS%20Senior%20Seminar/Final%20presentation/Images/virtual_file_system.png" alt="" /> an SDK for the Dropbox API has not been implemented in C, so rather than spend the entire semester writing such as SDK, we chose to use the pre-existing Dropbox library written in Python. However, this meant that we either had to interop the Python and C code, or run the two components in isolation and set up Inter-Process Communication (IPC) between them. After some experimentation, we chose the latter route, using <a href="http://www.freedesktop.org/wiki/Software/dbus" target="_blank">DBus</a> for the IPC.</p>
<p>Although this was likely the easier route and leads to a nice separation of work into a &#8220;frontend&#8221; (the gateway for accessing the Dropbox SDK and displaying a simple widget-like UI) and a &#8220;backend&#8221; (the GVFS daemon supporting the dboxtop:// protocol), it somewhat muddles the distinction a bit. For while the frontend does provide the user interface as would be expected, it also acts somewhat like a backend by providing a service for the daemon. The interaction between the two can be seen from the illustration below.</p>
<p><a href="http://www.odevelop.com/blog/wp-content/uploads/2010/12/architecture.png"><img class="alignnone size-full wp-image-368" style="border: 0pt none;" title="architecture" src="http://www.odevelop.com/blog/wp-content/uploads/2010/12/architecture.png" alt="" width="560" height="259" /></a></p>
<p>The internal circular components represent modules which have specific responsibilities. For example, on the backend side, each operation can be separated into a local and a remote part: first, if the file is local, perform the operation on it in the cache; then, request that the frontend tell Dropbox to perform the same operation remotely. Needless to say, if a file is not local, then the first part is skipped and only the remote operation is performed.</p>
<p>The frontend also contains a few internal components with distinct purpose. The most prominent of these are a multi-threaded upload and download manager, and a &#8220;cache trimmer&#8221; which manages the free space in the local cache. The latter is used whenever a file operation needs to add one or more files to the cache, from the user either copying a file into the Dropbox folder from an external location (some other location on their hard disk), or requesting that a file be opened (in which case it needs to be downloaded first). What the user sees of the frontend looks like this:</p>
<p><a href="http://www.odevelop.com/blog/wp-content/uploads/2010/12/dboxtop_ui_main.png"><img class="size-full wp-image-366 alignnone" style="border: 0pt none;" title="dboxtop_ui_main" src="http://www.odevelop.com/blog/wp-content/uploads/2010/12/dboxtop_ui_main.png" alt="" width="354" height="123" /></a></p>
<p>The icon on the left launches user preferences, and the graphic on  the right &#8220;connects&#8221; or &#8220;disconnects&#8221; from Dropbox (in actuality, this  means mounting/dismounting the DBoxTop filesystem daemon).</p>
<p>The frontend is responsible for all authorization/authentication dialogs which grant the application access to the user&#8217;s Dropbox account, a preference dialog, and a multi-task progress indicator for downloads (although this workflow is currently impeded; see the end of this post for details). Its primary purpose however, as mentioned before, is to provide a bridge from the backend to the Dropbox API.</p>
<p>While the backend does not provide a graphical user interface, the user initiates interaction with it whenever he or she performs an operation on files. The avenue by which this is typically done is either via Nautilus or the command window, as shown.</p>
<p><a href="http://www.odevelop.com/blog/wp-content/uploads/2010/12/dboxtop2.png"><img class="alignnone size-full wp-image-390" style="border: 0pt none;" title="dboxtop2" src="http://www.odevelop.com/blog/wp-content/uploads/2010/12/dboxtop2.png" alt="" width="561" height="356" /></a></p>
<p>The screenshot above also hints at our goal of local/remote transparency, or that <em>all</em> of the user&#8217;s files are visible regardless of whether or not they are cached locally.</p>
<h2>Development Process</h2>
<p>Despite its drawbacks, separating the project in this way led to a rather intuitive way to organize teams. Since we had a small class of 7 people, it was decided that three persons (Ryan Alfuth, Benjamin Bockstege, and myself) would work on the backend, while the remaining students (Elijah English, Jeff Largent, Nathaniel Martin, and Ryan Veneklase) would implement the frontend and its components.</p>
<p>We practiced a loose form of the <a href="http://en.wikipedia.org/wiki/Scrum_%28development%29" target="_blank">scrum agile development process</a>, meeting once or twice a week for 10-15 minutes with our advisor, who kept track of progress for grading purposes and played a large role in sprint planning.</p>
<h2>An Incredible Experience</h2>
<p><em>This</em> is the kind of class that I can&#8217;t get enough of. Furthermore, the fact that it is not only a class that I dig but that it also counts as academic credit tickles me all shades of neon colors.</p>
<p>I learned a great deal about working with a team this semester. Perhaps the highlight of my experience was successful paired programming, which taught me a great deal about the value of patience and being willing to <em>teach</em> others to &#8220;fish&#8221; rather than &#8220;fishing&#8221; for them. It also brought the backend team very close together as a unit, with each contributing significant personal investment in time, code, and brain cycles. I also witnessed a transformation in at least one member who, as we encouraged his contribution and kept him looped in on decisions, rapidly took ownership of his involvement and could scarcely contain his enthusiasm for the project.</p>
<p>Of course, managing a project also comes with a great deal of frustration, especially when there is a large lack of communication intra- as well as inter-team. While functioning as the informal project lead &#8212; which occurred mostly because my zeal for the project, combined with a lack of leadership initiative at the onset of the project, positioned me for the role &#8212; myself in addition to a few other of the more involved folks were constantly faced with the problem of giving the remaining members of the group opportunities to be actively invested in the process, yet under the constraint of looming deadlines. More often than not an empty-handed team-mate forced one or two people on the team to pick up the slack for the other, just to be able to meet the sprint deadlines.</p>
<p>In summary, while I feel that overall we were successful, we certainly could have improved our communication and fostered greater contribution as a whole. For one thing, we should have agreed on a weekly, set schedule by which we could have met as an entire team to hash out the latest problems and solution proposals, <span style="text-decoration: line-through;">argue over</span> intelligently discuss important architecture decisions, and so on. This would have kept us much more responsible to each other. As it were, our meetings did take place fairly frequently, but they were ad-hoc, somewhat unstructured, and often lacked key developers.</p>
<h2>Current State &amp; Future Goals</h2>
<p>As of December 2010, DBoxTop is fully functional as a Dropbox client for the Linux desktop. There are, however, a few major tasks which we were not able to complete in the course of a single semester. What follows is a shortened version of DBoxTop&#8217;s to-do list:</p>
<p><strong><span style="text-decoration: underline;">Continue remedying the asynchronous downloading</span></strong></p>
<p>&#8220;Whoa, wait,&#8221; you say, &#8220;you mean to tell us you didn&#8217;t plan for asynchronous downloading of files!?&#8221; Not to worry: the system was indeed designed for this from the onset of the project, but a few technical complications got in the way of achieving fully-asynchronous file downloads that can happen concurrently and without blocking the user interface. We <em>do</em> have a functioning multi-threaded download manager on the frontend and requests to download a file from the backend are also performed on separate threads. Without delving into too much detail here, the problem currently lies in the way that the DBus message pump ties into the Glib UI loop, which has the consequence that while a service call (from backend to frontend) is waiting to return, the UI thread is effectively frozen.</p>
<p>The solution to this dilemma is to implement two-way IPC so that the frontend can asynchronously notify the backend when a download has been completed; however, this requires that the backend also provide a DBus &#8220;server&#8221; and have the threading backbone to manage download requests and their state. We made a significant amount of progress toward this end, but we ended up running out of time and had to revert the code back to its synchronous state for the product demo.  <strong></strong></p>
<p><span style="text-decoration: underline;"><strong>Port to the N900</strong></span></p>
<p>This is, of course, a major goal of the project. It should not be too difficult, however, since the N900 runs a 2.6.x Linux kernel, sports a Gnome-based desktop with GVFS/GIO support, and can run a Python interpreter. We&#8217;ll need to cross-compile the binaries and tweak a few things here and there, including using Maemo&#8217;s or MeeGo&#8217;s adaptation of Qt for our user interface. <strong></strong></p>
<p><span style="text-decoration: underline;"><strong>Authorize the application with Dropbox</strong></span></p>
<p>In order for normal  accounts (those other than our developer accounts) to be linked to our  application, we must submit our source code to Dropbox for its  &#8220;blessing.&#8221; The next goal naturally follows&#8230;</p>
<p><strong><span style="text-decoration: underline;">Provide installation packages</span> </strong></p>
<p>This is especially wanted since what we have now is nearly ready for installation and beta preview by end-users, at least on Ubuntu systems.</p>
<p>Since the backend is already setup to build with automake/autoconf, this shouldn&#8217;t be tremendously difficult. We intend to package the backend and frontend separately, but have them inter-dependent and/or create a metapackage called &#8220;dboxtop&#8221; which depends on both &#8220;dboxtop-backend&#8221; and &#8220;dboxtop-frontend.&#8221;</p>
<p>Although it is obvious that we have a long way to go on the project, my colleagues and I are extraordinarily excited to have been a part of the inception of the project, and satisfied with the progress that we have been able to make towards the end result. I look forward to see it evolve into a fully-featured client.</p>
<h2>Resources</h2>
<ul>
<li><em>Technology information</em>
<ul>
<li><a href="http://www.dropbox.com/developers" target="_blank">Dropbox for developers</a></li>
<li><a href="http://library.gnome.org/devel/gio/2.25/index.html" target="_blank">GVFS, GIO library references</a>. Note that as of this writing, there is not a lot of information here about GVFS (a rather glaring frustration to us, too). My recommendation is to download the <a href="https://launchpad.net/gvfs/+download" target="_blank">source code</a> or check out <a href="https://garage.maemo.org/scm/?group_id=1844" target="_blank">that of DBoxTop</a> to gain an understanding of the details.</li>
<li><a href="http://www.freedesktop.org/wiki/Software/dbus">DBus homepage</a></li>
<li><a href="http://www.riverbankcomputing.co.uk/software/pyqt/intro" target="_blank">PyQt homepage</a></li>
</ul>
</li>
<li><em>DBoxTop information</em>
<ul>
<li><a href="http://garage.maemo.org/dboxtop" target="_blank">Product homepage</a></li>
<li><a href="https://docs.google.com/present/edit?id=0AfRzmEBWjP5_ZGQ1ZGRmbl8yMzZncTJ0YmNjMw&amp;hl=en&amp;authkey=CMC-8Fk" target="_blank">Final presentation</a>, delivered December 9th, 2010</li>
<li><a href="https://docs.google.com/document/d/14IOqo_ZpQLL6FbREVeFCevGWN_E5PLnvYhXTzm-syjU/edit?hl=en&amp;authkey=CNym2v0J" target="_blank">Developer&#8217;s documentation</a></li>
</ul>
</li>
</ul>
<h2>Credits</h2>
<p>Out of all who contributed to the DBoxTop project this semester, <strong>special thanks </strong>go to teammates Ryan Alfuth and Benjamin Bockstege for their stellar work. In addition to his technical contributions, we also owe Jeff Largent for the DBoxTop logo. Nate is officially the Qt guru for the project, Eli wins the award for most on-topic late-night phone-calls placed, and the prize for the best humor and team spirit goes, as always, to Jeff. Thanks guys!</p>
<h2>Want to Help?</h2>
<p>If you are interested in being a part of the DBoxTop project moving forward, feel free to contact <a href="http://www.hope.edu/cs/jipping/" target="_blank">our adviser</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=358</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fall 2010 Independent Study Research Results</title>
		<link>http://www.odevelop.com/blog/?p=354</link>
		<comments>http://www.odevelop.com/blog/?p=354#comments</comments>
		<pubDate>Thu, 02 Dec 2010 23:48:12 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[Academia]]></category>
		<category><![CDATA[first]]></category>
		<category><![CDATA[hope college]]></category>
		<category><![CDATA[independent study]]></category>
		<category><![CDATA[parsing]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[research]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=354</guid>
		<description><![CDATA[Below you may find a recording of my presentation given today at Hope College, detailing the independent research project that I worked on this semester:]]></description>
			<content:encoded><![CDATA[<p>Below you may find a recording of my presentation given today at Hope College, detailing the independent research project that I worked on this semester:</p>
<p style="text-align: center;"><object id="scPlayer" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="250" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/mp4h264player.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="thumb=http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/FirstFrame.png&amp;containerwidth=400&amp;containerheight=250&amp;showstartscreen=true&amp;showendscreen=true&amp;loop=false&amp;autostart=false&amp;color=1A1A1A,1A1A1A&amp;thumb=FirstFrame.png&amp;thumbscale=45&amp;content=http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/FIRST%20--%20Assessing%20the%20Assessment%20Parser.mp4&amp;blurover=false" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="allowScriptAccess" value="always" /><param name="base" value="http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/" /><param name="src" value="http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/mp4h264player.swf" /><param name="flashvars" value="thumb=http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/FirstFrame.png&amp;containerwidth=400&amp;containerheight=250&amp;showstartscreen=true&amp;showendscreen=true&amp;loop=false&amp;autostart=false&amp;color=1A1A1A,1A1A1A&amp;thumb=FirstFrame.png&amp;thumbscale=45&amp;content=http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/FIRST%20--%20Assessing%20the%20Assessment%20Parser.mp4&amp;blurover=false" /><param name="allowfullscreen" value="true" /><embed id="scPlayer" type="application/x-shockwave-flash" width="400" height="250" src="http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/mp4h264player.swf" base="http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/" allowscriptaccess="always" scale="showall" allowfullscreen="true" flashvars="thumb=http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/FirstFrame.png&amp;containerwidth=400&amp;containerheight=250&amp;showstartscreen=true&amp;showendscreen=true&amp;loop=false&amp;autostart=false&amp;color=1A1A1A,1A1A1A&amp;thumb=FirstFrame.png&amp;thumbscale=45&amp;content=http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/FIRST%20--%20Assessing%20the%20Assessment%20Parser.mp4&amp;blurover=false" bgcolor="#FFFFFF" quality="high" data="http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/mp4h264player.swf"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=354</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://content.screencast.com/users/c_07/folders/Presentation/media/a0a3b606-59d0-40bc-b38a-fb60e5ce9925/FIRST%20--%20Assessing%20the%20Assessment%20Parser.mp4&amp;amp" length="28023509" type="video/mp4" />
		</item>
		<item>
		<title>Back-to-School Tech Essentials</title>
		<link>http://www.odevelop.com/blog/?p=343</link>
		<comments>http://www.odevelop.com/blog/?p=343#comments</comments>
		<pubDate>Sat, 28 Aug 2010 13:58:37 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[common sense]]></category>
		<category><![CDATA[digital notes]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[faviconize]]></category>
		<category><![CDATA[gcal]]></category>
		<category><![CDATA[google calendar]]></category>
		<category><![CDATA[grindstone 2]]></category>
		<category><![CDATA[permatabs]]></category>
		<category><![CDATA[remember the milk]]></category>
		<category><![CDATA[school]]></category>
		<category><![CDATA[xmarks]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=343</guid>
		<description><![CDATA[One of the rare things that I look forward to at the beginning of a school year is how I can improve and enhance my productivity from the last year. Sometimes this is a pipe dream that fades away as fast as a New Year&#8217;s resolution, but once in a while I discover a combination [...]]]></description>
			<content:encoded><![CDATA[<p>One of the rare things that I look forward to at the beginning of a school year is how I can improve and enhance my productivity from the last year. Sometimes this is a pipe dream that fades away as fast as a New Year&#8217;s resolution, but once in a while I discover a combination that works really well for me &#8212; like last year, when I ditched the flash drive and picked up a few other apps that made life as a student much easier.</p>
<p>What follows is a list of my essentials, as I see them, <em>after</em> a year of solid trial by fire. But before I do, I&#8217;d like to share a few lessons that I&#8217;ve learned, which are:</p>
<p><span style="text-decoration: underline;"><strong>The Golden Rule(s) of Productivity Tools</strong></span>.</p>
<p><em>1. If it isn&#8217;t dead simple  to use, universally accessible, and wicked fast, throw it out &#8212; no  matter how cool or 1,000-point-oh is seems.</em></p>
<p><em>2. Technology isn&#8217;t the end-all-be-all key to making you a productive person. Be willing to keep what works, throw out what doesn&#8217;t, and go old-school (i.e., with <a href="http://calnewport.com/blog/2009/08/25/the-unsinkable-student-organization-system/">manila folders and notebooks</a>) where it works better for you. The best solution is likely a happy medium between new and old.<br />
</em></p>
<p><em>3. Keep what works, but don&#8217;t be afraid of change, either. It takes a continual amount of experimentation to find what works with </em>your<em> learning/organization process. Moreover, the continual process of improving is what keeps things interesting.<br />
</em></p>
<p>Your future productive self will thank you, even if it&#8217;s super boring.</p>
<h2>1. Google Calendar + RTM plug-in</h2>
<p>This one goes without saying. <a href="http://www.zoho.com" target="_blank">Zoho</a> offers a <a href="http://www.zoho.com/calendar/" target="_blank">decent alternative</a>, but I love GCal for its simple interface to a large array of features. I keep a color-coded set of calendars (Work, School, Personal, and Critical), making sure to set up repeating events for each of the classes in my schedule the day before school begins.</p>
<p style="text-align: center;"><a href="http://content.screencast.com/users/c_07/folders/Snagit/media/b72ed907-2dd4-47b7-983c-1a6e68d013d1/08.27.2010-20.50.40.png"><img class="embeddedObject aligncenter" src="http://content.screencast.com/users/c_07/folders/Snagit/media/b72ed907-2dd4-47b7-983c-1a6e68d013d1/08.27.2010-20.50.40.png" border="0" alt="" width="465" height="350" /></a></p>
<h2>2. Firefox + Three Essential Plug-Ins</h2>
<p>Combined with <a href="https://addons.mozilla.org/en-US/firefox/addon/3780/" target="_blank">Faviconize</a> and <a href="https://addons.mozilla.org/en-US/firefox/addon/7816/" target="_blank">PermaTabs Mod</a>, my email accounts and calendar (along with the to-do list) stay front-and-center at all times. I&#8217;m pretty sure I picked up this combo from <a href="http://www.lifehacker.com" target="_blank">Lifehacker</a>, and I&#8217;m glad I did. Launching multiple hoggish desktop apps instead is less than pleasant.</p>
<p style="text-align: center;"><a href="http://content.screencast.com/users/c_07/folders/Jing/media/b4b2f23d-3953-414c-a99f-fbfaeeef0581/2010-08-27_2037.png"><img class="embeddedObject aligncenter" src="http://content.screencast.com/users/c_07/folders/Jing/media/b4b2f23d-3953-414c-a99f-fbfaeeef0581/2010-08-27_2037.png" border="0" alt="" width="462" height="358" /></a></p>
<p>Although <a href="http://www.xmarks.com/" target="_blank">Xmarks</a> is universally useful for synchronizing bookmarks (across IE and Chrome, too, if you use them), it comes in particularly handy for keeping track of links and tidbits that I&#8217;m collecting for the next big research paper.</p>
<h2>3. Dropbox</h2>
<p>I don&#8217;t know how I lived without it, but <a href="http://www.dropbox.com">Dropbox</a> has become indispensable to my workflow in more areas than just my education. The best part about this application, I am convinced, is because <strong>it  doesn&#8217;t force you to modify your standard pattern of working</strong>: just save  to the local Dropbox folder, and everything is synced automatically and  with tiny overhead.</p>
<p style="text-align: center;"><a href="http://content.screencast.com/users/c_07/folders/Snagit/media/0cda8282-f146-43cc-ac17-0f2f8738d916/08.27.2010-20.59.49.png"><img class="embeddedObject aligncenter" src="http://content.screencast.com/users/c_07/folders/Snagit/media/0cda8282-f146-43cc-ac17-0f2f8738d916/08.27.2010-20.59.49.png" border="0" alt="" width="571" height="303" /></a></p>
<p>I keep a folder for the current school year along with subfolders for each class that I&#8217;m taking. Working across multiple computers is a snap because I don&#8217;t have to think about where the files are stored &#8212; and if I want to walk to the library and print out the essay I&#8217;ve just labored over, there&#8217;s no need to bring a laptop, because all of the data is accessible from the web.</p>
<p>I even <a href="http://www.odevelop.com/blog/?p=329">synchronize my time spent working remotely</a>, logged with <a href="http://www.epiforge.com/Grindstone2/">Grindstone</a>, using Dropbox. It rocks.</p>
<h2>4. Remember the Milk</h2>
<p><a href="http://www.rememberthemilk.com" target="_blank">RTM</a> is an online to-do list on steroids, but its brawn isn&#8217;t immediately transparent thanks to a simple and effective user interface. I&#8217;ve evaluated a range of alternatives from <a href="http://www.taskcoach.org/" target="_blank">Task Coach</a>, to <a href="http://teuxdeux.com/" target="_blank">TeuxDeux</a>, to <a href="http://www.toodledo.com" target="_blank">Toodledo</a>, but none strike the same balance of features and simplicity of use as Remember the Milk offers. I logged and completed more than 1000 tasks over the course of my Junior year, and felt considerably more productive.</p>
<p style="text-align: center;"><a href="http://content.screencast.com/users/c_07/folders/Snagit/media/eea95008-b5a3-4c09-8298-70a9121f53e6/08.27.2010-21.09.29.png"><img class="embeddedObject aligncenter" src="http://content.screencast.com/users/c_07/folders/Snagit/media/eea95008-b5a3-4c09-8298-70a9121f53e6/08.27.2010-21.09.29.png" border="0" alt="" width="659" height="392" /></a></p>
<p>The process I used morphed a bit from the first to second semester, but here&#8217;s a rough overview:</p>
<ol>
<li>If the professor has been kind enough to plan all of the assignments, homework, and due dates into the Syllabus, these go directly into RTM within the first week. It&#8217;s a lot of typing, but it pays off in the time it saves by having all assignments due for the the day centrally located.<br />
The keyboard shortcuts that RTM features are well worth the effort of learning &#8212; and it doesn&#8217;t take much; they&#8217;re all single-key. Here&#8217;s the combination I use most:</p>
<ol>
<li><strong>t &#8211; </strong>create a new task</li>
<li><strong>d &#8211; </strong>set the date</li>
<li>(repeat above as needed)</li>
<li><strong>m &#8211; </strong>manipulate multiple tasks</li>
<li><strong>s &#8211; </strong>tag all selected</li>
<li><strong>n &#8211; </strong>deselect all</li>
<li>(repeat 1-6 for all each day up to a month in advance, for  each class)</li>
</ol>
</li>
<li>Each week, I do my best to review both my calendar and all tasks on RTM <strong>two weeks in advance</strong>, <em>making new tasks</em> for the current week as necessary (for the larger projects) in order to meet deadlines for homework assignments and such that are logged with current tasks. This way I am reminded to start the longer-term projects early; the dailies are performed and checked off in a normal fashion.</li>
<li>The prior two steps enable me to practice a greatly simplified morning  routine, consisting of a brief visit to my Calendar and a click on the RTM drop-down for the day.</li>
</ol>
<h2>Notes: Digital or Not?</h2>
<p><img class="AlignRight" src="http://www.best-career-match.com/images/pen-pad-opt.jpg" alt="" width="187" height="140" />My sophomore year, I grabbed Office Ultimate 2007 on <a href="http://www.theultimatesteal.com" target="_blank">UltimateSteal</a>, and immediately made a snap decision to take all of my notes on my laptop. As excited as I was for OneNote, though, my plentiful math and science classes soon made the effort to keep digital notes more trouble than it was worth, particularly after the &#8220;shine&#8221; wore off of the experience.</p>
<p>Actually, I still don&#8217;t use the program since I dropped it, even though I regard it as a brilliant app &#8212; and have at least one coworker who swears by it.  The reason that I take notes by hand these days is primarily because of the following:</p>
<ol>
<li>I am a Computer Science student. I spend way too much time at the screen already, and staring at a laptop to take notes isn&#8217;t that profitable when I am inevitably doomed to trudge back to the dorm and spend a late evening hacking code.</li>
<li>Although I&#8217;m now running Office 2010 with all of the Live features that the suite has to offer, I&#8217;ve found that text documents synced with Dropbox does just as well for the vast majority of notes that I <em>do</em> need to store digitally, with much less overhead.</li>
<li>There is an inexplicable, intangible feeling of investment in the note-taking process when it is done by hand; a satisfying sensation of seeing ink splash across the page that a keyboard can&#8217;t even come close to replacing.</li>
<li>My laptop weighs a bazillion pounds. I hate lugging the thing around with a passion, and the loud, rattling CD tray invariably revvs up during class.</li>
</ol>
<p>Of course, taking notes with a laptop comes with its advantages: at the top of the list is that typed notes are much faster to take than handwritten ones, closely followed by pros of instant searchability, and easy backups.</p>
<p>This year, I&#8217;m considering adapting the <a href="http://lifehacker.com/125400/cornell-notetaking-method" target="_blank">Cornell Note-taking method</a>.</p>
<h2>Wrap-Up</h2>
<p>Though the combination of tools and processes above is from last year, since I am please with the way that it turned out, I&#8217;m going to do my best to resist the tech-junkie&#8217;s urge to try new services and stick with what works for my senior year.</p>
<p>Do you have a better process or combination of technology that works better for you? Let me know in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=343</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sync Grindstone 2 Tasks with Dropbox</title>
		<link>http://www.odevelop.com/blog/?p=329</link>
		<comments>http://www.odevelop.com/blog/?p=329#comments</comments>
		<pubDate>Sun, 23 May 2010 03:49:17 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[grindstone 2]]></category>
		<category><![CDATA[junction]]></category>
		<category><![CDATA[symbolic link]]></category>
		<category><![CDATA[sync]]></category>
		<category><![CDATA[tasks]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=329</guid>
		<description><![CDATA[Grindstone 2, the task management and time tracking solution from Epiforge, has become an indispensable component of my workflow (I did a full review on this great utility a little while back that you can find here). Recently I discovered a way to seamlessly synchronize tasks on multiple computers if you&#8217;re already using Dropbox. IMPORTANT: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.epiforge.com/Grindstone2/" target="_blank">Grindstone 2</a>, the task management and time tracking solution from <a href="http://www.epiforge.com" target="_blank">Epiforge</a>, has become an indispensable component of my workflow (I did a full review on this great utility a little while back that you can find <a href="http://www.odevelop.com/blog/?p=260">here</a>). Recently I discovered a way to seamlessly synchronize tasks on multiple computers if you&#8217;re already using <a href="http://www.dropbox.com">Dropbox</a>.</p>
<p>IMPORTANT: Play it safe&#8230; please backup your data before continuing!</p>
<ol>
<li>Ensure that Grindstone is fully closed (right click on system tray icon and select Exit).</li>
<li>Create a folder named &#8220;Grindstone 2,&#8221; or something you can remember, in your Dropbox folder on the local file system. For example, <em>C:\Users\&lt;YourName&gt;\Documents\My Dropbox\Work\Grindstone Mobile\Grindstone 2</em>.</li>
<li>Locate <em>C:\Users\&lt;YourName&gt;\AppData\Roaming\Grindstone 2</em> and copy its entire contents to the folder you just created in (2).
<p><img class="size-full wp-image-330 alignnone" title="gsync1" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/gsync1.png" alt="gsync1" width="437" height="322" /></p>
<p>Before continuing, ensure that the folder that you&#8217;ve just copied contains, among other files, <em>config.gsc2</em> &#8212; this is the XML file that Grindstone uses to keep track of settings, tasks, segments, and all your other saved information.</li>
<li>Rename the original (in <em>AppData\Roaming</em>) to something like &#8220;Grindstone 2 Backup.&#8221;<br />
<img class="alignnone size-full wp-image-331" title="gsync2" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/gsync2.png" alt="gsync2" width="390" height="193" /></li>
<li>Download <a href="http://download.sysinternals.com/Files/Junction.zip" target="_blank">Junction</a>, a free utility from Microsoft. We&#8217;re going to use it to create a <em>soft link</em> from the original location to the new location within Dropbox&#8217;s jurisdiction, so that Grindstone 2 will link to the data indirectly when the program starts, without being able to tell the difference. NOTE: Normal Windows links (i.e., .lnk files to a folder) will <em>not</em> work for this purpose.</li>
<li>From wherever you extracted Junction, hold down shift and right-click in Explorer, and select &#8220;Open command window here.&#8221;<img class="alignnone size-full wp-image-332" title="gsync3" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/gsync3.png" alt="gsync3" width="277" height="182" /></li>
<li>Now, execute the following instruction to create the soft link (note that this is actually all one line):<br />
<code><br />
junction "C:\Users\&lt;YourName&gt;\AppData\Roaming\Grindstone 2" "C:\Users\&lt;YourName&gt;\Documents\My Dropbox\Work\Grindstone Mobile\Grindstone 2"</code></p>
<p>The result of this command is shown below:</p>
<p><img class="alignnone size-full wp-image-333" title="gsync4" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/gsync4.png" alt="gsync4" width="452" height="166" /></li>
<li>To verify that this worked, you can <code>cd</code> to <em>Roaming</em> and execute <code>dir</code>. What you see should resemble the following:<br />
<img class="alignnone size-full wp-image-334" title="gsync5" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/gsync5.png" alt="gsync5" width="450" height="159" /></li>
<li>Now for the true test: launch Grindstone, and verify that all your profiles and tasks are intact.</li>
</ol>
<p>Repeat this process on any other computer that you wish to sync Grindstone with. Note that in order for the tasks to be synchronized, it will be necessary to shut down Grindstone at the end of your work day since Dropbox cannot sync files that are in use.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=329</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>CSCI 495 (Computer Security) Final Project</title>
		<link>http://www.odevelop.com/blog/?p=298</link>
		<comments>http://www.odevelop.com/blog/?p=298#comments</comments>
		<pubDate>Sat, 22 May 2010 22:32:27 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[KillJoy]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[arp]]></category>
		<category><![CDATA[attack]]></category>
		<category><![CDATA[educational]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[scapy]]></category>
		<category><![CDATA[spoof]]></category>
		<category><![CDATA[tcp]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=298</guid>
		<description><![CDATA[This year, I took a special-offer class in Computer Security, in which each individual was required to develop an application over the course of the semester to demonstrate a vulnerability in network security; one that we had discussed and explored as a class. For my part, I wrote an application to perform mobile remote session [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><img class="AlignRight size-full wp-image-315" title="killjoy" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/killjoy.jpg" alt="killjoy" width="84" height="82" />This year, I took a special-offer class in Computer Security, in which each individual was required to develop an application over the course of the semester to demonstrate a vulnerability in network security; one that we had discussed and explored as a class. For my part, I wrote an application to perform mobile remote session monitoring and management for TCP-based protocols &#8212; which is a bit of a mouthful, so here&#8217;s a bit more elaboration from the documentation:</p>
<blockquote style="text-align: center;">
<p style="margin-bottom: 0in; text-align: left;"><em>KillJoy is a mobile TCP session monitor which allows for termination of specific sessions in addition to complete denial of service to a specific computer on the network. In its current implementation, KillJoy is designed to run for and has been tested on the Nokia n810 Internet Tablet, running Maemo 4 (Diablo); however, a minimalistic version also runs as a desktop application (both are experimental works in progress).</em></p>
<p style="margin-bottom: 0in; text-align: left;"><em>KillJoy&#8217;s main strength and distinction is that it does its work as a normal computer on the network, without needing to redirect all traffic through itself or act as a gateway in the form of an Intrusion Detection System (IDS). Instead, it accomplishes this via TCP and ARP packet injection. Furthermore, KillJoy is a flexible tool, allowing both interactive (manual) termination of sessions and automated control based on preset rules. </em></p>
</blockquote>
<p style="text-align: left;">Some initial goals for the project included:</p>
<ul style="text-align: left;">
<li>Maximum portability (application must run on a handheld device)</li>
<li>The ability to perform passive monitoring and when necessary, assert active control over an existing TCP session on the network <em>without</em> elevated privileges, provided that access to the network itself has been established (i.e., the network is unprotected or we have previously retrieved the network key)</li>
<li>The capability to automatically detect and terminate <em>sessions</em> (connections between a local client and a remote host) that have been previously detected and &#8220;blacklisted&#8221; by the user</li>
<li>The capacity to perform higher-level protocol analysis, in order to distinguish between traffic which uses the TCP protocol (Bittorrent, Windows Media, etc.). This goal was not achieved by the culmination of the project.</li>
</ul>
<p style="text-align: left;">My original intent for this project was to be able to selectively exclude certain traffic from a network; ultimately this goal was achieved to the extent that the user can control the <em>who</em>, but not the <em>what</em>, since time did not permit the integration of higher protocol analysis into the product. Of course, it should go without saying that the project was intended for educational, and not nefarious purposes!</p>
<p style="text-align: left;">The implementation makes use of the technologies listed below. For more information on the development details, please refer to the presentation linked to at the end of this post.</p>
<ul style="text-align: left;">
<li>Python 2.5</li>
<li><a href="http://www.secdev.org/projects/scapy/" target="_blank">Scapy</a> from SecDev.org (provides low-level packet inspection, modification, etc. from Python)</li>
<li>The PyGTK library (Python bindings for the GTK+ user interface toolkit)</li>
</ul>
<p style="text-align: left;">Let&#8217;s look at an example of KillJoy&#8217;s workflow on the Nokia n810. The application begins to monitor network traffic via packet inspection immediately upon startup, listing all detected sessions for every local IP on the network.</p>
<p style="text-align: center;"><img class="size-full wp-image-312  aligncenter" title="terminate" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/terminate.png" alt="terminate" width="403" height="246" /></p>
<p style="text-align: left;">The above menu is displayed upon right-clicking on a session (note that right-clicking on a <em>target</em>, or the parent node in the treeview will display only the second and fourth options, as these operate on child sessions for the local IP in aggregate).</p>
<p style="text-align: left;">Upon selecting the <strong>Terminate session </strong>menu item, the remote connection is forcibly terminated. To accomplish this, KillJoy hijacks the TCP session and sends in-sequence RST packets to the remote host. (Note that the session will only be removed from view when a certain amount of traffic has passed without any further indication that the connection still exists.)</p>
<p style="text-align: center;">
<p style="text-align: center;"><img class="size-full wp-image-314  alignnone" title="terminate_warning" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/terminate_warning.png" alt="terminate_warning" width="399" height="244" /></p>
<p style="text-align: center;"><img class="size-full wp-image-313 alignnone" title="terminate_do" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/terminate_do.png" alt="terminate_do" width="401" height="245" /></p>
<p style="text-align: left;">Towards the end of the project, I began to realize that KillJoy was not picking up all traffic from the wireless access point; instead, the only packets being detected and processed were only those sent from or received by the device itself. This was puzzling, since the network interface is supposedly capable of being dropped into monitor mode &#8212; and indeed, executing <code>iwconfig wlan0 mode monitor</code> returns without any error, but <code>tcpdump</code> is still not able to pick up any third-party traffic thereafter. Eventually this led me to the conclusion that the NIC hardware on the Nokia n810 (or the driver used for it) is not able to support true promiscuous / monitor mode, so to work around it, I implemented the capability to perform a Man-in-the-Middle (MiTM) attack on any number of devices on the network in order to view their traffic. Here&#8217;s how this might go:</p>
<ol style="text-align: left;">
<li>The user, realizing that not all traffic is being picked up by the device, uses KillJoy to perform an ARP scan on the network to discover all active devices.</li>
<li>From this list of local active devices, the user chooses a subset of IPs to add to the MiTM list.</li>
<li>From this point on, an ARP spoof attack will be performed and maintained on each of the devices, positioning the attacker between the devices and the gateway, thus allowing him or her to view all traffic previously undetectable.</li>
<li>When the user exits the application, KillJoy automatically restores the ARP caches on all the devices from the MiTM list, resulting with (hopefully) minimally-detectable intrusion.</li>
</ol>
<p style="text-align: center;"><img class="size-full wp-image-301  aligncenter" title="arp_discover" src="http://www.odevelop.com/blog/wp-content/uploads/2010/05/arp_discover.png" alt="arp_discover" width="401" height="245" /></p>
<p style="text-align: left;">Note that it is also possible to manually specify and IP for ARP redirection if the IP is known.</p>
<p style="text-align: left;">I tested this approach with an off-the-shelf Netgear home router and it worked well; however, on other networks the ARP attacks were thwarted by presumably up-to-date router firmware intended to prevent such a well-known attack. However, the features provide an additional level of built-in capability to the user, should the program be used on a network device that does not support full promiscuous monitoring of packets.</p>
<p style="text-align: left;">Finally, without further jabber: a demo of KillJoy in action! <i>Warning:</i> mild drama.</p>
<p style="text-align: center;"><object width="400" height="250" data="http://content.screencast.com/users/c_07/folders/odevelop/media/d0ca3a06-16c4-4d5b-b94a-36e73ffeceae/mp4h264player.swf" type="application/x-shockwave-flash"><param name="id" value="scPlayer" /><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="thumb=http://content.screencast.com/users/c_07/folders/odevelop/media/d0ca3a06-16c4-4d5b-b94a-36e73ffeceae/FirstFrame.jpg&amp;containerwidth=400&amp;containerheight=250&amp;content=http://content.screencast.com/users/c_07/folders/odevelop/media/d0ca3a06-16c4-4d5b-b94a-36e73ffeceae/KillJoy%20Demo.mp4" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="allowScriptAccess" value="always" /><param name="base" value="http://content.screencast.com/users/c_07/folders/odevelop/media/d0ca3a06-16c4-4d5b-b94a-36e73ffeceae/" /><param name="src" value="http://content.screencast.com/users/c_07/folders/odevelop/media/d0ca3a06-16c4-4d5b-b94a-36e73ffeceae/mp4h264player.swf" /><param name="flashvars" value="thumb=http://content.screencast.com/users/c_07/folders/odevelop/media/d0ca3a06-16c4-4d5b-b94a-36e73ffeceae/FirstFrame.jpg&amp;containerwidth=400&amp;containerheight=250&amp;content=http://content.screencast.com/users/c_07/folders/odevelop/media/d0ca3a06-16c4-4d5b-b94a-36e73ffeceae/KillJoy%20Demo.mp4" /><param name="allowfullscreen" value="true" /></object></p>
<p style="text-align: left;">For a more detailed and complete description of KillJoy&#8217;s features, or to inspect its internals, please refer to the following links:</p>
<ul style="text-align: left;">
<li><a href="http://www.odevelop.com/downloads.html#killjoy">Download page</a></li>
<li><a href="http://www.odevelop.com/projects/killjoy/killjoy.pdf" target="_blank">Presentation</a> (as given at <a href="http://www.hope.edu" target="_blank">Hope College</a> on the 21st of April, 2010)</li>
<li><a href="http://www.odevelop.com/projects/killjoy/installation_and_usage.pdf" target="_blank">Installation &amp; Getting Started Guide</a> (PDF, 2MB)</li>
<li>Source code (<a href="http://svn.odevelop.com/killjoy">SVN</a>, <a href="http://www.odevelop.com/downloads/killjoy_0.1.zip" target="_blank">archive [0.1]</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=298</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://content.screencast.com/users/c_07/folders/odevelop/media/d0ca3a06-16c4-4d5b-b94a-36e73ffeceae/KillJoy%20Demo.mp4" length="6414149" type="video/mp4" />
		</item>
		<item>
		<title>He Liveth Still [or, Put to Rest Speculation]</title>
		<link>http://www.odevelop.com/blog/?p=293</link>
		<comments>http://www.odevelop.com/blog/?p=293#comments</comments>
		<pubDate>Sun, 25 Apr 2010 23:57:42 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[exams]]></category>
		<category><![CDATA[grandparents]]></category>
		<category><![CDATA[school]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=293</guid>
		<description><![CDATA[How do you respond to a long-outdated email, neglected like so many other things during the school year, sent by concerned grandparents? Answer: lyrical inspiration&#8230; This is none else than the inspirational tale Of an email which nearly failed Sadly, to complete circulation And put to rest wild and undue speculation Concerning a certain well-meaning [...]]]></description>
			<content:encoded><![CDATA[<p>How do you respond to a long-outdated email, neglected like so many other things during the school year, sent by concerned grandparents? Answer: lyrical inspiration&#8230;</p>
<p style="text-align: center;">
This is none else than the inspirational tale<br />
Of an email which  nearly failed<br />
Sadly, to complete circulation<br />
And put to rest wild  and undue speculation
</p>
<p style="text-align: center;">
Concerning a certain well-meaning patron<br />
Not,  however, given to over-communication<br />
Being as he is confined to a life of hard labor<br />
(That is to books,  and lectures, and paper,)
</p>
<p style="text-align: center;">
His good grandparents, in deep concern<br />
Wrote  an epistle to discern<br />
The awful state which was ensuing<br />
Their  grandson and consuming
</p>
<p style="text-align: center;">
His life, a poor and gruesome fate<br />
Concluded many, when the hour  drew late<br />
Rumors and speculations abounded<br />
Greedy siblings his  possessions divided
</p>
<p style="text-align: center;">
And when no reply was forthcoming<br />
Cries  and wails were heard in mourning<br />
But hark! When all seemed despairing:
</p>
<p style="text-align: center;">
<em>Projects were finished!<br />
Deadlines  were met!<br />
Homework completed!<br />
Procrastination repressed! </em>
</p>
<p style="text-align: center;">
And  the email lives! No more is it lost<br />
Deep in the clutches of a  cluttered in-box<br />
In fully good health, the prodigal taps a reply<br />
Sipping on coffee,  which he has come by
</p>
<p style="text-align: center;">
Honestly, thanks to a generous donation<br />
(Which,  by the way, deserves admiration)<br />
And hereby sends you his thanks,  and moreover<br />
Proof of existence, which can&#8217;t be glossed over
</p>
<p style="text-align: center;">
For chances of  further survival is bleak<br />
Due to threat of examinations, arriving in  two weeks<br />
And if God deems to stay their vicious attack<br />
His kind  roommates have offered to pick up the slack
</p>
<p style="text-align: center;">
But before he goes down in glorious battle<br />
He feels it his duty  to surface, and prattle<br />
A bit, taking respite to thank his dear  benefactors<br />
Grateful for patience, thankful for prayers
</p>
<p style="text-align: center;">
As  always, hoping to be reunited<br />
Unless, of course, school his fate has decided<br />
But until then he  wishes his love to send&#8230;
</p>
<p style="text-align: center;">
And with that<br />
this belated reply<br />
does  hereby<br />
come to an end.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=293</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SoThink SWF Quicker 4.7 Free Today</title>
		<link>http://www.odevelop.com/blog/?p=287</link>
		<comments>http://www.odevelop.com/blog/?p=287#comments</comments>
		<pubDate>Wed, 06 Jan 2010 16:13:17 +0000</pubDate>
		<dc:creator>cameron</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[giveawayoftheday]]></category>
		<category><![CDATA[sothink]]></category>
		<category><![CDATA[swf quicker]]></category>

		<guid isPermaLink="false">http://www.odevelop.com/blog/?p=287</guid>
		<description><![CDATA[The alternative Flash IDE from SoThink, normally $72.21, is free today ONLY on http://www.giveawayoftheday.com. SWF Quicker has some interesting features such as importing a project from .SWFs and .FLVs, as well as a standard editing interface that resembles Flash CS3 but with a seemingly snappier interface. For a complete list of features, see the first [...]]]></description>
			<content:encoded><![CDATA[<p>The alternative Flash IDE from SoThink, normally $72.21, is free today ONLY on http://www.giveawayoftheday.com. SWF Quicker has some interesting features such as importing a project from .SWFs and .FLVs, as well as a standard editing interface that resembles Flash CS3 but with a seemingly snappier interface. For a complete list of features, see the first link below.</p>
<p><strong>Product home page</strong>: <a href="Product home page: http://www.sothink.com/product/swfquicker/" target="_blank">http://www.sothink.com/product/swfquicker/</a><br />
<strong> Download page (today only)</strong>: <a href="http://www.giveawayoftheday.com/swf-quicker-4-7-holiday/" target="_blank">http://www.giveawayoftheday.com/swf-quicker-4-7-holiday/</a></p>
<p>I&#8217;ve put together a quick video to show you how to extract the installer file from its Giveawayoftheday wrapper (useful since the wrapped executable will only allow installation today). The video also demonstrates importing a .SWF as a new project. Running length: 5:32.</p>
<p><object width="400" height="309" data="http://content.screencast.com/users/c_07/folders/Presentation/media/0a0e73bc-135d-40e2-b321-dac2297fc9af/mp4h264player.swf" type="application/x-shockwave-flash"><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="thumb=http://content.screencast.com/users/c_07/folders/Presentation/media/0a0e73bc-135d-40e2-b321-dac2297fc9af/FirstFrame.png&amp;containerwidth=400&amp;containerheight=309&amp;showstartscreen=true&amp;showendscreen=true&amp;loop=false&amp;autostart=false&amp;color=1A1A1A,1A1A1A&amp;thumb=FirstFrame.png&amp;thumbscale=45&amp;content=http://content.screencast.com/users/c_07/folders/Presentation/media/0a0e73bc-135d-40e2-b321-dac2297fc9af/SoThink%20SWF%20Quicker%20on%20Giveawayoftheday.com.mp4" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="allowScriptAccess" value="always" /><param name="base" value="http://content.screencast.com/users/c_07/folders/Presentation/media/0a0e73bc-135d-40e2-b321-dac2297fc9af/" /><param name="src" value="http://content.screencast.com/users/c_07/folders/Presentation/media/0a0e73bc-135d-40e2-b321-dac2297fc9af/mp4h264player.swf" /><param name="flashvars" value="thumb=http://content.screencast.com/users/c_07/folders/Presentation/media/0a0e73bc-135d-40e2-b321-dac2297fc9af/FirstFrame.png&amp;containerwidth=400&amp;containerheight=309&amp;showstartscreen=true&amp;showendscreen=true&amp;loop=false&amp;autostart=false&amp;color=1A1A1A,1A1A1A&amp;thumb=FirstFrame.png&amp;thumbscale=45&amp;content=http://content.screencast.com/users/c_07/folders/Presentation/media/0a0e73bc-135d-40e2-b321-dac2297fc9af/SoThink%20SWF%20Quicker%20on%20Giveawayoftheday.com.mp4" /><param name="allowfullscreen" value="true" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.odevelop.com/blog/?feed=rss2&amp;p=287</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://content.screencast.com/users/c_07/folders/Presentation/media/0a0e73bc-135d-40e2-b321-dac2297fc9af/SoThink%20SWF%20Quicker%20on%20Giveawayoftheday.com.mp4" length="9351810" type="video/mp4" />
		</item>
	</channel>
</rss>

