<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>chez michel</title>
	<atom:link href="http://michel.wermelinger.ws/chezmichel/feed/" rel="self" type="application/rss+xml" />
	<link>http://michel.wermelinger.ws/chezmichel</link>
	<description>a self-explanatory site</description>
	<lastBuildDate>Sun, 17 Jan 2010 16:23:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Identifier Quality and Code Quality</title>
		<link>http://michel.wermelinger.ws/chezmichel/2010/01/identifier-quality-and-code-quality/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2010/01/identifier-quality-and-code-quality/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 21:58:57 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[research]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/chezmichel/?p=527</guid>
		<description><![CDATA[Our PhD student Simon Butler has been looking at whether there is some relation between poor identifiers (e.g. that are too short or don&#8217;t use dictionary words) and code quality. The hypothesis is that poor identifiers may reflect less than optimal understanding of the problem or of the domain and in turn may impact on [...]]]></description>
			<content:encoded><![CDATA[<p>Our PhD student Simon Butler has been looking at whether there is some relation between poor identifiers (e.g. that are too short or don&#8217;t use dictionary words) and code quality. The hypothesis is that poor identifiers may reflect less than optimal understanding of the problem or of the domain and in turn may impact on the program&#8217;s understanding during maintenance. All this may thus lead to code quality problems: potential bugs, convoluted code, etc.</p>
<p>Simon had a short paper at the Working Conf. on Reverse Engineering (WCRE) last October, presenting his first study on open source Java applications. The paper was quite well received, from what he told us. Simon&#8217;s talk was the only non-invited talk the WCRE steering committee chair twittered about, and it was mentioned the next day by Nicolas Anquetil during his most influential paper talk.</p>
<p>Simon has meanwhile enlarged the depth and breadth of the study: he did the analysis at method level (before it was at class level), he compared naming quality with more code quality metrics, and he also compared it with a readability metric. He also did a statistical analysis to see if some naming problems (e.g. not using dictionary words) could be used as a light-weight test to point to methods with readability and quality problems. The paper we submitted to the European Conf. on Software Maintenance and Reengineering (CSMR) was accepted and today we uploaded to our institutional open access repository the <a href="http://oro.open.ac.uk/19224/" target="_blank">camera-ready version</a> that, from past experience, will take some months to show up in IEEE Xplore.</p>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2010/01/identifier-quality-and-code-quality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Architectural Evolution of Eclipse</title>
		<link>http://michel.wermelinger.ws/chezmichel/2009/10/the-architectural-evolution-of-eclipse/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2009/10/the-architectural-evolution-of-eclipse/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 10:06:52 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[research]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/chezmichel/?p=489</guid>
		<description><![CDATA[

  // Load the Visualization API and the individual visualization libraries
  google.load('visualization', '1', {'packages':['columnchart','linechart']});	
  // Set a callback to run when the API is loaded.	
  google.setOnLoadCallback(getData);
  // Get a sub-table from a Google spreadsheet
  function getView(select, source, callback) {
    var query = new google.visualization.Query(source);
   [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://www.google.com/jsapi" type="text/javascript"></script><br />
<script type="text/javascript">
  // Load the Visualization API and the individual visualization libraries
  google.load('visualization', '1', {'packages':['columnchart','linechart']});	
  // Set a callback to run when the API is loaded.	
  google.setOnLoadCallback(getData);
  // Get a sub-table from a Google spreadsheet
  function getView(select, source, callback) {
    var query = new google.visualization.Query(source);
    query.setQuery(select);
    query.send(callback);
  }
  // get and draw all the views
  var major = 'http://spreadsheets.google.com/pub?key=tn5nFYKuPbgD-sL25juM-IQ';
  var milestones = 'http://spreadsheets.google.com/pub?key=t54eHKWeiMlHtP1bELzIEnA';
  function getData() {
    getView('select A, C-C, 0-C, D, E, F-F, F label 0-C "Unforced deletions", C-C "Forced deletions", D "Kept", E "Previous", F-F "Forced additions", F "Unforced additions"', major, 
                function (reply) { draw(reply, 'size', 'bar', {title:'Size Evolution', titleY:'Plugins'}); });
    getView('select A, C-C, 0-C, D, E, F-F, F label 0-C "Unforced deletions", C-C "Forced deletions", D "Kept", E "Previous", F-F "Forced additions", F "Unforced additions"', milestones, 
                function (reply) { draw(reply, 'size', 'bar', {titleY:'Plugins', legend:'none'}); });
    getView('select A, 0-H, 0-G, I, J, K, L label 0-G "Unforced deletions", 0-H "Forced deletions", I "Kept", J "Previous", K "Forced additions", L "Unforced additions"', major, 
                function (reply) { draw(reply, 'complexity', 'bar', {title:'Complexity Evolution (static)', titleY: 'Static Dependencies'}); });
    getView('select A, 0-N, 0-M, O, P, Q, R label 0-M "Unforced deletions", 0-N "Forced deletions", O "Kept", P "Previous", Q "Forced additions", R "Unforced additions"', major, 
                function (reply) { draw(reply, 'complexity', 'bar', {title:'Complexity Evolution (dynamic)', titleY:'Dynamic Dependencies', legend:'none'}); });    
    getView('select A, 0-T, 0-S, U, V, W, X label 0-S "Unforced deletions", 0-T "Forced deletions", U "Kept", V "Previous", W "Forced additions", X "Unforced additions"', major, 
                function (reply) { draw(reply, 'complexity', 'bar', {title:'Complexity Evolution (overall)', titleY:'Dependencies'}); });    
    getView('select A, 0-T, 0-S, U, V, W, X label 0-S "Unforced deletions", 0-T "Forced deletions", U "Kept", V "Previous", W "Forced additions", X "Unforced additions"', milestones, 
                function (reply) { draw(reply, 'complexity', 'bar', {titleY:'Dependencies', legend:'none'}); });    
    getView('select A, (I+J+K+L)/(D+E+F), (O+P+Q+R)/(D+E+F),  (U+V+W+X)/(D+E+F)  label (I+J+K+L)/(D+E+F) "Static", (O+P+Q+R)/(D+E+F) "Dynamic", (U+V+W+X)/(D+E+F) "Overall"', major,
                function (reply) { draw(reply, 'cohesion', 'line', {title:'Cohesion Evolution', titleY: 'Dependencies per Plugin', colors:['lime', 'green', ' olive']}); });
    getView('select A, 0-Z, 0-Y, AA, AB, AC, AD label 0-Y "Unforced Deleted", 0-Z "Forced Deleted", \
                 AA "Kept", AB "Previous", AC "Forced added", AD "Unforced added"', major, 
                function (reply) { draw(reply, 'coupling', 'bar', {title:'Coupling Evolution', titleY: 'External Dependencies'}); });
    getView('select A, 0-AF, 0-AE, AG, AH, AI, AJ label 0-AE "Unforced Deleted", 0-AF "Forced Deleted", \
                 AG "Kept", AH "Previous", AI "Forced added", AJ "Unforced added"', major, 
                function (reply) { draw(reply, 'ext_pts', 'bar', {title:'Extension Point Evolution (absolute)', titleY:'Extension Points'}); });
    getView('select A, (AG+AH+AI+AJ)/(D+E+F) label (AG+AH+AI+AJ)/(D+E+F) "Extension Points per Plugin"', major, 
                function (reply) { draw(reply, 'ext_pts', 'line', {title:'Extension Point Evolution (ratio)', titleY:'Extension Points per Plugin', legend:'none', colors:['olive']}); });
    getView('select A, 0-AL, 0-AK, AM, AN, AO, AP label 0-AK "Unforced Deleted", 0-AL "Forced Deleted", \
                 AM "Kept", AN "Previous", AO "Forced added", AP "Unforced added"', major, 
                function (reply) { draw(reply, 'unused_ext_pts', 'bar', {title:'Unused Extension Point Evolution (absolute)', titleY:'Unused Extension Points'}); });
    getView('select A, (AM+AN+AO+AP)/(AG+AH+AI+AJ) label (AM+AN+AO+AP)/(AG+AH+AI+AJ) "Unused Extension Point percentage"', major, 
                function (reply) { draw(reply, 'unused_ext_pts', 'line', {title:'Unused Extension Point Evolution (ratio)', titleY:'% Unused Extension Points', legend:'none', colors:['olive']}); });
  }
  // types of charts used and how often
  var charts = {bar:0, area:0, line:0};
  // draw returned data within given container using given chart type
  function draw(reply, container, chart, options) {
    if (reply.isError()) {
      alert('Error in query: ' + reply.getMessage() + '\n' + reply.getDetailedMessage());
      return;
    }
    var data = reply.getDataTable();
    var diagram;
    if (chart == 'bar')
      diagram = new google.visualization.ColumnChart(document.getElementById(container));
    else
      diagram = new google.visualization.LineChart(document.getElementById(container));
    if (options.height == undefined) options.height = 300;
    if (options.legend == undefined) options.legend = 'bottom';
    if (options.isStacked == undefined) options.isStacked = true;
    if (options.titleX == undefined) options.titleX = 'Releases';
    if (options.colors == undefined) options.colors = ['orange', 'red', 'dodgerblue', 'deepskyblue', 'orange', 'red'];
    diagram.draw(data, options);
  }
</script></p>
<p>In our paper at the 2008 International Conference on Software Maintenance, my colleague Yijun Yu and I presented an analysis of the evolution of the plugin-based Eclipse SDK architecture. The aim was to see whether some systematic architectural change process was followed and if commonly prescribed design guidelines (like increasing cohesion and decreasing coupling) were followed. Towards that end we collected several metrics (number of plugins, number of dependencies, etc.) and plotted them over various releases of different types (major release, maintenance release, etc.).</p>
<p>We have now analysed a few more Eclipse releases, did more measurements (on extension points) and refined others (distinguishing between forced and unforced changes), and decided to make the data public, by putting the metrics on Google spreadsheets and using <a href="http://code.google.com/apis/visualization/">Google Visualization</a> to show the evolution of the measurements. One spreadsheet (<a href="http://spreadsheets.google.com/pub?key=tn5nFYKuPbgD-sL25juM-IQ" target="_blank">HTML</a>, <a href="http://spreadsheets.google.com/pub?key=tn5nFYKuPbgD-sL25juM-IQ&#038;output=csv">CSV</a>, <a href="http://spreadsheets.google.com/pub?key=tn5nFYKuPbgD-sL25juM-IQ&#038;output=xls">Excel</a>, <a href="http://spreadsheets.google.com/pub?key=tn5nFYKuPbgD-sL25juM-IQ&#038;output=ods">OpenOffice</a>) contains the metrics for major and maintenance releases from 1.0 to 3.5.1, the other (<a href="http://spreadsheets.google.com/pub?key=t54eHKWeiMlHtP1bELzIEnA" target="_blank">HTML</a>, <a href="http://spreadsheets.google.com/pub?key=t54eHKWeiMlHtP1bELzIEnA&#038;output=csv">CSV</a>, <a href="http://spreadsheets.google.com/pub?key=t54eHKWeiMlHtP1bELzIEnA&#038;output=xls">Excel</a>, <a href="http://spreadsheets.google.com/pub?key=t54eHKWeiMlHtP1bELzIEnA&#038;output=ods">OpenOffice</a>) has the metrics for the milestones and release candidates of releases 3.2 and 3.3. You&#8217;re free to use the data for your own purposes, provided you acknowledge where you got it from, e.g. by providing the URL of this post. Our Javascript code to obtain the charts from the spreadsheets is open source: just use your browser&#8217;s &#8217;show page source&#8217; feature! In that way you can reverse engineer what the headings in the spreadsheets columns mean, but an easier way is to just contact us <img src='http://michel.wermelinger.ws/chezmichel/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  We next present the results, but they will only make sense if you first <a href="http://oro.open.ac.uk/11975/" target="_blank">read the paper</a>. <span id="more-489"></span></p>
<p>We use mostly stacked bar charts, with each segment showing a particular subset of the total number of items (plugins, extension points or dependencies). The segments are stacked, from bottom to top, as follows: unforced deletions, forced deletions, items kept since the first release, items kept from the previous but not the first release, forced additions, unforced additions. In general, a change is considered unforced if it is by choice, and forced if it is due to another change. For example, the unforced deletion of a plugin forces the deletion of all its extension points and dependencies. Clicking on a bar segment will say precisely what value is being plotted for what release and what kind of change.</p>
<p>We use line charts to show ratios or other values. Again, it is possible to click on a data point to obtain its precise value, instead of guessing it from the y-axis.</p>
<p>The first charts show the evolution of Eclipse&#8217;s size, as measured by the number of plugins. We consider all additions and deletions as unforced, because they are architectural choices. We can see that the set of plugins remains constant during maintenance releases, i.e. additions and deletions are only observed at major releases. A look at the interim milestones and release candidates reveals that most of those changes occur in milestones, although some also occur in the later release candidates. (Note that in this case, the number of kept plugins is with regard to the first release in the sequence, i.e. 3.1.)</p>
<div id="size"></div>
<p>The next charts plot the changes to complexity, measured as the number of dependencies between plugins. We distinguish between static and dynamic dependencies (see the paper for what those terms mean in our context). The overall complexity is the union of both, i.e. a dynamic and a static dependency between the same pair of plugins count as one overall dependency between that pair. A forced addition or deletion of a dependency is associated to the creation or removal of at least one of the involved plugins, i.e. the addition (resp. deletion) of a dependency between two plugins is called unforced if both plugins already existed (resp. still remain). Again, we see that dependencies change mostly during milestones and remain the same during maintenance, except for a few deletions in 3.3.1.  </p>
<div id="complexity"></div>
<p>Overall, the biggest changes were in releases 3.0 (almost doubled the complexity while retaining the size) and 3.4 (almost doubled the size). Only 3.1 presents a decrease in complexity. If we now compute directly from the spreadsheet the cohesion, measured as the dependency-to-plugin ratio, we note it&#8217;s remarkably constant except for the increase at 3.0 and decrease at 3.4. </p>
<div id="cohesion"></div>
<p>The next chart shows the changes to coupling, measured as the number of external dependencies, i.e. between an Eclipse SDK plugin and a 3rd-party component. All external dependencies are static. We can see that coupling was drastically reduced in 3.0, with all existing external dependencies being replaced by new ones. The paper explains what happened.</p>
<div id="coupling"></div>
<p>We also measured the number of extension points provided by the Eclipse SDK and how it changed over time. The addition (deletion) of an extension point is considered forced if the plugin that provides the extension point has been created (resp. removed) simultaneously. We first show the absolute, then the relative number of extension points. We note that most extension points are added to already existing plugins. Hence, new plugins have few or no extension points, leading to a decrease in the average number of extension points per plugin.</p>
<div id="ext_pts"></div>
<p>Also interesting is to see how many unused extension points there are, i.e. whether the SDK is &#8216;eating its own food&#8217; or providing extension points mostly for 3rd-party plugins. The addition of an unused extension is considered to be forced if it is due to the deletion of a dynamic dependency (and hence the extension point became unused). The deletion of an unused extension point is forced if due to the deletion of the corresponding plugin. We note that most additions are unforced and for external plugins, because the percentage of unused extension points is constantly rising. Release 3.5 removed a large part of the plugins with unused extension points. </p>
<div id="unused_ext_pts"></div>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2009/10/the-architectural-evolution-of-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Showing your Web 2.0 presence</title>
		<link>http://michel.wermelinger.ws/chezmichel/2009/09/showing-your-web-2-0-presence/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2009/09/showing-your-web-2-0-presence/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 17:11:01 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/chezmichel/?p=413</guid>
		<description><![CDATA[Many (but not all) Web 2.0 sites provide little badges or widgets to insert in your own blog and thereby link to those sites.  Additionally, we are spoilt for choice with all those designer-made eye-candy badges, like a cute little blue bird asking your readers to follow you on Twitter. After coming across Ben Godfrey&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Many (but not all) Web 2.0 sites provide little badges or widgets to insert in your own blog and thereby link to those sites.  Additionally, we are spoilt for choice with all those designer-made eye-candy badges, like a cute little blue bird asking your readers to follow you on Twitter. After coming across <a href="http://aftnn.org/about/" target="_blank">Ben Godfrey</a>&#8217;s site, I decided I wanted to take the same simple yet visual, compact, and general approach: a list of site names, together with their <a href="http://en.wikipedia.org/wiki/Favicon" target="_blank">favicons</a>, linking to my accounts on those sites. Ben uses some CSS magic which I couldn&#8217;t understand, but after some trials and errors, I found a way to replicate his approach.</p>
<p>Using WordPress&#8217;s <a href="http://codex.wordpress.org/Widgets_SubPanel" target="_blank">text widget</a>, which allows to put any plain text or HTML in the sidebar, it&#8217;s a breeze to make such a list. The HTML code</p>
<pre>&lt;ul&gt;&lt;li&gt;
&lt;a href="http://bibsonomy.org/user/michelw" title="papers"&gt;&lt;img
src="http://bibsonomy.org/favicon.ico" style="vertical-align:middle"
&gt; Bibsonomy&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.linkedin.com/in/michelwermelinger" title="contacts"&gt;&lt;img
src="http://www.linkedin.com/favicon.ico" style="vertical-align:middle"
&gt; LinkedIn&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;</pre>
<p>will generate this list:</p>
<ul>
<li> <a title="papers" href="http://bibsonomy.org/user/michelw"><img style="vertical-align:middle" src="http://bibsonomy.org/favicon.ico" alt="" /> Bibsonomy</a></li>
<li> <a title="contacts" href="http://www.linkedin.com/in/michelwermelinger"><img style="vertical-align:middle" src="http://www.linkedin.com/favicon.ico" alt="" /> LinkedIn</a></li>
</ul>
<p>The only problem is if the site doesn&#8217;t have a favicon file. The best is to <a href="http://www.labnol.org/internet/get-favicon-image-of-websites-with-google/4404/" target="_blank">use Google to obtain the favicon</a> for a given domain, because  it will return a default globe icon if no favicon can be found. In the HTML code above, simply use as image source <code>src="http://www.google.com/s2/favicons?domain=bibsonomy.org"</code> or similar.</p>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2009/09/showing-your-web-2-0-presence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Merging blogs</title>
		<link>http://michel.wermelinger.ws/chezmichel/2009/09/merging-blogs/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2009/09/merging-blogs/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 14:05:58 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/chezmichel/?p=407</guid>
		<description><![CDATA[I finally became reasonable and admitted to myself that there is no point in maintaining two separate blogs about Computing, this one and one on digital art, especially if the latter had so few updates. I hence looked for a way to transfer all the content from that blog to this one. A quick search [...]]]></description>
			<content:encoded><![CDATA[<p>I finally became reasonable and admitted to myself that there is no point in maintaining two separate blogs about Computing, this one and one on digital art, especially if the latter had so few updates. I hence looked for a way to transfer all the content from that blog to this one. A quick search returned <a href="http://markjaquith.wordpress.com/2009/01/14/tip-for-merging-two-wordpress-blogs/" target="_blank">a post</a> by one of the WordPress developers, with the gist of the solution: just use the built-in <a href="http://codex.wordpress.org/Administration_Panels#Tools_-_Managing_your_Blog" target="_blank">export/import functionality</a> to save all posts, pages, comments, categories and tags from the blog to be deleted and then load them into the blog to be kept.</p>
<p>Of course, if you have added lots of widgets to and customized the theme of your retired blog, all that will be lost, and you will have to decide whether and how to change the look and feel of the kept blog in order to accommodate the content of the retired blog. No automation can help you in that&#8230; However, I&#8217;d expect links and their categories to also be exported, but they aren&#8217;t. Hence, if you have lots of links and blogrolls on your sidebars, I have no clue how to easily copy them to another blog. Fortunately, that was not the case with my digital art blog to be retired; a simple transfer of posts (and their comments, categories and tags) was all I needed.</p>
<p>I was pleasently surprised when the import process offered to also get the files uploaded to the retired blog. Since it used some Java applets, this would be really useful. Unfortunately, I got error messages saying &#8216;unknown file extension&#8217;: apparently only certain file attachments can be imported. Oh well, no big problem. I logged into my web hosting service, where I keep all my blogs in separate sub-folders, and used the cPanel file manager to move all uploaded files from one blog&#8217;s folder to the other, and then delete the retired blog&#8217;s folder. Back to the main cPanel view, I used the <em>Manage redirects</em> functionality in the <em>Domains</em> sub-panel, in order to make all URLs of the form <code>http://michel.wermelinger.ws/digitar-te</code> (the retired blog) redirect to <code>http://michel.wermelinger.ws/chezmichel</code> (this blog). Since I use the same permalink format in both blogs, namely year/month/post-title, any links to my retired blog will correctly resolve to the corresponding posts or files in this blog.</p>
<p>To sum up, the export/import facilities of WordPress go a long way to help the merging of blogs, but be prepared to do quite some manual tweaking, especially if the two blogs are very dissimilar in the presentation of their content. Among the things to consider are the merging of different permalink structures, &#8216;About&#8217; pages, and blogrolls.</p>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2009/09/merging-blogs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Unstandard</title>
		<link>http://michel.wermelinger.ws/chezmichel/2009/08/the-unstandard/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2009/08/the-unstandard/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 12:48:44 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[wordpress]]></category>
		<category><![CDATA[themes]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/chezmichel/?p=322</guid>
		<description><![CDATA[For my new stamp blog, I looked for a highly visual layout, and came across The Unstandard, a WordPress theme that influenced others. The basic idea is that each blog post is represented by a single image in the index pages (i.e. the home, archive, category, tag and search result pages), instead of being inserted [...]]]></description>
			<content:encoded><![CDATA[<p>For my new <a href="http://michel.wermelinger.ws/postugal" target="_blank">stamp blog</a>, I looked for a highly visual layout, and came across <a href="http://5thirtyone.com/the-unstandard" target="_blank">The Unstandard</a>, a WordPress theme that influenced others. The basic idea is that each blog post is represented by a single image in the index pages (i.e. the home, archive, category, tag and search result pages), instead of being inserted in full or as an excerpt, as most themes do.  Since I aimed for the blog to somehow mimic a stamp album, having index pages display just stamp images was ideal.</p>
<p>The theme is very easy to use. <span id="more-322"></span>When writing each post, add two <a href="http://codex.wordpress.org/Using_Custom_Fields" target="_blank">custom fields</a>, named <code>lead_image</code> and <code>secondary_image</code>. The value of each field is the URL of an image, which can be external to your site or have been previously uploaded. The larger lead image will appear at the top of your blog post, while the smaller secondary image will appear in the index pages. The theme automatically crops the images to the dimensions needed. This means you can use the same URL for both custom fields, which is what I do in my stamp blog: each post is about a group of stamps and I select one of them to be featured both in the post header and in the index pages. I think that using the same image is better, because it provides &#8216;navigational continuity&#8217; when the blog visitors select a post from an index page. The <a href="http://theunstandard.5thirtyone.com" target="_blank">theme demo</a> site also uses the same images for post headers and index pages. The theme crops the images by selecting the central part and enlarging to the required ratio. This usually works fine, but occasionally the relevant part of the image is not in the middle. In those cases you have to crop your images on your computer (593 x 225 pixels for the lead image and 293 x 150 pixels for the secondary image) and then upload them.</p>
<p>Version 1.2.1 of the theme has some problems, and to fix them I had to find my way through the PHP and CSS files in the <a href="http://codex.wordpress.org/Appearance_Editor_SubPanel" target="_blank">Appearance&gt;Editor</a> administration panel. Here is a list of the problems, my fixes, and the solutions I&#8217;d like to see in the next release of the theme, in the hope it&#8217;s useful for other users of this great theme.</p>
<ol>
<li><strong>Problem</strong>: Clicking the &#8216;About&#8217; button at the top of each page doesn&#8217;t do anything.<br />
<strong>Fix</strong>: Replace <code>/#</code> by <code>/about</code> in <code>header.php</code>.<br />
<strong>Solution</strong>: This change should be part of the next version, so that at least there is an error message if the user hasn&#8217;t created the &#8216;About&#8217; page.</li>
<li><strong>Problem</strong>: Categories are shown in multiple columns at the bottom of each post. I prefer them on the sidebar, using the usual categories widget.<br />
<strong>Fix</strong>: In files <code>page.php</code>, <code>single.php</code> and <code>index.php</code> delete the line of code that includes the <code>show_categories.php</code> file.<br />
<strong>Solution</strong>: Create a theme option that allows to turn categories at the bottom on or off.</li>
<li><strong>Problem</strong>: HTML tags like <code>&lt;strong&gt;</code>, <code>&lt;code&gt;</code> and <code>&lt;em&gt;</code> are ignored, forcing one to use the HTML editor to write posts, in order to use alternative HTML tags like <code>&lt;b&gt;</code>.<br />
<strong>Fix</strong>: Delete those tags in <code>reset.css</code>, so that their default behaviour is in effect.<br />
<strong>Solution</strong>: I&#8217;m not a CSS expert, so there may be a better way to do it.</li>
<li><strong>Problem</strong>: The blog&#8217;s tagline is not shown below the blog&#8217;s name.<br />
<strong>Fix</strong>: Insert a PHP call to <code>bloginfo('description');</code> in <code>header_text.php</code>.<br />
<strong>Solution</strong>: Do proper styling of the tagline.</li>
<li><strong>Problem</strong>: The number of comments is superposed on the secondary images. This obscures them and doesn&#8217;t look good if most posts have no comments.<br />
<strong>Fix</strong>: Delete the <code>post-comments</code> class in <code>index.php</code>.<br />
<strong>Solution</strong>: Provide a theme option that allows this feature to be turned on or off.</li>
<li><strong>Problem</strong>: The date format of a post is hard-wired to <code>'M jS Y'</code> (e.g. &#8216;Aug 31st 1999&#8242;).<br />
<strong>Fix</strong>: Changed it to <code>'j F Y'</code> (i.e. &#8216;31 August 1999&#8242;) in <code>single.php</code>.<br />
<strong>Solution</strong>: Ideally, the theme would automatically pick up the format chosen in the <a href="http://codex.wordpress.org/Settings_General_SubPanel" target="_blank">Settings&gt;General</a> administration panel.</li>
<li><strong>Problem</strong>: If a blog post hasn&#8217;t been tagged, the box below the post will just state &#8216;This post has been tagged&#8217;, because it assumes a list of tags will follow.<br />
<strong>Fix</strong>: In <code>single.php</code>, change the text within the <code>for-tags</code> paragraph to the following (note the punctuation and spacing)<code>:</code></li>
</ol>
<pre><code>This post is &lt;?php if (!get_the_tag_list()) echo 'not'; ?&gt;
tagged&lt;?php the_tags(' ', ', ', ''); ?&gt;.</code></pre>
<p>I also did another small change to the theme, which is a matter of taste: in <code>style.css</code> I reduced the opacity of the title box over the stamp images from 80% to 70%.</p>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2009/08/the-unstandard/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Envisioning Information</title>
		<link>http://michel.wermelinger.ws/chezmichel/2009/06/envisioning-information/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2009/06/envisioning-information/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 13:41:04 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[readings]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/digitar-te/?p=161</guid>
		<description><![CDATA[I had already heard Tufte&#8217;s name mentioned several times, and finally read this book some time ago. I have now posted a summary of it on Bibsonomy (click on &#8216;description&#8217; to see it), just before returning the book to the library  
]]></description>
			<content:encoded><![CDATA[<p>I had already heard <a href="http://www.edwardtufte.com/tufte/" target="_blank">Tufte</a>&#8217;s name mentioned several times, and finally read <a href="http://www.edwardtufte.com/tufte/books_ei" target="_blank">this book</a> some time ago. I have now posted a <a href="http://www.bibsonomy.org/bibtex/0d3b141e856ec8a6e3e765d2f28774d9" target="_blank">summary</a> of it on Bibsonomy (click on &#8216;description&#8217; to see it), just before returning the book to the library <img src='http://michel.wermelinger.ws/chezmichel/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2009/06/envisioning-information/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visualizing Data</title>
		<link>http://michel.wermelinger.ws/chezmichel/2009/06/visualizing-data/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2009/06/visualizing-data/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 12:11:56 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[readings]]></category>
		<category><![CDATA[Processing]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/digitar-te/?p=156</guid>
		<description><![CDATA[I read this book by Ben Fry, one of the fathers of Processing, the &#8217;successor&#8217;  of DBN, and I highly recommend the book. I wrote a short review on Bibsonomy (click on the &#8216;description&#8217; heading to see it).
]]></description>
			<content:encoded><![CDATA[<p>I read this book by <a href="http://benfry.com" target="_blank">Ben Fry</a>, one of the fathers of <a href="http://processing.org" target="_blank">Processing</a>, the &#8217;successor&#8217;  of DBN, and I highly recommend the book. I wrote a <a href="http://www.bibsonomy.org/bibtex/29674a760b945dc71cea0cc5c76e51051/michelw" target="_blank">short review</a> on Bibsonomy (click on the &#8216;description&#8217; heading to see it).</p>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2009/06/visualizing-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to do everything with Outlook</title>
		<link>http://michel.wermelinger.ws/chezmichel/2009/06/how-to-do-everything-with-outlook/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2009/06/how-to-do-everything-with-outlook/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 11:18:33 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[readings]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/chezmichel/?p=312</guid>
		<description><![CDATA[I have picked up this book from the library to see if there were better ways of using Outlook, and indeed learned a couple of new things from just reading a few sections. I&#8217;ve added an entry for this book on Bibsonomy, with a short review (click on the &#8216;description&#8217; heading to see it).
]]></description>
			<content:encoded><![CDATA[<p>I have picked up this book from the library to see if there were better ways of using Outlook, and indeed learned a couple of new things from just reading a few sections. I&#8217;ve added an entry for this book on Bibsonomy, with a <a href="http://www.bibsonomy.org/bibtex/21ceed64331e70762bbd301ed2aede53a/michelw" target="_blank">short review</a> (click on the &#8216;description&#8217; heading to see it).</p>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2009/06/how-to-do-everything-with-outlook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sumer is icumen in</title>
		<link>http://michel.wermelinger.ws/chezmichel/2009/06/sumer-is-icumen-in/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2009/06/sumer-is-icumen-in/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 10:48:15 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[wordpress]]></category>
		<category><![CDATA[themes]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/chezmichel/?p=297</guid>
		<description><![CDATA[A few days ago, the forecast for today was a hot sunny day, to properly mark the start of Summer. In turned out to be a windy overcast morning and a warm sunny evening with a light breeze, at least in my neck of the woods. Although today felt more like early Fall (my favourite [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Maple Leaf theme" href="http://www.templatelite.com/maple-leaf-free-wordpress-theme"><img class="alignleft" style="margin: 3px;" title="Maple Leaf theme" src="http://www.templatelite.com/uploads/2009/02/mapleleaf-450x400.jpg" alt="Maple Leaf theme screenshot" width="300" height="255" /></a>A few days ago, the forecast for today was a hot sunny day, to properly mark the start of Summer. In turned out to be a windy overcast morning and a warm sunny evening with a light breeze, at least in my neck of the woods. Although today felt more like early Fall (my favourite time of the year) than Summer, I took the date to be a symbolic opportunity to change the markedly autumnal look of my blog de to the <a href="http://www.templatelite.com/maple-leaf-free-wordpress-theme/" target="_blank">Maple Leaf</a> theme shown left. It has served me well for the past months, but it was time to get something less seasonal.<span id="more-297"></span></p>
<p>I could have just replaced the falling leaves photo in the header by some photo of beach and sea or the like, but it wouldn&#8217;t match the foliage on the sides. Moreover,  I wasn&#8217;t complete satisfied with the greyish green or the fonts used by Maple Leaf. Installing and trying out different Wordpress themes <a href="http://codex.wordpress.org/Using_Themes#Adding_New_Themes" target="_blank">is a breeze</a>, the problem is choosing among the thousands of freely available themes.</p>
<p>After spending several hours during the past days (I&#8217;m insane, I know) surfing the web and trying out various ones, I settled for the <a href="http://www.prelovac.com/vladimir/wordpress-themes/amazing-grace" target="_blank">Amazing Grace</a> theme you&#8217;re looking at. Its green-based colour scheme establishes some continuation with the previous look of my blog, while definitely improving on the typography, with a large and readable font. Other things I like about Amazing Grace:</p>
<ul>
<li>the compact header, avoiding wasting valuable screen estate on small laptops and netbooks;</li>
<li>the RSS feed icon and its placement in the header;</li>
<li>the small colourful icons to provide visual cues on a post&#8217;s date, categories and comments;</li>
<li>the horizontal layout of the categories in the header;</li>
<li>the rotating photos in the header, which can help keep the blog in tune with seasons.</li>
</ul>
<p>Unfortunately, no theme is perfect and there are also some drawbacks:</p>
<ul>
<li>the title of the blog doesn&#8217;t appear in the browser window and tabbed windows in Firefox;</li>
<li>the date and author of a post are unnecessarily repeated;</li>
<li>there is no icon for tags and they aren&#8217;t separated from the post;</li>
<li>the second sidebar makes the main column narrower, leading to more scrolling.</li>
</ul>
<p>Fortunately, Amazing Graze has a dedicated forum on the author&#8217;s website, so hopefully someone will be able to help me fix some of those minor snags. Overall, it&#8217;s a good looking, clean and readable theme.</p>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2009/06/sumer-is-icumen-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Domain Knowledge Driven Program Analysis</title>
		<link>http://michel.wermelinger.ws/chezmichel/2009/06/domain-knowledge-driven-program-analysis/</link>
		<comments>http://michel.wermelinger.ws/chezmichel/2009/06/domain-knowledge-driven-program-analysis/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 18:21:21 +0000</pubDate>
		<dc:creator>mw</dc:creator>
				<category><![CDATA[events]]></category>

		<guid isPermaLink="false">http://michel.wermelinger.ws/chezmichel/?p=291</guid>
		<description><![CDATA[Today I drove to Cambridge (it&#8217;s just 1h each way) to attend a talk given by Daniel Ratiu, who is visiting Microsoft Research this week. He presented a summary of his PhD work, which he will defend in precisely one month. Daniel&#8217;s main message was that program analyses can benefit from the use of some [...]]]></description>
			<content:encoded><![CDATA[<p>Today I drove to Cambridge (it&#8217;s just 1h each way) to attend a talk given by <a href="http://www4.informatik.tu-muenchen.de/~ratiu/" target="_blank">Daniel Ratiu</a>, who is visiting Microsoft Research this week. He presented a summary of his PhD work, which he will defend in precisely one month. Daniel&#8217;s main message was that program analyses can benefit from the use of some domain knowledge, instead of being mostly based on the syntax and structure of the code  (e.g. call graphs).</p>
<p><span id="more-291"></span>His approach consists of first extracting a graph of the program&#8217;s identifiers and how they are related (e.g. <em>X is-a Y </em>if class <em>X </em>extends class <em>Y</em>). Given a similar graph representing the domain&#8217;s ontology, he then uses the identifiers and the graph&#8217;s structure to try to match the program&#8217;s concepts to the domain&#8217;s concepts. This then allows one to see the conceptual coverage of a program, its conceptual redundancy, the logical cohesion of an architecture, etc.</p>
<p>However, there are usually no domain ontologies available. So, he and other colleagues used the approach to extract the concept graph from several APIs for the same domain (e.g. GUIs) and then do pairwise intersections: any concept belonging to at least 2 APIs would be added to the ontology. In this way they obtained e.g. an ontology of GUI artefacts (menus, buttons, etc.) and could see which implementations don&#8217;t cover important artefacts (e.g. AWT doesn&#8217;t provide tables). The approach of course relies on the program using good identifiers (not just cryptic abbreviations), and that the identifiers reflect the domain&#8217;s vocabulary.</p>
<p>Another example he showed was a visualisation of packages or classes of a program that refer a certain concept. This can expose non-optimal modularizations of code w.r.t. the domain&#8217;s concepts.</p>
<p>Daniel also gave me a demo of his tool, available as an Eclipse plugin. I especially liked the fact that the extraction of the concept graph and the matching of graphs can be parametrized in a simple configuration file. For example, one can choose Wordnet to make identifiers uniform (e.g. <em>children </em>is mapped to <em>child</em>), although Wordnet has several shortcomings for technical domains as used in most software e.g. concepts related to GUIs. I also liked that Daniel made the concept graphs he extracted <a href="http://www4.informatik.tu-muenchen.de/~ratiu/knowledge_repository.html" target="_blank">publicly available</a>, in two easy to process formats, namely OWL and also as a text file with one triple (node-relation-node) per arc.</p>
<p>Overall, a quite nice talk and body of work; a pity it was very poorly attended.</p>
<p>As an added bonus of taking the time to go to Cambridge, the Microsoft Research reception hall has some goodies for visitors: copies of the DVD of the <a href="http://www.rigb.org/christmaslectures08/" target="_blank">Royal Institution&#8217;s Christmas 2008 lecture</a> and of the <em><a href="http://research.microsoft.com/en-us/um/cambridge/projects/towards2020science/" target="_blank">2020 Science</a></em> report. I&#8217;m already looking forward to watch and read them.</p>
]]></content:encoded>
			<wfw:commentRss>http://michel.wermelinger.ws/chezmichel/2009/06/domain-knowledge-driven-program-analysis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
