tag:blogger.com,1999:blog-104601122024-03-14T06:04:57.052-07:00Dr. Vanessa FreudenbergCroquet, Squeak, etcVanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.comBlogger48125tag:blogger.com,1999:blog-10460112.post-80740213203151783952021-08-30T23:05:00.006-07:002024-02-29T13:33:52.274-08:00Frontend-only Multi-Player. Unlimited Bandwidth. Or: What is Croquet.io, really?<div class="separator" style="clear: both; text-align: center;"><h2>A multi-player web app needs a backend, right?</h2><div class="separator" style="clear: both;">What if I told you, it doesn’t?</div><div class="separator" style="clear: both;"><br /></div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVi6wmcRfNGIUCSMoNSUc0pWMJCMlMCiF_V5CUOM5nLiztUFcFMOuvZDPYVCC2mNiuXCvx47uDtvgcK5OyzZ26TMaOIY1kONh1Meq1V3EXxY3A6a3wx8HZCrLuuW8ovdivWHwT/s978/no-server.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="594" data-original-width="978" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVi6wmcRfNGIUCSMoNSUc0pWMJCMlMCiF_V5CUOM5nLiztUFcFMOuvZDPYVCC2mNiuXCvx47uDtvgcK5OyzZ26TMaOIY1kONh1Meq1V3EXxY3A6a3wx8HZCrLuuW8ovdivWHwT/w400-h243/no-server.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;">Read on for how Croquet gets rid of servers running your multiplayer code.</div><div class="separator" style="clear: both; text-align: center;">No, <i>really</i>.</div>
<div class="separator" style="clear: both; text-align: center;"><i><br /></i></div>
<div class="separator" style="background-color: #eeeeee; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-radius: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; border: 1px solid rgb(204, 204, 204); clear: both; color: #999999; padding: 0.5em 1em; text-align: left;"><div><i>Instantaneous Shared Experiences </i>is how we describe <a href="https://croquet.io/?utm_source=blog&utm_medium=blog&utm_campaign=codefrau_whatiscroquet" target="_blank">Croquet</a> on our website. And while that excellently describes <i>What</i> Croquet does, as Croquet's Chief Architect, I wanted to share a bit about <i>How</i> we do that.</div><div class="separator" style="clear: both; text-align: left;">So I wrote a <a href="https://twitter.com/codefrau/status/1430715818115883008" target="_blank">Twitter thread</a>. Here it is in blog form, slightly extended.</div></div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj68yTPOn5jIIv_1GfNKnrPk3OjiBXHkOFQYFeuR5irhrL-ZyS6R-r66B84x40yu-AJq5JpghA-p7PttwMQfRdouE_tg7bpVmDsxgf7Po9UZosn1u6Otc2djahE3PiHAcHLsDFD/s16000/Reflector+Animation.gif" style="margin: 0em 1em;"><img border="0" data-original-height="810" data-original-width="1440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj68yTPOn5jIIv_1GfNKnrPk3OjiBXHkOFQYFeuR5irhrL-ZyS6R-r66B84x40yu-AJq5JpghA-p7PttwMQfRdouE_tg7bpVmDsxgf7Po9UZosn1u6Otc2djahE3PiHAcHLsDFD/s16000/Reflector+Animation.gif" style="display: block; width: 90%;" /></a><br /><i>Click the animation above if it does not play automatically</i></div><div class="separator" style="clear: both; text-align: center;"><h1><span style="color: #800180;">Croquet lets you build completely client-side multi-user web apps.</span></h1><div class="separator" style="clear: both; text-align: left;">Read that again.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><i>Client-side.</i></div><div class="separator" style="clear: both; text-align: left;"><i>Multi-user.</i></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">No I’m not kidding. I built it, I know it works. 😁 </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Croquet apps run completely client-side:</div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>are hosted as a <i>static</i> web site</li><li>no server-side code needed</li><li>no networking code needed </li></ul></div><div class="separator" style="clear: both; text-align: left;"><i>Croquet is literally virtualizing the server: </i>Instead of running code on a server (or in a serverless function) we run it as a virtual machine (VM) on each client. </div><div class="separator" style="clear: both; text-align: left;">Croquet carefully controls the inputs to these identical VMs so they execute in sync. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">The input events for the shared VMs are routed via Croquet’s global fleet of “reflector” servers. A reflector just bounces events from one user to all users. There’s no computation involved. Reflectors are small and fast. We have them around the globe, and will have many more with extremely low latency soon.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Crucially, the reflector guarantees event order and timing so every VM processes the same event at the same time. (That’s what the <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj68yTPOn5jIIv_1GfNKnrPk3OjiBXHkOFQYFeuR5irhrL-ZyS6R-r66B84x40yu-AJq5JpghA-p7PttwMQfRdouE_tg7bpVmDsxgf7Po9UZosn1u6Otc2djahE3PiHAcHLsDFD/s16000/Reflector+Animation.gif" target="_blank">animation</a> on top shows.)</div><div class="separator" style="clear: both; text-align: left;">Croquet reflectors also send out a continuous heartbeat to keep the VMs running, and in sync, without user input. </div><div class="separator" style="clear: both; text-align: left;"><br /></div>
<div class="separator" style="background-color: #f5e3f8; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-radius: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; border: 1px solid rgb(204, 204, 204); clear: both; padding: 0.5em 1em; text-align: left;"><div class="separator" style="clear: both; text-align: left;"><span style="color: #800180;">Since the “server” is really a VM running on the client, you get unlimited bandwidth from that “server” to the client.</span></div><h3 style="text-align: center;"><span style="color: #800180;">👏Unlimited👏Bandwidth👏</span></h3><div class="separator" style="clear: both; text-align: left;"><span style="color: #800180;">In fact, you can directly “reach into” the replicated VM to pull out any data for rendering. </span><span style="color: #800180;">It’s just a pointer 🤷🏻♀️ </span></div></div>
<div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Croquet also snapshots these VMs, encrypts the snapshots, and uploads them to a server until the next time they are needed.</div><div class="separator" style="clear: both; text-align: left;"><i>The encryption key never leaves the client. Our servers cannot peek into the snapshots. They can’t peek into events either, since those are fully end-to-end encrypted, too. </i></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">And yes this really works. In a web browser. In your browser, in fact. Try this:</div><div class="separator" style="clear: both; text-align: center;"><b><span style="font-size: large;"><a href="https://croquet.io/w3/" target="_blank">croquet.io/w3</a></span></b></div><div class="separator" style="clear: both; text-align: left;">That’s <a href="https://www.youtube.com/watch?v=k5oMTaly9CE" target="_blank">WideWideWorld</a>, an editable voxel world with hundreds of AIs running around, and a water simulation. Scan the QR code in the lower left with your phone (or share the session URL). Both clients will be in sync. </div><div><br /></div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCfNK7C_P7_909tUNtJdwXt6gvd91fvXlQX1HI-g6_TVRJ9s2zyf_jyfwsoLazJ_cahXO-JkR_XUGiQnlryOKRZCMaj17MK0qkr4fXTcUBCa7dQgyCPXe2tqAuNjve97kXXO2O/s1000/waterbig.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="1000" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCfNK7C_P7_909tUNtJdwXt6gvd91fvXlQX1HI-g6_TVRJ9s2zyf_jyfwsoLazJ_cahXO-JkR_XUGiQnlryOKRZCMaj17MK0qkr4fXTcUBCa7dQgyCPXe2tqAuNjve97kXXO2O/s1000/waterbig.gif" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: left;">Of course, to build something like WideWideWorld on top of Croquet you’ll need to know how to build a game in the first place. This prototype is by our own <a href="https://twitter.com/bbupton" target="_blank">Brian Upton</a> (whom you might recognize from Rainbow Six & Ghost Recon). He joined us because no other tech would allow him to build this. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Croquet is especially good for:</div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>multi-user AR / VR / WebXR</li><li>multi-player games</li><li>collaborative design and construction</li><li>synchronized media</li><li>shared simulations</li><li>quick prototyping of shared experiences</li></ul></div><div class="separator" style="clear: both; text-align: left;">These are hard to build, and some of the really hard parts are always the networking and server design, implementation, deployment, and scaling. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Croquet eliminates this headache.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">By the way, we are not <i>literally</i> running a Docker image in the browser. Although that would be a fun exercise – theoretically, Croquet can run anything that is deterministic and serializable.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">No, it’s just JavaScript. The ECMAScript standard provides the semantic guarantees we need to achieve bit-identical execution across all platforms. Even WASM can be used with some care.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Plus our <a href="https://croquet.io/docs/croquet/?utm_source=blog&utm_medium=blog&utm_campaign=codefrau_whatiscroquet" target="_blank">API</a> is <i>much</i> simpler than traditional client/server code. Your shared server “VM” can be a single class, and you interact with it simply using publish/subscribe!</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioSk14DRaP2JDlvkP3Np8FYIyrygHS-1-9J-T5CI_VaPFL-L5HBUS1bf039Ba2Vi61sHnzaxwPWJayHSYq0u6RCu1pY-nO3Ujl4Owenk2emmSafsHtkXMK6_H2vhQy3hJG6327/s1034/counter.png" style="margin-left: 1em; margin-right: 1em;"><img alt="class Counter extends Croquet.Model { init() { this.n = 0; this.subscribe("counter", "set", this.set); this.tick(); } set(value) { this.n = value; this.publish("counter", "changed"); } tick() { this.n++; this.publish("counter", "changed"); this.future(1000).tick(); } }" border="0" data-original-height="838" data-original-width="1034" height="518" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioSk14DRaP2JDlvkP3Np8FYIyrygHS-1-9J-T5CI_VaPFL-L5HBUS1bf039Ba2Vi61sHnzaxwPWJayHSYq0u6RCu1pY-nO3Ujl4Owenk2emmSafsHtkXMK6_H2vhQy3hJG6327/w640-h518/counter.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><i>The value of n will be synchronized between all VMs</i></div><div class="separator" style="clear: both; text-align: center;"><i>even as it is incrementing automatically.</i></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">We have many simple tutorials to get you started: </div><div class="separator" style="clear: both; text-align: center;"><a href="https://croquet.io/docs/croquet/?utm_source=blog&utm_medium=blog&utm_campaign=codefrau_whatiscroquet" target="_blank"><span style="font-size: large;">croquet.io/docs/croquet</span></a></div><div class="separator" style="clear: both; text-align: left;">(also: hiring a <a href="https://twitter.com/hashtag/DevRel" target="_blank">#DevRel</a> engineer to write more) </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">We are working on higher-level frameworks, too:</div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li><a href="https://twitter.com/yoshikiohshima" target="_blank">Yoshiki Ohshima</a>’s Croquet Virtual DOM (which even allows <a href="https://twitter/hashtag/livecoding" target="_blank">#livecoding</a>)</li><li><a href="https://twitter.com/bbupton" target="_blank">Brian Upton</a>’s Croquet WorldCore (the Game Engine behind W3 we <a href="https://www.youtube.com/watch?v=k5oMTaly9CE" target="_blank">demoed</a> at GDC)</li></ul></div><div class="separator" style="clear: both; text-align: left;">VDOM is already available, and WorldCore soon! See <a href="https://croquet.io/docs/?utm_source=blog&utm_medium=blog&utm_campaign=codefrau_whatiscroquet" target="_blank">croquet.io/docs</a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">By the way, if you heard of Croquet about 15 years ago – yes, that was us too, in particular our founder <a href="https://twitter.com/gocroquet" target="_blank">David Smith</a> working with Alan Kay. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">That system was written in <a href="https://twitter.com/SqueakSmalltalk" target="_blank">Squeak Smalltalk</a> and had a fancy 3D UI.</div><div class="separator" style="clear: both; text-align: left;">Our new JS system has no UI, so it's good for many kinds of apps.</div><div class="separator" style="clear: both; text-align: left;"><br /></div>
<div class="separator" style="background-color: #f5e3f8; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-radius: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; border: 1px solid rgb(204, 204, 204); clear: both; padding: 0.5em 1em; text-align: left;"><div class="separator" style="clear: both; text-align: left;"><span style="color: #800180;">JavaScript has become incredibly rich, but it has no simple way of communicating with the person on the phone next to you.</span></div><div class="separator" style="clear: both; text-align: left;"><span style="color: #800180;"><br /></span></div><div class="separator" style="clear: both; text-align: left;"><span style="color: #800180;"><b>Croquet provides this missing infrastructure for the web.</b></span></div></div>
<div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><a href="https://croquet.io/?utm_source=blog&utm_medium=blog&utm_campaign=codefrau_whatiscroquet" target="_blank">Try it</a>! No servers needed.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">(if you 💜 servers <a href="https://croquet.io/careers/?utm_source=blog&utm_medium=blog&utm_campaign=codefrau_whatiscroquet" target="_blank">come work with us</a> though)</div><div class="separator" style="clear: both; text-align: left;">End-Of-Thread 🧵</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><i>Compiled from a <a href="https://twitter.com/codefrau/status/1430715818115883008" target="_blank">Twitter Thread</a> I posted the day after Croquet's <a href="https://croquet.io/news/?utm_source=blog&utm_medium=blog&utm_campaign=codefrau_whatiscroquet" target="_blank">public launch</a>.</i></div></div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com1tag:blogger.com,1999:blog-10460112.post-24905244026765681712017-11-17T12:36:00.001-08:002021-01-20T16:47:46.978-08:00Emulating Smalltalk-76If you got as excited as me about Dan Ingalls' <a href="https://www.youtube.com/watch?v=4m_GhapEBLQ&t=55m45s">live Smalltalk-76 demo</a> on an actual 1970's Xerox Alto, you may have wanted to try it yourself. <div><br /></div><div>For one, you could try my <a href="https://codefrau.github.io/Smalltalk78/" target="_blank">Smalltalk-78</a> VM. Smalltalk-78 is a leaner version of Smalltalk-76 but very much identical in syntax semantics. </div><div><br /></div><div>It is also possible to run the full Smalltalk-76 environment, and here is how:</div><div>
<br />
First, you need an emulator for the Alto computer. Ken Shiriff posted a nice piece on how to run <a href="http://www.righto.com/2016/10/simulating-xerox-alto-with-contralto.html">ContrAlto on Windows</a>. It is written in C# and I got it to work on my Mac using Mono. So here's a step-by-step:<br />
<br />
<ol>
<li>Install <b>Mono</b> from <a href="http://www.mono-project.com/download/">http://www.mono-project.com/download/</a></li>
<li>Download <b>ContrAlto-mono.zip</b> from <a href="https://github.com/livingcomputermuseum/ContrAlto/releases">https://github.com/livingcomputermuseum/ContrAlto/releases</a></li>
<li>Download this <b>Smalltalk-76 disk</b> image: <a href="http://www.bitsavers.org/bits/Xerox/Alto/disk_images/chm/xmsmall.zip">http://www.bitsavers.org/bits/Xerox/Alto/disk_images/chm/xmsmall.zip</a></li>
<li>Unzip both <b>ContrAlto-mono.zip</b> and <b>xmsmall.zip</b> in the same folder.</li>
<li>In a terminal, change to the ContrAlto directory and run <b><span style="font-family: "courier new" , "courier" , monospace;">mono Contralto.exe</span></b>.
<span class="s1"><span style="font-variant-ligatures: normal;">This opens the Alto screen in a new window, and the emulator control in the terminal. </span></span></li>
<li><span class="s1"><span style="font-variant-ligatures: normal;">(if you get an error about a missing SDL library at this point, install that via <a href="https://brew.sh/">homebrew</a> using <span style="font-family: Courier New, Courier, monospace;"><b>brew install sdl2</b></span>)</span></span></li>
<li><span class="s1"><span style="font-variant-ligatures: normal;">At the emulator's "<b><span style="font-family: "courier new" , "courier" , monospace;">></span></b>" prompt, type <b><span style="font-family: "courier new" , "courier" , monospace;">load disk 0 xmsmall.dsk</span> </b>and then<b> <span style="font-family: "courier new" , "courier" , monospace;">start</span></b>:</span></span><br />
<blockquote class="tr_bq">
<div class="p1">
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">$ <b>mono Contralto.exe</b></span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">ContrAlto v1.2.2.0 (c) 2015-2017 Living Computers: Museum+Labs.</span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">Bug reports to joshd@livingcomputers.org</span></span></div>
<div class="p2">
<span style="font-family: "courier new" , "courier" , monospace;"><span class="s1"></span><br /></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">You are at the ContrAlto console.<span class="Apple-converted-space"> </span>Type 'show commands' to see</span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">a list of possible commands, and hit Tab to see possible command completions.</span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">><b>load disk 0 xmsmall.dsk</b></span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">Drive 0 loaded.</span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">><b>start</b> <span class="Apple-converted-space"> </span></span></span></div>
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">Alto started.</span></span></div>
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; min-height: 17.0px}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>
<br />
<div class="p1">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">></span></span></div>
</div>
</blockquote>
</li>
<li>
In the Alto screen window, type <b>resume xmsmall.boot</b> to start up Smalltalk-76:<br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9oTc4XtDpT10rGfp67Sfj4yQj8EdLTKog86m0DexO5zjngox5LF76nYA1d5oMga5-fZXyXzyrFv5S95Wd4Ncaoqu7EuCY1H9IiCWYFGcK49VdLX2pf909QEfdrXiQu9HJj5zo/s1600/Screenshot+2017-11-17+21.12.31.png" style="margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="80" data-original-width="655" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9oTc4XtDpT10rGfp67Sfj4yQj8EdLTKog86m0DexO5zjngox5LF76nYA1d5oMga5-fZXyXzyrFv5S95Wd4Ncaoqu7EuCY1H9IiCWYFGcK49VdLX2pf909QEfdrXiQu9HJj5zo/s400/Screenshot+2017-11-17+21.12.31.png" width="400" /></a></li>
<li>And now you should see Smalltalk-76 running!
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0yebXOqTuVmZKGl4rEwsyU64SO_8YfU0oge49UYrKEtTeqo_XUyXRRiq6fxIFGhhJEs-AsYfJJBcq0ZqAuE8oqMG676kKihK50by1j5O60Nqf6MWoFsCuDJgKbzE0FGjDTBjI/s1600/Screenshot+2017-11-17+21.24.23.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1223" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0yebXOqTuVmZKGl4rEwsyU64SO_8YfU0oge49UYrKEtTeqo_XUyXRRiq6fxIFGhhJEs-AsYfJJBcq0ZqAuE8oqMG676kKihK50by1j5O60Nqf6MWoFsCuDJgKbzE0FGjDTBjI/s400/Screenshot+2017-11-17+21.24.23.png" width="305" /></a></div>
</li>
<li>There is no explicit "save" option. The <a href="http://xenon.stanford.edu/~eswierk/misc/kaehler81/">OOZE</a> object swapping system continuously writes objects to the disk. Use "quit" from the main menu to flush all objects back to disk.</li>
</ol>
Note that you will need a <b>3 button mouse</b> to properly interact with the system. On my MacBook, I installed <a href="http://magicprefs.com/">MagicPrefs</a> to emulate a third mouse button. After installing, in MagicPref's "MacBook Trackpad" section, for "Three Finger Click" choose "Middle Click".<br />
<br />
You will also need some keyboard shortcuts to access the special characters in Smalltalk-76:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">ctrl A ≤ (less or equal)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl B bold</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl C user interrupt</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl F ≡ (identical)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl G ◦ (index operator)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl I italic</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl N ≠ (not equal)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl O ↪ (quote)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl Q ⇑ (return)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl R ≥ (greater or equal)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl S 's (eval operator)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl T ┗ (prompt)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl U ¬ (unary minus)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl X clear emphasis</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl / ⇒ (if then)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl = ≡ (identical)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl shift = ≠ (not equal)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl \ ≠ (not equal)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl ] ⌾ (create point)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl [ ◦ (index operator)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl : ⦂ (open colon)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl ' ↪ (literal quote)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl < ≤ (less or equal)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl > ≥ (greater or equal)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">shift - ¬ (unary minus)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">cursor down doit (in dialog view)</span>
</blockquote>
To learn Smalltalk-76, the User Manual is a good starting point:<br />
<a href="http://xeroxalto.computerhistory.org/Filene/Smalltalk-76/.document.press!1.pdf">http://xeroxalto.computerhistory.org/Filene/Smalltalk-76/.document.press!1.pdf</a><style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; min-height: 17.0px}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style><style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; min-height: 17.0px}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style><style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style><br />
<br />
Have fun!</div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com1tag:blogger.com,1999:blog-10460112.post-87514297058584650692014-08-29T14:06:00.005-07:002023-02-10T21:35:51.550-08:00Deconstructing Floats: frexp() and ldexp() in JavaScriptWhile working on my <a href="https://squeak.js.org/" target="_blank">SqueakJS</a> VM, it became necessary to deconstruct floating point numbers into their mantissa and exponent parts, and assembling them again. Peeking into the C sources of the regular VM, I saw they use the <span style="font-family: "courier new" , "courier" , monospace;"><a href="http://man7.org/linux/man-pages/man3/frexp.3.html" target="_blank">frexp</a>()</span><span style="font-family: inherit;"> </span>and <span style="font-family: "courier new" , "courier" , monospace;"><a href="http://man7.org/linux/man-pages/man3/ldexp.3.html" target="_blank">ldexp</a>()</span> functions found in the standard C math library.<br />
<br />
Unfortunately, JavaScript does not provide these two functions. But surely there must have been someone who needed these before me, right? Sure enough, a Google search came up with a few implementations. However, an hour later I was convinced none of them actually are fully equivalent to the C functions. They were imprecise, that is, deconstructing a float using <span style="font-family: "courier new" , "courier" , monospace;">frexp()</span> and reconstructing it with<span style="font-family: inherit;"> </span><span style="font-family: "courier new" , "courier" , monospace;">ldexp()</span> did not result in the original value. But that is the basic use case: for all float values, if<div><div style="background-color: white; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; line-height: 20px; white-space: pre;"><br /></div><div style="background-color: white; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; line-height: 20px; white-space: pre;"> [<span style="color: #0070c1;">mantissa</span>, <span style="color: #0070c1;">exponent</span>] = <span style="color: #795e26;">frexp</span>(value)</div></div><div><br /></div><div>then</div><div style="text-align: left;"><div style="line-height: 20px;"><div style="background-color: white; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; white-space: pre;"><span style="color: #001080;"><br /></span></div><div style="background-color: white; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; white-space: pre;"><span style="color: #001080;"> value</span> = <span style="color: #795e26;">ldexp</span>(<span style="color: #0070c1;">mantissa</span>, <span style="color: #0070c1;">exponent</span>)</div><div style="line-height: 20px;"><br /></div>even if the value is <a href="https://en.wikipedia.org/wiki/Subnormal_numbers" target="_blank">subnormal</a>. None of the implementations (even the complex ones) really worked.<br /><br /></div><div style="line-height: 20px;">I had to implement it myself, and here is my implementation (also as <a href="https://jsfiddle.net/p7zwv92k/2/" target="_blank">JSFiddle</a>):<br /></div><div style="line-height: 20px;"><br /></div></div><div style="text-align: left;"><span style="color: blue; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; white-space: pre;">function</span><span style="background-color: white; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; white-space: pre;"> </span><span style="color: #795e26; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; white-space: pre;">frexp</span><span style="background-color: white; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; white-space: pre;">(</span><span style="color: #001080; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; white-space: pre;">value</span><span style="background-color: white; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; white-space: pre;">) {</span><div style="background-color: white; font-family: "JetBrains Mono", "Fira Code", Menlo, Monaco, "Courier New", monospace, Menlo, Monaco, "Courier New", monospace; font-size: 13px; line-height: 20px; white-space: pre;"><div> <span style="color: #af00db;">if</span> (<span style="color: #001080;">value</span> === <span style="color: #098658;">0</span>) <span style="color: #af00db;">return</span> [<span style="color: #001080;">value</span>, <span style="color: #098658;">0</span>];</div><div> <span style="color: blue;">var</span> <span style="color: #001080;">data</span> = <span style="color: blue;">new</span> <span style="color: #267f99;">DataView</span>(<span style="color: blue;">new</span> <span style="color: #267f99;">ArrayBuffer</span>(<span style="color: #098658;">8</span>));</div><div> <span style="color: #001080;">data</span>.<span style="color: #795e26;">setFloat64</span>(<span style="color: #098658;">0</span>, <span style="color: #001080;">value</span>);</div><div> <span style="color: blue;">var</span> <span style="color: #001080;">bits</span> = (<span style="color: #001080;">data</span>.<span style="color: #795e26;">getUint32</span>(<span style="color: #098658;">0</span>) >>> <span style="color: #098658;">20</span>) & <span style="color: #098658;">0x7FF</span>;</div><div> <span style="color: #af00db;">if</span> (<span style="color: #001080;">bits</span> === <span style="color: #098658;">0</span>) { <span style="color: green;">// denormal</span></div><div> <span style="color: #001080;">data</span>.<span style="color: #795e26;">setFloat64</span>(<span style="color: #098658;">0</span>, <span style="color: #001080;">value</span> * <span style="color: #267f99;">Math</span>.<span style="color: #795e26;">pow</span>(<span style="color: #098658;">2</span>, <span style="color: #098658;">64</span>)); <span style="color: green;">// exp + 64</span></div><div> <span style="color: #001080;">bits</span> = ((<span style="color: #001080;">data</span>.<span style="color: #795e26;">getUint32</span>(<span style="color: #098658;">0</span>) >>> <span style="color: #098658;">20</span>) & <span style="color: #098658;">0x7FF</span>) - <span style="color: #098658;">64</span>;</div><div> }</div><div> <span style="color: blue;">var</span> <span style="color: #001080;">exponent</span> = <span style="color: #001080;">bits</span> - <span style="color: #098658;">1022</span>;</div><div> <span style="color: blue;">var</span> <span style="color: #001080;">mantissa</span> = <span style="color: #795e26;">ldexp</span>(<span style="color: #001080;">value</span>, -<span style="color: #001080;">exponent</span>);</div><div> <span style="color: #af00db;">return</span> [<span style="color: #001080;">mantissa</span>, <span style="color: #001080;">exponent</span>];</div><div>}</div><br /><div><span style="color: blue;">function</span> <span style="color: #795e26;">ldexp</span>(<span style="color: #001080;">mantissa</span>, <span style="color: #001080;">exponent</span>) {</div><div> <span style="color: blue;">var</span> <span style="color: #001080;">steps</span> = <span style="color: #267f99;">Math</span>.<span style="color: #795e26;">min</span>(<span style="color: #098658;">3</span>, <span style="color: #267f99;">Math</span>.<span style="color: #795e26;">ceil</span>(<span style="color: #267f99;">Math</span>.<span style="color: #795e26;">abs</span>(<span style="color: #001080;">exponent</span>) / <span style="color: #098658;">1023</span>));</div><div> <span style="color: blue;">var</span> <span style="color: #001080;">result</span> = <span style="color: #001080;">mantissa</span>;</div><div> <span style="color: #af00db;">for</span> (<span style="color: blue;">var</span> <span style="color: #001080;">i</span> = <span style="color: #098658;">0</span>; <span style="color: #001080;">i</span> < <span style="color: #001080;">steps</span>; <span style="color: #001080;">i</span>++)</div><div> <span style="color: #001080;">result</span> *= <span style="color: #267f99;">Math</span>.<span style="color: #795e26;">pow</span>(<span style="color: #098658;">2</span>, <span style="color: #267f99;">Math</span>.<span style="color: #795e26;">floor</span>((<span style="color: #001080;">exponent</span> + <span style="color: #001080;">i</span>) / <span style="color: #001080;">steps</span>));</div><div> <span style="color: #af00db;">return</span> <span style="color: #001080;">result</span>;</div><div>}</div><div> </div></div>My <span style="font-family: "courier new" , "courier" , monospace;">frexp()</span> uses a <span style="font-family: "courier new" , "courier" , monospace;">DataView</span> to extract the exponent bits of the <a href="http://en.wikipedia.org/wiki/IEEE_floating_point" target="_blank">IEEE-754</a> float representation. If those bits are 0 then it is a subnormal. In that case I normalize it by multiplying with 2<sup>64</sup>, getting the bits again, and subtracting 64. After applying the bias, the exponent is ready, and used to get the mantissa by canceling out the exponent from the original value.<br />
<br />
My <span style="font-family: "courier new" , "courier" , monospace;">ldexp()</span> is pretty straight-forward, except it needs to be able to multiply by very large and very small numbers. The smallest positive float is 0.5<sup>-1073</sup>, and to get its mantissa we need to multiply with 2<sup>1073</sup>. That is larger then the largest float 2<sup>1023</sup>. By multiplying in steps we can deal with that. Three steps are needed for e.g. <span style="font-family: "courier new" , "courier" , monospace;">ldexp(</span><span style="font-family: "courier new" , "courier" , monospace;">5e-324, 1023+1074</span><span style="font-family: "courier new" , "courier" , monospace;">)</span> which otherwise would result in <span style="font-family: "courier new" , "courier" , monospace;">Infinity</span>.<br />
<br />
So there you have it. Hope it's useful to someone.<br />
<br />
<b>Update:</b> I wrote this in 2014. Since 2016 there are npm packages with (apparently) correct implementations that are a lot more optimized than mine. They also have hundreds of lines of code so are much less understandable, but for production use they are likely a better choice:
<a href="https://www.npmjs.com/package/math-float64-frexp">math-float64-frexp</a> and
<a href="https://www.npmjs.com/package/math-float64-ldexp">math-float64-ldexp</a>. <br />
<br />
<b>Correction:</b> The code I originally posted here for <span style="font-family: "courier new" , "courier" , monospace;">ldexp()</span> still had a bug, it did not test for too small exponents. I fixed it above, and updated the JSFiddle, too. Also, Nicolas Cellier noticed other rounding and underflow problems, his suggestions for <span style="font-family: "courier new" , "courier" , monospace;">ldexp()</span> are now used above.</div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com6tag:blogger.com,1999:blog-10460112.post-13466084948495896012014-07-04T13:42:00.001-07:002014-07-04T13:42:57.211-07:00SqueakJS runs Etoys now<b>TL;DR:</b> Try <a href="http://bertfreudenberg.github.io/SqueakJS/etoys/" target="_blank">Etoys in your web browser</a> without a plugin (still buggy, but even works on iPad). Feedback from more platforms is very welcome, and fixes to improve the compatibility, too.<br />
<div style="text-align: center;">
—</div>
Half a year has passed since <a href="https://www.blogger.com/2013/12/squeakjs-lively-squeak-vm.html" target="_blank">my initial release</a> of SqueakJS. Now I can report on some significant progress since then.<br />
<br />
For one, I adopted a UI layout similar to Dan’s <a href="http://lively-web.org/users/Dan/ALTO-Smalltalk-72.html" target="_blank">Smalltalk-72</a> emulator, where the debugger interface is only visible when the system is stopped. Now that the basics are working, there is no need to show the debugger all the time. Try it yourself at the <a href="http://lively-web.org/users/bert/squeak.html" target="_blank">Lively page</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnxim_cnuTLLgaV2Fi3K_xZhZ3F1aCRDBBNcjx4Ki82BOFiU3q52d-Z_z6i6o2gbg8KXoZh9kkZJuuzqZv2W0fGaStPgZ62xJ5SnXKr72mEZT0EokDb3PU_LVEje6CTqEDwJ1a/s1600/SqueakJS-Etoys-debug-20140704.png" height="321" width="400" /></div>
<br />
But more importantly, many more subsystems are working now. BitBlt is almost complete (all the important modes are implemented), WarpBlt works (for scaling and rotating morphs), the image can be saved, an emulated file system supports reading and writing of persistent files. This now is enough to not only run the very old and undemanding “mini.image”, but SqueakJS now can even run the very latest Etoys image, the same version as on <a href="http://squeakland.org/" target="_blank">Squeakland</a>. Beware of the many incomplete features and outright bugs still left to be fixed, but try it for yourself <a href="http://bertfreudenberg.github.io/SqueakJS/etoys/" target="_blank">here</a>.<br />
<br />
While Etoys feels a lot slower than the MVC “mini.image”, and some operations take many seconds, it is surprisingly responsive for normal interaction. On the browsers with the fastest JIT compilers (Safari on Mac, IE on Windows) it is almost good enough, even though no serious optimizations were done yet. It is also interesting to see that some browsers (Chrome and Firefox) are currently significantly slower. And not just a little slower, but Safari outperforms Chrome by 200% for this workload! This is likely due to Safari’s excellent LLVM-based <a href="https://www.webkit.org/blog/3362/introducing-the-webkit-ftl-jit/" target="_blank">FTL JIT</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMyw4XObeXp62HDRIyNy4VukBLpTlbFiisZXjgnQkncMT35d98P7C84tjdJaOU4CjBsd24MRuDZ00AtXLR3SIPv-q9BOBYZ7vkU5kdGRxrlqLr9TiOXFwN0QqhgpKpWNyyxNgi/s1600/SqueakJS-Etoys-20140704.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMyw4XObeXp62HDRIyNy4VukBLpTlbFiisZXjgnQkncMT35d98P7C84tjdJaOU4CjBsd24MRuDZ00AtXLR3SIPv-q9BOBYZ7vkU5kdGRxrlqLr9TiOXFwN0QqhgpKpWNyyxNgi/s1600/SqueakJS-Etoys-20140704.png" height="321" width="400" /></a></div>
<br />
The remarkable thing about the screenshot above is how unremarkable it looks. Apart from the missing white oval behind the “Home” label it looks just like it’s supposed to. In comparison, a week ago the screen still looked like this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieLkIAs677QFzonJpEj_k9l65mQblIyANH3X6eFKTvugi1TyVr6d-W3lTgDcbNJVB87w8FvHg7do6ysmKHYt87I0jtlFky1nqLrSJi4NixI9G6-82klHZ0Fw1FQjoeRhtdA0tM/s1600/SqueakJS-Etoys-20140701.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieLkIAs677QFzonJpEj_k9l65mQblIyANH3X6eFKTvugi1TyVr6d-W3lTgDcbNJVB87w8FvHg7do6ysmKHYt87I0jtlFky1nqLrSJi4NixI9G6-82klHZ0Fw1FQjoeRhtdA0tM/s1600/SqueakJS-Etoys-20140701.png" height="300" width="400" /></a></div>
<span id="goog_1191928497"></span><span id="goog_1191928498"></span><br />
The difference is that <a href="https://github.com/krono/" target="_blank">Tobias Pape</a> and I added support for <i>Balloon2D</i> rendering. This is Squeak’s default vector rendering engine, originally created by Andreas Raab to show Flash animations. But unlike the rest of the SqueakJS VM, we did not port the original code. Instead, our plugin intercepts the drawing commands and renders them using HTML5 canvas drawing routines. While still far from complete, it can already render one kind of important shapes: TrueType font glyphs. They are defined by Bézier curves, which need to be rendered with anti-aliasing to look nice. And now that we can render text, the graphics are almost complete. Many more details still need to be implemented, especially color gradients.<br />
<br />
This highlights one strength of Squeak: The VM and its plugin modules present a well-defined, stable interface to the outside world. That is what makes a machine truly “virtual”. In contrast, other systems rely on FFI (the foreign function interface) or similar techniques for extension. While convenient during rapid development, it does not keep the interface small and stable. That interface is overly broad and unpredictable. Typically, client code must be special-cased per platform. It's calling C functions directly, which may or may not exist on a given platform. That makes it much harder to move the system to another platform, and in particular one that is completely different, like the web browser. The Squeak Etoys image on the other hand did not have to be modified at all.<br />
<br />
What I’d like to see fixed in Squeak is that there should be working fallback code for all non-essential primitive functions. This would make it much easier to get up and running on new platforms.<br />
<br />
For SqueakJS, bugs need to get fixed, and many features are still missing to run Etoys fully. Adding support for other Squeak releases than Etoys would be great (closure/Cog/Spur images). Contributions are welcome: fork my <a href="https://github.com/bertfreudenberg/SqueakJS" target="_blank">github project</a>.Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com2tag:blogger.com,1999:blog-10460112.post-36614801592030357942013-12-20T13:19:00.000-08:002020-06-26T14:08:03.432-07:00SqueakJS: A Lively Squeak VMI'm proud to announce SqueakJS, a new Squeak VM that runs on Javascript:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://bertfreudenberg.github.io/SqueakJS/" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTSJCF9tUQ2aCoFfMEd58YuuCQecqUzXHK5KmmWobnbvVWvecNMDzljZjfkA47m7gLkvxK7eYCWbrMF00GkqTObC5I9dtgiZnFuv2Ipq4uCwFq9KldOA9bnDHsPWQgrksDaeQq/s1600/Squeaky160-bf.png" />
</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://squeak.js.org/" target="_blank"><span id="goog_1952089222"></span><span id="goog_1952089223"></span>SqueakJS project page</a></div>
<br />
It was inspired by Dan's JSqueak/Potato VM for Java, and similarly only runs the old Squeak 2.2 mini.image for now. But I developed it inside the Lively Kernel, which allowed me to make a nice UI to look inside the VM (in addition to all the Lively tools):<br />
<div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRWZF4QPNQuXml_Vj5ggWDGFzXTxFw8TdVUEi0w1UWs1krXP3WiuwHS9Ay01GwOMa8Vbv0KFL4vtWC7SL4INqLRyZpqMLG8N6QjGh3wNUki2AtJ7npFvE4PwOGEhgWfyaopER9/s1600/SqueakJS-Lively.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRWZF4QPNQuXml_Vj5ggWDGFzXTxFw8TdVUEi0w1UWs1krXP3WiuwHS9Ay01GwOMa8Vbv0KFL4vtWC7SL4INqLRyZpqMLG8N6QjGh3wNUki2AtJ7npFvE4PwOGEhgWfyaopER9/s640/SqueakJS-Lively.png" width="640" /></a></div>
<br /></div>
<div>
<div>
It represents regular Squeak objects as Javascript objects with direct object references. SmallIntegers are represented as Javascript numbers, there is no need for tagging. Instance variables and indexable fields are held in a single array named "pointers". Word and byte binary objects store their data in arrays named "bytes" or "words". CompiledMethod instances have both "pointers" and "bytes". Float instances are not stored as two words as in Squeak, but have a single "float" property that stores the actual number (and the words are generated on-the-fly when needed).</div>
<div>
<br /></div>
<div>
For garbage collection, I came up with a hybrid scheme: the bulk of the work is delegated to the Javascript garbage collector. Only in relatively rare circumstances is a "manual" garbage collection needed. This hybrid GC is a semi-space GC with an old space and a new space. Old space is a linked list of objects, but newly allocated objects are not added to the list, yet. Therefore, unreferenced new objects will be automatically garbage-collected by Javascript. This is like Squeak's incremental GC, which only looks at objects in new space. The full GC is a regular mark-and-sweep: it's marking all reachable objects (old and new), then unmarked old objects get removed (a very cheap operation in a linked list), and new objects (identified by their missing link) are added to the old-space list. One nice feature of this scheme is that its implementation does not need weak references, which Javascript currently does not support.</div>
<div>
<br /></div>
<div>
This scheme also trivially supports object enumeration (Squeak's nextObject/nextInstance primitives): If the object is old, the next object is just the next link in the list. Otherwise, if there are new objects (newSpaceCount > 0) a GC is performed, which creates the next object link. But if newSpaceCount is 0, then this was the last object, and we're done.</div>
<div>
<br /></div>
<div>
The UI for now copies the Squeak display bitmap pixel-by-pixel to a typed array and shows it on the HTML 2D canvas using putImageData(). Clipboard copying injects a synthetic CMD-C keyboard event into the VM, then runs the interpreter until it has executed the clipboard primitive in response, then answers that string. This is because the web browser only allows clipboard access inside the copy/paste event handlers. You can drag an image file from your disk into the browser window to load it.</div>
<div>
<br /></div>
<div>
Besides running it on your desktop, you can install it as offline web app on an iPad:<br />
<br /></div>
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRRqenjuyz7VhOo4p1S__Vqift-lYbzCuNqarZ9HzBlcSxrEbRk9yI2f0EQniribUVb5oDJ-Dfql67l6-fo23JxqLJvUVFcsFD-DTcTM6tdpFSg8fHQnvX3GmGi_noS22wK8bn/s1600/SqueakJS-iPad.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRRqenjuyz7VhOo4p1S__Vqift-lYbzCuNqarZ9HzBlcSxrEbRk9yI2f0EQniribUVb5oDJ-Dfql67l6-fo23JxqLJvUVFcsFD-DTcTM6tdpFSg8fHQnvX3GmGi_noS22wK8bn/s1600/SqueakJS-iPad.jpg" /></a></div>
<br /></div>
<div>
<div>
On the iPad there is neither right-click nor command keys, but the menu is available on the inside of the flop-out scrollbars. It needs a fairly recent browser, too - it works in iOS 7, but apparently not in older ones. On Android it works in Chrome 31, but not quite as well (for example, the onscreen-keyboard does not come up on an Galaxy Note tablet).</div>
<div>
<br /></div>
<div>
Go to the <a href="https://squeak.js.org/" target="_blank">project page</a> to try it yourself. The sources are on <a href="https://github.com/codefrau/SqueakJS" target="_blank">GitHub</a>, and contributions are very welcome.</div>
<div>
<br /></div>
<div>
Have a great Christmas!</div>
</div>
<div>
<br /></div>
Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com7tag:blogger.com,1999:blog-10460112.post-70896612037457130042013-02-24T17:46:00.000-08:002013-02-25T03:42:40.044-08:00Smalltalk Bindings for Minecraft PiThe <a href="http://www.raspberrypi.org/" target="_blank">Raspberry Pi </a>is a cute little computer. Quite cheap at $35, you plug in USB keyboard+mouse and a TV as monitor. And it is surprisingly capable, even for running 3D games.<br />
<br />
One particularly interesting game is <a href="http://pi.minecraft.net/" target="_blank">Minecraft: Pi Edition</a>. As in other Minecraft versions, the main goal is to create a world. But unlike other versions, you can not only use the tools provided by the game, you can make your own tools! That's because it comes with a programming interface. <br />
<br />
The Minecaft world is made of little cubes, and you normally place or remove these blocks by hand, one after another. This is fun, but for larger structures also quite cumbersome. For example, this rainbow here might take a long time to construct manually:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrlvlWRHWVLE2flvqEjcvssX6fplxikVtNya7rUxAofL_ILf3FQorHPYuhUHXQrxG4YOJ5cnyiY7xwKLhawe3VWZLbBlAZlDp_oBTOk1UEm6up2FBR638oj7tTB4zd2Snim5kB/s1600/minecraft-rainbow-bf.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="379" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrlvlWRHWVLE2flvqEjcvssX6fplxikVtNya7rUxAofL_ILf3FQorHPYuhUHXQrxG4YOJ5cnyiY7xwKLhawe3VWZLbBlAZlDp_oBTOk1UEm6up2FBR638oj7tTB4zd2Snim5kB/s640/minecraft-rainbow-bf.jpg" width="640" /></a></div><span id="goog_1949260248"></span><span id="goog_1949260249"></span><br />
But I did not make the rainbow by hand. I programmed it, using the Smalltalk programming language. It's just these dozen lines of code in the <a href="http://squeak.org/" target="_blank">Squeak</a> programming environment:<br />
<div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD6SNU3ID87SFbwb06kAtZKoKcMh8gdkMx4YaXbEhSU-uB0FyHoMaZCrj1zT_hE3CaY9-giJDb1dTPvB2zYNORjvvM39s9fSAzadndKvQcVDXUeiwb9CamVlzMNYCz6uxf0fno/s1600/squeak-rainbow-bf.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD6SNU3ID87SFbwb06kAtZKoKcMh8gdkMx4YaXbEhSU-uB0FyHoMaZCrj1zT_hE3CaY9-giJDb1dTPvB2zYNORjvvM39s9fSAzadndKvQcVDXUeiwb9CamVlzMNYCz6uxf0fno/s1600/squeak-rainbow-bf.png" /></a></div><br />
Squeak is already installed on the Raspberry Pi, because Scratch was made in Squeak. Of course you need a little more to make this dozen lines of code work. Mojang (the developers of Minecraft) have provided "bindings" for the Python and Java programming languages, but not for Smalltalk. So I had to make these bindings first.<br />
<h2>Here are the Bindings</h2>Now you can use the bindings too, because I am publishing my code:<br />
<blockquote class="tr_bq"><a href="http://ss3.gemstone.com/ss/minecraft.html">http://ss3.gemstone.com/ss/minecraft.html</a></blockquote>Squeak can either run on the Raspberry Pi itself (a VM is already installed) or on another computer in your network.<br />
<br />
There are two packages, <span style="line-height: 1; text-align: left;">'Minecraft-Pi-Base' and </span><span style="line-height: 1; text-align: left;">'Minecraft-Pi-Demo', load them in this order. At the time of writing, the demo package has only the rainbow method in it. The code is not heavily commented, but from the examples it should be fairly obvious how to use it. </span><br />
<span style="line-height: 1; text-align: left;"><br />
</span><span style="line-height: 1; text-align: left;">The bindings are still somewhat basic, but cover all the functions of the current Minecraft-Pi 0.1.1 release. There is certainly room for improvement. E.g. it would be nice to add symbolic block names, so you could write "wool" instead of "35". And the hit testing (when you right-click on a block with your sword) works, but could be made more convenient to use, perhaps by introducing an event class like in the other bindings.</span><br />
<span style="line-height: 1; text-align: left;"><br />
</span><div style="text-align: left;"><span style="line-height: 16px;">I made the repository open, so anyone can easily contribute. I'm curious what others will come up with. Like, control Minecraft from Etoys or Scratch? How about a Croquet bridge? Build a little game? In any case, have fun! :)</span></div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com4tag:blogger.com,1999:blog-10460112.post-16756390864038804802012-10-20T12:48:00.001-07:002012-12-17T03:49:10.307-08:00Squeak Etoys running on OLPC XO-3 tabletSJ brought a hand-assembled XO-3 prototype to the OLPC Community Summit in San Francisco (mass production only starts when someone puts in a large-scale order), and of course I tried to run Etoys on it. It's pre-installed (as on all XOs) and worked right out of the box.<br />
<br />
I was able to paint and drag objects, but since there is no right-click support yet there was no halo to bring up a new viewer. Also, touch targets are rather small for my adult-sized hands, and since there are no hover events, some features don't work correctly (as we found out with the iPad version two years ago). <br />
<br />
So more work is needed, as well as for the XO-4 which has a multitouch screen in addition to a keyboard and touchpad. Help welcome :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfzYJskqh6T1hOdLD04VIqmOHWwQCPwijptSrWpVGr4PSRUB9TsOJUTnHfDWYsGD-ZN56HBODCgCQSWFYipCvXM84BbDZM0PO2U3jtLfkCYOpzMkS2H5V-a2_GZkoSupivOWc5/s640/blogger-image-177482925.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfzYJskqh6T1hOdLD04VIqmOHWwQCPwijptSrWpVGr4PSRUB9TsOJUTnHfDWYsGD-ZN56HBODCgCQSWFYipCvXM84BbDZM0PO2U3jtLfkCYOpzMkS2H5V-a2_GZkoSupivOWc5/s640/blogger-image-177482925.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6lrEzBfhv-ngGFzTl__LF1EYtOh2yn33_3df7UO3UL-nMtsAVZ1s3fF_0V19j_o7fZGNRmWWK6YI0GlWggKik-i0oxn7w3bps0Qw6aVgQgojGB5MTVC0mcskXVodJAHwztA2k/s640/blogger-image--885871815.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6lrEzBfhv-ngGFzTl__LF1EYtOh2yn33_3df7UO3UL-nMtsAVZ1s3fF_0V19j_o7fZGNRmWWK6YI0GlWggKik-i0oxn7w3bps0Qw6aVgQgojGB5MTVC0mcskXVodJAHwztA2k/s640/blogger-image--885871815.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4tA3SqmDMiXzSOgy9hyphenhyphen12UEGzSkvfn7l98i8FJkYW-PcR4C1J2DW9K35Y6nsehf2v1oo958REPLMEoGhxAbi-UQC_oZ2iEg6FFzQ4Z6p3Ufg6BTlWAh4TFjqclx2dN1Y29101/s640/blogger-image-271445797.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4tA3SqmDMiXzSOgy9hyphenhyphen12UEGzSkvfn7l98i8FJkYW-PcR4C1J2DW9K35Y6nsehf2v1oo958REPLMEoGhxAbi-UQC_oZ2iEg6FFzQ4Z6p3Ufg6BTlWAh4TFjqclx2dN1Y29101/s640/blogger-image-271445797.jpg" /></a></div>
Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com2tag:blogger.com,1999:blog-10460112.post-48816267979469441652011-08-29T08:25:00.004-07:002011-11-01T06:31:38.501-07:00Squeak Etoys on ARM-based OLPC XO-1.75First post this year, yikes! The last one was about ESUG 2010 in Barcelona, now I just returned from ESUG 2011 in Edinburgh. While I was there, a package with the shiny new XO-1.75 prototype arrived.<br />
<br />
Incredibly, the pre-installed Etoys simply worked! Never mind the change in processor architecture, the Fedora folks have done a great job compiling the Squeak VM for ARM and so Etoys just works. Of course that's just as it should be, but it's still awesome. And e.g. Squeakland's own Etoys-To-Go would not have worked, as it only includes binaries for Intel-compatible processors.<br />
<br />
Another great addition is a 3-axis accelerometer. The Linux kernel's driver exposes it as a file at <tt><span class="Apple-style-span" style="font-family: monospace; white-space: pre-wrap;">/sys/devices/platform/lis3lv02d/position</span></tt>. Gotta love the unix design of exposing devices as files. All it took to make this usable from an Etoys project was just an object with ax, ay, and az variables that get set with one simple textual script:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir9NwJLqFHUmjxbmyK07DGV996ZpWC-OPHAUKrX8IDtbhDf65EW6Y0U7djujhGmUrmwW4p_7RgIhqp_kNzQ3y_XDg3fB7MghbMYYAiVbkUwpHz4h7X0vq7ynRFSnlqROWTYhCo/s1600/Screen+shot+2011-08-29+at+17.09.53.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="117" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir9NwJLqFHUmjxbmyK07DGV996ZpWC-OPHAUKrX8IDtbhDf65EW6Y0U7djujhGmUrmwW4p_7RgIhqp_kNzQ3y_XDg3fB7MghbMYYAiVbkUwpHz4h7X0vq7ynRFSnlqROWTYhCo/s320/Screen+shot+2011-08-29+at+17.09.53.png" width="320" /></a></div>Another simple script can use this to control a ball (the "rebound" script just keeps it on-screen):<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8-MWKRwkTI-hhS_VmFiJBC4cLEesywwKRkOEVf95yz2UqpvjMHWBqctwPLE-CowNsXMUgiMfy22Dmi6ZcGCLgQBsK_ksXEXZzhiKTQrBfkv4ay4150jvKJr6a8hovzkv2uC1i/s1600/Screen+shot+2011-08-29+at+17.17.02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8-MWKRwkTI-hhS_VmFiJBC4cLEesywwKRkOEVf95yz2UqpvjMHWBqctwPLE-CowNsXMUgiMfy22Dmi6ZcGCLgQBsK_ksXEXZzhiKTQrBfkv4ay4150jvKJr6a8hovzkv2uC1i/s320/Screen+shot+2011-08-29+at+17.17.02.png" width="320" /></a></div>Fun all around—it's a bit a hard to see the yellow ball in the Video, but Jakob enjoys it anyway:<br />
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/ahkOIlLL--4?feature=player_embedded' frameborder='0'></iframe></div>Also, uploading from Etoys directly to <a href="http://squeakland.org/showcase/project.jsp?id=11173">Squeakland</a> using Wifi just worked. Yay!<br />
<br />
<b>Update:</b> If you want to try my uploaded project on your XO-1.75, you need to save it once from Etoys, quit Etoys, and run it again. Otherwise it won't work - it was signed by <i>my</i> key so the Etoys security sandbox prevents it from opening the accelerometer device. The saved copy will be signed using <i>your</i> key so no sandboxing happens.Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com9tag:blogger.com,1999:blog-10460112.post-14473749036051676212010-09-20T10:21:00.002-07:002010-09-24T06:47:10.270-07:00ESUG 2010 in Barcelona<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_uVmbVFYhMnF5fuf4EJeyD4fgu7vUiW5yr6oMUAAKPe6FQio9CDdPakjqTXvpKnCaz0PHlFhuyh62QnAto4_1ohV_gqyr4fAi7NNU-TBQv9awMvaQ9llVj8Onp9r3bhXrU1Ux/s1600/esug2010_logo50.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_uVmbVFYhMnF5fuf4EJeyD4fgu7vUiW5yr6oMUAAKPe6FQio9CDdPakjqTXvpKnCaz0PHlFhuyh62QnAto4_1ohV_gqyr4fAi7NNU-TBQv9awMvaQ9llVj8Onp9r3bhXrU1Ux/s1600/esug2010_logo50.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">This year's conference logo was designed by my good friend <a href="http://www.gaguls.de/patty/">Patty Gadegast</a>.</td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: left;">I just returned from the <a href="http://www.esug.org/">European Smalltalk User Group</a> conference in Barcelona, Spain. It was a really nice experience. There was too much going on to report everything here, so I will just pick some favorites.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx-TjP9qJ-xUxH1ciux5t9eblqA_o7Wi481ZaFA2tbNbrQn5CsFze_45ZQ662fpTWCvMjWEaFnWyEVP-3JNJNN4Qr_ussb6tij8ghuR9zM4-gSz0Jay5bu0uDaHjy262RKgZZU/s1600/ESUG2010-CitiLab.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx-TjP9qJ-xUxH1ciux5t9eblqA_o7Wi481ZaFA2tbNbrQn5CsFze_45ZQ662fpTWCvMjWEaFnWyEVP-3JNJNN4Qr_ussb6tij8ghuR9zM4-gSz0Jay5bu0uDaHjy262RKgZZU/s640/ESUG2010-CitiLab.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by Bert Freudenberg</td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">The event was hosted by <a href="http://citilab.eu/">citilab</a> Cornellà. It started off with a Camp Smalltalk over the weekend. I already met quite a few people there. I couldn't mingle as much as I hoped to because I had to get the first <a href="http://squeakland.org/download/">Etoys 4.1</a> release candidate out of the door:</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJlT8IGUd20ziphkbpoCRx41LfSsYdvbOO2_Jo3SQVGpaQwWdmz_vH0S5zOD-PkK1eVxRZGOFghHyOCr7thsaObAhYh9R8VTfo7QoHQUUVjMF0_yXyD99V-h9iHdmMaf2DoTq3/s1600/ESUG2010CampSmalltalk.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJlT8IGUd20ziphkbpoCRx41LfSsYdvbOO2_Jo3SQVGpaQwWdmz_vH0S5zOD-PkK1eVxRZGOFghHyOCr7thsaObAhYh9R8VTfo7QoHQUUVjMF0_yXyD99V-h9iHdmMaf2DoTq3/s640/ESUG2010CampSmalltalk.jpg" width="640" /></a></div></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: left;">Close by was "Yokohama Wok", a Japanese/Spanish restaurant with the best all-you-can-eat buffet imaginable. You could have everything from freshly cut ham to sushi, grilled steak or seafood, bread, pasta, rice, fruits, cake, desserts.</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDI4ETdDxMIRQvriFliYgc9Jn9Pr8k-jLCZnZ5Ruqm5lAX0qK7E2aOuRBkN6HLwDfh5eiOnfHhUbZm7SLc5AVvZIdKmToJO1OhqJs34O4U3A0k08GJoR_uNBpajTCWF5tn4qUG/s1600/ESUG2010-Wok.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDI4ETdDxMIRQvriFliYgc9Jn9Pr8k-jLCZnZ5Ruqm5lAX0qK7E2aOuRBkN6HLwDfh5eiOnfHhUbZm7SLc5AVvZIdKmToJO1OhqJs34O4U3A0k08GJoR_uNBpajTCWF5tn4qUG/s400/ESUG2010-Wok.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by Bert Freudenberg</td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: left;">I talked to Stef (president of ESUG) and gave him a <a href="http://squeakland.spreadshirt.de/">Squeak Etoys button</a>, which he ended up wearing the whole week:</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXLXst4g_AjgoiWE3g9iWenpP0_bVGGzOk2RwHvHjqEqkcJ16kBWF_tmLx50KeeTGxwh-iMlcOm1rNMJ7uxtcf3DkIljRv3If0STPqez9nvxmUEIfC1C1zNLi_nGAk93VyJnvg/s1600/ESUG2010-Stef.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXLXst4g_AjgoiWE3g9iWenpP0_bVGGzOk2RwHvHjqEqkcJ16kBWF_tmLx50KeeTGxwh-iMlcOm1rNMJ7uxtcf3DkIljRv3If0STPqez9nvxmUEIfC1C1zNLi_nGAk93VyJnvg/s400/ESUG2010-Stef.jpg" width="300" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by Bert Freudenberg</td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: left;">We also played together in a 2-on-2 Magic game (which we promptly lost ...):</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLuhntFf11EH5loGiSwCAgca7MnmvyL0Z-KoWAUtqo76psL78MfacjaMjcFe3-o3oCDa_jdGfw7eJuUCsKR-eUMGwmkh67rxh4I2EJXjIXehH1SfyJYyY3G6S351_aorCdU2t5/s1600/ESUG2010-Magic.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLuhntFf11EH5loGiSwCAgca7MnmvyL0Z-KoWAUtqo76psL78MfacjaMjcFe3-o3oCDa_jdGfw7eJuUCsKR-eUMGwmkh67rxh4I2EJXjIXehH1SfyJYyY3G6S351_aorCdU2t5/s400/ESUG2010-Magic.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by Bert Freudenberg</td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: left;">On Monday I gave my <a href="http://www.esug.org/wiki/pier/Conferences/2010/Talks/Squeak">Squeak Community Update</a> talk, outlining what has happened in the Squeak and Etoys communities lately. Got some nice comments afterwards, including the request to give an Etoys demo the next time. I of course used Etoys to give the presentation, but did not really include an Etoys introduction for people who had not seen it before. But I got a slot in the "show us your projects" session on Tuesday where I made up for that with a 10 minute demo.</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQZXjlxoM3NZ75FeRG9BLb8xeqXWEPSX4Ib8Iss7uYImq8j0scWwx0bPDWSp9sowt-njPqfPufF-2F1fSgbnRU9LDGd8Qt2x8l12Ns63kmWWk59wpjT-9TSHENl2xT4_ZCiANr/s1600/ESUG2010Bert.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQZXjlxoM3NZ75FeRG9BLb8xeqXWEPSX4Ib8Iss7uYImq8j0scWwx0bPDWSp9sowt-njPqfPufF-2F1fSgbnRU9LDGd8Qt2x8l12Ns63kmWWk59wpjT-9TSHENl2xT4_ZCiANr/s400/ESUG2010Bert.jpg" width="266" /></a></div></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table>Gonzalo Zabala and his students from Argentina presented <a href="http://www.esug.org/wiki/pier/Conferences/2010/Talks/Physical-Etoy">Physical Etoys</a>:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvMMUuSQNY3se7fqCjL8cno_PU_c72dRzgWByHYcvvTKFX_RzZyTP-i9pZJjLbYIwso71VuQ1xWidiiIIhdptg9QSv8ajVexndPUdePg3Saxnt4ByZTPMcZNmpTvu-i7D5lO8K/s1600/ESUG2010PhysicalEtoys.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvMMUuSQNY3se7fqCjL8cno_PU_c72dRzgWByHYcvvTKFX_RzZyTP-i9pZJjLbYIwso71VuQ1xWidiiIIhdptg9QSv8ajVexndPUdePg3Saxnt4ByZTPMcZNmpTvu-i7D5lO8K/s400/ESUG2010PhysicalEtoys.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><br />
<div class="separator" style="clear: both; text-align: center;"></div><a href="http://www.a3aan.st/esug2010/index.php/view/25/03+Conference/01+Monday/IMG_1903.JPG"> </a><br />
I also liked the <a href="http://www.esug.org/wiki/pier/Conferences/2010/Talks/Xtreams">Xtreams</a> presentation by Martin Kobetic:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgks7jHEjQLvSaBTch17d0Tu5ZP7t79_3ZLIIWDrN4KOpswEfoiq4VFH-vOKGIARX4nX9CA_u7m_PfhGlU1TjyindcMjZdPxRP4zBRemwTCTczQEnKyeO0gngAx0XZJ9bvhBaek/s1600/ESUG2010Martin.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgks7jHEjQLvSaBTch17d0Tu5ZP7t79_3ZLIIWDrN4KOpswEfoiq4VFH-vOKGIARX4nX9CA_u7m_PfhGlU1TjyindcMjZdPxRP4zBRemwTCTczQEnKyeO0gngAx0XZJ9bvhBaek/s400/ESUG2010Martin.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><br />
<div class="separator" style="clear: both; text-align: center;"></div><div><div>I was session chair on Wednesday morning, so I could see <a href="http://www.esug.org/wiki/pier/Conferences/2010/Talks/Cairo">Travis</a>' update on Pango text rendering from the first row. Would love to have that in Squeak, but it only builds easily on Linux:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH5-Ye3o1i_OvGdKBUp_a_OpFPA5h_SMR4KMVCzVHkyCIpPHSgsy0_iUorZkJvD0xeZls7533Ca85NK8O0dkvR4M3O872VvpJqe1Z6itgYpQ-kXS-erUfM-V-yyHVOFyfHohOf/s1600/ESUG2010Travis.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH5-Ye3o1i_OvGdKBUp_a_OpFPA5h_SMR4KMVCzVHkyCIpPHSgsy0_iUorZkJvD0xeZls7533Ca85NK8O0dkvR4M3O872VvpJqe1Z6itgYpQ-kXS-erUfM-V-yyHVOFyfHohOf/s400/ESUG2010Travis.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><br />
<div class="separator" style="clear: both; text-align: center;"></div>But the most exciting thing on Wednesday was of course that <a href="http://tecnodacta.com.ar/gira/projects/physical-etoys/">Physical Etoys</a> won the ESUG Innovation Technology Award:<br />
<div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIBfYFuaXhBzkmw9KAmPVxGRwUAxGxyPGJR-hCOhyMywcqZl9zJF2wlCIzYQJ-neRHZihzmQUDj2l9Qcqh-rXY_N0ALYKH1FpHDEvOkmw6KXxtaFCaBnLe7Qbw47MZv8YnheCT/s1600/ESUG2010Award.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIBfYFuaXhBzkmw9KAmPVxGRwUAxGxyPGJR-hCOhyMywcqZl9zJF2wlCIzYQJ-neRHZihzmQUDj2l9Qcqh-rXY_N0ALYKH1FpHDEvOkmw6KXxtaFCaBnLe7Qbw47MZv8YnheCT/s640/ESUG2010Award.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table>On Thursday, I participated in a panel discussion about open-source licenses, organized by Julian Fitzell and Jason Ayers of Cincom.<br />
<div class="separator" style="clear: both; text-align: center;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisZEZ32zwThKyl6N58dxbWORbCv1I29Qdy1HNYfwSQsKzLE2Sd8qyiN_eIOgCxcq-BtGuLEQDp_fLMZgyEYGqoNxQMzdYpxiBellEx-5hg8eDxpsCOSwAmyK5moQaUOXyWMW3C/s1600/ESUG2010Licenses.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisZEZ32zwThKyl6N58dxbWORbCv1I29Qdy1HNYfwSQsKzLE2Sd8qyiN_eIOgCxcq-BtGuLEQDp_fLMZgyEYGqoNxQMzdYpxiBellEx-5hg8eDxpsCOSwAmyK5moQaUOXyWMW3C/s400/ESUG2010Licenses.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: left;"><br />
</div><div>In the projects session, Ricardo demoed some of his <a href="http://www.pcs.cnu.edu/~rcaton/ESUG/ESUG.html">Etoys work</a> done during Google Summer of Code:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidprverSxs8te_f8uTnmRBhP-qLUYJ5ejtI0QdQvJ48VRZowtuLAqXUKz8oZNbpiutl_5MpdpFwJXFo2O7p-AfseZiwC1eCHEDvqxOfcPX2E-9QHv89G7jif5ay-NnhGQvyaIF/s1600/ESUG2010Ricardo.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidprverSxs8te_f8uTnmRBhP-qLUYJ5ejtI0QdQvJ48VRZowtuLAqXUKz8oZNbpiutl_5MpdpFwJXFo2O7p-AfseZiwC1eCHEDvqxOfcPX2E-9QHv89G7jif5ay-NnhGQvyaIF/s400/ESUG2010Ricardo.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><br />
</div><div><div class="separator" style="clear: both; text-align: center;"></div>Besides showing his graphing tools, the comic-like bubbles were a favorite with the audience:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7EMfEVoNkG8DJpnrULSNTZQ5iCPEAv5BHjHoclnsh4OjO_87m90Y_P0lyciGbC_R79BmM5Y85Ptv45Tny_qFFy8kOcLUXGlBunYYbjdAz_IVJVcMgP4IeThK3SrVSGhpLbS4q/s1600/ESUG2010Caterpillar.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7EMfEVoNkG8DJpnrULSNTZQ5iCPEAv5BHjHoclnsh4OjO_87m90Y_P0lyciGbC_R79BmM5Y85Ptv45Tny_qFFy8kOcLUXGlBunYYbjdAz_IVJVcMgP4IeThK3SrVSGhpLbS4q/s640/ESUG2010Caterpillar.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><br />
<div class="" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"></div></div>Dale showed the beginnings of <a href="http://groups.google.com/group/bibliocello">Bibliocello</a>, a repository for Monticello packages that can actually analyze them. You get to search implementors and senders across all packages, take statistics etc.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtDXGM4aYik1K8doKppzwkgKWTdRSKSlTfm1AwCmmHdBIV8pYA8n1T3b0iWh71myE9MXnYA34n6wuKXOyf0ctkuGhWHXVbIdP8DTy8leWLAmQoJKCS92_sMAOzqRyP_BTVDODq/s1600/ESUG2010Dale.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtDXGM4aYik1K8doKppzwkgKWTdRSKSlTfm1AwCmmHdBIV8pYA8n1T3b0iWh71myE9MXnYA34n6wuKXOyf0ctkuGhWHXVbIdP8DTy8leWLAmQoJKCS92_sMAOzqRyP_BTVDODq/s400/ESUG2010Dale.jpg" width="266" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><br />
<div class="separator" style="clear: both; text-align: center;"></div>And at the end of the day, an exciting demo was given by HwaJong Oh, a Smalltalker and iPhone developer from Korea. He demonstrated <a href="http://www.squeaksource.com/ToolDad.html">Drag-and-Drop for Squeak Tools</a>, e.g. dragging the object held in an instance variable directly to another inspector.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_zpfoj9DlTedqet03Caue0e7cezW20Zicgmxsp9GgKWqvTfcY4Lj_4uxFFgL1OtZBK9hiO9TbgFeTDBHReJMTIQcmsREWKTRT0caAZ1ljGxO82xe-wI_xoRllhOfNyrXoBAOy/s1600/ESUG2010HwaJongOh.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_zpfoj9DlTedqet03Caue0e7cezW20Zicgmxsp9GgKWqvTfcY4Lj_4uxFFgL1OtZBK9hiO9TbgFeTDBHReJMTIQcmsREWKTRT0caAZ1ljGxO82xe-wI_xoRllhOfNyrXoBAOy/s320/ESUG2010HwaJongOh.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: left;">He also used cool animated mind-maps for his introduction:</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_D9M3_cc4J8yF0AfuuMxrs3BclqYQ8FWNIP6ETdhCgUNjIvA4_WgWXkisPbk_OpivKogVM76lV2rzBJm1VbWa9k9cWyZgVa5dLj6YZTErdPHsdcxcfykopMtb_5tneXaU5kRe/s1600/ESUG2010MindMap.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_D9M3_cc4J8yF0AfuuMxrs3BclqYQ8FWNIP6ETdhCgUNjIvA4_WgWXkisPbk_OpivKogVM76lV2rzBJm1VbWa9k9cWyZgVa5dLj6YZTErdPHsdcxcfykopMtb_5tneXaU5kRe/s400/ESUG2010MindMap.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"></div>The highlight on Friday was Lukas' <a href="http://www.esug.org/wiki/pier/Conferences/2010/Talks/Helvetia">Helvetia</a> presentation. I particularly liked the integration of PetitParser with the Smalltalk tools.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTaHuAeT7vPm0JZbl1VXN75EOjfTG6R96ytnbaQvp-lCY3i6DJMmANHGUnnQXCBjtH5GbmUpn_w7nKg8FbDuRXau_rYbPkvQt0jScdooJSmdaG0CCZqoFfqK7IyfPtwPrwoC1b/s1600/ESUG2010Lukas.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTaHuAeT7vPm0JZbl1VXN75EOjfTG6R96ytnbaQvp-lCY3i6DJMmANHGUnnQXCBjtH5GbmUpn_w7nKg8FbDuRXau_rYbPkvQt0jScdooJSmdaG0CCZqoFfqK7IyfPtwPrwoC1b/s320/ESUG2010Lukas.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by <a href="http://a3aan.st/esug2010/index.php/list/">Adriaan van Os</a></td></tr>
</tbody></table><br />
<div class="separator" style="clear: both; text-align: center;"></div>All in all it was a rather refreshing conference at a great location with interesting people. Looking forward to next year's ESUG :)</div></div></div></div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com1tag:blogger.com,1999:blog-10460112.post-83370253944866788902010-06-15T08:12:00.011-07:002010-06-21T14:16:52.691-07:00Squeak Etoys on iPadIn preparation of making <a href="http://squeakland.org/">Etoys</a> work on the recently announced <a href="http://blog.laptop.org/2010/05/27/xo3-marvell-and-olpc/">OLPC tablet</a>, I ported it to the iPad. Here is a <a href="http://www.youtube.com/watch?v=gYrp31fH-Jk">video</a>—read on below for some details:<br />
<br />
<object height="360" width="580"><param name="movie" value="http://www.youtube.com/v/gYrp31fH-Jk&hl=en_US&fs=1&rel=0&border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/gYrp31fH-Jk&hl=en_US&fs=1&rel=0&border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="580" height="360"></embed></object><br />
<br />
This might look exciting, and it certainly is, but it feels actually a lot more clunky than it looks. You may have noticed the little target circles I added whenever a finger touches the screen. That's to know where exactly the finger hit. It's really hard to hit anything, took me a while of training to hit the colorful halo handle buttons on first try. We really need to redesign the user interface before giving this into the hands of kids ...<br />
<br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">But for now, some technical details: <a href="http://smalltalkconsulting.com/">John McIntosh</a> ported the Squeak Virtual Machine to Apple's touch-based OS last year (source available at <a href="http://isqueak.org/">isqueak.org</a>). I modified it slightly to enable multi-touch and keyboard input. Also, I rewrote his code to deal with touch events in Squeak, and added multi-touch handling to Morphic. Fortunately, <a href="http://wiki.squeak.org/squeak/30">Morphic</a> was designed to handle multiple "hands" (pointing devices) from the beginning, so adding this was much easier than in a system that assumes there is only one mouse. That's why moving multiple objects at the same time, and painting with more than one finger, just works once the events are in the system.</div><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">So far this is just an early test. We should work on improving the Etoys touch UI in next year's release. The Sugar menu bar works fine, but everything else is way too small. At least we have the luxury of being able to test Etoys already—getting the rest of Sugar running on a touch device might take a while. Hopefully OLPC will have developer machines soonish. If this test has shown one thing, then that there is lots of work to do (and it may even be necessary to start over).</div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com9tag:blogger.com,1999:blog-10460112.post-49460330515764301532010-01-04T04:27:00.002-08:002010-01-04T04:36:24.937-08:00How to write a Sugar activity in Squeak/Etoys<div>Milan just started a blog describing how to write activities in Squeak, see his <a href="http://etoys-squeak-and-sugar.blogspot.com/2009/12/use-etoys-to-develop-xo-sugar-activity.html">first post</a>. There are already a few of these, most notably the <a href="http://hpi.uni-potsdam.de/hirschfeld/projects/olpc/">games</a> by Robert Hirschfeld's students at the University of Potsdam, Germany. But so far the process is only documented in mailing list posts. Way to go, Milan!</div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com0tag:blogger.com,1999:blog-10460112.post-27529715920192795502008-12-22T06:43:00.012-08:002008-12-31T10:52:59.586-08:00Peaceful Holidays ...<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsD5CSpPhPordkoI0zZ3ZVpPuFb1aCjcyY3UBKrZaiBsLK4Jfhel77anJrJwo4NcsxMFmhcgSTWwD-52Aq_Ego2yVWDQIjfb7oxhoqrzOumY39jmDi8WNk3YqgA9k0H1Ud7-g/s1600-h/xo-hugger.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsD5CSpPhPordkoI0zZ3ZVpPuFb1aCjcyY3UBKrZaiBsLK4Jfhel77anJrJwo4NcsxMFmhcgSTWwD-52Aq_Ego2yVWDQIjfb7oxhoqrzOumY39jmDi8WNk3YqgA9k0H1Ud7-g/s320/xo-hugger.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5282625488141555234" /></a><div>... and a Happy 2009 to everyone from me and my family.</div><div>Presented by my XO-hugging <a href="http://shop.ebay.de/?_nkw=usb+%28marsfigur%2Cgummimensch%29">USB men</a> (who seem to have more memory capacity than me at times).<br /></div><div>Featuring a seriously tree-infested Etoys project, with snow (for those living south who cannot enjoy the white fluff this time of the year).<br /></div><div>And see you at <a href="http://events.ccc.de/congress/2008/wiki/OLPC">25C3</a> I hope!<br /></div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com3tag:blogger.com,1999:blog-10460112.post-11005061587157277292008-12-10T15:04:00.014-08:002010-01-27T07:37:58.705-08:00Emulating the latest stable OLPC XO softwareEven with XO laptops <a href="http://laptop.org/global">readily available now</a> there are quite a lot of reasons why one would want to emulate it on another machine. One being to hook up a projector. Unfortunately there are quite a number of hoops (*) one has to jump through to make it work.<br /><br />Anyway, I made a virtual machine that allows me to emulate the XO in VMWare on my Mac, running Sugar in the XO's native 1200x900 resolution, scaled down to a nice physical size in a window on my regular screen (fullscreen works, too). Sound works (even Tam Tam), Browse works (so networking is good), and after setting a working Jabber server I do see other XOs in the neighborhood view (Chat worked fine). Camera and mic are half working (Measure crashes, Record shows blank picture, but <a href="http://lists.laptop.org/pipermail/devel/2008-December/021591.html">reportedly</a> does record video), and a "Sugar restart" does not actually restart Sugar, but apart from that it seems fully functional, and much nicer than the emulations I had used to date.<br /><br />Click to see actual screenshots (calibrated to match the XO's physical extent using the Ruler activity on my MBP's <a href="http://members.ping.de/%7Esven/dpi.html">110 ppi</a> screen):<div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dev.laptop.org/%7Ebert/Ruler-emulated.png"><img style="cursor: pointer; width: 120px; height: 105px;" src="http://dev.laptop.org/%7Ebert/Ruler-emulated.png" alt="" border="0" /></a> <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dev.laptop.org/%7Ebert/Home-emulated.png"><img style="cursor: pointer; width: 120px; height: 105px;" src="http://dev.laptop.org/%7Ebert/Home-emulated.png" alt="" border="0" /></a> <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dev.laptop.org/%7Ebert/Journal-emulated.png"><img style="cursor: pointer; width: 120px; height: 105px;" src="http://dev.laptop.org/%7Ebert/Journal-emulated.png" alt="" border="0" /> </a><img style="cursor: pointer; width: 120px; height: 105px;" src="http://dev.laptop.org/%7Ebert/TamTamMini-emulated.png" alt="" border="0" /><br /><br />And here you can get that virtual machine (665 MB, 2 GB unzipped): <a href="http://dev.laptop.org/%7Ebert/VMWare-8.2-767-bf.zip">VMWare-8.2-767-bf.zip</a><br /><br />I made this using <a href="http://www.vmware.com/products/fusion/">VMWare Fusion</a>, which I found to be much better at running Linux clients than Parallels Desktop (I had been using that for 2 years). Give it a try, it's free as in beer for 30 days. No, I don't get paid if you buy it.<br /><br /><span class="Apple-style-span" style="font-weight: bold;">Update:</span> Reportedly it does work in <a href="http://www.vmware.com/products/player/">VMWare Player</a> on Windows and Linux, too (see comments). And maybe someone can make an appliance for even easier use?<br /><br />(*) Now to the hoops:<br /><ul><li>I started with the 767/ext3 image from <a href="http://download.laptop.org/xo-1/os/official/">http://download.laptop.org/xo-1/os/official/</a></li><li>extended to 2 GB by appending /dev/zero<br />(jffs2 compression gives roughly 2 GB too)</li><li>enlarged the partition to full 2 GB<br />(using fdisk and ext2resize)</li><li>mounted that in a Fedora 10 virtual machine<br /></li><li>copied over the F10 kernel, initrd, and modules<br />(olpc kernel wanted AMD instructions)</li><li>edited grub.conf to use that kernel<br /></li><li>and appended a root=/dev/sda1 kernel arg<br />(the fedora kernel wants to use LVM otherwise)</li><li>unmounted<br /></li><li>created new virtual machine<br />(that disk, 1 CPU, 256 MB RAM, NAT networking)</li><li>booted into that new system<br /></li><li>installed Perl<br />(for vmware tools installer)</li><li>installed vmware tools<br />(to get the X driver)<br />(but none of the kernel modules, would need make/gcc/etc.)</li><li>deleted Perl<br />(to restore the default sw environment)</li><li>copied the existing xorg-vmware.conf to xorg.conf<br />(to get 1200x900 resolution w/ 200 dpi)</li><li>booted into Sugar<br />(looks really nice so scaled down)</li><li>installed activities<br />(took a long time, maybe it's my DSL)</li><li>tested a bit<br /></li><li>rm -r ~olpc/.sugar<br />(to remove my personal data)</li><li>should have deleted sshd host keys, too, but didn't<br /></li><li>shut down<br /></li><li>zip<br /></li><li>upload<br /></li><li>...<br /></li><li>...<br /></li><li>...<br /></li><li>still no profit? ;)</li></ul>Enjoy.<br /></div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com15tag:blogger.com,1999:blog-10460112.post-3642820438777130092008-12-05T13:42:00.005-08:002008-12-05T14:13:38.912-08:00European grassroots meeting<div>I went to Brussels last weekend, meeting with folks from OLPC Europe, OLPC Boston, and some other European grassroots (me representing <a href="http://olpc-deutschland.de/">OLPC Germany e.V.</a>). We mostly discussed how to implement the new <a href="http://laptop.org/global">Give-1-Get-1</a> program as well as <a href="http://laptop.org/en/participate/give-many.shtml">Give-many</a> here in Europe. Some <a href="http://wiki.laptop.org/go/Grassroots_meetings/November_29%2C_2008">notes</a> are available.</div><div></div><br /><a href="http://squeakland.org/launcher/?http://freudenbergs.de/bert/etoys/OLPC-Europe.pr"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 137px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQw1xX2DwcMK9YMgjfqasT0KizaYlPmjijH_xagfYmxcQPzDlJ1uU_4lAo3cHwx9yIfCldrjDR8pdabq0d7rR26bPTLQuyOcO5q552Uiln3Ojowd40H5eF9w0hYqnBfn2sefXg/s200/OLPC-Europe.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5276431015684315890" /></a>And, while sitting together at a nice Cafe on Sunday I made this little Etoys project to celebrate OLPC Europe. Just click <a href="http://squeakland.org/launcher/?http://freudenbergs.de/bert/etoys/OLPC-Europe.pr">here</a> if you are on an <a href="http://laptop.org/">XO</a> or have the <a href="http://squeakland.org/">Squeakland</a> plugin installed (as everyone should of course). For those who were there and took the huge file home on their USB drives - this is a fixed version that does not keep growing indefinitely while animating.<div><br /></div><div>For the Etoyers out there - if you put a copy of a player in one of its own variables repeatedly, this creates an evergrowing "linked list" of player copies. Bad idea. Reset the variable first (by assigning dot for example) then do the copy: see my example.</div>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com0tag:blogger.com,1999:blog-10460112.post-28487202804569035022007-04-20T06:30:00.000-07:002007-05-09T07:36:51.879-07:00OLPC review now online, English tooThe extensive OLPC article by c't magazine is now available online in both original <a href="http://www.heise.de/mobil/artikel/88439">German</a> and an <a href="http://www.heise.de/mobil/artikel/88916">English translation</a>. It's a thorough review (they had a B1 machine) with some interesting photographs in it, like the Squeak Etoys screen in reflective and backlight modes with microscopic images revealing the working of the XO's incredible LCD.<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.heise.de/mobil/artikel/88916/3"><img style="margin: 10px; float: left;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyoYarCxC2lNqmA1lXdgky7Tr-uXouX0KqW8b8wvAiCE3Eisnzp1D770ZLp22daTua5voX95k1yQyBOXTyazGB6Ud9oQW5A7fRrrAMLY4q_3XTHht7VlRXztKeR-ERgQfc-gSK/s320/1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5055505665713221874" border="0" /></a>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com0tag:blogger.com,1999:blog-10460112.post-37008146582613029832007-03-27T07:58:00.000-07:002007-03-27T08:13:41.006-07:00Croquet SDK 1.0 released<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://croquetconsortium.org/"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifPlPbmtg9HcSYOhyphenhyphendXZKJeZOEuoxXRjGXgmXs1LY4j0mHUjUcPBbVZSfvxzN6ORv01FFcXTjlDDA9mPl2y0vdJ9IBfc2eN7mp0P5xFfcIagHibF2e2iJiSy7jd2pIc2aMcbA1/s200/Croquet-Logo-small.jpg" alt="" id="BLOGGER_PHOTO_ID_5046622567130540978" border="0" /></a><br />Get it while it's hot from the equally new <a href="http://croquetconsortium.org/">Croquet Consortium</a> web site.Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com2tag:blogger.com,1999:blog-10460112.post-88786695782347060312007-03-20T03:36:00.000-07:002007-03-20T05:15:32.364-07:00In-depth review of XO in German c't magazine<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-z1ukF1WcavdvKcLOuJp293Zu5jmKHA-Z1mzXDpmDgji3lx4iv2VFMFZ5wI7U3hZBpj75sF_ZUsZ53TkENTsFhHQd36nvQi9o8k9E22DbvzvpN57I3Zdc-A2WP3PImt_wLOxS/s1600-h/xo-sophie.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-z1ukF1WcavdvKcLOuJp293Zu5jmKHA-Z1mzXDpmDgji3lx4iv2VFMFZ5wI7U3hZBpj75sF_ZUsZ53TkENTsFhHQd36nvQi9o8k9E22DbvzvpN57I3Zdc-A2WP3PImt_wLOxS/s200/xo-sophie.jpg" alt="" id="BLOGGER_PHOTO_ID_5043959481248590738" border="0" /></a>There's a glowing review of the OLPC project and its XO machine in the current issue 07/2007 of <a href="http://www.heise.de/ct/">c't magazine</a>. The <a href="http://www.heise-medien.de/presseinfo.php/ct,07,03_19_a/41">in-depth article</a> by Dr. Jürgen Rink describes the project's history and educational ambitions as well as its current prototype hardware and software. One very interesting detail is a comparison of the XO's novel dual-mode display in low light and bright sun light, at normal size and magnified:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.heise-medien.de/presseinfo.php/ct,07,03_19_a/41"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4u_0Jmq3Prhwfw79QAwZUQVOmvZsiLPbUyDLk0F0eZ8Ri3JgxkExrpAf39qcsAn3AHV7sFkAe1iWhU74dpvb2Fxc3pM7cx8FY5kso16CcflmbA-vO1D3eDNd7ElRtNi62dWJq/s400/xo-microscope.png" alt="" id="BLOGGER_PHOTO_ID_5043956689519848322" border="0" /></a>On the left, under indoor lighting, the colored backlight shines through holes in the reflective layer. On the right, when brightly lit outdoors, the reflection is so strong that the backlight is not even visible anymore, thus creating a gray-scale image. The photographs show one of the example <a href="http://wiki.laptop.org/go/Sugar_EToys">Etoys</a> projects.<br /><br />The magazine is available now at kiosks until next week, or via <a href="https://www.heise.de/abo/ct/hefte.shtml">mail order</a>. In a few weeks the article should be available online via <a href="http://www.heise.de/kiosk/">click&buy</a>.Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com1tag:blogger.com,1999:blog-10460112.post-25107839069257271012007-03-14T03:03:00.000-07:002007-03-14T04:06:52.284-07:00Croquet for Business: Qwaq Forums<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://qwaq.com/"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdljqBvzj_bkzIcfcM8ZVUBvAQ1TzQkh6oIIm-FTuHRAQT3e4Qs_og-iSnLgggZtLuoWyCIYTgogzPZ9wCq-ajFFOcEr15eQLdfYN3lbmzH6MhYT-gkF7QM6hCC1CYMZzFNit2/s400/Slide1_34pct.jpg" alt="" id="BLOGGER_PHOTO_ID_5041722862810887362" border="0" /></a>So <a href="http://qwaq.com/">Qwaq</a> came out of "stealth-mode" and reveiled what they have been working on for a while now, <a href="http://qwaq.com/qwaq_forums.html">Qwaq Forums</a>:<br /><blockquote style="font-style: italic;">Qwaq Forums, the company's first product, is a secure virtual workspace application that significantly increases the productivity of distributed teams by bringing critical resources together in virtual places, as if they were in an actual physical location. A highly interactive and persistent environment, Qwaq Forums enables users to work, collaborate with others, and identify and solve problems.<br /></blockquote>And I'm proud to say I contributed a little, which most probably will find its way into the next <a href="http://opencroquet.org/">Croquet</a> release.<br /><br /><span style="font-weight: bold;">Update: </span>Here's a few nice stories of fellow bloggers who have seen Forums already.<br /><br />From Steve Borsch's <a href="http://www.iconnectdots.com/ctd/2007/03/qwaq_launches_v.html">Connecting The Dots</a>:<br /><span style="font-style: italic;"></span><blockquote><span style="font-style: italic;">Qwaq will get traction only because they completely understand that giving someone a semi-trailer truck (i.e., an engine like There or Second Life) doesn't do much good if the person has a small garage and needs a vehicle to go get groceries and tool around (90% of collaborators). Qwaq Forums is a powerful, easy to use and navigate, co-creation space that the rest of us can use.</span><br /></blockquote><span class="post-author">Glyn Moody</span> writes on <a href="http://opendotdotdot.blogspot.com/2007/03/going-quaqqers-about-quaq.html">Open dot dot dot</a>:<br /><a href="http://www2.blogger.com/post-edit.g?blogID=10460112&postID=2510783906925727101#%20http://www.iconnectdots.com/ctd/2007/03/qwaq_launches_v.html"></a><span style="font-style: italic;"></span><span style="font-style: italic;"></span><blockquote><span style="font-style: italic;">One of the benefits of using Croquet as the basis of its products is that the protocols are open, and this allows Croquet-compatible products to interoperate with Qwaq's. This means that the dynamics of the Croquet ecosystem are similar to that of the Web, which is never a bad thing.</span><br /></blockquote>And in <a href="http://collaborationblog.typepad.com/collaboration/2007/03/qwaq_exits_stea.html">The Culture of Collaboration</a>, Evan Rosen writes:<br /><blockquote style="font-style: italic;">Unlike most traditional web conferencing which works only while a session is underway, Qwaq Forums is persistent. This means authorized users can access the virtual space any time. Team members in another time zone may wake up to find the results of real-time collaboration that occurred while they were sleeping.</blockquote>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com1tag:blogger.com,1999:blog-10460112.post-50922999941854281972007-03-04T11:14:00.001-08:002010-01-27T07:37:49.806-08:00Interactive OLPC XO Display Simulation<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://squeakland.org/project.jsp?http://freudenbergs.de/bert/etoys/OLPC-XO-Display.pr"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEjFJf24XgGFlZQrFMZHYaOy-G2OcQP7TzFdPrmKpa-0k-wM-MJD0_p1fVqBWQ7uqinxEdDn5sfZHbS6qW5F7hnG-2ObcL34dH6xUSgjZxcGAX-RIH2b-nZhqHYnXN1tNR4jTH/s400/OLPC-XO-Display.png" alt="" id="BLOGGER_PHOTO_ID_5038156254970475602" border="0" /></a><br />Many people still have not seen the innovative display of the OLPC project's "XO" laptop. It has twice the resolution of a regular LCD (200 dpi), and works in bright daylight in gray-scale reflective mode. It's impossible for me to increase your screen's resolution by software, and I cannot make your display reflective, but here is an interactive simulation of the backlight mode with its interesting color pattern. This pattern is the source of a lot of confusion about the "color resolution" of the display. The LCD has 1200x900 square pixels, but the backlight puts a full color through each pixel. It is not made of red, green, and blue sub-pixels like a regular LCD, but the first pixel is full red, the second green, the third blue, and so on. The DCON chip (Display CONtroller) selects the color components from the full-color frame buffer.<br /><br />My simulation of the DCON achieves the same effect by selecting either the red, green, or blue color component in each pixel. Just move the mouse pointer around to see how different colors are reproduced. You'll notice strong diagonal patterns, but remember, on the actual display the pixels are only half as large. Note that the actual DCON optionally applies a bit of anti-aliasing in hardware which is not simulated here. It helps reproducing fine structures and depicts colors more accurately. Additionally, the simulation shows a magnified image to better illustrate the principle, but it is not accurate because the reflective area of each pixel is not depicted. Maybe I can add this in a later version.<br /><br />I made the simulation using Squeak / Etoys, which is one of the programming environments on the OLPC machine, but also works on Windows, Mac OS X, Linux, and many more systems. If you run the simulation on the actual laptop (download the project, place it in /home/olpc/.sugar/default/etoys/MyEtoys, run Etoys, choose Load Project), then you should close the small simulated screen and just leave the magnified view open.<br /><br />For the interactive simulation, download <a href="http://squeakland.org/detect.html">Squeak</a> (this version installs both, a regular application and a browser plugin), then <a href="http://squeakland.org/project.jsp?http://freudenbergs.de/bert/etoys/OLPC-XO-Display.pr">click here</a> to run the simulation in your browser, or download the <a href="http://freudenbergs.de/bert/etoys/OLPC-XO-Display.pr">project file</a>, launch Squeak, and drop the project into it.<br /><span style="font-weight: bold;"><br />Intel-Mac users</span> beware, the plugin is not supported directly yet. To see the project in Safari, you have to quit Safari, set it to open in Rosetta (select Safari in the finder, press Cmd-i), and reopen. Or, use the download method, Squeak itself is running fine on Intel Mac, it's just the browser plugin that's making problems.Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com5tag:blogger.com,1999:blog-10460112.post-47709899059435159912007-02-16T01:51:00.000-08:002007-02-16T02:35:26.284-08:00OpenGL in a WorkspaceOn some modern Linux systems, Croquet does not work anymore because OpenGL failes to initialize. Now, I originally wrote that code, and it worked fine for years. So it can't possibly be buggy, right? Jens Lincke of <a href="http://impara.de/">impara</a> tracked it down to the "Composite" extension that is enabled by default nowadays. With Composite disabled, it works, enable it, and it does not.<br /><br />So I turned to NVIDIA for help, thinking their driver might be buggy. Had to give them an easy way to reproduce the problem, this is the snippet I came up with:<br /><blockquote><pre style="font-family: arial;line-height:1.1em">| ogl green |<br />ogl := OpenGL newIn: (0@0 extent: 100@100).<br />green := 1.<br />[[<br /> ogl glClearColor(0, green, 0, 1).<br /> ogl glClear(16r4000).<br /> ogl swapBuffers.<br /> Sensor waitClickButton.<br /> green := 1 - green.<br />] repeat] ensure: [ogl destroy]</pre></blockquote>Beauty, eh? ;-) I guess nobody has done this in a workspace for a long time. Stop it with Alt-.<br /><br />Anyway, NVIDIA could reproduce the problem, and found our bug:<br /><blockquote>[...] the app is trying to create a depth 24 child window of a depth 32 parent and the app specifies neither a border pixel nor a border pixmap.</blockquote>Doh! I forgot to specify the <a href="http://www.tronche.com/gui/x/xlib/window/attributes/border.html">border</a>! We were just lucky that this did not happen before. Jens and y.t. made a patch, should be in the next VM. And big thanks to <a href="http://developer.nvidia.com/">NVIDIA developer support</a>!Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com5tag:blogger.com,1999:blog-10460112.post-21401329119737632922007-01-30T14:13:00.000-08:002007-01-30T15:11:09.601-08:00Stripped XOEarly in January, my laptop was the star of a photo shooting for the German issue of MIT's Technology Review<a href="http://www.heise.de/tr/magazin/"></a>. We took off the plastic enclosure of the "brick", it was pretty interesting, for example to see how the whole display in its metallic housing is carefully held by rubber mounts.<br /><br />This photograph was published in the magazin's current issue (02/07), along with a shot of the main board (which sits behind the display). The accompanying text not only provided a description of the parts, but also highlighted some design decisions that makes it unique hardware-wise. OLPC's educational goals were already reported on in the previous issue.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitXgJT0T8ECtxy_H97qgAv5DV7AvHEw0f9ELAyaPv-SE4q3oPL9OujFzRWWaXIF-Xj-NsbPnFAzomWrHwAjVimQOKd5haQpW1nPdl1PeyZ4ym8-Mj6GaHfDhSR9VdB69ySW_p1/s1600-h/xostripped.jpg"><img style="margin: 0pt 0pt 0px 0px; float: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitXgJT0T8ECtxy_H97qgAv5DV7AvHEw0f9ELAyaPv-SE4q3oPL9OujFzRWWaXIF-Xj-NsbPnFAzomWrHwAjVimQOKd5haQpW1nPdl1PeyZ4ym8-Mj6GaHfDhSR9VdB69ySW_p1/s320/xostripped.jpg" alt="" id="BLOGGER_PHOTO_ID_5025950845674585730" border="0" /></a><br /><br /><br />Image courtesy of <a href="http://www.heise.de/tr/magazin/">http://www.heise.de/tr/magazin/</a><br /><br /><span style="font-style: italic;" ><span style="color: rgb(102, 102, 102);">The colors are off for some reason after uploading to blogger - they were fine on my disk. Sorry.</span>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com0tag:blogger.com,1999:blog-10460112.post-25133437676000191222007-01-21T14:22:00.001-08:002010-01-27T07:37:42.812-08:00Etoys kid-tested on XO<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkiAmGFOeEYUouEM7-OkoOrlIHNOk_hlQjhliEiF13EKcE8-g2Mo6unqDYuR_Sx8-ftO7J09l5w7xLmnkyk1a1RArWpnd8YwYoBLo3zhfJIVqmNuQWtufqK1OB0EIJ5CkbkIpq/s1600-h/OLPCSophie2.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkiAmGFOeEYUouEM7-OkoOrlIHNOk_hlQjhliEiF13EKcE8-g2Mo6unqDYuR_Sx8-ftO7J09l5w7xLmnkyk1a1RArWpnd8YwYoBLo3zhfJIVqmNuQWtufqK1OB0EIJ5CkbkIpq/s200/OLPCSophie2.jpg" alt="" id="BLOGGER_PHOTO_ID_5022613003250564706" border="0" /></a>I brought my green machine home this weekend, and my twins had fun with it. Enormous fun in fact for the two 7-year olds, pounding on TamTam furiously. I couldn't bear it anymore after half an hour or so.<br /><br />Instead, I showed Jakob how to make a little figure bounce around on the screen in Etoys, while his sister went to practice her cello. He painted a simple head, and then we used the "forward by" and "bounce" tiles in a tiny two-line script making it move around. I made the mistake of pointing out that the "bounce" tile can produce some noise when bouncing. Endless fun trying the different noises ensued. Oh well.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA6IrKvZXUXe2XDiuLTJUKTD9qt0kCzfUagmcR-zWnjXA54HMd3-eBidJ0iYpfW7KN95R0x_3ShDfqdorbUNhUTnHNRN3oGq97Qf6nEYZhZfOiDj7cgX4h4zUTh29MTyy6slRj/s1600-h/OLPCSophieJakob2.jpg"><img style="margin: 0pt 10pt 10px 0px; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA6IrKvZXUXe2XDiuLTJUKTD9qt0kCzfUagmcR-zWnjXA54HMd3-eBidJ0iYpfW7KN95R0x_3ShDfqdorbUNhUTnHNRN3oGq97Qf6nEYZhZfOiDj7cgX4h4zUTh29MTyy6slRj/s200/OLPCSophieJakob2.jpg" alt="" id="BLOGGER_PHOTO_ID_5022613007545532018" border="0" /></a>Disturbed in her practice by these noises, Sophie came over and wanted to paint, too. So we saved Jakob's project and started a new one for her. I sat back to work on my email and let her brother teach. She spend like half an hour just painting the figure. The paint tool showed that it is not tuned to the XO's display resolution yet, it's far too small. But not giving up that easily, Sophie was erasing and repainting it over and over until she was satisfied with her "cow girl". Then Jakob proudly told her how to let it move and bounce, he had rembered almost everything needed. Together they quickly made it work, and just started exploring the noise-making possibilities again when we were saved by the call to dinner ...Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com2tag:blogger.com,1999:blog-10460112.post-65701867593543132992007-01-12T06:26:00.001-08:002010-01-27T07:37:34.981-08:00OLPC talk at design schoolI gave a talk about the $100-laptop at the Magdeburg school of <a href="http://www.gestaltung.hs-magdeburg.de/">Industrial Design</a>. We did some very inspiring projects using Squeak, Etoys, and Croquet together before. The designers always come up with interesting ideas, even though not everything is directly implementable by us developers.<br /><br />Carola Zwick, dean of the school, wrote a book <a href="http://www.avabooks.com.sg/avauk/details.php?id=107">Designing for Small Screens</a> that certainly gives valuable insight for OLPC developers, and she provided (though indirectly) some very important infrastructure for the OLPC office: her <a href="http://www.seven5.com/">group</a> designed the <a href="http://www.hermanmiller.com/mirra/">chairs</a> they are sitting on. I got the actual invitation by Christine Strothotte, who got her PhD doing computer graphics in Smalltalk just a few years before I got mine from the same school. She's teaching interaction design nowadays. I'm looking forward to doing an OLPC-related project with these great folks.<br /><br />A student took some <a href="http://www.wretch.cc/album/album.php?id=hangxdesign&book=34&page=1">photographs</a> during the talk. Also, from his <a href="http://hangxdesign.blogspot.com/2007/01/the100-dollar-laptop.html">blog post</a> it seems I convinced him of the merits of the OLPC project (it was a lively discussion). Thanks for posting, Cheng!<a href="javascript:void(0)" onclick="return false;" tabindex="7"><span></span></a>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com1tag:blogger.com,1999:blog-10460112.post-20703332749060150102007-01-11T06:22:00.001-08:002010-01-27T07:37:26.789-08:00Sophie, Tweak on the OLPC laptop<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhclLaATZFnSVm3d3IxsSUw_UV5Ji1F6Nkb1doFhQZtyCIPrV6kL-iUwMCFpIBamL1IV7O6zFHYarDpxHq6KdIWSbV-PYC09ThoVQwwzxHsJ-UONAB6UUMiijx39BbcS7Vr4Om0/s1600-h/SophieOnXO-2.jpg"><img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhclLaATZFnSVm3d3IxsSUw_UV5Ji1F6Nkb1doFhQZtyCIPrV6kL-iUwMCFpIBamL1IV7O6zFHYarDpxHq6KdIWSbV-PYC09ThoVQwwzxHsJ-UONAB6UUMiijx39BbcS7Vr4Om0/s320/SophieOnXO-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5018802813208231490" border="0" /></a>I just installed <a href="http://sophieproject.org/">Sophie</a> on my green machine. Sophie is a project of the <a href="http://www.futureofthebook.org/">Institute for the Future of the Book</a>, is implemented in <a href="http://squeak.org/">Squeak</a> (just like my <a href="http://wiki.laptop.org/go/Etoys">Etoys activity</a> on the laptop) using <a href="http://tweak.impara.de/">Tweak</a> as its UI framework (which is the original topic of my blog). Tweak is also the base for the next-gen Etoys.<br /><br />Installation went pretty smooth. I downloaded the cross-platform zip file using the Web activity from Sugar<br />and unpacked it using the command line. The first start of Sophie failed, but after replacing the failing plugin with one from the pre-installed Squeak it started and worked. Yay!<br /><br />This is an excellent example why it's a good idea to have a regular X11 installation on the kid's laptop: a lot of software will just work, even if it is not correctly integrated into the Sugar UI.<br /><br />Michael Rüger of <a href="http://impara.de/">impara</a> (a Squeak shop leading Sophie development here in Magdeburg, Germany) came over and made a little book, downloading two logos directly from the web (Sophie can do that!), adding a bit of text and color ... Tweak performance is not exactly blazing on the XO machine, I think we made the right decision to not use the Tweak-based Etoys but stick to the proven Morphic-based one. Of course one could optimize it a lot, but who has time for that? Anyway, it was useable - click the image to get a larger view:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3VCDWqXM-RfIaLT8ixRFPZYozDyQjdYXfTvIYT5MgZw4lnKACzsKZyBxChxxbiGbyEIsIY_DpoY0nqaH8ffmRQdjDNxZ9FCOk6QlWHp0SoBAwjRKIcbRCtIinvGzSyVVz4Dfp/s1600-h/SophieOnXO-1.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3VCDWqXM-RfIaLT8ixRFPZYozDyQjdYXfTvIYT5MgZw4lnKACzsKZyBxChxxbiGbyEIsIY_DpoY0nqaH8ffmRQdjDNxZ9FCOk6QlWHp0SoBAwjRKIcbRCtIinvGzSyVVz4Dfp/s320/SophieOnXO-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5018813877043986002" border="0" /></a>Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com0tag:blogger.com,1999:blog-10460112.post-1166543296421807012006-12-19T04:41:00.000-08:002007-01-11T06:04:10.115-08:00OLPC, graphics, and more<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wiki.laptop.org/images/0/0f/CameraInEtoys.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://wiki.laptop.org/images/0/0f/CameraInEtoys.jpg" alt="" border="0" /></a>I just returned from a nice productive visit to California, where I brought back my very own $100-laptop. Got the camera working in Etoys (see picture on the right, showing Yoshiki and me) with just a few patches to <a href="http://diegogomezdeck.blogspot.com/2006/12/video4squeak-funcionando-en-la-olpc.html">Diego</a>'s code.<br /><br />We also went to visit Keith Packard and Carl Worth of <a href="http://cairographics.org/">Cairo</a> fame in Portland. Had a nice chat about <a href="http://geek.vtnet.ca/doc/ols2005-notes/html/d1-15h00.html">Twin</a> and then hacked away on a <a href="http://piumarta.com/pepsi/">Pepsi</a> version of image compositing operators. A very interesting meeting it was, with the old folks (Alan Kay, Jim Gettys) and the younger ones all sharing their thoughts.<br /><br />And back to OLPC, read this nice essay titled <a href="http://alchemicalmusings.org/2006/12/19/free-laptops/">Free Laptops: Creating, Producing and Sharing a Revolution</a>.Vanessahttp://www.blogger.com/profile/05353637548899091553noreply@blogger.com2