<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>Planet Squeak</title>
	<link>http://planet.squeak.org</link>
	<language>en</language>
	<description>Planet Squeak - http://planet.squeak.org</description>

<item>
	<title>Torsten Bergmann: A cave built in Smalltalk</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-5692535395557708255</guid>
	<link>http://astares.blogspot.com/2012/02/cave-built-in-smalltalk.html</link>
	<description>&lt;a href=&quot;http://vimeo.com/35907303&quot;&gt;Nice.&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-5692535395557708255?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 03 Feb 2012 12:17:04 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>LShift Ltd.: “Duck-finding” for testing your Theories</title>
	<guid>http://www.lshift.net/blog/?p=649</guid>
	<link>http://www.lshift.net/blog/2012/01/31/duck-finding-for-testing-your-theories</link>
	<description>&lt;p&gt;A while ago I wrote a semi-port of Haskell’s QuickCheck. Easy enough - a property is like a test method but with arity 1, into which you inject data - potential counterexamples to your theory. In Haskell, the type system can, through unification, figure out the type of the generator required for that property. What to do in a dynamic language?&lt;/p&gt;

&lt;p&gt;&lt;span id=&quot;more-649&quot;&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;There are a number of type inference techniques for dynamic languages - &lt;a href=&quot;http://matt.might.net/articles/implementation-of-kcfa-and-0cfa/&quot;&gt;k-CFA&lt;/a&gt;, &lt;a href=&quot;http://lexspoon.org/chuck/spoon-ecoop04.pdf&quot;&gt;demand-driven type inferencing with subgoal pruning&lt;/a&gt;, &lt;a href=&quot;http://decomp.ulb.ac.be/roelwuyts/smalltalk/roeltyper/&quot;&gt;RoelTyper&lt;/a&gt;. I’m going to use a very simple technique.&lt;/p&gt;

&lt;p&gt;First, some terminology. In Smalltalk, “protocol” usually means one of two things: either “what messages does this object understand?” or “does this object understand the Foo protocol?”, where Foo might be “Stream”, or “Collection”. We’re going to use the latter meaning. In particular, given a JUnit-like theory, we want an answer to the question “What objects - what instances of what classes - satisfy the protocol sent to the datum injected into this theory?”&lt;/p&gt;

