<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8799552733448267702</id><updated>2012-01-28T11:27:21.576-08:00</updated><category term='regex'/><category term='packages'/><category term='xml'/><category term='morphic'/><category term='metacello'/><category term='tools'/><category term='install pharo'/><category term='web'/><category term='vm'/><category term='world menu'/><category term='video'/><category term='interviews'/><category term='contribute'/><category term='metaprogramming'/><category term='language'/><category term='testing'/><category term='getting started'/><category term='gui'/><category term='vmmaker'/><category term='databases'/><category term='monticello'/><title type='text'>Pharocasts</title><subtitle type='html'>&lt;a href="http://pharo-project.org"&gt;Pharo &lt;/a&gt; Smalltalk screencasts</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.pharocasts.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-8016078558188717153</id><published>2012-01-24T08:04:00.000-08:00</published><updated>2012-01-24T08:06:55.089-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='morphic'/><title type='text'>Morphic and physics</title><content type='html'>Here's a nice serie of screencasts recorded by HwaJong Oh &lt;a href="https://twitter.com/#!/daliot"&gt;&lt;span style="color: #033aee; text-decoration: underline;"&gt;@daliot&lt;/span&gt;&lt;/a&gt; that shows how to create physical interaction between Morphic objects. &lt;br /&gt;The series starts with a demo of the final application and then how to build it step by step.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="#intro"&gt;Introduction to MorphoPhysics&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#make_ball"&gt;Make a ball&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#ball_fixes"&gt;A better ball&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#rubberband"&gt;Add a rubber band&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#rubberband_force"&gt;Rubber band with force&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=8799552733448267702" name="intro"&gt;Introduction to MorphoPhysics:&lt;/a&gt;&lt;/h2&gt;&lt;iframe allowfullscreen="" frameborder="0" height="432" mozallowfullscreen="" src="http://player.vimeo.com/video/34831656?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer it&lt;br /&gt;  squeaksource: 'DaliotsPlayground';&lt;br /&gt;  package: 'ConfigurationOfDaliotsPlayground';&lt;br /&gt;  load.&lt;br /&gt;&lt;br /&gt;(Smalltalk at: #ConfigurationOfDaliotsPlayground) &lt;br /&gt;    project lastVersion load: 'MorphoPhysics'.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=8799552733448267702" name="make_ball"&gt;Make a ball:&lt;/a&gt;&lt;/h2&gt;&lt;iframe allowfullscreen="" frameborder="0" height="432" mozallowfullscreen="" src="http://player.vimeo.com/video/34831779?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;b&gt;Codes shown in workspaces:&lt;/b&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;"Before creating the BallMorph class"&lt;br /&gt;b1 := EllipseMorph new.&lt;br /&gt;b1 openInWorld.&lt;br /&gt;b1 extent: 40@40.&lt;br /&gt;b1 color: Color green.&lt;br /&gt;b1 borderWidth: 0.&lt;br /&gt;b1 center: (158@225).&lt;br /&gt;"..."&lt;br /&gt;b1 delete.&lt;br /&gt;&lt;br /&gt;"After creating the BallMorph class"&lt;br /&gt;b1 := BallMorph new.&lt;br /&gt;b1 openInWorld.&lt;br /&gt;b1 reset.&lt;br /&gt;b1 startStepping.&lt;br /&gt;b1 velocity: 1@0.&lt;br /&gt;b1 velocity: 0@1.&lt;br /&gt;b1 velocity: 0@ -1.&lt;br /&gt;b1 velocity: 1@ -1.&lt;br /&gt;b1 velocity: 20@0.&lt;br /&gt;b1 velocity: -20@0.&lt;br /&gt;b1 acceleratedBy: -20@0.&lt;br /&gt;b1 mass: 40.&lt;br /&gt;b1 applyForceBy: -1000@0.&lt;br /&gt;&lt;br /&gt;b2 := BallMorph new.&lt;br /&gt;b2 openInWorld.&lt;br /&gt;b2 mass: 80.&lt;br /&gt;b1 applyForceBy: -1000@0.&lt;br /&gt;b2 applyForceBy: -1000@0.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Load final code of this video:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer it&lt;br /&gt;  squeaksource: 'Pharocasts';&lt;br /&gt;  version: 'DemoMorphoPhysics-hjo.1'; &lt;br /&gt;  load.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=8799552733448267702" name="ball_fixes"&gt;A better ball:&lt;/a&gt;&lt;/h2&gt;&lt;iframe allowfullscreen="" frameborder="0" height="432" mozallowfullscreen="" src="http://player.vimeo.com/video/34832200?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;b&gt;Load final code of this video:&lt;/b&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer it&lt;br /&gt; squeaksource: 'Pharocasts';&lt;br /&gt; version: 'DemoMorphoPhysics-hjo.2';&lt;br /&gt; load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=8799552733448267702" name="rubberband"&gt;Add a rubber band:&lt;/a&gt;&lt;/h2&gt;&lt;iframe allowfullscreen="" frameborder="0" height="432" mozallowfullscreen="" src="http://player.vimeo.com/video/34831066?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;b&gt;Codes shown in workspaces:&lt;/b&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;"before creating the RubberBandMorph class"&lt;br /&gt;r := PolygonMorph new.&lt;br /&gt;r openInWorld.&lt;br /&gt;r makeOpen.&lt;br /&gt;r beStraightSegments.&lt;br /&gt;r setVertices: {80@180. 180@200}.&lt;br /&gt;r borderColor: Color black.&lt;br /&gt;r setVertices: {b1 center. b2 center}.&lt;br /&gt;r delete.&lt;br /&gt;&lt;br /&gt;"after creating the RubberBandMorph class"&lt;br /&gt;r := RubberBandMorph new.&lt;br /&gt;r openInWorld.&lt;br /&gt;r ball1: b1.&lt;br /&gt;r ball1.&lt;br /&gt;r ball2: b2.&lt;br /&gt;r ball2.&lt;br /&gt;r connectTwoBalls.&lt;br /&gt;r length.&lt;br /&gt;r vectorFrom1To2&lt;br /&gt;Transcript open.&lt;br /&gt;r thickness.&lt;/code&gt;&lt;/pre&gt;&lt;br/&gt;&lt;b&gt;Load final code of this video:&lt;/b&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer it&lt;br /&gt; squeaksource: 'Pharocasts';&lt;br /&gt; version: 'DemoMorphoPhysics-hjo.3';&lt;br /&gt; load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=8799552733448267702" name="rubberband_force"&gt;Rubber band with force:&lt;/a&gt;&lt;/h2&gt;&lt;iframe allowfullscreen="" frameborder="0" height="432" mozallowfullscreen="" src="http://player.vimeo.com/video/34870679?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;b&gt;Codes shown in workspaces:&lt;/b&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;r stress.&lt;br /&gt;r applyForceOppositeDirection: 100@0.&lt;br /&gt;r unitVectorFrom1To2.&lt;br /&gt;r applyForceOppositeDirection: (r stress * r unitVectorFrom1To2).&lt;br /&gt;r applyForce.&lt;br /&gt;r delete.&lt;br /&gt;&lt;br /&gt;b1 delete.&lt;br /&gt;b2 delete.&lt;br /&gt;&lt;br /&gt;"A little more complex example"&lt;br /&gt;b1 := BallMorph new.&lt;br /&gt;b1 openInWorld.&lt;br /&gt;b1 mass: 80.&lt;br /&gt;&lt;br /&gt;b2 := BallMorph new.&lt;br /&gt;b2 openInWorld.&lt;br /&gt;b2 mass: 50.&lt;br /&gt;&lt;br /&gt;b3 := BallMorph new.&lt;br /&gt;b3 openInWorld.&lt;br /&gt;b3 mass: 200.&lt;br /&gt;&lt;br /&gt;r12 := RubberBandMorph new.&lt;br /&gt;r12 ball1: b1.&lt;br /&gt;r12 ball2: b2.&lt;br /&gt;r12 openInWorld&lt;br /&gt;&lt;br /&gt;r23 := RubberBandMorph new.&lt;br /&gt;r23 ball1: b2.&lt;br /&gt;r23 ball2: b3.&lt;br /&gt;r23 openInWorld&lt;br /&gt;&lt;br /&gt;r31 := RubberBandMorph new.&lt;br /&gt;r31 ball1: b3.&lt;br /&gt;r31 ball2: b1.&lt;br /&gt;r31 openInWorld.&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Load final code of this video:&lt;/b&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer it&lt;br /&gt; squeaksource: 'Pharocasts';&lt;br /&gt; version: 'DemoMorphoPhysics-hjo.4';&lt;br /&gt; load.&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-8016078558188717153?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/8016078558188717153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2012/01/morphic-and-physics.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8016078558188717153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8016078558188717153'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2012/01/morphic-and-physics.html' title='Morphic and physics'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-8361486701266274899</id><published>2012-01-09T22:54:00.000-08:00</published><updated>2012-01-09T22:55:00.136-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><category scheme='http://www.blogger.com/atom/ns#' term='morphic'/><title type='text'>Manipulating objects</title><content type='html'>&lt;p&gt;The purpose of this screencast is to learn basic tools of Pharo to manipulate objects in a fun way. &lt;/p&gt;&lt;p&gt;(Pardon my English. Thanks to tell me what's wrong so I can improve).&lt;/p&gt;&lt;iframe frameborder="0" height="384" src="http://player.vimeo.com/video/34810463?portrait=0" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load package MorphExamplesAndDemos:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Gofer it&lt;br /&gt; squeaksource: 'PharoNonCorePackages';&lt;br /&gt; package: 'MorphExamplesAndDemos';&lt;br /&gt; load.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Open a new BouncingAtomsMorph in World:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;BouncingAtomsMorph new openInWorld.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;or in a window:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;BouncingAtomsMorph new openInWindow.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Inspect the first BouncingAtomsMorph instance:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;BouncingAtomsMorph allInstances first inspect.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Change the first BouncingAtomsMorph color to red:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;BouncingAtomsMorph allInstances first color: Color red.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Stop then start BouncingAtomsMorph animation:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;BouncingAtomsMorph allInstances first stopStepping.&lt;br /&gt;BouncingAtomsMorph allInstances first startStepping.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Remove all submorphs of last BouncingAtomsMorph instance:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;BouncingAtomsMorph allInstances last removeAllMorphs.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Move the first submorph of first BouncingAtomsMorph instance to last one:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;BouncingAtomsMorph allInstances last &lt;br /&gt;  addMorph: BouncingAtomsMorph allInstances first submorphs first .&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Delete all BouncingAtomsMorph instances:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;BouncingAtomsMorph allInstances do: [:aMorph| aMorph delete].&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Run the garbage collector:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Smalltalk garbageCollect.&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-8361486701266274899?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/8361486701266274899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2012/01/manipulating-objects.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8361486701266274899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8361486701266274899'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2012/01/manipulating-objects.html' title='Manipulating objects'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-8115213907827519361</id><published>2011-05-16T22:56:00.000-07:00</published><updated>2011-05-16T22:58:45.574-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Learn Smalltalk with ProfStef</title><content type='html'>ProfStef is a Smalltalk interactive tutorial included in Pharo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 5/17/2011&lt;/b&gt;: &lt;a href="http://www.jarober.com/"&gt;James Robertson&lt;/a&gt; has &lt;a href="http://www.jarober.com/blog/blogView?showComments=true&amp;printTitle=ProfStef:_Learning_Smalltalk_in_Pharo&amp;entry=3483014857"&gt;merged&lt;/a&gt; his ProfStef recordings from the &lt;a href="http://www.jarober.com/blog/st4u.ssp"&gt;Smalltalk4U&lt;/a&gt; serie (Thank you !!).&lt;br /&gt;&lt;br /&gt;Download screencast: &lt;a href="http://www.archive.org/download/ProfstefLearningSmalltalkInPharo/ProfStef.mov"&gt;.mov&lt;/a&gt;, &lt;a href="http://www.archive.org/download/ProfstefLearningSmalltalkInPharo/ProfStef.wmv"&gt;.wmv&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can also &lt;a href="http://www.youtube.com/watch?v=9sAnByuuRRo"&gt;watch it on youtube&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/23823348?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="640" height="480" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I keep the former screencast:&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/learn_smalltalk_with_prof_stef.mpeg"&gt; .mpeg, 25.4 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/learn_smalltalk_with_prof_stef.mov"&gt; .mov, 58.1 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8912226&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=8912226&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can load last ProfStef with:&lt;pre&gt;&lt;code class="smalltalk"&gt;&lt;br /&gt;Gofer new&lt;br /&gt;  squeaksource:'MetacelloRepository';&lt;br /&gt;  package:'ConfigurationOfProfStef';&lt;br /&gt;  load.&lt;br /&gt;&lt;br /&gt;ConfigurationOfProfStef project latestVersion load.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Then run ProfStef:&lt;pre&gt;&lt;code class="smalltalk"&gt;ProfStef go.&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-8115213907827519361?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/8115213907827519361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/01/learn-smalltalk-with-profstef.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8115213907827519361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8115213907827519361'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/01/learn-smalltalk-with-profstef.html' title='Learn Smalltalk with ProfStef'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-8071915841333583508</id><published>2011-04-19T23:08:00.000-07:00</published><updated>2011-04-19T23:36:17.399-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='interviews'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Test coverage with Hapao</title><content type='html'>Vanessa Peña is an undergraduate student in computer science at &lt;a href="http://www.dcc.uchile.cl"&gt;University of Chile&lt;/a&gt; and part of &lt;a href="http://hapao.dcc.uchile.cl/"&gt;Hapao&lt;/a&gt; team.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bergel.eu/"&gt;Alexandre Bergel&lt;/a&gt; use Pharo for research in software engineering, quality and understanding at University of Chile. Contribute to &lt;a href="http://www.moosetechnology.org/tools/mondrian"&gt;Mondrian&lt;/a&gt;, &lt;a href="moosetechnology.org"&gt;Moose&lt;/a&gt;, XMLSupport, Spy.&lt;br /&gt;&lt;br /&gt;They show us &lt;a href="http://hapao.dcc.uchile.cl/"&gt;Hapao&lt;/a&gt;, an innovative test coverage tool implemented in the Pharo Smalltalk programming language. You will see how they analyse the &lt;a href="http://www.pharocasts.com/2010/01/learn-smalltalk-with-profstef.html"&gt;ProfStef&lt;/a&gt; interactive tutorial, increase test coverage and commit their contribution to &lt;a href="http://www.squeaksource.com"&gt;SqueakSource&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You may want to look at &lt;a href="http://www.pharocasts.com/2010/09/document-with-helpsystem.html"&gt;Document with HelpSystem&lt;/a&gt; screencast to understand how ProfStef HelpSystem book is built.&lt;br /&gt;&lt;br /&gt;The video is part of &lt;a href="http://www.pharocasts.com/search/label/interviews"&gt;PharoCasts with Experts&lt;/a&gt; serie. It weights 1.2 GB and you can get it from vimeo page.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/22618798"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="384" src="http://player.vimeo.com/video/22618798?portrait=0" width="640"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-8071915841333583508?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/8071915841333583508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2011/04/test-coverage-with-hapao.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8071915841333583508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8071915841333583508'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2011/04/test-coverage-with-hapao.html' title='Test coverage with Hapao'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-5554070969029628424</id><published>2011-04-16T23:49:00.000-07:00</published><updated>2011-04-19T22:58:06.210-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interviews'/><category scheme='http://www.blogger.com/atom/ns#' term='vm'/><category scheme='http://www.blogger.com/atom/ns#' term='vmmaker'/><title type='text'>Debug Cog VM</title><content type='html'>First video of &lt;a href="http://www.pharocasts.com/search/label/interviews"&gt;PharoCasts with Experts&lt;/a&gt; serie.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://marianopeck.wordpress.com/"&gt;Mariano Martinez Peck&lt;/a&gt; is a PhD student between &lt;a href="http://www.ensm-douai.fr/"&gt;Ecole des Mines de Douai&lt;/a&gt; and &lt;a href="http://rmod.lille.inria.fr/web/"&gt;INRIA RMOD team&lt;/a&gt;. He is the main developer behind &lt;a href="http://www.squeakdbx.org/"&gt;SqueakDBX&lt;/a&gt; and &lt;a href="http://www.squeakdbx.org/"&gt;GlorpDBX&lt;/a&gt;,  maintainer of Metacello Configurations of official Pharo images.&lt;br /&gt;&lt;br /&gt;Now also Cog VM hacker, Mariano explains in a 1h30 HD video:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;what the VM&amp;nbsp;is made of&lt;/li&gt;&lt;li&gt;what are the different VM built by the &lt;a href="https://pharo-ic.lille.inria.fr/hudson/view/Cog/"&gt;Pharo project continuous integration server&lt;/a&gt;&lt;/li&gt;&lt;li&gt;how to get the &lt;a href="http://gitorious.org/cogvm"&gt;platform sources from Gitorious&lt;/a&gt;&lt;/li&gt;&lt;li&gt;how to generate the interpreter sources using ConfigurationOfCogVM&lt;/li&gt;&lt;li&gt;build the VM&lt;/li&gt;&lt;li&gt;run and debug it with gdb and XCode&lt;/li&gt;&lt;li&gt;what Slang is and how to change it for debugging purposes&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This screencast matches these posts from Mariano's blog: &lt;a href="http://marianopeck.wordpress.com/2011/04/10/building-the-vm-from-scratch-using-git-and-cmakevmmaker/"&gt;part1&lt;/a&gt;, &lt;a href="http://marianopeck.wordpress.com/2011/04/16/building-the-vm-second-part/"&gt;part2&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Eliot Miranda, main developer of Cog VM, has also written &lt;a href="http://www.mirandabanda.org/cogblog/"&gt;nice posts on his blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The video weights 2.2 GB. You can get it from vimeo page.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note&lt;/b&gt;: about the print that doesn't work at the end of video, Mariano told me later:&lt;cite&gt;The problem was that I evaluated from workspace and evaluating stuff from workspace is hackky becase the Compiler is used. If I do the same from a method, instead of a workspace, it works&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/22485382"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="384" src="http://player.vimeo.com/video/22485382?portrait=0" width="640"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-5554070969029628424?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/5554070969029628424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2011/04/debug-cog-vm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/5554070969029628424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/5554070969029628424'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2011/04/debug-cog-vm.html' title='Debug Cog VM'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-6587003060870262734</id><published>2011-03-06T13:29:00.000-08:00</published><updated>2011-03-07T08:59:57.602-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>Build a XML browser</title><content type='html'>Watch this to learn how to:&lt;ul&gt;&lt;li&gt;get and parse XML&lt;/li&gt;&lt;li&gt;use Polymorph to build a GUI with a tree and text editor&lt;/li&gt;&lt;li&gt;add a button in Pharo IDE to open the XML browser&lt;/li&gt;&lt;li&gt;control when your breakpoints will trigger&lt;/li&gt;&lt;/ul&gt;Done using Pharo 1.2 (not released yet). You can download last build from the &lt;a href="https://pharo-ic.lille.inria.fr/hudson/view/Pharo/job/Pharo%201.2/"&gt;Continuous Integration server&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;: Tudor Girba &lt;a href="http://www.tudorgirba.com/blog/simple-xml-browser-with-glamour"&gt;created a counter part demo for the browser building part using Glamour&lt;/a&gt; (browsing engine that ships with &lt;a href="http://www.moosetechnology.org/"&gt;Moose&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Download screencast (1280x800): &lt;a href="http://lolgzs.free.fr/pharocasts/xmlbrowser.mov"&gt;.mov 77 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/20715620"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="384" src="http://player.vimeo.com/video/20715620?portrait=0" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;More Polymorph in &lt;a href="http://www.pharocasts.com/2011/02/pharo-gui-with-polymorph.html"&gt;Pharo GUI with Polymorph&lt;/a&gt; and &lt;a href="http://www.pharocasts.com/2010/08/see-how-to-get-data-from-url-parse-xml.html"&gt;Picasa screencast&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Get the code:&lt;/b&gt;&lt;pre&gt;&lt;code&gt;Gofer it&lt;br /&gt; squeaksource: 'Pharocasts';&lt;br /&gt; package: 'XML-Browser';&lt;br /&gt; load.&lt;br /&gt; &lt;br /&gt;(Smalltalk at:#XMLBrowser)&lt;br /&gt;  browseAtUrl:'http://www.pharocasts.com/feeds/posts/default'.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-6587003060870262734?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/6587003060870262734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2011/03/build-xml-browser.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/6587003060870262734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/6587003060870262734'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2011/03/build-xml-browser.html' title='Build a XML browser'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-9051168362473026261</id><published>2011-02-05T00:10:00.000-08:00</published><updated>2011-02-08T00:52:21.227-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>StringCalculator Kata</title><content type='html'>This is the first Kata proposed by the &lt;a href="http://www.12meses12katas.com"&gt;12meses12katas&lt;/a&gt; (12 months 12 katas) initiative.&lt;br /&gt;&lt;br /&gt;You will learn: Test-Driven Development, the Pharo way.&lt;br /&gt;&lt;br /&gt;Recorded and edited by &lt;a href="http://vimeo.com/user1627267"&gt;Rafael Luque&lt;/a&gt; (big thank you!).&lt;br /&gt;&lt;br /&gt;Download screencast (1280x720): &lt;a href="http://lolgzs.free.fr/pharocasts/string_calculator_kata.mov"&gt;.mov 167.6 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/19591202"&gt;View mobile version.&lt;/a&gt; &lt;a href="http://vimeo.com/19591202"&gt;Credits for music on vimeo page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/19591202?byline=0&amp;amp;portrait=0" width="640" height="360" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Get the code:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Gofer it&lt;br /&gt; squeaksource: 'StringCalculatorKata';&lt;br /&gt; package: 'ConfigurationOfStringCalculatorKata';&lt;br /&gt; load.&lt;br /&gt;&lt;br /&gt;(Smalltalk at:#ConfigurationOfStringCalculatorKata) project latestVersion load.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Kata instructions&lt;/b&gt;&lt;pre&gt;Before you start:&lt;br /&gt; &lt;br /&gt;- Try not to read ahead.&lt;br /&gt;- Do one task at a time. The trick is to learn to work incrementally.&lt;br /&gt;- Make sure you only test for correct inputs. there is no need to test for invalid inputs for this kata&lt;br /&gt; &lt;br /&gt;String Calculator:&lt;br /&gt;&lt;br /&gt;1) Create a simple String calculator with a method int Add(string numbers)&lt;br /&gt;    1. The method can take 0, 1 or 2 numbers, and will return their sum (for an empty string it will return 0) for example “” or “1” or “1,2”&lt;br /&gt;    2. Start with the simplest test case of an empty string and move to 1 and two numbers&lt;br /&gt;    3. Remember to solve things as simply as possible so that you force yourself to write tests you did not think about&lt;br /&gt;    4. Remember to refactor after each passing test&lt;br /&gt;2) Allow the Add method to handle an unknown amount of numbers&lt;br /&gt;3) Allow the Add method to handle new lines between numbers (instead of commas).&lt;br /&gt;    1. the following input is ok:  “1\n2,3”  (will equal 6)&lt;br /&gt;    2. the following input is NOT ok:  “1,\n” (not need to prove it - just clarifying)&lt;br /&gt;4) Support different delimiters&lt;br /&gt;    1. to change a delimiter, the beginning of the string will contain a separate line that looks like this:   “//[delimiter]\n[numbers…]” for example “//;\n1;2” should return three where the default delimiter is ‘;’ .&lt;br /&gt;    2. the first line is optional. all existing scenarios should still be supported&lt;br /&gt;5) Calling Add with a negative number will throw an exception “negatives not allowed” - and the negative that was passed.if there are multiple negatives, show all of them in the exception message&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------------&lt;br /&gt;stop here if you are a beginner. Continue if you can finish the steps so far in less than 30 minutes.&lt;br /&gt;----------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;6) Numbers bigger than 1000 should be ignored, so adding 2 + 1001  = 2&lt;br /&gt;7) Delimiters can be of any length with the following format:  “//[delimiter]\n” for example: “//[***]\n1***2***3” should return 6&lt;br /&gt;8) Allow multiple delimiters like this:  “//[delim1][delim2]\n” for example “//[*][%]\n1*2%3” should return 6.&lt;br /&gt;9) make sure you can also handle multiple delimiters with length longer than one char&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-9051168362473026261?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/9051168362473026261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2011/02/stringcalculator-kata.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/9051168362473026261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/9051168362473026261'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2011/02/stringcalculator-kata.html' title='StringCalculator Kata'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-8215049950561350094</id><published>2011-02-03T03:42:00.000-08:00</published><updated>2011-02-04T23:36:24.456-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><title type='text'>Pharo GUI with Polymorph</title><content type='html'>Develop a contact manager desktop application.&lt;br /&gt;&lt;br /&gt;You will learn:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;how Pharo helps the "Program by intention" style of programming&lt;/li&gt;&lt;li&gt;how to create basic persistency of created Contact objects&lt;/li&gt;&lt;li&gt;how to compose a GUI, basic widgets, events and layout&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Download screencast (1280x768): &lt;a href="http://lolgzs.free.fr/pharocasts/polymorph.mov"&gt;.mov 75.2 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/19514229"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="384" src="http://player.vimeo.com/video/19514229?portrait=0" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;More Polymorph in &lt;a href="http://www.pharocasts.com/2010/08/see-how-to-get-data-from-url-parse-xml.html"&gt;Picasa screencast&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Get the code:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Gofer it&lt;br /&gt; squeaksource: 'Pharocasts';&lt;br /&gt; package: 'ContactManager';&lt;br /&gt; load.&lt;br /&gt; &lt;br /&gt;(Smalltalk at:#ContactListEditor) open.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_JLK6EDfW4so/TT80nUnPyOI/AAAAAAAAAh0/A2-o7j3Rv4M/s1600/polymorph.JPG%2B" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="346" src="http://2.bp.blogspot.com/_JLK6EDfW4so/TT80nUnPyOI/AAAAAAAAAh0/A2-o7j3Rv4M/s400/polymorph.JPG%2B" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Start by looking how the contact list is built:&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;ContactListEditor&amp;gt;&amp;gt;open&lt;br /&gt;  |builder content|&lt;br /&gt;  builder := UITheme builder.&lt;br /&gt;  content := builder newColumn: {   &lt;br /&gt;        builder &lt;br /&gt;                newListFor: self   &lt;br /&gt;                list: #contacts&lt;br /&gt;                selected: #contactSelectedIndex&lt;br /&gt;                changeSelected: #contactSelectedIndex:&lt;br /&gt;                help: 'contacts'.&lt;br /&gt;        builder newRow: {&lt;br /&gt;                builder newButtonFor: self &lt;br /&gt;                        action: #addButtonClick &lt;br /&gt;                        label: 'Add' &lt;br /&gt;                        help: 'Create a new contact'.&lt;br /&gt;                builder newButtonFor: self &lt;br /&gt;                        action: #removeButtonClick &lt;br /&gt;                        getEnabled: #hasSelectedContact &lt;br /&gt;                        label: 'Remove' &lt;br /&gt;                        help: 'Remove selected contact'.&lt;br /&gt;                builder newButtonFor: self &lt;br /&gt;                        action: #editButtonClick &lt;br /&gt;                        getEnabled: #hasSelectedContact &lt;br /&gt;                        label: 'Edit' &lt;br /&gt;                        help: 'Edit selected contact'  }}.&lt;br /&gt;   &lt;br /&gt;  (content openInWindowLabeled: 'Contacts') extent: 400@500.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;#newRow: and #newColumn: are an easy way to align elements on the window.&lt;br /&gt;&lt;br /&gt;When the Add button is clicked, message #addButtonClick is sent on the ContactListEditor object:&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;ContactListEditor&amp;gt;&amp;gt;addButtonClick&lt;br /&gt;  |newContact|&lt;br /&gt;  newContact := Contact new.&lt;br /&gt; &lt;br /&gt;  ContactEditor new&lt;br /&gt;        contact: newContact;&lt;br /&gt;        onOK: [ Contact database add: newContact.  &lt;br /&gt;                selectedContactIndex := Contact database size.&lt;br /&gt;                self &lt;br /&gt;                        changed: #contacts;&lt;br /&gt;                        changed: #hasSelectedContact];&lt;br /&gt;        openModal.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;The closure given to &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#onOK:&lt;/span&gt; adds the new Contact and tells the view to refresh components which depends on &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#contacts&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#hasSelectedContact&lt;/span&gt; selectors - that means the contact list and the Remove and Edit buttons.&lt;br /&gt;&lt;br /&gt;ContactEditor defines a modal dialog to edit the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;firstName&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;lastName&lt;/span&gt; of a Contact:&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;ContactEditor&amp;gt;&amp;gt;openModal&lt;br /&gt;  |builder dialog content firstName|&lt;br /&gt;  &lt;br /&gt;  builder := UITheme builder.&lt;br /&gt;  content := (builder newLabelGroup: {&lt;br /&gt;                'First name' -&amp;gt; (&lt;br /&gt;                       firstName := (builder&lt;br /&gt;                         newTextEntryFor: contact&lt;br /&gt;                         getText: #firstName&lt;br /&gt;                         setText: #firstName: &lt;br /&gt;                         help: 'Enter the first name of the contact')&lt;br /&gt;                       acceptOnCR: false;&lt;br /&gt;                       minWidth: 200).&lt;br /&gt;                'Last name' -&amp;gt; (&lt;br /&gt;                       (builder&lt;br /&gt;                          newTextEntryFor: contact &lt;br /&gt;                          getText: #lastName &lt;br /&gt;                          setText: #lastName: &lt;br /&gt;                          help: 'Enter the last name of the contact')&lt;br /&gt;                        acceptOnCR: false;&lt;br /&gt;                        minWidth: 200) }).&lt;br /&gt; &lt;br /&gt;  dialog := builder &lt;br /&gt;              newPluggableDialogWindow:'Edit contact' &lt;br /&gt;              for: content.&lt;br /&gt;  dialog rememberKeyboardFocus: firstName.&lt;br /&gt;  builder openModal: dialog.&lt;br /&gt; &lt;br /&gt;  dialog cancelled ifFalse: [self doOnOK].&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;From Gary Chambers (and thanks !):&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;Disabling the acceptOnCR for each text frield allows the default dialog handling for the return key (defaults to OK).&lt;br /&gt;&lt;br /&gt;Normally the initial keyboard focus for a dialog is the default button, if specified. Remembering the first name field prior to opening will give that field focus.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;Now it should be easier to understand Polymorph examples found in &lt;br /&gt;&lt;a href="http://slbrowserfb.appspot.com/code/pharo/1.1/UITheme"&gt;UITheme&lt;/a&gt;&amp;nbsp;class&amp;gt;&amp;gt;exampleBasicControls and friends (in examples protocol).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-8215049950561350094?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/8215049950561350094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2011/02/pharo-gui-with-polymorph.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8215049950561350094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8215049950561350094'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2011/02/pharo-gui-with-polymorph.html' title='Pharo GUI with Polymorph'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JLK6EDfW4so/TT80nUnPyOI/AAAAAAAAAh0/A2-o7j3Rv4M/s72-c/polymorph.JPG%2B' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-2362102533538781442</id><published>2010-12-05T13:20:00.000-08:00</published><updated>2010-12-05T13:31:52.080-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><title type='text'>Access database through ODBC</title><content type='html'>See how to setup and access an &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt; database through &lt;a href="http://www.squeaksource.com/ODBC.html"&gt;ODBC&lt;/a&gt; on Windows.&lt;br /&gt;&lt;br /&gt;Recorded by &lt;a href="http://astares.blogspot.com/"&gt;Torsten Bergmann&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/odbc.mpg"&gt;.mpg 39.4 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/odbc.mov"&gt; .mov 11.9 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/17462635"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/17462635?portrait=0" width="640" height="480" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Load ODBC support:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt; squeaksource: 'ODBC';&lt;br /&gt; package: 'ConfigurationOfODBC'; load.&lt;br /&gt;(Smalltalk at: #ConfigurationOfODBC) load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Download the ODBC driver for your database - here we use SQLite&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Win32Shell new shellOpen: 'http://www.ch-werner.de/sqliteodbc/'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Configure an ODBC connection through Windows ODBC Administrator:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Win32Shell new &lt;br /&gt; shellExecute: nil&lt;br /&gt; lpOperation: nil &lt;br /&gt; lpFile: 'rundll32.exe' &lt;br /&gt; lpParameters: 'shell32.dll,Control_RunDLL odbccp32.cpl' &lt;br /&gt; lpDirectory: nil &lt;br /&gt; nShowCmd: 5&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Create database and fill some data:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;|connection contents|&lt;br /&gt;connection := ODBCConnection dsn: 'MySimpleDB' user: '' password: ''.&lt;br /&gt;connection execute: 'CREATE TABLE user(name varchar(10), age smallint)'.&lt;br /&gt;connection execute: 'INSERT INTO user VALUES(''Old Bob'', 100)'.&lt;br /&gt;contents := (connection query: 'select * from user;') execute: ''.&lt;br /&gt;contents asTable inspect.&lt;br /&gt;connection close.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Reconnect and run the query again:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;|connection contents|&lt;br /&gt;connection := ODBCConnection dsn: 'MySimpleDB' user: '' password: ''.&lt;br /&gt;contents := (connection query: 'select * from user;') execute: ''.&lt;br /&gt;contents asTable inspect.&lt;br /&gt;connection close.&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-2362102533538781442?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/2362102533538781442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/12/access-database-through-odbc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2362102533538781442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2362102533538781442'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/12/access-database-through-odbc.html' title='Access database through ODBC'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-2955932680436043089</id><published>2010-11-02T13:35:00.000-07:00</published><updated>2011-02-04T23:42:22.249-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packages'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><category scheme='http://www.blogger.com/atom/ns#' term='morphic'/><title type='text'>LightsOut game</title><content type='html'>&lt;script type="text/javascript"&gt;SLB.addData('{"license":"PGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLyI+Q3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlPC9hPg==","imethods":{"mouseAction:":"PHNwYW4gY2xhc3M9InBhdHRlcm5LZXl3b3JkIj5tb3VzZUFjdGlvbjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJwYXR0ZXJuQXJnIj5hQmxvY2s8L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InJldHVybiI+Xjwvc3Bhbj4gPHNwYW4gY2xhc3M9Imluc3RWYXIiPm1vdXNlQWN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0iYW5zaUFzc2lnbm1lbnQiPjo9PC9zcGFuPiA8c3BhbiBjbGFzcz0ibWV0aG9kQXJnIj5hQmxvY2s8L3NwYW4+PHNwYW4gY2xhc3M9InN0YXRlbWVudFNlcGFyYXRvciI+Ljwvc3Bhbj4=","mouseUp:":"PHNwYW4gY2xhc3M9InBhdHRlcm5LZXl3b3JkIj5tb3VzZVVwOjwvc3Bhbj4gPHNwYW4gY2xhc3M9InBhdHRlcm5BcmciPmFuRXZlbnQ8L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9Imluc3RWYXIiPm1vdXNlQWN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPnZhbHVlPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+","initialize":"PHNwYW4gY2xhc3M9InVuZGVmaW5lZElkZW50aWZpZXIiPmluaXRpYWxpemU8L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InVuYXJ5Ij5zdXBlcjwvc3Bhbj4gPHNwYW4gY2xhc3M9InVuYXJ5Ij5pbml0aWFsaXplPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InNlbGYiPnNlbGY8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5sYWJlbDo8L3NwYW4+IDxzcGFuIGNsYXNzPSJzdHJpbmciPicnPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InNlbGYiPnNlbGY8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5ib3JkZXJXaWR0aDo8L3NwYW4+IDxzcGFuIGNsYXNzPSJudW1iZXIiPjI8L3NwYW4+PHNwYW4gY2xhc3M9InN0YXRlbWVudFNlcGFyYXRvciI+Ljwvc3Bhbj48YnIvPgk8c3BhbiBjbGFzcz0idW5kZWZpbmVkSWRlbnRpZmllciI+Ym91bmRzPC9zcGFuPiA8c3BhbiBjbGFzcz0iYW5zaUFzc2lnbm1lbnQiPjo9PC9zcGFuPiA8c3BhbiBjbGFzcz0ibnVtYmVyIj4wPC9zcGFuPjxzcGFuIGNsYXNzPSJiaW5hcnkiPkA8L3NwYW4+PHNwYW4gY2xhc3M9Im51bWJlciI+MDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNvcm5lcjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJudW1iZXIiPjE2PC9zcGFuPjxzcGFuIGNsYXNzPSJiaW5hcnkiPkA8L3NwYW4+PHNwYW4gY2xhc3M9Im51bWJlciI+MTY8L3NwYW4+PHNwYW4gY2xhc3M9InN0YXRlbWVudFNlcGFyYXRvciI+Ljwvc3Bhbj48YnIvPgk8c3BhbiBjbGFzcz0idW5kZWZpbmVkSWRlbnRpZmllciI+b2ZmQ29sb3I8L3NwYW4+IDxzcGFuIGNsYXNzPSJhbnNpQXNzaWdubWVudCI+Oj08L3NwYW4+IDxzcGFuIGNsYXNzPSJnbG9iYWxWYXIiPkNvbG9yPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPnBhbGVZZWxsb3c8L3NwYW4+PHNwYW4gY2xhc3M9InN0YXRlbWVudFNlcGFyYXRvciI+Ljwvc3Bhbj48YnIvPgk8c3BhbiBjbGFzcz0idW5kZWZpbmVkSWRlbnRpZmllciI+b25Db2xvcjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImFuc2lBc3NpZ25tZW50Ij46PTwvc3Bhbj4gPHNwYW4gY2xhc3M9Imdsb2JhbFZhciI+Q29sb3I8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+cGFsZUJsdWU8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+ZGFya2VyPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InNlbGYiPnNlbGY8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+dXNlU3F1YXJlQ29ybmVyczwvc3Bhbj48c3BhbiBjbGFzcz0ic3RhdGVtZW50U2VwYXJhdG9yIj4uPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJzZWxmIj5zZWxmPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPnR1cm5PZmY8L3NwYW4+PHNwYW4gY2xhc3M9InN0YXRlbWVudFNlcGFyYXRvciI+Ljwvc3Bhbj4="},"definition":"PHNwYW4gY2xhc3M9Imdsb2JhbFZhciI+UHJvdG9PYmplY3Q8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdWJjbGFzczo8L3NwYW4+IDxzcGFuIGNsYXNzPSJzeW1ib2wiPiM8L3NwYW4+PHNwYW4gY2xhc3M9InN5bWJvbCI+TE9DZWxsPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnN0YW5jZVZhcmlhYmxlTmFtZXM6PC9zcGFuPiA8c3BhbiBjbGFzcz0ic3RyaW5nIj4nbW91c2VBY3Rpb24nPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzc1ZhcmlhYmxlTmFtZXM6PC9zcGFuPiA8c3BhbiBjbGFzcz0ic3RyaW5nIj4nJzwvc3Bhbj48YnIvPgk8c3BhbiBjbGFzcz0ia2V5d29yZCI+cG9vbERpY3Rpb25hcmllczo8L3NwYW4+IDxzcGFuIGNsYXNzPSJzdHJpbmciPicnPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jYXRlZ29yeTo8L3NwYW4+IDxzcGFuIGNsYXNzPSJzdHJpbmciPidQQkUtTGlnaHRzT3V0Jzwvc3Bhbj4=","cmethods":{},"doc":"QSBMT0NlbGwgaXMgeHh4eHh4eHh4Lg0NSW5zdGFuY2UgVmFyaWFibGVzDQltb3VzZUFjdGlvbjoJCTxPYmplY3Q+DQ1tb3VzZUFjdGlvbg0JLSB4eHh4eA0=","class":"LOCell"}');SLB.addData('{"license":"PGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLyI+Q3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlPC9hPg==","imethods":{"toggleNeighboursOfCellAt:at:":"PHNwYW4gY2xhc3M9InBhdHRlcm5LZXl3b3JkIj50b2dnbGVOZWlnaGJvdXJzT2ZDZWxsQXQ6PC9zcGFuPiA8c3BhbiBjbGFzcz0icGF0dGVybkFyZyI+aTwvc3Bhbj4gPHNwYW4gY2xhc3M9InBhdHRlcm5LZXl3b3JkIj5hdDo8L3NwYW4+IDxzcGFuIGNsYXNzPSJwYXR0ZXJuQXJnIj5qPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJsZWZ0UGFyZW50aGVzaXMiPig8L3NwYW4+PHNwYW4gY2xhc3M9Im1ldGhvZEFyZyI+aTwvc3Bhbj48c3BhbiBjbGFzcz0iYmluYXJ5Ij4mZ3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJudW1iZXIiPjE8L3NwYW4+PHNwYW4gY2xhc3M9InJpZ2h0UGFyZW50aGVzaXMiPik8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pZlRydWU6PC9zcGFuPiA8c3BhbiBjbGFzcz0iYmxvY2tTdGFydCI+Wzwvc3Bhbj48c3BhbiBjbGFzcz0ibGVmdFBhcmVudGhlc2lzMSI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaW5zdFZhciI+Y2VsbHM8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5hdDo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtZXRob2RBcmciPmk8L3NwYW4+IDxzcGFuIGNsYXNzPSJiaW5hcnkiPi08L3NwYW4+IDxzcGFuIGNsYXNzPSJudW1iZXIiPjE8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5hdDo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtZXRob2RBcmciPmo8L3NwYW4+PHNwYW4gY2xhc3M9InJpZ2h0UGFyZW50aGVzaXMxIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPnRvZ2dsZVN0YXRlPC9zcGFuPjxzcGFuIGNsYXNzPSJibG9ja0VuZCI+XTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RhdGVtZW50U2VwYXJhdG9yIj4uPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJsZWZ0UGFyZW50aGVzaXMiPig8L3NwYW4+PHNwYW4gY2xhc3M9Im1ldGhvZEFyZyI+aTwvc3Bhbj48c3BhbiBjbGFzcz0iYmluYXJ5Ij4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJzZWxmIj5zZWxmPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPmNlbGxzUGVyU2lkZTwvc3Bhbj48c3BhbiBjbGFzcz0icmlnaHRQYXJlbnRoZXNpcyI+KTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmlmVHJ1ZTo8L3NwYW4+IDxzcGFuIGNsYXNzPSJibG9ja1N0YXJ0Ij5bPC9zcGFuPjxzcGFuIGNsYXNzPSJsZWZ0UGFyZW50aGVzaXMxIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJpbnN0VmFyIj5jZWxsczwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmF0Ojwvc3Bhbj4gPHNwYW4gY2xhc3M9Im1ldGhvZEFyZyI+aTwvc3Bhbj48c3BhbiBjbGFzcz0iYmluYXJ5Ij4rPC9zcGFuPjxzcGFuIGNsYXNzPSJudW1iZXIiPjE8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5hdDo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtZXRob2RBcmciPmo8L3NwYW4+PHNwYW4gY2xhc3M9InJpZ2h0UGFyZW50aGVzaXMxIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPnRvZ2dsZVN0YXRlPC9zcGFuPjxzcGFuIGNsYXNzPSJibG9ja0VuZCI+XTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RhdGVtZW50U2VwYXJhdG9yIj4uPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJsZWZ0UGFyZW50aGVzaXMiPig8L3NwYW4+PHNwYW4gY2xhc3M9Im1ldGhvZEFyZyI+ajwvc3Bhbj48c3BhbiBjbGFzcz0iYmluYXJ5Ij4mZ3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJudW1iZXIiPjE8L3NwYW4+PHNwYW4gY2xhc3M9InJpZ2h0UGFyZW50aGVzaXMiPik8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pZlRydWU6PC9zcGFuPiA8c3BhbiBjbGFzcz0iYmxvY2tTdGFydCI+Wzwvc3Bhbj48c3BhbiBjbGFzcz0ibGVmdFBhcmVudGhlc2lzMSI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaW5zdFZhciI+Y2VsbHM8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5hdDo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtZXRob2RBcmciPmk8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5hdDo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtZXRob2RBcmciPmo8L3NwYW4+PHNwYW4gY2xhc3M9ImJpbmFyeSI+LTwvc3Bhbj48c3BhbiBjbGFzcz0ibnVtYmVyIj4xPC9zcGFuPjxzcGFuIGNsYXNzPSJyaWdodFBhcmVudGhlc2lzMSI+KTwvc3Bhbj4gPHNwYW4gY2xhc3M9InVuYXJ5Ij50b2dnbGVTdGF0ZTwvc3Bhbj48c3BhbiBjbGFzcz0iYmxvY2tFbmQiPl08L3NwYW4+PHNwYW4gY2xhc3M9InN0YXRlbWVudFNlcGFyYXRvciI+Ljwvc3Bhbj48YnIvPgk8c3BhbiBjbGFzcz0ibGVmdFBhcmVudGhlc2lzIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJtZXRob2RBcmciPmo8L3NwYW4+PHNwYW4gY2xhc3M9ImJpbmFyeSI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ic2VsZiI+c2VsZjwvc3Bhbj4gPHNwYW4gY2xhc3M9InVuYXJ5Ij5jZWxsc1BlclNpZGU8L3NwYW4+PHNwYW4gY2xhc3M9InJpZ2h0UGFyZW50aGVzaXMiPik8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pZlRydWU6PC9zcGFuPiA8c3BhbiBjbGFzcz0iYmxvY2tTdGFydCI+Wzwvc3Bhbj48c3BhbiBjbGFzcz0ibGVmdFBhcmVudGhlc2lzMSI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaW5zdFZhciI+Y2VsbHM8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5hdDo8L3NwYW4+PHNwYW4gY2xhc3M9Im1ldGhvZEFyZyI+aTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmF0Ojwvc3Bhbj48c3BhbiBjbGFzcz0ibWV0aG9kQXJnIj5qPC9zcGFuPjxzcGFuIGNsYXNzPSJiaW5hcnkiPis8L3NwYW4+PHNwYW4gY2xhc3M9Im51bWJlciI+MTwvc3Bhbj48c3BhbiBjbGFzcz0icmlnaHRQYXJlbnRoZXNpczEiPik8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+dG9nZ2xlU3RhdGU8L3NwYW4+PHNwYW4gY2xhc3M9ImJsb2NrRW5kIj5dPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+PGJyLz4JIA==","cellsPerSide":"PHNwYW4gY2xhc3M9InBhdHRlcm5VbmFyeSI+Y2VsbHNQZXJTaWRlPC9zcGFuPiA8YnIvPgk8c3BhbiBjbGFzcz0iY29tbWVudCI+JnF1b3Q7VGhlIG51bWJlciBvZiBjZWxscyBhbG9uZyBlYWNoIHNpZGUgb2YgdGhlIGdhbWUmcXVvdDs8L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InJldHVybiI+Xjwvc3Bhbj4gPHNwYW4gY2xhc3M9Im51bWJlciI+MTA8L3NwYW4+PHNwYW4gY2xhc3M9InN0YXRlbWVudFNlcGFyYXRvciI+Ljwvc3Bhbj4=","initialize":"PHNwYW4gY2xhc3M9InVuZGVmaW5lZElkZW50aWZpZXIiPmluaXRpYWxpemU8L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9ImJpbmFyeSI+fDwvc3Bhbj48c3BhbiBjbGFzcz0idW5kZWZpbmVkSWRlbnRpZmllciI+c2FtcGxlQ2VsbDwvc3Bhbj4gPHNwYW4gY2xhc3M9InVuYXJ5Ij53aWR0aDwvc3Bhbj4gPHNwYW4gY2xhc3M9InVuYXJ5Ij5oZWlnaHQ8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+bjwvc3Bhbj48c3BhbiBjbGFzcz0iYmluYXJ5Ij58PC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJzdXBlciI+c3VwZXI8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+aW5pdGlhbGl6ZTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RhdGVtZW50U2VwYXJhdG9yIj4uPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJpbmNvbXBsZXRlSWRlbnRpZmllciI+bjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImFuc2lBc3NpZ25tZW50Ij46PTwvc3Bhbj4gPHNwYW4gY2xhc3M9InNlbGYiPnNlbGY8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+Y2VsbHNQZXJTaWRlPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InVuZGVmaW5lZElkZW50aWZpZXIiPnNhbXBsZUNlbGw8L3NwYW4+IDxzcGFuIGNsYXNzPSJhbnNpQXNzaWdubWVudCI+Oj08L3NwYW4+IDxzcGFuIGNsYXNzPSJnbG9iYWxWYXIiPkxPQ2VsbDwvc3Bhbj4gPHNwYW4gY2xhc3M9InVuYXJ5Ij5uZXc8L3NwYW4+PHNwYW4gY2xhc3M9InN0YXRlbWVudFNlcGFyYXRvciI+Ljwvc3Bhbj48YnIvPgk8c3BhbiBjbGFzcz0idW5kZWZpbmVkSWRlbnRpZmllciI+d2lkdGg8L3NwYW4+IDxzcGFuIGNsYXNzPSJhbnNpQXNzaWdubWVudCI+Oj08L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmRlZmluZWRJZGVudGlmaWVyIj5zYW1wbGVDZWxsPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPndpZHRoPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InVuZGVmaW5lZElkZW50aWZpZXIiPmhlaWdodDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImFuc2lBc3NpZ25tZW50Ij46PTwvc3Bhbj4gPHNwYW4gY2xhc3M9InVuZGVmaW5lZElkZW50aWZpZXIiPnNhbXBsZUNlbGw8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+aGVpZ2h0PC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InNlbGYiPnNlbGY8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5ib3VuZHM6PC9zcGFuPiA8c3BhbiBjbGFzcz0ibGVmdFBhcmVudGhlc2lzIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJudW1iZXIiPjU8L3NwYW4+PHNwYW4gY2xhc3M9ImJpbmFyeSI+QDwvc3Bhbj48c3BhbiBjbGFzcz0ibnVtYmVyIj41PC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+ZXh0ZW50Ojwvc3Bhbj4gPHNwYW4gY2xhc3M9ImxlZnRQYXJlbnRoZXNpczEiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImxlZnRQYXJlbnRoZXNpczIiPig8L3NwYW4+PHNwYW4gY2xhc3M9InVuZGVmaW5lZElkZW50aWZpZXIiPndpZHRoPC9zcGFuPiA8c3BhbiBjbGFzcz0iYmluYXJ5Ij4rPC9zcGFuPiA8c3BhbiBjbGFzcz0iaW5jb21wbGV0ZUlkZW50aWZpZXIiPm48L3NwYW4+PHNwYW4gY2xhc3M9InJpZ2h0UGFyZW50aGVzaXMyIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0iYmluYXJ5Ij5APC9zcGFuPiA8c3BhbiBjbGFzcz0ibGVmdFBhcmVudGhlc2lzMiI+KDwvc3Bhbj48c3BhbiBjbGFzcz0idW5kZWZpbmVkSWRlbnRpZmllciI+aGVpZ2h0PC9zcGFuPiA8c3BhbiBjbGFzcz0iYmluYXJ5Ij4rPC9zcGFuPiA8c3BhbiBjbGFzcz0iaW5jb21wbGV0ZUlkZW50aWZpZXIiPm48L3NwYW4+PHNwYW4gY2xhc3M9InJpZ2h0UGFyZW50aGVzaXMyIj4pPC9zcGFuPjxzcGFuIGNsYXNzPSJyaWdodFBhcmVudGhlc2lzMSI+KTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImJpbmFyeSI+Kzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImxlZnRQYXJlbnRoZXNpczEiPig8L3NwYW4+PHNwYW4gY2xhc3M9Im51bWJlciI+Mjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImJpbmFyeSI+Kjwvc3Bhbj4gPHNwYW4gY2xhc3M9InNlbGYiPnNlbGY8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+Ym9yZGVyV2lkdGg8L3NwYW4+PHNwYW4gY2xhc3M9InJpZ2h0UGFyZW50aGVzaXMxIj4pPC9zcGFuPjxzcGFuIGNsYXNzPSJyaWdodFBhcmVudGhlc2lzIj4pPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9Imluc3RWYXIiPmNlbGxzPC9zcGFuPiA8c3BhbiBjbGFzcz0iYW5zaUFzc2lnbm1lbnQiPjo9PC9zcGFuPiA8c3BhbiBjbGFzcz0iZ2xvYmFsVmFyIj5NYXRyaXg8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5uZXc6PC9zcGFuPiA8c3BhbiBjbGFzcz0iaW5jb21wbGV0ZUlkZW50aWZpZXIiPm48L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj50YWJ1bGF0ZTo8L3NwYW4+IDxzcGFuIGNsYXNzPSJibG9ja1N0YXJ0Ij5bPC9zcGFuPjxzcGFuIGNsYXNzPSJibG9ja0FyZ0NvbG9uIj46PC9zcGFuPjxzcGFuIGNsYXNzPSJibG9ja1BhdHRlcm5BcmciPmk8L3NwYW4+IDxzcGFuIGNsYXNzPSJibG9ja0FyZ0NvbG9uIj46PC9zcGFuPjxzcGFuIGNsYXNzPSJibG9ja1BhdHRlcm5BcmciPmo8L3NwYW4+IDxzcGFuIGNsYXNzPSJibG9ja0FyZ3NCYXIiPnw8L3NwYW4+IDxzcGFuIGNsYXNzPSJzZWxmIj5zZWxmPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+bmV3Q2VsbEF0Ojwvc3Bhbj4gPHNwYW4gY2xhc3M9ImJsb2NrQXJnIj5pPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+YXQ6PC9zcGFuPiA8c3BhbiBjbGFzcz0iYmxvY2tBcmciPmo8L3NwYW4+PHNwYW4gY2xhc3M9ImJsb2NrRW5kIj5dPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+","newCellAt:at:":"PHNwYW4gY2xhc3M9InBhdHRlcm5LZXl3b3JkIj5uZXdDZWxsQXQ6PC9zcGFuPiA8c3BhbiBjbGFzcz0icGF0dGVybkFyZyI+aTwvc3Bhbj4gPHNwYW4gY2xhc3M9InBhdHRlcm5LZXl3b3JkIj5hdDo8L3NwYW4+IDxzcGFuIGNsYXNzPSJwYXR0ZXJuQXJnIj5qPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJjb21tZW50Ij4mcXVvdDtDcmVhdGUgYSBjZWxsIGZvciBwb3NpdGlvbiAoaSxqKSBhbmQgYWRkIGl0IHRvIG15IG9uLXNjcmVlbjxici8+CXJlcHJlc2VudGF0aW9uIGF0IHRoZSBhcHByb3ByaWF0ZSBzY3JlZW4gcG9zaXRpb24uIEFuc3dlciB0aGUgbmV3IGNlbGwmcXVvdDs8L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9Im1ldGhvZFRlbXBCYXIiPnw8L3NwYW4+PHNwYW4gY2xhc3M9InBhdHRlcm5UZW1wVmFyIj5jPC9zcGFuPiA8c3BhbiBjbGFzcz0icGF0dGVyblRlbXBWYXIiPm9yaWdpbjwvc3Bhbj48c3BhbiBjbGFzcz0ibWV0aG9kVGVtcEJhciI+fDwvc3Bhbj48YnIvPgk8c3BhbiBjbGFzcz0idGVtcFZhciI+Yzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImFuc2lBc3NpZ25tZW50Ij46PTwvc3Bhbj4gPHNwYW4gY2xhc3M9Imdsb2JhbFZhciI+TE9DZWxsPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPm5ldzwvc3Bhbj48c3BhbiBjbGFzcz0ic3RhdGVtZW50U2VwYXJhdG9yIj4uPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJ0ZW1wVmFyIj5vcmlnaW48L3NwYW4+IDxzcGFuIGNsYXNzPSJhbnNpQXNzaWdubWVudCI+Oj08L3NwYW4+IDxzcGFuIGNsYXNzPSJzZWxmIj5zZWxmPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPmlubmVyQm91bmRzPC9zcGFuPiA8c3BhbiBjbGFzcz0idW5hcnkiPm9yaWdpbjwvc3Bhbj48c3BhbiBjbGFzcz0ic3RhdGVtZW50U2VwYXJhdG9yIj4uPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJzZWxmIj5zZWxmPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+YWRkTW9ycGg6PC9zcGFuPiA8c3BhbiBjbGFzcz0idGVtcFZhciI+Yzwvc3Bhbj48c3BhbiBjbGFzcz0ic3RhdGVtZW50U2VwYXJhdG9yIj4uPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJ0ZW1wVmFyIj5jPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cG9zaXRpb246PC9zcGFuPiA8c3BhbiBjbGFzcz0ibGVmdFBhcmVudGhlc2lzIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJsZWZ0UGFyZW50aGVzaXMxIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJtZXRob2RBcmciPmk8L3NwYW4+IDxzcGFuIGNsYXNzPSJiaW5hcnkiPi08L3NwYW4+IDxzcGFuIGNsYXNzPSJudW1iZXIiPjE8L3NwYW4+PHNwYW4gY2xhc3M9InJpZ2h0UGFyZW50aGVzaXMxIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0iYmluYXJ5Ij4qPC9zcGFuPiA8c3BhbiBjbGFzcz0idGVtcFZhciI+Yzwvc3Bhbj4gPHNwYW4gY2xhc3M9InVuYXJ5Ij53aWR0aDwvc3Bhbj48c3BhbiBjbGFzcz0icmlnaHRQYXJlbnRoZXNpcyI+KTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImJpbmFyeSI+QDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImxlZnRQYXJlbnRoZXNpcyI+KDwvc3Bhbj48c3BhbiBjbGFzcz0ibGVmdFBhcmVudGhlc2lzMSI+KDwvc3Bhbj48c3BhbiBjbGFzcz0ibWV0aG9kQXJnIj5qPC9zcGFuPiA8c3BhbiBjbGFzcz0iYmluYXJ5Ij4tPC9zcGFuPiA8c3BhbiBjbGFzcz0ibnVtYmVyIj4xPC9zcGFuPjxzcGFuIGNsYXNzPSJyaWdodFBhcmVudGhlc2lzMSI+KTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImJpbmFyeSI+Kjwvc3Bhbj4gPHNwYW4gY2xhc3M9InRlbXBWYXIiPmM8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1bmFyeSI+aGVpZ2h0PC9zcGFuPjxzcGFuIGNsYXNzPSJyaWdodFBhcmVudGhlc2lzIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0iYmluYXJ5Ij4rPC9zcGFuPiA8c3BhbiBjbGFzcz0idGVtcFZhciI+b3JpZ2luPC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0ZW1lbnRTZXBhcmF0b3IiPi48L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9InRlbXBWYXIiPmM8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5tb3VzZUFjdGlvbjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJibG9ja1N0YXJ0Ij5bPC9zcGFuPjxzcGFuIGNsYXNzPSJzZWxmIj5zZWxmPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+dG9nZ2xlTmVpZ2hib3Vyc09mQ2VsbEF0Ojwvc3Bhbj4gPHNwYW4gY2xhc3M9Im1ldGhvZEFyZyI+aTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmF0Ojwvc3Bhbj4gPHNwYW4gY2xhc3M9Im1ldGhvZEFyZyI+ajwvc3Bhbj48c3BhbiBjbGFzcz0iYmxvY2tFbmQiPl08L3NwYW4+PHNwYW4gY2xhc3M9InN0YXRlbWVudFNlcGFyYXRvciI+Ljwvc3Bhbj4gPGJyLz4JPHNwYW4gY2xhc3M9InJldHVybiI+Xjwvc3Bhbj4gPHNwYW4gY2xhc3M9InRlbXBWYXIiPmM8L3NwYW4+"},"definition":"PHNwYW4gY2xhc3M9Imdsb2JhbFZhciI+Qm9yZGVyZWRNb3JwaDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN1YmNsYXNzOjwvc3Bhbj4gPHNwYW4gY2xhc3M9InN5bWJvbCI+Izwvc3Bhbj48c3BhbiBjbGFzcz0ic3ltYm9sIj5MT0dhbWU8L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9ImtleXdvcmQiPmluc3RhbmNlVmFyaWFibGVOYW1lczo8L3NwYW4+IDxzcGFuIGNsYXNzPSJzdHJpbmciPidjZWxscyc8L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNsYXNzVmFyaWFibGVOYW1lczo8L3NwYW4+IDxzcGFuIGNsYXNzPSJzdHJpbmciPicnPC9zcGFuPjxici8+CTxzcGFuIGNsYXNzPSJrZXl3b3JkIj5wb29sRGljdGlvbmFyaWVzOjwvc3Bhbj4gPHNwYW4gY2xhc3M9InN0cmluZyI+Jyc8L3NwYW4+PGJyLz4JPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNhdGVnb3J5Ojwvc3Bhbj4gPHNwYW4gY2xhc3M9InN0cmluZyI+J1BCRS1MaWdodHNPdXQnPC9zcGFuPg==","cmethods":{},"doc":"QSBMT0dhbWUgaXMgeHh4eHh4eHh4Lg0NSW5zdGFuY2UgVmFyaWFibGVzDQljZWxsczoJCTxPYmplY3Q+DQ1jZWxscw0JLSB4eHh4eA0=","class":"LOGame"}');&lt;/script&gt;&lt;br /&gt;Follow the Lights Out game exercise from the book &lt;a href="http://pharobyexample.org/"&gt;Pharo By Example&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Browse the code of &lt;a href="http://slbrowserfb.appspot.com/code/pharo/1.1/LOCell" class="slbrowser"&gt;LOCell&lt;/a&gt; and &lt;a href="http://slbrowserfb.appspot.com/code/pharo/1.1/LOGame" class="slbrowser"&gt;LOGame&lt;/a&gt; classes. (Thanks Christoph for the &lt;a href="http://slbrowserfb.appspot.com/"&gt;browser for blogs&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Download screencast (1260x788): &lt;a href="http://lolgzs.free.fr/pharocasts/PBE-LightsOut.mpg"&gt; .mpg 85.7 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/PBE-LightsOut.mov"&gt; .mov 67.4 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/16442071"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/16442071?portrait=0" width="640" height="400" frameborder="0"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-2955932680436043089?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/2955932680436043089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/11/lightsout-game.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2955932680436043089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2955932680436043089'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/11/lightsout-game.html' title='LightsOut game'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-5890656350329975403</id><published>2010-10-21T13:41:00.000-07:00</published><updated>2011-04-02T23:13:10.192-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install pharo'/><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><title type='text'>Install Pharo on OSX</title><content type='html'>You will learn how to select your chosen Pharo image and Squeak Virtual Machine versions.&lt;br /&gt;&lt;br /&gt;See also: &lt;br /&gt;&lt;a href="http://www.pharocasts.com/2010/08/install-pharo-on-windows.html"&gt;Install Pharo on Windows&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pharocasts.blogspot.com/2010/07/pharo-install.html"&gt;Start Pharo on GNU/Linux&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download screencast (1680x1050): &lt;a href="http://lolgzs.free.fr/pharocasts/osx_install.mpg"&gt; .mpg 18.4 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/osx_install.mov"&gt; .mov 25.5 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/16070210"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="400" src="http://player.vimeo.com/video/16070210?portrait=0" width="640"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-5890656350329975403?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/5890656350329975403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/10/install-pharo-on-osx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/5890656350329975403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/5890656350329975403'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/10/install-pharo-on-osx.html' title='Install Pharo on OSX'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-1034621401275276693</id><published>2010-10-03T13:04:00.002-07:00</published><updated>2010-10-03T13:18:19.689-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Getting started with Pier CMS</title><content type='html'>&lt;a href="http://www.piercms.com/"&gt;Pier&lt;/a&gt; is a content management system that is light, flexible and free. &lt;br /&gt;&lt;br /&gt;This screencast shows &lt;ul&gt;&lt;li&gt;how to setup Pier for a minimal web site&lt;/li&gt;&lt;li&gt;configure persistency.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Download screencast (892x642): &lt;a href="http://lolgzs.free.fr/pharocasts/pier_getting_started.mpeg"&gt; .mpeg 5.5 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/pier_getting_started.mov"&gt; .mov 17.6 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Recorded by &lt;a href="http://damiencassou.seasidehosting.st/"&gt;Damien Cassou&lt;/a&gt;.&lt;br /&gt;Voice by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/15509037"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="480" src="http://player.vimeo.com/video/15509037?portrait=0" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.piercms.com/download"&gt;Download the Pier OneClick image&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-1034621401275276693?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/1034621401275276693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/10/getting-started-with-pier-cms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/1034621401275276693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/1034621401275276693'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/10/getting-started-with-pier-cms.html' title='Getting started with Pier CMS'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-2298845065011168819</id><published>2010-09-19T13:26:00.000-07:00</published><updated>2010-12-12T23:55:28.152-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Document with HelpSystem</title><content type='html'>&lt;a href="http://www.squeaksource.com/HelpSystem.html"&gt;HelpSystem&lt;/a&gt; is a documentation framework written by &lt;a href="http://astares.blogspot.com/"&gt;Torsten Bergmann&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You will learn how to:&lt;ul&gt;&lt;li&gt;write an HelpSystem book&lt;/li&gt;&lt;li&gt;use PackageAPIHelpBuilder to generate the API documentation of a package&lt;/li&gt;&lt;li&gt;create your own builder to dynamically create a documentation from the system&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/helpsystem.mpeg"&gt; .mpeg 12.2 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/helpsystem.mov"&gt; .mov 79.9 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voice recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/15104198"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="480" src="http://player.vimeo.com/video/15104198?portrait=0" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;You can download the updated ProfStef packages to get the source code of this screencast&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;&lt;br /&gt;Gofer new&lt;br /&gt;  squeaksource:'MetacelloRepository';&lt;br /&gt;  package:'ConfigurationOfProfStef';&lt;br /&gt;  load.&lt;br /&gt;&lt;br /&gt;ConfigurationOfProfStef project latestVersion load.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Another cool snippet from Torsten to browse IRC logs:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;|topic day url sub| &lt;br /&gt;topic := HelpTopic named: 'Last week on Squeak IRC'. &lt;br /&gt;0 to: 7 do: [:index | &lt;br /&gt;  day := (Date today subtractDays: index) printFormat: #(3 2 1 $. 1 2 2). &lt;br /&gt;  url := 'http://tunes.org/~nef/logs/squeak/' , day. &lt;br /&gt;  sub := HelpTopic &lt;br /&gt;    title: day contents: (HTTPLoader default retrieveContentsFor: url) contents. &lt;br /&gt;    topic addSubtopic: sub. &lt;br /&gt;]. &lt;br /&gt;HelpBrowser openOn: topic &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-2298845065011168819?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/2298845065011168819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/09/document-with-helpsystem.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2298845065011168819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2298845065011168819'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/09/document-with-helpsystem.html' title='Document with HelpSystem'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-4931597576672873006</id><published>2010-09-03T13:09:00.000-07:00</published><updated>2010-09-03T23:50:54.145-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Deploy Seaside with Cherokee Web Server</title><content type='html'>Learn how to&lt;br /&gt;&lt;ul&gt;&lt;li&gt;install &lt;a href="http://www.cherokee-project.com/"&gt;Cherokee Web Server&lt;/a&gt; on &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu Linux&lt;/a&gt; through &lt;a href="https://launchpad.net/~cherokee-webserver/+archive/ppa"&gt;Launchpad&lt;/a&gt;&lt;/li&gt;&lt;li&gt;configure Cherokee to serve static files for a &lt;a href="http://www.seaside.st/"&gt;Seaside&lt;/a&gt; application&lt;/li&gt;&lt;li&gt;start an headless Seaside image&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/cherokee_v2.avi"&gt;.avi 51.1 MB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/14679673"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; If you have any suggestions for improvement, Cherokee + Seaside tips and tricks you want to share or saw something that is plain wrong or could be described in more detail to make it easier to understand, feel free to add a comment and we will update the screencast accordingly to improve it.&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="480" src="http://player.vimeo.com/video/14679673?portrait=0" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Install Cherokee on Ubuntu:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="bash"&gt;sudo add-apt-repository ppa:cherokee-webserver/ppa&lt;br /&gt;sudo apt-get update&lt;br /&gt;sudo apt-get install cherokee&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;A tip for users of &lt;a href="http://www.linode.com/"&gt;Linode&lt;/a&gt; and possibly other VPS providers that provide a stripped down server version of Ubuntu: if the add-apt-repository command doesn't work, you need to install an additional package first with:&lt;br /&gt;&lt;pre&gt;&lt;code class="bash"&gt;sudo apt-get install python-software-properties&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Seaside startup script, runseaside:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="bash"&gt;#!/bin/bash&lt;br /&gt;cd /path/to/folder/with/seaside/image/&lt;br /&gt;/path/to/pharo/virtual/machine/executable -vm-display-null seaside.image&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For other Seaside deployment options, see&lt;ul&gt;&lt;li&gt;&lt;a href="http://book.seaside.st/book/advanced/deployment"&gt;Deployment chapter&lt;/a&gt; of book &lt;a href="http://book.seaside.st/"&gt;Dynamic Web development with Seaside&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.doit.st/2010/08/29/a-new-public-ec2-ami-with-smalltalk-and-seaside/"&gt;Tutorial to deploy Pharo and Seaside&lt;/a&gt; on Amazon EC2.&lt;/li&gt;&lt;li&gt;&lt;a href="http://pharocasts.blogspot.com/2010/01/deploy-on-seaside-hosting.html"&gt;Deploy on SeasideHosting screencast&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-4931597576672873006?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/4931597576672873006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/09/deploy-seaside-with-cherokee-web-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4931597576672873006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4931597576672873006'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/09/deploy-seaside-with-cherokee-web-server.html' title='Deploy Seaside with Cherokee Web Server'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-5423289270493895584</id><published>2010-08-20T12:20:00.000-07:00</published><updated>2011-04-02T23:13:45.429-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install pharo'/><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><title type='text'>Install Pharo on Windows</title><content type='html'>You will learn how to select your chosen Pharo image and Squeak Virtual Machine versions.&lt;br /&gt;&lt;br /&gt;See also: &lt;br /&gt;&lt;a href="http://pharocasts.blogspot.com/2010/07/pharo-install.html"&gt;Start Pharo on GNU/Linux&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pharocasts.com/2010/10/install-pharo-on-osx.html"&gt;Install Pharo on OSX&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/pharowin.mpeg"&gt; .mpeg 14.5 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/pharowin.mov"&gt; .mov 21.8 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/14301726"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/14301726?portrait=0" width="640" height="480" frameborder="0"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-5423289270493895584?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/5423289270493895584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/08/install-pharo-on-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/5423289270493895584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/5423289270493895584'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/08/install-pharo-on-windows.html' title='Install Pharo on Windows'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-1153955963593126978</id><published>2010-08-15T13:55:00.000-07:00</published><updated>2012-01-16T11:46:29.550-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='morphic'/><title type='text'>Display Picasa photos</title><content type='html'>See:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;how to get data from an URL&lt;/li&gt;&lt;li&gt;parse XML documents&lt;/li&gt;&lt;li&gt;build a GUI to display photos with Polymorph&lt;/li&gt;&lt;li&gt;how to prototype quickly with debugger and inspector&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/picasa.mpeg"&gt; .mpeg 16.7 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/picasa.mov"&gt; .mov 40.4 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voice recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/14163293"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=14163293&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=14163293&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/apis/picasaweb/docs/2.0/developers_guide_protocol.html#ListPhotos"&gt;Picasa API documentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load XMLSupport:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;    squeaksource: 'MetacelloRepository';&lt;br /&gt;    package: 'ConfigurationOfXMLSupport';&lt;br /&gt;    load.&lt;br /&gt;&lt;br /&gt;ConfigurationOfXMLSupport load.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Final code&lt;/b&gt;:&lt;br/&gt;Update 16/01/2012: the snippet is a little obsolete (see tongadall comment below). Now should be:&lt;pre&gt;&lt;code class="smalltalk"&gt;...&lt;br /&gt;xmlDoc allElementsNamed: #entry do: &lt;br /&gt;              [:entry| |title photoUrl|&lt;br /&gt;              title := (entry findElementNamed: #title) contentString.&lt;br /&gt;              photoUrl := (entry findElementNamed: #content) attributeAt: #src.&lt;br /&gt;...&lt;/code&gt;&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;|xmlStream xmlDoc photos builder|&lt;br /&gt;xmlStream := 'http://picasaweb.google.com/data/feed/api/all?q=miles+davis&amp;amp;max-results=10' asUrl retrieveContents contentStream.&lt;br /&gt;xmlDoc := XMLDOMParser parseDocumentFrom: xmlStream.&lt;br /&gt;&lt;br /&gt;photos := OrderedCollection new.&lt;br /&gt;xmlDoc tagsNamed: #entry do: &lt;br /&gt;              [:entry| |title photoUrl|&lt;br /&gt;               title := (entry firstTagNamed: #title) characterData.&lt;br /&gt;               photoUrl := (entry firstTagNamed: #content) attributeAt: #src.&lt;br /&gt;               photos add: (PicasaPhoto new&lt;br /&gt;                                   title: title;&lt;br /&gt;                                   photoUrl: photoUrl)].&lt;br /&gt;&lt;br /&gt;builder := UITheme builder.&lt;br /&gt;(builder &lt;br /&gt;    newRow: (photos collect: &lt;br /&gt;                     [:aPhoto|  &lt;br /&gt;                      builder newColumn: {&lt;br /&gt;                         builder newImage: aPhoto asForm  size: 128@128.&lt;br /&gt;                         builder newLabel: aPhoto title.}]))&lt;br /&gt;extent: 500@400;&lt;br /&gt;wrapDirection: #topToBottom;&lt;br /&gt;openInWindow.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;The Flickr version (Thanks Gary !)&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;| xmlStream xmlDoc photos builder clickBlock |&lt;br /&gt;xmlStream := 'http://api.flickr.com/services/feeds/photos_public.gne?id=12018791@N06&amp;amp;lang=en-us&amp;amp;format=rss_200' asUrl retrieveContents contentStream.&lt;br /&gt;xmlDoc := XMLDOMParser parseDocumentFrom: xmlStream.&lt;br /&gt;&lt;br /&gt;photos := OrderedCollection new.&lt;br /&gt;xmlDoc tagsNamed: #item do:&lt;br /&gt;   [:item| | title thumbUrl photoUrl |&lt;br /&gt;    title := (item firstTagNamed: #title) characterData.&lt;br /&gt;    thumbUrl := ((item firstTagNamed: #media:thumbnail) attributeAt: #url) asUrl.&lt;br /&gt;    photoUrl := ((item firstTagNamed: #media:content) attributeAt: #url) asUrl.&lt;br /&gt;    photos add: title -&amp;gt; (Form fromBinaryStream: thumbUrl retrieveContents contentStream) -&amp;gt; photoUrl].&lt;br /&gt;&lt;br /&gt;clickBlock := [:url :title | | scrollPane |&lt;br /&gt;scrollPane := GeneralScrollPane new&lt;br /&gt; scrollTarget: (builder&lt;br /&gt; newImage: (Form fromBinaryStream: url retrieveContents contentStream)).&lt;br /&gt;scrollPane openInWindow&lt;br /&gt; setLabel: title;&lt;br /&gt; extent: 600@400.&lt;br /&gt;scrollPane color: Color transparent].&lt;br /&gt;&lt;br /&gt;builder := UITheme builder.&lt;br /&gt;((builder&lt;br /&gt;  newRow: (photos collect:&lt;br /&gt;                   [:aPhoto|&lt;br /&gt;                    (builder&lt;br /&gt;   newButtonFor: clickBlock&lt;br /&gt;   getState: nil&lt;br /&gt;   action: #value:value:&lt;br /&gt;   arguments: {aPhoto value. aPhoto key key}&lt;br /&gt;   getEnabled: nil&lt;br /&gt;   label: ((builder newColumn: {&lt;br /&gt;     builder newImage: aPhoto key value.&lt;br /&gt;     builder newLabel: aPhoto key key})&lt;br /&gt;     cellPositioning: #center;&lt;br /&gt;     layoutInset: 10)&lt;br /&gt;   help: nil)]))&lt;br /&gt;wrapDirection: #topToBottom;&lt;br /&gt;openInWindow)&lt;br /&gt; setLabel: (xmlDoc firstTagNamed: #title) characterData;&lt;br /&gt; extent: 700@680.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_JLK6EDfW4so/TGmAxrn6ZtI/AAAAAAAAAfQ/2hm7fgvC07s/s1600/flickr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="428" src="http://4.bp.blogspot.com/_JLK6EDfW4so/TGmAxrn6ZtI/AAAAAAAAAfQ/2hm7fgvC07s/s640/flickr.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-1153955963593126978?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/1153955963593126978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/08/see-how-to-get-data-from-url-parse-xml.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/1153955963593126978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/1153955963593126978'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/08/see-how-to-get-data-from-url-parse-xml.html' title='Display Picasa photos'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JLK6EDfW4so/TGmAxrn6ZtI/AAAAAAAAAfQ/2hm7fgvC07s/s72-c/flickr.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-3448133897815731894</id><published>2010-08-08T12:20:00.000-07:00</published><updated>2011-02-04T23:40:20.009-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Web application testing through Selenium-RC</title><content type='html'>&lt;a href="http://squeaksource.com/WebTester.html"&gt;WebTester&lt;/a&gt; is a framework to test web applications. Designed to support several testing systems, it actually provides an implementation which uses &lt;a href="http://selenium-rc.seleniumhq.org/"&gt;Selenium RC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can test any web application with it; but if you are developing Seaside applications you can take a component (any component), and unit test that component.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/webtester.mpeg"&gt; .mpeg 15.0 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/webtester.mov"&gt; .mov 36.9 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/m/#/13973846"&gt;View mobile version.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voice recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="480"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13973846&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=13973846&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load WebTester (note that it loads Seaside 3.0-rc):&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;    squeaksource: 'MetacelloRepository';&lt;br /&gt;    package: 'ConfigurationOfWebTester';&lt;br /&gt;    load.&lt;br /&gt;&lt;br /&gt;(ConfigurationOfAutotest project version:'1.1') load.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A WebTester session example&lt;/b&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;|tester searchButton searchField|&lt;br /&gt;tester := WtSeleniumWebTester new.&lt;br /&gt;tester&lt;br /&gt;    appRoot: 'http://pharo-project.org';&lt;br /&gt;    browserType: '*firefox';&lt;br /&gt;    start;&lt;br /&gt;    openUrl: '/'.&lt;br /&gt;&lt;br /&gt;searchField := tester textFieldById: 'searchfield'.&lt;br /&gt;self assert: searchField isPresent.&lt;br /&gt;&lt;br /&gt;searchButton := tester buttonByXPath: '//input[@title=''Search'']'.&lt;br /&gt;self assert: searchButton isPresent.&lt;br /&gt;&lt;br /&gt;searchField text: 'screencasts'.&lt;br /&gt;searchButton click.&lt;br /&gt;tester waitForPageToLoad.&lt;br /&gt;self assert: (tester isTextPresent:'pharocasts').&lt;br /&gt;&lt;br /&gt;tester stop.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-3448133897815731894?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/3448133897815731894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/08/web-application-testing-through.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/3448133897815731894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/3448133897815731894'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/08/web-application-testing-through.html' title='Web application testing through Selenium-RC'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-1584715515022194609</id><published>2010-07-20T14:42:00.000-07:00</published><updated>2011-02-15T07:56:56.379-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packages'/><category scheme='http://www.blogger.com/atom/ns#' term='monticello'/><category scheme='http://www.blogger.com/atom/ns#' term='metacello'/><title type='text'>Monticello and Metacello introduction</title><content type='html'>Here you will learn how to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create a &lt;a href="http://squeaksource.com/"&gt;SqueakSource&lt;/a&gt; repository&lt;/li&gt;&lt;li&gt;create packages and upload them to &lt;a href="http://squeaksource.com/"&gt;SqueakSource&lt;/a&gt;&lt;/li&gt;&lt;li&gt;create a &lt;a href="http://code.google.com/p/metacello/"&gt;Metacello&lt;/a&gt; configuration to manage dependencies between packages&lt;/li&gt;&lt;li&gt;load packages using &lt;a href="http://code.google.com/p/metacello/"&gt;Metacello&lt;/a&gt; ConfigurationOfXXX and &lt;a href="http://www.lukas-renggli.ch/blog/gofer"&gt;Gofer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;A &lt;a href="https://gforge.inria.fr/frs/download.php/27018/Monticello.pdf"&gt;draft chapter on Monticello&lt;/a&gt; is available on&amp;nbsp;&lt;a href="http://pharobyexample.org/"&gt;Pharo By Example web site&lt;/a&gt;.&lt;br /&gt;See also the &lt;a href="http://book.pharo-project.org/book/introduction/Repository"&gt;repository section of Pharo CollaborActive book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can find a lot of configuration examples in &lt;a href="http://www.squeaksource.com/MetacelloRepository.html"&gt;Pharo Metacello Repository&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/monticello_metacello_intro.mpeg"&gt; .mpeg 52.0 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/monticello_metacello_intro.mpeg"&gt; .mov 88.5 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voice recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13497941&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=13497941&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-1584715515022194609?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/1584715515022194609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/07/monticello-and-metacello-introduction.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/1584715515022194609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/1584715515022194609'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/07/monticello-and-metacello-introduction.html' title='Monticello and Metacello introduction'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-864958275066650424</id><published>2010-07-17T14:30:00.000-07:00</published><updated>2011-04-02T23:14:07.685-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install pharo'/><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><title type='text'>Start Pharo on GNU/Linux</title><content type='html'>You will learn how to select your chosen Pharo image and Squeak Virtual Machine versions.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;a href="http://pharocasts.blogspot.com/2010/08/install-pharo-on-windows.html"&gt;Install Pharo on Windows&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://www.pharocasts.com/2010/10/install-pharo-on-osx.html"&gt;Install Pharo on OSX&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/start_pharo.mpeg"&gt; .mpeg 16.2 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/start_pharo.mov"&gt; .mov 20.2 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voice recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13419818&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=13419818&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-864958275066650424?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/864958275066650424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/07/pharo-install.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/864958275066650424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/864958275066650424'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/07/pharo-install.html' title='Start Pharo on GNU/Linux'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-9070314491637483568</id><published>2010-07-08T13:28:00.000-07:00</published><updated>2011-06-07T06:01:29.619-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Live testing with Autotest</title><content type='html'>Unit tests represents the security belt of software development. But having a security belt doesn't mean it's always fastened. You take a look at a piece code, have fun hacking it, submit the new code without checking all tests are green... it's easy to forgot there's tests here. Autotest automatically runs tests for you.&lt;br /&gt;&lt;br /&gt;Test Driven Development ensures test exhaustivity, reasonning on design and so on. You stop and run tests very often to check the health of your code. In your car you don't stop driving, hands off the wheel in order to check the speed. Autotest provides a real time dashboard so you don't stop coding.&lt;br /&gt;&lt;br /&gt;Testing is always here. Now you can drive.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/live_testing_autotest.mpeg"&gt; .mpeg 10.7 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/live_testing_autotest.mov"&gt; .mov 38.2 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voice recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 10/04/2011:&lt;/b&gt; To get OB integration in Pharo 1.2:&lt;pre&gt;&lt;code class="smalltalk"&gt;&lt;br /&gt;Gofer it &lt;br /&gt; squeaksource: 'MetacelloRepository';&lt;br /&gt; package: 'ConfigurationOfAutotest';&lt;br /&gt; load.&lt;br /&gt; &lt;br /&gt;ConfigurationOfAutotest project latestVersion load: #OB.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="480"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13188798&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=13188798&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load Autotest:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;&lt;br /&gt;Gofer new&lt;br /&gt;    squeaksource: 'Autotest';&lt;br /&gt;    package: 'ConfigurationOfAutotest';&lt;br /&gt;    load.&lt;br /&gt;&lt;br /&gt;(ConfigurationOfAutotest project version:'1.0') load: 'Dev'.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Pharo 1.1 is required. &lt;a href="https://gforge.inria.fr/frs/download.php/27254/Pharo-1.1-11409-rc4dev10.07.2.zip"&gt;Download the image&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Autotest detects a method has been modified/added using &lt;a href="http://book.pharo-project.org/book/LanguageAndLibraries/announcements/"&gt;Annoucements Framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To calculate hit count, Autotest wraps the changed method as described in &lt;a href="http://www.iam.unibe.ch/~scg/Archive/Papers/Bergel06bRDLPrototyping.pdf"&gt;Prototyping Languages Related Constructs and Tools with Squeak&lt;/a&gt; by Alexandre Bergel and Marcus Denker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-9070314491637483568?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/9070314491637483568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/07/live-testing-with-autotest.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/9070314491637483568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/9070314491637483568'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/07/live-testing-with-autotest.html' title='Live testing with Autotest'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-3476907691477957365</id><published>2010-06-23T01:03:00.000-07:00</published><updated>2011-04-18T13:28:38.149-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='contribute'/><category scheme='http://www.blogger.com/atom/ns#' term='world menu'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>How to contribute to Pharo</title><content type='html'>Learn how to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;choose an issue to fix from the &lt;a href="http://code.google.com/p/pharo/issues/list"&gt;Pharo issue tracking&lt;/a&gt;&lt;/li&gt;&lt;li&gt;create and send a slice with your fix&lt;/li&gt;&lt;li&gt;add entries into the World Menu&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Code must be sent as a SLICE named &lt;b&gt;SLICE-Issue-xxxx-description&lt;/b&gt;. Patrick Barroca and Stéphane Ducasse have added a &lt;b&gt;+Slice&lt;/b&gt; button in Pharo 1.1 to ensure this convention.&lt;br /&gt;&lt;br /&gt;For more informations on the contribution process, read &lt;a href="http://code.google.com/p/pharo/wiki/HowToContribute"&gt;How to contribute on Pharo wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here I show how &lt;a href="http://code.google.com/p/pharo/issues/detail?id=2582"&gt;issue #2582 (Rearrange WorldMenu)&lt;/a&gt; has been fixed, based on &lt;a href="http://book.pharo-project.org/book/CustomizingPharo/WorldMenuRegistration"&gt;WorldMenu registration chapter&lt;/a&gt; in the &lt;a href="http://book.pharo-project.org/"&gt;Pharo CollaborActive book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE&lt;/b&gt;: Thousand thanks to Christoph Budzinski who recorded his voice on the screencast.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/contribute_and_world_menu.mpeg"&gt; .mpeg 9.5 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/contribute_and_world_menu.mov"&gt; .mov 22.7 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12860690&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=12860690&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I keep the former screencast as it shows RealEstateAgent which controls how windows appear on screen.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/pharo_how_to_contribute.mpeg"&gt; .mpeg 15.8 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/pharo_how_to_contribute.mov"&gt; .mov 18.2 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Recorded with Stéphane Ducasse who can eat an ice cream and a big waffle with chocolate at the same time.&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10155508&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10155508&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-3476907691477957365?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/3476907691477957365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/03/how-to-contribute-to-pharo.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/3476907691477957365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/3476907691477957365'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/03/how-to-contribute-to-pharo.html' title='How to contribute to Pharo'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-7719001387526209942</id><published>2010-06-06T12:28:00.000-07:00</published><updated>2010-08-08T00:53:22.543-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>Proportional layout</title><content type='html'>Here I show the proportional layout mechanisms of SystemWindow. This is based on the &lt;a href="http://book.pharo-project.org/book/GUI/PolymorphTutorial/Layout"&gt;Layout section of the Pharo CollaborActive book&lt;/a&gt; written with the help of &lt;a href="http://blog.ofset.org/hilaire/"&gt;Hilaire Fernandes&lt;/a&gt; (more to come).&lt;br /&gt;&lt;br /&gt;You will also learn to use &lt;a href="http://www.squeaksource.com/ScriptManager.html"&gt;Script Manager&lt;/a&gt;, an enhanced Workspace written by Joseph Pelrine.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I use &lt;a href="https://gforge.inria.fr/frs/download.php/27025/Pharo-1.1-11367-Betadev10.05.1.zip"&gt;Pharo 1.1-11357 beta&lt;/a&gt;.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/proportional_layout.mpeg"&gt; .mpeg 24.4 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/proportional_layout.mov"&gt; .mov 21.1 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voice recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="480"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12339504&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=12339504&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The final code:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;&lt;br /&gt;window := SystemWindow labelled: 'Layout'.&lt;br /&gt;&lt;br /&gt;redMorph := Morph new.&lt;br /&gt;window &lt;br /&gt; addMorph: redMorph&lt;br /&gt; fullFrame: (LayoutFrame &lt;br /&gt;  fractions: (0@0 corner: 1@1)&lt;br /&gt;  offsets: (100@0 corner: 0@50 negated)).&lt;br /&gt;redMorph color: Color red.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;greenMorph := Morph new.&lt;br /&gt;window &lt;br /&gt; addMorph: greenMorph&lt;br /&gt; fullFrame: (LayoutFrame &lt;br /&gt;  fractions: (0@0 corner: 0@1)&lt;br /&gt;  offsets: (0@0 corner: 100@50 negated)).&lt;br /&gt;greenMorph color: Color green.&lt;br /&gt;&lt;br /&gt;yellowMorph := Morph new.&lt;br /&gt;window &lt;br /&gt; addMorph: yellowMorph&lt;br /&gt; fullFrame: (LayoutFrame &lt;br /&gt;  fractions: (0@1 corner: 1@1)&lt;br /&gt;  offsets: (0@50 negated corner: 0@0)).&lt;br /&gt;yellowMorph color: Color yellow.&lt;br /&gt;&lt;br /&gt;window openInWorld.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-7719001387526209942?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/7719001387526209942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/06/proportional-layout.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/7719001387526209942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/7719001387526209942'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/06/proportional-layout.html' title='Proportional layout'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-7936863228153034053</id><published>2010-05-09T09:38:00.000-07:00</published><updated>2011-02-04T23:43:49.476-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vm'/><category scheme='http://www.blogger.com/atom/ns#' term='vmmaker'/><title type='text'>Build Squeak VM on Linux</title><content type='html'>This screencast is based on dedicated chapters&amp;nbsp;in the &lt;a href="http://book.pharo-project.org/"&gt;Pharo collaboratorActive book&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://book.pharo-project.org/book/Virtual-Machine/Building/BuildVMOnLinux"&gt;Build the VM on Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://book.pharo-project.org/book/Virtual-Machine/Building/VMMakerTool/"&gt;VMMaker&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;See also the following tutorials:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javipimas.com.ar/node/2"&gt;A small guide to Squeak Object Engine Organization&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.adrian-lienhard.ch/blog?article=building-a-pharo-squeak-vm-from-first-principles"&gt;Building a Pharo/Squeak VM from first Principles&lt;/a&gt;&amp;nbsp;(for MacOSX)&lt;/li&gt;&lt;li&gt;&lt;a href="http://magaloma.blogspot.com/2010/03/how-i-build-squeak-vm-on-archlinux.html"&gt;How I build squeak vm on (Arch)Linux&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;and of course the &lt;a href="http://squeakvm.org/unix/download.html"&gt;official install guide from squeakvm.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/build_squeak_vm_on_linux2.mpeg"&gt; .mpeg 13.4 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/build_squeak_vm_on_linux2.mov"&gt; .mov 28.4 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voice recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=11582719&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=11582719&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The last version of &lt;b&gt;ConfigurationOfVMMaker&lt;/b&gt; is &lt;b&gt;1.3&lt;/b&gt;. You need revision &lt;b&gt;2202&lt;/b&gt; of squeakvm source. Note that FT2Plugin (for antialiased fonts) is built with this version.&lt;br /&gt;&lt;br /&gt;If you want to build Alien plugin (untested), you have to use ConfigurationOfVMMaker &lt;b&gt;1.4&lt;/b&gt; with  squeakvm revision &lt;b&gt;2203&lt;/b&gt; at least.&lt;br /&gt;&lt;br /&gt;The fatest way to build squeakvm on Linux is to use &lt;a href="http://github.com/lolgzs/easy_squeakvm"&gt;easy_squeakvm script&lt;/a&gt;, which automate all steps shown in this screencast.&lt;br /&gt;&lt;pre&gt;&lt;code class="bash"&gt;wget http://github.com/lolgzs/easy_squeakvm/raw/master/easy_squeakvm.sh&lt;br /&gt;./easy_squeakvm.sh&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There's also an &lt;a href="http://github.com/lolgzs/easy_squeakvm/tree/alien"&gt;Alien branch&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To checkout the trunk from Squeakvm Subversion repository(here rev. 2202)&lt;/b&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code class="bash"&gt;svn co http://squeakvm.org/svn/squeak/trunk/platforms/ -r 2202&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;or get the &lt;a href="http://squeakvm.org/unix/index.html"&gt;official release from squeakvm.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To load ConfigurationOfVMMaker 1.3 in Pharo&lt;/b&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Gofer new&lt;br /&gt; squeaksource:'MetacelloRepository';&lt;br /&gt; package:'ConfigurationOfVMMaker';&lt;br /&gt; load.&lt;br /&gt; &lt;br /&gt;(ConfigurationOfVMMaker project version:'1.3') load.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-7936863228153034053?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/7936863228153034053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/03/build-squeak-vm-on-linux.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/7936863228153034053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/7936863228153034053'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/03/build-squeak-vm-on-linux.html' title='Build Squeak VM on Linux'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-6438436501819127146</id><published>2010-05-03T23:56:00.000-07:00</published><updated>2011-02-04T23:44:11.206-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming'/><title type='text'>Dynamic finder with #doesNotUnderstand, #perform and Regex</title><content type='html'>This is the sequel to &lt;a href="http://pharocasts.blogspot.com/2010/04/sandstonedb-simple-activerecord-style.html"&gt;SandstoneDb, simple ActiveRecord style persistence&lt;/a&gt; screencast.&lt;br /&gt;&lt;br /&gt;I show how to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;override &lt;b&gt;Object#doesNotUnderstand&lt;/b&gt; in your class to answer to unknown messages&lt;/li&gt;&lt;li&gt;use regular expressions to extract substrings&lt;/li&gt;&lt;li&gt;use &lt;b&gt;#perform:&lt;/b&gt; and &lt;b&gt;#perform:with:&lt;/b&gt; to send a message dynamically&lt;/li&gt;&lt;li&gt;develop new code in the debugger without stopping current call.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;To learn about Regex in Pharo, read the (draft) &lt;a href="https://gforge.inria.fr/frs/download.php/26818/Regex.pdf"&gt;chapter for Pharo By Example 2&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/dynamic_finder.mpeg"&gt; .mpeg 23.1 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/dynamic_finder.mov"&gt; .mov 37.2 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=11455165&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=11455165&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Here's the final code of &lt;b&gt;Person#doesNotUnderstand:&lt;/b&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;doesNotUnderstand: aMessage&lt;br /&gt;  "aMessage arguments  #('Laurent' 10)"&lt;br /&gt;  "aMessage selector #findAllByName:Age:"&lt;br /&gt; &lt;br /&gt;  | selRegex findSelector searchSelectors searchedValues |&lt;br /&gt;  selRegex := 'find(All|First)By(\w+\:)+' asRegex.&lt;br /&gt;  (selRegex search: aMessage selector)&lt;br /&gt;      ifFalse: [^ super doesNotUnderstand: aMessage].&lt;br /&gt;  &lt;br /&gt;  findSelector := ((selRegex subexpression: 2) = 'All') &lt;br /&gt;                                       ifTrue: [#findAll:] &lt;br /&gt;                                       ifFalse: [#find:].&lt;br /&gt;        &lt;br /&gt;  searchSelectors := (selRegex subexpressions: 3) collect: &lt;br /&gt;                       [:aSymbol|&lt;br /&gt;                        aSymbol asLowercase allButLast asSymbol].&lt;br /&gt;        &lt;br /&gt;  (self allSelectors includesAllOf: searchSelectors) &lt;br /&gt;                 ifFalse: [^ super doesNotUnderstand: aMessage].&lt;br /&gt;        &lt;br /&gt;  searchedValues := aMessage arguments.&lt;br /&gt; &lt;br /&gt;  ^ self &lt;br /&gt;    perform: findSelector &lt;br /&gt;    with: [:aPerson| |values| &lt;br /&gt;           values := searchSelectors collect: &lt;br /&gt;                      [:aSelector| &lt;br /&gt;                       aPerson perform: aSelector].&lt;br /&gt;           searchedValues = values].&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-6438436501819127146?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/6438436501819127146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/05/dynamic-finder-with-doesnotunderstand.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/6438436501819127146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/6438436501819127146'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/05/dynamic-finder-with-doesnotunderstand.html' title='Dynamic finder with #doesNotUnderstand, #perform and Regex'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-7179738071265978073</id><published>2010-04-25T11:47:00.000-07:00</published><updated>2010-08-08T00:57:10.563-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><title type='text'>SandstoneDb, simple ActiveRecord style persistence</title><content type='html'>Start using &lt;a href="http://www.squeaksource.com/SandstoneDb.html"&gt;SandstoneDb&lt;/a&gt;, an object oriented database with ActiveRecord style persistence. Written by &lt;a href="http://onsmalltalk.com/"&gt;Ramon Leon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You will learn how to&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add persistency to a class instances by subclassing SDActiveRecord&lt;/li&gt;&lt;li&gt;Save and retrieve objects&lt;/li&gt;&lt;li&gt;Prevent saving of an object if invalid&lt;/li&gt;&lt;li&gt;Hook into records life cycle for cascade saving&lt;/li&gt;&lt;li&gt;Use &lt;a href="http://www.squeaksource.com/HelpSystem.html"&gt;HelpSystem&lt;/a&gt; from &lt;a href="http://astares.blogspot.com/"&gt;Torsten Bergmann&lt;/a&gt; to browse API documentation&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://onsmalltalk.com/sandstonedb-simple-activerecord-style-persistence-in-squeak"&gt;SandstoneDb on Ramon's blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://book.seaside.st/book/advanced/persistency/sandstone"&gt;Dedicated chapter in the Seaside book&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/sandstonedb_introduction.mpeg"&gt; .mpeg 18.8 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/sandstonedb_introduction.mov"&gt; .mov 27.9 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voice recorded by &lt;a href="http://www.google.com/profiles/HaiColon"&gt;Christoph Budzinski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is the first screencast with subtitles, I hope you like it :). &lt;a href="http://lolgzs.free.fr/pharocasts/sandstonedb_introduction.srt"&gt;Download the subtitle file&lt;/a&gt; (SubRip format).&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=11209919&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=11209919&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load the source code:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;&amp;nbsp;&amp;nbsp; squeaksource: 'SandstoneDb';&lt;br /&gt;&amp;nbsp;&amp;nbsp; package: 'SandstoneDb';&lt;br /&gt;&amp;nbsp;&amp;nbsp; squeaksource: 'Pharocasts';&lt;br /&gt;&amp;nbsp;&amp;nbsp; package: 'SandstoneDbIntro';&lt;br /&gt;&amp;nbsp;&amp;nbsp; load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Load HelpSystem:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;&amp;nbsp;&amp;nbsp; squeaksource: 'MetacelloRepository';&lt;br /&gt;&amp;nbsp;&amp;nbsp; package: 'ConfigurationOfHelpSystem';&lt;br /&gt;&amp;nbsp;&amp;nbsp; load.&lt;br /&gt;&lt;br /&gt;(Smalltalk at:#ConfigurationOfHelpSystem) project latestVersion load&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-7179738071265978073?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/7179738071265978073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/04/sandstonedb-simple-activerecord-style.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/7179738071265978073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/7179738071265978073'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/04/sandstonedb-simple-activerecord-style.html' title='SandstoneDb, simple ActiveRecord style persistence'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-4834409246899937655</id><published>2010-02-24T12:19:00.000-08:00</published><updated>2010-05-09T12:13:14.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><title type='text'>Magma, an object oriented database</title><content type='html'>This "Getting started with Magma" screncast shows:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;how to create a Magma repository on the filesystem to store objects&lt;/li&gt;&lt;li&gt;run Magma server in one image&lt;/li&gt;&lt;li&gt;connect to the server from two other client images&lt;/li&gt;&lt;li&gt;share objects between the clients&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; I've written an error at 10:23, &lt;a href="http://pharocasts.blogspot.com/2010/02/magma-object-oriented-database.html?showComment=1267081348304#c7034401372248186167"&gt;see Peter's comment&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/magma_object_oriented_database.mpeg"&gt; .mpeg 26.3 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/magma_object_oriented_database.mov"&gt; .mov 47.6 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="480"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9710844&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9710844&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load the source code&lt;/b&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code ="smalltalk"&gt;Gofer new&lt;br /&gt; squeaksource: 'Pharocasts';&lt;br /&gt; package: 'GettingStartedWithMagma';&lt;br /&gt; load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Load Magma into Pharo:&lt;br /&gt;&lt;pre&gt;&lt;code ="smalltalk"&gt;Gofer new&lt;br /&gt; squeaksource: 'MetacelloRepository';&lt;br /&gt; package: 'ConfigurationOfMagma';&lt;br /&gt; load.&lt;br /&gt; &lt;br /&gt;(Smalltalk at:#ConfigurationOfMagma) &lt;br /&gt; project latestVersion &lt;br /&gt;  load: 'Server'; &lt;br /&gt;  load: 'Client'.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;See also: &lt;a href="http://wiki.squeak.org/squeak/2665"&gt;Magma Squeak wiki page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Inspirated by &lt;a href="http://wiki.squeak.org/squeak/2689"&gt;Getting started with Magma&lt;/a&gt; wiki page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-4834409246899937655?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/4834409246899937655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/02/magma-object-oriented-database.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4834409246899937655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4834409246899937655'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/02/magma-object-oriented-database.html' title='Magma, an object oriented database'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-458550946706112886</id><published>2010-02-14T11:22:00.001-08:00</published><updated>2011-02-04T23:44:35.299-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>REST, XML parsing and photos</title><content type='html'>&lt;b&gt;UPDATE 08/16/2010&lt;/b&gt;: This screencast is obsolete in Pharo 1.1. See &lt;a href="http://pharocasts.blogspot.com/2010/08/see-how-to-get-data-from-url-parse-xml.html"&gt;updated screencast &lt;b&gt;Display Picasa photos&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Search and retrieve photos from Picasa using its &lt;a href="http://code.google.com/intl/fr-FR/apis/picasaweb/docs/2.0/developers_guide_protocol.html"&gt;Data API Feeds&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You will learn how to&lt;br /&gt;&lt;ul&gt;&lt;li&gt;execute HTTP requests&lt;/li&gt;&lt;li&gt;parse answered XML documents with SAXHandler from &lt;a href="http://www.squeaksource.com/XMLSupport.html"&gt;XML-Parser package&lt;/a&gt;&lt;/li&gt;&lt;li&gt;download pictures&lt;/li&gt;&lt;li&gt;display pictures in a Morphic GUI&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/rest_xml_parsing_and_photos.mpeg"&gt; .mpeg 30.8 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/rest_xml_parsing_and_photos.mov"&gt; .mov 51.6 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9446873&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9446873&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load the source code:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;   squeaksource: 'XMLSupport';&lt;br /&gt;   package: 'XML-Parser';&lt;br /&gt;   squeaksource: 'Pharocasts';&lt;br /&gt;   package: 'Picasa';&lt;br /&gt;   load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Search photos and display them in Pharo:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;|photos|&lt;br /&gt;photos:=PicasaAPI new&lt;br /&gt;    searchPhotos: 'miles+davis' maxResults: 3. &lt;br /&gt;PhotoWall new viewPhotos: photos.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Code samples:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Access Picasa REST API:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;'http://picasaweb.google.com/data/feed/api/all?q=puppy&amp;amp;max-results=10' &lt;br /&gt;    asUrl retrieveContents&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Download a picture and display it with SketchMorph:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;(SketchMorph fromStream:&lt;br /&gt;    ('http://code.google.com/p/pharo/logo'&lt;br /&gt;        asUrl retrieveContents contentStream)) openInWorld &lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-458550946706112886?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/458550946706112886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/02/rest-xml-parsing-and-photos.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/458550946706112886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/458550946706112886'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/02/rest-xml-parsing-and-photos.html' title='REST, XML parsing and photos'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-6232365594850634368</id><published>2010-02-10T22:57:00.000-08:00</published><updated>2011-02-04T23:37:13.288-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>How I record screencasts for Pharocasts</title><content type='html'>... on Linux. I use &lt;a href="http://xvidcap.sourceforge.net/"&gt;xvidcap&lt;/a&gt; for recording and &lt;a href="http://fixounet.free.fr/avidemux/"&gt;avidemux&lt;/a&gt; for video editing. Both are really easy to use and stable.&lt;br /&gt;&lt;br /&gt;So now, dear Pharo and Linux user, you know how to contribute to Pharocasts ;). To publish on Pharocasts, &lt;a href="mailto:laurent.laffont@gmail.com"&gt;contact me&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Download screencast (960x720): &lt;a href="http://lolgzs.free.fr/pharocasts/how_to_record_a_screencast.mpeg"&gt; .mpeg 19.0 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/how_to_record_a_screencast.mov"&gt; .mov 28.8 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="480"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9360953&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9360953&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-6232365594850634368?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/6232365594850634368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/02/how-i-record-screencasts-for-pharocasts.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/6232365594850634368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/6232365594850634368'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/02/how-i-record-screencasts-for-pharocasts.html' title='How I record screencasts for Pharocasts'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-3497975740530096535</id><published>2010-02-07T13:11:00.001-08:00</published><updated>2011-02-04T23:44:53.636-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><category scheme='http://www.blogger.com/atom/ns#' term='morphic'/><title type='text'>Programming with live objects</title><content type='html'>Write a moving turtle (you need a bit of imagination) with Morphic and see how to extend and debug a running object ! &lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/programming_with_live_objects.mpeg"&gt; .mpeg, 25.4 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/programming_with_live_objects.mov"&gt; .mov, 49.4 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9277705&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9277705&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Load the source code:&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt; squeaksource: 'Pharocasts';&lt;br /&gt; package: 'ProgrammingWithLiveObjects';&lt;br /&gt; load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Create a new moving turtle:&lt;pre&gt;&lt;code class="smalltalk"&gt;Turtle new &lt;br /&gt;        openInWorld; &lt;br /&gt;        goAt: 300@300&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;This screencast was inspired by &lt;a href="http://www.iam.unibe.ch/~ducasse/Programmez/OnTheWeb/Art4-Class.pdf"&gt;a tutorial from S.Ducasse (in french)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Trigonometry#Overview"&gt;If you need reminders about trigonometry :)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-3497975740530096535?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/3497975740530096535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/02/programming-with-live-objects.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/3497975740530096535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/3497975740530096535'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/02/programming-with-live-objects.html' title='Programming with live objects'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-4817793963223486683</id><published>2010-02-03T13:41:00.001-08:00</published><updated>2011-02-15T07:57:29.967-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packages'/><category scheme='http://www.blogger.com/atom/ns#' term='monticello'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Code history tools</title><content type='html'>&lt;ul&gt;&lt;li&gt;Browse versions of a method&lt;/li&gt;&lt;li&gt;Recover lost changes&lt;/li&gt;&lt;li&gt;Code versioning with Monticello and a local repository&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/code_history_tools.mpeg"&gt; .mpeg, 18.4 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/code_history_tools.mov"&gt; .mov, 27.8 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9190592&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9190592&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-4817793963223486683?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/4817793963223486683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/02/code-history-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4817793963223486683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4817793963223486683'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/02/code-history-tools.html' title='Code history tools'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-8501995600489826499</id><published>2010-02-01T07:42:00.000-08:00</published><updated>2010-01-31T22:43:07.238-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Deploy on Seaside Hosting</title><content type='html'>&lt;a href="http://pharocasts.seasidehosting.st/"&gt;Tips &amp;amp; Tricks &lt;/a&gt;seaside blog is now online. Here is the making-of !&lt;br /&gt;&lt;br /&gt;Note: this screencast is the third part of a Seaside 2.8 serie:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://pharocasts.blogspot.com/2010/01/seaside-blog.html"&gt;Seaside blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pharocasts.blogspot.com/2010/01/rss-feed-with-seaside.html"&gt;RSS feed with Seaside&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/deploy_on_seaside_hosting.mpeg"&gt; .mpeg, 13.7 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/deploy_on_seaside_hosting.mov"&gt; .mov, 16.2 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="480"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9114081&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9114081&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-8501995600489826499?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/8501995600489826499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/01/deploy-on-seaside-hosting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8501995600489826499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/8501995600489826499'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/01/deploy-on-seaside-hosting.html' title='Deploy on Seaside Hosting'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-5892758227516761380</id><published>2010-01-27T13:03:00.001-08:00</published><updated>2011-02-04T23:36:44.361-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><title type='text'>Video course on Smalltalk</title><content type='html'>Davide Varvello has worked on a video course on Smalltalk. Now the first video is available and all the lessons can be pre-ordered here &lt;a href="http://it.thinkcode.tv/catalogo/programmare-in-smalltalk/"&gt;http://it.thinkcode.tv/catalogo/programmare-in-smalltalk/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Actually the course is in Italian, but there will be an English version soon.&lt;br /&gt;&lt;br /&gt;Here is the preview of the first course.&lt;br /&gt;&lt;br /&gt;Download screencast (1280x720): &lt;a href="http://lolgzs.free.fr/pharocasts/SMALIT-preview.mov"&gt; .mov, 20.2 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="360" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9026078&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9026078&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-5892758227516761380?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/5892758227516761380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/01/video-course-on-smalltalk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/5892758227516761380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/5892758227516761380'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/01/video-course-on-smalltalk.html' title='Video course on Smalltalk'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-2747543926433722793</id><published>2010-01-26T23:02:00.000-08:00</published><updated>2011-02-04T23:38:52.414-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Starting with SUnit and Debugger</title><content type='html'>Start using SUnit and the debugger for Test Driven Development in Pharo. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/sunit_and_debugger.mpeg"&gt; .mpeg, 30.9 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/sunit_and_debugger.mov"&gt; .mov, 45.3 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9004333&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9004333&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-2747543926433722793?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/2747543926433722793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/01/starting-with-sunit-and-debugger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2747543926433722793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2747543926433722793'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/01/starting-with-sunit-and-debugger.html' title='Starting with SUnit and Debugger'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-4241774542762436633</id><published>2010-01-20T02:24:00.001-08:00</published><updated>2010-05-09T12:17:39.151-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>RSS feed with Seaside</title><content type='html'>Add a RSS feed to &lt;a href="http://pharocasts.blogspot.com/2010/01/seaside-blog.html"&gt;Pharocasts Seaside Blog&lt;/a&gt;! Furthermore, you will learn how to search for a package on &lt;a href="http://squeaksource.com/"&gt;Squeaksource&lt;/a&gt; and load it into your Pharo image using &lt;a href="http://www.lukas-renggli.ch/blog/gofer"&gt;Gofer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/rss_feed_with_seaside.mpeg"&gt; .mpeg, 12.1 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/rss_feed_with_seaside.mov"&gt; .mov, 25.8 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8860990&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=8860990&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load the source code:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;    squeaksource: 'rsrss';&lt;br /&gt;    package: 'RSRSS2';&lt;br /&gt;    squeaksource: 'Pharocasts';&lt;br /&gt;    package: 'RSSFeedWithSeaside';&lt;br /&gt;    load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Code samples.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Define your RSS&amp;nbsp;component:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;RRComponent subclass: #BlogRSSFeed&lt;br /&gt; instanceVariableNames: ''&lt;br /&gt; classVariableNames: ''&lt;br /&gt; poolDictionaries: ''&lt;br /&gt; category: 'RSSFeedWithSeaside'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Populate your feed:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;renderContentOn: rss&lt;br /&gt; rss title: 'Tips &amp;amp; Tricks posts'.&lt;br /&gt; rss description: 'Feed to Tips &amp;amp; Tricks blog, famous blog about Smalltalk'.&lt;br /&gt; rss url: 'http://localhost:8080/seaside/blog.rss'.&lt;br /&gt; &lt;br /&gt; Post database reverse do: [:aPost|&lt;br /&gt;  rss item: [&lt;br /&gt;   rss title: aPost title.&lt;br /&gt;   rss description: aPost body.&lt;br /&gt;   rss publicationDate: aPost publishedAt.&lt;br /&gt;  ]&lt;br /&gt; ].&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-4241774542762436633?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/4241774542762436633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/01/rss-feed-with-seaside.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4241774542762436633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4241774542762436633'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/01/rss-feed-with-seaside.html' title='RSS feed with Seaside'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-4629046082300129417</id><published>2010-01-18T02:46:00.000-08:00</published><updated>2010-01-31T14:12:41.756-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Refactoring with Code Critics</title><content type='html'>Refactoring tools in Pharo include Code Critics. It's based on &lt;a href="http://st-www.cs.illinois.edu/users/brant/Refactory/Lint.html"&gt;SmallLint&lt;/a&gt; and checks for over 60 common types of bugs. &lt;br /&gt;&lt;br /&gt;Note that Lukas Renggli maintains an extended version of this tool called &lt;a href="http://www.lukas-renggli.ch/blog/slime"&gt;Slime&lt;/a&gt;, targetted at Seaside code. You can find more informations in the book: &lt;a href="http://book.seaside.st/book/components/slime/program-checker"&gt;Dynamic Web Development With Seaside&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/refactoring_with_code_critics.mpeg"&gt; .mpeg, 8.9 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/refactoring_with_code_critics.mov"&gt; .mov, 15.3 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8812646&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=8812646&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-4629046082300129417?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/4629046082300129417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/01/refactoring-with-code-critics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4629046082300129417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/4629046082300129417'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/01/refactoring-with-code-critics.html' title='Refactoring with Code Critics'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-1524444172756382599</id><published>2010-01-12T13:22:00.001-08:00</published><updated>2010-05-09T12:19:05.417-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Seaside blog</title><content type='html'>Follow this screencast and write a basic blog with &lt;b&gt;Seaside 2.8&lt;/b&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;use WAFileLibrary to store your CSS style&lt;/li&gt;&lt;li&gt;embed components in your application&lt;/li&gt;&lt;li&gt;write a form to edit a post.&lt;/li&gt;&lt;/ul&gt;Don't forget to read &lt;a href="http://book.seaside.st/"&gt;Dynamic Web Development With Seaside&lt;/a&gt; !&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/seaside_blog.mpeg"&gt; .mpeg, 51.4 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/seaside_blog.mov"&gt; .mov, 105.9 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8702395&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=8702395&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load the source code:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;     squeaksource: 'Pharocasts';&lt;br /&gt;     package: 'SeasideBlog';&lt;br /&gt;     load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Start the server and register Blog as application:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;WAKom startOn: 8080.&lt;br /&gt;Blog registerAsApplication: 'blog'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Load Seaside 2.8 in Pharo:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;        squeaksource: 'Loader';&lt;br /&gt;        package: 'Loader';&lt;br /&gt;        load.&lt;br /&gt;&lt;br /&gt;Loader new&lt;br /&gt;        load: 'Seaside28' version: '2.8.4.2'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;You can also download a Pharo with Seaside image here: &lt;a href="http://seaside.st/download/pharo"&gt;http://seaside.st/download/pharo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-1524444172756382599?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/1524444172756382599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/01/seaside-blog.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/1524444172756382599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/1524444172756382599'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/01/seaside-blog.html' title='Seaside blog'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-2694472789908161905</id><published>2010-01-10T13:10:00.000-08:00</published><updated>2010-05-09T12:20:14.789-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming'/><title type='text'>TreeMorph  based package browser</title><content type='html'>In this tutorial you will learn how to display packages / class / messages tree in a TreeMorph and use the Selected callbalk to display source code of selected item in a TextMorph.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/treemorph_based_package_browser.mpeg"&gt;.mpeg, 22.4 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/treemorph_based_package_browser.mov"&gt;.mov, 41.1 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8651244&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=8651244&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load the source code:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;     squeaksource: 'Pharocasts';&lt;br /&gt;     package: 'TreeMorphBasedPackageBrowser';&lt;br /&gt;     load.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Code samples:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;aTreeMorph := PluggableTreeMorph new.&lt;br /&gt; &lt;br /&gt;items := PackageOrganizer default packages collect: [:aPackageInfo|&lt;br /&gt;   PackageInfoListItemWrapper with: aPackageInfo.&lt;br /&gt;].&lt;br /&gt;aTreeMorph list: items.&lt;br /&gt;aTreeMorph &lt;br /&gt;   model: self;&lt;br /&gt;   setSelectedSelector: #onItemWrapperClick:.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;In PackageInfoListItemWrapper:&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;contents&lt;br /&gt;   ^ item classes collect: [:aClass | ClassDescriptionListItemWrapper with: aClass].&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-2694472789908161905?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/2694472789908161905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/01/treemorph-based-package-browser.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2694472789908161905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2694472789908161905'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/01/treemorph-based-package-browser.html' title='TreeMorph  based package browser'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8799552733448267702.post-2391163754898480899</id><published>2010-01-10T12:55:00.000-08:00</published><updated>2010-05-09T12:22:58.610-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>Basic UI building</title><content type='html'>Here we show how to layout basics controls such as panels and buttons in a window.&lt;br /&gt;&lt;br /&gt;Download screencast (800x600): &lt;a href="http://lolgzs.free.fr/pharocasts/basic_ui_building.mpeg"&gt;.mpeg, 23.8 MB&lt;/a&gt;, &lt;a href="http://lolgzs.free.fr/pharocasts/basic_ui_building.mov"&gt;.mov, 46.2 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="480" width="640"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8619593&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=8619593&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load the source code:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;Gofer new&lt;br /&gt;     squeaksource: 'Pharocasts';&lt;br /&gt;     package: 'BasicUIBuilding';&lt;br /&gt;     load&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Code sample:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="smalltalk"&gt;|aWindow aPanel buttonPanel|&lt;br /&gt;&lt;br /&gt;aWindow := SystemWindow labelled: 'My first window'.&lt;br /&gt;&lt;br /&gt;aPanel := PluggablePanelMorph new.&lt;br /&gt;aWindow addMorph: aPanel fullFrame: (&lt;br /&gt;    LayoutFrame&lt;br /&gt;        fractions: (0@0 corner: 1@1)&lt;br /&gt;        offsets: (0@0 corner: 0@50 negated)).&lt;br /&gt;aPanel color: (Color blue).&lt;br /&gt;&lt;br /&gt;buttonPanel := PluggablePanelMorph new.&lt;br /&gt;aWindow addMorph: buttonPanel fullFrame: ( &lt;br /&gt;    LayoutFrame&lt;br /&gt;        fractions: (0@0.99 corner: 1@1)&lt;br /&gt;        offsets: (0@50 negated corner: 0@0)).&lt;br /&gt;buttonPanel  color: (Color green).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#(one two three) do: [:label| |aButton| &lt;br /&gt;   aButton := PluggableButtonMorph new label: label; yourself.&lt;br /&gt;   buttonPanel addMorph: aButton fullFrame: nil.&lt;br /&gt;].&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;aWindow openInWorld.&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8799552733448267702-2391163754898480899?l=www.pharocasts.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.pharocasts.com/feeds/2391163754898480899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.pharocasts.com/2010/01/basic-ui-building.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2391163754898480899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8799552733448267702/posts/default/2391163754898480899'/><link rel='alternate' type='text/html' href='http://www.pharocasts.com/2010/01/basic-ui-building.html' title='Basic UI building'/><author><name>Laurent Laffont</name><uri>http://www.blogger.com/profile/03349273143701067848</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_JLK6EDfW4so/SqjtvCk841I/AAAAAAAAAO0/F7HJ3tNGQNk/S220/IMG_1783.JPG'/></author><thr:total>12</thr:total></entry></feed>
