<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>In Traction</title>
	
	<link>http://blog.jozilla.net</link>
	<description />
	<pubDate>Thu, 11 Sep 2008 20:17:00 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<geo:lat>51.0295</geo:lat><geo:long>5.375</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/InTraction" type="application/rss+xml" /><item>
		<title>Wendy Ju’s implicit interaction framework</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/389974985/</link>
		<comments>http://blog.jozilla.net/2008/09/11/wendy-jus-implicit-interaction-framework/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 20:16:04 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/?p=166</guid>
		<description><![CDATA[I recently read an interesting CSCW 2008 paper by Wendy Ju: Range: Exploring Implicit Interaction through Electronic Whiteboard Design. She describes a framework for implicit interaction and applies it to the design of an interactive whiteboard application called Range. 



The paper is situated in the field of ubiquitous computing. The goal of Mark Weiser&#8217;s vision [...]]]></description>
			<content:encoded><![CDATA[<p>I recently read an interesting <a href="http://www.cscw2008.org/"><span class="caps">CSCW</span> 2008</a> paper by <a href="http://www-cdr.stanford.edu/~wendyju/">Wendy Ju</a>: <a href="http://hci.stanford.edu/publications/2008/cscw_range.pdf">Range: Exploring Implicit Interaction through Electronic Whiteboard Design</a>. She describes a <em>framework for implicit interaction</em> and applies it to the design of an interactive whiteboard application called Range. </p>

<p><a href="http://blog.jozilla.net/wp-content/uploads/2008/09/range-overview.png"><img src="http://blog.jozilla.net/wp-content/uploads/2008/09/range-overview-500x332.png" alt="" title="The Range interactive whiteboard" width="500" height="332" class="alignnone size-thumbnail wp-image-170" /></a></p>

<p>The paper is situated in the field of ubiquitous computing. The goal of <a href="http://en.wikipedia.org/wiki/Mark_Weiser">Mark Weiser</a>&#8217;s vision of ubiquitous computing was <a href="http://www.johnseelybrown.com/calmtech.pdf">calm computing</a>, where <em>calm</em> reflects the desired state of mind of the user. Invisibility in ubicomp is more about enabling seamless accomplishment of task than staying beneath notice. Just as a good, well-balanced hammer &#8220;disappears&#8221; in the hands of a carpenter and allows him or her to concentrate on the big picture, computers should participate in a similar magic disappearing act. Calm computing moves between the center and the periphery of attention. The periphery informs without overwhelming the user, but the user can still move to the center to get control. The implicit interaction framework presented in this paper contributes to how calm computing can be effectively realized. It allows to reason about the way users can mitigate actions the system takes, and is a good complement to <a href="http://research.microsoft.com/~horvitz/UIACT.HTM">Eric Horvitz&#8217;s work on mixed-initiative interaction</a>.</p>

<p>Implicit interactions enable communication and action without explicit input or output.One way that an action can be implicit is if the exchange occurs outside the attentional foreground of the user (e.g. auto-saving files, filtering spam, and ubicomp interaction). The other way is if the exchange is initiated by the computer system rather than by the user (e.g. an email alert, screen saver, etc.). Although it may seem strange that something that grabs attention is implicit, the key factor is that the interaction is based on an implied demand for information or action, not an explicit one.</p>

<p>The implicit interaction framework divides the space of possible interactions along the axes of attentional demand and initiative:</p>

<p><a href="http://blog.jozilla.net/wp-content/uploads/2008/09/framework.png"><img src="http://blog.jozilla.net/wp-content/uploads/2008/09/framework-500x321.png" alt="" title="Implicit interaction framework" width="500" height="321" class="alignnone size-thumbnail wp-image-168" /></a>
 <br />
<em>Attentional demand</em> is the degree of cognitive and perceptual load imposed on the user by the interactive system. Foreground interactions require a greater degree of focus, concentration and consciousness and are exclusive of other focal targets. Background interactions are peripheral, have less demand and can occur in parallel with other interactions.</p>

<p><em>Initiative</em> is an indicator of how much presumption the interactive system uses in the interaction. Interactions that are initiated and driven by the user explicitly are called reactive interactions, while interactions initiated by the system based on inferred desire or demand are proactive interactions. </p>

<p>The implicit interaction framework builds on <a href="http://www.billbuxton.com/BG_FG.html">Bill Buxton&#8217;s background/foreground model</a>. Buxton&#8217;s model assumes attention and initiative are inherently linked. On the contrary, this framework decouples attention and initiative in two separate axes. Buxton&#8217;s foreground corresponds to the reactive/foregound quadrant, while his background corresponds to the proactive/background quadrant.<br />
 <br />
An example: a word processing program that &#8230;</p>


<ul>
<li>auto-saves because you command it to is situated in the <em>reactive/foreground</em> quadrant</li>
<li>auto-saves because you have set it to do so every 10 minutes is situated in the <em>reactive/background</em> quadrant</li>
<li>auto-saves because it feels that a lot of changes have been made is situated in the <em>proactive/background</em> quadrant</li>
</ul>



<p>Being proactive means the word processing program is acting with greater presumption with respect to the needs and desires of the user.</p>

<p>Designers can manipulate the proactivity and reactivity by (1) dictating the order of actions (does the system act first or wait for the user to act?); or by (2) choosing the degree of initiative (does the sytem act, offer to act, ask if it should act, or merely indicate that it can act?); or by (3) gathering more data to ensure the certainty of the need for an action or when they design features to mitigate the potential cost of error for the action. Even in the reactive realm, the degree of initiative can vary based on the amount that the user needs to maintain ongoing control and oversight of an action in progress.</p>

<p>Ju discusses 3 implicit interaction techniques:</p>


<ul>
<li>user reflection</li>
<li>system demonstration</li>
<li>override</li>
</ul>



<p><em>User reflection</em> is how the system indicates <em>what it feels <strong>the users</strong> are doing or would like to have done</em>.</p>

<p>A good example are modern spell-checking programs. Early versions had to be invoked explicitly, and engaged the user in an explicit dialog about potentially misspelled words to repair. Current spell-checking programs run continuously in the background allowing users to more easily notice potential errors. The implicit alert of this interaction is far more seamless than that of earlier spell-check programs. A similar example is the continous compilation used by modern <span class="caps">IDE</span>s such as <a href="http://www.eclipse.org/">Eclipse</a> and <a href="http://msdn.microsoft.com/en-us/vstudio/">Visual Studio</a>. Earlier programs only showed compile errors when the user explicitly activated the compile command.</p>

<p><a href="http://blog.jozilla.net/wp-content/uploads/2008/09/implicit_spellcheck.png"><img src="http://blog.jozilla.net/wp-content/uploads/2008/09/implicit_spellcheck-500x157.png" alt="" title="User reflection in modern spell checking programs" width="500" height="157" class="alignnone size-thumbnail wp-image-169" /></a></p>

<p><em>System demonstration</em> is <em>how the system shows the user what <strong>it</strong> is doing or what it is going to do</em>.</p>

<p>In Range, the whiteboard animates its transition from ambient display mode (where it displays a set of images related to the workspace) to drawing mode (where users can make sketches and diagrams) as a demonstration-of-action that calls more attention to the mode change than a sudden switch would, and provides a handle for override (see later).</p>

<p><em>Override</em> techniques <em>allow users to repair misinterpretation of the user&#8217;s state</em> or <em>to interrupt or stop the system from engaging in proactive action</em>. </p>

<p>This usually occurs after one of the previous techniques (user reflection or system demonstration) alert the user to some inference or action that is undesirable. Override is distinct from &#8220;undo&#8221; because it is targeted at countering the action of the system rather than reverting a command by the user. </p>

<p>An example of override in Range is that in the transition between modes users are able to &#8220;grab&#8221; digital content to use it as part of the whiteboard contents, or to stop the motion of objects that are being moved to make space for drawings.</p>

<p>The main contribution of this framework compared to prior models for implicit interaction lies in the key variable of initiative. Without this variable, it would not be possible to distinguish user reflection techniques from system demonstration techniques or to map the role of override.</p>

<p>In conclusion, a very interesting paper that offers a framework to reason about proactive user interfaces and make sure that users are always in control.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=fvZCL"><img src="http://feeds.feedburner.com/~f/InTraction?i=fvZCL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=cVGNl"><img src="http://feeds.feedburner.com/~f/InTraction?i=cVGNl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=dKkMl"><img src="http://feeds.feedburner.com/~f/InTraction?i=dKkMl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=qwwfL"><img src="http://feeds.feedburner.com/~f/InTraction?i=qwwfL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=GjQvl"><img src="http://feeds.feedburner.com/~f/InTraction?i=GjQvl" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/09/11/wendy-jus-implicit-interaction-framework/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/09/11/wendy-jus-implicit-interaction-framework/</feedburner:origLink></item>
		<item>
		<title>Playing around with pybluez</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/384302209/</link>
		<comments>http://blog.jozilla.net/2008/09/05/playing-around-with-pybluez/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 16:06:56 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[bluetooth]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/?p=154</guid>
		<description><![CDATA[We received our new laptops this week. Since they support Bluetooth (just as about any laptop these days), I decided to experiment a bit with detecting nearby Bluetooth devices. A while ago I discovered PyBluez, an easy-to-use Python Bluetooth library by MIT PhD student Albert Huang. The nice thing about it is that it works [...]]]></description>
			<content:encoded><![CDATA[<p>We received our new laptops this week. Since they support Bluetooth (just as about any laptop these days), I decided to experiment a bit with detecting nearby Bluetooth devices. A while ago I discovered <a href="http://code.google.com/p/pybluez/">PyBluez</a>, an easy-to-use Python Bluetooth library by <span class="caps">MIT</span> PhD student <a href="http://people.csail.mit.edu/albert/">Albert Huang</a>. The nice thing about it is that it works both on <span class="caps">GNU</span>/Linux and Windows.</p>

<p>One of the samples is the script <code>inquiry.py</code> which allowed me to detect nearby devices in just a few lines of code. Here it detected mine and Petr&#8217;s cell phones:</p>

<p><a href="http://blog.jozilla.net/wp-content/uploads/2008/09/pybluez1.png"><img src="http://blog.jozilla.net/wp-content/uploads/2008/09/pybluez1-500x312.png" alt="Using PyBluez to detect nearby devices" width="500" height="312" class="size-thumbnail wp-image-163" /></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=cHmdL"><img src="http://feeds.feedburner.com/~f/InTraction?i=cHmdL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=5lL5l"><img src="http://feeds.feedburner.com/~f/InTraction?i=5lL5l" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=2seol"><img src="http://feeds.feedburner.com/~f/InTraction?i=2seol" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=HPFSL"><img src="http://feeds.feedburner.com/~f/InTraction?i=HPFSL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=tMEol"><img src="http://feeds.feedburner.com/~f/InTraction?i=tMEol" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/09/05/playing-around-with-pybluez/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/09/05/playing-around-with-pybluez/</feedburner:origLink></item>
		<item>
		<title>Small update on face detection post</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/321526354/</link>
		<comments>http://blog.jozilla.net/2008/06/27/small-update-on-face-detection-post/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 19:03:28 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[CVtypes]]></category>

		<category><![CDATA[facedetection]]></category>

		<category><![CDATA[opencv]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[webcam]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/?p=146</guid>
		<description><![CDATA[Just a quick update on my previous post. I hooked my code up to a D-Bus daemon, and used it to detect if I was sitting behind my desk or not. 

I had to position the camera a bit lower, because it would sometimes not recognize my face when I was looking at the bottom [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick update on <a href="http://blog.jozilla.net/2008/06/27/fun-with-python-opencv-and-face-detection/">my previous post</a>. I hooked my code up to a <a href="http://en.wikipedia.org/wiki/D-Bus">D-Bus</a> daemon, and used it to detect if I was sitting behind my desk or not. </p>

<p>I had to position the camera a bit lower, because it would sometimes not recognize my face when I was looking at the bottom of my screen. Having a dual-monitor setup doesn&#8217;t help either, since you should ideally position the webcam in the middle of the two displays to have good coverage. I positioned the webcam in the middle of the two displays at the bottom and tilted it upwards, which gives good results:</p>

<p><a href='http://blog.jozilla.net/wp-content/uploads/2008/06/dsc00556.jpg'><img src="http://blog.jozilla.net/wp-content/uploads/2008/06/dsc00556-500x500.jpg" alt="" title="Webcam setup" width="500" height="500" class="aligncenter size-thumbnail wp-image-147" /></a></p>

<p>I guesstimated that if the system couldn&#8217;t detect a face for a period of 10 seconds, I would be away from my desk (or at least not paying attention to the screen). I played around a bit with <a href="http://www.pygtk.org/">pygtk</a> and <a href="http://www.galago-project.org/">notify-python</a> to create a status icon and show notification bubbles whenever my status changed. Here&#8217;s what happens when it detects that I&#8217;m away from my desk (notice the bubble in the upper right corner):</p>

<p><a href='http://blog.jozilla.net/wp-content/uploads/2008/06/presence_applet-away.png'><img src="http://blog.jozilla.net/wp-content/uploads/2008/06/presence_applet-away-500x500.png" alt="" title="Away" width="500" height="500" class="aligncenter size-thumbnail wp-image-148" /></a></p>

<p>When I return, the system will change its status icon accordingly and notify me again:</p>

<p><img src="http://blog.jozilla.net/wp-content/uploads/2008/06/presence_applet-bubble-available.png" alt="" title="Available" width="416" height="98" class="aligncenter size-full wp-image-149" /></p>

<p>OpenCV is fun! <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=bAjP1I"><img src="http://feeds.feedburner.com/~f/InTraction?i=bAjP1I" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=fe5fki"><img src="http://feeds.feedburner.com/~f/InTraction?i=fe5fki" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=Z8Pori"><img src="http://feeds.feedburner.com/~f/InTraction?i=Z8Pori" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=ZQvqpI"><img src="http://feeds.feedburner.com/~f/InTraction?i=ZQvqpI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=DsYQGi"><img src="http://feeds.feedburner.com/~f/InTraction?i=DsYQGi" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/06/27/small-update-on-face-detection-post/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/06/27/small-update-on-face-detection-post/</feedburner:origLink></item>
		<item>
		<title>Fun with Python, OpenCV and face detection</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/321313530/</link>
		<comments>http://blog.jozilla.net/2008/06/27/fun-with-python-opencv-and-face-detection/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 13:08:21 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[CVtypes]]></category>

		<category><![CDATA[facedetection]]></category>

		<category><![CDATA[opencv]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[webcam]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/?p=144</guid>
		<description><![CDATA[I had some fun with Gary Bishop&#8217;s OpenCV Python wrapper this morning. I wanted to try out OpenCV for detecting faces using a web cam. This could be used for instance to see if someone is sitting behind his desk or not. I used Gary&#8217;s Python wrapper since I didn&#8217;t want to code in C++.

I [...]]]></description>
			<content:encoded><![CDATA[<p>I had some fun with <a href="http://wwwx.cs.unc.edu/~gb/wp/blog/2007/02/04/python-opencv-wrapper-using-ctypes/">Gary Bishop&#8217;s OpenCV Python wrapper</a> this morning. I wanted to try out <a href="http://www.intel.com/technology/computing/opencv/">OpenCV</a> for detecting faces using a web cam. This could be used for instance to see if someone is sitting behind his desk or not. I used Gary&#8217;s <a href="http://www.python.org/">Python</a> wrapper since I didn&#8217;t want to code in C++.</p>

<p>I didn&#8217;t know where to start, so I searched for existing OpenCV face detection examples. I found a <a href="http://eclecti.cc/code/face-detection-on-the-olpc-xo">blog post by Nirav Patel</a> explaining how to use OpenCV&#8217;s official Python bindings to perform face detection. Nirav will be <a href="http://eclecti.cc/bytes/the-summer-of-nirav">working on a webcam module</a> for <a href="http://www.pygame.org/">Pygame</a> for the <a href="http://code.google.com/soc/2008/">Google Summer of Code</a>. </p>

<p>I managed to rewrite Nirav&#8217;s example to get it working with <a href="http://sourceforge.net/project/showfiles.php?group_id=82407&amp;package_id=232299&amp;release_id=509128">CVtypes</a>:</p>

<p><a href='http://blog.jozilla.net/wp-content/uploads/2008/06/cvtypes_face-recognition.png'><img src="http://blog.jozilla.net/wp-content/uploads/2008/06/cvtypes_face-recognition-500x500.png" alt="" title="cvtypes_face-recognition" width="500" height="500" class="aligncenter size-thumbnail wp-image-145" /></a></p>

<p>Here&#8217;s the code. Although it&#8217;s just a quick and dirty hack, it might be useful to others. It requires CVtypes and OpenCV, and was tested on Ubuntu Hardy with a <a href="http://www.amazon.com/Logitech-961465-0403-QuickCam-Communicate-Deluxe/dp/B000RZSHQM">Logitech QuickCam Communicate Deluxe</a> webcam. You will need Nirav&#8217;s <a href="http://eclecti.cc/files/2008/03/haarcascade_frontalface_alt.xml">Haar cascade file</a> as well.</p>


<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">from</span> CVtypes <span style="color: #ff7700;font-weight:bold;">import</span> cv
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> detect<span style="color: black;">&#40;</span>image<span style="color: black;">&#41;</span>:
    image_size = cv.<span style="color: black;">GetSize</span><span style="color: black;">&#40;</span>image<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># create grayscale version</span>
    grayscale = cv.<span style="color: black;">CreateImage</span><span style="color: black;">&#40;</span>image_size, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
    cv.<span style="color: black;">CvtColor</span><span style="color: black;">&#40;</span>image, grayscale, cv.<span style="color: black;">BGR2GRAY</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># create storage</span>
    storage = cv.<span style="color: black;">CreateMemStorage</span><span style="color: black;">&#40;</span>0<span style="color: black;">&#41;</span>
    cv.<span style="color: black;">ClearMemStorage</span><span style="color: black;">&#40;</span>storage<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># equalize histogram</span>
    cv.<span style="color: black;">EqualizeHist</span><span style="color: black;">&#40;</span>grayscale, grayscale<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># detect objects</span>
    cascade = cv.<span style="color: black;">LoadHaarClassifierCascade</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'haarcascade_frontalface_alt.xml'</span>, cv.<span style="color: black;">Size</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    faces = cv.<span style="color: black;">HaarDetectObjects</span><span style="color: black;">&#40;</span>grayscale, cascade, storage, <span style="color: #ff4500;">1.2</span>, <span style="color: #ff4500;">2</span>, cv.<span style="color: black;">HAAR_DO_CANNY_PRUNING</span>, cv.<span style="color: black;">Size</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">50</span>, <span style="color: #ff4500;">50</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> faces:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'face detected!'</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> faces:
            cv.<span style="color: black;">Rectangle</span><span style="color: black;">&#40;</span>image, cv.<span style="color: black;">Point</span><span style="color: black;">&#40;</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>i.<span style="color: black;">x</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>i.<span style="color: black;">y</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
                         cv.<span style="color: black;">Point</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>i.<span style="color: black;">x</span> + i.<span style="color: black;">width</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>i.<span style="color: black;">y</span> + i.<span style="color: black;">height</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
                         cv.<span style="color: black;">RGB</span><span style="color: black;">&#40;</span>0, <span style="color: #ff4500;">255</span>, 0<span style="color: black;">&#41;</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">8</span>, 0<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;OpenCV version: %s (%d, %d, %d)&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>cv.<span style="color: black;">VERSION</span>,
                                               cv.<span style="color: black;">MAJOR_VERSION</span>,
                                               cv.<span style="color: black;">MINOR_VERSION</span>,
                                               cv.<span style="color: black;">SUBMINOR_VERSION</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Press ESC to exit ...&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># create windows</span>
    cv.<span style="color: black;">NamedWindow</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Camera'</span>, cv.<span style="color: black;">WINDOW_AUTOSIZE</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># create capture device</span>
    device = 0 <span style="color: #808080; font-style: italic;"># assume we want first device</span>
    capture = cv.<span style="color: black;">CreateCameraCapture</span><span style="color: black;">&#40;</span>0<span style="color: black;">&#41;</span>
    cv.<span style="color: black;">SetCaptureProperty</span><span style="color: black;">&#40;</span>capture, cv.<span style="color: black;">CAP_PROP_FRAME_WIDTH</span>, <span style="color: #ff4500;">640</span><span style="color: black;">&#41;</span>
    cv.<span style="color: black;">SetCaptureProperty</span><span style="color: black;">&#40;</span>capture, cv.<span style="color: black;">CAP_PROP_FRAME_HEIGHT</span>, <span style="color: #ff4500;">480</span><span style="color: black;">&#41;</span>    
&nbsp;
    <span style="color: #808080; font-style: italic;"># check if capture device is OK</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> capture:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Error opening capture device&quot;</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff4500;">1</span>:
        <span style="color: #808080; font-style: italic;"># do forever</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># capture the current frame</span>
        frame = cv.<span style="color: black;">QueryFrame</span><span style="color: black;">&#40;</span>capture<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> frame <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># mirror</span>
        cv.<span style="color: black;">Flip</span><span style="color: black;">&#40;</span>frame, <span style="color: #008000;">None</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># face detection</span>
        detect<span style="color: black;">&#40;</span>frame<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># display webcam image</span>
        cv.<span style="color: black;">ShowImage</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Camera'</span>, frame<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># handle events</span>
        k = cv.<span style="color: black;">WaitKey</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> k == 0x1b: <span style="color: #808080; font-style: italic;"># ESC</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'ESC pressed. Exiting ...'</span>
            <span style="color: #ff7700;font-weight:bold;">break</span></pre></div></div>




<p>A known problem is that pressing the escape key doesn&#8217;t quit the program. Might be something wrong in my use of the cv.WaitKey function. Meanwhile you can just use Ctrl+C. All in all, the face detection works pretty well. It doesn&#8217;t recognize multiple faces yet, but that might be due to the training data. It would be interesting to experiment with OpenCV&#8217;s support for eye tracking in the future.</p>

<p><ins datetime="2008-06-28T16:12+01:00"><strong>Update:</strong> the script <em>does</em> recognize multiple faces in a frame. Yesterday when Alex stood at my desk, it recognized his face as well. I think it didn&#8217;t work before because I used <code>cv.Size(100, 100)</code> for the last parameter of <code>cv.HaarDetectObjects</code> instead of <code>cv.Size(50, 50)</code>. This parameter indicates the minimum face size (in pixels). When people were standing around my desk, they were usually farther away from the camera. Their face was then probably smaller than 100&#215;100 pixels.<br />
</ins></p>

<p>Just a quick note on <a href="http://docs.python.org/lib/module-ctypes.html">ctypes</a>. I remember when I created <a href="http://jozilla.net/software/pydgetrfid">PydgetRFID</a> that I tried to use libphidgets&#8217; <a href="http://www.swig.org/"><span class="caps">SWIG</span></a>-generated Python bindings, but couldn&#8217;t get them to work properly. I had read about ctypes, and decided to use it for creating my own wrapper around <a href="http://libphidgets.alioth.debian.org/">libphidgets</a>. Within a few hours I had a working prototype. When you&#8217;re struggling with <span class="caps">SWIG</span>-generated Python bindings, or have some C library without bindings that you would like to use, give ctypes a try. Gary Bishop wrote about a couple of interesting <a href="http://wwwx.cs.unc.edu/~gb/wp/blog/2007/02/11/ctypes-tricks/">ctypes tricks</a> to make the process easier.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=apmjEI"><img src="http://feeds.feedburner.com/~f/InTraction?i=apmjEI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=C3ZPvi"><img src="http://feeds.feedburner.com/~f/InTraction?i=C3ZPvi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=5vmBNi"><img src="http://feeds.feedburner.com/~f/InTraction?i=5vmBNi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=Mc5icI"><img src="http://feeds.feedburner.com/~f/InTraction?i=Mc5icI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=UQMcsi"><img src="http://feeds.feedburner.com/~f/InTraction?i=UQMcsi" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/06/27/fun-with-python-opencv-and-face-detection/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/06/27/fun-with-python-opencv-and-face-detection/</feedburner:origLink></item>
		<item>
		<title>Bzr vs git, the sequel</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/320827006/</link>
		<comments>http://blog.jozilla.net/2008/06/26/bzr-vs-git-the-sequel/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 20:17:23 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[bzr]]></category>

		<category><![CDATA[git]]></category>

		<category><![CDATA[rcs]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/?p=143</guid>
		<description><![CDATA[A while ago I noticed Jordan Mantha repeated my old bzr vs git benchmark.

I was curious to see if things changed. It seemed that both systems have improved in speed, but there were no shocking results.

There are some differences between our experiments though. Jordan wonders how long it took for me to commit my changes [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I noticed Jordan Mantha <a href="http://laserjock.wordpress.com/2008/05/08/git-and-bzr-historical-performance-comparison/">repeated</a> my <a href="http://blog.jozilla.net/2006/03/03/bzr-versus-git/">old bzr vs git benchmark</a>.</p>

<p>I was curious to see if things changed. It seemed that both systems have improved in speed, but there were no shocking results.</p>

<p>There are some differences between our experiments though. Jordan wonders how long it took for me to commit my changes after adding. In fact, I didn&#8217;t do that directly but did a diff before committing. I don&#8217;t know why, I think I just forgot to commit. This clearly showed the big difference between bzr and git before and after committing. Bzr was a lot faster than git before committing, while git outperforms bzr after committing. I guess this is because git makes heavy use of data structures created during a commit.</p>

<p>Bzr took almost 4 minutes to diff after committing, while git only took about a second. This clearly showed a problem with bzr, it started walking the entire tree again, while git could immediately see that nothing changed. Bzr exacerbated the same problem when performing a status, it was unnecessarily slow. Jordan&#8217;s tests showed that the status problem was solved, but doing a diff when nothing has changed is still a major performance issue on big trees.</p>

<p>Committing a small change was a lot faster for both git and bzr. And it should! This is after all a really common operation.</p>

<p>Jordan did <a href="http://laserjock.wordpress.com/2008/05/09/bzr-git-and-hg-performance-on-the-linux-tree/" title="Mercurial">another comparison with bzr, git and hg</a>, which showed that <a href="http://www.selenic.com/mercurial/">hg</a> is actually fairly close to git in terms of performance.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=952bLI"><img src="http://feeds.feedburner.com/~f/InTraction?i=952bLI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=CJy8ei"><img src="http://feeds.feedburner.com/~f/InTraction?i=CJy8ei" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=oR8Pri"><img src="http://feeds.feedburner.com/~f/InTraction?i=oR8Pri" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=0mvkwI"><img src="http://feeds.feedburner.com/~f/InTraction?i=0mvkwI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=aobZBi"><img src="http://feeds.feedburner.com/~f/InTraction?i=aobZBi" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/06/26/bzr-vs-git-the-sequel/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/06/26/bzr-vs-git-the-sequel/</feedburner:origLink></item>
		<item>
		<title>AVI 2008</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/316030800/</link>
		<comments>http://blog.jozilla.net/2008/06/20/avi-2008/#comments</comments>
		<pubDate>Fri, 20 Jun 2008 07:40:34 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[avi2008]]></category>

		<category><![CDATA[conference]]></category>

		<category><![CDATA[gummy]]></category>

		<category><![CDATA[hci]]></category>

		<category><![CDATA[research]]></category>

		<category><![CDATA[uiml]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/?p=142</guid>
		<description><![CDATA[Although it&#8217;s a bit late (almost a month after the facts), I finally found some time to blog about Advanced Visual Interfaces (AVI) 2008 in Naples, where Jan presented our paper about Gummy.


					
				

I liked it very much: the conference had good quality papers but was still reasonably small (around 150 attendants), and of course the [...]]]></description>
			<content:encoded><![CDATA[<p>Although it&#8217;s a bit late (almost a month after the facts), I finally found some time to blog about <a href="http://hci.uniroma1.it/avi2008/">Advanced Visual Interfaces (AVI) 2008</a> in <a href="http://en.wikipedia.org/wiki/Naples,_Italy" title="Italy">Naples</a>, where <a href="http://research.edm.uhasselt.be/~jmeskens/">Jan</a> presented <a href="http://jozilla.net/data/publications/MeskensVermeulenLuytenConinx_avi2008.pdf">our paper about Gummy</a>.</p>

<p><a href="http://www.flickr.com/photos/jozilla/2594080341/">
					<img src="http://farm4.static.flickr.com/3221/2594080341_571d3ec6de.jpg" alt="Gummy title slide at AVI 2008" />
				</a></p>

<p>I liked it very much: the conference had good quality papers but was still reasonably small (around 150 attendants), and of course the weather and the Italian food were great <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> We arrived on Tuesday which gave us some time to explore the city and take the ferry to <a href="http://en.wikipedia.org/wiki/Capri">Capri</a> (a great suggestion by <a href="http://mitglied.lycos.de/robbie/">Robbie</a>). </p>

<p><a href="http://www.flickr.com/photos/jozilla/2594095279/">
					<img src="http://farm4.static.flickr.com/3023/2594095279_a37353626a.jpg" alt="Piazza del Plebiscito" />
				</a></p>

<p><a href="http://www.flickr.com/photos/jozilla/2594096359/">
					<img src="http://farm4.static.flickr.com/3135/2594096359_4ebd673f0f.jpg" alt="Vesuvius" />
				</a></p>

<p><a href="http://www.flickr.com/photos/jozilla/2594936094/">
					<img src="http://farm4.static.flickr.com/3276/2594936094_d6af10fbc5.jpg" alt="Capri" />
				</a></p>

<p>I am not going to discuss the conference program into detail this time, but will just highlight a couple of interesting papers. Possibly one of the coolest papers was &#8220;Exploring Video Streams using Slit-Tear Visualizations&#8221; by Anthony Tang (<a href="http://grouplab.cpsc.ucalgary.ca/Publications/2008-SlitTearVideo.Report2008-897-10">video</a>). Another presentation I enjoyed was &#8220;TapTap and MagStick: Improving One-Handed Target Acquisition on Small Touch-screens&#8221; by Anne Roudaut (<a href="http://www.youtube.com/watch?v=3u9rVyC5x9E">video</a>). It seems there is lots of related work in this area (e.g. <a href="http://www.youtube.com/watch?v=kkoFlDArYks">Shift</a>, <a href="http://www.youtube.com/watch?v=rdl_4ku0pU0">ThumbSpace</a>, etc.). Peter Brandl presented two interesting papers: <a href="http://mi-lab.org/projects/paperizer/">Bridging the Gap between Real Printouts and Digital Whiteboards</a> and <a href="http://mi-lab.org/projects/bimanual-pen-touch/">Combining and Measuring the Benefits of Bimanual Pen and Direct-Touch Interaction on Horizontal Interfaces</a>. He was brave enough to do an impressive live demo for the first paper <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> Oh, and he also covered the conference in <a href="http://mi-lab.org/blog/2008/06/04/back-from-avi-08/">a blog post</a>.</p>

<p>The first paper in our session, titled &#8220;A Mixed-Fidelity Prototyping Tool for Mobile Devices&#8221; by <a href="http://lasige.di.fc.ul.pt/~marcosa/">Marco de S&aacute;</a>, introduced a tool to easily design prototypes and evaluate them in real-life situations. The system was well thought out and serves a real need. I can imagine that we could use this kind of tool in a user-centered UI design course. The second paper in our session was &#8220;Model-based Layout Generation&#8221; by <a href="http://www.feuerstack.org/">Sebastian Feuerstack</a>. I already met Sebastian at <a href="http://blog.jozilla.net/2006/06/08/cadui-2006/"><span class="caps">CADUI</span> 2006</a>. They presented a generic layout model based on constraints. It reminded me a bit of the layout model <a href="http://prog.vub.ac.be/doku.php?id=yves_vandriessche">Yves</a> worked on for <a href="http://jozilla.net/data/publications/VermeulenVandriesscheClerckxLuytenConinx_eis2007.pdf">our <span class="caps">EIS</span> 2007 paper</a>. They used the <a href="http://www.cs.washington.edu/research/constraints/cassowary/">Cassowary constraint solver</a>, which I also used for my MSc thesis on constraint-based layouts for <span class="caps">UIML.</span> Sebastian told me he got the idea from my demo at <span class="caps">CADUI</span> 2006. I forgot to add a certain constraint (the layout of the UI was thus underconstrained), which by coincidence had no effect on the user interface everytime I tested it. Of course, when I showed the demo it <strong>did</strong> have an effect <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> This clearly illustrated that constraint solvers are sometimes unpredictable (see <a href="http://portal.acm.org/citation.cfm?doid=344949.344959">Past, present, and future of user interface software tools</a> by Myers et al.). Sebastian&#8217;s solution to this problem was to hide the constraints from the designer and generate them automatically from a graphical layout model.</p>

<p><a href="http://www.isys.ucl.ac.be/bchi/members/jgo/">Juan Manuel Gonzalez Calleros</a> &#8212; who I met at <span class="caps">CADUI</span> 2006, <span class="caps">TAMODIA</span> 2006 and a few other occasions &#8212; presented a poster and a paper at the workshop on haptics. He took a few pictures while Jan was presenting (thanks again Juan!). Here are Juan and Jan discussing UsiXML vs <span class="caps">UIML </span> <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>

<p><a href="http://www.flickr.com/photos/jozilla/2594919372/">
					<img src="http://farm4.static.flickr.com/3250/2594919372_cd912ba01a.jpg" alt="Jan and Juan discussing UsiXML vs UIML" />
				</a></p>

<p>Overall, the comments on our work were positive, although of course one of the biggest problems is still the lack of support for multi-screen interfaces. As Jan is actively hacking on Gummy these days, I don&#8217;t think it will take very long for this to be included in the tool <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=THBvFI"><img src="http://feeds.feedburner.com/~f/InTraction?i=THBvFI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=tNeJai"><img src="http://feeds.feedburner.com/~f/InTraction?i=tNeJai" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=NS24Wi"><img src="http://feeds.feedburner.com/~f/InTraction?i=NS24Wi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=l6Zl6I"><img src="http://feeds.feedburner.com/~f/InTraction?i=l6Zl6I" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=o6hKji"><img src="http://feeds.feedburner.com/~f/InTraction?i=o6hKji" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/06/20/avi-2008/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/06/20/avi-2008/</feedburner:origLink></item>
		<item>
		<title>Demo video of a Smalltalk environment</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/294424053/</link>
		<comments>http://blog.jozilla.net/2008/05/20/demo-video-of-a-smalltalk-environment/#comments</comments>
		<pubDate>Tue, 20 May 2008 17:36:53 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[object-oriented]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[smalltalk]]></category>

		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/2008/05/20/demo-video-of-a-smalltalk-environment/</guid>
		<description><![CDATA[Just a quick update to my previous post. I can imagine that my discussion of the advantages of Smalltalk might be a bit abstract for people who never used it.

So here&#8217;s a short demo video of a Solitaire game running in a Smalltalk environment (via David Buck). It clearly illustrates features such as full introspection [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick update to my <a href="http://blog.jozilla.net/2008/05/09/back-to-the-future-smalltalk/">previous post</a>. I can imagine that my discussion of the advantages of <a href="http://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a> might be a bit abstract for people who never used it.</p>

<p>So here&#8217;s a short demo video of a <a href="http://en.wikipedia.org/wiki/Solitaire">Solitaire</a> game running in a Smalltalk environment (via <a href="http://www.cincomsmalltalk.com/userblogs/buck/blogView?showComments=true&amp;printTitle=Smalltalk_demo_video&amp;entry=3385582893">David Buck</a>). It clearly illustrates features such as full introspection (e.g. by using the object browser) and live &#8220;fix-and-continue&#8221; debugging:</p>


<object	type="application/x-shockwave-flash"
			data="http://simberon.com/videos/SmalltalkDemo.swf"
			width="500"
			height="390">
	<param name="movie" value="http://simberon.com/videos/SmalltalkDemo.swf" />
</object>

<p>I found another <a href="http://www.cincomsmalltalk.com/video/2008/changing_the_engine_cast.mp4">video</a> showing live code updates in Smalltalk while invoking native libraries in the background (more specifically, <a href="http://en.wikipedia.org/wiki/OpenGL">OpenGL</a>):</p>

<p>I think these videos are useful for demonstrating the power of Smalltalk&#8217;s environment. On a side note, I discovered <a href="http://en.wikipedia.org/wiki/Objective-C">Objective-C</a> <a href="http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeQuickTour/qt_fix/chapter_5_section_3.html">supports some form of &#8220;fix-and-continue&#8221; debugging as well</a>. </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=tdCKDH"><img src="http://feeds.feedburner.com/~f/InTraction?i=tdCKDH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=x2A4zh"><img src="http://feeds.feedburner.com/~f/InTraction?i=x2A4zh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=qiNGXh"><img src="http://feeds.feedburner.com/~f/InTraction?i=qiNGXh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=hSlG2H"><img src="http://feeds.feedburner.com/~f/InTraction?i=hSlG2H" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=ziPTNh"><img src="http://feeds.feedburner.com/~f/InTraction?i=ziPTNh" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/05/20/demo-video-of-a-smalltalk-environment/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/05/20/demo-video-of-a-smalltalk-environment/</feedburner:origLink></item>
		<item>
		<title>Back to the future: Smalltalk</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/286746109/</link>
		<comments>http://blog.jozilla.net/2008/05/09/back-to-the-future-smalltalk/#comments</comments>
		<pubDate>Fri, 09 May 2008 10:55:41 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[c#]]></category>

		<category><![CDATA[hci]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[object-oriented]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[research]]></category>

		<category><![CDATA[smalltalk]]></category>

		<category><![CDATA[teaching]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/2008/05/09/back-to-the-future-smalltalk/</guid>
		<description><![CDATA[I spent some time last weekend looking into Smalltalk again. The first time I did this was somewhere around 2004, when I played around with Ruby and discovered that it was strongly influenced by Smalltalk. Back then I watched an old video by Dan Ingalls on object-oriented programming which finally made me fully understand the [...]]]></description>
			<content:encoded><![CDATA[<p>I spent some time last weekend looking into <a href="http://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a> again. The first time I did this was somewhere around 2004, when I played around with <a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</a> and discovered that it was strongly influenced by Smalltalk. Back then I watched an old video by <a href="http://en.wikipedia.org/wiki/Dan_Ingalls">Dan Ingalls</a> on object-oriented programming which finally made me fully understand the essence of <span class="caps">OOP</span>: it&#8217;s all about messaging <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>

<p><object class="embed" width="425" height="350" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?docId=-2058469682761344178"><param name="wmode" value="transparent" /><param name="movie" value="http://video.google.com/googleplayer.swf?docId=-2058469682761344178" /><em>You need to have flashplayer enabled to watch this Google video</em></object> </p>

<p>In my personal opinion, this video (or at least the message that Dan tries to communicate) should be better integrated in <span class="caps">OOP </span>courses at universities. Another invaluable resource for grasping these ideas is <a href="http://users.ipa.net/~dwighth/smalltalk/byte_aug81/design_principles_behind_smalltalk.html">Design Principles Behind Smalltalk</a>, again by Dan Ingalls. Of course, it&#8217;s difficult to understand what <span class="caps">OOP </span>is about if you have to learn it through a weak implementation. We learned the basics of <span class="caps">OOP </span>in C++ for example, which would be blasphemy to <a href="http://en.wikipedia.org/wiki/Alan_Kay">Alan Kay</a> <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> He once <a href="http://en.wikiquote.org/wiki/Alan_Kay">said</a> <q>Actually I made up the term <em>object-oriented</em>, and I can tell you I did not have C++ in mind</q>. Here&#8217;s his definition of <span class="caps">OOP</span>:</p>

<blockquote>
<p>
<span class="caps">OOP </span>to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in <span class="caps">LISP.</span> There are possibly other systems in which this is possible, but I&#8217;m not aware of them.<br />
</p>
</blockquote>

<p>Before I looked into Smalltalk, to my understanding objects just contained a bunch of methods or functions that had access to the object&#8217;s context. I did not really grasp the idea that objects just respond to messages (or method calls in my definition). The real difference about this is that in Smalltalk messages are dynamically dispatched at runtime. A method is the function or subroutine that is invoked in response to the sending of a message, which will be matched to the message name (or selector) <em>at runtime</em>. In contrast, method calls in C++, Java and C# are statically bound at compile-time. There is thus a distinction between the semantics (or message) and implementation strategy (or method) in Smalltalk. Decoupling these allows for more flexibility, such as objects that cache all incoming messages until their database connection is fully set up, after which they replay these messages, or objects that forward messages to other objects (which might have even been passed in at runtime). This is of one of the aspects of <em>extreme late binding</em> in Alan Kay&#8217;s definition of <span class="caps">OOP. </span></p>

<p>It&#8217;s exactly this run-time lookup of methods that enables effortless polymorphism. As explained in the video, at some point the intermediate factorial result will become an instance of <code>LargeInteger</code>, while in previous iterations it was an instance of <code>SmallInteger</code>. The multiplication message (<code>*</code>) is sent to this object, after which the correct method in the class <code>LargeInteger</code> is looked up for handling the message, allowing the existing code to continue to work. Java, C# and C++ have all inherited this feature (although C++ requires explicitly declaring methods as <code>virtual</code> for this to work, due to efficiency reasons). Smalltalk can even realize <a href="http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming">polymorphism</a> without inheritance (also known as <a href="http://en.wikipedia.org/wiki/Duck_typing">duck typing</a>), although this is not shown in this video. Smalltalk has implicit interfaces: an object&#8217;s interface is the messages it responds to. If two objects both respond to a certain message, they are interchangeable (even at runtime). Traditional languages such as Java or C++ only support inheritance-based polymorphism (although something similar to duck typing can be achieved with <a href="http://en.wikipedia.org/wiki/Template_(programming)">C++ templates</a>). Here&#8217;s the explanation by Dan Ingalls:</p>

<blockquote>
<p>
Polymorphism: A program should specify only the behavior of objects, not their representation.<br/><br/>A conventional statement of this principle is that a program should never declare that a given object is a SmallInteger or a LargeInteger, but only that it responds to integer protocol. Such generic description is crucial to models of the real world. Consider an automobile traffic simulation. Many procedures in such a system will refer to the various vehicles involved. Suppose one wished to add, say, a street sweeper. Substantial amounts of computation (in the form of recompiling) and possible errors would be involved in making this simple extension if the code depended on the objects it manipulates. The message interface establishes an ideal framework for such an extension. Provided that street sweepers support the same protocol as all other vehicles, no changes are needed to include them in the simulation: <br />
</p>
</blockquote>

<p>More details on the differences between Smalltalk and current <span class="caps">OOP </span>languages are explained in <a href="http://www.chronos-st.org/Smalltalk-Getting-the-Message.html">Smalltalk: Getting The Message</a>. I believe that understanding the original philosophy behind <span class="caps">OOP </span>helps you be a better object-oriented programmer in any language. Ramon Leon <a href="http://onsmalltalk.com/programming/objects-should-be-composeable/">discusses the common mistake of <em>magic objects</em></a> which is an interesting read.</p>

<p>But let&#8217;s get to the point of why I started looking into Smalltalk again. At the moment, I mostly program in C# (and sometimes in Java), but I often feel frustrated with both languages. After being exposed to Ruby and <a href="http://en.wikipedia.org/wiki/Python_(programming_language)">Python</a>, I feel like <a href="http://en.wikipedia.org/wiki/Type_system#Static_typing">static typing</a> requires me to write too much code and helps the compiler more than it helps me. Furthermore, Java seems to be overly engineered with all the factories, manager, readers and writers, while C# is often inconsistent or lacking in its implementation (e.g. <a href="http://blogs.msdn.com/brada/archive/2004/08/03/207164.aspx">anonymous methods are not really closures</a>). Both languages are becoming increasingly complex with the addition of more and more features. <a href="http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx">Generics</a> for example is just not necessary in a dynamically typed language. The problem with scripting languages such as Ruby and Python however, is that they are often interpreted and slow. I experimented a bit with <a href="http://jruby.codehaus.org/">JRuby</a> (a Ruby implementation in Java with full access to Java&#8217;s class library) but that didn&#8217;t satisfy my needs either. After trying to code a simple Hello World <a href="http://en.wikipedia.org/wiki/Swing_(Java)">Swing</a> application in JRuby, I was stunned that it still <a href="http://lorenzod8n.wordpress.com/2007/05/17/creating-a-simple-swing-application-in-jruby/">required me to wrap code inside an ActionListener</a> like Java does, while I really just wanted to pass in a <a href="http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_containers.html#S2">Ruby block</a>.</p>

<p><ins datetime="2008-05-19T07:50+01:00"><strong>Update:</strong>: <a href="http://blog.nicksieger.com/">Nick Sieger</a> pointed out that a newer version of JRuby does <a href="http://www.infoq.com/articles/jruby-deployment-with-webstart">allow blocks to be passed in</a>.</ins></p>

<p>Other people have also been struggling with languages such as Java or C# (e.g. <a href="http://www.jwz.org/doc/java.html">Jamie Zawinski</a>, <a href="http://tekkie.wordpress.com/2008/03/06/java-let-it-be/">Mark Miller</a> and <a href="http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html">Steve Yegge</a>) or are looking for alternatives (e.g. <a href="http://www.martinfowler.com/bliki/EvaluatingRuby.html">Martin Fowler</a> and <a href="http://www.tbray.org/ongoing/When/200x/2006/07/24/Ruby">Tim Bray</a>). I think the popularity of Ruby might motivate more people to have a look at Smalltalk. Furthermore, if you know Ruby, it&#8217;s easier to get acquainted with Smalltalk. Besides lots of similarities in the class library (the <a href="http://www.ruby-doc.org/core/classes/Kernel.html"><code>Kernel</code> class</a>, the <a href="http://www.ruby-doc.org/core/classes/Integer.html#M001160"><code>times</code> message on numbers</a>, etc.), Ruby already introduces the notion that everything is an object, objects in Ruby communicate through messages and Ruby has blocks. However, Ruby is <a href="http://onsmalltalk.com/programming/smalltalk/domain-specific-languages-ruby-a-sign-post-on-the-road-to-smalltalk/">not really equivalent to Smalltalk yet</a>. Ruby introduced extra syntax to be more familiar to people that were used to C-style programming languages, thereby losing part of Smalltalk&#8217;s flexibility. In fact, the beauty of Smalltalk is that its entire syntax <a href="http://www.esug.org/whyusesmalltalktoteachoop/smalltalksyntaxonapostcard/">easily fits on a postcard</a>. If you look closely at this example, even a conditional test in Smalltalk is implemented using messaging on objects. You just send the message <code>ifFalse</code> to an instance of the class <code>Boolean</code>, and pass in a code block you want to have executed when the value is false. It&#8217;s <a href="http://www.cincomsmalltalk.com/userblogs/avi/blogView?showComments=true&amp;entry=3284695382">turtles all the way down</a>.</p>

<p>Another problem I came across when developing in Java or C# (or in any other <span class="caps">OOP </span>language I used) was the difficulty of changing class hierarchies. Very often, due to time constraints, a design is just left in its original state, and the new requirements are supported by performing a quick hack. I suspect this problem is especially prevalent in so-called &#8220;research code&#8221; <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> It gets even worse when programming in teams. Although this problem is generally known in software engineering and several strategies have been proposed to deal with it, I wondered why the promise of <span class="caps">OOP </span>failed here. Wasn&#8217;t <span class="caps">OOP </span>supposed to improve the situation and make spaghetti code obsolete?</p>

<p>Jeffrey Massung <a href="http://learningtotalk.blogspot.com/2006/09/introduction-to-talking.html">asked himself a similar question</a>: <q>What if the philosophy (OOP) wasn&#8217;t the problem, but the implementation (language) was?</q>, and decided to write a 2D DirectX game in Smalltalk. It seems Smalltalk did indeed <a href="http://learningtotalk.blogspot.com/2007/02/when-i-started-this-project-largest.html">allow for easier design changes</a>. <a href="http://en.wikipedia.org/wiki/Self_programming_language">Self</a> (a language derived from Smalltalk) tries to alleviate <a href="http://en.wikipedia.org/wiki/Fragile_base_class_problem">the aforementioned problem</a> by specializing through cloning of existing objects instead of through class hierarchies. It&#8217;s funny to note that the problem wasn&#8217;t that bad in Smalltalk, since <a href="http://en.wikipedia.org/wiki/Self_programming_language#Prototype-based_programming_languages">you could still easily change the hierarchy</a>, unlike in languages such as Java or C++.</p>

<p>The real power of Smalltalk is not its syntax, but the entire environment. I believe this is also key to understanding <span class="caps">OOP.</span> The current languages and tools (e.g. <span class="caps">IDE</span>s) we use for doing object-oriented programming are just weak implementations of the original Smalltalk environment. When working in Smalltalk, you are working in a world of running objects, there are no files or applications, <u>everything</u> is an object. For example, version control systems in Smalltalk are actually aware of the semantics of your code, they are not just text-based. When merging code they can show you what methods have been changed, added or removed, what classes were changed, allow you to decide which changes you want to keep, etc.. Although I think <a href="http://bazaar-vcs.org/">Bazaar</a> is a great, it doesn&#8217;t come close to this way of working. Smalltalk allows live debugging and code changes, which is tremendeously useful. Ever wished that you could fix a problem while you&#8217;re debugging and immediately check if your solution works without having to recompile your application and start the entire process again? In Smalltalk (and <a href="http://gigamonkeys.com/book/introduction-why-lisp.html">Lisp</a>) that&#8217;s possible. If you want to find out more about why Smalltalk is way ahead of current mainstream <span class="caps">OOP </span>languages, have a look at Ramon Leon&#8217;s <a href="http://onsmalltalk.com/programming/smalltalk/why-smalltalk/">Why Smalltalk</a>.</p>

<p><ins datetime="2008-05-19T07:50+01:00"><strong>Update:</strong>: <a href="http://xenosrssblog.wordpress.com/">Scott Lewis</a> commented that I should have emphasized that Smalltalk is mostly written in <em>Smalltalk</em>: <q>So when you subclass any object, you can go back up the chain of inherited objects and see how everything works. Likewise when you hit an error/bug, the debugger lets you delve about as deeply as you could possibly want into what is going wrong, and why it is an error.</q> This is indeed a powerful aspect of Smalltalk, and an example of how it was influenced by <a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)">Lisp</a></ins>.</p>

<p>Besides reading about Smalltalk, I have also been experimenting a bit with <a href="http://www.squeak.org/">Squeak</a>. Squeak is an open source implementation of the Smalltalk programming language and environment, created by its original designers. Squeak runs bit-identical on many platforms (including Windows CE/PocketPC). I will leave my Squeak experiments for another blog post though <img src='http://blog.jozilla.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>

<p>To conclude, it seems that we are very good at ignoring the past. We just take our current systems for granted, and use them as a reference frame for future innovations. <a href="http://en.wikipedia.org/wiki/Marshall_McLuhan">Marshall McLuhan</a> once phrased it like this: <q>We drive into the future using only our rearview mirror</q>. I believe this is true in <span class="caps">HCI </span>research as well, as people like Dan Olsen <a href="http://icie.cs.byu.edu/paperPDFs/EvaluatingSystems.pdf">have pointed out</a>. He argued that our existing system models are barriers to the inclusion of many of the interactive techniques that have been developed. He gave the example of the recent surge in vision-based systems and multi-touch input devices, which get forced in a standard mouse point model because that is all that our systems support:</p>

<blockquote>
<p>
Multiple input points and multiple users are all discarded when compressing everything into the mouse/keyboard input model. Lots of good research into input techniques will never be deployed until better systems models are created to unify these techniques for application developers.<br />
</p>
</blockquote>

<p>Research on toolkits is a lot less popular these days. We try to map everything into existing models, and always feel like we have to support legacy applications, which hampers significant progress. Bill Buxton has also studied <a href="http://www.businessweek.com/innovate/content/jan2008/id2008012_297369.htm">innovation in <span class="caps">HCI</span></a>, and questioned the <a href="http://www.billbuxton.com/LessIsMore.html">progress we made in the last 20 years</a>. </p>

<p>I think the reason why so many great work was done by the early researchers in our field (e.g. <a href="http://en.wikipedia.org/wiki/Ivan_Sutherland">Ivan Sutherland</a>, <a href="http://en.wikipedia.org/wiki/Douglas_Engelbart">Douglas Engelbart</a> and Alan Kay) is &#8212; besides that they were very creative and intelligent people &#8212; that there was not that much previous work, they just had to start from scratch. Alan Kay once asked Ivan Sutherland how it was possible that he had invented computer graphics, done the first object oriented software system and the first real time constraint solver all by himself in one year, after which Sutherland responded <q>I didn&#8217;t know it was hard</q>.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=0LISDH"><img src="http://feeds.feedburner.com/~f/InTraction?i=0LISDH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=rrjSeh"><img src="http://feeds.feedburner.com/~f/InTraction?i=rrjSeh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=bHyQ7h"><img src="http://feeds.feedburner.com/~f/InTraction?i=bHyQ7h" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=etCuYH"><img src="http://feeds.feedburner.com/~f/InTraction?i=etCuYH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=Iqntbh"><img src="http://feeds.feedburner.com/~f/InTraction?i=Iqntbh" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/05/09/back-to-the-future-smalltalk/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/05/09/back-to-the-future-smalltalk/</feedburner:origLink></item>
		<item>
		<title>OneNote: a hidden Microsoft Office gem</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/275585776/</link>
		<comments>http://blog.jozilla.net/2008/04/22/onenote-a-hidden-microsoft-office-gem/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 18:31:29 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[onenote]]></category>

		<category><![CDATA[productivity]]></category>

		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/2008/04/22/onenote-a-hidden-ms-office-gem/</guid>
		<description><![CDATA[Last week I discovered Microsoft OneNote 2007, and I am (honestly) impressed. Actually, the first time I ever heard of OneNote was when I read the FAQ of InkSeine. 



Here&#8217;s part of the product description:



Office OneNote 2007 is a digital notebook that provides people one place to gather their notes and information, powerful search to [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I discovered <a href="http://office.microsoft.com/en-us/onenote/">Microsoft OneNote 2007</a>, and I am (honestly) impressed. Actually, the first time I ever heard of OneNote was when I read the <a href="http://research.microsoft.com/inkseine/FAQ.html"><span class="caps">FAQ </span>of InkSeine</a>. </p>

<p><a href="http://office.microsoft.com/en-us/onenote/"><img src='http://blog.jozilla.net/wp-content/uploads/2008/04/onenote_icon.png' alt='OneNote 2007' /></a></p>

<p>Here&#8217;s part of the product description:</p>

<blockquote>
<p>
Office OneNote 2007 is a digital notebook that provides people one place to gather their notes and information, powerful search to find what they are looking for quickly, and easy-to-use shared notebooks so that they can manage information overload and work together more effectively.<br />
</p>
</blockquote>

<p>I have been using a combination of <a href="http://mail.google.com/">Gmail</a>, <a href="http://www.google.com/calendar/">Google Calendar</a>, <a href="http://docs.google.com/">Google Docs</a>, <a href="http://www.google.com/notebook/">Google Notebook</a> and <a href="http://del.icio.us/">del.icio.us</a> to organize (and capture) information (partially inspired by <a href="http://starkos.industriousone.com/gettings-things-done-google">this setup</a>). The big problem here was synchronization. I ended up copying <span class="caps">URL</span>s to Google Notebook since I would never be confronted with them again if I stored them in del.icio.us. There were no explicit links between meetings, documents, and other resources (e.g. websites or short notes in notebooks). I would add gadgets for each of these apps to my <a href="http://www.google.com/ig">iGoogle</a> page to keep an overview. Although I could cope with this setup, it was not ideal. Gmail and Google Calendar are great services which I still love to use, but for quick notes and jotting down ideas I often resorted to paper notes.</p>

<p>Although OneNote is not perfect either, combined with a laptop (or tablet PC) it has the potential to eliminate most paper note taking. To get a good overview of what&#8217;s possible with OneNote, have a look at these resources:</p>


<ul>
<li><a href="http://channel8.msdn.com/Posts/OneNote-the-Mega-Tool-for-Learning/">Max Zuckerman&#8217;s OneNote: the Mega-Tool for Learning</a></li>
<li><a href="http://pubs.logicalexpressions.com/pub0009/LPMArticle.asp?ID=793">Dian Chapman&#8217;s OneNote Introduction</a></li>
<li>the OneNote 2007 Guide if you have OneNote installed on your <span class="caps">PC.</span></li>
</ul>



<p>A lot of people have been impressed with OneNote and have <a href="http://blogs.msdn.com/descapa/archive/2008/02/07/onenote-blog-round-up-january-2008.aspx">blogged</a> <a href="http://blogs.msdn.com/descapa/archive/2008/03/13/feb-2008-blogging-round-up.aspx">about</a> <a href="http://blogs.msdn.com/descapa/archive/2008/04/10/march-2008-blog-round-up.aspx">it</a>.</p>

<p>Here are a few of OneNote&#8217;s features that I like:</p>


<ul>
<li>text search in images <em>and</em> audio</li>
<li>audio and video recording with <em>synchronized notes</em></li>
<li>shared notebooks</li>
<li>embedding any file as a printout</li>
<li>screen clippings</li>
<li>the ability to write and draw anywhere on a page</li>
<li>tags (e.g. todo, important, question, etc.)</li>
<li>calculator support</li>
<li>inking support (if only I had a tablet PC)</li>
</ul>



<p>Here&#8217;s an example of how I used OneNote to summarize an <a href="http://yudkowsky.net/bayes/bayes.html">intuitive explanation of Bayesian Reasoning</a> by <a href="http://yudkowsky.net/">Eliezer Yudkowsky</a>:</p>

<p><a href="http://yudkowsky.net/bayes/bayes.html"><img src='http://blog.jozilla.net/wp-content/uploads/2008/04/onenote_example.png' alt='Intuitive Explanation of Bayesian Reasoning in OneNote' /></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=XoLwuUG"><img src="http://feeds.feedburner.com/~f/InTraction?i=XoLwuUG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=oQtqayg"><img src="http://feeds.feedburner.com/~f/InTraction?i=oQtqayg" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=0ylLGlg"><img src="http://feeds.feedburner.com/~f/InTraction?i=0ylLGlg" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=wl2lDFG"><img src="http://feeds.feedburner.com/~f/InTraction?i=wl2lDFG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=XhuZ1Vg"><img src="http://feeds.feedburner.com/~f/InTraction?i=XhuZ1Vg" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/04/22/onenote-a-hidden-microsoft-office-gem/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/04/22/onenote-a-hidden-microsoft-office-gem/</feedburner:origLink></item>
		<item>
		<title>Gummy UI improvements</title>
		<link>http://feeds.feedburner.com/~r/InTraction/~3/255655318/</link>
		<comments>http://blog.jozilla.net/2008/03/21/gummy-ui-improvements/#comments</comments>
		<pubDate>Fri, 21 Mar 2008 18:05:48 +0000</pubDate>
		<dc:creator>Jo Vermeulen</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[gummy]]></category>

		<category><![CDATA[research]]></category>

		<category><![CDATA[uiml]]></category>

		<category><![CDATA[uiml.net]]></category>

		<guid isPermaLink="false">http://blog.jozilla.net/2008/03/21/gummy-ui-improvements/</guid>
		<description><![CDATA[I am currently working together with Jan on improving the Gummy tool (website still under construction). We have come a long way since Jan wrote the first version for his Master&#8217;s thesis. I figured it might be interesting to share a few screenshots of different phases in the development:

Here&#8217;s the first version (June 2007):



A version [...]]]></description>
			<content:encoded><![CDATA[<p>I am currently working together with Jan on improving the <a href="http://research.edm.uhasselt.be/~gummy/">Gummy tool</a> (website still under construction). We have come a long way since Jan wrote the first version for his <a href="http://jozilla.net/teaching/students">Master&#8217;s thesis</a>. I figured it might be interesting to share a few screenshots of different phases in the development:</p>

<p>Here&#8217;s the first version (June 2007):</p>

<p><a href='http://blog.jozilla.net/wp-content/uploads/2008/03/gummy-oldest.png' title='Gumme screenshot of June 2007'><img src='http://blog.jozilla.net/wp-content/uploads/2008/03/gummy-oldest.thumbnail.png' alt='Gumme screenshot of June 2007' /></a></p>

<p>A version with roughly the same UI but lots of architectural improvements (November 2007):</p>

<p><a href='http://blog.jozilla.net/wp-content/uploads/2008/03/gummy-old.png' title='Gummy around the end of 2007'><img src='http://blog.jozilla.net/wp-content/uploads/2008/03/gummy-old.thumbnail.png' alt='Gummy around the end of 2007' /></a></p>

<p>The current version with an improved UI (March 2008):</p>

<p><a href='http://blog.jozilla.net/wp-content/uploads/2008/03/gummy-current.png' title='Gummy screenshot of March 2008'><img src='http://blog.jozilla.net/wp-content/uploads/2008/03/gummy-current.thumbnail.png' alt='Gummy screenshot of March 2008' /></a></p>

<p>I think the most significant improvement is the new toolbox. Designers can now more easily distinguish between different widgets. In previous versions, some widgets were hard to distinguish. We added labels to each widget in the toolbox, and improved the inline rendering of the widgets. Notice that these images are still not predefined icons, but real widgets rendered to a bitmap. However, in the current version we chose to render them at their optimal size and then scale the images down.</p>

<p>Rendering widgets to bitmaps also forced us to migrate to Windows. We started our development on <span class="caps">GNU</span>/Linux using <a href="http://www.mono-project.com/">Mono</a> but had to switch due to an annoying bug in Mono&#8217;s implementation of <a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.drawtobitmap.aspx">Control.DrawToBitmap</a>. Future versions should be able to run in Mono again when this bug is fixed though.</p>

<p><ins datetime="2008-04-03T11:57+01:00"><strong>Update:</strong> Jan sent me a screenshot of an even older version of Gummy, dated back to December 19, 2006:</p>

<p><a href='http://blog.jozilla.net/wp-content/uploads/2008/04/jan-oldest-gummy.png' title='Gummy screenshot of December 19, 2006'><img src='http://blog.jozilla.net/wp-content/uploads/2008/04/jan-oldest-gummy.thumbnail.png' alt='Gummy screenshot of December 19, 2006' /></a>
</ins></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/InTraction?a=rpoY7ZF"><img src="http://feeds.feedburner.com/~f/InTraction?i=rpoY7ZF" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=a7zSSbf"><img src="http://feeds.feedburner.com/~f/InTraction?i=a7zSSbf" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=RwsvQ4f"><img src="http://feeds.feedburner.com/~f/InTraction?i=RwsvQ4f" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=3PZkvyF"><img src="http://feeds.feedburner.com/~f/InTraction?i=3PZkvyF" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/InTraction?a=nFtEmKf"><img src="http://feeds.feedburner.com/~f/InTraction?i=nFtEmKf" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.jozilla.net/2008/03/21/gummy-ui-improvements/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.jozilla.net/2008/03/21/gummy-ui-improvements/</feedburner:origLink></item>
	</channel>
</rss>
