<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Mariano Martinez Peck</title>
	<atom:link href="http://marianopeck.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://marianopeck.wordpress.com</link>
	<description>Sending messages through small talks</description>
	<lastBuildDate>Tue, 21 Feb 2012 21:51:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='marianopeck.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/d661af98179e36a295e8262d2639c9d8?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Mariano Martinez Peck</title>
		<link>http://marianopeck.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://marianopeck.wordpress.com/osd.xml" title="Mariano Martinez Peck" />
	<atom:link rel='hub' href='http://marianopeck.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Moving contexts and debuggers between images with Fuel</title>
		<link>http://marianopeck.wordpress.com/2012/01/19/moving-contexts-and-debuggers-between-images-with-fuel/</link>
		<comments>http://marianopeck.wordpress.com/2012/01/19/moving-contexts-and-debuggers-between-images-with-fuel/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 22:45:40 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[Fuel]]></category>
		<category><![CDATA[Pharo]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=1146</guid>
		<description><![CDATA[Hi guys. During ESUG 2011, at the Awards, I was showing Fuel. The week before such event I was thinking what I could show to the people. This was a challenge because showing a serializer can be plain boring. I was working at home that afternoon, and suddenly I thought: &#8220;What happens if I try [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1146&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hi guys. <a title="Fuel: First place at ESUG Innovation Technology Awards" href="http://marianopeck.wordpress.com/2011/09/01/fuel-first-place-at-esug-innovation-technology-awards/">During ESUG 2011, at the Awards, I was showing Fuel</a>. The week before such event I was thinking what I could show to the people. This was a challenge because showing a serializer can be plain boring. I was working at home that afternoon, and suddenly I thought: &#8220;What happens if I try to serialize a living debugger and materialize it in another image?&#8221; After 5 minutes, really, you will see it takes only 5 minutes, I notice that such crazy idea was working OUT OF THE BOX. Even if I knew Fuel supported serialization of methods, contexts, closures, classes, etc&#8230;I was surprised that it worked from the first try. I was so happy that I tried to explain to my poor wife what I had just done hahahah. Unfortunately, she told me it was too abstract and that understanding the garbage collector was easier (I promise she really understands what the garbage collector does hahhahaha).</p>
<p>Well&#8230;.several months has passed, but I would like to show you how to do it because I think it may be of help for real systems <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />   So&#8230;the idea is the following: whenever there is an error, you can get the context from it, and such context is what is usually written down into a log file (in Pharo this is PharoDebug.log). I will show you two things: 1) how to serialize a debugger in one image and materialize it another one and; 2) how to write down the context into a Fuel file when there is an error so that you can materialize it later in another image.</p>
<h2><span style="text-decoration:underline;">Installing Fuel</span></h2>
<p>The first step is, of course, install <a href="http://rmod.lille.inria.fr/web/pier/software/Fuel">Fuel</a>. The latest stable release is 1.7 but to have better results with this example, I would recommend 1.8. Fuel 1.8 is not released yet it is because we plan to write some stuff in the website. The code is almost finish, so you should load Fuel 1.8 beta1. In my case I am using a normal Pharo 1.3 image:</p>
<p><pre class="brush: ruby;">
Gofer it
url: 'http://ss3.gemstone.com/ss/Fuel';
package: 'ConfigurationOfFuel';
load.
((Smalltalk at: #ConfigurationOfFuel) project version: '1.8-beta1') load.
</pre></p>
<p>Once you have finished loading Fuel, save the image. Let&#8217;s call it Fuel.image.</p>
<h2><span style="text-decoration:underline;">Serializing and materializing a debugger</span></h2>
<p>Now its time to do something hacky in the image so that to open a debugger. Or you can just take a piece of code and debug it. In my example, I opened a workspace and wrote the following:</p>
<p><pre class="brush: ruby;">
| a |
a := 'Hello Smalltalk hackers. The universal answer is '.
a := a , '42!'.
Transcript show: a.
</pre></p>
<p>Then I select the whole code, right click -&gt; &#8220;debug it&#8221;. Then I do one &#8220;step over&#8221; and I stop there before the concatenation with &#8217;42!&#8217;.</p>
<p><a href="http://marianopeck.files.wordpress.com/2012/01/screen-shot-2012-01-19-at-10-45-50-pm.png"><img class="aligncenter size-full wp-image-1149" title="Screen shot 2012-01-19 at 10.45.50 PM" src="http://marianopeck.files.wordpress.com/2012/01/screen-shot-2012-01-19-at-10-45-50-pm.png?w=490&#038;h=261" alt="" width="490" height="261" /></a></p>
<p>I am sure there could be better ways, but the simpler way I found to get the debugger instance for this example, is to do a Debugger allInstances first <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />   so&#8230; be sure not to have another debugger opened hahaha.  Now&#8230;let&#8217;s serialize the debugger:</p>
<p><pre class="brush: ruby;">
Smalltalk garbageCollect.
FLSerializer
serialize: Debugger allInstances first
toFileNamed: 'debugger.fuel'.
</pre></p>
<p>After that, you should have a &#8216;debugger.fuel&#8217; created in the same directory where the image is. Now close your image (without saving it) and re open it. If everything is fine, we should be able to materialize our debugger and continue debugging. So, let&#8217;s try it:</p>
<p><pre class="brush: ruby;">
| newDebugger |
newDebugger := FLMaterializer materializeFromFileNamed: 'debugger.fuel'.
newDebugger openFullMorphicLabel: 'Materialized debugger ;)'.
</pre></p>
<p>So????  Did it work??  are you as happy as me when I first saw it? <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   if you check this new opened debugger, you will see its state is correct. For example, the instVar &#8216;a&#8217; has the correct state. You can now open a Transcript and continue with the debugger as if were the original one.</p>
<p><a href="http://marianopeck.files.wordpress.com/2012/01/screen-shot-2012-01-19-at-10-56-53-pm.png"><img class="aligncenter size-full wp-image-1153" title="Screen shot 2012-01-19 at 10.56.53 PM" src="http://marianopeck.files.wordpress.com/2012/01/screen-shot-2012-01-19-at-10-56-53-pm.png?w=490&#038;h=271" alt="" width="490" height="271" /></a></p>
<p>Of course that even if this simple example works, there are a lot of problems. But I will explain them at the end of the post.</p>
<h2><span style="text-decoration:underline;">Serializing and materializing errors</span></h2>
<p>In the previous example we have serialized the debugger manually. But imagine the following: you have a production application running. There is an error, and <strong>PharoDebug.log</strong> is written with all the stack. The user/client send you by email the .log and you open your favorite <strong>text editor</strong> to try to understand what happened. Now imagine the following: you have a production application running. There is an error, and a <strong>PharoDebug.fuel</strong> is written with all the stack. The user/client send you by email the file and you <strong>open an imag</strong>e, and then materialize and <strong>open a debugger</strong>. How does it sound? <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  magical?</p>
<p>For this example, we will just change the place where Pharo writes PharoDebug.log when there is an error. That method is #logError:inContext:. What we will do is to add just 2 lines at the beginning to serialize the context:</p>
<p><pre class="brush: ruby;">
logError: errMsg inContext: aContext

&quot; we should think about integrating a toothpick here someday&quot;
FLSerializer
serialize: aContext
toFileNamed: 'PharoDebug.fuel'.

self logDuring: [:logger |
logger
nextPutAll: 'THERE_BE_DRAGONS_HERE'; cr;
nextPutAll: errMsg; cr.

aContext errorReportOn: logger.

&quot;wks 9-09 - write some type of separator&quot;
logger nextPutAll: (String new: 60 withAll: $- ); cr; cr.
]
</pre></p>
<p>Now yes, let&#8217;s execute something that causes an error. What I did is to evaluate 1/0. After that, you should see the file PharoDebug.fuel in the same directory where the image is. You can now close the image and reopen it. And then, let&#8217;s reopen de debugger:</p>
<p><pre class="brush: ruby;">
| aContext |
aContext := FLMaterializer materializeFromFileNamed: 'PharoDebug.fuel'.
Debugger openContext: aContext label:  'This is the new debugger!' contents: nil
</pre></p>
<p>Et voilà! Hopefully that worked <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />    Notice that in this example and the previous one, there is nothing in special with the Fuel serialization. You are using the normal API, and all you do is to serialize a debugger or a context as if you were serializing any normal object. Of course, you can also apply this idea to other places. For example, in Seaside you have an error handler. You may want to serialize the error with Fuel there.</p>
<h2><span style="text-decoration:underline;">Limitation and known problems</span></h2>
<ul>
<li>Even if Fuel can fully serialize methods, classes, traits, etc., it is recommended that the image were the contexts/debuggers are serialized and materialized are equal. If you are doing this in a production application, then you can have the same image running locally. The idea is that both images have the same classes and methods installed. This is because, by default, if the object graph to serialize includes compiled methods, classes, class variables, etc., they are all considered as &#8220;globals&#8221;, which means that we only serialize its global name and then during materialization it is searched in Smalltalk globals. Hence, classes and methods have to be present. Otherwise you have to use Fuel in a way that it serializes classes as well, but that&#8217;s more complicated.</li>
<li>There may be things that affects the debugger which are part of the image and not the serialization, and they may have changed. Imagine for example, a class variable which has changed its value in the image where you serialize. Then it will have a different value in the image where you materialize. Most of these problems also happens if even if you open the debugger later in the same image&#8230;some state may have changed&#8230;</li>
<li>The graph reachable from the contexts can be very big. For example, Esteban Lorenzano was doing this for an application and one of the problems is that from the context it was reachable the whole UI&#8230;which means lots and lots of objects. In such a case, you can always use Fuel hooks to prune the object graph to serialize.</li>
<li>Be aware to use exactly the same version of Fuel in both images <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ul>
<h2><span style="text-decoration:underline;">Conclusion</span></h2>
<p>All in all, I think that as a very first step, it is very nice that we can serialize this kind of stuff like contexts and debuggers out of the box with Fuel. This could be the infrastructure for a lot of fancy stuff. I don&#8217;t think that the debugger materialization can be as reliable as if you were debugging in the original image. I don&#8217;t think either that it should replace PharoDebug.log. However, what I do think is that you can add the Fuel serialization just as another way of getting more information about the problem. It&#8217;s one more tool you can add to your Smalltalk toolbox <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/debug/'>Debug</a>, <a href='http://marianopeck.wordpress.com/tag/fuel/'>Fuel</a>, <a href='http://marianopeck.wordpress.com/tag/pharo/'>Pharo</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/1146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/1146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/1146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/1146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/1146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/1146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/1146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/1146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/1146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/1146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/1146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/1146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/1146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/1146/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1146&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2012/01/19/moving-contexts-and-debuggers-between-images-with-fuel/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>

		<media:content url="http://marianopeck.files.wordpress.com/2012/01/screen-shot-2012-01-19-at-10-45-50-pm.png" medium="image">
			<media:title type="html">Screen shot 2012-01-19 at 10.45.50 PM</media:title>
		</media:content>

		<media:content url="http://marianopeck.files.wordpress.com/2012/01/screen-shot-2012-01-19-at-10-56-53-pm.png" medium="image">
			<media:title type="html">Screen shot 2012-01-19 at 10.56.53 PM</media:title>
		</media:content>
	</item>
		<item>
		<title>ExperimentalBit</title>
		<link>http://marianopeck.wordpress.com/2011/12/30/experimentalbit/</link>
		<comments>http://marianopeck.wordpress.com/2011/12/30/experimentalbit/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 17:23:36 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cog]]></category>
		<category><![CDATA[VM]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=1137</guid>
		<description><![CDATA[Last days I needed to migrate some old code I used to have in the VM for tracing objects usage. Luc Fabresse also wanted to be able to set and get the value of a bit in the object header to do some experiments. So&#8230;we thought it was a good idea to make it abstract [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1137&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Last days I needed to migrate some old code I used to have in the VM for tracing objects usage. Luc Fabresse also wanted to be able to set and get the value of a bit in the object header to do some experiments. So&#8230;we thought it was a good idea to make it abstract and public. So&#8230;.the following is only one morning work we did together with Luc, so don&#8217;t expect that much. What we did is to do a very small change in the VM to use one free bit in the object header, and then we coded 3 primitives: one to get the value, one to set it and one to unmark all objects. The idea is that you can use this code and give semantics to the bit. This is just for experimenting and prototypes, not for production code since such bit in the object header may not be available.<br />
To download:</p>
<p><pre class="brush: ruby;">
Gofer it
url: 'http://ss3.gemstone.com/ss/ExperimentalBit';
package: 'ConfigurationOfExperimentalBit';
load.
</pre></p>
<div id=":2ti">Now&#8230;. you can read ConfigurationOfExperimentalBit class comment:</div>
<div></div>
<div>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</div>
<div id=":2ti">
<p><em>ExperimentalBit is a small facade for setting and getting the value of a bit in the Object Header. It requires a special VM which supports the primitives to set and get the value of such bit. You can get an already compiled MacOSX VM from: <a href="https://gforge.inria.fr/frs/download.php/30042/CogMTVM-ExperimentalBit.zip" target="_blank">https://gforge.inria.fr/frs/download.php/30042/CogMTVM-ExperimentalBit.zip</a>. For more details read class comment of ExperimentalBitHandler.</em></p>
<p><em>If you already have a compiled VM with the required primitives, then you can just load the image side part evaluating:</em></p>
<p><em>((Smalltalk at: #</em><em>ConfigurationOfExperimentalBit</em><em>) project version: &#8217;1.0&#8242;) load.</em></p>
<p><em> If you want to build a VM with the primitives we need, you need to download:</em></p>
<p><em>((Smalltalk at: #</em><em>ConfigurationOfExperimentalBit</em><em>) project version: &#8217;1.0&#8242;) load: &#8216;VMMakerGroup&#8217;.</em></p>
<p><em>And then follow the steps to build the VM:</em></p>
<p><em>- <a href="http://code.google.com/p/cog/" target="_blank">http://code.google.com/p/cog/</a></em><br />
<em>- <a href="http://code.google.com/p/cog/wiki/Guide" target="_blank">http://code.google.com/p/cog/wiki/Guide</a></em></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>And here ExperimentalBitHandler class comment:</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p><em>ExperimentalBitHandler is a small facade for setting and getting the value of a bit in the Object Header. It requires a special VM which supports the primitives to set and get the value of such bit. You can get an already compiled MacOSX VM from: <a href="https://gforge.inria.fr/frs/download.php/30042/CogMTVM-ExperimentalBit.zip" target="_blank">https://gforge.inria.fr/frs/download.php/30042/CogMTVM-ExperimentalBit.zip</a>.</em></p>
<p><em>To know which version of the VM you have to use to compile, check the dependencies in ConfigurationOfExperimentalBit and also the &#8216;description&#8217; of it. For example, if version 1.0 it depends on &#8216;CogVM&#8217; version &#8217;3.7&#8242;. In the description of version 1.0 you can also read that the used Git version of the platform code was 4a65655f0e419248d09a2502ea13b6</em><em>e787992691 from the blessed repo.</em></p>
<p><em>Basically, there are 3 operations: set the bit to a specific, get the value of the bit and turn off the bit of all objects. Examples:</em></p>
<p><em>&#8216;aString&#8217; experimentalBit: true.</em><br />
<em>&#8216;astring &#8216; experimentalBit.</em><br />
<em> Date today experimentalBit: false.</em><br />
<em>Date today experimentalBit.</em><br />
<em>ExperimentalBitHandler turnOffExperimentalBitOfAllObj</em><em>ects.</em></p>
<p><em>For more details see ExperimentalBitTest.</em></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Happy New Year to all Smalltalk hackers!!!</p>
</div>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/cog/'>Cog</a>, <a href='http://marianopeck.wordpress.com/tag/vm/'>VM</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/1137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/1137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/1137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/1137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/1137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/1137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/1137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/1137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/1137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/1137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/1137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/1137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/1137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/1137/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1137&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2011/12/30/experimentalbit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Pharo By Example in Spanish and PBE2 new chapters!</title>
		<link>http://marianopeck.wordpress.com/2011/12/11/pharo-by-example-in-spanish-and-pbe2-new-chapters/</link>
		<comments>http://marianopeck.wordpress.com/2011/12/11/pharo-by-example-in-spanish-and-pbe2-new-chapters/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 21:46:23 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[Metacello]]></category>
		<category><![CDATA[Monticello]]></category>
		<category><![CDATA[Pharo]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=1126</guid>
		<description><![CDATA[Hi. This is a short post in case someone has missed the info. The Pharo By Example&#8217;s spanish translation was finally done. Each of the 14 chapters were translated. Notice that even that, the translation is not 100% ready. It is a draft version and it still needs some passes along the whole book.  Anyway, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1126&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hi. This is a short post in case someone has missed the info. The Pharo By Example&#8217;s spanish translation was finally done. Each of the 14 chapters were translated. Notice that even that, the translation is not 100% ready. It is a draft version and it still needs some passes along the whole book.  Anyway, the link is this: <a href="https://gforge.inria.fr/frs/download.php/28829/PBE1-Spanish-FullDraft-2011-08-01.zip">https://gforge.inria.fr/frs/download.php/28829/PBE1-Spanish-FullDraft-2011-08-01.zip</a></p>
<p>So, please distribute along spanish speaking smaltalkers.</p>
<p>For the translation, there are a lot of people to thank, there were like 15 translators. Special thanks to Gabriala Arevalo who start leading it, and then to Nicolas Paez that continues it.</p>
<p>Besides the translation, Pharo By Example 2 is in the way and there are drafts for already a lot of chapters:</p>
<ul>
<li><a href="https://gforge.inria.fr/frs/download.php/28462/Metacello.pdf">Metacello</a></li>
<li><a href="https://gforge.inria.fr/frs/download.php/28243/Settings.pdf">Settings</a></li>
<li><a href="https://gforge.inria.fr/frs/download.php/27418/Omnibrowser.pdf">OmniBrowser</a></li>
<li><a href="https://gforge.inria.fr/frs/download.php/26818/Regex.pdf">Regular expressions</a></li>
<li><a href="https://gforge.inria.fr/frs/download.php/26600/PBE2-Exceptions-2010-03-02.pdf">Exceptions</a></li>
<li><a href="https://gforge.inria.fr/frs/download.php/27018/Monticello.pdf">Monticello</a></li>
</ul>
<p>That&#8217;s all, I hope you enjoy them.</p>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/books/'>books</a>, <a href='http://marianopeck.wordpress.com/tag/metacello/'>Metacello</a>, <a href='http://marianopeck.wordpress.com/tag/monticello/'>Monticello</a>, <a href='http://marianopeck.wordpress.com/tag/pharo/'>Pharo</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/1126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/1126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/1126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/1126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/1126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/1126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/1126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/1126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/1126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/1126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/1126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/1126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/1126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/1126/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1126&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2011/12/11/pharo-by-example-in-spanish-and-pbe2-new-chapters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Why Keymapping rocks?</title>
		<link>http://marianopeck.wordpress.com/2011/12/04/why-keymapping-rocks/</link>
		<comments>http://marianopeck.wordpress.com/2011/12/04/why-keymapping-rocks/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 14:41:49 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Keymappings]]></category>
		<category><![CDATA[Pharo]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=1041</guid>
		<description><![CDATA[Smalltalkers always claim that Smalltalk has invented the mouse and the User Interface. Even if that can be discussed, I have to say it: I HATE THE MOUSE. The less I can use it, the best. The more I can stay with the keyboard, the best. Besides I am Smalltalk lover, I always try to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1041&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Smalltalkers always claim that Smalltalk has invented the mouse and the User Interface. Even if that can be discussed, I have to say it: I HATE THE MOUSE. The less I can use it, the best. The more I can stay with the keyboard, the best. Besides I am Smalltalk lover, I always try to admit when Smalltalk is not the best in certain aspect. And at least in Pharo, the need of the mouse is too much.</p>
<p>I have worked in industry with Eclipse for 3 years. And I am a geek who stays hours in front of the PC and when I was in Linux/Windows I was using all the time Total Commander or something similar. I used to know all possible shortcuts of all the software I was using in my machine. When I then started to program in Squeak it has like if I come back 20 years in time. I was not able to use the keyboard as I was doing it in the rest of my machine (and Eclipse included). It felt really frustrating. But ok&#8230;Smalltalk showed me so many cool stuff that I could live with the lack of proper shortcuts.</p>
<h2><span style="text-decoration:underline;">Keymapping</span></h2>
<p>Today, I can say Pharo has improved a little in the direction of improving the user experience with the keyboard.  This is thanks to Guillermo Pollito who has been developing Keymapping for a while. And now Débora Fortini has joined. Keymapping is a really small tool that let you define keyboard shortcuts per morph. So you can take any subclass of Morph and define your OWN shortcuts to do what you want. Of course, it may happen that there are conflicts with shortcuts of other morphs or even with global shortcuts of your Operating System. Nevertheless, the framework is there and working.</p>
<p>So&#8230;.why keymapping rocks?  Well, during Smalltalks I say to Guillermo &#8220;If you give me shortcuts to step into, step over, restart, proceed, and go up and down in the Debugger, I pay you several beers&#8221;. After 5 minutes, they were already working perfectly. What was needed?  First just create the class:</p>
<p><pre class="brush: ruby;">
Object subclass: #KMDebuggerShortcuts
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Keymapping-Debugger'
</pre></p>
<p>And then put a class side method :</p>
<p><pre class="brush: ruby;">
buildDebuggerShortcutsOn: aBuilder
&lt;keymap&gt;
(aBuilder shortcut: #stackDown)
category: #DebuggerShortcuts
default: $d command shift, Character arrowDown
do: [ :target | target down ].
(aBuilder shortcut: #stackUp)
category: #DebuggerShortcuts
default: $d command shift, Character arrowUp
do: [ :target | target up ].
(aBuilder shortcut: #proceedDebugger)
category: #DebuggerShortcuts
default: $d command shift, $p
do: [ :target | target  proceed ].
(aBuilder shortcut: #restartDebugger)
category: #DebuggerShortcuts
default: $d command shift, $r
do: [ :target | target  restart ].
(aBuilder shortcut: #stepIntoDebugger)
category: #DebuggerShortcuts
default: $d command shift, $i
do: [ :target | target  send ].
(aBuilder shortcut: #stepOverDebugger)
category: #DebuggerShortcuts
default: $d command shift, $o
do: [ :target | target  doStep ].
(aBuilder shortcut: #stepIntoBlockDebugger)
category: #DebuggerShortcuts
default: $d command shift, $t
do: [ :target | target  stepIntoBlock ].
(aBuilder shortcut: #SeeFullStackDebugger)
category: #DebuggerShortcuts
default: $d command shift, $f
do: [ :target | target  fullStack ].
(aBuilder shortcut: #runHereDebugger)
category: #DebuggerShortcuts
default: $d command shift, $h
do: [ :target | target  runToSelection ].
</pre></p>
<p>All shortcuts are defined in the same way: you create a method which receives a builder. The method #shortcut receives a shortcut name and creates an instance of KMKeymapBuilder. Then, sending the message #category:default:do: to the created KMKeymapBuilder, you can define all shortcuts. The first parameter is a category. The second is the combination of keys for the shortcut and the last parameter is the block to evaluate when such shortcut is pressed. Notice that the block receives at least the target object. In this case the target is the debugger.</p>
<p>Now, the last part is to tell the Debugger that it should attach those shortcuts. To do that, we had to overwrite (for example) the method Debugger &gt;&gt; #openFullMorphicLabel:</p>
<p><pre class="brush: ruby;">
openFullMorphicLabel: aLabelString
&quot;Open a full morphic debugger with the given label&quot;

| window |
window := UIManager default openDebugger: self fullMorphicLabel: aLabelString.
window attachKeymapCategory: #DebuggerShortcuts targetting: self.
^window
</pre></p>
<p>Notice in this method the line number 6. So&#8230;after 5 minutes that took Guille to code that, I had the shortcuts I ever wanted.</p>
<h2><span style="text-decoration:underline;">Available shortcuts</span></h2>
<p>What is important of Keymapping is the infrastructure since it give us the tool to create our own shortcuts. Or even better, integrate in Pharo new shortcuts. Just to give you an idea, KMMonticelloShortcuts has shortcuts for committing, open repository, view changes, etc. KMGlobalShortcuts has shortcuts for saving the image, to open the world menu, to open a workspace, to open a transcript, to open Monticello, to open a class browser, etc&#8230; So&#8230;come on!!  what are you waiting to give it a try?</p>
<p>How to install it?  As easy as always:</p>
<p><pre class="brush: ruby;">
Gofer new
squeaksource: 'ShortWays';
package: 'ConfigurationOfKeymapping';
load.

(ConfigurationOfKeymapping project version: #bleedingEdge) load
</pre></p>
<p>Notice that Keymapping has an integration with the Settings framework. So if you open the Setting Browser and go to the category &#8220;Keymapping&#8221; you will see some of the shortcuts and of course you will be able to modify them. Note that not all shortcuts are yet integrated to the Settings framework since Keymapping is still in development <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2><span style="text-decoration:underline;">What I would like in the future</span></h2>
<ul>
<li>The VM so far cannot handle some key events of certain keys like functions. Moreover, it seems (but I am not sure) that different VMs (the Windows VM, Linux, Mac OSX) do not handle all the key events the same way. It would be nice if they can be uniform.</li>
<li>In Pharo, when you do right-click or whatever menu that show you options like &#8220;do-it&#8221;, &#8220;print it&#8221;, etc., they all show the shortcut for them. However, if you do change them with KeyMappings, then such menu is not updated. It would be nice if the menu is auto-generated depending on the current configured shortcut.</li>
<li>It would be nice to have a way of tracking conflicts between shortcuts.</li>
</ul>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/keymappings/'>Keymappings</a>, <a href='http://marianopeck.wordpress.com/tag/pharo/'>Pharo</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/1041/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/1041/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/1041/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/1041/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/1041/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/1041/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/1041/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/1041/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/1041/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/1041/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/1041/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/1041/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/1041/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/1041/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1041&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2011/12/04/why-keymapping-rocks/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Loading projects and building your own images with Metacello</title>
		<link>http://marianopeck.wordpress.com/2011/11/19/loading-projects-and-building-your-own-images-with-metacello/</link>
		<comments>http://marianopeck.wordpress.com/2011/11/19/loading-projects-and-building-your-own-images-with-metacello/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 20:08:53 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Metacello]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[Smalltalks]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=1073</guid>
		<description><![CDATA[As I have already said, I presented at Smalltalks 2011 a talk called &#8220;Building your own images with Metacello&#8221;. I thought it could be interesting to write down the details of such presentation for those who couldn&#8217;t attend or those who want to follow what I did. Background and Motivations To help the Pharo community [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1073&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As I have already said, <a title="My small talks at Smalltalks 2011" href="http://marianopeck.wordpress.com/2011/11/16/my-small-talks-at-smalltalks-2011/">I presented at Smalltalks 2011 a talk called &#8220;Building your own images with Metacello&#8221;</a>. I thought it could be interesting to write down the details of such presentation for those who couldn&#8217;t attend or those who want to follow what I did.</p>
<h2><span style="text-decoration:underline;">Background and Motivations<br />
</span></h2>
<p>To help the Pharo community I find myself using new tools (even if they are not completely finished), using/fighting with latest versions (a.k.a bleeding edge), finding/reporting/fixing/testing bugs and issues. So&#8230;.<strong> I am downloading hundred of images every day. An image can last me a maximum of a couple of days.</strong></p>
<p>Apart from that, after 3 years with Squeak/Pharo I have my own preferences/settings which are different from the defaults. In addition, I often use tools which are not present in the standard Pharo image. I am also working in several projects at the same time. So&#8230;.. <strong>I spend a lot of time building my own images</strong>.</p>
<p><em><strong>If I am downloading hundred of images every day, an image can last me a maximum of a couple of days, and I spend a lot of time building my own images, then there is something that it is not working.</strong></em></p>
<p>Moreover, I am lazy, I don&#8217;t like loosing time with it, and my memory is bad. Hence, I have come to the solution that I will show you in this post.</p>
<h2><span style="text-decoration:underline;">Types of Operations and Softwares<br />
</span></h2>
<p>To explain you what I did, I will use an example my own projects and tools.</p>
<h3>Types of Operations</h3>
<p>When I am working with Pharo, there are usually 2 types of operations I perform with a particular project: <strong>load</strong> and <strong>build</strong>.</p>
<p><strong>Load</strong> means that I will just load a project or package into the image where I am working. No more than that. This is useful when I am working with a project with a particular image, and I just want to load another one to see something.</p>
<p><strong>Build</strong>, however, not only loads the project or package but also builds my own image for that project. What does it mean to build my own image? well, I install all the tools I use that are not present by default in Pharo, I set my personal settings, etc.</p>
<h3>Types of software</h3>
<p>There are also 2 types of software: <strong>own software</strong> and <strong>external tools</strong>.</p>
<p><strong>Own software</strong> are all those projects I own or that I contribute. For these projects, I develop, hence I always want to load the very last version of all packages. In the example of this post, there is Fuel, DBXTalk, Marea and Cog.</p>
<p><strong>External tools</strong> are those development tools, addons, themes, or whatever I install when I build my own images. Since I don&#8217;t develop these tools, I don&#8217;t want the very last version of every package, but instead the last &#8220;stable&#8221; version. In the example, there are TilingWindowManager,  &#8216;SimpleLogger&#8217;, &#8216;CodeStats&#8217;, &#8216;Glamoroust&#8217;, &#8216;Keymapping&#8217;, &#8216;SandcastlesThemes&#8217;, etc.</p>
<h2><span style="text-decoration:underline;">Metacello part of the solution</span></h2>
<p>If you have used Metacello before, you are used to see classes like ConfigurationOfSeaside, ConfigurationOfDBXTalk, ConfigurationOfFuel, ConfigurationOfMoose, etc. What I propose is to that you create your own ConfigurationOf. In my case, I have ConfigurationOfMariano. If you want to follow the post watching the real code in your image, then just evaluate:</p>
<p><pre class="brush: ruby;">
Gofer new
url: 'http://ss3.gemstone.com/ss/MarianoBuilder';
package: 'MarianoBuilder';
load.
</pre></p>
<p>Such configuration has no versions and only one baseline method. The (summary) of such method is:</p>
<p><pre class="brush: ruby;">
baseline10: spec
&lt;version: '1.0-baseline'&gt;

spec for: #pharo do: [

spec blessing: #baseline.

&quot; =========================================
The following the list of projects that I DO DEVELOP. Hence, I always want the bleedingEdge, and most of the times, I want to build an image for them.
=========================================&quot;

spec
project: 'Fuel' with: [
spec
className: 'ConfigurationOfFuel';
loads: #('DevelopmentGroup' );
file: 'ConfigurationOfFuel';
versionString: #bleedingEdge;
repository: 'http://ss3.gemstone.com/ss/Fuel' ].

spec
project: 'DBXTalk' with: [
spec
className: 'ConfigurationOfGlorpDBX';
loads: #('default' );
file: 'ConfigurationOfGlorpDBX';
versionString: #bleedingEdge;
repository: 'http://www.squeaksource.com/DBXTalk' ].

&quot;....ACTUALLY, THERE ARE MORE PROJECTS....&quot;

&quot; =========================================
The following the list of TOOLS, ADDONS  that I use for my own images. Since they are not my projects, I usually use the latest available metacello version and not the bleedingEdge.
In addition, not all tools and addons are loaded in all type of images I build. Each image decides what to include.
=========================================&quot;

spec
project: 'TilingWindowManager' with: [
spec
className: 'ConfigurationOfTilingWindowManager';
loads: #('default');
file: 'ConfigurationOfTilingWindowManager';
repository: 'http://www.squeaksource.com/TilingWindowManager' ].

spec
project: 'Glamoroust' with: [
spec
className: 'ConfigurationOfGlamoroust';
loads: #('GT-Inspector' 'GT-Playground' );
file: 'ConfigurationOfGlamoroust';
repository: 'http://www.squeaksource.com/glamoroust' ].

spec project: 'Keymapping' with: [
spec
className: 'ConfigurationOfKeymapping';
loads: #('forDeveloper' );
file: 'ConfigurationOfKeymapping';
repository: 'http://www.squeaksource.com/ShortWays' ].

&quot;....ACTUALLY, THERE ARE MORE TOOLS....&quot;

&quot; =========================================
The following is a list of groups for building my own images. Notice that for each image group there should be a class side method #buildXXXImage
=========================================&quot;

spec
group: 'FuelImage' with: #( 'BaseImage' 'SandcastlesThemes' 'Fuel');
group: 'MareaImage' with: #( 'BaseImage' 'Marea');
group: 'DBXTalkImage' with: #( 'BaseImage' 'DBXTalk');
group: 'CogVMImage' with: #( 'BaseImage' 'CogVM');

group: 'BaseImage' with: #('TilingWindowManager' 'SimpleLogger' 'CodeStats' 'Glamoroust' 'Keymapping').

].
</pre></p>
<p>Forget for a moment the last lines about groups. The basic idea is that in such configuration you group both types of software, your own or the one you contribute, and the external tools. There are a couple of interesting things to notice:</p>
<ul>
<li>Whenever I want to install something with Metacello, I never remember whether the ConfigurationOf is in MetacelloRepository or in the same repository of the project. I don&#8217;t remember which group/packages I have to load either.  This way such information is stored directly in ConfigurationOfMariano. For example, for Fuel, I have to load &#8216;DevelopmentGroup&#8217; and the ConfigurationOfFuel is in &#8216;http://ss3.gemstone.com/ss/Fuel&#8217;. For DBXTalk I have to load &#8216;default&#8217; and the ConfigurationOfGlorpDBX is in &#8216;http://www.squeaksource.com/DBXTalk&#8217;. Conclusion? I don&#8217;t have to remember that anymore.</li>
<li>Notice that for my own projects (Fuel, DBXTalk, Marea, etc) I set #bleedingEdge as the #versionString. This is because of what I have already explained that I always want the last version of each package. In the contrary, for the external tools such as Glamoroust, KeyMapping, etc, I don&#8217;t specify anything in #versionString. Hence, the default will be the last stable version, exactly what I want for those cases.</li>
</ul>
<h2><span style="text-decoration:underline;">Loading Projects</span></h2>
<p>In the class side of ConfigurationOfMariano there is a category called &#8216;loading&#8217; and there you can find methods like #loadFuel, #loadDBXTalk, #loadMarea, etc. As an example:</p>
<p><pre class="brush: ruby;">
loadFuel
FuelImageBuilder new loadPackages: 'Fuel'
</pre></p>
<p>For the moment, forget what FuelImageBuilder does, but imagine it just loads &#8216;Fuel&#8217; (this is the parameter to #loadPackage:) from ConfigurationOfMariano. Of course, the rest of the #load* methods are the same and they only change the package to load and the builder class.</p>
<p><strong>Conclusion?</strong> I can take any Pharo image, Gofer MarianoBuilder and then all I need to do is to send #loadXXX message to ConfigurationOfMariano <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  No need to remember anything nor loosing time. In fact what I do is to have  sticky note in my Mac with this code:</p>
<p><pre class="brush: ruby;">
Gofer new
url: 'http://ss3.gemstone.com/ss/MarianoBuilder';
package: 'MarianoBuilder';
load.

(Smalltalk at: #ConfigurationOfMariano) perform: #loadFuel.
</pre></p>
<p>I copy paste such code and I change #loadFuel for what I want at that moment.</p>
<h2><span style="text-decoration:underline;">Building my own images</span></h2>
<p>Now let&#8217;s see the interesting part. To build your own images with this approach, there are 2 parts. The first part is done in ConfigurationOfMariano. Take a look to the groups defined in the baseline at the beginning of the post.</p>
<p>Basically, we create a Metacello group for each image we want to build. For example, there is a group &#8216;FuelImage&#8217;, &#8216;DBXTalkImage&#8217;, etc. In such groups we can put all external tools that are exclusively needed when we build images for such project. For example, in Fuel I add &#8216;SandcastlesThemes&#8217; because for Fuel images I want to use such theme. Besides particular tools that each image needs, there is also a group called &#8216;BaseImage&#8217;, where I put all the external tools I want for all images.  In this example, &#8216;TilingWindowManager&#8217; &#8216;SimpleLogger&#8217; &#8216;CodeStats&#8217; &#8216;Glamoroust&#8217; and &#8216;Keymapping&#8217;.</p>
<p>So&#8230;all we do in the baseline of ConfigurationOfMariano related to building images is just to define which packages/projects to load. Now we have to really build the image. Most of the code for building my own images is quite similar among different projects. For example, the code to build a Fuel image will be quite similar to the one to build a DBXTalk image. The image builder is done in Pharo as well so the easiest solution is to use subclassification to customize the build process for each project. The abstract class is GeneralImageBuilder and there are subclasses such as MareaImageBuilder, FuelImageBuilder, DBXTalkImageBuilder, CogVMImageBuilder, etc.</p>
<p>The last part of ConfigurationOfMariano is the class side category called &#8216;building&#8217;, which contains methods such as #buildFuelImage, #buildDBXTalkImage, etc. You can imagine what they do:</p>
<p><pre class="brush: ruby;">
buildFuelImage
FuelImageBuilder new buildImage.
</pre></p>
<h3>The builder</h3>
<p>The main method is #buildImage</p>
<p><pre class="brush: ruby;">
buildImage
self loadImagePackages.
self generalImagePreferences.
self customPreferences.
self cleanSystem.
self lastActions.
self saveImage.
</pre></p>
<p>The first step is to load all the packages defined as part of the image. Each subclass of GeneralImageBuilder understands #imageGroupNameToLoad  which answers the metacello group defined in ConfigurationOfMariano. For example, FuelImageBuilder &gt;&gt; #imageGroupNameToLoad   just answers &#8216;FuelImage&#8217;.</p>
<p>The second line is to set all preferences/settings which are general to all images. Line 3 is a hook that allow subclasses to set custom settings. For example, Fuel and Marea they both set their own background picture, logo, theme, log file name, etc (check implementors of #customPreferences).</p>
<p>With #cleanSystem we execute some cleanings to let the image in a nice and clean state.  Then #lastActions is another hook where each subclass can execute something at the end. For example, to set my username and password for all SqueakSource repositories, to set a global/shared package-cache for all projects, etc.</p>
<p>Finally, we save the image. In my case, I want that the image is saved with a particular name and in a particular place. For example, I want that all Fuel images are called Fuel.N.image and to be placed in &#8216;/Users/mariano/PhD/Marea/Fuel/imagenes/&#8217;. Implementing #imageDirectory and #baseImageName subclasses can customize that.</p>
<p><strong>Conclusion?</strong>   I can take any Pharo image, Gofer MarianoBuilder and just sending #buildFuelImage or #buildXXX I can automatically build my own image with my own tools, settings and customizations. The image will be named and placed exactly where I want.</p>
<h3><span style="text-decoration:underline;">My final proposal</span></h3>
<p>As said, you can find the code in http://ss3.gemstone.com/ss/MarianoBuilder and the license is MIT. I didn&#8217;t call it MarianoBuilder because of ego, but on purpose to make it clear that MarianoBuilder is just for me, it has my own preferences, my own settings, my own projects. What you should copy is the <em>procedure</em>. Copy the idea of using Metacello for something else than managing projects. Create your own ConfigurationOfYou and YourBuilder. Of course, you are very welcome to take a look to MarianoBuilder to get an idea of how to set certain preferences or settings. You are invited to take it as a base and fork it.</p>
<p>There are more things I would like to tell about this topic but the post is already too long so I will continue after&#8230;</p>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/metacello/'>Metacello</a>, <a href='http://marianopeck.wordpress.com/tag/presentation/'>presentation</a>, <a href='http://marianopeck.wordpress.com/tag/smalltalks/'>Smalltalks</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/1073/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/1073/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/1073/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1073&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2011/11/19/loading-projects-and-building-your-own-images-with-metacello/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>
	</item>
		<item>
		<title>My small talks at Smalltalks 2011</title>
		<link>http://marianopeck.wordpress.com/2011/11/16/my-small-talks-at-smalltalks-2011/</link>
		<comments>http://marianopeck.wordpress.com/2011/11/16/my-small-talks-at-smalltalks-2011/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 17:47:32 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Metacello]]></category>
		<category><![CDATA[Pharo]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[Smalltalks]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=1066</guid>
		<description><![CDATA[Smalltalks 2011 was, as usual, a very nice conference. I am glad I could attend even when living in France. This time I gave 2 talks as I mentioned in a previous post. The talk &#8220;Building your own Pharo images with Metacello&#8221; was good or at least that&#8217;s what I think. Of course, it was [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1066&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fast.org.ar/smalltalks2011/">Smalltalks 2011</a> was, as usual, a very nice conference. I am glad I could attend even when living in France. This time I gave 2 talks as I mentioned in a previous post.</p>
<p>The talk &#8220;Building your own Pharo images with Metacello&#8221; was good or at least that&#8217;s what I think. Of course, it was a talk that only makes sense for certain people or scenarios. Moreover, it was a &#8220;pre-requirement&#8221; to know Metacello which n is something not all people know. The talk was in the big auditorium and there were quite a lot of people. The only thing I regret from the presentation is that I forgot to say that the code was MIT and that everybody could take it and adapt it to their own needs. Nevertheless, I added a slide with this information to the final version of the slides (which will be published in the website).</p>
<p>You can find the slides <a href="http://rmod.lille.inria.fr/archives/talks/2011-Smalltalks-Peck-BuildingImagesMetacello.pdf">here</a> but notice that most of the presentation was a live demo. You will need to wait for the video if you want to see it <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />   (it was recorded so it should be online soon). I like the topic of this talk so I will try to do a special post about it in the future.</p>
<p>The second talk was the presentation of my paper: &#8220;Problems and Challenges when Building an Unused Object Manager for Pharo&#8221;. It was in the secondary room so there were a few people (no more than 20). Besides, the talk was in parallel with a nice talk of Hernán Wilkinson. I hope that I least I could explain more or less what I am trying to do for my PhD. The slides of the talk are <a href="http://rmod.lille.inria.fr/archives/talks/2011-Smalltalks-Peck-UOM.pdf">here</a>.</p>
<p>That&#8217;s all folks <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/metacello/'>Metacello</a>, <a href='http://marianopeck.wordpress.com/tag/pharo/'>Pharo</a>, <a href='http://marianopeck.wordpress.com/tag/presentation/'>presentation</a>, <a href='http://marianopeck.wordpress.com/tag/smalltalks/'>Smalltalks</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/1066/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1066&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2011/11/16/my-small-talks-at-smalltalks-2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Installing Jenkins CI and configuring Pharo build scripts</title>
		<link>http://marianopeck.wordpress.com/2011/11/11/installing-jenkins-ci-and-configuring-pharo-build-scripts/</link>
		<comments>http://marianopeck.wordpress.com/2011/11/11/installing-jenkins-ci-and-configuring-pharo-build-scripts/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 20:34:14 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Pharo]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=1008</guid>
		<description><![CDATA[A lot has been talked and discussed about CI in the last months. So I would like to share the experience I have gained while trying to do it myself locally in my Mac OS box. CI introduction and Pharo integration I guess most of you are aware of what Continuous Integration and CI server [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1008&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A lot has been talked and discussed about CI in the last months. So I would like to share the experience I have gained while trying to do it myself locally in my Mac OS box.</p>
<h2><span style="text-decoration:underline;">CI introduction and Pharo integration</span></h2>
<p>I guess most of you are aware of what Continuous Integration and CI server are. Basically are tools that help us to automatically build systems, run tests, make final binaries, run code critics, etc. One of the most popular ones is Jenkins (previously known as Hudson). We would like to have that for Smalltalk, but the problem is that most of them are targeted for a specific language, for example, for Java.</p>
<p>Fortunately for us, thanks to Yanni Chiu and Lukas Renggli, we have two things: 1) HudsonBuildTools: an integration between Jenkins and Pharo Smalltalk. 2) A builder.</p>
<p><span style="text-decoration:underline;">HudsonBuildTools</span>: You can check the package HudsonBuildTools in http://source.lukas-renggli.ch/hudson. Basically, the package is an adaptor between what Java expects and what Smalltalk generates. So from the Smalltalks results of running tests, this package generates the .xml files (probably the JUnit results) that Jenkins expects.  Not only for tests but also for Lint rules, test coverage, etc.</p>
<p><span style="text-decoration:underline;">Builder</span>: this is a set of bash files that help us all the process of building Pharo images from command line. Of course, we can then use this builder from Jenkins. The builder takes care of, for example, executing the VM and passing by argument the Smalltalk script to load what you want to load in the image. It also has some cache to improve its performance and some hooks to execute code after or before each build. It makes the integration with Jenkins extremely easy because at the end all you have to do is to create a myLoadScriptFile.st in the folder /scripts and that&#8217;s all.</p>
<h2><span style="text-decoration:underline;">Installing Jenkins</span></h2>
<p>This should be easy. You just go to the<a href="http://jenkins-ci.org/"> jenkins website</a> and you download the latest version for Mac OS. In my case it was <a href="http://mirrors.jenkins-ci.org/osx/latest">here</a>. After executing the .pkg you should have Jenkins installed in /Applications/Jenkins/. If you enter there, you will see only one file: jenkins.war. Where is Jenkins really then?  Well, that&#8217;s Jenkins &#8220;binary&#8221; (search in Google for more details about what a Java .war is). How do you start then Jenkins?  Well, it should be as easy as executing from a command line:</p>
<p><pre class="brush: bash;">
java -jar /Applications/Jenkins/jenkins.war
</pre></p>
<p>But of course, in my machine it didn&#8217;t start and throw an error saying the port 8009 was already in use&#8230;After googling a little bit, I found that I could change the port of the <em>AJP13</em> protocol. I finally ended up changing both ports AJP13 and HTTP port (because default is 8080 and can be in conflict with some other stuff I have running). For more details about it read <a href="https://wiki.jenkins-ci.org/display/JENKINS/Starting+and+Accessing+Jenkins">this link</a>. So finally I had to start Jenkins like this:</p>
<p><pre class="brush: bash;">
java -jar /Applications/Jenkins/jenkins.war --ajp13Port=8010 --httpPort=7777
</pre></p>
<p>With that, I could successfully start Jenkins and I could browse its UI in: http://localhost:7777/.</p>
<h2><span style="text-decoration:underline;">Installing the builder</span></h2>
<p>Nick Ager did a <a href="http://www.nickager.com/blog/continuous-integration-with-Jenkins-for-Smalltalk/">great post about Jenkins and Smalltalk</a>. And the <a href="https://github.com/renggli/builder/blob/master/README">builder&#8217;s README</a> is pretty clear. You should read both. I wont repeat all what they have already explained. I will just mention the problems I had and what I did to solve them.</p>
<p>1) The first problem I found is that build.sh expects that for Mac OSX:  PHARO_VM=&#8221;$VM_PATH/MacOS/Squeak VM Opt&#8221;. And VM_PATH=&#8221;$BASE_PATH/oneclick/Contents&#8221; (notice that &#8220;uname -s&#8221; MAC OSX will answer &#8220;Darwin&#8221;).  So&#8230; I needed to correctly set PHARO_VM to my VM. Hence,  after the &#8220;case &#8220;$(uname -s)&#8221; in&#8221; and before &#8220;# build configuration&#8221; I added the line:</p>
<p><pre class="brush: bash;">
PHARO_VM=&quot;/Users/mariano/Pharo/VM/CogMT5.app/Contents/MacOS/Croquet&quot;
</pre></p>
<p>So that way I am using that particular VM.</p>
<p>2) The second problem is that from Jenkins we will call the builder, so all those .sh has to be found in $PATH. What I did is to create the following startJenkins.sh:</p>
<p><pre class="brush: bash;">
#!/bin/bash

WARFILE=&quot;/Applications/Jenkins/jenkins.war&quot;
LOGFILE=jenkins.log

export PATH=&quot;$PATH:/Users/mariano/PhD/Jenkins/builder&quot;

java -jar $WARFILE --ajp13Port=8010 --httpPort=7777 &gt; $LOGFILE 2&gt;&amp;1 &amp;

java -jar /Applications/Jenkins/jenkins.war --ajp13Port=8010 --httpPort=7777
</pre></p>
<p>Notice that this is a simple script that I use *locally*. If you are running Jenkins in a server, you may probably want to use nohup or something like that.</p>
<h2><span style="text-decoration:underline;">Configuring Jenkins and the builder</span></h2>
<h3>More about the builder, tests and Jenkins</h3>
<p>There were some things which were not easy or were not working out of the box. Hence, I will share them wth you.  Just to clarify if it is not already clear. If you want that Jenkins run tests, then you need not only a .st that loads the test, but also the &#8220;buildtools&#8221; script, which downloads the HudsonBuildTools. So if you create a job and you want to run tests for it you have to put something like:</p>
<pre>build.sh -i Pharo-1.3 -o seaside3 -s seaside3
build.sh -i seaside3 -o seaside3-tests -s buildtools -s seaside3-tests</pre>
<p>As you can imagine, for each script you pass with &#8220;-s&#8221; you need a corresponding .st in /scripts. We are putting two lines (commands) to the &#8220;execution shell&#8221;. The first takes the Pharo-1.3 image as input, loads seaside with the seaside3.st and then saves the image as seaside3.image. The second line, takes that seaside3.image as input, loads HudsonBuildTools (using buildtools.st), and then loads seaside3 tests and run them. We can see that seaside-tests.st is something like:</p>
<pre>HDTestReport runPackages: ((WADevelopment allPackages
    select: [ :each | each name includesSubString: '-Tests-' ])
    collect: [ :each | each name ]).
HDLintReport runPackages: ((WADevelopment allPackages
    reject: [ :each | each name includesSubString: '-Tests-' ])
    collect: [ :each | each name ]).</pre>
<p>In this case of Seaside3, the tests are not loaded by seaside-tests.st since they are loaded in seaside3.st. But you can split this in your projects and only load tests in the second image.</p>
<p>Notice that you only need the &#8220;buildtools&#8221; it if you want to run tests, lint, test coverage, etc. If you just want to build images, then &#8220;buildtools&#8221; parameter is not needed. You can read the README file for more details.</p>
<h3>Non-Interactive UIManager</h3>
<p>In my case, I was building an image which opens a Transcript and for some reason it also asks for the author name (it is fixed now). Anyway, one of the problems I found is that since the builder is running the image headless, we should use a non-interactive UIManager. To do that I need to evaluate:  &#8220;UIManager default nonInteractiveManager&#8221;. What I did is to add such line in /scripts/before.st. That way, all my scripts will include it by default.</p>
<h3>Needed plugins</h3>
<p>As explained in the README, for both, tests and lint, you need a special Jenkins plugin. To install them you can go from the web interface to &#8220;manage Jenkins&#8221; -&gt; &#8220;manage plugins&#8221; or directly go to http://localhost:7777/pluginManager/. Then go to the tab &#8220;Available&#8221; and install those you need. Then restart Jenkins.</p>
<h3>Creating Jenkins users</h3>
<p>To create Jenkins users, you have to first enable security. <a href="https://wiki.jenkins-ci.org/display/JENKINS/Standard+Security+Setup">Here</a> you have a nice explanation of all the requires steps to be able to create users for Jenkins.</p>
<h3>Test Coverage</h3>
<p>If you want to run the test coverage you have to use the latest (VM.r2508 for example) <a href="www.mirandabanda.org/files/Cog/VM/">CogVM from Eliot Miranda</a>. TestCoverage uses a hook of the VM which is not working correctly in previous versions of the VM.</p>
<h2><span style="text-decoration:underline;">Conclusions</span></h2>
<p>All in all between 1 and 2 hours, I was able to have my Jenkins running locally and building my own images. I am not a bash expert and I haven&#8217;t installed Jenkins before, so you should be able to do it fast also. If you were thinking that configuring Jenkins to build and test your images was something complicated and only for &#8220;gurus&#8221; then you should re-think it and give it a try. In my experience it was really straightforward. Of course, to have a real/secure Jenkins running you may need to spend some time giving correct permissions to files, users, etc, etc, etc.</p>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/ci/'>CI</a>, <a href='http://marianopeck.wordpress.com/tag/jenkins/'>Jenkins</a>, <a href='http://marianopeck.wordpress.com/tag/pharo/'>Pharo</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/1008/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/1008/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/1008/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/1008/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/1008/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/1008/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/1008/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/1008/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/1008/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/1008/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/1008/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/1008/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/1008/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/1008/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1008&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2011/11/11/installing-jenkins-ci-and-configuring-pharo-build-scripts/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Migrating projects to SqueakSource3</title>
		<link>http://marianopeck.wordpress.com/2011/11/08/migrating-projects-to-squeaksource3/</link>
		<comments>http://marianopeck.wordpress.com/2011/11/08/migrating-projects-to-squeaksource3/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 23:28:56 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Metacello]]></category>
		<category><![CDATA[Monticello]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=1022</guid>
		<description><![CDATA[Hi guys. I am one of the guys who is always criticizing www.squeaksource.com because it is down all the time. And when it is not down it is loosing versions. So it is not fair that I continue doing so if there is a new already working solution out there: SqueakSource3 (http://ss3.gemstone.com/ss). During Smalltalks 2011 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1022&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hi guys. I am one of the guys who is always criticizing <a href="www.squeaksource.com">www.squeaksource.com</a> because it is down all the time. And when it is not down it is loosing versions. So it is not fair that I continue doing so if there is a new already working solution out there: SqueakSource3 (<a href="http://ss3.gemstone.com/ss">http://ss3.gemstone.com/ss</a>).</p>
<p>During <a href="http://www.fast.org.ar/smalltalks2011">Smalltalks 2011</a> I talked to <a href="gemstonesoup.wordpress.com">Dale Henrichs</a> who told me that SqueakSource3 was quite stable and has daily backups. SqueakSource3 is a new implementation of SqueakSource but based in <a href="http://www.seaside.st/">Seaside3</a>, <a href="http://www.lukas-renggli.ch/smalltalk/magritte">Magritte2</a>, etc. Even more (and this is very cool), it is deployed in a <a href="http://www.gemstone.com/">GemStone</a> server. Thanks a lot for GemStone for hosting such a service and to all the developers behind SS3.</p>
<p>So, I decided to give it a try. I have started to migrate all my projects or the projects I contribute and I thought I could share that with you.</p>
<h2><span style="text-decoration:underline;">Migrating projects to SqueakSource3</span></h2>
<p>There are two ways I found in order to migrate packages from one repository to another one. As an example, I will show you how I have migrated <a href="rmod.lille.inria.fr/web/pier/software/Fuel">Fuel</a> code from <a href="http://www.squeaksource.com/Fuel">http://www.squeaksource.com/Fuel</a> to <a href="http://ss3.gemstone.com/ss/Fuel">http://ss3.gemstone.com/ss/Fuel</a></p>
<h3><span style="text-decoration:underline;">Pre-optional step</span></h3>
<p>As explained later, you will need to fetch all versions of the packages you want to migrate. Downloading that from squeaksource can be quite slow and you may need a good internet connection. However, if you want to migrate a project you have been development, it is probable that some .mcz are still somewhere in your machine. What you can do is to copy all .mcz files of your machine to the package-cache so that you can get it from there and avoid the network traffic. To do that I often use this bash script:</p>
<p><pre class="brush: bash;">
#!/bin/bash

find /Users/mariano/ -name &quot;*.mcz&quot; -print0 | xargs -0 -I {} cp {} /Users/mariano/Pharo/YOUR-PACKAGE-CACHE/
</pre></p>
<h3><span style="text-decoration:underline;">Using Gofer #fetch and #push</span></h3>
<p>As you know, <a href="http://www.lukas-renggli.ch/blog/gofer">Gofer</a> is a nice scripting library for Monticello and it provides the methods #fetch (which downloads versions from remote repositories into the local cache) and #push (which uploads local versions from local cache into remote repositories). So the idea is that you can fetch the versions from the original repository and push in the new one. In the example of Fuel, I should do:</p>
<p><pre class="brush: ruby;">
Gofer it
squeaksource: 'Fuel';
package: 'Fuel';
package: 'FuelTests';
fetch.

Gofer it
url: 'http://ss3.gemstone.com/ss/Fuel';
package: 'Fuel';
package: 'FuelTests';
push.
</pre></p>
<p>Notice that such code could take a lot of time since EACH version of EACH package has to be fetched and pushed. So&#8230;let your machine, take a coffee and then come back. In this example, I only migrate two packages (&#8216;Fuel&#8217; and &#8216;FuelTests&#8217;) but there are much more packages in the Fuel repository. Having to write 20 lines of #package: can be a lot. So if you are a lazy guy like me, you can do the following hack:</p>
<p><pre class="brush: ruby;">
| packagesNames gofer |

packagesNames := (Gofer new
disablePackageCache;
squeaksource: 'Fuel';
allResolved)
collect: [ :each | each packageName ] as: Set.

gofer := Gofer it
squeaksource: 'Fuel'.

packagesNames do: [:each | gofer package: each].
gofer fetch.

gofer := Gofer it
url: 'http://ss3.gemstone.com/ss/Fuel'.

packagesNames do: [:each | gofer package: each].
gofer push.
</pre></p>
<p>That way you can fetch and push all packages. Of course, you can always get the list first, remove by hand the packages that you don&#8217;t want to migrate, and finally just migrate the ones you want.</p>
<h3><span style="text-decoration:underline;">Using Gofer and Metacello configurations</span></h3>
<p>Instead of manually choosing which packages to migrate, if you do have <a href="http://code.google.com/p/metacello/">Metacello</a> configurations, why not to directly use them? Dale has an <a href="http://gemstonesoup.wordpress.com/2011/09/12/transferring-packages-between-repositories-with-gofer-and-metacello/">excellent post explaining exactly how to do that</a>. Please read it if you are interested in such approach. Basically it consist of migrating only those packages of a Metacello version. Example:</p>
<p><pre class="brush: ruby;">
| gofer |
&quot;Identify the source repository&quot;
gofer := Gofer new squeaksource: 'Fuel';
package: 'ConfigurationOfFuel' yourself.
&quot;Traverse all packages defined in baseline '1.7-baseline' of the Fuel configuration&quot;
(ConfigurationOfFuel  project version:  '1.7-baseline') packages do:[:spec |
&quot;Use the #name and #package: messages and Gofer will fetch
all versions of the Monticello package&quot;
gofer package: spec name ].
&quot;Initiate the download with the #fetch command&quot;
gofer fetch.

&quot;Identify the target repository&quot;
gofer := Gofer new url: 'http://ss3.gemstone.com/ss/Fuel';
package: 'ConfigurationOfFuel' yourself.
&quot;Use the same algorithm for identifying the packages to be pushed&quot;
(ConfigurationOfFuel project version: '1.7-baseline') packages do:[:spec |
gofer package: spec name ].
&quot;Initiate the upload with the #push command&quot;
gofer push.
</pre></p>
<p>The only difference with the previous approach is that this way we automatically migrate the packages referenced from the configuration.</p>
<h2><span style="text-decoration:underline;">Problems I found</span></h2>
<p>Fetching and pushing take a long time, so be patient and try to be with a good internet connection. In my case, I have several errors which I have to deal with:</p>
<ul>
<li> Timeouts: If you get a &#8220;ConnectionTimedOut: Data receive timed out.&#8221; then it is clear there was a timeout with a certain package. What I did when I had this error is to open the debugger, go down in the stack a little while up to the place where I see it was doing the load of the version, and do a restart. Otherwise, you can always close the debugger and execute the code again, but this will take more time.</li>
<li>If you get the &#8220;Error: file is too short&#8221; then it means that there is some package (.mcz file) in your package-cache with zero bytes. Open the debugger, go down in the stack and identify which package/version has the problem. Then just go the package cache and remove such file. Then restart the migration procedure.</li>
</ul>
<p>So, that&#8217;s all. I hope I could make your migration easier <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/metacello/'>Metacello</a>, <a href='http://marianopeck.wordpress.com/tag/monticello/'>Monticello</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/1022/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/1022/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/1022/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/1022/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/1022/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/1022/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/1022/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/1022/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/1022/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/1022/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/1022/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/1022/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/1022/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/1022/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=1022&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2011/11/08/migrating-projects-to-squeaksource3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Memory Addresses and Immediate Objects</title>
		<link>http://marianopeck.wordpress.com/2011/10/26/memory-addresses-and-immediate-objects/</link>
		<comments>http://marianopeck.wordpress.com/2011/10/26/memory-addresses-and-immediate-objects/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 18:18:29 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[VM]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=961</guid>
		<description><![CDATA[Hi. After a couple of months talking about other stuff like Fuel, and presentations in conferences such as ESUG and Smalltalks, I would like now to continue with the &#8220;Journey through the Virtual Machine&#8221; for beginners. So far I have written the first and second part. Consider this post the first one of the third [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=961&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hi. After a couple of months talking about other stuff like <a href="rmod.lille.inria.fr/web/pier/software/Fuel">Fuel</a>, and presentations in conferences such as <a href="www.esug.org/">ESUG</a> and <a href="www.fast.org.ar/">Smalltalks</a>, I would like now to continue with the &#8220;Journey through the Virtual Machine&#8221; for beginners. So far I have written the <a title="The first part of the journey is over" href="http://marianopeck.wordpress.com/2011/04/28/the-first-part-of-the-journey-is-over/">first</a> and <a title="The second part of the journey is over" href="http://marianopeck.wordpress.com/2011/07/18/the-second-part-of-the-journey-is-over/">second</a> part. Consider this post the first one of the third part.</p>
<h2><span style="text-decoration:underline;">Direct pointers vs object tables</span></h2>
<p>Let&#8217;s say we have this code:</p>
<p><pre class="brush: ruby;">
| aPoint |
| aPoint := Point x: 10 y: 20.5.
</pre></p>
<p>In this case, <em>aPoint</em> has an instance variable that refers to an integer (10) and a float (20.5). How are these references implemented in the VM?</p>
<p>Most virtual machines have an important part whose responsibility is managing the memory, allocating objects, releasing, etc. In Squeak/Pharo VM, such part is called Object Memory. In addition, the Object Memory defines the internal representation of objects, its references, its location, its object header, etc.  Regarding the references implementation, there are two possibilities which are the most common: object tables and direct pointers.</p>
<p>With the first, there is a large table with two entries. When the object <em>aPoint</em> refers to the float <em>20.5</em>, it means that the instance variable &#8220;y&#8221; of <em>aPoint</em> has an index in the table where the memory address of the float <em>20.5</em> is located. With direct pointers, when <em>aPoint</em> refers to <em>20.5</em>, it means that the instance variable &#8220;y&#8221; of <em>aPoint</em> has directly the memory address of <em>20.5</em>.</p>
<p>There are pros and cons for each strategy but such discussion is out of range for this post. One of the nice things with object tables is that the primitive #become: is really fast since it is just updating one reference. With direct references, the #become: it needs to scan all the memory do detect all the objects that are pointing to a particular one. On the other hand, with object tables, we have to pay the cost of accessing an extra indirection and (I guess) this may impacts on the overall performance of the system. With direct pointers, we do not have that problem. Finally, object table uses more memory since the table itself needs memory. Few months ago there was a nice <a href="http://forum.world.st/Direct-object-pointers-vs-indirect-ones-pros-and-cons-td3039203.html">discussion in the mailing list about the prons and cons</a>.</p>
<p>First Smalltalk VMs used to have an object table, but now most current VMs (included the Squeak/Pharo VM) use direct pointers. The only current VM I am aware of that uses object tables is GemStone. But&#8230; they actually have one (virtual) Object Table (OT) per committed transaction!!  How they can do those optimizations and not blowup in terabytes of memory used by OTs? Well, that&#8217;s one of GemStone keys <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />   If you are interested in this topic, you can read <a href="http://forum.world.st/Documentation-about-Gemstone-internal-info-td3177330.html">this thread</a>.</p>
<h2><span style="text-decoration:underline;">Memory addresses</span></h2>
<p>In the previous paragraphs you learn that each memory address in the Squeak/Pharo VM represents a direct pointer to another object. Well, that&#8217;s <em>almost</em> correct. We are missing what it is usually known as &#8220;immediate objects&#8221;.  Immediate objects are those that are <em>directly</em> encoded in the memory address and do not require an object header nor slots so they consume less memory. In the CogVM there is only one type of immediate object, and it is SmallInteger. What does it mean?</p>
<p>In our example, the instance variable &#8220;x&#8221; of aPoint does not have a pointer to an instance of SmallInteger with the content 10. Instead, the memory address of &#8220;x&#8221; has directly encoded the value 10. So there is no instance of SmallInteger. But now, how the VM can known whether an instance variable is a pointer to another object or a SmallInteger? We need to tag a memory address to say &#8220;this is a object pointer&#8221; or &#8220;this is a SmallInteger&#8221;. To do that, the VM uses the last bit of the word (32 bits). If such bit is 1, then it is a signed 31-bits SmallInteger. If it is 0, it is a regular object pointer (oop).</p>
<p style="text-align:center;"><a href="http://marianopeck.files.wordpress.com/2011/10/memoryaddresses.png"><img class="aligncenter size-full wp-image-984" title="memoryAddresses" src="http://marianopeck.files.wordpress.com/2011/10/memoryaddresses.png?w=490" alt=""   /></a></p>
<p>Since I told you SmallInteger were encoded in 31 bits and they were signed, it follows that we have 30 bits for the number (one bit is for the sign). Hence, SmallInteger maxVal should be (2 raisedTo: 30) -1, that is, 1073741823. Analogy, SmallInteger minVal answers -1073741824. Number are encoded using the two&#8217;s complement. If you want to know more about this, read the <a href="forum.world.st/attachment/3804761/0/LittleNumbers.pdf">excellent chapter</a> that Stéphane Ducasse wrote about it.</p>
<p>Now, regarding object pointers, they always point to the memory address where the object header is. In our example, the instance variable &#8220;y&#8221; of <em>aPoint</em>, has the memory address of <em>20.5</em>&#8216;s object header.</p>
<p>As you can imagine, the VM needs to check all the time whether a OOP is really an OOP or an integer:</p>
<p><pre class="brush: ruby;">
ObjectMemory &gt;&gt; isIntegerObject: objectPointer

^ (objectPointer bitAnd: 1) &gt; 0
</pre></p>
<p>If you have an image with Cog loaded (as I explained in <a href="http://marianopeck.wordpress.com/tag/build/">all my posts about building the VM</a>), you can check for its senders&#8230;and you will find quite a lot <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Previously, I explain you why SmallInteger instances do not have object headers and those instances do not really exist as &#8220;objects&#8221;. That&#8217;s exactly why &#8220;SmallInteger instanceCount&#8221; answers zero. Each SmallInteger is encoded in different instance variables of different objects.</p>
<p>Another funny fact is why identity is always true with SmallIntegers. Say you have  &#8217;1&#8242; asNumber ==  (4-3), that answers true. Because at the end, the VM calls a regular C&#8217;s equality (=), which of course, for 2 equal numbers, it is always true. But of course, if those numbers are actually OOP (a number), if they are equal, then it means they both point to the same object:</p>
<p><pre class="brush: ruby;">
StackInterpreter &gt;&gt; bytecodePrimEquivalent

| rcvr arg |
rcvr := self internalStackValue: 1.
arg := self internalStackValue: 0.
self booleanCheat: rcvr = arg.
</pre></p>
<p>There are more things where you can notice that SmallInteger is special. In fact, you can browse the class and see some methods it overwrites, like #nextInstance (throwing an error), #shallowCopy, #sizeInMemory, etc. And of course, there are more problems like trying to do a become. For example, (42 become: Date new) throws an error saying it cannot become SmallIntegers.</p>
<h2><span style="text-decoration:underline;">More immediate objects?</span></h2>
<p>As said, in a word of 32 bits, we only use 1 bit for tagging immediate objects (SmallInteger in the case of the squeak VM). We could use more than 1 bit&#8230;but then it means we have fewer bits for the OOP, therefore, the maximum possible memory to address is smaller, because the amount of bits of the OOP limits us in how much memory we can address as maximum.</p>
<p>But&#8230;.what happens in a 64-bits VM?  I think 63 bits can be more than enough  for memory addresses. So what about using fewer bits for OOP and more for immediate objects?  Say we can use 58 for OOP and 6 for tagging immediate objects. In that example, we have (2 raisedTo: 6) &#8211; 1 , that is,  63 different possibilities!!!  So we can not only encode SmallIntegers but also small floats, true, false, nil, characters, etc&#8230; Is that all?  No! there are even more ideas. We can not only encode instances of certain class, but also give semantics to the possibility of tagging memory addresses. For example..we could use one of the combinations of tag bits to say that memory address is in fact a proxy. It doesn&#8217;t need to be an instance of Proxy, but we just give the semantics that when a memory address finishes with that tag bit, it means that the 58 bits for the OOP is not an OOP but a proxy contents. Such content can be a number representing an offset in a table, an address in secondary memory, etc&#8230; The VM could then do something different if the object is a proxy!</p>
<p>Well&#8230;all that I mention is not new at all. In fact, Gemstone does something very similar. They use 61 bits for address + 3 for tags. Here is a nice <a href="http://programminggems.wordpress.com/2010/02/05/scaling-objects-videos/">set of videos about Gemstone&#8217;s internals</a>.  And in <a href="http://www.youtube.com/watch?v=BAFUafgEwvw">this video</a> you can see what we are speaking here.</p>
<h2><span style="text-decoration:underline;">Documentation and future posts</span></h2>
<p>I always try to put some links together related to each post I talk about:</p>
<ul>
<li><a href="http://www.mirandabanda.org/bluebook/bluebook_chapter30.html#TheObjectTable30">Object Table explanation in the blue book</a></li>
<li><a href="http://dl.dropbox.com/u/2753738/About%20FFI.key.pdf">Slides</a> and <a href="http://www.youtube.com/watch?v=FJQmjhOvjUs&amp;list=PL843D1D545F9F52B6&amp;index=7">video</a> of &#8220;Journey In The VM&#8221;</li>
<li><a href="http://www.google.com/url?sa=t&amp;rct=j&amp;q=rowledge-final.pdf&amp;source=web&amp;cd=1&amp;ved=0CB0QFjAA&amp;url=http%3A%2F%2Fstephane.ducasse.free.fr%2FFreeBooks%2FCollectiveNBlueBook%2FRowledge-Final.pdf&amp;ei=Q4akTpeNBo2UOrim_a0C&amp;usg=AFQjCNEdIDltpP4zrSTxGGOaz8uhNg_7bA&amp;cad=rja">A Tour of the Squeak Object Engine</a></li>
</ul>
<p>In the next post, I will give details about the current Object Header.</p>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/vm/'>VM</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/961/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=961&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2011/10/26/memory-addresses-and-immediate-objects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>

		<media:content url="http://marianopeck.files.wordpress.com/2011/10/memoryaddresses.png" medium="image">
			<media:title type="html">memoryAddresses</media:title>
		</media:content>
	</item>
		<item>
		<title>Interview about Fuel for ClubSmalltalk</title>
		<link>http://marianopeck.wordpress.com/2011/10/23/interview-about-fuel-for-clubsmalltalk/</link>
		<comments>http://marianopeck.wordpress.com/2011/10/23/interview-about-fuel-for-clubsmalltalk/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 20:38:49 +0000</pubDate>
		<dc:creator>marianopeck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Fuel]]></category>
		<category><![CDATA[Interview]]></category>

		<guid isPermaLink="false">http://marianopeck.wordpress.com/?p=959</guid>
		<description><![CDATA[Hi guys. ClubSmalltalk is a very nice website which has a lot of information regarding Smalltalk. You can see interviews, posts, jobs offers, etc. There is also a mailing list in Spanish which has been the most active Smalltalk/Spanish mailing list in the last years. Anyway&#8230;.you can see it all by yourself in the website. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=959&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hi guys. <a href="http://www.clubsmalltalk.org">ClubSmalltalk</a> is a very nice website which has a lot of information regarding Smalltalk. You can see interviews, posts, jobs offers, etc. There is also a mailing list in Spanish which has been the most active Smalltalk/Spanish mailing list in the last years. Anyway&#8230;.you can see it all by yourself in the website.</p>
<p>Some time ago, they contacted me to do an interview, mainly because <a title="Fuel: First place at ESUG Innovation Technology Awards" href="http://marianopeck.wordpress.com/2011/09/01/fuel-first-place-at-esug-innovation-technology-awards/">Fuel won the ESUG Awards</a>. The interview also included some questions related to my PhD and what I am doing here in France. So&#8230; if you are interested in knowing why we have started Fuel, which was the most difficult part, what is a pickle format, etc, I really recommend you to take a look at it.</p>
<p>The interview is <a href="http://www.clubsmalltalk.org/web/index.php?option=com_content&amp;view=article&amp;id=243:mariano-martinez-peck-winner-of-the-2011-edition-of-the-esugs-innovation-technology-awards&amp;catid=48:interviews-to-the-new-generation-of-smalltalkers&amp;Itemid=108">here</a>.</p>
<p>See you</p>
<br /> Tagged: <a href='http://marianopeck.wordpress.com/tag/fuel/'>Fuel</a>, <a href='http://marianopeck.wordpress.com/tag/interview/'>Interview</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marianopeck.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marianopeck.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/marianopeck.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/marianopeck.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/marianopeck.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/marianopeck.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/marianopeck.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/marianopeck.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/marianopeck.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/marianopeck.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/marianopeck.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/marianopeck.wordpress.com/959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/marianopeck.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/marianopeck.wordpress.com/959/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marianopeck.wordpress.com&amp;blog=21654296&amp;post=959&amp;subd=marianopeck&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marianopeck.wordpress.com/2011/10/23/interview-about-fuel-for-clubsmalltalk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e98dbaf60648b9a0f7fa0683255b7074?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">marianopeck</media:title>
		</media:content>
	</item>
	</channel>
</rss>
