<?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:blogger='http://schemas.google.com/blogger/2008' 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-3454033395947617111</id><updated>2012-07-07T16:33:04.836+02:00</updated><category term='linux'/><category term='ruby'/><category term='pharo'/><category term='développement'/><category term='python'/><category term='php'/><category term='squeak-vm'/><category term='rails'/><category term='smalltalk'/><category term='video'/><category term='pomodoro technique'/><category term='seaside'/><category term='livres'/><category term='musique'/><title type='text'>-[ MaGaLoMa ]-</title><subtitle type='html'>Blog public à usage privé</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default?start-index=26&amp;max-results=25'/><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>68</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-1302589015627295131</id><published>2012-04-18T23:07:00.001+02:00</published><updated>2012-04-18T23:07:17.350+02:00</updated><title type='text'>Pharo 1.4 with Tiling Window Manager and more</title><content type='html'>With the release of &lt;a href="http://www.pharo-project.org/pharo-download/release-1-4"&gt;Pharo 1.4&lt;/a&gt; I've created my new custom image with TWM, Nautilus, Autotest and ProfStef. Here's the &lt;a href="http://lolgzs.free.fr/Pharo-1.4-twn-nautilus-profstef-autotest.zip"&gt;download link&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Q3D1y4x5Ebc/T48s4sbW8dI/AAAAAAAAAtg/Pd_kAodH90U/s1600/Pharo14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://2.bp.blogspot.com/-Q3D1y4x5Ebc/T48s4sbW8dI/AAAAAAAAAtg/Pd_kAodH90U/s320/Pharo14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/1302589015627295131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2012/04/pharo-14-with-tiling-window-manager-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/1302589015627295131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/1302589015627295131'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2012/04/pharo-14-with-tiling-window-manager-and.html' title='Pharo 1.4 with Tiling Window Manager and more'/><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/-Q3D1y4x5Ebc/T48s4sbW8dI/AAAAAAAAAtg/Pd_kAodH90U/s72-c/Pharo14.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-688736950018369396</id><published>2012-02-11T22:33:00.000+01:00</published><updated>2012-02-11T22:47:29.914+01:00</updated><title type='text'>FOSDEM 2012</title><content type='html'>This was my first &lt;a href="http://fosdem.org/2012/"&gt;FOSDEM&lt;/a&gt; and with no hesitation that's the most fun event I've ever participated. The &lt;a href="https://hackerspace.be/Hackerspace_Brussels"&gt;Hackerspace&lt;/a&gt;  &lt;a href="https://hackerspace.be/ByteNight_(2012)"&gt;Bytenight&lt;/a&gt; was amazing, listening 8-bit remixed music from 90's video games, drinking good Belgian beers and talking with fun people.&lt;br /&gt;&lt;br /&gt;I found a place to sleep for four days through &lt;a href="http://www.couchsurfing.org/"&gt;CouchSurfing&lt;/a&gt; (I've also discovered &lt;a href="http://www.bewelcome.org/"&gt;BeWelcome&lt;/a&gt; recently), it seems the best way to enter Brussel's life.&lt;br /&gt;&lt;br /&gt;On sunday &lt;a href="https://twitter.com/#!/johnny_t"&gt;John Thornton&lt;/a&gt; and I gave a talk on &lt;a href="http://amber-lang.net/"&gt;Amber Smalltalk&lt;/a&gt; - you can &lt;a href="http://lolgzs.free.fr/fosdem/examples/presentation/index.html"&gt;view slides online&lt;/a&gt;. Johnny arrived from the USA only five minutes before the talk, he's definitely an agile developer ;)  We had some fun presenting Amber and the room was almost filled. We wanted to show real working code, integration with Javascript and &lt;a href="http://nodejs.org/"&gt;Nodejs&lt;/a&gt; goodies. It's nice to use &lt;i&gt;dynamic&lt;/i&gt; slides with Amber.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/damienpollet/6846893761/" style="margin-left: auto; margin-right: auto;" title="Amber Smalltalk de Damien Pollet, sur Flickr"&gt;&lt;img alt="Amber Smalltalk" height="500" src="http://farm8.staticflickr.com/7012/6846893761_d56afa165f.jpg" width="500" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Photo by &lt;a href="http://www.flickr.com/photos/damienpollet/"&gt;Damien Pollet&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Marcus explained &lt;a href="http://esug.org/data/Conferences/2012FOSDEM/2012-FOSDEM-Denker-Pharo.pdf"&gt;Pharo's vision&lt;/a&gt; before our talk. Huge work has been done, huge work ongoing. I'm looking forward to the Pharo Consortium.&lt;br /&gt;&lt;br /&gt;After talking with several people we went back to the Smalltalk devroom. I discovered the &lt;a href="http://netjam.org/spoon/"&gt;Spoon project&lt;/a&gt; by Craig Latta. It's a minimal Smalltalk that can be remotely browsed from Squeak.&lt;br /&gt;&lt;br /&gt;Then took place an introduction to Smalltalk workshop. Experienced Smalltalkers paired with newcomers to test and add new features to a &lt;a href="http://seaside.st/"&gt;Seaside&lt;/a&gt; application. The idea is nice and allows to listen to people feelings while discovering a new tool.&lt;br /&gt;&lt;br /&gt;I finally put real faces on people only known on mailing-lists. Sad we did not managed to have more discussion. One day is short and so much to see... &lt;br /&gt;&lt;br /&gt;Thank you Stephan. So nice things can emerge from a &lt;a href="https://twitter.com/#!/StOnSoftware/status/149613158166831104"&gt;single tweet&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FEjAUU5Jw4I/Tzbhf1LQSzI/AAAAAAAAAsA/Al3DiaxM8Z4/s1600/amber_fosdem.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="424" src="http://1.bp.blogspot.com/-FEjAUU5Jw4I/Tzbhf1LQSzI/AAAAAAAAAsA/Al3DiaxM8Z4/s640/amber_fosdem.JPG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Photo by &lt;a href="http://www.a3aan.st/fosdem2012/index.php/list/0/01+DevRoom"&gt;Adriaan van Os&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/688736950018369396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2012/02/fosdem-2012.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/688736950018369396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/688736950018369396'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2012/02/fosdem-2012.html' title='FOSDEM 2012'/><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://1.bp.blogspot.com/-FEjAUU5Jw4I/Tzbhf1LQSzI/AAAAAAAAAsA/Al3DiaxM8Z4/s72-c/amber_fosdem.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-762966930914568050</id><published>2011-10-07T09:16:00.001+02:00</published><updated>2011-10-07T11:53:14.229+02:00</updated><title type='text'>Emacs and J2EE on OSX notes</title><content type='html'>Here's how I've managed to setup Emacs for J2EE / Tomcat / Maven application development on OSX.&amp;nbsp;  &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;  Install Emacs&lt;/h2&gt;I use Emacs 23.3 from &lt;a href="http://emacsforosx.com/"&gt;Emacs for OSX&lt;/a&gt;.   &lt;br /&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;  Malabar mode&lt;/h2&gt;&lt;a href="https://github.com/espenhw/malabar-mode"&gt;Malabar mode&lt;/a&gt; offers easy code navigation, Maven, JUnit and Groovy integration.    &lt;a href="https://github.com/espenhw/malabar-mode/zipball/malabar-1.4.0"&gt;Download release 1.4&lt;/a&gt; and extract in a directory to build it.&lt;br /&gt;&lt;br /&gt;As the build will invoke emacs in batch mode, be sure that Emacs 23.3 is in your path (instead of using the one packaged with OSX).&lt;br /&gt;&lt;br /&gt;What works on my machine: &lt;br /&gt;&lt;pre&gt;&lt;code&gt;unzip espenhw-malabar-mode-malabar-1.4.0-0-g35e1e5e.zip&lt;br /&gt;cd espenhw-malabar-mode-1daaee4&lt;br /&gt;export PATH=/Applications/Emacs.app/Contents/MacOS:$PATH&lt;br /&gt;mvn package -DskipTests=true&lt;/code&gt;&lt;/pre&gt;Now in target directory there's a malabar-1.4.0-dist.zip. Unzip it where you put all your emacs librairies: &lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;cd ~/.emacs.d/&lt;br /&gt;unzip /path/to/malabar/target/malabar-1.4.0-dist.zip&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt; Configure Emacs for Malabar&lt;/h2&gt;Open your .emacs and add: &lt;br /&gt;&lt;pre style="font-size: 0.9em;"&gt;&lt;code&gt;(add-to-list 'load-path (expand-file-name "~/.emacs.d/malabar-1.4.0/lisp/")) &lt;br /&gt;&lt;br /&gt;(require 'cedet)&lt;br /&gt;(require 'malabar-mode)&lt;br /&gt;(setq malabar-groovy-lib-dir "/path/to/malabar/lib")&lt;br /&gt;(add-to-list 'auto-mode-alist '("\\.java\\'" . malabar-mode))&lt;br /&gt;&lt;br /&gt;(semantic-mode 1)&lt;br /&gt;(require 'malabar-mode)&lt;br /&gt;(setq malabar-groovy-lib-dir "~/.emacs.d/malabar-1.4.0/lib"&lt;br /&gt;      malabar-load-source-from-sibling-projects t&lt;br /&gt;      malabar-extra-source-locations&lt;br /&gt;      '( "/absolute/path/to/project1/src" &lt;br /&gt;        "/absolute/path/to/project2/src" ) ) ;; you need to setup this &lt;br /&gt;&lt;br /&gt;(add-to-list 'auto-mode-alist '("\\.java\\'" . malabar-mode))&lt;br /&gt;&lt;br /&gt;(add-hook 'malabar-mode-hook&lt;br /&gt;     (lambda () &lt;br /&gt;       (add-hook 'after-save-hook 'malabar-compile-file-silently&lt;br /&gt;                  nil t)))&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Now open a .java file within Emacs.&lt;br /&gt;&lt;br /&gt;Try &lt;b&gt;malabar-jump-to-thing&lt;/b&gt; on one of your class and it should open the corresponding file.&lt;br /&gt;&lt;br /&gt;Open a test file and try &lt;b&gt;malabar-run-test&lt;/b&gt;. It should run maven test for this file. If all tests OK but finished with "BUILD FAILURE", then see next section   &lt;br /&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt; Java troubleshooting&lt;/h2&gt;Malabar should use java from jdk, not jde. I've tried setting JAVA_HOME and configure malabar without success. So quick dirty hack is: &lt;br /&gt;&lt;pre style="font-size: 0.9em;"&gt;&lt;code&gt;&lt;br /&gt;cd /usr/bin&lt;br /&gt;mv java java.jre&lt;br /&gt;ln -s  /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; &lt;br/&gt;&lt;h2&gt;Ressources&lt;/h2&gt;&lt;a href="http://tkj.freeshell.org/emacs/java/"&gt;Entreprise Java Development With Emacs&lt;/a&gt;    &lt;h2&gt;Debugging Tomcat&lt;/h2&gt; Install &lt;a href="jdibug.googlecode.com"&gt;JDIBug&lt;/a&gt;.  In jdibug-expr.el, change the line (and to forget to byte-recompile or remove .elc): &lt;pre&gt;&lt;code&gt;(require 'semantic-java)&lt;/code&gt;&lt;/pre&gt; &lt;pre&gt;&lt;code&gt;(require 'semantic/java)&lt;/code&gt;&lt;/pre&gt;  Configure emacs: &lt;pre&gt;&lt;code&gt;&lt;br /&gt;(add-to-list 'load-path "~/.emacs.d/jdibug-0.5")&lt;br /&gt;(setq jdibug-connect-hosts (quote ("localhost:8000"))&lt;br /&gt;      jdibug-use-jde-source-paths nil&lt;br /&gt;      jdibug-source-paths&lt;br /&gt;      (list&lt;br /&gt;			 "/path/to/project1/src" &lt;br /&gt;			 "/path/to/project2/src"  ))&lt;br /&gt;(require 'jdibug)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  Start Tomcat like with debugger enabled:  &lt;pre&gt;&lt;code&gt;./bin/catalina.sh jpda start&lt;/code&gt;&lt;/pre&gt;  Then try jdibug-connect to attach Emacs to tomcat. </content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/762966930914568050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/10/emacs-and-j2ee-on-osx-notes.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/762966930914568050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/762966930914568050'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/10/emacs-and-j2ee-on-osx-notes.html' title='Emacs and J2EE on OSX notes'/><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-3454033395947617111.post-5272777556958187126</id><published>2011-07-12T23:49:00.000+02:00</published><updated>2011-07-12T23:49:15.002+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>TWM: Docking Windows</title><content type='html'>Using Pharo 1.4 and latest TWM packages, you can now group windows as tabs.&lt;br /&gt;&lt;br /&gt;Use:&lt;pre&gt;&lt;code&gt;(ConfigurationOfTilingWindowManager project &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version: #bleedingEdge) load&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/26346973?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="640" height="400" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/5272777556958187126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/07/twm-docking-windows.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5272777556958187126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5272777556958187126'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/07/twm-docking-windows.html' title='TWM: Docking 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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-7469119079357256288</id><published>2011-06-28T08:01:00.002+02:00</published><updated>2011-10-16T09:37:18.084+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>My Pharo image</title><content type='html'>Backup of my preferences:&lt;code&gt;&lt;pre style='font-size:0.8em'&gt;Gofer it&lt;br /&gt;   squeaksource: 'MetacelloRepository';&lt;br /&gt;   package: 'ConfigurationOfPhexample';&lt;br /&gt;   package: 'ConfigurationOfAutotest';&lt;br /&gt;   squeaksource: 'TilingWindowManager';&lt;br /&gt;   package: 'ConfigurationOfTilingWindowManager';&lt;br /&gt;   load.&lt;br /&gt; &lt;br /&gt;(Smalltalk at:#ConfigurationOfTilingWindowManager) perform: #loadDevelopment.&lt;br /&gt;(Smalltalk at:#ConfigurationOfPhexample) load.&lt;br /&gt;((Smalltalk at:#ConfigurationOfAutotest) project version: #development) load: 'OB'.&lt;br /&gt;&lt;br /&gt;(Smalltalk at:#TWMUITheme) beCurrent. &lt;br /&gt;TaskbarMorph  showTaskbar: false.&lt;br /&gt;TasklistMorph keepOpen: true.&lt;br /&gt;(Smalltalk at:#TWMBar) perform: #showTWMBar: with: true.&lt;br /&gt;(Smalltalk at: #AutotestDashboard) perform: #showAutotestDashboard: with: true.&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/7469119079357256288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/06/my-pharo-image.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/7469119079357256288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/7469119079357256288'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/06/my-pharo-image.html' title='My Pharo image'/><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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-5986781952830795376</id><published>2011-06-11T13:40:00.002+02:00</published><updated>2011-06-11T13:45:49.950+02:00</updated><title type='text'>Albaaaaaator, Albaaaaaaator, capitaine au coeur d'or ......</title><content type='html'>Le papa d'&lt;a href="http://fr.wikipedia.org/wiki/Albator"&gt;Albator&lt;/a&gt; / &lt;a href="http://en.wikipedia.org/wiki/Captain_Harlock"&gt;Captain Harlock&lt;/a&gt;, &lt;a href="http://fr.wikipedia.org/wiki/Leiji_Matsumoto"&gt;Lieji Matsumoto&lt;/a&gt;, était à Annecy pour le festival d'animation.... on a la dédicace !!!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-cRGeTc41dLE/TfNUKTCm_YI/AAAAAAAAAjo/kXSsII-A8Tg/s1600/albator.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://1.bp.blogspot.com/-cRGeTc41dLE/TfNUKTCm_YI/AAAAAAAAAjo/kXSsII-A8Tg/s400/albator.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Nostalgie ....&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe frameborder="0" height="384" src="http://www.dailymotion.com/embed/video/x6a1q4" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.dailymotion.com/video/x6a1q4_generique-albator-84_shortfilms" target="_blank"&gt;Générique Albator 84&lt;/a&gt; &lt;i&gt;par &lt;a href="http://www.dailymotion.com/MigXIII" target="_blank"&gt;MigXIII&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/5986781952830795376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/06/albaaaaaator-albaaaaaaator-capitaine-au.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5986781952830795376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5986781952830795376'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/06/albaaaaaator-albaaaaaaator-capitaine-au.html' title='Albaaaaaator, Albaaaaaaator, capitaine au coeur d&apos;or ......'/><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://1.bp.blogspot.com/-cRGeTc41dLE/TfNUKTCm_YI/AAAAAAAAAjo/kXSsII-A8Tg/s72-c/albator.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-4408917076918488403</id><published>2011-06-07T22:29:00.001+02:00</published><updated>2011-06-07T22:30:08.913+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Multiple Worlds for TWM</title><content type='html'>With the help of my &lt;a href="http://cara74.seasidehosting.st"&gt;local developper group&lt;/a&gt;, I've integrated &lt;a href="http://seandenigris.com/blog/?p=767"&gt;Sean DeNigris work&lt;/a&gt; and now Tiling Window Manager supports Multiple Worlds.&lt;br /&gt;&lt;br /&gt;Here's a screencast that shows the progress. (My English seems a little less catastrophic than the previous screencast :)&lt;br /&gt;&lt;br /&gt;Note: The tests failing on the screencast (Pharo 1.2) are green on Pharo 1.3.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/24791296?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;Load TWM with:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;Gofer it&lt;br /&gt;  squeaksource: 'TilingWindowManager';&lt;br /&gt;  package: 'TWM';&lt;br /&gt;  load.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And ConfigurationOfKeyMapping 1.7 (TWM do not work with 1.8 actually) with:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;Gofer it&lt;br /&gt;    squeaksource: 'ShortWays';&lt;br /&gt;    package: 'ConfigurationOfKeymapping';&lt;br /&gt;    load.&lt;br /&gt;    &lt;br /&gt;(ConfigurationOfKeymapping project version: '1.7') load.&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/4408917076918488403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/06/multiple-worlds-for-twm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4408917076918488403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4408917076918488403'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/06/multiple-worlds-for-twm.html' title='Multiple Worlds for TWM'/><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-3454033395947617111.post-2088104201588278454</id><published>2011-05-28T00:03:00.003+02:00</published><updated>2011-05-31T23:16:59.829+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Tiling Window Manager</title><content type='html'>I love Emacs because of editing speed and fast buffer switching among a lot neat features.&lt;br /&gt;&lt;br /&gt;This week I've tried to make Pharo a little better on window management. This video shows the progress (thanks Gastón and Patrick for help and ideas).&lt;br /&gt;&lt;br /&gt;Next step: KeyMapping integration + history à la Emacs winner-mode.&lt;br /&gt;&lt;br /&gt;Sorry for my soooooooo awful english (tired ....).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 05/31/2011&lt;/b&gt;: you can load last version with colored theme with:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;Gofer it&lt;br /&gt;  squeaksource: 'TilingWindowManager';&lt;br /&gt;  package: 'TWM';&lt;br /&gt;  load.&lt;br /&gt;(Smalltalk at: #StandardUITheme) beCurrent.&lt;br /&gt;(Smalltalk at: #TWMBar) showTWMBar:true.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tested on PharoCore 1.2 and Pharo 1.3.&lt;br /&gt;&lt;br /&gt;Now this has support for world snapshot, that means you can arrange the windows and take a snapshot of the layout. Then you can restore these layouts later. (icons camera, &lt;, &gt; and trash). I'm not entirely satisfied with this, thanks for feedback.&lt;br /&gt;&lt;br /&gt;In Pharo 1.3 there's initial integration with KeyMapping. To load:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;Gofer it&lt;br /&gt;  squeaksource: 'ShortWays';&lt;br /&gt;  package: 'ConfigurationOfKeymapping';&lt;br /&gt;  load.&lt;br /&gt;&lt;br /&gt;(Smalltalk at: #ConfigurationOfKeymapping project version: '1.7') load.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then in settings browser &gt; Keymappings &gt; Tiling Window Managers you have all actions of the dock mapped.&lt;br /&gt;&lt;br /&gt;You can choose a Layout Strategy in settings.&lt;br /&gt;&lt;br /&gt;Actually there's Horizontal (default) and Vertical (last used windows fills all remaining space) strategies.&lt;br /&gt;&lt;br /&gt;To add your own just subclass TWMLayoutStrategy and implement #tileWindows:&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/24334739?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;To load TWM: &lt;code&gt;&lt;pre&gt;Gofer it&lt;br /&gt; squeaksource: 'TilingWindowManager';&lt;br /&gt; package: 'TWM';&lt;br /&gt; load.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I also think the UI theme Patrick has cleaned fits better with TilingWM:&lt;code&gt;&lt;pre&gt;Gofer it&lt;br /&gt; squeaksource: 'PBASandbox';&lt;br /&gt; package: 'PBSandbox';&lt;br /&gt; load.&lt;br /&gt; &lt;br /&gt;StandardUITheme beCurrent.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/2088104201588278454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/05/tiling-window-manager.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/2088104201588278454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/2088104201588278454'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/05/tiling-window-manager.html' title='Tiling Window Manager'/><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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-4991920384585397962</id><published>2011-04-14T09:22:00.000+02:00</published><updated>2011-04-14T09:22:48.840+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pomodoro technique'/><title type='text'>Pomodoro scripts</title><content type='html'>Sous OSX j'utilise &lt;a href="http://pomodoro.ugolandini.com/"&gt;ce logiciel comme chronomètre&lt;/a&gt; qui a l'avantage de pouvoir exécuter des scripts lorsque le Pomodoro démarre, s'arrête, ....&lt;br /&gt;&lt;br /&gt;Au travail on utilise beaucoup la messagerie instantanée. J'utilise &lt;a href="http://www.adium.im/"&gt;Adium&lt;/a&gt; comme client. &lt;br /&gt;&lt;br /&gt;Besoins:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;je ne veux pas être dérangé pendant mon Pomodoro (passer mon état à indisponible)&lt;/li&gt;&lt;li&gt;je veux que mes collaborateurs sachent quand se termine mon Pomodoro pour me contacter&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Solution&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;Dans Adium créer un statut indisponible avec comme titre'Pomodoro en cours'&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--oXNCB_kkJY/TaafW_mPfRI/AAAAAAAAAjA/7_h2cqo13gg/s1600/adiumconf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="362" src="http://3.bp.blogspot.com/--oXNCB_kkJY/TaafW_mPfRI/AAAAAAAAAjA/7_h2cqo13gg/s400/adiumconf.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Dans les préférences de Pomodoro, onglet script, configurez comme ceci:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Start&lt;/b&gt;:&lt;br /&gt;&lt;code&gt;tell application "Adium" to set the status of every account whose status type is available to the first status whose title is "Pomodoro en cours"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reset et End&lt;/b&gt;:&lt;br /&gt;&lt;code&gt;tell application "Adium" to set the status of every account whose status type is away to the first status whose title is "Disponible"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Every 2 mins&lt;/b&gt;:&lt;br /&gt;&lt;code&gt;tell application "Adium" to set status message of every account to "Pomodoro en cours, fin dans $time mn"&lt;/code&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/-N4AmucyxJ_I/Taad-Mvz77I/AAAAAAAAAiw/Vv7lt34GTyw/s1600/pomodoro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="343" src="http://4.bp.blogspot.com/-N4AmucyxJ_I/Taad-Mvz77I/AAAAAAAAAiw/Vv7lt34GTyw/s400/pomodoro.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Tout le long du Pomodoro votre statut sera mis à jour:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1If7NdotCdo/Taaeo21mnkI/AAAAAAAAAi4/AucoZz8bbnE/s1600/adium.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="36" src="http://2.bp.blogspot.com/-1If7NdotCdo/Taaeo21mnkI/AAAAAAAAAi4/AucoZz8bbnE/s400/adium.png" width="325" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Et dès que quelqu'un ose vous contacter, réponse automatique !&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/-H_wx38RM_ls/TaagMhWlaUI/AAAAAAAAAjI/v7xxdsKCbSQ/s1600/reponseauto.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="91" width="400" src="http://4.bp.blogspot.com/-H_wx38RM_ls/TaagMhWlaUI/AAAAAAAAAjI/v7xxdsKCbSQ/s400/reponseauto.png" /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/4991920384585397962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/04/pomodoro-scripts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4991920384585397962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4991920384585397962'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/04/pomodoro-scripts.html' title='Pomodoro scripts'/><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://3.bp.blogspot.com/--oXNCB_kkJY/TaafW_mPfRI/AAAAAAAAAjA/7_h2cqo13gg/s72-c/adiumconf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-2719727391535779888</id><published>2011-04-13T16:08:00.006+02:00</published><updated>2011-04-13T16:48:52.300+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Petite Horloge revisited</title><content type='html'>Another Pharo Smalltalk snippet with temp classes (I like this :)&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;(Class new&lt;br /&gt;    superclass: StringMorph;&lt;br /&gt;    setFormat: StringMorph format;&lt;br /&gt;    compile: 'step self contents: Time now printString';&lt;br /&gt;    new)&lt;br /&gt;        openInWindowLabeled: 'Petite Horloge'.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Don't forget the setFormat: or the VM will crash.&lt;a href="http://forum.world.st/test-crashing-the-cog-vm-tp3393032p3393191.html"&gt;Some explanations&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/2719727391535779888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/04/petite-horloge-revisited.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/2719727391535779888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/2719727391535779888'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/04/petite-horloge-revisited.html' title='Petite Horloge revisited'/><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-3454033395947617111.post-5578101668379485987</id><published>2011-04-13T13:44:00.006+02:00</published><updated>2011-04-13T14:45:45.650+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='développement'/><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Polymorph counter example</title><content type='html'>I've discovered that I can write this in Pharo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre style="font-size:0.8em"&gt;"This creates a class and one instance on the fly"&lt;br /&gt;counter := Class new &lt;br /&gt;              superclass: Object; &lt;br /&gt;              addInstVarNamed: 'counter'; &lt;br /&gt;              compile: 'initialize &lt;br /&gt;                           counter := 0';&lt;br /&gt;              compile: 'counterString &lt;br /&gt;                           ^ counter asString';&lt;br /&gt;              compile: 'increment &lt;br /&gt;                           counter := counter + 1. &lt;br /&gt;                           self changed:#counterString';&lt;br /&gt;              compile: 'decrement &lt;br /&gt;                           counter := counter - 1. &lt;br /&gt;                           self changed:#counterString';&lt;br /&gt;              new.&lt;br /&gt;&lt;br /&gt;(UITheme builder newColumn: {&lt;br /&gt;  UITheme builder newLabelFor: counter getLabel: #counterString getEnabled: nil.&lt;br /&gt;  UITheme builder newRow: {&lt;br /&gt;    UITheme builder newButtonFor: counter action: #increment label: '+' help: nil.&lt;br /&gt;    UITheme builder newButtonFor: counter action: #decrement label: '-' help: nil.&lt;br /&gt;  }&lt;br /&gt;}) openInWindowLabeled: 'Counter example'.&lt;/pre&gt;&lt;/code&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-IFNTiQSTc0A/TaWMOGiQ5JI/AAAAAAAAAio/6K5xRGDa0j8/s1600/Counter%2Bexample.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="81" width="101" src="http://4.bp.blogspot.com/-IFNTiQSTc0A/TaWMOGiQ5JI/AAAAAAAAAio/6K5xRGDa0j8/s400/Counter%2Bexample.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Coooooooooooooool ;)</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/5578101668379485987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/04/polymorph-counter-example.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5578101668379485987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5578101668379485987'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/04/polymorph-counter-example.html' title='Polymorph counter example'/><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/-IFNTiQSTc0A/TaWMOGiQ5JI/AAAAAAAAAio/6K5xRGDa0j8/s72-c/Counter%2Bexample.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-4618521976537998786</id><published>2011-03-19T09:28:00.001+01:00</published><updated>2011-03-19T10:29:02.451+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Multiple worlds for Pharo</title><content type='html'>&lt;a href="http://seandenigris.com/blog/?p=767"&gt;Sean DeNigris submitted a changeset to get multiple worlds in Pharo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've played a little with it to get a world switcher. If you want it, first file in the &lt;a href="http://pharo.googlecode.com/issues/attachment?aid=1998046892926746151&amp;name=MultipleWorlds.2.cs&amp;token=7a300580fe8c233c2d7b3c14eee18b9a"&gt;changeset file&lt;/a&gt; (download it the drag the file on an opened image).&lt;br /&gt;&lt;br /&gt;Then the following code add three worlds named 2,3,4 and create a dock in each world.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre style="font-size: 0.9em"&gt;|wm|&lt;br /&gt;wm := WorldManager instance.&lt;br /&gt;#('2' '3' '4') do: [:aString| wm createOrSwitchToWorldNamed: aString].&lt;br /&gt;&lt;br /&gt;wm worlds keysAndValuesDo:  [:aWorldName :aWorld| |dock|&lt;br /&gt;  dock := DockingBarMorph new&lt;br /&gt;          adhereToTop;&lt;br /&gt;          openInWorld: aWorld.&lt;br /&gt;&lt;br /&gt;  wm worlds keysAndValuesDo: [:aWorldName2 :aWorld2|&lt;br /&gt;    dock addMorph: (SimpleButtonMorph new&lt;br /&gt;                    label: aWorldName2;&lt;br /&gt;                    target: [wm createOrSwitchToWorldNamed: aWorldName2];&lt;br /&gt;                    actionSelector: #value) ].&lt;br /&gt;                    &lt;br /&gt;  dock addMorph: (StringMorph contents: aWorldName).&lt;br /&gt;].&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/4618521976537998786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/03/multiple-worlds-for-pharo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4618521976537998786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4618521976537998786'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/03/multiple-worlds-for-pharo.html' title='Multiple worlds for 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>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-1217265663847231725</id><published>2011-02-28T22:23:00.000+01:00</published><updated>2011-02-28T22:23:24.140+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Work on Mocketry</title><content type='html'>Mocketry is a &lt;a href="http://www.squeaksource.com/Mocketry.html"&gt;Mocketry&lt;/a&gt; is Smalltalk mock object framework.&lt;br /&gt;&lt;br /&gt;To load it in Pharo: &lt;code&gt;&lt;pre&gt;Gofer it&lt;br /&gt;  squeaksource: 'MetacelloRepository';&lt;br /&gt;  package: 'ConfigurationOfMocketry';&lt;br /&gt;  load.&lt;br /&gt;&lt;br /&gt;(Smalltalk at:#ConfigurationOfMocketry) project latestVersion load.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I've done the first part of the &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; in a TDD way using Mocketry to prevent external HTTP requests.&lt;code&gt;&lt;pre&gt;Gofer it&lt;br /&gt; squeaksource: 'LaurentLSandbox';&lt;br /&gt; package: 'Picasa';&lt;br /&gt; load.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;As the requests are done using &lt;code&gt;HTTPSocket class&gt;&gt;httpGet:&lt;/code&gt;, one way is to give a mock to PicasaSearch so we can check (and stub) the HTTP request: &lt;br /&gt;&lt;code&gt;&lt;pre style='font-size:0.8em'&gt;PicasaSearchTwoRoughSeaTest&gt;&gt;setUp&lt;br /&gt;  [:mockHTTPSocketClass|&lt;br /&gt;    [photos := PicasaSearch new&lt;br /&gt;        httpSocketClass: mockHTTPSocketClass;&lt;br /&gt;        addKeyword: 'rough';&lt;br /&gt;        addKeyword: 'sea';  &lt;br /&gt;        maxResult: 2;&lt;br /&gt;        photos.] &lt;br /&gt; &lt;br /&gt;     should strictly satisfy: [&lt;br /&gt;        (mockHTTPSocketClass httpGet: &lt;br /&gt;          'http://picasaweb.google.com/data/feed/api/all?q=rough+sea&amp;max-results=2')&lt;br /&gt;        willReturn: self fixtureXMLResponseForTwoRoughSea] &lt;br /&gt;  ] runScenario.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;#fixtureXMLResponseForTwoRoughSea&lt;/code&gt; will return an XML string and test methods will check that it is correctly parsed.&lt;br /&gt;&lt;br /&gt;In PicasaSearch: &lt;code&gt;&lt;pre&gt;httpGetDocument &lt;br /&gt;  |url| &lt;br /&gt;  url := String streamContents: [:aStream|&lt;br /&gt;  aStream &lt;br /&gt;    nextPutAll: 'http://picasaweb.google.com/data/feed/api/all?q=';&lt;br /&gt;    nextPutAll: ('+'  join: self keywords);&lt;br /&gt;    nextPutAll: '&amp;max-results=';&lt;br /&gt;    nextPutAll: self maxResult asString.    &lt;br /&gt;  ].  &lt;br /&gt;&lt;br /&gt;  ^ (self httpSocketClass httpGet: url).&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;See that mocketry extends BlockClosure to create mocks:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;[:myFirstMock :mySecondMock|&lt;br /&gt;"do stuff with mocks"&lt;br /&gt;] runScenario&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;and set up expectations:&lt;code&gt;&lt;pre&gt;[:myFirstMock :mySecondMock|&lt;br /&gt;  [ "do stuff with mocks" ] &lt;br /&gt;  should strictly satisfy: &lt;br /&gt;  [ "what is expected on mocks" ]  &lt;br /&gt;] runScenario&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;See HelpSystem book loaded with Mocketry for several examples.&lt;br /&gt;&lt;br /&gt;Comments and better code propositions are welcome.</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/1217265663847231725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/02/work-on-mocketry.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/1217265663847231725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/1217265663847231725'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/02/work-on-mocketry.html' title='Work on Mocketry'/><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-3454033395947617111.post-3931032837599446520</id><published>2011-02-21T18:37:00.001+01:00</published><updated>2011-02-21T18:38:15.112+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>XML Browser with Pharo</title><content type='html'>I've written a little tool to help me browse xml. If you want to try it:&lt;br /&gt;&lt;pre style="font-size: 0.9em;"&gt;&lt;code&gt;Gofer new&lt;br /&gt; squeaksource: 'LaurentLSandbox';&lt;br /&gt; package: 'XML-GUI';&lt;br /&gt; load.&lt;br /&gt; &lt;br /&gt;((Smalltalk at:#XMLBrowser) labelled: 'Picasa search')&lt;br /&gt;  browseAtUrl: &lt;br /&gt;   'http://picasaweb.google.com/data/feed/api/all?q=lighthouse&amp;amp;max-results=10'.&lt;br /&gt;&lt;/code&gt;&lt;/pre&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/-m2ZqLNiJjVg/TWKhcnWhSrI/AAAAAAAAAiI/Uopqf9jblh0/s1600/xmlbrowser.JPG%2B" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="430" src="http://4.bp.blogspot.com/-m2ZqLNiJjVg/TWKhcnWhSrI/AAAAAAAAAiI/Uopqf9jblh0/s640/xmlbrowser.JPG%2B" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;See &lt;code&gt;XMLBrowser&lt;/code&gt; comment for examples.</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/3931032837599446520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/02/xml-browser-with-pharo.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/3931032837599446520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/3931032837599446520'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/02/xml-browser-with-pharo.html' title='XML Browser with 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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-m2ZqLNiJjVg/TWKhcnWhSrI/AAAAAAAAAiI/Uopqf9jblh0/s72-c/xmlbrowser.JPG%2B' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-4403372315179377726</id><published>2011-02-18T07:57:00.004+01:00</published><updated>2011-02-18T20:05:15.039+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><title type='text'>FizzBuzz Kata: minimal solution</title><content type='html'>Trying to find a minimal solution for the &lt;a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz"&gt;FizzBuzz Kata&lt;/a&gt; in Smalltalk:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;fb := [:counter| |rules|&lt;br /&gt;       rules := {15-&gt;'FizzBuzz'. 5-&gt;'Buzz'. 3-&gt;'Fizz'. 1-&gt;counter}.&lt;br /&gt;       rightRule := rules detect: [:aRule| counter \\ aRule key == 0].&lt;br /&gt;       rightRule value].  &lt;br /&gt;&lt;br /&gt;self assert: (fb value: 7) == 7.&lt;br /&gt;self assert: (fb value: 3) == 'Fizz'.&lt;br /&gt;self assert: (fb value: 5) == 'Buzz'.&lt;br /&gt;self assert: (fb value: 15) == 'FizzBuzz'.&lt;br /&gt;&lt;br /&gt;1 to: 100 do: [:counter | &lt;br /&gt;               Transcript &lt;br /&gt;                 show: (fb value: counter) asString;&lt;br /&gt;                 cr]&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Update: Little variant from Alexandre:&lt;code&gt;&lt;pre&gt;rightRule := rules detect: [:aRule| counter isDivisibleBy: aRule key]&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/4403372315179377726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/02/fizzbuzz-kata-minimal-solution.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4403372315179377726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4403372315179377726'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/02/fizzbuzz-kata-minimal-solution.html' title='FizzBuzz Kata: minimal solution'/><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-3454033395947617111.post-357564619883442515</id><published>2011-02-08T07:45:00.002+01:00</published><updated>2011-02-08T07:53:46.932+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Smalltalk tiny exercise for TDD newbies</title><content type='html'>Done in course:&lt;br /&gt;&lt;br /&gt;Create the category &lt;b&gt;Exercise&lt;/b&gt; in the Browser. All classes you create will be placed in this category.&lt;br /&gt;&lt;br /&gt;Implement the class &lt;b&gt;Operation&lt;/b&gt; (using Test-Driven Development) which should work like this:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;&lt;pre&gt;a := Operation new.&lt;br /&gt;a result.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;Should return 0.&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;pre&gt;b := Operation new.&lt;br /&gt;b add: 2.&lt;br /&gt;b add: 3.&lt;br /&gt;b result.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;Should return 5.&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;pre&gt;Operation new&lt;br /&gt;  add: 2;&lt;br /&gt;  add: 4;&lt;br /&gt;  divideBy: 2;&lt;br /&gt;  result.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;Should return 3.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Add the message &lt;code&gt;Operation&gt;&gt;#multiplyBy&lt;/code&gt; by yourself.</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/357564619883442515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/02/smalltalk-tiny-exercise-for-tdd-newbies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/357564619883442515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/357564619883442515'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/02/smalltalk-tiny-exercise-for-tdd-newbies.html' title='Smalltalk tiny exercise for TDD newbies'/><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-3454033395947617111.post-3292516108964763331</id><published>2011-02-06T19:31:00.002+01:00</published><updated>2011-02-07T07:32:27.364+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>new funny ProfStef lesson</title><content type='html'>Update to last ProfStef (on Pharo 1.2 only):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Gofer it&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;br /&gt;ProfStef &lt;br /&gt;  go;&lt;br /&gt;  tutorial: SmalltalkSyntaxTutorial lesson: #instanciation.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_JLK6EDfW4so/TU7oy0l9GXI/AAAAAAAAAiA/blUz0XgQVWg/s1600/profstef.JPG%2B" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="548" src="http://1.bp.blogspot.com/_JLK6EDfW4so/TU7oy0l9GXI/AAAAAAAAAiA/blUz0XgQVWg/s640/profstef.JPG%2B" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/3292516108964763331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/02/new-funny-profstef-lesson.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/3292516108964763331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/3292516108964763331'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/02/new-funny-profstef-lesson.html' title='new funny ProfStef lesson'/><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://1.bp.blogspot.com/_JLK6EDfW4so/TU7oy0l9GXI/AAAAAAAAAiA/blUz0XgQVWg/s72-c/profstef.JPG%2B' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-4478103539970787473</id><published>2011-02-02T09:12:00.000+01:00</published><updated>2011-02-02T09:12:53.535+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='développement'/><title type='text'>Why technology matters</title><content type='html'>&lt;cite&gt;Life is very short. You have a limited amount of time in which to realize your dreams, in which to do your projects. If you’re like me, you probably have dozens and dozens of ideas for apps, sites, portals, that you want to implement. Most of those ideas will suck. But you don’t know which ones, you won’t know until you try them. Your goal, in this life, is to iterate faster. To fail more, to fail quicker, until you get to the brilliant ideas and brilliant projects that can change the world, or at least make you a dollar or two.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;From &lt;a href="http://smalltalkzen.wordpress.com/2011/02/01/a-secret-passion-and-your-choice-of-web-framework/"&gt;A Secret: Passion and Your Choice of Web Framework by Dmitri Zagidulin&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/4478103539970787473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/02/why-technology-matters.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4478103539970787473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4478103539970787473'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/02/why-technology-matters.html' title='Why technology matters'/><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-3454033395947617111.post-5483474347574978203</id><published>2011-01-28T08:07:00.000+01:00</published><updated>2011-01-28T08:07:51.209+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Smalltalk à l'OSDC.fr 2010</title><content type='html'>Et là j'ai peur en me voyant en vidéo ....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/AYKerE4C" type="application/x-shockwave-flash" width="480" height="299" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/AYKerlcC" type="application/x-shockwave-flash" width="480" height="299" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/AYKemyQC" type="application/x-shockwave-flash" width="480" height="299" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/AYKenB4C" type="application/x-shockwave-flash" width="480" height="299" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/5483474347574978203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/01/smalltalk-losdcfr-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5483474347574978203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5483474347574978203'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/01/smalltalk-losdcfr-2010.html' title='Smalltalk à l&apos;OSDC.fr 2010'/><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-3454033395947617111.post-1624398242190201374</id><published>2011-01-25T22:06:00.005+01:00</published><updated>2011-02-03T08:11:00.671+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Pharo GUI with Polymorph</title><content type='html'>I've written a tiny address book to prepare a screencast on Polymorph basis. If you want to look at it:&lt;code&gt;&lt;/code&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&gt;&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 onOK: adds the new Contact and tells the view to refresh components which depends on #contacts and #hasSelectedContact 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 firstName and lastName of a Contact:&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;ContactEditor&gt;&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).</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/1624398242190201374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/01/pharo-gui-with-polymorph.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/1624398242190201374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/1624398242190201374'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/01/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>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-4736195337328842398</id><published>2011-01-24T10:35:00.007+01:00</published><updated>2011-01-24T22:52:41.485+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='développement'/><title type='text'>CodeRetreat à Grenoble</title><content type='html'>Vendredi dernier je me suis rendu au premier &lt;a href="http://www.coderetreat.com/how-it-works.html"&gt;CodeRetreat&lt;/a&gt; en France organisé par Johan Martinsson, Remy Sanlaville et Miguel Moquillon, avec le soutien du &lt;a href="http://clubagile.org/"&gt;CARA&lt;/a&gt; et &lt;a href="http://www.alpesjug.org/"&gt;Alpes JUG&lt;/a&gt; - merci tout le monde !&lt;br /&gt;&lt;br /&gt;En résumé, le CodeRetreat consiste à enchaîner des itérations d'une heure en pair-programming et Test-Driven Development sur le même problème tout au long de la journée. Le problème choisi était le &lt;a href="http://fr.wikipedia.org/wiki/Jeu_de_la_vie"&gt;jeu de la vie&lt;/a&gt;, qui a les avantages d'offrir plusieurs approches possibles et d'être assez complexe pour ne pas être résolu en 45mn.&lt;br /&gt;&lt;br /&gt;Chaque itération se déroule de la manière suivante:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Constitution des binômes (on change à chaque itération).&lt;/li&gt;&lt;li&gt;45mn de programmation.&lt;/li&gt;&lt;li&gt;15mn de rétrospective.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;C'est agile, le temps est chronométré (belle organisation).&lt;br /&gt;&lt;br /&gt;A la fin des 45mn de programmation, le code est effacé. Comme l'a répété Johan, ce n'est pas le résultat qui compte, mais la démarche, l'approche du développement qu'on doit s'efforcer de faire le plus parfaitement. C'est à dire:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;développement piloté uniquement par les tests&lt;/li&gt;&lt;li&gt;pas de duplication de code&lt;/li&gt;&lt;li&gt;noms clairs et significatifs&lt;/li&gt;&lt;li&gt;code le plus simple possible&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Côté langages nous avions beaucoup de Java. Miguel et moi en avons profité pour faire découvrir Pharo / Smalltalk et faire une session ensemble en Haskell. Il y a aussi eu un peu de Ruby.&lt;br /&gt;&lt;br /&gt;Les 15mn de rétrospective permettaient d'échanger sur les différentes approches, les difficultés rencontrées, succès. On voit bien qu'il y a plusieurs manières d'attaquer le problème. Au fur et à mesure des automatismes se mettent en place ce qui permet de gagner du temps pour aborder d'autres aspects du problème.&lt;br /&gt;&lt;br /&gt;Suit ce que j'en retire.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pair-programming:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Chaque session se déroulait avec un binôme différent et chaque expérience, démarche a du coup été significativement différente. J'ai rencontré plusieurs cas:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;une personne qui a l'idée et une autre qui suit: c'est du coup souvent la personne qui veut voir son idée réalisée qui pilote et qui tape. La personne qui suit dépense beaucoup d'énergie pour rester dans le coup (j'ai été dans cette position sur une session). Il est nécessaire que la personne qui pilote temporise.&lt;/li&gt;&lt;li&gt;deux personnes qui ont des idées: cela amène assez vite a quelques débats sympathiques mais c'est l'expérience qui me semble la plus enrichissante, d'où émerge des solutions de type "waouh, ça c'est cool".&lt;/li&gt;&lt;li&gt;deux personnes ont la même idée, suivent la même route: dans ce cas c'est plus la volonté de bien faire qui ressort et la recherche de qualité / perfection dans la démarche est vraiment élevée&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Dans tous les cas, il y a toujours une bonne ambiance à coder avec des inconnus :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Test-Driven Development:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Je suis convaincu de la démarche et la pratique depuis que j'ai lu eXtreme Programming de Kent Beck vers 2002/2003. Donc je fais partie des gens qui ont des automatismes assez arrêtés sur le sujet :). Pour avoir vu d'autres façons de faire au cours de la session, je reste persuadé que la manière la plus claire est d'avoir:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un TestCase par contexte. Le setUp établit le contexte, les tests font les vérifications.&lt;/li&gt;&lt;li&gt;un assert par test. Avoir plusieurs assert doit rester exceptionnel car ça complexifie les tests (ce n'est pas interdit, mais il faut avoir conscience du compromis).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Un exemple concret est la règle: &lt;a href="http://fr.wikipedia.org/wiki/Jeu_de_la_vie#R.C3.A8gles"&gt;"Si une cellule a exactement deux voisines vivantes, elle reste dans son état actuel à l’étape suivante"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Avec Rémy nous avons codé comme suit (grosso modo, le code a été effacé :)&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;ALivingCellWithTwoOrThreeLivingNeighbours&amp;gt;&amp;gt;#testShouldLive&lt;br /&gt;  |aliveCell|&lt;br /&gt;  aliveCell := Cell new revive.&lt;br /&gt;  self assert: aliveCell isAlive.&lt;br /&gt;&lt;br /&gt;  2 to: 3 do: [:numberOfNeighbours|&lt;br /&gt;    aliveCell numberOfNeighbours: numberOfNeighbours.&lt;br /&gt;    self assert: aliveCell shouldLive.&lt;br /&gt;  ]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Le soucis c'est que quand le test est en échec, il faut débugger pour savoir si ça coince pour deux ou trois cellules.&lt;br /&gt;&lt;br /&gt;Dans ce cas je préfère avoir deux cas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ALivingCellWithTwoLivingNeighbours&lt;/li&gt;&lt;li&gt;ALivingCellWithThreeLivingNeighbours&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ceci dit cela risque d'amener une duplication de code, vu que les tests sont identiques dans chaque cas. Une solution codée avec Aline est d'utiliser des Traits pour définir les tests de manière générique puis de mettre seulement les différences dans les TestCase.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Trait named: #TCellIsAliveAndShouldLive&lt;br /&gt;&lt;br /&gt;TCellIsAliveAndShouldLive&gt;&gt;#testIsAlive&lt;br /&gt;  self assert: self aliveCell isAlive&lt;br /&gt;&lt;br /&gt;TCellIsAliveAndShouldLive&gt;&gt;#testShouldLive&lt;br /&gt;  self assert: self aliveCell shouldLive&lt;br /&gt;&lt;br /&gt;TCellIsAliveAndShouldLive&gt;&gt;#aliveCell&lt;br /&gt;   self explicitRequirement &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Du coup pour nos cas de test:&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;TestCase subclass: #ALivingCellWithTwoLivingNeighbours&lt;br /&gt;  uses: TCellIsAliveAndShouldLive&lt;br /&gt;&lt;br /&gt;ALivingCellWithTwoLivingNeighbours&amp;gt;&amp;gt;#aliveCell&lt;br /&gt;  ^ Cell new&lt;br /&gt;       revive;&lt;br /&gt;       numberOfNeighbours: 2.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;de même:&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;TestCase subclass: #ALivingCellWithThreeLivingNeighbours&lt;br /&gt;  uses: TCellIsAliveAndShouldLive&lt;br /&gt;&lt;br /&gt;ALivingCellWithThreeLivingNeighbours&amp;gt;&amp;gt;#aliveCell&lt;br /&gt;  ^ Cell new&lt;br /&gt;        revive;&lt;br /&gt;        numberOfNeighbours: 3.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Approches&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Les deux approches principales consistaient à commencer par implémenter la Cellule ou bien la Grille / Univers. Il était aussi possible de passer par une classe Neighbours intermédiaire.&lt;br /&gt;&lt;br /&gt;Haskell qui est un langage fonctionnel permet d'avoir une approche par les ensembles. &lt;br /&gt;&lt;br /&gt;Une solution liée à l'imagerie en travaillant en binaire a été évoquée mais pas implémentée à ma connaissance.&lt;br /&gt;&lt;br /&gt;Pour simplifier l'algorithme qui calcule si la cellule doit vivre ou mourir en connaissant son état actuel et le nombre de ses voisins vivants, deux variantes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;avoir deux classes LiveCell et DeadCell qui ont chacune leur algorithme&lt;/li&gt;&lt;li&gt;implémenter le pattern strategy et donc un objet Cell utiliserait soit un DeadCellStrategy, soit un LiveCellStrategy. Ceci à l'avantage de ne pas avoir à changer le type des instances dans la grille&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Avec Smalltalk une solution utilisée pour implémenter le pattern strategy se basait sur les Closures et évitait de créer des classes supplémentaires:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;  Cell&amp;gt;&amp;gt;#liveCellStrategy&lt;br /&gt;    ^ [(liveNeighbours &amp;lt; 2) or: [ liveNeighbours &amp;gt; 3 ]]&lt;br /&gt;&lt;br /&gt;  Cell&amp;gt;&amp;gt;#deadCellStrategy&lt;br /&gt;    ^ [(liveNeighbours = 3) not]&lt;br /&gt;&lt;br /&gt;  Cell&amp;gt;&amp;gt;die&lt;br /&gt;    shouldDieStrategy := self deadCellStrategy&lt;br /&gt;&lt;br /&gt;  Cell&amp;gt;&amp;gt;revive&lt;br /&gt;    shouldDieStrategy := self liveCellStrategy&lt;br /&gt;&lt;br /&gt;  Cell&amp;gt;&amp;gt;#shouldDie&lt;br /&gt;    ^ shouldDieStrategy value&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bilan&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Journée enrichissante et éreintante. La retrospective finale en a un peu pâti vu que tout le monde était fatigué. Une proposition d'amélioration qui me plaît est de découper la session de 45mn en deux pomodoro de 20mn pour ménager notre énergie.&lt;br /&gt;&lt;br /&gt;Quelques "Smalltalk c'est cool" font plaisir ;)&lt;br /&gt;&lt;br /&gt;En tout cas je reste convaincu par l'approche pair-programming qui est trés enrichissante et donne du courage pour explorer de nouvelles pistes et aller plus vite (car on se perds moins).&lt;br /&gt;&lt;br /&gt;C'est dans ces moments là qu'on sent que la programmation est un artisanat au sens noble du terme, où la beauté du résultat est une source de motivation.&lt;br /&gt;&lt;br /&gt;Par &lt;a href="http://twitter.com/#!/bootis"&gt;@bootis&lt;/a&gt; &lt;cite&gt;quality = you know why it works&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://martinsson-johan.blogspot.com/"&gt;Le compte-rendu de Johan&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/4736195337328842398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/01/coderetreat-grenoble.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4736195337328842398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/4736195337328842398'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/01/coderetreat-grenoble.html' title='CodeRetreat à Grenoble'/><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-3454033395947617111.post-1165167172324183723</id><published>2011-01-14T07:56:00.000+01:00</published><updated>2011-01-14T07:56:15.583+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>PharoConf Annecy 2011</title><content type='html'>La première PharoConf Annecy aura lieu le jeudi 10 février à l'IMUS.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pharoconf-annecy.seasidehosting.st/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://pharoconf-annecy.seasidehosting.st/"&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_JLK6EDfW4so/TS_zhQXaYzI/AAAAAAAAAhY/Uyl7fWNfIOU/s1600/pharoconf_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="177" src="http://1.bp.blogspot.com/_JLK6EDfW4so/TS_zhQXaYzI/AAAAAAAAAhY/Uyl7fWNfIOU/s320/pharoconf_2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Site web de l'évènement: &lt;a href="http://pharoconf-annecy.seasidehosting.st/"&gt;http://pharoconf-annecy.seasidehosting.st/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Les interventions seront plus tournées vers des coding-dojo et ateliers, développer du vrai code qui tourne :)&lt;br /&gt;&lt;br /&gt;Deux points forts:&lt;br /&gt;- Randori Test-Driven Development animé par Miguel Moquillon du Club Agile Rhône Alpes&lt;br /&gt;- PharoSprint animé par Stéphane Ducasse&lt;br /&gt;&lt;br /&gt;Entrée gratuite, mettez à jour vos agendas !&lt;br /&gt;&lt;br /&gt;(Et merci de faire passer le message :)</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/1165167172324183723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/01/pharoconf-annecy-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/1165167172324183723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/1165167172324183723'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/01/pharoconf-annecy-2011.html' title='PharoConf Annecy 2011'/><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://1.bp.blogspot.com/_JLK6EDfW4so/TS_zhQXaYzI/AAAAAAAAAhY/Uyl7fWNfIOU/s72-c/pharoconf_2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-5900237171306512417</id><published>2011-01-10T22:42:00.000+01:00</published><updated>2011-01-10T22:42:22.084+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pharo'/><title type='text'>Petite horloge</title><content type='html'>Morphic basics with a little Watch (Horloge in french).&lt;br /&gt;&lt;br /&gt;Add the class:&lt;code&gt;&lt;pre&gt;StringMorph subclass: #Horloge&lt;br /&gt; instanceVariableNames: ''&lt;br /&gt; classVariableNames: ''&lt;br /&gt; poolDictionaries: ''&lt;br /&gt; category: 'Sandbox'&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;One method called periodically thanks to stepping mechanism of Morphic: &lt;code&gt;&lt;pre&gt;Horloge&gt;&gt;step&lt;br /&gt; self contents: Time now printString.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then evaluate in a Workspace: &lt;code&gt;&lt;pre&gt;Horloge new openInWorld.&lt;/pre&gt;&lt;/code&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/TSt8dZbFFPI/AAAAAAAAAhQ/aSBCpW6z02g/s1600/horloge.JPG%2B" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="200" width="266" src="http://4.bp.blogspot.com/_JLK6EDfW4so/TSt8dZbFFPI/AAAAAAAAAhQ/aSBCpW6z02g/s320/horloge.JPG%2B" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Stop the watch: &lt;code&gt;&lt;pre&gt;Horloge allInstances last stopStepping&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Start it again:&lt;code&gt;&lt;pre&gt;Horloge allInstances last startStepping&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finally close it:&lt;code&gt;&lt;pre&gt;Horloge allInstances last delete&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/5900237171306512417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2011/01/petite-horloge.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5900237171306512417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/5900237171306512417'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2011/01/petite-horloge.html' title='Petite horloge'/><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/TSt8dZbFFPI/AAAAAAAAAhQ/aSBCpW6z02g/s72-c/horloge.JPG%2B' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-2512904759871446140</id><published>2010-12-04T09:30:00.000+01:00</published><updated>2010-12-04T09:30:20.593+01:00</updated><title type='text'>My cat is a Linux geek :)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_JLK6EDfW4so/TPn8BhodApI/AAAAAAAAAg4/wuZRFi5qDuA/s1600/IMG_0316.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_JLK6EDfW4so/TPn8BhodApI/AAAAAAAAAg4/wuZRFi5qDuA/s400/IMG_0316.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/2512904759871446140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2010/12/my-cat-is-linux-geek.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/2512904759871446140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/2512904759871446140'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2010/12/my-cat-is-linux-geek.html' title='My cat is a Linux geek :)'/><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://3.bp.blogspot.com/_JLK6EDfW4so/TPn8BhodApI/AAAAAAAAAg4/wuZRFi5qDuA/s72-c/IMG_0316.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3454033395947617111.post-8887757909976586927</id><published>2010-11-28T09:41:00.008+01:00</published><updated>2010-11-28T15:50:38.334+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><title type='text'>Revenge of Smalltalk</title><content type='html'>(Joke inside)&lt;br /&gt;&lt;br /&gt;In Paul Graham's essay &lt;a href="http://paulgraham.com/icad.html"&gt;Revenge of the Nerds&lt;/a&gt; (Read it, good ideas there):&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;Appendix: Power&lt;br /&gt;&lt;br /&gt;As an illustration of what I mean about the relative power of programming languages, consider the following problem. We want to write a function that generates accumulators-- a function that takes a number n, and returns a function that takes another number i and returns n incremented by i.&lt;br /&gt;&lt;br /&gt;(That's incremented by, not plus. An accumulator has to accumulate.)&lt;br /&gt;&lt;br /&gt;In Common Lisp this would be&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;(defun foo (n)&lt;br /&gt;  (lambda (i) (incf n i)))&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;In Smalltalk the code is &lt;b&gt;slightly longer&lt;/b&gt; than in Lisp:&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;foo: n                              &lt;br /&gt;  |s|                      &lt;br /&gt;  s := n.                          &lt;br /&gt;  ^[:i| s := s+i. ]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;cite&gt;&lt;br /&gt;because although in general lexical variables work, you can't do an assignment to a parameter, so you have to create a new variable s.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, the Lisp code has 34 significant characters while the Smalltalk code has only 25 significant characters (we can remove the last dot).  So the Smalltalk code is 26% shorter than the Lisp code :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Perl example: 32 characters&lt;/li&gt;&lt;li&gt;Javascript example: 46 characters&lt;/li&gt;&lt;li&gt;Python example: 54 characters&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Yeah, Smalltalk is really powerful ;P&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://forum.world.st/Cannot-assign-a-parameter-tp3062241p3062283.html"&gt;Looking at Parser code&lt;/a&gt; we can &lt;a href="http://forum.world.st/Cannot-assign-a-parameter-tp3062241p3062359.html"&gt;easily remove the temp. variable limitation&lt;/a&gt; and write:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;foo: n               &lt;br /&gt;  ^[:i| n := n+i]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;So&lt;ul&gt;&lt;li&gt;One power of Smalltalk is to be able to change the system.&lt;/li&gt;&lt;li&gt;17 significant characters: Smalltalk &lt;b&gt;100% more powerful&lt;/b&gt; than Lisp :D&lt;/li&gt;(still a joke - but ....) &lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Why this design decision ? Some explanation from &lt;a href="http://forum.world.st/Cannot-assign-a-parameter-tp3062241p3062411.html"&gt;Nicolas&lt;/a&gt; and &lt;a href="http://forum.world.st/Cannot-assign-a-parameter-tp3062241p3062422.html"&gt;Adrian&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://magaloma.blogspot.com/feeds/8887757909976586927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://magaloma.blogspot.com/2010/11/revenge-of-smalltalk.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/8887757909976586927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3454033395947617111/posts/default/8887757909976586927'/><link rel='alternate' type='text/html' href='http://magaloma.blogspot.com/2010/11/revenge-of-smalltalk.html' title='Revenge of 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>9</thr:total></entry></feed>