<?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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Frank Grimm</title>
	
	<link>http://blog.frankgrimm.net</link>
	<description>blog.frankgrimm.net</description>
	<lastBuildDate>Tue, 14 Jun 2011 19:56:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/frankgrimm" /><feedburner:info uri="frankgrimm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Accessing the HTTP message body (e.g. POST data) in node.js</title>
		<link>http://feedproxy.google.com/~r/frankgrimm/~3/iPmAvhAgAbQ/</link>
		<comments>http://blog.frankgrimm.net/2010/11/howto-access-http-message-body-post-data-in-node-js/#comments</comments>
		<pubDate>Tue, 09 Nov 2010 16:26:24 +0000</pubDate>
		<dc:creator>Frank Grimm</dc:creator>
				<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://blog.frankgrimm.net/?p=208</guid>
		<description><![CDATA[A little howto on accessing and decoding HTTP body data (such as those generated by HTML forms) the node.js way.]]></description>
			<content:encoded><![CDATA[<p>A pretty common task for every web application is handling user input. While frameworks like <a href="http://expressjs.com/"title="express" >express</a> or <a href="http://senchalabs.github.com/connect"title="connect" >connect</a> provide convenient methods to access this data there seemed to be some confusion and the lack of a stripped down example for pure node.js HTTP server approaches. This post is intended to fill that gap, thoughts or an understandable but yet more minimalistic approach they can put in the API documentation are very welcome.</p>
<h2>Full solutions</h2>
<p><strong>Update (12/07): </strong>This article has been getting a lot of link-love lately. For those of you who are looking for a full solution on handling and parsing forms in Node.js might be interested in:</p>
<ul>
<li><a href="https://github.com/visionmedia/connect-form">connect-form</a> (<a href="http://visionmedia.github.com/connect-form/">docs</a>) Form parsing middleware for Connect</li>
<li><a href="https://github.com/felixge/node-formidable">node-formidable</a> Form parser w/ support for file-uploads</li>
<li>The <a href="https://github.com/ry/node/wiki/modules">module page</a> in the Node.js wiki where other alternatives may be found.</li>
</ul>
<p>The rest that follows, the original article, explains what those modules are doing under the hood.</p>
<h2>Server and routes setup</h2>
<p>For our example we need a HTTP server instance with a request handler that defines two routes:</p>
<ul>
<li>&#8216;/&#8217; A simple web page with a HTML form.</li>
<li>&#8216;/formhandler&#8217; which accepts POST requests and handles the body that is generated by the form</li>
</ul>
<p>All other requests (such as GET requests for favicon.ico) will be answered by a <em>404 Not found</em> message.</p>
<p>To get started we use the following code which handles our two routes by sending back a <em>501 Not implemented</em> response.</p>
<p><script src="https://gist.github.com/669233.js?file=nodepost-1.js"></script></p>
<p>If you&#8217;re running the code locally you should now be able to visit <strong>http://localhost:8080/</strong> in your browser.</p>
<h2>A simple form</h2>
<p>In the next step we change the browser for the start URL &#8216;/&#8217; to present the user with a little web form by exchanging that part of the switch statement with a <em>200 OK</em> response together with the appropriate HTML:</p>
<p><script src="https://gist.github.com/669233.js?file=nodepost-2.js"></script></p>
<p>The &#8216;/formhandler&#8217; part remains unchanged for now. If you run the script and visit the page in your browser you&#8217;ll be presented with a form asking for name and age.</p>
<p>Notice that the enctype parameter of the form is set to <strong>application/x-www-form-urlencoded</strong>. This specifies how the data is encoded and sent by the browser. URL encoding is okay for simple forms without file upload capabilities for example. What&#8217;s even better is that node.js provides a built-in module to parse this type of data. We&#8217;ll use it in a later step. The other parameters specify that by submitting the form the data should be sent to the &#8216;/formhandler&#8217; route inside a POST request.</p>
<h2>Read the message body</h2>
<p>In a HTTP request we&#8217;re only looking for the header part that tells us what the browser is requesting. The body, that may contain everything from the two key/value combinations we use in the example up to multiple files, is seperated from the header part by two line breaks. What follows is mostly either URL encoded data or <strong>multipart/form-data</strong> &#8211; which is basically data sent in distinguishable small chunks.</p>
<p>In node.js the request event we&#8217;re already handling is emitted when the header is fully received and parsed. This is at a time where the client&#8217;s browser may still be sending body data, if we want to use it or not. The only route we set up that has to handle this data on our side is the &#8216;/formhandler&#8217; route (and even then it should only use the data if it is inside a POST request). We exchange our previous 501 code for this route with the following code:</p>
<p><script src="https://gist.github.com/669233.js?file=nodepost-3.js"></script></p>
<p>Multiple things are introduced here. First we check the HTTP headers if the request is a POST request (<em>req.method</em>). If that&#8217;s not the case (say because the user went to <strong>http://localhost:8080/formhandler</strong> without using the submit button) a simple <em>405 Method not supported</em> error page is generated.</p>
<p>If the headers indicate that it&#8217;s really a POST request we start listening for two events of the request object:</p>
<ul>
<li>data: Is triggered whenever body data comes in at the TCP socket level. Note that this doesn&#8217;t neessarily contain all the data, hence it&#8217;s called a chunk.</li>
<li>end: Is triggered when the HTTP request is completed. This indicates that all body data associated with it was read and the appropriate data events have been triggered.</li>
</ul>
<p>Above code outputs every chunk of data it receives to the console (after converting it from a Buffer to String) and sends an empty <em>200 OK</em> response to the client when the request is completely received.</p>
<h2>Buffer and decode</h2>
<p>So we learned that the body data of our HTTP request is encoded in someway, which means that we&#8217;ll have to decode it, as well as the fact that it may come in chunks of unknown size. The latter means that we will have to buffer each chunk of data until we have the data we need to decode it.</p>
<p>For the sake of simplicity we will do this by converting every chunk that comes in at a data event to a string variable and buffer that until the request is completed:</p>
<p><script src="https://gist.github.com/669233.js?file=nodepost-4.js"></script></p>
<p>Note that the variable <em>fullBody</em> which contains all of the data is declared and initialized outside of the event handlers for <em>data </em>and <em>end</em>. This is essential because both need to have access to it.</p>
<p>Running this code will throw an error if you forgot to require the <em>querystring</em> module needed to decode the body data or the <em>utils </em>module which is just used to <em>inspect() </em>the decoded object. After adding those <em>require()</em> calls to the top of the code running the example will present the user with a JSON structure containing the username and userage keys and the data that has been entered into the form.</p>
<h2>Okay that&#8217;s just weird, I want my $_POST</h2>
<p>Granted, this blog post is intended to be really introductory and extensive for those who are just getting started with node.js.</p>
<p>If that&#8217;s inconvenient you should go with one of the previously mentioned frameworks that will do most of the work for you (e.g. the bodyDecoder middleware for connect).</p>
<h2>What if I want file uploads &amp; stuff?</h2>
<p>If you have more complex or larger data structures in your HTTP body you might want to check the HTTP headers which encoding type is sent or process single key/value combinations as they get streamed in. If that&#8217;s the case and you are looking for a more convenient alternative you should check the body decoder middleware or module of one of the <a href="https://github.com/ry/node/wiki/modules"title="module page" >web server frameworks</a> available in node.js or a standalone module that parses it.</p>
<h3>For more details&#8230;</h3>
<p>&#8230;check out the API docs at <a href="http://nodejs.org"title="nodejs.org" >nodejs.org </a>and join #Node.js on freenode or the mailing list if you get stuck. The full example code can be found in <a href="https://gist.github.com/669233"title="full gist" >the gist</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frankgrimm.net/2010/11/howto-access-http-message-body-post-data-in-node-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.frankgrimm.net/2010/11/howto-access-http-message-body-post-data-in-node-js/?source=rss</feedburner:origLink></item>
		<item>
		<title>How Twitter finally became useful…</title>
		<link>http://feedproxy.google.com/~r/frankgrimm/~3/CVG1ckWiF0I/</link>
		<comments>http://blog.frankgrimm.net/2010/09/how-twitter-finally-became-useful/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 20:05:52 +0000</pubDate>
		<dc:creator>Frank Grimm</dc:creator>
				<category><![CDATA[Social]]></category>

		<guid isPermaLink="false">http://blog.frankgrimm.net/?p=199</guid>
		<description><![CDATA[...or: Things you might not have yet noticed in #NewTwitter.]]></description>
			<content:encoded><![CDATA[<p><em>&#8230;or: Things you might not have yet noticed in #NewTwitter.</em></p>
<p><em><span style="font-style: normal;"> </span></em></p>
<p><em></p>
<div class="wp-caption alignright" style="width: 71px"><img title="Twitter - Dark Button" src="http://twitter-badges.s3.amazonaws.com/twitter-c.png" alt="Twitter Button" width="61" height="23" /><p class="wp-caption-text">Twitter</p></div>
<p></em></p>
<p>My primary twitter account was finally affected by Twitter&#8217;s rollout of their new interface &#8211; codenamed <strong>phoenix</strong> based on some filenames - <a href="http://twitter.com/#!/frank_grimm/status/25825044558">yesterday</a>. It seems like the interface already experienced some minor bugfixes in regards to usability since the rollout <a href="http://twitter.com/#!/twitter/status/24518053966">first started</a>. The tech behind this new frontend has already been covered on their <a href="http://engineering.twitter.com/2010/09/tech-behind-new-twittercom.html">engineering blog</a>.</p>
<h2>Frontpage revamped</h2>
<p>Besides the obvious design changes the frontpage of twitter suddenly becomes useful, at least for me. A quick overfew on the five latest followers provides a way to quickly decide wheter I want to follow them back or report that rarely dressed girl for spam.</p>
<p>It also features some <strong>filtered views</strong> on your timeline that shows retweets, mentions and provides quick access to saved searches. I really like that they integrated this set of features, especially because I was never a big fan of the column views that were offered by most desktop clients.</p>
<h2>Pictures!</h2>
<p>Your feed now contains little pictograms indicating the type of embedded content within some tweets. Pictures and other content from popular sites and media partners are now embedded directly in the view for single tweets &#8211; you&#8217;ll see these embeds when you click a tweet in your timeline or visit the URI for a single tweet.</p>
<p>Alas, you don&#8217;t get these embedded media when you embed single tweets with their tool <a href="http://media.twitter.com/blackbird-pie/">Blackbirg Pie</a> &#8211; which looks a bit antique now &#8211; but I assume they&#8217;ll change that after finishing the rollout.</p>
<h2>Spotlight on: A tweet!</h2>
<p>Viewing singular tweets by visiting their permalink gives you the previously mentioned embeds. Click a link in your timeline and you&#8217;ll get even more useful meta-information on the tweet as well as the accounts and hashtags it contains.</p>
<p>You&#8217;ll see other tweets from the original author, which might give you some context on what he/she wants to say with that funny picture in the tweet. It might also be interesting what that conference hashtag is all about or who else was mentioned in the tweet so you can easily decide if you want to follow those people. All this meta-information adds a whole new dimension of discovery (of topics, people &amp; places) to browsing your timeline.</p>
<h2>@reply / mention &#8211; It&#8217;s in a box!</h2>
<p>When you mention a user or reply on a tweet it&#8217;s opened in a floating, resizable box which looks like the dialog boxes from <a href="http://jqueryui.com/demos/dialog/">jQueryUI</a>. Those function previously redirected the user to the starting page.</p>
<p>Why this is a great change? Because the rest of the interface <strong>stays usable</strong>. You can browse to another persons profile, a search or any other view within the system to gather information you need to put those nasty 140 characters together. All without changing browser windows or tabs.</p>
<h2>@replys? conversations!</h2>
<p>The killer feature I see in the new twitter interface is that it finally turns @replys into useful and quickly comprehensible conversations. Clicking a tweet with the little chat-bubble symbol will now show the tweet in question, as well as the tweet it&#8217;s replying to.</p>
<p>When clicking an original piece of content, replies are now shown &#8211; even if you don&#8217;t follow the replying user. (Will we see a new form of reply-spam for influential users now?)</p>
<h2>The earth keeps spinning</h2>
<p>The old interface didn&#8217;t really <strong>emphasize location</strong> data within the Twitter platform. The new interface has it tightly integrated in singular tweet views and offers tools like &#8220;View Tweets at this place&#8221;. This makes their whole places database more useful for regular users &#8211; although it seems to lack mechanisms to &#8220;follow places&#8221; like you&#8217;d do with lists.</p>
<h3>Anything I missed?</h3>
<p>This article sure doesn&#8217;t cover all new / better integrated features of #NewTwitter &#8211; it&#8217;s what I find most useful at first glance. Did I miss anything really important? I&#8217;d love to hear your opinion. Let me know &#8211; here or directly <a href="http://twitter.com/frank_grimm">on Twitter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frankgrimm.net/2010/09/how-twitter-finally-became-useful/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.frankgrimm.net/2010/09/how-twitter-finally-became-useful/?source=rss</feedburner:origLink></item>
		<item>
		<title>node-abbrev Snippet for user-friendly commandlines (like Text::Abbreviate for Perl)</title>
		<link>http://feedproxy.google.com/~r/frankgrimm/~3/AFLfsLeRG6g/</link>
		<comments>http://blog.frankgrimm.net/2010/07/node-abbrev-snippet-for-user-friendly-commandlines-like-textabbreviate-for-perl/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 00:17:16 +0000</pubDate>
		<dc:creator>Frank Grimm</dc:creator>
				<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://blog.frankgrimm.net/?p=177</guid>
		<description><![CDATA[node-abbrev is a small node.js snippet / module that offers functionality similar to Text::Abbreviate for Perl]]></description>
			<content:encoded><![CDATA[<p>I really like user-friendly command-line tools so I put together a small snippet for my <a href="http://nodejs.org">node.js</a> scripts. The result was put into a module, so it can be easily <em>require()</em>d and reused. I blame the lack of compliance with CommonJS naming standards on the quick-and-dirty nature of the script. <img src='http://blog.frankgrimm.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>An example use case could be the start mode parameter of a script. A daemon that accepts the startup modes &#8220;help&#8221;, &#8220;start&#8221;, &#8220;stop&#8221; or &#8220;status&#8221; as the first and only parameter could look like this:</p>
<h2>Example code (na-sample.js)</h2>
<p><script src="http://gist.github.com/499534.js?file=na-sample.js"></script></p>
<h2>Usage</h2>
<p>After providing the module with a list of words that should be checked in the constructor, the <em>expand()</em> function can be called to get a list of words that match or start with the term that was provided.</p>
<h2>Module code (node-abbrev.js)</h2>
<p><script src="http://gist.github.com/499534.js?file=node-abbrev.js"></script></p>
<p>The complete gist with example and module code can be found <a href="http://gist.github.com/499534"title="node-abbrev gist" >here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frankgrimm.net/2010/07/node-abbrev-snippet-for-user-friendly-commandlines-like-textabbreviate-for-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.frankgrimm.net/2010/07/node-abbrev-snippet-for-user-friendly-commandlines-like-textabbreviate-for-perl/?source=rss</feedburner:origLink></item>
		<item>
		<title>HTML5 Canvas – Game of Life</title>
		<link>http://feedproxy.google.com/~r/frankgrimm/~3/2F7WfZowq-8/</link>
		<comments>http://blog.frankgrimm.net/2010/07/html5-canvas-game-of-life/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 11:29:51 +0000</pubDate>
		<dc:creator>Frank Grimm</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blog.frankgrimm.net/?p=163</guid>
		<description><![CDATA[Just to save this from vanishing, here's the code for the implementation of Conway's Game of Life with HTML5 canvas that ran on my placeholder page.]]></description>
			<content:encoded><![CDATA[<p>Just to save this from vanishing, here&#8217;s the code for the implementation of <a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"title="GoL on wikipedia" >Conway&#8217;s Game of Life </a>with <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html"title="WHATWG on the Canvas Element" >HTML5 canvas</a> that ran on my placeholder page. <a href="http://jsbin.com/eyapi3/2/">The example</a> is simulating the life of three glider-structures.</p>
<p>The code, which is <a href="http://jsbin.com/eyapi3/2/edit"title="HTML5 GoL implementation using canvas" >available on JSBin</a>, isn&#8217;t really optimized for anything but the whole thing is sure nice to watch.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frankgrimm.net/2010/07/html5-canvas-game-of-life/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.frankgrimm.net/2010/07/html5-canvas-game-of-life/?source=rss</feedburner:origLink></item>
		<item>
		<title>UnFUG Lightning Talks (node.js, sshm rewrite, pygame)</title>
		<link>http://feedproxy.google.com/~r/frankgrimm/~3/N9pgfjwEZrQ/</link>
		<comments>http://blog.frankgrimm.net/2010/07/unfug-lightning-talks-node-js-sshm-rewrite-pygame/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 16:00:08 +0000</pubDate>
		<dc:creator>Frank Grimm</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Talks]]></category>

		<guid isPermaLink="false">http://blog.frankgrimm.net/?p=127</guid>
		<description><![CDATA[Write-up and code of my lightning talks at the latest UnFUG meetup (07/01/2010).]]></description>
			<content:encoded><![CDATA[<p>Before presenting my B.Sc. thesis I decided to join the guys of <a href="http://unfug.org">UnFUG</a> in a round of 5-minute lightning talks called &#8220;Pimp my x86&#8243;. I did a quick writeup on <a href="http://nodejs.org">node.js</a> but as there was enough time, everybody went on to show off their recent projects and scripts. As my thesis is currently taking up most of my time I could only share the following scripts, one that I use on a regular basis and one I only did to familiarize myself with the <a href="http://www.pygame.org">pygame</a> library for Python.</p>
<h3>node.js</h3>
<p>Sadly the beamer showed only little contrast but I think I made a point showing the great development node.js is currently going through. It&#8217;s a nice alternative approach to scalable networking systems for real-time applications.</p>
<p>For information on the library visit <a href="http://nodejs.org/">nodejs.org</a> and take a look at the great example applications like <a href="http://wargamez.mape.me/">this one</a>.</p>
<h3>sshm rewrite with bash-completion</h3>
<p>A quick script I hacked together because the default sshm implementation could not handle parameters, port parameters other than the default and it didn&#8217;t come with bash-completion. The code is far from optimal but it works. It mostly follows execution conventions that the traditional sshm proposed but the file format is incompatible.<br />
The python file goes somewhere in <em>$PATH</em>, while the shell script should be put in <em>/etc/bash_completion.d/</em> (or similar on your system).</p>
<p><script src="http://gist.github.com/461311.js"></script></p>
<h3>Controlling your Ubuntu / Linux Mint desktop with a joystick (via pygame)</h3>
<p>The <a href="http://pygame.org">pygame</a> library for Python offers modules for joystick support and I had some time (obviously) on my hands so I hacked together a set of scripts to control my desktop machine with a gamepad / joystick. With 4 buttons and 2 axis I could give it some pretty neat functionality, even if I&#8217;m pretty sure I will never use it again. <img src='http://blog.frankgrimm.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>The Python script starts a configurable process for each combination of button-click and axis-movements. For my tests I put together a shell script that uses <em>wmctrl</em> to navigate through my virtual desktops and added simulated keystrokes (with <em>xte</em>) to control my <em>screen</em> and <em>irssi</em> in a terminal.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frankgrimm.net/2010/07/unfug-lightning-talks-node-js-sshm-rewrite-pygame/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.frankgrimm.net/2010/07/unfug-lightning-talks-node-js-sshm-rewrite-pygame/?source=rss</feedburner:origLink></item>
		<item>
		<title>Spice up Google Wave</title>
		<link>http://feedproxy.google.com/~r/frankgrimm/~3/U6A96EntET8/</link>
		<comments>http://blog.frankgrimm.net/2010/07/spice-up-google-wave/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 11:21:57 +0000</pubDate>
		<dc:creator>Frank Grimm</dc:creator>
				<category><![CDATA[Collaboration]]></category>

		<guid isPermaLink="false">http://blog.frankgrimm.net/?p=102</guid>
		<description><![CDATA[Having done some collaboration via Google Wave lately I'd like to share a few useful plugins and bots. This list here is nowhere near complete but it's stuff I found most useful.]]></description>
			<content:encoded><![CDATA[<p>Having done some collaboration via <a href="https://wave.google.com/"title="Google Wave"  target="_blank">Google Wave</a> lately I&#8217;d like to share a few useful plugins and bots. This list here is nowhere near complete but it&#8217;s stuff I found most useful.</p>
<h3>Polls</h3>
<p>When discussing parts text, graphics or other content elements many decisions can be accelerated by holding a quick poll. The default poll extension offers a choice between<strong> Yes/No/Maybe</strong>. There are other polls with customizable choices for those who seek a more advanced poll. I installed <strong>Yes/No/Maybe/+</strong> because it mimics the design of the default extension.</p>
<p><a href="http://blog.frankgrimm.net/wp-content/uploads/2010/06/wave-poll-ynm.png?source=rss"><img class="alignnone size-medium wp-image-110" title="Wave Poll Yes/No/Maybe" src="http://blog.frankgrimm.net/wp-content/uploads/2010/06/wave-poll-ynm-300x106.png" alt="" width="300" height="106" /></a></p>
<h3>Deadlines</h3>
<p>The deadline extension shows a countdown to a specified date and time inside your wave. I have previously used this to track and limit my work inside a wave but it could come in handy for group edits, too.</p>
<p>Why not insert it into your wave the next time you use it to do a brain-storming? It can avoid endless discussions and help to focus on the task ahead.</p>
<p><a href="http://blog.frankgrimm.net/wp-content/uploads/2010/06/wave-deadline-extension.png?source=rss"><img class="alignnone size-full wp-image-112" title="wave-deadline-extension" src="http://blog.frankgrimm.net/wp-content/uploads/2010/06/wave-deadline-extension.png" alt="" width="691" height="133" /></a></p>
<h3>Like / Dislike</h3>
<p>When a poll simply isn&#8217;t enough or there are more complex decisions to make the Like / Dislike extension can be quite useful. The wave in the image below uses two of it to decide between two versions of a paragraph.</p>
<p><a href="http://blog.frankgrimm.net/wp-content/uploads/2010/06/wave-likedislike.png?source=rss"><img class="alignnone size-medium wp-image-114" title="wave-likedislike" src="http://blog.frankgrimm.net/wp-content/uploads/2010/06/wave-likedislike-300x90.png" alt="" width="300" height="90" /></a></p>
<h3>Syntax Highlighting</h3>
<p>Being a developer I was searching for a way to add syntax highlighting to discuss code on Google Wave. Luckily the guys at <a href="http://programmingzen.com/2009/10/19/add-code-highlighting-to-your-google-waves/">Zen and the Art of Programming</a> shared <a href="http://wave-samples-gallery.appspot.com/about_app?app_id=14008">a bot</a> to do just this.</p>
<p><a href="http://blog.frankgrimm.net/wp-content/uploads/2010/06/wave-robot-syntax.png?source=rss"><img class="alignnone size-medium wp-image-107" title="Wave Robot for Syntax Highlighting" src="http://blog.frankgrimm.net/wp-content/uploads/2010/06/wave-robot-syntax-300x126.png" alt="" width="300" height="126" /></a></p>
<p>For those who are not yet convinced, Gina Trapani and Adam Pash have compiled a nice (and more extensive) list in <a href="http://completewaveguide.com/">The Complete Guide To Google Wave</a>.</p>
<p>Sometimes even the most productive developers need a time-out, I can really recommend the competitive game extensions for Sudoku and Chess. But they can get really addictive. <img src='http://blog.frankgrimm.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frankgrimm.net/2010/07/spice-up-google-wave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.frankgrimm.net/2010/07/spice-up-google-wave/?source=rss</feedburner:origLink></item>
		<item>
		<title>Semester projects IN / HFU</title>
		<link>http://feedproxy.google.com/~r/frankgrimm/~3/yA8ssB9_AjY/</link>
		<comments>http://blog.frankgrimm.net/2010/07/semester-projects-in-hfu/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 11:20:41 +0000</pubDate>
		<dc:creator>Frank Grimm</dc:creator>
				<category><![CDATA[Studies]]></category>

		<guid isPermaLink="false">http://blog.frankgrimm.net/?p=124</guid>
		<description><![CDATA[Every semester the student at my faculty meet to present their term-projects and thesis topics. Here are some picks of this semesters' research / development.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just returned from my B.Sc. presentation on applied text-mining techniques for stock market predictions. Each semester when the thesis presentations are held, lower semesters present their one-term projects. Each student at <a href="http://www.hs-furtwangen.de/fachbereiche/in/">my faculty</a> has to do two of those during his/her studies.</p>
<p>There were some pretty neat projects. Alas I haven&#8217;t had a chance to talk to all of them you can check out the full list (in German) over at the <a href="http://webuser.hs-furtwangen.de/~kaspar/Semesterprojekte10/ListeProjekte.html">faculty website</a>.</p>
<h3>Distributed, fail-safe block devices</h3>
<p>The guys researching distributed, fail-safe block devices did a great evaluation of current technologies and compiled a nice demonstration with three datastore nodes running virtual machine instances.</p>
<h3>TeachRobot control</h3>
<p>Some of the code for the &#8220;TeachRobot&#8221; robotic arm interface project is available over at <a href="http://blog.32leaves.net/?s=teachrobot">32leaves.net</a>. I guess they&#8217;ll submit their work to <a href="http://hackaday.com/">Hack a Day</a> soon. Meanwhile check out Christians <a href="http://hackaday.com/2010/07/01/open-source-logic-analyzer-software/">Logic Analyzer </a>project if you&#8217;re in lack of an oscilloscope.<br />
<object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13034200&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=13034200&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object>
<p><a href="http://vimeo.com/13034200">SoapBubble Bot</a> from <a href="http://vimeo.com/user4181943">32leaves</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<blockquote><p>The goal of this semesters project, was to build a new interface for existing legacy hardware (actually 30 years old legacy). To demonstrate what we did, we came up with that little demo: making soap bubbles with a robot.
</p></blockquote>
<h3>Lecture Podcasts</h3>
<p>I really like the idea of multimedial learning in a way that&#8217;s up to date with current technologies. The guys who developed a neat lecture podcasting system presented quiet performant streaming and a neat, SilverLight based, web interface. Big plus was the video of my <a href="http://unfug.org">UnFUG</a> lightning talk I gave yesterday to get in shape for my thesis presentation. <img src='http://blog.frankgrimm.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Others</h3>
<p>Those were only three picks, even the first-semester project developing a touch-based information system for the faculty showed a decent progress this semester. Great work.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frankgrimm.net/2010/07/semester-projects-in-hfu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.frankgrimm.net/2010/07/semester-projects-in-hfu/?source=rss</feedburner:origLink></item>
	</channel>
</rss>