&lt;p&gt;With a decompiler to hand, it’s easy enough to generate an AST of the theory over which we can walk: walk the &lt;code&gt;MessageNode&lt;/code&gt;s and look for things with a receiver &lt;code&gt;'t1'&lt;/code&gt; which will be the name given to the first temporary variable, i.e., the argument of the unary method. This won’t work for anything hidden through a &lt;code&gt;#perform:&lt;/code&gt; - think of this as the &lt;code&gt;eval&lt;/code&gt; of Smalltalk code.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    ParseNodeVisitor subclass: #SenderToArgCollector
    instanceVariableNames: 'selectors classSelectors'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'SqueakCheck-SUnit'

    visitMethodNode: aMethodNode
        classSelectors := Set new.
        selectors := Set new.
        ^ super visitMethodNode: aMethodNode.

    visitMessageNode: aMessageNode
        (aMessageNode receiver name = 't1')
            ifTrue: [selectors add: aMessageNode selector key].
        (aMessageNode receiver isMessageNode
            and: [aMessageNode receiver selector key = #class]
            and: [aMessageNode receiver receiver name = 't1'])
            ifTrue: [classSelectors add: aMessageNode selector key].
        ^ super visitMessageNode: aMessageNode.

    selectors
        ^ selectors.

    classSelectors
        ^ classSelectors.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and invoked by our &lt;code&gt;TheoryTyper&lt;/code&gt; (which could be called a &lt;code&gt;DuckFinder&lt;/code&gt;…)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    messagesSentToDatum: aUnaryCompiledMethod
    &quot;Answer a pair of Sets of all the message selectors sent by this method to its argument.
    The first Set contains messages sent to the argument, and the second contains messages
    sent to the argument's class.&quot;
    | collector |
    collector := SenderToArgCollector new
        visitMethodNode: (Decompiler new
            decompile: aUnaryCompiledMethod selector
            in: aUnaryCompiledMethod methodClass).

    ^ {collector selectors. collector classSelectors}.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let’s try out our new toy. To recap, we wish to write a theory and have the system automatically find the right types of things to test the theory. So let’s try the “monadic laws”:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    Object subclass: #TheoryTyper
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'SqueakCheck-SUnit'

    monadsObeyLeftIdentity: m

    self
        assert: (m class return: m value) &amp;gt;&amp;gt;= [:t | m class return: t]
        equals: ([:t | m class return: t] value: m value)

    monadsObeyRightIdentity: m

        self assert: m equals: (m &amp;gt;&amp;gt;= [:a | m class return: a])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And lo! our duck-finder says, with the &lt;code&gt;Maybe&lt;/code&gt; and &lt;code&gt;Either&lt;/code&gt; monads loaded:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    TheoryTyper new typeOfDatum: (MonadTheories &amp;gt;&amp;gt; #monadsObeyLeftIdentity:)
    &quot;=&amp;gt; a Set(Maybe Either)&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The keen-eyed will notice a law missing from the above - the associativity law for monads. Given monadic blocks &lt;code&gt;f&lt;/code&gt; and &lt;code&gt;g&lt;/code&gt; - that is, unary blocks that take some value and return a value wrapped up in whatever monad you’re using - we can express this law as&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    monadsObeyAssociativity: m
    | f g |

    self
        assert: ((m &amp;gt;&amp;gt;= f) &amp;gt;&amp;gt;= g)
        equals: (m &amp;gt;&amp;gt;= [:x | (f value: x) &amp;gt;&amp;gt;= g])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;but from where do we get &lt;code&gt;f&lt;/code&gt; and &lt;code&gt;g&lt;/code&gt;? Our naive duck-finding fails: we would need to extend our “type inference”. One possible (and fairly ugly) solution is to make &lt;code&gt;m&lt;/code&gt;’s class responsible through helpers: add &lt;code&gt;sampleBlockF&lt;/code&gt; and &lt;code&gt;sampleBlockG&lt;/code&gt; messages to the protocol and we could write:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    monadsObeyAssociativity: m
    | f g |

    f := m class sampleBlockF.
    g := m class sampleBlockG.
    self
        assert: ((m &amp;gt;&amp;gt;= f) &amp;gt;&amp;gt;= g)
        equals: (m &amp;gt;&amp;gt;= [:x | (f value: x) &amp;gt;&amp;gt;= g])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Also, typing &lt;code&gt;m&lt;/code&gt; is a bit harder than in the previous examples:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    TheoryTyper new typeOfDatum:
        (MonadTheories &amp;gt;&amp;gt; #monadsObeyAssociativity:)
    &quot;=&amp;gt; a Set(Either Nothing Maybe Left Right Just)&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;because all we have to work with is the send of &lt;code&gt;#&amp;gt;&amp;gt;=&lt;/code&gt;. Arguably it would be clearer to return &lt;code&gt;a Set(Either Maybe)&lt;/code&gt; because the other classes are subclasses of these two.&lt;/p&gt;

&lt;p&gt;However, despite the limitations of this technique, one can express theories in a nicely modular way. The monadic laws will simply run against &lt;em&gt;any&lt;/em&gt; monadic classes (that is, any classes that understand &lt;code&gt;#&amp;gt;&amp;gt;=&lt;/code&gt; on the instance side and &lt;code&gt;return:&lt;/code&gt; on the class side) present in the image.&lt;/p&gt;</description>
	<pubDate>Tue, 31 Jan 2012 12:44:53 +0000</pubDate>
	<dc:creator>Frank Shearar</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Smalltalk and Git</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-1121450740841992652</guid>
	<link>http://astares.blogspot.com/2012/01/smalltalk-and-git.html</link>
	<description>Want to use Git versioning system with Smalltalk code? Then &lt;a href=&quot;http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058722.html&quot;&gt;read more here&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-1121450740841992652?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 31 Jan 2012 06:29:15 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Pharo News Blog: Zodiac Alpha Release 2012-01-26</title>
	<guid>http://www.pharo-project.org/621ac901-78d1-4925-a01e-b45ecb38acd2</guid>
	<link>http://www.pharo-project.org/news?dialog=zodiac-alpha-release-2012-01-26</link>
	<description>&lt;div class=&quot;part text tall&quot;&gt;&lt;p class=&quot;norm&quot;&gt;Sven Van Caekenberghe announced an alpha release of Zodiac, an open-source, cross-smalltalk implementation of regular and secure socket streams. &lt;br /&gt;&lt;br /&gt;Features: &lt;br /&gt;  - ZnSecureSocketStream &lt;br /&gt; - HTTPS client access &lt;br /&gt; - HTTPS server (not on Mac OS X though) &lt;br /&gt; - ZdcSecureSMTPClient &lt;br /&gt; - ZdcSecurePOP3Client&lt;br /&gt;&lt;br /&gt;Read the announcement&lt;a class=&quot;open&quot; href=&quot;http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058498.html&quot; title=&quot;http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058498.html&quot;&gt; here.&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 29 Jan 2012 15:26:45 +0000</pubDate>
	<dc:creator>board (board@pharo-project.org)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Pharo sprint in Brussels</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-355665618004949117</guid>
	<link>http://astares.blogspot.com/2012/01/pharo-sprint-in-brussels.html</link>
	<description>There is a Pharo sprint in Brussels on Feb 4th. &lt;a href=&quot;http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058517.html&quot;&gt;Read more&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-355665618004949117?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 27 Jan 2012 16:28:02 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Pharo News Blog: Pharo Sprints in February</title>
	<guid>http://www.pharo-project.org/9c9d0434-45d4-4298-b2a8-dd655d034101</guid>
	<link>http://www.pharo-project.org/news?dialog=pharo-sprints-in-february</link>
	<description>&lt;div class=&quot;part text tall&quot;&gt;&lt;p class=&quot;norm&quot;&gt;There will be two sprints in February&lt;br /&gt;&lt;br /&gt;1) Brussels on Feb 4th: &lt;a class=&quot;open&quot; href=&quot;http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058517.html&quot; title=&quot;http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058517.html&quot;&gt;Link...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) Bern on Feb 18. (with moose dojo Feb 19): &lt;a class=&quot;open&quot; href=&quot;http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058344.html&quot; title=&quot;http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058344.html&quot;&gt;Link...&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 27 Jan 2012 14:35:35 +0000</pubDate>
	<dc:creator>board (board@pharo-project.org)</dc:creator>
</item>
<item>
	<title>Pharo News Blog: Moving debuggers between images with Fuel</title>
	<guid>http://www.pharo-project.org/b42b7978-ac95-4f04-9b47-c322cc1cbe95</guid>
	<link>http://www.pharo-project.org/news?dialog=moving-debuggers-between-images-with-fuel</link>
	<description>&lt;div class=&quot;part text tall&quot;&gt;&lt;p class=&quot;norm&quot;&gt;Mariano writes: ... and suddenly I thought: “What happens if I try to serialize a living debugger and materialize it in another image?” After 5 minutes, really, you will see it takes only 5 minutes, I notice that such crazy idea was working OUT OF THE BOX. &lt;br /&gt;&lt;br /&gt;&lt;a class=&quot;open&quot; href=&quot;http://marianopeck.wordpress.com/2012/01/19/moving-contexts-and-debuggers-between-images-with-fuel/&quot; title=&quot;http://marianopeck.wordpress.com/2012/01/19/moving-contexts-and-debuggers-between-images-with-fuel/&quot;&gt;read more...&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 23 Jan 2012 13:51:57 +0000</pubDate>
	<dc:creator>board (board@pharo-project.org)</dc:creator>
</item>
<item>
	<title>Squeak Oversight Board: Squeak Oversight Board minutes – 01/17/12</title>
	<guid>http://squeakboard.wordpress.com/?p=540</guid>
	<link>http://squeakboard.wordpress.com/2012/01/18/squeak-oversight-board-minutes-011712/</link>
	<description>&lt;p&gt;Squeak Oversight Board minutes – 01/17/12&lt;/p&gt;
&lt;p&gt;Attending: Chris Muller, Colin Putney, Levente Uzonyi, Chris Cunnington&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it was agreed that was nice to see Eliot exploring the SqueakCore image, as we hope this is a direction the community will take up&lt;/li&gt;
&lt;li&gt;a long conversation was had about how to distribute the next version of OmniBrowser, as existing tools don’t seem quite right&lt;/li&gt;
&lt;li&gt;a long Installer script could be written, but that meant every version would have its own, and managing them would be a nuisance&lt;/li&gt;
&lt;li&gt;Metacello was seen as good, but that it would be better if the metadata/dependency info could be accessible; so you could ask questions of the metadata&lt;/li&gt;
&lt;li&gt;the difference between the needs of users and developers was raised&lt;/li&gt;
&lt;li&gt;the next OmniBrowser will have around 30 packages to co-ordinate and likely more&lt;/li&gt;
&lt;li&gt;Colin’s working on a DSL and tool to manage the task for his own personal use: a tool that reads a spec and creates an Installer script&lt;/li&gt;
&lt;li&gt;Levente suggested a tool to read a Metacello configuration to make a spec to feed into Colin’s tool and then produce an Installer script&lt;/li&gt;
&lt;li&gt;it was mentioned that a build server factors into these problems and could assist the process&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/squeakboard.wordpress.com/540/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/squeakboard.wordpress.com/540/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/squeakboard.wordpress.com/540/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/squeakboard.wordpress.com/540/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/squeakboard.wordpress.com/540/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/squeakboard.wordpress.com/540/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/squeakboard.wordpress.com/540/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/squeakboard.wordpress.com/540/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/squeakboard.wordpress.com/540/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/squeakboard.wordpress.com/540/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/squeakboard.wordpress.com/540/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/squeakboard.wordpress.com/540/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/squeakboard.wordpress.com/540/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/squeakboard.wordpress.com/540/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=squeakboard.wordpress.com&amp;amp;blog=7042622&amp;amp;post=540&amp;amp;subd=squeakboard&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 18 Jan 2012 16:02:57 +0000</pubDate>
	<dc:creator>smalltalktelevision</dc:creator>
</item>
<item>
	<title>LShift Ltd.: Unifying parts of structures</title>
	<guid>http://www.lshift.net/blog/?p=644</guid>
	<link>http://www.lshift.net/blog/2012/01/16/unifying-parts-of-structures</link>
	<description>&lt;p&gt;Those with even a passing familiarity with &lt;a href=&quot;http://en.wikipedia.org/wiki/Prolog&quot;&gt;Prolog&lt;/a&gt; should recognise statements like &lt;code&gt;[H|T] = [1,2,3]&lt;/code&gt;. In particular, &lt;code&gt;=&lt;/code&gt; here is not “is equal to” but rather “unifies with”. So that statement causes the variable &lt;code&gt;H&lt;/code&gt; to unify with &lt;code&gt;1&lt;/code&gt;, and &lt;code&gt;T&lt;/code&gt; with the rest of the list, &lt;code&gt;[2, 3]&lt;/code&gt;.

&lt;/p&gt;&lt;p&gt;Clojure’s abstract bindings provide much the same capability - &lt;code&gt;(let [[h &amp;amp; t] ‘(1 2 3)] &amp;lt;do stuff&amp;gt;)&lt;/code&gt; - modulo the difference between pattern matching and unification, of course.&lt;/p&gt;

&lt;p&gt;There’s a subtlety in something like &lt;code&gt;[H|T] = [1,2,3]&lt;/code&gt;, at least, if your lists aren’t built of nested cons cells. Consider Smalltalk arrays. Suppose we have some &lt;code&gt;ListUnifier&lt;/code&gt; that will rip a &lt;code&gt;SequenceableCollection&lt;/code&gt;’s head off, like &lt;code&gt;#(1 2 3)&lt;/code&gt;. We’d like the tail to unify with &lt;code&gt;#(2 3)&lt;/code&gt; in other words. But that’s not a node in the original structure - it’s an entirely artificial node we wish to construct from the original collection. Firstly, how can we unify with only &lt;em&gt;part&lt;/em&gt; of a structure and, secondly, how can we determine a solution from that partition?&lt;/p&gt;

&lt;p&gt;&lt;span id=&quot;more-644&quot;&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Let’s try model the parts:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    DestructuringUnifier subclass: #ListUnifier
        instanceVariableNames: 'head tail'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Unification-Destructuring'.

    ListUnifier &amp;gt;&amp;gt; head: anObject tail: anotherObject
        head := anObject.
        tail := anotherObject.

    ListUnifier class &amp;gt;&amp;gt; headNamed: headSymbol tailNamed: tailSymbol
        ^ self new head: headSymbol asVariable tail: tailSymbol asVariable.

    &quot;Various helper constructors like #head:tailNamed:, #head:tail:, etc.
     elided for brevity.&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then we can write the original Prolog statement as&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    (ListUnifier headNamed: #x tailNamed: #y) =? #(1 2 3)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As mentioned above, first we want to be able to construct an equivalence relation on the above (or, expressed differently, partition the set of nodes in the structure together with the artificial nodes we create) such that &lt;code&gt;#x asVariable&lt;/code&gt; and &lt;code&gt;1&lt;/code&gt; are in the same class, and ditto for &lt;code&gt;#y asVariable&lt;/code&gt; and &lt;code&gt;#(2 3)&lt;/code&gt;.

&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    unificationClosureWith: anObject in: termRelation
        | h t partition |
        anObject isMetaVariable
            ifTrue: [^ termRelation union: self with: anObject].
        anObject isCollection
            ifFalse: [^ self failToUnifyWith: anObject].
        anObject isEmpty
            ifTrue: [^ self failToUnifyWith: anObject].

        h := head isCollection
            ifTrue: [anObject first: head size]
            ifFalse: [1].
        t := head isCollection
            ifTrue: [anObject allButFirst: head size]
            ifFalse: [anObject allButFirst].
        partition := head unificationClosureWith: h in: termRelation.
    ^ tail unificationClosureWith: t in: partition.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The mild complication around &lt;code&gt;head isCollection&lt;/code&gt; lets us support a head that is itself a collection. So let’s check that we can construct a partition using parts of things:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    | left right partition |
    left := (ListUnifier headNamed: #x tailNamed: #y).
    right := #(1 2 3).
    partition := VariableTrackingUnionFind
        usingArrayType: PersistentCollection
        partitioning: Dictionary new.
    partition := (partition find: left)
        unificationClosureWith: (partition find: right) in: partition.
    partition elementsOfClass: #x asVariable. &quot;=&amp;gt; {1 . (#Variable #x)}&quot;
    partition elementsOfClass: #y asVariable. &quot;=&amp;gt; {#(2 3) . (#Variable #y)}&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We see that the partition that originally would only hold nodes in the structures may now hold &lt;em&gt;parts&lt;/em&gt; of the original structure.&lt;/p&gt;

&lt;p&gt;The original algorithm for determining the most general unifier from some partition as described in &lt;a href=&quot;http://www.cs.bu.edu/~snyder/publications/UnifChapter.pdf&quot;&gt;Baader &amp;amp; Snyder (pp. 461-462)&lt;/a&gt; runs the solution finder starting from the left operand in the unification. Consider the partition we have above. What elements are in the equivalence class of &lt;code&gt;ListUnifier&lt;/code&gt;? Well, just the &lt;code&gt;ListUnifier&lt;/code&gt; itself! Clearly we need to adjust the solution finder a bit. The obvious approach would be to start the solution-finding from an element in each class, and merge the partial solutions:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    findSolutionFor: aVariableAvoidingUnionFind
    ^ aVariableAvoidingUnionFind
        inject: MostGeneralUnifier new
        into: [:mgu :node |
            mgu addAll: (self new
                findSolutionFor: aVariableAvoidingUnionFind
                starting: node)]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;where &lt;code&gt;#addAll:&lt;/code&gt; merges the various &lt;code&gt;MostGeneralUnifier&lt;/code&gt;s generated and &lt;code&gt;#inject:into:&lt;/code&gt; folds over the representative node in each equivalence class. (Remember, a union-find always has a representative for each equivalence class, namely, &lt;code&gt;myPartition find: someObject&lt;/code&gt;.) And it works, at the cost of turning a linear algorithm into a (worst case) quadratic one:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    | left right |
    left := (ListUnifier headNamed: #x tailNamed: #y).
    right := #(1 2 3).

    left =? right &quot;=&amp;gt; MostGeneralUnifier((#Variable #x)-&amp;gt;1 (#Variable #y)-&amp;gt;#(2 3) )&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But “finding a solution” really means “to what must we assign &lt;em&gt;each variable&lt;/em&gt;?”. So we can at least speed things up by only solution-finding in those classes in which variables occur:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    findSolutionFor2: aVariableAvoidingUnionFind
    ^ aVariableAvoidingUnionFind variableContainingClasses
        inject: MostGeneralUnifier new
        into: [:mgu :node |
            mgu addAll: (self new
                findSolutionFor: aVariableAvoidingUnionFind
                starting: node)]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This makes finding a solution O(NM), where N is the number of nodes in the structure, M the number of classes containing variables.&lt;/p&gt;</description>
	<pubDate>Mon, 16 Jan 2012 22:05:59 +0000</pubDate>
	<dc:creator>Frank Shearar</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: SqueakSource down</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-7907649614249663704</guid>
	<link>http://astares.blogspot.com/2012/01/squeaksource-down.html</link>
	<description>SqueakSource is often down, this time due to a network error.&lt;br /&gt;&lt;a href=&quot;http://dsal.cl/squeaksource/&quot;&gt;But there is help by using a mirror&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-7907649614249663704?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 16 Jan 2012 20:54:38 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: DrGeo running on Pharo running on iPad</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-4925343496983956319</guid>
	<link>http://astares.blogspot.com/2012/01/drgeo-running-on-pharo-running-on-ipad.html</link>
	<description>And &lt;a href=&quot;http://www.drgeo.eu/&quot;&gt;DrGeo&lt;/a&gt; is running on Pharo - and &lt;a href=&quot;http://pharo-project.org&quot;&gt;Pharo&lt;/a&gt; is running on iPad. The result is &lt;a href=&quot;http://www.dailymotion.com/video/xnp91c_drgeo-for-ipad-demo_school&quot;&gt;shown here&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-4925343496983956319?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 16 Jan 2012 14:51:16 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Scratch running on Pharo running on Android</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-4901613175425077608</guid>
	<link>http://astares.blogspot.com/2012/01/scratch-running-on-pharo-running-on.html</link>
	<description>So &lt;a href=&quot;http://scratch.mit.edu/&quot;&gt;Scratch&lt;/a&gt; is running on Pharo - and &lt;a href=&quot;http://pharo-project.org&quot;&gt;Pharo&lt;/a&gt; is running on Android. The result is &lt;a href=&quot;http://jimmyscratchlab.blogspot.com/2011/09/scratch-on-android.html&quot;&gt;shown here&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-4901613175425077608?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 16 Jan 2012 14:48:42 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Amber Smalltalk 0.9.1 is out!</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-4932673402123953962</guid>
	<link>http://astares.blogspot.com/2012/01/amber-smalltalk-091-is-out.html</link>
	<description>Read &lt;a href=&quot;http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058143.html&quot;&gt;more here&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-4932673402123953962?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 16 Jan 2012 14:40:59 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Significance of 1.1.1753</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-9176524578332985729</guid>
	<link>http://astares.blogspot.com/2012/01/significance-of-111753.html</link>
	<description>When working in IT you often have &quot;magic&quot; numbers or dates. Remember the year 2000 bug (Y2K)?&lt;br /&gt;&lt;br /&gt;One interesting date is &lt;a href=&quot;http://stackoverflow.com/questions/3310569/what-is-the-significance-of-1-1-1753-in-sql-server&quot;&gt;is 1.1.1753&lt;/a&gt; - which is a limit in SQL-Server. Interesting to know.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-9176524578332985729?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 16 Jan 2012 14:11:42 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Sean DeNigris: Squeak VM: Compiling for Xcode</title>
	<guid>http://seandenigris.com/blog/?p=945</guid>
	<link>http://seandenigris.com/blog/?p=945</link>
	<description>&lt;p&gt;When compiling the VM for Xcode, one has to switch back and forth from the image to the command line. To make things easier, here’s a little script that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;empties the build directory&lt;/li&gt;
&lt;li&gt;generates the sources and cmake info&lt;/li&gt;
&lt;li&gt;Configures with cmake&lt;/li&gt;
&lt;li&gt;Opens the project in Xcode&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;First, load PipeableOSProcess via:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;smalltalk&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;Gofer&lt;/span&gt; it
	squeaksource: &lt;span style=&quot;color: #7f0000;&quot;&gt;'MetacelloRepository'&lt;/span&gt;;
	squeaksource: &lt;span style=&quot;color: #7f0000;&quot;&gt;'CommandShell'&lt;/span&gt;;
	package: &lt;span style=&quot;color: #7f0000;&quot;&gt;'ConfigurationOfOSProcess'&lt;/span&gt;;
	package: &lt;span style=&quot;color: #7f0000;&quot;&gt;'CommandShell-Piping'&lt;/span&gt;;
	load.
&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;Smalltalk&lt;/span&gt; at: &lt;span style=&quot;color: #7f0000;&quot;&gt;#ConfigurationOfOSProcess&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; load.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then, execute this script (also available as &lt;a href=&quot;https://gist.github.com/1595669&quot;&gt;a gist&lt;/a&gt;) whenever you want a fresh Xcode project:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;smalltalk&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;PipeableOSProcess&lt;/span&gt; waitForCommand: &lt;span style=&quot;color: #7f0000;&quot;&gt;'/usr/bin/osascript -e &quot;tell application \&quot;Xcode\&quot; to quit&quot;'&lt;/span&gt;.
 
&lt;span style=&quot;color: #00007f;&quot;&gt;buildDir&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;FileDirectory&lt;/span&gt; on: &lt;span style=&quot;color: #7f0000;&quot;&gt;'/Developer/cogvm/cog/build/'&lt;/span&gt;.
&lt;span style=&quot;color: #00007f;&quot;&gt;buildDir&lt;/span&gt; entries do: &lt;span&gt;[&lt;/span&gt;:&lt;span style=&quot;color: #00007f;&quot;&gt;e&lt;/span&gt; | e name &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #7f0000;&quot;&gt;'vmVersionInfo.h'&lt;/span&gt; ifFalse: &lt;span&gt;[&lt;/span&gt; 
		&lt;span style=&quot;color: #00007f;&quot;&gt;e&lt;/span&gt; isDirectory
			ifTrue: &lt;span&gt;[&lt;/span&gt; &lt;span style=&quot;color: #00007f;&quot;&gt;e&lt;/span&gt; asFileDirectory recursiveDelete &lt;span&gt;]&lt;/span&gt;
			ifFalse: &lt;span&gt;[&lt;/span&gt; &lt;span style=&quot;color: #00007f;&quot;&gt;e&lt;/span&gt; delete &lt;span&gt;]&lt;/span&gt; &lt;span&gt;]&lt;/span&gt; &lt;span&gt;]&lt;/span&gt;.
 
&lt;span style=&quot;color: #0000ff;&quot;&gt;StackCocoaIOSConfig&lt;/span&gt; new
  addExternalPlugins: &lt;span style=&quot;color: #7f0000;&quot;&gt;#&lt;span&gt;(&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;FT2Plugin&lt;/span&gt; &lt;span&gt;)&lt;/span&gt;&lt;/span&gt;;
generateForDebug;
  generateSources; generate.
 
&lt;span style=&quot;color: #0000ff;&quot;&gt;PipeableOSProcess&lt;/span&gt; waitForCommand: &lt;span style=&quot;color: #7f0000;&quot;&gt;'cd /Developer/cogvm/cog/build/; /opt/local/bin/cmake -G Xcode'&lt;/span&gt;.
&lt;span style=&quot;color: #0000ff;&quot;&gt;PipeableOSProcess&lt;/span&gt; waitForCommand: &lt;span style=&quot;color: #7f0000;&quot;&gt;'open /Developer/cogvm/cog/build/StackVM.xcodeproj'&lt;/span&gt;.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;tweetthis&quot; style=&quot;text-align: left;&quot;&gt;&lt;p&gt; &lt;a class=&quot;tt&quot; href=&quot;http://twitter.com/intent/tweet?text=Squeak+VM%3A+Compiling+for+Xcode+http%3A%2F%2Fseandenigris.com%2Fblog%2F%3Fp%3D945&quot; title=&quot;Post to Twitter&quot;&gt;&lt;img alt=&quot;Post to Twitter&quot; class=&quot;nothumb&quot; src=&quot;http://seandenigris.com/blog/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png&quot; /&gt;&lt;/a&gt; &lt;a class=&quot;tt&quot; href=&quot;http://twitter.com/intent/tweet?text=Squeak+VM%3A+Compiling+for+Xcode+http%3A%2F%2Fseandenigris.com%2Fblog%2F%3Fp%3D945&quot; title=&quot;Post to Twitter&quot;&gt;Tweet This Post&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 11 Jan 2012 17:17:32 +0000</pubDate>
	<dc:creator>Sean DeNigris</dc:creator>
</item>
<item>
	<title>Sean DeNigris: Programming Language Rankings</title>
	<guid>http://seandenigris.com/blog/?p=911</guid>
	<link>http://seandenigris.com/blog/?p=911</link>
	<description>&lt;p&gt;The Tiobe index is total rubbish. But it’s worse than useless. It’s actually harmful. As Tyler Cowen mentioned in &lt;a href=&quot;http://www.ted.com/talks/tyler_cowen_be_suspicious_of_stories.html&quot;&gt;his TED Talk, “Be suspicious of stories”&lt;/a&gt;, feeling like you know what’s going on is way worse than admitting you don’t have a clue:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The most dangerous people are those that have been taught some financial literacy&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.timop.com/&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignleft&quot; height=&quot;218&quot; src=&quot;http://www.deviantart.com/download/119756278/Chicken_bones_1_by_tpenttil.jpg&quot; title=&quot;Chicken Bones&quot; width=&quot;327&quot; /&gt;&lt;/a&gt;Undoubtedly, there are people out there choosing careers and technologies based on the information age’s “divining by chicken bones”.  Tiobe is based on search engine hits for goodness sake. In the uber-democratic-everyone’s-a-technical-blogger web, of what is “talking about a language” a good indicator? Here is a primary one: that the language and its tools are not sufficient to support development. In other words, the Niobe Index (i.e. search engine results) is inversely proportional to language quality, as seen below:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone&quot; height=&quot;41&quot; src=&quot;http://latex.codecogs.com/gif.latex?I_{n} \approx \frac{1}{Q_{l}}&quot; title=&quot;I_{n} \approx \frac{1}{Q_{l}}&quot; width=&quot;62&quot; /&gt;&lt;br /&gt;
Since the equation above is obviously scientific (because it seems “mathy” and nerdy), it must be true. Furthermore (another great smart-people word), if one believes in (yes, like Santa Claus) the Niobe index (which can only be believed because it superficially seems scientific), one must believe my equation, which creates a paradox (another great science-y term).&lt;/p&gt;
&lt;p&gt;In a live, open, dynamic environment (like Smalltalk*), the programmer has at their fingertips most of the things they would otherwise be force to search the internet for, which is &lt;a href=&quot;http://astares.blogspot.com/2006/07/stupid-metrics.html&quot;&gt;succinctly described by Torsten Bergmann&lt;/a&gt;. Also, working in a low level language, like C++ (e.g. manual memory management), guarantees search engine love. &lt;a href=&quot;http://seandenigris.com/blog/?p=31&quot;&gt;I used to need a Safari Books membership&lt;/a&gt; just to make sure I didn’t shoot myself in the foot.&lt;/p&gt;
&lt;p&gt;Further reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.timbunce.org/2008/04/12/tiobe-or-not-tiobe-lies-damned-lies-and-statistics/&quot;&gt;TIOBE or not TIOBE – “Lies, damned lies, and statistics”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.timbunce.org/2009/05/17/tiobe-index-is-being-gamed/&quot;&gt;TIOBE Index is being gamed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;* I am not pushing Smalltalk. In fact, I can’t wait until someone invents something better (hint, cough; &lt;a href=&quot;http://vpri.org/&quot;&gt;VPRI&lt;/a&gt;).&lt;/p&gt;
&lt;div class=&quot;tweetthis&quot; style=&quot;text-align: left;&quot;&gt;&lt;p&gt; &lt;a class=&quot;tt&quot; href=&quot;http://twitter.com/intent/tweet?text=Programming+Language+Rankings+http%3A%2F%2Fseandenigris.com%2Fblog%2F%3Fp%3D911&quot; title=&quot;Post to Twitter&quot;&gt;&lt;img alt=&quot;Post to Twitter&quot; class=&quot;nothumb&quot; src=&quot;http://seandenigris.com/blog/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png&quot; /&gt;&lt;/a&gt; &lt;a class=&quot;tt&quot; href=&quot;http://twitter.com/intent/tweet?text=Programming+Language+Rankings+http%3A%2F%2Fseandenigris.com%2Fblog%2F%3Fp%3D911&quot; title=&quot;Post to Twitter&quot;&gt;Tweet This Post&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 10 Jan 2012 18:31:58 +0000</pubDate>
	<dc:creator>Sean DeNigris</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Smalltalk/X tour</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-1404432276955139418</guid>
	<link>http://astares.blogspot.com/2012/01/smalltalkx-tour.html</link>
	<description>There is now a &quot;Guided tour on Smalltalk/X (Part 2) video &lt;a href=&quot;http://www.youtube.com/watch?v=5JWZfwm0wNU&quot;&gt;available&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-1404432276955139418?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 10 Jan 2012 14:59:43 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>The Weekly Squeak: Finding More News About Squeak</title>
	<guid>http://news.squeak.org/?p=986</guid>
	<link>http://news.squeak.org/2012/01/09/finding-more-news-about-squeak/</link>
	<description>&lt;p&gt;&lt;a href=&quot;https://plus.google.com/115950529692424242526/posts&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-medium wp-image-987&quot; height=&quot;110&quot; src=&quot;http://weeklysqueak.files.wordpress.com/2012/01/squeakg.jpg?w=300&amp;amp;h=110&quot; title=&quot;SqueakG+&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Need more news?  If waiting for a blog post is not your thing, join the Google + Group.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/115950529692424242526/posts&quot;&gt;https://plus.google.com/115950529692424242526/posts&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weeklysqueak.wordpress.com/986/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/weeklysqueak.wordpress.com/986/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weeklysqueak.wordpress.com/986/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/weeklysqueak.wordpress.com/986/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/weeklysqueak.wordpress.com/986/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/weeklysqueak.wordpress.com/986/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/weeklysqueak.wordpress.com/986/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/weeklysqueak.wordpress.com/986/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weeklysqueak.wordpress.com/986/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/weeklysqueak.wordpress.com/986/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weeklysqueak.wordpress.com/986/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/weeklysqueak.wordpress.com/986/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weeklysqueak.wordpress.com/986/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/weeklysqueak.wordpress.com/986/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=news.squeak.org&amp;amp;blog=394922&amp;amp;post=986&amp;amp;subd=weeklysqueak&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 09 Jan 2012 16:35:40 +0000</pubDate>
	<dc:creator>Ron Teitelbaum</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Who needs the JVM - Tomcat on Smalltalk/X</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-8929639023924900978</guid>
	<link>http://astares.blogspot.com/2012/01/who-needs-jvm-tomcat-on-smalltalkx.html</link>
	<description>The software engineering group from the czech university in Prague is &lt;a href=&quot;https://swing.fit.cvut.cz/news/libjava_tomcat&quot;&gt;running Tomcat on Smalltalk/X&lt;/a&gt;. So who needs the JVM? ;)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-8929639023924900978?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 08 Jan 2012 18:50:15 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Impress.js</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-6689336688349622999</guid>
	<link>http://astares.blogspot.com/2012/01/impressjs.html</link>
	<description>Somehow I like small JavaScripts for effects like &lt;a href=&quot;http://bartaz.github.com/impress.js/&quot;&gt;these&lt;/a&gt;. code is &lt;a href=&quot;https://github.com/bartaz/impress.js&quot;&gt;here&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-6689336688349622999?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 04 Jan 2012 12:44:43 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Squeak Oversight Board: SOB Minutes – 3 Jan.</title>
	<guid>http://squeakboard.wordpress.com/?p=537</guid>
	<link>http://squeakboard.wordpress.com/2012/01/03/sob-minutes-3-jan/</link>
	<description>&lt;p&gt;- The bulk of the meeting addressed a sudden change to DNS that has shut down our mailing lists&lt;/p&gt;
&lt;p&gt;- The problem resulted from the domain squeakfoundation.org which made a change to its DNS configuration 2 Jan.&lt;/p&gt;
&lt;p&gt;- After the problem is solved, the SOB is resolved to switch over to squeak.org and make squeakfoundation.org redundant to needs&lt;/p&gt;
&lt;p&gt;- The relationship with the Software Freedom Conservancy was discussed in terms of who is a signatory for the Board. It seems the SFC is the signatory and not SOB memebers&lt;/p&gt;
&lt;p&gt;- an important bug fix by Colin Putney will be incorporated into the release of Squeak 4.3&lt;/p&gt;
&lt;p&gt;- Some final tasks related to the release of Squeak 4.3 were discussed: the creation of an All-In-One release; uploading a zipped version of that and a zipped SqueakCore image to http://ftp.squeak.org /4.3; and then linking from the homepage of squeak.org to that All-In-One app&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/squeakboard.wordpress.com/537/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/squeakboard.wordpress.com/537/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/squeakboard.wordpress.com/537/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/squeakboard.wordpress.com/537/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/squeakboard.wordpress.com/537/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/squeakboard.wordpress.com/537/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/squeakboard.wordpress.com/537/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/squeakboard.wordpress.com/537/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/squeakboard.wordpress.com/537/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/squeakboard.wordpress.com/537/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/squeakboard.wordpress.com/537/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/squeakboard.wordpress.com/537/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/squeakboard.wordpress.com/537/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/squeakboard.wordpress.com/537/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=squeakboard.wordpress.com&amp;amp;blog=7042622&amp;amp;post=537&amp;amp;subd=squeakboard&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 03 Jan 2012 18:11:36 +0000</pubDate>
	<dc:creator>smalltalktelevision</dc:creator>
</item>
<item>
	<title>LShift Ltd.: Translating a persistent union-find from ML to Smalltalk</title>
	<guid>http://www.lshift.net/blog/?p=641</guid>
	<link>http://www.lshift.net/blog/2011/12/31/translating-a-persistent-union-find-from-ml-to-smalltalk</link>
	<description>&lt;p&gt;When I wrote my &lt;a href=&quot;http://www.squeaksource.com/Nutcracker/&quot;&gt;unification library&lt;/a&gt; a while back, I tried to add an “or matcher”. That is, something that would allow 

&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    | matcher mgu |
    matcher := OrUnifier
        left: (TreeNode left: #x asVariable)
        right: (TreeNode right: #x asVariable).

    mgu := matcher =? (TreeNode left: (Leaf value: 1)).
    mgu at: (#x asVariable) &quot;=&amp;gt; (Leaf value: 1)&quot;.

    mgu := matcher =? (TreeNode right: (Leaf value: 1)).
    mgu at: (#x asVariable) &quot;=&amp;gt; (Leaf value: 1)&quot;.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Easy enough… until one tries to use an OrUnifier as an operand on the right hand side. See, as the unification progresses, if the first option fails, you’d like to backtrack part of the equivalence relation calculation, and with the imperative union-find in Nutcracker that’s not possible. What to do, what to do?&lt;/p&gt;

&lt;p&gt;&lt;span id=&quot;more-641&quot;&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;The standard solution is to reach into one’s toolbox of functional data structures. Sadly, noone knows (as far as I can see, at least) how to implement a functional union-find. At least, not an efficient one. However, &lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.79.8494&quot;&gt;Conchon and Filliâtre&lt;/a&gt; tell us how to implement a persistent union-find.&lt;/p&gt;

&lt;p&gt;The implementation - originally in ML - uses a persistent array to get its rollbackability. Further, it uses “rerooting”, a trick Henry Baker &lt;a href=&quot;http://www.pipeline.com/~hbaker1/ShallowBinding.html&quot;&gt;wrote up&lt;/a&gt;, to improve efficiency. I couldn’t improve on the pictures Conchon and Filliâtre use to illustrate rerooting, so I won’t try, and just &lt;a href=&quot;http://research.microsoft.com/~crusso/ml2007/slides/puf-wml07-slides.pdf&quot;&gt;point you to their artwork&lt;/a&gt;, pp. 18-27. The structure makes massive use of side effects, but presents an apparently purely function API. First, the basic data structure:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    type 'a t = 'a data ref
    and 'a data =
        | Arr of 'a array
        | Diff of int * 'a * 'a t
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note the &lt;code&gt;ref&lt;/code&gt; there - it’s an updatable reference to something. Since everything’s mutable by default in Smaltalk, I tried ignoring the &lt;code&gt;ref&lt;/code&gt; and just translate things. However, I quickly ran into difficulties. The “massive use of (hidden) side effects” quickly bit me (see section 4 of the paper), as I attempted to translate the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    let set t i v = match !t with
        | Arr a as n -&amp;gt;
            let old = a.(i) in
            a.(i) &amp;lt;- v
            let res = ref n in
            t := Diff (i, old, res);
            res
        | Diff _ -&amp;gt;
            ref (Diff (i, v, t))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It all looks quite simple. But look at &lt;code&gt;t := Diff (i, old, res)&lt;/code&gt;. Ignoring it at first, the obvious translation would be (ignoring noise like class declarations):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    Diff &amp;gt;&amp;gt; set: index to: anObject
        ^ Diff index: index value: v in: self

    Arr &amp;gt;&amp;gt; set: index to: anObject
        | old res ref |
        old := a at: i.
        a at: i put: v.
        res := self.
        self become: (Diff index: i value: v in: self)
        ^ self.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Did you feel a shiver there? &lt;code&gt;#become:&lt;/code&gt; is deep Smalltalk magic. Its operation is simple enough: it swaps two object pointers. Here, we will &lt;em&gt;change self to a new object&lt;/em&gt;. Oh, did I say “swap two object pointers”? I meant to say “swap two object pointers throughout the entire image”. Deep, dangerous magic indeed. And I thought, as I tried to figure out what was going on, that there had to be an easier way. What if I modelled the &lt;code&gt;ref&lt;/code&gt; itself?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    Object subclass: #Ref
        instanceVariableNames: 'value'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'PersistentUnionFind'.

    Ref class &amp;gt;&amp;gt; wrapping: anObject
        ^ self new wrapping: anObject.

    Ref &amp;gt;&amp;gt; value
        ^ value.

    Ref &amp;gt;&amp;gt; value: anObject
        value := anObject.

    Ref &amp;gt;&amp;gt; wrapping: anObject
        value := anObject.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you can have an immutable reference to something that, itself, may change to what it points. (Yes, that sounds a lot like “well done, you’ve invented a pointer!”) With that in hand, let’s hide the gory bits - &lt;code&gt;Arr&lt;/code&gt; and &lt;code&gt;Diff&lt;/code&gt; - behind a nice clean &lt;code&gt;PersistentCollection&lt;/code&gt; interface:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    Ref subclass: #PersistentCollection
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: 'PersistentUnionFind'.

    PersistentCollection &amp;gt;&amp;gt; at: index put: anObject
        t := value. &quot;The equivalent of !t&quot;
        ^ t isDiff
            ifTrue: [Diff index: i value: anObject in: self]
            ifFalse: [ | old |
            old := t array at: index.
            t array at: index put: anObject.
                self value: (Diff index: i value: old in: self)]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which doesn’t look too bad, in comparison to the original!&lt;/p&gt;

&lt;p&gt;The code’s published at &lt;a href=&quot;http://www.squeaksource.com/Nutcracker/&quot;&gt;SqueakSource&lt;/a&gt;, in the PersistentUnionFind package:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    Installer ss
      project: 'Nutcracker';
      install: 'PersistentUnionFind'.
&lt;/code&gt;&lt;/pre&gt;</description>
	<pubDate>Sat, 31 Dec 2011 23:24:35 +0000</pubDate>
	<dc:creator>Frank Shearar</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: A Mentoring Course on Smalltalk</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-2140513866338709627</guid>
	<link>http://astares.blogspot.com/2011/12/mentoring-course-on-smalltalk.html</link>
	<description>The book &quot;A Mentoring Course on Smalltalk&quot; is available &lt;a href=&quot;http://www.lulu.com/product/ebook/a-mentoring-course-on-smalltalk-%28pdf%29/18783337&quot;&gt;on Lulu&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-2140513866338709627?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 30 Dec 2011 07:47:23 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Scripy</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-708661632064611614</guid>
	<link>http://astares.blogspot.com/2011/12/scripy.html</link>
	<description>Scripy - a way to share Workspace scripts with others right from within you Smalltalk image. Read more at &lt;a href=&quot;http://www.scripy.org&quot;&gt;http://www.scripy.org&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-708661632064611614?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 29 Dec 2011 08:50:22 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Randal Schwartz: Squeak 4.3 released / SOB minutes — 23 Dec. « The Squeak Oversight Board Blog</title>
	<guid>http://methodsandmessages.posterous.com/squeak-43-released-sob-minutes-23-dec-the-squ</guid>
	<link>http://methodsandmessages.posterous.com/squeak-43-released-sob-minutes-23-dec-the-squ</link>
	<description>&lt;p&gt;
	&lt;/p&gt;&lt;div class=&quot;posterous_bookmarklet_entry&quot;&gt;
      &lt;blockquote class=&quot;posterous_long_quote&quot;&gt;&lt;p&gt;Welcome to the release of Squeak 4.3.&lt;/p&gt;
&lt;p&gt;There aren’t any applications bundled with this release. Instead of working on applications to bundle with the image, core developers have been inspired by the Cog virtual machine to look deeply into the image for things they wanted to change. As a result, the image is becoming smaller, tidier, and nimbler.&lt;/p&gt;&lt;/blockquote&gt;

&lt;div class=&quot;posterous_quote_citation&quot;&gt;via &lt;a href=&quot;http://squeakboard.wordpress.com/2011/12/25/squeak-4-3-released-sob-minutes-23-dec/&quot;&gt;squeakboard.wordpress.com&lt;/a&gt;&lt;/div&gt;
    &lt;p&gt;&lt;/p&gt;&lt;/div&gt;
	
&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://methodsandmessages.posterous.com/squeak-43-released-sob-minutes-23-dec-the-squ&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://methodsandmessages.posterous.com/squeak-43-released-sob-minutes-23-dec-the-squ#comment&quot;&gt;Leave a comment  »&lt;/a&gt;

&lt;/p&gt;</description>
	<pubDate>Tue, 27 Dec 2011 17:04:00 +0000</pubDate>
</item>
<item>
	<title>Torsten Bergmann: JavaFX and SWT</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-415671794575256146</guid>
	<link>http://astares.blogspot.com/2011/12/javafx-and-swt.html</link>
	<description>Cool: &lt;a href=&quot;http://fxexperience.com/2011/12/swt-interop/&quot;&gt;JavaFX integration with SWT&lt;/a&gt;. Something new to play with over the weekend!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-415671794575256146?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 27 Dec 2011 12:13:15 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Phoseydon Beta released</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-2501070799336682280</guid>
	<link>http://astares.blogspot.com/2011/12/phoseydon-beta-released.html</link>
	<description>&lt;a href=&quot;http://dbxtalk.smallworks.com.ar/pier/news/2011-12-26&quot;&gt;Phoseydon&lt;/a&gt; - a tool aimed to model and create applications easily in Smalltalk, as Ruby does with Rails or python with Django. You describe a model, and from that model a relational database plus an object model plus an ORM mapping are fed from that model.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-2501070799336682280?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 27 Dec 2011 07:40:06 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Squeak 4.3.</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-3676038512117151250</guid>
	<link>http://astares.blogspot.com/2011/12/squeak-43.html</link>
	<description>Squeak 4.3. &lt;a href=&quot;http://squeakboard.wordpress.com/2011/12/25/squeak-4-3-released-sob-minutes-23-dec/&quot;&gt;is available&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-3676038512117151250?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 27 Dec 2011 07:27:55 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Torsten Bergmann: Teleplace gone</title>
	<guid>tag:blogger.com,1999:blog-9604963.post-4237060278218135173</guid>
	<link>http://astares.blogspot.com/2011/12/teleplace-gone.html</link>
	<description>The company Teleplace is gone, the software (written in Squeak Smalltalk) &lt;a href=&quot;http://www.hypergridbusiness.com/2011/12/teleplace-gone-3d-icc-steps-in-to-help-customers/&quot;&gt;is still available and continues to live&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9604963-4237060278218135173?l=astares.blogspot.com&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 27 Dec 2011 07:27:09 +0000</pubDate>
	<dc:creator>Torsten (noreply@blogger.com)</dc:creator>
</item>
<item>
	<title>Ben Coman: Windows 7 Pharo DBXTalk – “my hack”</title>
	<guid>http://blog.openinworld.com/?p=164</guid>
	<link>http://blog.openinworld.com/2011/12/windows-7-pharo-dbxtalk-my-hack/</link>
	<description>&lt;p&gt;Having just got &lt;a href=&quot;http://blog.openinworld.com/2011/12/pharo-odbc-working-on-windows-7/&quot;&gt;ConfigurationOfODBC working from Pharo Smalltalk&lt;/a&gt;, I had some trouble determining exactly how to get at the individual data items.  So I thought I’d check out DBXTalk for comparison.  DBXTalk is a lot more comprehensive solution leaveraging OpenDBX which includes its own ODBC interface along with several other backends.  However all the ODBC connection examples I saw were for database servers with connection strings that were not of the “DSN” form that I think is required for Microsoft Access – so I ended up returning to ConfigurationOfODBC and resolving the issue above.&lt;/p&gt;
&lt;p&gt;Yet I was most of the way through getting DBXTalk working, so I record my experience here for posterity.  It is the “hack” version since to resolve library dependencies I simply copied everything next to virtual machine executable.  I’ll look into resolving these more correctly later.  So I…&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Created a new folder Pharo-1.3-13315-cog2522-dbxtalk and into it:&lt;br /&gt;
a. Extracted the 	“Contents” folder only from Pharo-1.3-13315-OneClick.zip&lt;br /&gt;
b. Extracted all 	files from cogwin_r2522.zip&lt;br /&gt;
c. Updated croquet.ini file with: ImageFile=Contents\Resources\pharo.image&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;Ran croquet.exe and then:&lt;br /&gt;
World Menu &amp;gt; Monticello Browser.&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;From the Monticello Browser opened:&lt;a href=&quot;http://www.squeaksource.com/MetacelloRepository&quot;&gt;
&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;http://www.squeaksource.com/MetacelloRepository&quot;&gt;http://www.squeaksource.com/MetacelloRepository&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and loaded:&lt;br /&gt;
ConfigurationOfOpenDBXDriver-GuillermoPolito.13&lt;br /&gt;
.&lt;br /&gt;
then from a Workspace executed:&lt;br /&gt;
(ConfigurationOfOpenDBXDriver project version: 	#’stable’) load.&lt;br /&gt;
.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;From a Workspace found the required OpenDBX library to be 1.4.4 by executing:&lt;br /&gt;
OpenDBX currentOpenDBXVersion&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;Extracted all nine files from &lt;a href=&quot;http://linuxnetworks.de/opendbx/download/opendbx-1.4.4_win32.zip&quot;&gt;http://linuxnetworks.de/opendbx/download/opendbx-1.4.4_win32.zip&lt;/a&gt; into folder Pharo-1.3-13315-cog2522-dbxtalk&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;From a DBXTalk developer I asked which version of PostgreSQL to try, and the prompt response came back as 8.3. I installed the current version at this time (postgresql-8.3.17-1-windows.exe) choosing all the defaults.&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;Now possibly step 3 is made redundant by the following, but this post is a record of what I actually did.&lt;br /&gt;
.&lt;br /&gt;
In Monticello Browser I opened 	repository:&lt;br /&gt;
&lt;a href=&quot;http://www.squeaksource.com/DBXTalk&quot;&gt;http://www.squeaksource.com/DBXTalk&lt;/a&gt;&lt;br /&gt;
.&lt;br /&gt;
then loaded:&lt;br /&gt;
ConfigurationOfGlorpDBX-GuillermoPolito.70&lt;br /&gt;
.&lt;br /&gt;
then in a Workspace I executed:&lt;br /&gt;
(ConfigurationOfGlorpDBX project version: #’stable’) load.&lt;br /&gt;
.&lt;br /&gt;
which 	left the following message in Transcript &lt;p&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IMPORTANT FOR GLORP AND OpenDBXDriver DRIVER&lt;br /&gt;
In order to run sucessfully Glorp tests you should need to change the database connection settings used by them. To do this, change the following methods:&lt;br /&gt;
-GlorpDatabaseLoginResource&amp;gt;&amp;gt;defaultPostgreSQLInternetLogin&lt;br /&gt;
-GlorpDatabaseLoginResource&amp;gt;&amp;gt;defaultPostgreSQLLocalLogin&lt;br /&gt;
-GlorpDatabaseLoginResource&amp;gt;&amp;gt;defaultPostgreSQLLoginForGlorpStore &lt;p&gt;&lt;/p&gt;
&lt;p&gt;After doing this all Glorps tests must be green.&lt;/p&gt;
&lt;p&gt;Evaluated -&amp;gt; GlorpOpenDBXDriver &amp;gt;&amp;gt; postLoadGlorpDriverDBXTalkPharo&lt;/p&gt;
&lt;p&gt;…finished 2.4&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Looking at GlorpDatabaseLoginResource&amp;gt;&amp;gt;defaultPostgreSQLLocalLogin shows:&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;defaultPostgreSQLLocalLogin&lt;br /&gt;
“To set the default database login to PostgreSQL, execute the following statement.”&lt;br /&gt;
“self defaultPostgreSQLLocalLogin.” &lt;p&gt;&lt;/p&gt;
&lt;p&gt;^DefaultLogin := (Login new)&lt;br /&gt;
database: PostgreSQLPlatform new;&lt;br /&gt;
username: ‘sodbxtest’;&lt;br /&gt;
password: ‘sodbxtest’;&lt;br /&gt;
connectString: ’127.0.0.1:5432_sodbxtest’.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Now rather than changing these connection settings, for a first attempt I thought it might go easier the other way making the database match the tests, so…&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;From the Windows Start Menu ran pgAdminIII.&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;From pgAdminIII created a new user 	sodbxtest:&lt;br /&gt;
Servers &amp;gt; 	PostgreSQL 8.3 (localhost:5432) &amp;gt;Login Roles &amp;gt; New Login Role.&lt;br /&gt;
with the widest privileges possible.&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;From pgAdminIII created database sodbxtest:&lt;br /&gt;
Servers &amp;gt; 	PostgreSQL 8.3 (localhost:5432) &amp;gt; Databases &amp;gt;&amp;gt; New 	Database&lt;br /&gt;
Name=sodbxtest&lt;br /&gt;
Owner=sodbxtest&lt;br /&gt;
Privileges=ALL, 	Role Public&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;Then for later comparison I checked that the number of tables in this new database is zero: Servers &amp;gt; 	PostgreSQL 8.3 (localhost:5432) &amp;gt; Databases &amp;gt; sodbxtest &amp;gt; schemas &amp;gt; public &amp;gt; Tables&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;Now “the hack” (since I was in a rush and would have needed to log out and back in as Admin to adjust the search paths.)&lt;br /&gt;
.&lt;br /&gt;
In Pharo I ran some Glorp Tests and got an error “could not find libpq.dll.”  After finding this file in folder &lt;em&gt;PostgresSQL/8.3/libs&lt;/em&gt;, rather than properly resolving the lookup, the quick fix was copying everything from that folder next to the virtual machine in folder &lt;em&gt;Pharo-1.3-13315-cog2522-dbxtalk&lt;/em&gt;.  A subsequent error “could not find ssleay32.dll” was fixed similarly by copying the contents of folder &lt;em&gt;PostgresSQL/8.3/bin&lt;/em&gt; next to the virtual machine.&lt;br /&gt;
.&lt;/li&gt;
&lt;li&gt;Then in Pharo from World Menu &amp;gt; Test Runner all 823 tests for GlorpTests-Models, GlorpTests-Database &amp;amp; GlorpTest are successful.&lt;br /&gt;
.&lt;br /&gt;
In addition, if I recheck the number of tables noted in Step 14 and find there are now 75 tables – full of data.&lt;br /&gt;
.&lt;br /&gt;
Excluded from this are GlorpTests-DatabaseTypes, GlorpTests-Extras, GlorpOpenDBXDriverTests since they seem to cycle through testing databases  that I don’t have installed – in particular OCI.dll for Oracle.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One small annoyance is that once a “missing OCI.dll” error  occurs, it continues to occur even when the previously successful tests  are rerun.  This remains until reset by: GlorpDatabaseLoginResource  defaultPostgreSQLLocalLogin.&lt;/p&gt;
&lt;p&gt;So this is a good result and I’ll be glad to further DBXTalk later on.  However for now, for my current requirements (a one-time  one-way import from an mdb file into Pharo) I think that ConfigurationOfODBC is more suitable.&lt;/p&gt;</description>
	<pubDate>Sun, 25 Dec 2011 13:32:22 +0000</pubDate>
	<dc:creator>Ben Coman</dc:creator>
</item>

</channel>
</rss>

