<?xml version="1.0" encoding="UTF-8"?>
<rss version="0.91"><channel><title>RSSMix.com Mix ID 11245</title><generator>RSSMix</generator><link>http://www.rssmix.com/</link><description>This feed was created by mixing existing feeds from various sources.</description><language>en-gb</language>
<item><title>The Authority</title><link>http://www.wetmachine.com/itf/item/1940</link><description>People have been having great pun as this has floated around the 'net for a while, along with charges of Photoshopping, authentication via reviews of business directories, and charges of racism. Now within a day or so of the release of Gooogle...</description><pubDate>Sat, 13 Mar 2010 14:48:59 -0500</pubDate><guid>f748cae806e9152c045ba24369970edd</guid></item>
<item><title type="text">My Internet2 Talk ... in Color</title><description type="html">I participated in a panel at the Spring Internet2 members meeting and a video of it is available online. For those of you wanting to get a demo of Qwaq Forums - check it out. Beware, there is about 3-5 minutes of nothing happening at the beginning of the video. Don't give up. I am the first speaker, but it is well worth watching Sandra Kearney at IBM and Robert Gehorsam of Forterra Systems and the excellent questions at the end of our short presentations. &lt;br /&gt;&lt;br /&gt;Go here: &lt;a href=&quot;http://winmedia.internet2.edu/smm07-vod/smm07-primary-8.wmv&quot;&gt;Internet2 VR Panel&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-2247449567930134395?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/05/my-internet2-talk-in-color.html</link><guid>4fc35c56e3e83fad8ee40bb5a2a58ffc</guid></item>
<item><title type="text">Updates</title><description type="html">Lots happening. The Croquet release is doing well. Remember that this is very much a developer release, so don't expect it to change your life today. Still lots of loose ends, the UI needs LOTS more work, performance is sub-optimal, still a number of complex problems to solve, but the underlying architecture looks like it is in great shape.&lt;br /&gt;&lt;br /&gt;Julian Lombardi and I attended the Metaverse Roadmap Project where we had a number of opportunities to demonstrate the system. Response was quite positive. See the following:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://metaverseroadmap.org/index.html&quot;&gt;http://metaverseroadmap.org/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://scobleizer.wordpress.com/2006/05/06/wow-3d-operating-system-open-croquet/&quot;&gt;http://scobleizer.wordpress.com/2006/05/06/wow-3d-operating-system-open-croquet/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ethanzuckerman.com/blog/?p=537&quot;&gt;http://www.ethanzuckerman.com/blog/?p=537&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-114701445203476758?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2006/05/updates.html</link><guid>54ad0742c73e01a1234344c9caa3f5cf</guid></item>
<item><title type="text">Qwaq and Croquet at HASTAC</title><description type="html">We will be demoing Qwaq Forums at the HASTAC conference at Duke next week. &lt;br /&gt;&lt;br /&gt;From their site:&lt;br /&gt;&lt;br /&gt;&quot;A consortium of humanists, artists, scientists, social scientists and engineers from universities and other civic institutions across the U.S. and internationally, HASTAC (&quot;Haystack&quot;) is committed to new forms of collaboration across communities and disciplines fostered by creative uses of technology.Since 2003, we have been developing tools for multimedia archiving and social interaction, gaming environments for teaching, innovative educational programs in information science and information studies, virtual museums, and other digital projects. HASTAC leaders have served as consultants to U.S. and international organizations and governments on grid computing and cyberinfrastructure.Our aim is to promote expansive models for thinking, teaching, and research. To view a presentation on HASTAC, please click on the presentation attached.&quot;&lt;br /&gt;&lt;br /&gt;Check it the conference here:&lt;br /&gt;&lt;a href=&quot;http://www.hastac.org/informationyear/conference&quot;&gt;http://www.hastac.org/informationyear/conference&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-117657476911734844?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/04/qwaq-and-croquet-at-hastac.html</link><guid>f84ba8270d1644683faa73fba7d5e871</guid></item>
<item><title type="text">Internet2 Conference</title><description type="html">I am in Arlington, VA to be part of a panel on Virtual Worlds (Wednesday at 1:15pm). I intend to do a live demo of Qwaq Forums. I think that is a lot more interesting than a PowerPoint presentation. I have always tried to do demos to set the context of my talks, because I think being able to show people what I am doing and interested has a bigger impact than just talking about it. It does get a bit too exciting sometimes - Internet access is not always what it should be. One presumes that a conference about Internet2 will have a reasonable connection though.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-6619756757489816910?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/04/internet2-conference.html</link><guid>7566e7dfefc8c3cc3ae7e21335d946d7</guid></item>
<item><title type="text">Bank Teller Machines and 911</title><description type="html">I just had a crazy idea and had to write it down somewhere. Why don't bank teller machines respond to 911? They have a numeric keypad, and their users are also a target for potential victimization. And they are everywhere. They also include video cameras. Knowing that a teller machine was also directly wired to the police might make criminals reconsider violent attacks near them. Of course if your pin number is 911x, there might be some problems, but I suspect these are easily changed. Nothing to do with Qwaq, Inc or Croquet... but so what?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-6468036815569714453?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/04/bank-teller-machines-and-911.html</link><guid>ac1cac7ef71fda696b1dccabb4eb8c92</guid></item>
<item><title type="text">Croquet and the Perils of Open Source</title><description type="html">Croquet is Open Source. This has had both a positive impact on the project and in some ways a decidedly negative impact. The positive is the positives that most open source projects enjoy - lots of interest and creativity building around the system, visibility, strong academic relationships - it even helps allay concerns of larger enterprise customers knowing that there will not be a Microsoft-type lock-in with a single vender. &lt;br /&gt;&lt;br /&gt;From the start Croquet was developed completely out in the open. Even the very first, barely useful versions of the system were readily available to download, deconstruct, and criticize. Nothing wrong with this - we invited it, and the project profited from it. The big problem we had to deal with is people were disappointed with how much of the system was or wasn't working. I have heard people say &quot;Yeah, I tried Croquet a few years back, but it.... &quot; (you can fill in the blank with a number of choices). I can understand why people would be irritated. Some critical problems in Croquet took much longer for us to solve than we ever thought they would, we had spent a minimal amount of time on UI, back-end infrastructure, performance, etc... Getting something like Croquet to work at all was a monumental task. We didn't exactly have a model to work from. We were inventing - not reverse engineering.&lt;br /&gt;&lt;br /&gt;Of course, anyone that has ever developed a larger project has seen these kinds of issues. I certainly have dealt with them many times. The big difference was no one saw any of my project's warts except my colleagues and me. And we worked hard to remove, or at least hide them before we unveiled the final polished application. Croquet was different - people have been able to randomly sample the state of the project and critique it based upon that sample. Even today, the Croquet API is not quite a user-centric architecture. It is much more akin to the Linux kernel, looking for a front end to empower the user and a back-end to help users find each other and provide additional services. On the other hand, it is doing almost everything we said it would - and it really works well. We have even started a company &lt;a href=&quot;http://www.qwaq.com&quot;&gt;Qwaq, Inc.&lt;/a&gt; based upon the same open source system that you can download today. We are getting great reviews for our first product Qwaq Forums, even though it is till in beta today.&lt;br /&gt;&lt;br /&gt;What is my point? I have enjoyed this very open development process. I have learned a lot, and made a huge number of new friends and colleagues. Overall, it has been fun in spite of certain comments from people. I do think that next time - if there is one - I will probably hold off releasing a new system until it is a bit more mature and robust. In some ways that is sad - I think people that have stayed with the project from the beginning have learned a lot about how a complex system gets built and how it evolves. Most of this would be missed if you were to jump into a more complete end-user experience. On the other hand, it would probably increase the probability of success. In marketing, you only have one chance to make a first impression. Qwaq Forums is making a GREAT first impression. It would have been nice if Croquet had the same opportunity.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-3868169434744702738?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/04/croquet-and-perils-of-open-source.html</link><guid>53247647d40f1be3d1e2c1ee20b5c246</guid></item>
<item><title type="text">3D Worlds and Interoperability</title><description type="html">I attended a working lunch this week at Harvard to discuss 3D interoperability. It was an interesting discussion. I think the biggest problem was simply the definition of interoperability. For some people at the conference, it meant as little as reconstructing someone elses content in another 3D environment, or maybe being able to somehow copy 3D data sets from one place to another. Others viewed it as being able to reuse and dress-up your personal avatar for shopping or for role-playing. &lt;br /&gt;&lt;br /&gt;We even discussed the possibility of hooking Croquet up to Second Life via Croquet portals. This should be relatively straightforward to do - it would require a compound application of some sort, but since Croquet is already designed to hand off rendering to the adjacent Island (Croquet Islands and Second Life Islands are different kinds of things) when rendering through a portal, handing it to the Second Life client would not be much different. Coming back the other way might require a bit more finesse, as we would have to add some portal support to SL, and would have to call into an image based system. We have been doing something similar recently, so it is quite possible. &lt;br /&gt;&lt;br /&gt;I think David Reed (one of my fellow Croquet architects) really nailed what 3D interoperability should be. When we share 3D objects, we also need to share their behaviors. In most ways, the visual representation of an object is its least interesting aspect. What it can do, and how it interacts with the users and the worlds around it, however is REALLY interesting and very valuable. &lt;br /&gt;&lt;br /&gt;This is also really hard to do. Everyone uses different languages and scripts, and some - like Croquet - use a very different mechanism for enabling behaviors. Croquet has TeaTime and the concept of future replicated messages to manage its behavior. This enables a peer-to-peer approach to designing interactions, which otherwise would be near impossible. The only other solution is what everyone else has to do, which is maintain a central server and replicate the results of the computations.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-117657451578871804?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/04/3d-worlds-and-interoperability.html</link><guid>aa329297252ec0d0f23b5aa2e4f634ce</guid></item>
<item><title type="text">Qwaq</title><description type="html">We finally announced Qwaq. I am sure one or two of you were wondering why this blog went silent for such a long time. I had some good excuses - I was busy, and I didn't want to say anything about what I was doing anyway.&lt;br /&gt;&lt;br /&gt;Qwaq was founded by a group of us that believe Croquet can have an impact on the business world. Even an open source project like Croquet must have a revenue stream to drive it, and Qwaq is the first of what I hope will be many companies that will focus their efforts around making Croquet even more valuable. You can read more about the company here: &lt;a href=&quot;http://www.qwaq.com&quot;&gt;http://www.qwaq.com&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Alan Kay and David Reed are advisers to Qwaq and Andreas Raab is a cofounder so we are still working together. In addition, Greg Nuyens, our other co-founder is the Qwaq CEO. I met Greg at a previous company I co-founded, and was extremely impressed by his intelligence, drive, and in particular his interest in the customers. &lt;br /&gt;&lt;br /&gt;Why Qwaq? I wanted a short word that was easy to remember and easy to type. Look at the top left three keys of your keyboard - QW are next to each other and the A is directly below these. I also thought that it sounded fun.&lt;br /&gt;&lt;br /&gt;There is evidently quite a bit of interest out there in what we are doing. Typing Qwaq into Google and you will see an amazing amount of coverage just since we announced the product a few weeks ago. I should mention that Remy Malan is our VP of Enterprise and did a terrific job with this.&lt;br /&gt;&lt;br /&gt;Finally, what impact will Qwaq have on the continued development of Croquet as an open source project? A very positive one. We are still extremely committed to this project and if anything have accelerated the amount of effort we have put into it. Croquet continues to improve - much of what we learned in building Qwaq Forums was directly incorporated into the next Croquet release (imminent) and I think it is better than ever. I plan to continue using this particular forum to keep people up-to-date on where Croquet will be going.&lt;br /&gt;&lt;br /&gt;Thanks for checking back - it is a really exciting time for Croquet (Qwaq is just half of the story), so watch this space and the Croquet Project home for more details to come.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-117496611599836391?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/03/qwaq.html</link><guid>289867cc505dfba34dc244ec3ec66983</guid></item>
<item><title type="text">Croquet SDK 1.0 Released</title><description type="html">Nonprofit Croquet Consortium Releases Open-Source Software Tool Kit to Promote Collaborative 3-D Virtual Environments&lt;br /&gt;&lt;br /&gt;DURHAM, N.C.  March 27, 2007  A nonprofit consortium of academic and corporate partners announced Tuesday the release of a free software tool kit for developers to use in creating 3-D &quot;virtual environments.&quot;&lt;br /&gt;&lt;br /&gt;&quot;Were seeking to enable the creation of a rich series of interconnected Croquet worlds where people can engage in productive collaborative interactions in support of learning and commerce -- worlds that can be created, maintained and continually modified without the constraints of proprietary computer code,&quot; said Julian Lombardi, assistant vice president of Dukes Office of Information Technology.&lt;br /&gt;&lt;br /&gt;The Croquet Consortiums new &quot;3-D Virtual Environments Software Developers Kit&quot; (Croquet SDK 1.0) will promote collaboration among far-flung research teams working on everything from cancer cells to hurricanes, as well as active learning among students and their instructors. These networked 3-D teams from research, education and industry will be able to work together across a variety of computer platforms and devices, from laptops to cell phones.&lt;br /&gt;&lt;br /&gt;&quot;This will change the way people think about software and computation, from todays device-oriented perspective to a perspective of computation as a persistent, pervasive service,&quot; said Patrick Scaglia, vice president of research and development at HP Labs.&lt;br /&gt;&lt;br /&gt;Croquet 3-D virtual environments can support live discussion among worldwide collaborators who come together in &quot;real time&quot; within a 3-D virtual space. They may view, manipulate and revise documents, dynamic visualizations or large amounts of data from sources such as laboratories or supercomputing centers.&lt;br /&gt;&lt;br /&gt;Added Greg Nuyens, chief executive officer of Qwaq Inc., &quot;We have found Croquet to be a compelling platform technology for developing very large scale, richly featured and interlinked virtual environments. With the release of the Croquet SDK, we are excited about the new possibilities for using Croquet in our products and see benefits for developers everywhere.&quot;&lt;br /&gt;&lt;br /&gt;For example, public health officials and epidemiologists across a country could use the Croquet environment to track the spread of an infectious disease by sharing a dynamically changing display of infection data. Similarly, architects and engineers could collaborate on a building design, or chemists and biologists could prototype different chemical compositions for a new drug.&lt;br /&gt;&lt;br /&gt;The kit provides developers with a flexible tool to create virtual spaces with built-in networked telephony and a &quot;late-binding object-oriented&quot; programming language that allows multiple users to jointly create, animate or modify 3-D objects and dynamic simulations. Developers can also import and share resources, such as 2-D web applications or multimedia content, from their own systems. Working together across multiple locations, they can change simulations while they are running and work together to create new applications -- all in real time.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-117500970884614377?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/03/croquet-sdk-10-released.html</link><guid>a2f0e537fb8cac9dd871e4bb531b2f2f</guid></item>
<item><title type="text">Alan Johnston - BBC</title><description type="html">&lt;a href=&quot;http://news.bbc.co.uk/1/hi/in_depth/world/2007/alan_johnston/default.stm&quot;&gt;&lt;img alt=&quot;Alan Johnston banner&quot; src=&quot;http://www.bbc.co.uk/blogs/theeditors/alan_johnston.gif&quot; width=&quot;150&quot; height=&quot;90&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click here to show your support for Alan.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-1640368524077084450?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/04/alan-johnston-bbc.html</link><guid>82d5bd8ad73b88fdf7b9d3ff575b630f</guid></item>
<item><title type="text">Croquet Consortium Launched</title><description type="html">Industry and Education Leaders Launch The Croquet Consortium, Inc., a non-profit Foundation for Open Source Software Development.&lt;br /&gt;&lt;br /&gt;DURHAM, N.C.  March 27, 2007  HP (Hewlett-Packard), Duke University, The University of Minnesota, and Qwaq, Inc. have jointly announced the formation of The Croquet Consortium, Inc., a 501(3)c non-profit foundation dedicated to promoting the continued development and widespread adoption of open source Croquet technologies for use in education, research, and industry. The launch of The Croquet Consortium coincides with the Consortiums release the open source Croquet Software Developers Kit 1.0 -- as free software under the Croquet Open Source License.&lt;br /&gt;&lt;br /&gt;The Croquet Consortium provides an organizational base for the Croquet community of developers and users. Open to institutional and individual members, the Consortium offers an avenue for academic, corporate, and individual members ensure the long-term viability of the community by federating their Croquet software development projects mobilizing distributed resources on their behalf.&lt;br /&gt;&lt;br /&gt;With the launch of The Croquet Consortium, Inc., the development and adoption of scalable Croquet-based applications for use in education, research and industry enters a new, expanded, and highly-inclusive phase of multi-institutional collaboration. The Consortium 1) establishes a legal home for the Croquet community, 2) coordinates the management, definition and release of core interoperable Croquet architecture, 3) provides a clearinghouse for the collection and distribution of freely available Croquet open source software artifacts, 4) supplies a management structure for the solicitation and mobilization of distributed development resources, and 5) creates a focal point for outreach activities, including the Consortium Website, Annual Conference, training workshops, fellowships, and sponsored projects.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-117500963356738354?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/03/croquet-consortium-launched.html</link><guid>c22e135161b2e4033ac8e5bd7a20019e</guid></item>
<item><title type="text">Croquet Road Map</title><description type="html">A draft of the Croquet Road Map is now available here: &lt;br /&gt;Go here: &lt;a href=&quot;http://www.croquetproject.org/index.php/Road_Map&quot;&gt;Croquet Road Map&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are three critical items: Island Classes, Two Dimension Infrastructure, and Documentation. These are the essential elements of the next big Croquet release, which I will discuss a bit later. &lt;br /&gt;&lt;br /&gt;The first item probably needs some elaboration. Island Classes are classes that are part of the replicated Island's definition. They can be edited like any other class, but only exist inside of a particular Island. The code can be reused only by copying the classes between Islands. This goes beyond a uni-class framework, turning Islands into complete encapsulated development environments. This may raise more questions than it answers, but it is a critical aspect of what we were after when we created Croquet - the ability to share even complex simulations between users in a protected space.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-27646630162411779?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/05/croquet-road-map.html</link><guid>7f107ee3d2a5f0859b91c0cfdff4b066</guid></item>
<item><title type="text">Scripting</title><description type="html">I have been spending a great deal of my time lately thinking about scripting issues. Most people are a bit wary of diving into Smalltalk to get things done. Of course, it is really a marvelous scripting language in many ways, but people tend to find it a bit difficult. I think the reason for this is the same reason Lisp is a bit difficult. Both Smalltalk and Lisp have extremely regular syntax structure. In Smalltalk, even the traditional control structures (if/then, while, for) are just normal object messages that look the same as any other object messages. Most other languages have &quot;exceptional&quot; syntax, in that they have a number of reserved key words, and often have specific non-regular syntax to support these &quot;exceptions&quot;. This makes it easier to visually parse, as most developers also tend to format their code around this non-regular syntax. This is especially useful to new programmers, because they can use this as a way to understand the code they are looking at. &lt;br /&gt;&lt;br /&gt;Smalltalk and Lisp programmer usually format their code in a way to hilight the flow of control as well, but since every line of code starts with an actual object followed by a message, even this is still harder to immediately recognize.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://scratch.mit.edu/&quot;&gt;Scratch&lt;/a&gt; is beautiful visual scripting language developed by the &lt;a href=&quot;http://llk.media.mit.edu/&quot;&gt;Lifelong Kindergarten group&lt;/a&gt; at MIT where they have moved very strongly in the direction of hilighting these very same control structures by using multiple shaped and colored tiles. What is nice about this is it makes it very easy to understand the structure of a program at a glance, and the program itself is simply &quot;assembled&quot; like you might put Lego blocks together. Interestingly, Scratch is built on top of Squeak - a version of Smalltalk.&lt;br /&gt;&lt;br /&gt;We have been looking at a number of scripting languages over the past year, and have even integrated Python directly into Qwaq Forums. We are also looking very closely at Javascript and Lua. In particular, I love Lua, as it really gives me a lot of the capabilities I miss in Smalltalk - functions are first class objects and it has full closure support. This allows for some very interesting capabilities in code. I have been saying that I was thinking about building Wicket in Python in the past, but I believe Lua would be a much better choice.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-2339370972565941567?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/08/scripting.html</link><guid>8286d100a474130a45624211ab0e51d4</guid></item>
<item><title type="text">Wisconsin Week Wun</title><description type="html">Where to start? I just finished the first week at my new job as a Croquet hacker at the University of Wisconsin. What is Croquet, you ask? I'm glad you did. You might like to start with the &lt;a href=&quot;http://www.opencroquet.org/&quot;&gt;project website&lt;/a&gt;, although non-techie friend have told me that they find it incomprehensible.  My &lt;a href=&quot;http://jlombardi.blogspot.com/&quot;&gt;boss&lt;/a&gt; has been working on a redesign, which will hopefully be friendly to both end-users and hackers.&lt;br /&gt;&lt;br /&gt;My move to Madison was eased by the Lombardis, who have graciously put me up at their house for a week while I found a suitable apartment. I have had a great time staying here, and am extremely grateful for their hospitality.&lt;br /&gt;&lt;br /&gt;In between the inevitable adminstrivia, I have actually been able to get some work done this week. I've been working on two tasks, one big and one small. Small one first: increasing rendering performance of large models.&lt;br /&gt;&lt;br /&gt;We have access to some high-poly models that were created by a laser range scanner (along the lines of the &lt;a href=&quot;http://graphics.stanford.edu/projects/mich/&quot;&gt;Digital Michaelangelo project&lt;/a&gt;. Such models are typically a) big (ours are over 200000 faces, and they can get much larger), and b) not structured for maximum rendering efficiency (for example, as long triangle strips). Loading the model into the scene drops the frame rate to about 3/second. Using Apple's OpenGL profiling tools, I was able to determine (as expected) that &lt;a href=&quot;http://www.squeak.org/&quot;&gt;Squeak&lt;/a&gt; overhead is not the problem: approximately 95% of the time is spent in glDrawElements().  So, how can we fix this?&lt;br /&gt;&lt;br /&gt;Two ideas immediately jumped to mind: using vertex buffers, and restructuring the mesh for faster rendering. The latter is a far more ambitious course, and I decided to try out VBOs first; if the performance improvement is not satisfactory, I can always try to reorganize the mesh later.&lt;br /&gt;&lt;br /&gt;The current approach of using glDrawElements() is not a completely stupid way to do things. It is much better than the naive approach of calling glVertex() etc. for each vertex of the mesh. However, there is still the overhead of copying all of the vertex data over the AGP bus for each rendered frame. &lt;a href=&quot;http://oss.sgi.com/projects/ogl-sample/registry/ARB/vertex_buffer_object.txt&quot;&gt; ARB_vertex_buffer_object &lt;/a&gt; is an OpenGL extension that addresses this problem by storing the vertex data in the GPU's memory. I expect to see a significant speedup, as many whitepapers from nVidia and ATI strongly recommend the use of this API for rendering static geometry. The downside is that it is an extension to OpenGL 1.4, which is beyond Croquet's current requirement of OpenGL 1.3 or better (I personally think that we should raise Croquet requirements to match those of Longhorn). With any luck, I will finish coding this approach this weekend.&lt;br /&gt;&lt;br /&gt;The big thing that I am working on is the Brie UI framework, which has been designed over the last couple of months by Julian and &lt;a href=&quot;http://webpages.charter.net/stearns/howard/&quot;&gt;Howard Stearns&lt;/a&gt;, our lead Croquet developer and all-round Smart Cookie. The overall ideas of Brie are best described in various posts in Howard's &lt;a href=&quot;http://www.wetmachine.com/itf/&quot;&gt; blog &lt;/a&gt;. Howard, Julian, and I spent a lot of time specifying the behavior of left/right mouse button clicks/drags/etc. in the virtual space. Where possible, we took advantage of the deep thought embodied in the Mac OS X UI. Sometimes it was not, since Croquet/Brie is not only a 3D environment, it is a 3D enviroment where (as &lt;a href=&quot;http://www.viewpointsresearch.org/alan.html&quot;&gt;Alan Kay&lt;/a&gt; says) &quot;the authoring is always on&quot;.  One can see an example of this philosophy in Squeak's &lt;a href=&quot;http://minnow.cc.gatech.edu/squeak/30&quot;&gt; Morphic &lt;/a&gt; UI. By Friday afternoon we ended up with a specification that we are all happy with. Hopefully we feel the same after reviewing our work on Monday morning :-).&lt;br /&gt;&lt;br /&gt;Next, we will tackle the even thornier problem of attaching behaviors (reified as 3D objects) to other objects in the environment. In particular, there are deep questions about how objects inherit behaviors from parent objects (ie: objects higher up the scene graph), how objects customise default behaviors, and how parent objects can enforce certain behaviors in child objects. This is all still a bit of a whirl in my head as I try to catch up with Howard and Julian. Working with mouse button behaviors is so much more concrete! You'll be sure to hear more of this later.&lt;br /&gt;&lt;br /&gt;That's my job!  I can't imagine a better one.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12298329-111610482637331705?l=croq.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croq.blogspot.com/2005/05/wisconsin-week-wun.html</link><guid>5f5b3f13630966a8875a66b4cc1a8521</guid></item>
<item><title type="text">Everyone else is doing it...</title><description type="html">... so I thought I'd start a blog too.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12298329-111396650997637799?l=croq.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croq.blogspot.com/2005/04/everyone-else-is-doing-it.html</link><guid>3bf80572b51c9af07db8af4dd6404759</guid></item>
<item><title type="text">&quot;Pulling on a thread&quot;</title><description type="html">The metaphor refers to one programming task leading to another. In this case, adding support for vertex buffer objects lead to writing a framework for managing OpenGL resource names/handles, and very nearly resulted in an all-out assault on the current content loading framework. Thanks be to Andreas Raab for advising against that (sometimes I can be hasty). But I digress...&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;font-size:130%;&quot; &gt;What happened this week?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I finished the vertex buffer work alluded to in my &lt;a href=&quot;http://croq.blogspot.com/2005/05/wisconsin-week-wun.html&quot;&gt;last entry&lt;/a&gt;.  Below, I'll discuss this in excruciating detail.&lt;br /&gt;&lt;br /&gt;Work on Brie continues. Howard has been making progress with the coding, and we continue to discuss issues as they arise. A lot hinges on uncertainty about what TeaTime will actually look like. Now that I'm finished with the vertex buffer work, I'll be helping Howard with coding Brie. Fun!&lt;br /&gt;&lt;span style=&quot;font-weight: bold;font-size:130%;&quot; &gt;&lt;br /&gt;So, tell me about those vertex buffers...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Such an interested audience!&lt;br /&gt;&lt;br /&gt;I finished a prototype rendering path using vertex buffers shortly after my last blog posting. Preliminary results were very encouraging: for the previously mentioned large meshes, the frame rate jumped from approximately 5 fps to 35 fps. This encouraged me to implement this feature in a more robust fashion, suitable for general use in Croquet. This work had two major aspects: managing the low-level OpenGL names for the resources, and allowing the vertex buffer rendering path to be disabled when desired (currently, when the OpenGL implementation does not support vertex buffers, and whenever else desired).&lt;br /&gt;&lt;br /&gt;In OpenGL, vertex buffers are named by an integer, as are many other types of resources such as textures and compiled shader programs. Recognizing the similarities between the way these resources are created, used, and destroyed, I designed a resource management framework that could support them all. I considered two major architectural approaches. The first was to generalize the functionality of OGLTextureManager, and the second was to create/destroy resource names within the scene graph objects as necessary (for example, this would involve modifying TTexture to directly hold an OpenGL name/handle, rather than referring to it indirectly via OGLTextureManager and OGLTextureHandle). The latter path was rejected because it would require significant reworking of TTexture, and more importantly because the handles are only valid in a single OpenGL context (disregarding resources shared between contexts, which is a can of worms that we can do without opening). Following the lead of OGLTextureManager, I created OGLResourceManager, which maps scenegraph objects (eg: TTexture, TVertexBuffer) to their low-level OpenGL counterparts (OGLTextureName, OGLBufferName).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;font-size:130%;&quot; &gt;Wow, that sounds pretty cool.  How does this resource management fit in with rendering meshes?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With the resource manager in place, I turned to modifying TMesh to allow the use of vertex buffers. The cleanest way to do this was to make TVertexBuffer into a wrapper around the data (vertices, face indices, etc.). TVertexBuffer needs access to this data anyway, since it might have to create a new low-level vertex buffer object at any time (for example, if the Croquet image is saved and quit, and then restarted, an open TeapotMorph will create a new OpenGL context to render in, and new resources will have to be created in this context). It is also convenient because it makes it easy for the mesh to fall back to the vertex array render path whenever vertex buffers are not available or not desired.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;font-size:130%;&quot; &gt;Sounds good, but does it work?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First, the good news. There is a drastic improvement in the speed of rendering large meshes. This is excellent, since it was the motivation for this work.&lt;br /&gt;&lt;br /&gt;Now, some indifferent news (not really bad). There was no speed improvement when rendering the default Croquet spaces using vertex buffers for all meshes. Some possible explanations are:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;we are overflowing the GPU memory (64MB on my laptop) and therefore OpenGL must send the data across the AGP bus anyway (essentially resulting in the vertex array model)&lt;/li&gt;   &lt;li&gt;for small meshes, the benefits of vertex buffers are outweighed by the overhead of managing resource names&lt;br /&gt; &lt;/li&gt;   &lt;li&gt;the bottlenecks are elsewhere for rendering the types of Croquet scenes that are currently typical&lt;br /&gt; &lt;/li&gt; &lt;/ul&gt; Preliminary benchmarking and profiling suggests that the last option is the most likely. However, I would have to study the issue more deeply before being willing to bet large sums of money on this opinion.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;font-size:130%;&quot; &gt;That sounds wonderful, but I really must go.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Me too.  Thanks for listening.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12298329-111699011826882274?l=croq.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croq.blogspot.com/2005/05/pulling-on-thread.html</link><guid>22609f818edbdd15581b6987023e8963</guid></item>
<item><title type="text">Short reflection</title><description type="html">I've noticed a trend in my blogging, which is to relate a literal and deeply technical view of my work.  This will likely continue for a while until I reach full speed here, but please check the blog out periodically if you find that the current level of discussion is not appropriate for you.&lt;br /&gt;&lt;br /&gt;Cheers!&lt;br /&gt;Josh&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12298329-111726338946194951?l=croq.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croq.blogspot.com/2005/05/short-reflection.html</link><guid>fa8b13c28485ea685f20a981c9571c57</guid></item>
<item><title type="text">More Event Processing</title><description type="html">I am still working to get a complete mental image of the event flow.  Lets follow a left mouse down event from Morph to TObject in the world.&lt;br /&gt;&lt;br /&gt;TeapotMorph &gt;&gt; handlesMouseDown is true, so TeapotMorph &gt;&gt; mouseDown is called, which calls activeCamera mouseDown. &lt;br /&gt;TUserCamera &gt;&gt; mouseDown determines that it is a left (red) button, and calls &lt;br /&gt;avatar selection: pointer selection pointerDown: evt.&lt;br /&gt;&lt;br /&gt;&quot;pointer selection&quot; returns the TObject picked by the activeCamera's TPointer the last time the TPointer was rendered, which is happening constantly, whenever the TSpace is rendered.&lt;br /&gt;&lt;br /&gt;TAvatar &gt;&gt; selection:pointerDown is where it gets fuzzy for me.  The TAvatar belonging to the activeCamera has it's own distinct TCamera and TPointer. The class comments say that the TPointer is a replicated copy of the pointer in the activeCamera, but the only replication I have found refers to positioning the avatar's TLaser. It is also unclear what purpose the avatar's camera serves - the comments refer to it as a pseudo-camera.&lt;br /&gt;&lt;br /&gt;Anyway, TAvatar &gt;&gt; selection:pointerDown first sets the avatar's camera's localtransform to that of the selected TObject, then sets the avatar's pointer's selected TObject, and then calls pointerDown on the &lt;b&gt;avatar's&lt;/b&gt; pointer.  Note: TAvatar has a selection:x: message for each possible event and they all do the same thing.&lt;br /&gt;&lt;br /&gt;TPointer &gt;&gt; pointerDown then examines the pointer's selected TObject, and if it returns true for isComponant and handlesPointerDown, it's handlePointer message is sent. Thus the mouse click has made it from the morph to the TObject.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-110514135839774759?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/01/more-event-processing.html</link><guid>e05264018b2d38480064267e24b39153</guid></item>
<item><title type="text">Reminders &amp; torrent</title><description type="html">Need to remember to talk to David S about his blog post: &lt;a href=&quot;http://croqueteer.blogspot.com/2004/09/walkthrough-in-croquet.html&quot;&gt; Walkthrough in Croquet &lt;/a&gt; - this seems very closely related to what we are trying to do with our Gallery Builder.&lt;br /&gt;&lt;br /&gt;Also, need to figure out how to persist changes to a world.  SolarCroquet could save images with a running Croquet window, TeaTime could not...according to the wiki, Jasmine is like TeaTime in this regard, but I need to confirm for myself.  Also examine the export &amp; import functions...I believe they are used for caching models, but maybe that can also save an entire space.&lt;br /&gt;&lt;br /&gt;People are definately interested in Croquet.  In 48 hours my torrent has uploaded 35 copies worth of data to other downloaders.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-109774269326403239?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/10/reminders-torrent.html</link><guid>f18e26ec8622a9d9515832b1c56a3ace</guid></item>
<item><title type="text">ODECo on OLPC</title><description type="html">&lt;a href=&quot;http://www.flickr.com/photos/propella/730663760/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1007/730663760_ca8a9eda83.jpg&quot; alt=&quot;P1030229&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;ODECo &lt;a href=&quot;http://languagegame.org:8080/ggame/15&quot;&gt;http://languagegame.org:8080/ggame/15&lt;/a&gt; is an easy tool kit for making dynamics simulation based on ODE &lt;a href=&quot;http://www.ode.org&quot;&gt;http://www.ode.org&lt;/a&gt;. It was developed for Squeak 3.6 in 2004 though. Now I did small fix to work on OLPC etoys and Squeak3.9 for linux (I've tested it on Fedora 7).How to Play:- Download and extract the image.- Install the plugin.(for OLPC, you need to copy ODEPlugin to /usr/lib/squeak/3.9-11/)- Open the image. And try examples.Download: (image + examples + plugins for linux, windows, mac)&lt;a href=&quot;http://languagegame.org/pub/ODECo-OLPC-2007-07-05.zip&quot;&gt;http://languagegame.org/pub/ODECo-OLPC-2007-07-05.zip&lt;/a&gt;Source Code:&lt;a href=&quot;http://squeaksource.com/ODE/ODE-Plugin-tak.2.mcz&quot;&gt;http://squeaksource.com/ODE/ODE-Plugin-tak.2.mcz&lt;/a&gt;&lt;a href=&quot;http://squeaksource.com/ODE/ODE-Base-tak.39.mcz&quot;&gt;http://squeaksource.com/ODE/ODE-Base-tak.39.mcz&lt;/a&gt;Website:&lt;a href=&quot;http://www.languagegame.org:8080/ggame/15&quot;&gt;http://www.languagegame.org:8080/ggame/15&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-5951549112400426595?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2007/07/odeco-on-olpc.html</link><guid>4b49d2515e12b811b7d371a1a7c3c21d</guid></item>
<item><title type="text">Documentation and Programming Language</title><description type="html">&lt;p&gt;A number of major programming languages have its own documentation system. Those variations themselves interest me very much. I picked up some of them and examined.&lt;/p&gt;&lt;p&gt;There are some interesting points to characterize those systems.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Text base VS Memory base: A text based documentation system is implemented as just a text formatter. But some are integrated in the language itself, so you can access the documentation in run time. Emacs Lisp is a significant example of Memory based documentation. I think Memory based documentation is more useful though, sometimes Text base is handy because it doesn't need to load a program only for the documentation.&lt;/li&gt;&lt;li&gt;Description part and Reference part: A documentation might include a description part, which describes overall goals and functions of a part like a class or a module. In contrast with description part, a reference part describes detail of a particular entity like a function or a variable. A reference part is connected with its source code of definition.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Perl&lt;/h3&gt;&lt;p&gt;Perl's documentation is described by POD (Plain Old Documentation). POD is a text based system. It has only description part.&lt;/p&gt;&lt;p&gt;POD is a very simple markup language and it has only enough mechanism to represent traditional UNIX manual style which includes certain sections like NAME, SYNOPSIS, DESCRIPTION, etc.&lt;/p&gt;&lt;p&gt;A POD document is embedded in a Perl program as a comment and the Perl's parser just ignores it. A POD parser just ignores program.  POD doesn't use any information from the program source code.&lt;/p&gt;&lt;a href=&quot;http://search.cpan.org/perldoc?perlpod&quot;&gt;http://search.cpan.org/perldoc?perlpod&lt;/a&gt;&lt;h3&gt;Java&lt;/h3&gt;&lt;p&gt;JavaDoc is the standard documentation tool for Java. It is a text based and it has both description part and reference part.&lt;/p&gt;&lt;p&gt;JavaDoc parser uses not only comments but also program codes to extract type information and class hierarchy. Even it works if you don't write a comment. Very structured HTML documentation is generated by the tool.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://java.sun.com/j2se/javadoc/&quot;&gt;http://java.sun.com/j2se/javadoc/&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Emacs Lisp&lt;/h3&gt;&lt;p&gt;Emacs Lisp has memory based documentation. And it has only reference part.&lt;/p&gt;&lt;p&gt;Emacs Lisp's documentation is highly integrated with Emacs editor. You can access help document for every functions and variables without external tool.&lt;/p&gt;&lt;p&gt;A documentation is described as a first comment in a function or a variable definition. This comment is parsed by Emacs lisp parser, and shown by help command e.g. M-x describe-function. Help system of Emacs Lisp doesn't have description part, but info manual of Emacs lisp complements overall information.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/defun.html&quot;&gt;http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/defun.html&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Python&lt;/h3&gt;&lt;p&gt;Python has memory based and text based documentation. And it has description part and reference part.&lt;/p&gt;&lt;p&gt;Basically Python's documentation is same as Lisp's. A documentation is described as a first comment of an entity (module, class, variable, etc...), and parsed by Python parser.  You can access the documentation through __doc__ property in run time.&lt;/p&gt;I don't know much about Python. But Python is unique because there seems to be a way to extract documentation by text processing like Java and Perl. I'll learn about it later.&lt;p&gt;&lt;a href=&quot;http://www.python.org/dev/peps/pep-0257/&quot;&gt;http://www.python.org/dev/peps/pep-0257/&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Squeak Smalltalk&lt;/h3&gt;&lt;p&gt;Squeak Smalltalk doesn't have documentation system. It is not necessary because the IDE is strong enough. But you can see IDE itself as a memory based documentation system.  Class comment is used as a description part, and method comment is used as a reference part. Class browser has mode to hide source code but comment.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-6024797344978094681?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/08/documentation-and-programming-language.html</link><guid>a373af1af0e8434b3b22eed3ad16a301</guid></item>
<item><title type="text">My personal history of Web Authorizing Tools (2)</title><description type="html">&lt;h3&gt;Tinlizzie Wiki&lt;/h3&gt;&lt;p&gt;Tinlizzie Wiki is a wiki written in Tweak. It uses OpenDocument Format(ODF) as data format, and WebDAV as server.&lt;p&gt;Although data format in StackWiki was Squeak specific binary, InTinlizzie Wiki existing common format is used. A part of reason why Ichoose ODF was that it was a research project to find a possibility toexchange eToys content among different platform. So it was necessaryto find platform independent and transparent format. ODF, especiallyits presentation format, was quite close to my demonds which are a)text based b) enable to embed graphics c) enable to use originalelement d) internal and external link supported.&lt;p&gt;A ODF file is just a zip archive which includes XML text andmultimedia binary files. And it is easy to extract image file in aproject by an another tool. Both embeded object and external resourcecan be represented by common URL notation. And if necessary, new tagfor Tweak specific object can be used. For example, a project whichincludes fully dynamic behavior written as Tweak objects can be viewedon ordinary OpenOffice Org application, although dynamic feature wouldin it be disabled.&lt;p&gt;To export Tweak object to ODF as natural as possible, special care wasneeded to save. It is not the best way to define a new tag for Tweakspecific object even though it is possible.  It was preferable to mapfrom Tweak to ODF properly. For example, if a Book object in Tweak isstored as a presentation within frame in ODF, the project lookssomewhat more normal even on other application.&lt;p&gt;There is a issue how much detail information is needed to save anobject. For example, if a text is saved during its editing, whether ifposition of the cursor should be saved or not?? There are two strategyin terms of implementation. One is to save everything except specifiedstatus (deep copy), another one is to save only specifiedstatus. Tinliziie Wiki adopted the latter one although Squeak andTweak native serialize mechanism were the former.&lt;p&gt;Saving only specific status has two disadvantages. a) A user mightexpect to save everything including minor information becausecombining arbitrary objects in even any peculiar way is possible inTweak. b) Each new widget needs to implement each exporter. But&quot;saving everything by default&quot; strategy has a problem of compatibilitybecause even just one change of variable name makes trouble for oldversion. Especially it is problematic for sharing in Internet. So Idin't choose this strategy.&lt;p&gt;WebDAV is used as the server. Both StackWiki and Tinlizzie doesn'tneed server side logic, but simple storage is required. WebDAV is thebest option for that matter. Even version control system can beplugged in the server with Subversion modlule in Apache for free,&lt;h3&gt;Javascript Workspace&lt;/h3&gt;&lt;p&gt;Javascript Workspace is a simple web application. It uses bareJavascript on client, and Ruby CGI on server. It behave like aSmalltalk Workspace, and the contents are managed same manner as Wiki.&lt;p&gt;Let me make sure about workspace again. Workspace is a text editor,and it has two additional commands &quot;do it&quot; and &quot;print it&quot;. Do itcommand envokes a source code selected by user, and print it commandoutput the result into cursor position. The function is similar toREPL shell on dynamic language, but the use case is slightlydifferent. A typical way to use workspace is as an explanation ofprogram. An author writes example source code inside thedocumentation, so that a user can try actual function while reading atext. Namely, REPL is two ways dialog between a machine and a human,but workspace is tree ways conversation among a machine, an author,and a user.&lt;p&gt;Workspace is indispensable tool for Smalltak though, which doesn'tmean only for Smalltalk. It would be nice if there is a workspace forJavascript language. This was the initial motivation of JavascriptWorkspace. And then, it was a natural consequence that Wiki was usedto save the content because Javascript lives on web browserintrinsically, and there are no way to save to local disk.&lt;p&gt;During the development, however, I realize that it can be more thanjust a workspace in terms of media. Javascript workspace has onlysimple user interface, which includes a couple of buttons and one bigtext area. Even there are no hyper link nor emphasized text. Butvariety things can be happend from such minimal configuration bysource code. Hyper link is enable to make from location property, richtext can be shown to modify DOM tree, and even game can be made to setup event hander. Source code can do everthing.&lt;p&gt;Just one textbox on a web page is a very radical idea. This iscompletely opposite direction to current trend of rich internetapplication. Web application consists with number of hidden functionsthese days, but Javascript Workspace can not have any invisibleinformation. Everything what it does is shown to you as source codeentirely on the screen. Javascritp Workspace looks like dangerous asit runs any Javascript code, but in fact, it is a quite safe system.&lt;p&gt;The idea of uset interface of Javascript Workspace is adopted toOMeta/JS.&lt;h3&gt;TileScript&lt;/h3&gt;&lt;p&gt;TileScript uses Scriptaculous as GUI library and WebDAV for serverstorage. JSON is used for its data format.&lt;p&gt;A TileScript document consists with one or more paragraphs, and aparagraph is either Javascript code, &quot;tile script&quot;, or HTMLexpression. A tile script is set of tiles, which each tile representssome syntactical element in a programming language. A user can connecttiles to construct a program with drag and drop. This is an easy wayto make a program avoiding syntax error. Javascript is used torepresent more complicated program than tile script. And HTML is usedas annotation. It can be seen as rich version of Javascript Workspace.&lt;p&gt;The initial motivation of TileScript was to remake eToys on the webenvironment. The research had got started by making tile available onweb browser. I considered to use Lively Kernel (SVG), but it wasunnecessary if Table element in HTML DOM is used astile. Scriptaculous is used to keep the source code simple.&lt;p&gt;After tile is ported, then next step was eToys environment itselfwhich includes event handling, scheduling, and bitmap animation,etc. But those issues seemed too difficult for nature of web document.&lt;p&gt;Flow layout, which actual position of document elements aredynamically changed by reader's browser environment, is a significantfeature of web. An author don't specify concrete position of elements,but rather care about logical structure. And then, a part of documentwhich can not be shown on the screen is accessable by a verticalscrool bar.&lt;p&gt;On the other hand, eToys provides page layout, which size and positionof elements is fixed, and presume particular screen size. Althogh, itis quite fit as a metaphor of physical paper, and best for a graphicalenvironment like eToys, but clumsy operation like zooming andhorizontal scrool is required.&lt;p&gt;Because ultimate goal of TileScript was not just reinventing eToys,but investigating further possibility, flow layout is adopted toTileScript. But still absolute coordination can be supported in formof embeded object even in flow layout. TileScript provides variablewatcher like eToys, but those widget is also layouted along with flow.&lt;h3&gt;And then&lt;/h3&gt;&lt;p&gt;Now I'm working on next version of Javascript Workspace, whichespecially its target application is Active Essays. Our group havefound that Javascript is quite reasonable tool to show some ideas ofcomputer science. One reason is language's simplicity, and other oneis easiness of collaboration. We have a lot of new ideas aboutprogramming language, and some of the part should be simple enough tounderstand even by junior high student. I believe my tool can be usedto explain such ideas.&lt;p&gt;The problem is any project intoroduced here is not intended for realuse, rather just for demo or prototype of further real development. Soit is not be so useful as it looks because it includes tooexperimental aspect, too fragile, or too slow.  Now I'm thinking thatit is not bad idea if I make somewhat stable version of them. Even itmight not have exotic feature like tile script, but only basic andsimple functions are enough to play with everyone. I really like myfirst idea of Javascript Workspace, which has only simple text. Iadmit it is extreme, so next version might support emphasized text andinline image (basic HTML elements) at least.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-4619398288033663021?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/09/my-personal-history-of-web-authorizing_02.html</link><guid>ae7603c72a5f4b27df8d1bc1d5eda416</guid></item>
<item><title type="text">A complete example of generating a sound in Flash with SampleDataEvent</title><description type="html">&lt;p&gt;Flash version 10 has significant feature about audio, &lt;a href=&quot;http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/events/SampleDataEvent.html&quot;&gt;SampleDataEvent&lt;/a&gt;. Untilthis version, there was no way to generate a sound wave easily. Somepeople have tried to do that by rather magical way of &lt;a href=&quot;http://www.flashbrighton.org/wordpress/?p=9&quot;&gt;how to makeactionscript 3 play generated pcm wave data&lt;/a&gt; in Flash 9, however,now we have a straightforward API from Flash 10. I think this is agreat improvement for hobby programmers who are interested in computergenerated music. While it's shame from some perspective. Just this APIfinally brings us a point where old BASIC and PLAY statement coulddo a quarter centry ago!&lt;/p&gt;&lt;p&gt;You would find a lot of examples about SampleDataEvent, but some ofthose are wrong or uncompleted, since I think this API have beenchanged so often in beta version. And I wrote my version of simplestexample for exercise.&lt;/p&gt;There are a couple of tricks you might trap.&lt;ul&gt;&lt;li&gt;If you get an error message: &quot;Flex error: type was not found or wasnot a compile-time constant: SampleDataEvent&quot;, you have to specify theFlash version to 10.0.0. Set -target-player option or Flex builder'sProject's Properties - ActionScript Compiler - HTML Wrapper&lt;/li&gt;&lt;li&gt;Some documentation might use Event.SAMPLE_DATA, but this is not true.&lt;/li&gt;&lt;/ul&gt;&lt;script src=&quot;http://gist.github.com/117424.js&quot;&gt;&lt;/script&gt;Generated SWF file: &lt;a href=&quot;http://languagegame.org/pub/SineSound.swf&quot;&gt;http://languagegame.org/pub/SineSound.swf&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-3149592068968367686?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/05/complete-example-of-generating-sound-in.html</link><guid>17531e39c6839768573456bf10fc053b</guid></item>
<item><title type="text">An Assembler for AVM2 using S-Expression</title><description type="html">These days, I have been writing a documentation about my latest AVM2assembler. Because it took very long time, I tempted to copy it hereto make my blog seem substantial.  &lt;h4&gt;Overview&lt;/h4&gt;  &lt;p&gt;ABCSX is an assembler and disassembler for the ActionScript  Virtual Machine 2 (AVM2) &lt;a href=&quot;#AVM2&quot;&gt;[1]&lt;/a&gt; and the  ActionScript Byte Code (ABC). It runs on Cola/Amino language or  PLT-Scheme. The syntax consists of s-expressions and a program  can be constructed with normal list operations in Scheme like  language. The goal of this utility is to build a high level  language compiler for Adobe Flash Player. To get the idea, &quot;Hello  World!&quot; programs for both ABCSX and abcasm (a standard assembler  utility consisted in the AVM2 source tree &lt;a href=  &quot;#tamarin&quot;&gt;[4]&lt;/a&gt;) are shown.&lt;/p&gt;  &lt;pre&gt;;;;; A &quot;Hello World!&quot; program in ABCSX ASM-form(asm (method  (((signature     ((return_type *) (param_type ()) (name &quot;hello&quot;)      (flags 0) (options ()) (param_names ())))    (code     ((getlocal 0)      (pushscope)      (findpropstrict ((package &quot;&quot;) &quot;print&quot;))      (pushstring &quot;Hello, World!!&quot;)      (callproperty ((package &quot;&quot;) &quot;print&quot;) 1)      (returnvoid)))))) (script (((init (method 0)) (trait ())))))&lt;/pre&gt;  &lt;pre&gt;// A &quot;Hello world World!&quot; program in abcasmfunction hello():*{    getlocal 0    pushscope    findpropstrict print    pushstring &quot;Hello, World!!&quot;    callproperty print (1)    returnvoid}&lt;/pre&gt;  &lt;p&gt;Although a program written in abcasm syntax is more concise  than ABCSX, the semantics is rather ambiguous. For example, in  spite of each symbol name in ABC belongs to namespace(s), the  syntax of abcasm doesn't describe it clearly. In this case,  &quot;print&quot; is implicitly interpreted to a Multiple Namespace Name  with a namespace set including PackageNamespace with no name. In  case of ABCSX, it is explicitly represented as PackageNamespace  with no name by &lt;tt&gt;((package &quot;&quot;) &quot;print&quot;)&lt;/tt&gt;. This implicit  behavior might be useful for writing a program by hand, but not  necessary for a machine generated code. ABCSX rather takes a  direction toward verbose but unambiguous style.&lt;/p&gt;  &lt;p&gt;ABCSX offers two forms of syntax. ASM-form is higher level  syntax introduced above. ABC-form is identical to an abstract  syntax tree of ABC binary file. This is useful when exact  behavior is need to know while debug.&lt;/p&gt;  &lt;pre&gt;;;;; A &quot;Hello World!&quot; program in ABCSX ABC-form(abc (minor_version 16) (major_version 46) (constant_pool  ((integer ())   (uinteger ())   (double ())   (string (&quot;hello&quot; &quot;&quot; &quot;print&quot; &quot;Hello, World!!&quot;))   (namespace ((package (string 2))))   (ns_set ())   (multiname (((namespace 1) (string 3)))))) (method (((return_type (multiname 0)) (param_type ())           (name (string 1)) (flags 0) (options ()) (param_names ())))) (metadata ()) (instance ()) (class ()) (script (((init (method 0)) (trait ())))) (method_body  (((method 0) (max_stack 2) (local_count 1)               (init_scope_depth 0) (max_scope_depth 1)    (code     ((getlocal 0)      (pushscope)      (findpropstrict (multiname 1))      (pushstring (string 4))      (callproperty (multiname 1) 1)      (returnvoid)))    (exception ())    (trait ())))))&lt;/pre&gt;  &lt;p&gt;Using ASM-form, a compiler writer doesn't have to care about  building a constant pool, or code hint information (AVM2 requires  a frame information like stack size and register size used in a  code).&lt;/p&gt;  &lt;h4&gt;Background&lt;/h4&gt;  &lt;p&gt;One of goals of the STEPS project &lt;a href=&quot;#STEPS&quot;&gt;[3]&lt;/a&gt; and  COLA programming language is to provide full control of computer  environment from application level to machine language level, so  that users could experiment and design their own programming  language best fit to their task. It also will be used as a basis  of next generation of EToys programming environment for kids.&lt;/p&gt;  &lt;p&gt;We chose Adobe Flash Player as one of platforms of the system  because of its popularity and usability. Using Flash's virtual  machine on a web browser, we could deliver our programming  environment without concerning about installation or security  issue.&lt;/p&gt;  &lt;p&gt;AVM2 has some disadvantages compared to Java VM. AVM2 lacks  multi task support, and its dynamic dispatching function is  relatively slow. But the startup speed and memory footage are  good, and these aspects are essential to casual users. Especially  AVM2 will be good platform to implement EToys.&lt;/p&gt;  &lt;p&gt;ABCSX is designed to be a back end module for COLA, command  line assembler / disassembler, and a Scheme library. While it is  a part of COLA/ABC compiler, it also can be used as a command  line tool to examine and debug ABC binary file.&lt;/p&gt;  &lt;h4&gt;Usage&lt;/h4&gt;  &lt;h5&gt;Command line tool&lt;/h5&gt;  &lt;p&gt;A version of ABCSX is publicly available on the github  repository &lt;a href=&quot;#ABCSX&quot;&gt;[2]&lt;/a&gt;. It includes command line  tools run on PLT-Scheme. There are also example programs at  &lt;tt&gt;examples/&lt;/tt&gt; directory. The assembler and disassembler use  same file format and the assembler &lt;tt&gt;asm.ss&lt;/tt&gt; can read an  output file generated by disassembler &lt;tt&gt;dump.ss&lt;/tt&gt;.&lt;/p&gt;  &lt;dl&gt;    &lt;dt class=&quot;code&quot;&gt;asm.ss &lt;i&gt;filename.sx&lt;/i&gt;&lt;/dt&gt;    &lt;dd&gt;Generate an ABC binary file from ASM-form or ABC-form. The    output file name is filename.sx.abc.&lt;/dd&gt;    &lt;dt class=&quot;code&quot;&gt;dump.ss [-abc] &lt;i&gt;filename.abc&lt;/i&gt;&lt;/dt&gt;    &lt;dd&gt;Disassemble an ABC binary file. The output is printed to    stdout. If &lt;tt&gt;-abc&lt;/tt&gt; option is specified, ABC-form is    chosen as output format.&lt;/dd&gt;    &lt;dt class=&quot;code&quot;&gt;runasm.sh &lt;i&gt;filename.sx&lt;/i&gt;&lt;/dt&gt;    &lt;dd&gt;Assemble ASM-form or ABC-form and execute it by avmshell.    It requires avmshell installed. Avmshell is included in Tamarin    VM's source tree &lt;a href=&quot;#tamarin&quot;&gt;[4]&lt;/a&gt;.&lt;/dd&gt;    &lt;dt class=&quot;code&quot;&gt;swf_abc.erl &lt;i&gt;width height classname    abcfile.abc&lt;/i&gt;&lt;/dt&gt;    &lt;dd&gt;A helper program to generate a flash file from an abc file.    It requires Erlang.&lt;/dd&gt;  &lt;/dl&gt;  &lt;h5&gt;Function&lt;/h5&gt;  &lt;dl&gt;    &lt;dt&gt;&lt;span class=&quot;code&quot;&gt;(write-asm &lt;i&gt;list&lt;/i&gt;    &lt;i&gt;port&lt;/i&gt;)&lt;/span&gt; procedure&lt;/dt&gt;    &lt;dd&gt;Assemble ASM- or ABC-form to a binary stream.&lt;/dd&gt;    &lt;dt&gt;&lt;span class=&quot;code&quot;&gt;(read-asm &lt;i&gt;port&lt;/i&gt;)&lt;/span&gt;    procedure&lt;/dt&gt;    &lt;dd&gt;Disassemble a binary stream to ASM-form.&lt;/dd&gt;    &lt;dt&gt;&lt;span class=&quot;code&quot;&gt;(from-asm &lt;i&gt;list&lt;/i&gt;)&lt;/span&gt;    procedure&lt;/dt&gt;    &lt;dd&gt;Convert ASM-form to ABC-form. This is a part of process of    assemble. Each literal value is replaced to a reference, and a    constant pool is created&lt;/dd&gt;    &lt;dt&gt;&lt;span class=&quot;code&quot;&gt;(to-asm &lt;i&gt;list&lt;/i&gt;)&lt;/span&gt;    procedure&lt;/dt&gt;    &lt;dd&gt;Convert ABC-form to ASM-form. This is a part of process of    disassemble. Each constant reference in the ABC-form is    replaced to a literal value based on the constant pool.&lt;/dd&gt;  &lt;/dl&gt;  &lt;h4&gt;Data Type&lt;/h4&gt;  &lt;p&gt;ABC's data is expressed as scheme expression in ABCSX. In  ASM-form, data conversion has subtle context dependency in  code-subsection.&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;integer - An integer value in Scheme is converted to ABC    integer value depend on the context.      &lt;ul&gt;        &lt;li&gt;int (s32) - In code-subsection, an integer is converted        to a signed 32 bit integer if the opcode requires integer        e.g. &lt;tt&gt;pushint&lt;/tt&gt;.&lt;/li&gt;        &lt;li&gt;uint (u32) - In code-subsection, an integer is        converted to a unsigned 32 bit integer if the opcode        requires integer e.g. &lt;tt&gt;pushuint&lt;/tt&gt;.&lt;/li&gt;        &lt;li&gt;u30 - An integer is converted to a unsigned 30 bit        integer in ABC anywhere else.&lt;/li&gt;      &lt;/ul&gt;    &lt;/li&gt;    &lt;li&gt;double (d64) - A floating point number value is converted    to a 64-bit double precision IEEE 754 value.&lt;/li&gt;    &lt;li&gt;string - A string is converted a string value in ABC.&lt;/li&gt;    &lt;li&gt;namespace - Some list expressions are converted to    namespace values in ABC. The format is (&lt;i&gt;kind&lt;/i&gt;    &lt;i&gt;string&lt;/i&gt;). For example, &lt;span class=&quot;code&quot;&gt;(package    &quot;org.vpri&quot;)&lt;/span&gt; is converted to a package namespace named    &lt;tt&gt;&quot;org.vpri&quot;&lt;/tt&gt;.      &lt;ul&gt;        &lt;li&gt;Namespace - &lt;tt&gt;(ns &lt;i&gt;string&lt;/i&gt;)&lt;/tt&gt; is converted to        Namespace&lt;/li&gt;        &lt;li&gt;PackageNamespace - &lt;tt&gt;(package &lt;i&gt;string&lt;/i&gt;)&lt;/tt&gt; is        converted to PackageNamespace&lt;/li&gt;        &lt;li&gt;PackageInternalNs - &lt;tt&gt;(internal &lt;i&gt;string&lt;/i&gt;)&lt;/tt&gt;        is converted to PackageInternalNs&lt;/li&gt;        &lt;li&gt;ProtectedNamespace - &lt;tt&gt;(protected &lt;i&gt;string&lt;/i&gt;)&lt;/tt&gt;        is converted to ProtectedNamespace&lt;/li&gt;        &lt;li&gt;ExplicitNamespace - &lt;tt&gt;(explicit &lt;i&gt;string&lt;/i&gt;)&lt;/tt&gt;        is converted to ExplicitNamespace&lt;/li&gt;        &lt;li&gt;StaticProtectedNs - &lt;tt&gt;(static &lt;i&gt;string&lt;/i&gt;)&lt;/tt&gt; is        converted to StaticProtectedNs&lt;/li&gt;        &lt;li&gt;PrivateNs - &lt;tt&gt;(private &lt;i&gt;string&lt;/i&gt;)&lt;/tt&gt; is        converted to PrivateNs&lt;/li&gt;      &lt;/ul&gt;    &lt;/li&gt;    &lt;li&gt;namespace set - A namespace set can not be described as a    literal. Instead, it is declared in a constant pool of    ns_set-section at first, and be made reference by index e.g.    &lt;span class=&quot;code&quot;&gt;(ns_set 1)&lt;/span&gt;.&lt;/li&gt;    &lt;li&gt;multiname - Some list expressions are converted to    multiname (symbol) in ABC.      &lt;ul&gt;        &lt;li&gt;QName - &lt;tt&gt;(&lt;i&gt;namespace&lt;/i&gt; &lt;i&gt;string&lt;/i&gt;)&lt;/tt&gt; is        converted as QName e.g. &lt;span class=&quot;code&quot;&gt;((package        &quot;flash.display&quot;) &quot;Sprite&quot;))&lt;/span&gt;&lt;/li&gt;        &lt;li&gt;RTQName - is not supported.&lt;/li&gt;        &lt;li&gt;RTQNameL - is not supported.&lt;/li&gt;        &lt;li&gt;Multiname - &lt;tt&gt;((ns_set &lt;i&gt;integer&lt;/i&gt;)        &lt;i&gt;string&lt;/i&gt;)&lt;/tt&gt; is converted as a Multiname e.g.        &lt;span class=&quot;code&quot;&gt;((ns_set 1) &quot;addChild&quot;)&lt;/span&gt;&lt;/li&gt;        &lt;li&gt;MultinameL - is not supported.&lt;/li&gt;      &lt;/ul&gt;    &lt;/li&gt;  &lt;/ul&gt;  &lt;h4&gt;Syntax&lt;/h4&gt;The syntax of ASM-form is explained. ABCSX uses  same symbol names as &quot;ActionScript Virtual Machine 2 (AVM2)  Overview&quot; unless it is too strange. Especially, underline  delimited names and capital names are derived from the document.  &lt;h5&gt;ASM-form&lt;/h5&gt;  &lt;p&gt;&lt;tt&gt;(asm &lt;i&gt;[ns_set-section]&lt;/i&gt; &lt;i&gt;method-section&lt;/i&gt;  &lt;i&gt;[metadata-section]&lt;/i&gt; &lt;i&gt;[instance-section]&lt;/i&gt;  &lt;i&gt;[class-section]&lt;/i&gt; &lt;i&gt;script-section)&lt;/i&gt;&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;ASM-form begins with a symbol &lt;tt&gt;asm&lt;/tt&gt;, and contents are  followed. ns_set-section, instance-section, and class-section are  optional.&lt;/p&gt;  &lt;h5&gt;ns_set-section&lt;/h5&gt;  &lt;p&gt;&lt;tt&gt;(ns_set (ns_set &lt;i&gt;namespace ...&lt;/i&gt;) ...)&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Ns_set-section will be a part of constant pool, and it is only  necessary if namespace set is used in other part of the ASM-form.  You can not specify a namespace set directly as a literal, but  you need to define it in ns_set-section and point it with the  index number.&lt;/p&gt;  &lt;p&gt;Ns_set-section begins with a symbol &lt;tt&gt;ns_set&lt;/tt&gt; and a list  of ns_set_info is followed. A ns_set_info begins with a symbol  &lt;tt&gt;ns_set&lt;/tt&gt; and it includes a list of namespaces. A namespace  set is referred with one-based index by other part. For example,  the first namespace set is referred as &lt;tt&gt;(ns_set 1)&lt;/tt&gt;.&lt;/p&gt;  &lt;h5&gt;method-section&lt;/h5&gt;  &lt;p&gt;&lt;tt&gt;(method (&lt;i&gt;signature-subsection code-subsection&lt;/i&gt;)  ...)&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Method-section includes a list of pairs of signature and code.  A method is referred by zero-based index. For example, the first  method is referred as &lt;tt&gt;(method 0)&lt;/tt&gt;.&lt;/p&gt;  &lt;h6&gt;signature-subsection&lt;/h6&gt;  &lt;p&gt;&lt;tt&gt;(signature (return_type &lt;i&gt;multiname&lt;/i&gt;) (param_type  (&lt;i&gt;multiname&lt;/i&gt; ...)) (name &lt;i&gt;string&lt;/i&gt;) (flags  &lt;i&gt;integer&lt;/i&gt;) (options (&lt;i&gt;option&lt;/i&gt;...)) (param_names  (&lt;i&gt;multiname&lt;/i&gt; ...)))&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Signature-subsection describes method's signature. If * is  specified at the return_type. It is treated as Any Type. A name  entry is not used as a method name in a program. In a typical  case, methods are explicitly bound to named slots in  initialization code at script-section or object constructor.&lt;/p&gt;  &lt;h6&gt;code-subsection&lt;/h6&gt;  &lt;p&gt;&lt;tt&gt;(code (&lt;i&gt;instructions&lt;/i&gt;...))&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Code subsection describes a sequence of instruction code of  the method. A label is specified as a symbol, and normal  instruction is specified as a list as:&lt;/p&gt;  &lt;p&gt;&lt;tt&gt;([&lt;i&gt;offset-number&lt;/i&gt;] &lt;i&gt;inst-name args&lt;/i&gt;  ...)&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;offset-number is optional and used just as a place holder. It  can be a integer or symbol &lt;tt&gt;_&lt;/tt&gt;. ABCSX's disassembler put a  byte offset number at this place, but the assembler ignores  it.&lt;/p&gt;  &lt;h5&gt;metadata-section&lt;/h5&gt;  &lt;p&gt;&lt;tt&gt;(metadata (&lt;i&gt;metadata_info&lt;/i&gt; ...))&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Metadata-section describes a list of metadata entries.&lt;/p&gt;  &lt;h5&gt;instance-section&lt;/h5&gt;  &lt;p&gt;&lt;tt&gt;(instance (((name &lt;i&gt;multiname&lt;/i&gt;) (super_name  &lt;i&gt;multiname&lt;/i&gt;) (flags &lt;i&gt;integer&lt;/i&gt;) (interface  (&lt;i&gt;multiname&lt;/i&gt; ...)) (iinit &lt;i&gt;method&lt;/i&gt;) (trait  (&lt;i&gt;trait_info&lt;/i&gt; ...)) ...)))&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Instance-section describes a list of class definitions. Class  members are defined by a list of trait_info.&lt;/p&gt;  &lt;h5&gt;class-section&lt;/h5&gt;  &lt;p&gt;&lt;tt&gt;(class (((cinit &lt;i&gt;method&lt;/i&gt;) (trait  (&lt;i&gt;trait_info&lt;/i&gt;...))) ...))&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Class-section describes a list of static members of class  definition. The number of this list is same as instance-section,  and each entry of class-section corresponds to instance-section.  A definition consists of a class initializer and trait_info  definitions.&lt;/p&gt;  &lt;h5&gt;script-section&lt;/h5&gt;  &lt;p&gt;&lt;tt&gt;(script (((init &lt;i&gt;method&lt;/i&gt;) (trait  (&lt;i&gt;trait_info&lt;/i&gt;...))) ...))&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Script-section defines a list of static functions. It is also  used as a program's startup code. Once the virtual machine reads  a program, the last entry of script-section is invoked. Each  entry consists of a method reference and a list of trait_info.  Trait_info is used as a function's environment.&lt;/p&gt;  &lt;h5&gt;trait_info&lt;/h5&gt;  &lt;p&gt;Trait_info defines a fixed property of an object, class, or  method. ABCSX only supports Trait_Slot and Trait_Class.&lt;/p&gt;  &lt;h6&gt;Trait_Slot&lt;/h6&gt;  &lt;p&gt;&lt;tt&gt;((kind slot) (name &lt;i&gt;multiname&lt;/i&gt;) (slot_id  &lt;i&gt;integer&lt;/i&gt;) (type_name &lt;i&gt;multiname&lt;/i&gt;) (vindex  &lt;i&gt;integer&lt;/i&gt;) (vkind &lt;i&gt;integer&lt;/i&gt;) (metadata  (&lt;i&gt;metadata_info&lt;/i&gt;...)))&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Trait_Slot defines a named slot in the context.&lt;/p&gt;  &lt;h6&gt;Trait_Class&lt;/h6&gt;  &lt;p&gt;&lt;tt&gt;((kind class) (name &lt;i&gt;multiname&lt;/i&gt;) (slot_id  &lt;i&gt;integer&lt;/i&gt;) (classi &lt;i&gt;class&lt;/i&gt;) (metadata  (&lt;i&gt;metadata_info&lt;/i&gt;...)))&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Trait_Class defines a named slot with a class in the  context.&lt;/p&gt;  &lt;h5&gt;metadata_info&lt;/h5&gt;  &lt;p&gt;&lt;tt&gt;((name &lt;i&gt;string&lt;/i&gt;) (items (((key &lt;i&gt;string&lt;/i&gt;) (value  &lt;i&gt;string&lt;/i&gt;)) ...)))&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;Metadata_info defines an entry including arbitrary key/value  pairs.&lt;/p&gt;  &lt;h4&gt;Current Status&lt;/h4&gt;  &lt;p&gt;Currently, only major elements in AVM2 are implemented.&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;All primitive data types are implemented.&lt;/li&gt;    &lt;li&gt;75 instructions (about a half of the whole instruction set)    are implemented.&lt;/li&gt;    &lt;li&gt;Only QName (Qualified Name) and Multiname (Multiple    Namespace Name) are implemented.&lt;/li&gt;    &lt;li&gt;Optional parameters or parameter names are not    implemented.&lt;/li&gt;    &lt;li&gt;Trait_Method, Trait_Getter, Trait_Setter, Trait_Function,    or Trait_Const are not implemented.&lt;/li&gt;    &lt;li&gt;Exception is not implemented.&lt;/li&gt;  &lt;/ul&gt;&lt;!--      &lt;h4&gt;Releated Work&lt;/h4&gt;- Sassy: http://home.earthlink.net/~krautj/sassy/sassy.html- format.abc: ActionScript Bytecode in HaXe http://haxe.org/com/libs/format/abc- scheme-abc: http://github.com/mzp/scheme-abc--&gt;  &lt;h4&gt;Example&lt;/h4&gt;  &lt;p&gt;As a complete example, A GUI version of &quot;Hello World!&quot; program  is shown with commentary. This file is available at  &lt;tt&gt;examples/textField.sx&lt;/tt&gt; on the source tree.&lt;/p&gt;  &lt;pre&gt;(asm (ns_set  ((ns_set (package &quot;&quot;) (package &quot;flash.text&quot;))))&lt;/pre&gt;An ASM-form begins with a symbol &lt;tt&gt;asm&lt;/tt&gt;, and ans_set-section follows if necessary. This example declare onenamespace set including package namespaces &lt;tt&gt;&quot;&quot;&lt;/tt&gt; and&lt;tt&gt;&quot;flash.text&quot;&lt;/tt&gt; as &lt;tt&gt;(ns_set 1)&lt;/tt&gt;. Ns_set's index numberstarts with 1 because this is a member of constant pool. Other kindof index number (method, class) starts with 0.  &lt;pre&gt; (method  (((signature ((return_type *) (param_type ()) (name &quot;&quot;)                (flags 0) (options ()) (param_names ())))    (code     ((returnvoid))))&lt;/pre&gt;  &lt;p&gt;The first method is referred as &lt;tt&gt;(method 0)&lt;/tt&gt;. It is  used as a class initializer in the class-section, but nothing to  do in this case.&lt;/p&gt;  &lt;pre&gt;   ((signature ((return_type *) (param_type ()) (name &quot;&quot;)                (flags 0) (options ()) (param_names ())))    (code     ((getlocal_0)      (pushscope)      (getlocal_0)      (constructsuper 0)      (findpropstrict ((ns_set 1) &quot;TextField&quot;))      (constructprop ((package &quot;flash.text&quot;) &quot;TextField&quot;) 0)      (coerce ((package &quot;flash.text&quot;) &quot;TextField&quot;))      (setlocal_1)      (getlocal_1)      (pushstring &quot;Hello, World!&quot;)      (setproperty ((package &quot;&quot;) &quot;text&quot;))      (findpropstrict ((package &quot;&quot;) &quot;addChild&quot;))      (getlocal_1)      (callproperty ((package &quot;&quot;) &quot;addChild&quot;) 1)      (pop)      (returnvoid))))&lt;/pre&gt;  &lt;p&gt;The second method is later used in the instance-section as  class Hello's constructor. It builds an instance of  &lt;tt&gt;flash.text.TextField&lt;/tt&gt; and set &quot;Hello, World!&quot; to the  property named &lt;tt&gt;text&lt;/tt&gt;. Finally, the text field is added to  this (Hello) object.&lt;/p&gt;  &lt;pre&gt;   ((signature ((return_type *) (param_type ()) (name &quot;&quot;)                (flags 0) (options ()) (param_names ())))    (code     ((getlocal_0)      (pushscope)      (getscopeobject 0)      (findpropstrict ((package &quot;&quot;) &quot;Object&quot;))      (getproperty ((package &quot;&quot;) &quot;Object&quot;))      (pushscope)      (findpropstrict ((package &quot;flash.display&quot;) &quot;Sprite&quot;))      (getproperty ((package &quot;flash.display&quot;) &quot;Sprite&quot;))      (pushscope)      (findpropstrict ((package &quot;flash.display&quot;) &quot;Sprite&quot;))      (getproperty ((package &quot;flash.display&quot;) &quot;Sprite&quot;))      (newclass 0)      (popscope)      (popscope)      (initproperty ((package &quot;&quot;) &quot;Hello&quot;))      (returnvoid))))))&lt;/pre&gt;  &lt;p&gt;The third method is used as the startup script. It creates an  environment and initialize a new class defined in  instance-section and class-section by &lt;tt&gt;newclass&lt;/tt&gt;  instruction.&lt;/p&gt;  &lt;pre&gt; (instance  (((name ((package &quot;&quot;) &quot;Hello&quot;))    (super_name ((package &quot;flash.display&quot;) &quot;Sprite&quot;))    (flags 0)    (interface ())    (iinit (method 1))    (trait ())))) (class (((cinit (method 0)) (trait ()))))&lt;/pre&gt;Instance-section and class section define classes. In thiscase, A class named &lt;tt&gt;Hello&lt;/tt&gt; is defined as a subclass of &lt;tt&gt;  flash.display.Sprite&lt;/tt&gt;. When a SWF file is created from ABC  file, a SymbolClass tag in the SWF creates association between a  class name defined here and the main timeline of the SWF. In  ABCSX tool set, script &lt;tt&gt;swf_abc.erl&lt;/tt&gt;'s third argument does  this task.  &lt;pre&gt; (script  (((init (method 2))    (trait     (((kind class)       (name ((package &quot;&quot;) &quot;Hello&quot;))       (slot_id 1)       (classi (class 0))       (metadata ()))))))))&lt;/pre&gt;  &lt;p&gt;Script-section defines the startup script and predefined named  slot.&lt;/p&gt;  &lt;h4&gt;References&lt;/h4&gt;  &lt;ul&gt;    &lt;li id=&quot;AVM2&quot;&gt;[1] ActionScript Virtual Machine 2 (AVM2)    Overview. &lt;a href=    &quot;http://www.adobe.com/devnet/actionscript/articles/avm2overview.pdf&quot;&gt;    http://www.adobe.com/devnet/actionscript/articles/avm2overview.pdf&lt;/a&gt;&lt;/li&gt;    &lt;li id=&quot;ABCSX&quot;&gt;[2] ABCSX github repository. &lt;a href=    &quot;http://github.com/propella/abcsx&quot;&gt;http://github.com/propella/abcsx&lt;/a&gt;&lt;/li&gt;    &lt;li id=&quot;STEPS&quot;&gt;[3] Steps Toward the Reinvention of Programming    (First Year Progress Report). &lt;a href=    &quot;http://www.vpri.org/pdf/tr2007008_steps.pdf&quot;&gt;http://www.vpri.org/pdf/tr2007008_steps.pdf&lt;/a&gt;&lt;/li&gt;    &lt;li id=&quot;tamarin&quot;&gt;[4] Tamarin Project &lt;a href=    &quot;http://www.mozilla.org/projects/tamarin/&quot;&gt;http://www.mozilla.org/projects/tamarin/&lt;/a&gt;&lt;/li&gt;  &lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-5857062564951296324?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/10/assembler-for-avm2-using-s-expression.html</link><guid>318cf6926806a53bea3a52b185add503</guid></item>
<item><title type="text">Wooden half adder</title><description type="html">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/4075677552/&quot;  title=&quot;P1060931 by propella, on Flickr&quot;&gt;&lt;img src=  &quot;http://farm3.static.flickr.com/2487/4075677552_0be04e0c14.jpg&quot;  width=&quot;500&quot; height=&quot;375&quot; alt=&quot;P1060931&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Since I encountered an essay by A. K. Dewdney over ten years ago,  somewhat I had been obsessed about mechanical implementation of  boolean logic. The essay introduced ideas of kinetic binary  calculator as an imaginary story of ancient civilization. This  fantastic tale attracted me, and my theme at the art college became  how to make a computer made from wood.&lt;/p&gt;  &lt;p&gt;Last year, my boss gave me a Dewdney's book &quot;The Tinkertoy  Computer and Other Machinations&quot;, which includes the essay, and my  enthusiasm came back. I made a couple of prototypes to realize  boolean logic without electronics. This is the latest attempt.&lt;/p&gt;  &lt;p&gt;I chose a half adder as the motive because half adders are used  everywhere in a computer hardware, and it seems nice complexity for  the project. I thought this is the best example to show the idea  that computer's concept is independent with hardware. In other  words, I wanted to prove that computer is purely conceptual entity  and you can make it from any material besides electronics parts.&lt;/p&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;td&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/4079121563/&quot;      title=&quot;P1070004 by propella, on Flickr&quot;&gt;&lt;img src=      &quot;http://farm3.static.flickr.com/2571/4079121563_0518beffba_m.jpg&quot;      width=&quot;240&quot; height=&quot;180&quot; alt=&quot;P1070004&quot; /&gt;&lt;/a&gt;&lt;/td&gt;      &lt;td&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/4079880288/&quot;      title=&quot;P1070009 by propella, on Flickr&quot;&gt;&lt;img src=      &quot;http://farm3.static.flickr.com/2658/4079880288_93d15391c0_m.jpg&quot;      width=&quot;240&quot; height=&quot;180&quot; alt=&quot;P1070009&quot; /&gt;&lt;/a&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;I first built a wooden AND operator. Can you tell how this toy  work? The top two holes show the input, and the center hole shows  the answer. Background board shows two kind of state T (True) and F  (False). Because of gravity, initial state is T AND T = T, once you  pull one of bars up, the center piece is also pulled up, and the  answer becomes F. This is how AND works.&lt;/p&gt;  &lt;p&gt;Basically, any boolean logic can be possible with AND, and  another operator NOT (even OR can be constructed from AND and NOT).  Let's think about a half adder. A half adder is a primitive adder  and you can only add two bits. There are only four positions.&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;0 + 0 = 0 0&lt;/li&gt;    &lt;li&gt;0 + 1 = 0 1&lt;/li&gt;    &lt;li&gt;1 + 0 = 0 1&lt;/li&gt;    &lt;li&gt;1 + 1 = 1 0&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;Let the inputs A and B, and the outputs S (sum, the low bit) and  C (carry, the high bit). A half adder can be shown two boolean  equations from AND(&amp;and;) and NOT(&amp;not;).&lt;/p&gt;&lt;a href=  &quot;http://www.flickr.com/photos/propella/4079918064/&quot; title=  &quot;halfAdderDiagram by propella, on Flickr&quot;&gt;&lt;img src=  &quot;http://farm3.static.flickr.com/2715/4079918064_b4fa0f38dd_o.png&quot;  width=&quot;140&quot; height=&quot;303&quot; alt=&quot;halfAdderDiagram&quot; /&gt;&lt;/a&gt;  &lt;ul&gt;    &lt;li&gt;C = A &amp;and; B&lt;/li&gt;    &lt;li&gt;S = A xor B = &amp;not;(A &amp;and; B) &amp;and; &amp;not;(&amp;not; A &amp;and;    &amp;not;B)&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;Finally, I constructed parts along with this formula. I used  gears as NOT operator.&lt;/p&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;td&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/4075676754/&quot;      title=&quot;P1060912 by propella, on Flickr&quot;&gt;&lt;img src=      &quot;http://farm3.static.flickr.com/2732/4075676754_11b43f8176_m.jpg&quot;      width=&quot;240&quot; height=&quot;180&quot; alt=&quot;P1060912&quot; /&gt;&lt;/a&gt;&lt;/td&gt;      &lt;td&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/4075675984/&quot;      title=&quot;P1060908 by propella, on Flickr&quot;&gt;&lt;img src=      &quot;http://farm3.static.flickr.com/2647/4075675984_a2ffb5c677_m.jpg&quot;      width=&quot;240&quot; height=&quot;180&quot; alt=&quot;P1060908&quot; /&gt;&lt;/a&gt;&lt;/td&gt;      &lt;td&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/4075675256/&quot;      title=&quot;P1060900 by propella, on Flickr&quot;&gt;&lt;img src=      &quot;http://farm3.static.flickr.com/2771/4075675256_c99dacda86_m.jpg&quot;      width=&quot;240&quot; height=&quot;180&quot; alt=&quot;P1060900&quot; /&gt;&lt;/a&gt;&lt;/td&gt;      &lt;td&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/4074919483/&quot;      title=&quot;P1060894 by propella, on Flickr&quot;&gt;&lt;img src=      &quot;http://farm3.static.flickr.com/2430/4074919483_250c28e51f_m.jpg&quot;      width=&quot;240&quot; height=&quot;180&quot; alt=&quot;P1060894&quot; /&gt;&lt;/a&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;1 + 1 = 1 0&lt;/td&gt;      &lt;td&gt;1 + 0 = 0 1&lt;/td&gt;      &lt;td&gt;0 + 1 = 0 1&lt;/td&gt;      &lt;td&gt;0 + 0 = 0 0&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-6822916334482971025?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/11/wooden-half-adder.html</link><guid>40258883614524e73df2fbf54c287113</guid></item>
<item><title type="text">Recent Tamarin and ABC tools</title><description type="html">Tamarin-central, the stable source tree of open source VM used byAdobe Flash, &lt;ahref=&quot;https://mail.mozilla.org/pipermail/tamarin-devel/2009-December/001335.html&quot;&gt;wasupdated last December&lt;/a&gt; (Dec 22 2009) after relatively longblank. The newer tree has faster VM and includes updated ABCassembler and disassembler. Especially those ABC utilities are quiteuseful to a binary hacker of AVM2.&lt;h4&gt;Download latest Flex SDK&lt;/h4&gt;I found that neither Flex SDK 3.5 nor 4.0 stable build can compileabcdump. You need to download later version from the &lt;ahref=&quot;http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4&quot;&gt;DownloadFlex site&lt;/a&gt;. Flex 4-Beta 2 (4.0.0.10485) works well. I would set theFlex directory to environment variable FLEX.&lt;pre&gt;$ export FLEX=~/Downloads/flex_sdk_4.0.0.10485_mpl&lt;/pre&gt;&lt;h4&gt;Download and build Tamarin-central&lt;/h4&gt;Building procedure is well documented in &lt;ahref=&quot;https://developer.mozilla.org/En/Tamarin_Build_Documentation&quot;&gt;Tamarin_Build_Documentation&lt;/a&gt;. Onlymy additional suggestion is to add --enable-debugger, it makes errormessages easy to read, it helps you, really.&lt;pre&gt;$ hg clone http://hg.mozilla.org/tamarin-central/$ cd tamarin-central$ mkdir objdir-release$ cd objdir-release$ python ../configure.py --enable-shell --enable-debugger$ make$ ./shell/avmshell -Dversionshell 1.5 release-debugger build cyclonefeatures AVMSYSTEM_32BIT; ...&lt;/pre&gt;&lt;h4&gt;Build abcdump&lt;/h4&gt;There are various useful utilities in utils/ directory. Some utilizesare written in ActionScript, so you need to compile them touse. Abcdump, ABC disassembler, is one of such utilities.&lt;pre&gt;$ cd ..$ java -jar $FLEX/lib/asc.jar -import core/builtin.abc -import shell/shell_toplevel.abc utils/abcdump.as&lt;/pre&gt;core/builtin.abc and shell/shell_toplevel.abc are basic librariesprovided by tamarin, you can use them to try to see how abcdumpworks. Note that you need to separate abc file names with --,otherwise arguments are processed by avmshell instead of abcdump.&lt;pre&gt;$ ./objdir-release/shell/avmshell ./utils/abcdump.abc -- core/builtin.abc // magic 2e0010// Cpool numbers size 158 0 %...&lt;/pre&gt;I recommend you to make a tiny shell script to ease such a complicated command line.&lt;pre&gt;#!/bin/sh~/tmp/tamarin-central/objdir-release/shell/avmshell ~/tmp/tamarin-central/utils/abcdump.abc -- $@&lt;/pre&gt;&lt;h4&gt;How to use abcasm&lt;/h4&gt;Abcasm is a ABC assembler. It is written in java and shell script, soyou don't need to compile to try it. utils/abcasm/test/ directoryincludes various interesting sample programs. You can test them easilyand quickly.&lt;pre&gt;$ cd utils/abcasm/$ ./abcasm.sh test/hello.abstest/hello.abs$ ../../objdir-release/shell/avmshell test/hello.abcHello, world&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-6052616551672264160?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2010/01/recent-tamarin-and-abc-tools.html</link><guid>418e989d64c65c0f12f6a9759e73eac8</guid></item>
<item><title type="text">Deep play</title><description type="html">Over thirty years ago, anthropologist Clifford Geertz posted a proto-blog on &quot;deep play.&quot; Today, &quot;Deep Play: Notes on a Balinese Cockfight&quot; could stand as the manifesto for www.seriousgames.org. It's certainly an inspiration for this blog.&lt;br /&gt;&lt;br /&gt;So, what's deep play? For Geertz it was what happened when groups of people got really engrossed in the same dynamic activity. Relating to one another in terms of that activity flow, they got the chance to see what their culture was all about and comment on the underlying rules that controlled their lives.&lt;br /&gt;&lt;br /&gt;Of course, Geertz came up with this notion while watching a cockfight. Like today's batch of videogame researchers, Geertz recognized in an &quot;edge&quot; activity the makings of an ideal learning situation.&lt;br /&gt;&lt;br /&gt;A little background. Cockfighting was illegal in Bali, but it happened anyway. It was an ad hoc sort of event -- popping up on side streets and plazas, then shutting down and picking up again down the road. A fight would start up and a flashmob of gamblers would swarm around it. Geertz called it a &quot;FOCUSED GATHERING.&quot;&lt;br /&gt;&lt;br /&gt;So the sight of &quot;one chicken mindlessly hacking another one to bits&quot; was a kind of &quot;strange attractor&quot; that drew all these people to it. But Geertz thought the cockfight was more than a bloody entertainment. &lt;br /&gt;&lt;br /&gt; The Balinese cockfight was &quot;a SIMULATION of the entire social matrix . . . in which its devotees lived.&quot; The Bali caste system had rigid rules -- it was one very serious game. As a complex system, social caste affected every aspect of their everyday social relations and was too complicated to see in its entirety. &lt;br /&gt;&lt;br /&gt; Geertz thought of the brutal cockfight as a way for the Balinese to LEARN what their culture looked like &quot;when it was SPELLED OUT IN A COLLECTIVE TEXT.&quot; Here was the entire Balinese pecking order &quot;raised to a level ... where it could be more exactly perceived.&quot;&lt;br /&gt;&lt;br /&gt;Simulation as learning tool. For the Balinese, this cockfight-as-simulation was more than a chance to stand back and see the rules that controlled their collective lives. It was a chance for participants to REFLECT and COMMENT on the underlying rules of the game. &lt;br /&gt;&lt;br /&gt;So what does this mean for education today? &lt;br /&gt;&lt;br /&gt; Cockfights, like videogames, are an object lesson for academic -- as J.C. Herz points out in her terrific essay &quot;Gaming the System.&quot; But not because universities need to get into the business of staging cockfights or making games. &lt;br /&gt;&lt;br /&gt; What these forms of DEEP PLAY illustrate is what Herz calls &quot;the learning potential of a network, and the social ecology that unlocks that potential.&quot;&lt;br /&gt;&lt;br /&gt;But universities won't be able to harness that potential until they have easy, cost-effective tools for building online educational worlds that scale.&lt;br /&gt;&lt;br /&gt;We need to use our network technologies to support the emergence of AD HOC collaboration communities where groups of learners can see and interact with one another, becoming engrossed in a common flow of activities, and having the tools ready-at-hand to reflect on what they're doing -- collaborative CRITICAL THINKING -- e.g. the basis of an effective liberal arts education.&lt;br /&gt;&lt;br /&gt;My role in the Croquet Higher Education Collaborative is to take on an immediate challenge - bringing together as many researchers as possible to design breakthrough applications that show the value of Croquet in the educational domain. &lt;br /&gt;&lt;br /&gt; This blog will talk about what it takes to build a multi-institutional open-source collaborative from the ground up.&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8747177-109794811105128049?l=croquet4education.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquet4education.blogspot.com/2004/10/deep-play.html</link><guid>1ef57afb2fd2aef52cc84b8c07282405</guid></item>
<item><title type="text">Pointer Enter &amp; Poiner Leave</title><description type="html">More event passways.  The last entry discribed how a pointerDown event makes it to a componant that the mouse is over. This path is the same for pointerUp and pointerMove, but pointerEnter &amp; pointerLeave have their own thing going on.&lt;br /&gt;&lt;br /&gt;Those events are generated in TRay &gt;&gt; resetSelected, which is called for the activeCamera's pointer in TUserCamera preRender. Remeber that any TRay in a scene will select an object that it is pointing at in the render loop. resetSelected examins the ray's current selectedObject and it's lastSelection object to generated appropriate calls to pointerEnter, pointerLeave &amp; oh yeah, pointerOver (which is called continuously on the selected object for as long as the TRay points at it).&lt;br /&gt;&lt;br /&gt;Notes: &lt;br /&gt;1) The TRay only generates the pointerX events if it's doSelect is true, so the camera's downRay does not trigger events.&lt;br /&gt;2) The TRay is handed to the componant with the event, so you could have an object that responds differently to being selected by different pointers.&lt;br /&gt;3) I wondered why these events were render based &amp; not based on mouse event until Orion reminded me that objects in the scene can move themselves in front of the pointer.  The render bases select can succesfully select those moving obejcts.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-110573966086404159?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/01/pointer-enter-poiner-leave.html</link><guid>ee636a7a84dfca7c93809f188f7f7a9b</guid></item>
<item><title type="text">Picking in overlays now working.</title><description type="html">David Smith just made my life my easier by modifying TSpace &amp; TUserCamera so picking in an overlay just falls out naturally from building an overlay with a TUserCamera.  It's a little frustration that David can solve a problem that has been plaguing me for weeks with a couple of deep tweeks...and now pretty much any mistake with an overlay results in the image freezing...but such is life on the cutting edge.&lt;br /&gt;&lt;br /&gt;Having a working top-down overlay in the corner of the screen makes me want to be able to toggle the two views: have the top-down view be the dominant image and the front facing view be in the corner. This could get confusing - there is one TUserCamera that managers the other TUserCameras as overlays. It seems like TUserCamera was originally a kind of catch all for all the things they didn't want to put into the TeapotMorph &amp; I bet it was intented to be a singleton. The main TUserCamera (activeCamera of the TeapotMorph) is resistant to tampering, but what about creating an additional overlay with the front view in it?&lt;br /&gt;&lt;br /&gt;Yay, that works.  I wonder if David would consider killing the main Camera render and just render it as an overlay.  very flexable.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-110635498446067103?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/01/picking-in-overlays-now-working.html</link><guid>b956d089200e8b1f8e26913632149535</guid></item>
<item><title type="text">Tweak values &amp; players</title><description type="html">Ok, I think I am getting a hang of the tweak way of thinking.&lt;br /&gt;Lets say I have a CColorPicker &amp; I want to use it in a dialog &amp;amp; do something with it. There are a couple of ways of doing this.&lt;br /&gt;The color selected by the user updates the colorPicker's value.  So I can:&lt;br /&gt;&lt;ol&gt; &lt;li&gt;In the dialog's initialize, call &lt;span style=&quot;font-weight: bold;&quot;&gt;self startScript: #doSomething when: { colorPicker. #valueChanged}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;in the doSomething method (which should prob be called onColorChanged), put &lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;on: valuechanged=&quot;&quot; in=&quot;&quot; colorpicker=&quot;&quot;&gt;. &lt;/on:&gt;&lt;/span&gt;I think that just tells tweak to magically add the line above to the init for me.&lt;/li&gt;&lt;li&gt;I can call &lt;span style=&quot;font-weight: bold;&quot;&gt;colorPicker player: ( self fieldNamed: #someField ) &lt;/span&gt;which puts a CFieldReference into the colorPicker as it's value. So the field in the dialog is updated in sync with the colorPicker's value. This has something to do with Tweak's virtual field mechanism, which I don't fully understand, but it seems very cool.&lt;br /&gt;&lt;/li&gt; &lt;/ol&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111480137306159552?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/04/tweak-values-players.html</link><guid>d73d274b0765beaa97d4ed79b20302ff</guid></item>
<item><title type="text">Tweak gotcha..</title><description type="html">This one took hour or two to down. I wonder if I am abusing an idiom.&lt;br /&gt;&lt;br /&gt; I wanted to create a dialog with custom behaviors so I did the following.&lt;br /&gt;&lt;br /&gt; d := CFileSaveDialog new.&lt;br /&gt; d costume: CCFileSaveDialogCostumeCITRIS new.&lt;br /&gt; d openLabel: 'Test Custom Dialog'.&lt;br /&gt;&lt;br /&gt; then in CCFileSaveDialogCostumeCITRIS&gt;&gt;initialize I added changed around parameters:&lt;br /&gt;&lt;br /&gt;directoryList costume: CTreeWidgetCostumeCitris new. &quot;works&quot;&lt;br /&gt;player sorter primarySort: #compareType:with:.  &quot;does NOT work&quot;&lt;br /&gt;&lt;br /&gt;The problem is the timing.  initialize gets called at the end of the new, and before the costume: call, so player in initialize has not been set to d.  Instead CPlayer has silently stuck in a default CFileDialog that gets modified and then immediately discarded.&lt;br /&gt;&lt;br /&gt;If I move the player modifying line into onPlayerChanged, it is all good.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111533624264455692?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/05/tweak-gotcha.html</link><guid>f286007514fed4dabcd175500c4ce1f7</guid></item>
<item><title type="text">CITRIS Digital Gallery Builder Summary</title><description type="html">The CITRIS Digital Gallery Builder is a collaborative virtual gallery system for the humanities.&lt;br /&gt;The main idea is that it allows users to easily build 3-dimensional virtual galleries which contain various types of media, and which can then be viewed and modified collaboratively by multiple people at once over the internet. This allows both for the creation of group curated spaces and for the viewers to actively engage the source material.&lt;br /&gt;&lt;br /&gt;&quot;Digital Galleries&quot; are fairly simple structures emulating real-life exhibitions and collections. Visitors find themselves in a virtual space composed of various rooms, with 2-dimensional and 3-dimensional artifacts presented in the space. The user is represented by an avatar which they can navigate through the 3D space.&lt;br /&gt;&lt;br /&gt;The CITRIS software is built on top of the Croquet system, which allows for group collaboration and interaction within the space. That is, several people may have avatars present in the space at one time, can interact with each other, and further can interact with the gallery itself. Examples of interaction include discussion, annotation of artifacts, adding hyperlinks to artifacts, as well as introducing new items into the gallery and modifying the layout of the gallery and contents.&lt;br /&gt;&lt;br /&gt;Currently supported media types are:&lt;br /&gt;Images     (JPG, PNG, BMP)&lt;br /&gt;Video      (MPG)&lt;br /&gt;Audio      (MP3)&lt;br /&gt;3D Objects (ASE)&lt;br /&gt;&lt;br /&gt;Support for additional media types, especially 3D file formats, is planned. &lt;br /&gt;&lt;br /&gt;While the alpha version is not yet publicly available for download, CITRIS is looking&lt;br /&gt;for interested users who may want to provide feedback on the initial prototype.&lt;br /&gt;&lt;br /&gt;Documentation and screenshots are at &lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery&quot;&gt;http://www.citris-uc.org/hosted/projects/ith/gallery&lt;/a&gt;,&lt;br /&gt;and links to the user group, Croquet, etc are at &lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery/#Feedback&quot;&gt;http://www.citris-uc.org/hosted/projects/ith/gallery/#Feedback&lt;/a&gt;. &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-110737853278463472?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/02/citris-digital-gallery-builder-summary.html</link><guid>454d40d093dafda3dea1805daed83ddf</guid></item>
<item><title type="text">Merging headaches</title><description type="html">Looks like I was asking the wrong question last week when I asked about running Jasmine under the 3.7 VM.  As everyone said, that is no problem, the Jasmine image runs just fine with the 3.7 VM.  But Scott's code relies on infrastructure in the 3.7 &lt;b&gt;image&lt;/b&gt;, not the VM.  Infrastructure which does not exist in the Jasmine image.  Oops.  So, I spent today alternating between:&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Failing to get Scott's code running in the Jasmine image.  I was able to chop out most of the references to horizontal scrollbars, but ran into an unknown message that I cannot track down. &lt;br /&gt;&lt;li&gt;Failing to get Jasmine to run in Scott's 3.7 image.  I thought doing a file out on all the Croquet catagories might work, but the Croquet image has changed some of the basic Squeak syntax rules to allow calls like gl glVertex(0.0, 0.0, 0.0), and I don't know how to get those changes into the 3.7 image.  So I just get lots and lots of syntax errors.&lt;br /&gt;&lt;li&gt;Being really really surprised when I did the following: file-in one of Scott's .cs files, immediately file-out it, then close Squeak w/out saving, reopen Squeak, file-in my new .cs file and presto - a stream of errors.  I don't know if this is a bug in Squeak, something really weird with Scott's change set, or, more likely, my mental model of how change sets work is completely wrong.&lt;br /&gt;&lt;/ol&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-109840808919481475?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/10/merging-headaches.html</link><guid>318852bb4dd8968dec1cda25b48e4eea</guid></item>
<item><title type="text">More TPointer</title><description type="html">More important things about TPointers.&lt;br /&gt;&lt;br /&gt;* They operate automatically (as do all TRays). Put one in the scene graph and it picks every render cycle.&lt;br /&gt;&lt;br /&gt;* Once TPointer has selected an object, it will not test any other items unless they are closer that the currently selected object.&lt;br /&gt;&lt;br /&gt;* There is something special about the TPointer attached to the TAvatar that allows it to actually interact with objects in the scene.  This has to do with replicated vs non-replicated picking....need to know more about this.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-110272730376226021?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/12/more-tpointer.html</link><guid>be46ae7c61698e9f3ea21c361778285f</guid></item>
<item><title type="text">Onward</title><description type="html">I managed to force Scott's Gallery Builder into the Jasmine image.  It's a little bit crippled by my pattented &quot;hack off any code that generates an error&quot; approach, but it is still functional. Yay! Now to get it talking to Croquet.  I had this working back in August, with Solar, so it should go pretty quick...but not probably not quick enough for our Citris Corporate Sponsors Day presentation on Tuesday.  Ah well, one last chance to show off the cute Citris Alien from the Torque engine. &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-109849062541713051?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/10/onward.html</link><guid>c41432d27fdd2042afb48345dad9ba32</guid></item>
<item><title type="text">Blogs</title><description type="html">My last post mentioned Takashi Yamamiya's blog &lt;a href=&quot;http://propella.blogspot.com/&quot;&gt;Squeak Everyday&lt;/a&gt;, which served as the final bit of motivation to get me to start blogging my Croquet experiences (which I wish I had been doing over the summer - I think if I had been expressing my problems a bit more publicly we would have resolved the communication issues much faster).  Anyway, more important than inspiring me, Takashi's blog also inspired David Smith, Croquet's project lead, to start his blog &lt;a href=&quot;http://croqueteer.blogspot.com/&quot;&gt;Croqueteer&lt;/a&gt;.  I think this is great way to communicate. It helps build up a sense of community, and I know that it is a real comfort to those of us building projects on top of Croquet, to have an idea of what the dev team is thinking about.&lt;br /&gt;&lt;br /&gt;I found out about David's Blog on the page of Croquet links Julian Lombardi (U of Wisc) is putting together &lt;a href=&quot;http://opencroquet.org/links.html&quot;&gt;here&lt;/a&gt;.  I have asked him to put a link to this blog up there too...which makes me nervous, but I figure if I expose my ignorance to the world I will learn the truth faster.&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-109772969274023167?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/10/blogs.html</link><guid>90bab548c4e204621b0905a3bdbd5ea2</guid></item>
<item><title type="text">We're going for it</title><description type="html">Not yet fully blessed by the powers-that-be, but it looks like we are going to push ahead with using Croquet as the technology behind our IT &amp; Humanities project.  It's been a tough choice (and one I know I still might live to regret), but Croquet wins out by: being open sources; having a vision that is closely aligned with ours; and seeming to be on the road to developing a vibrant user community. Fingers crossed.&lt;br /&gt;&lt;br /&gt;First step is to get Orion up to speed on Squeak. The cursing you hear in the background is him learing the new keyboard combinations. Not that I am much farther along the learing curve than he is.  Scott spent the summer teaching me to become one with Squeak, but my instincts are still java/perl/c++ based.  Right now I am tweaking Scott's UI on the Gallery Builder to suit my more Window's flavored preferences.&lt;br /&gt;&lt;br /&gt;The goal is to replace Torque in our demo by the end of the month, in time for our next meeting with the Stanford Humanity Labs folk.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Interesting things to try:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;File-out'ing the Jasmine code and running it in the 3.7 image, with the Gallery Builder.&lt;br /&gt;&lt;li&gt;Putting the Gallery Builder into a project and openning it inside of Jasmine.  This will be amazingly cool if it works.&lt;br /&gt;&lt;li&gt; Writing some SUnit tests.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Community Developements&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://jlombardi.blogspot.com/&quot;&gt;Julian has a blog&lt;/a&gt;.  Yay!&lt;br /&gt;&lt;li&gt;The Squeak guys at Georgia Tech have set up a &lt;a href=&quot;http://minnow.cc.gatech.edu/croquet&quot;&gt;Croquet wiki&lt;/a&gt;. I suspect this will become the defacto offical one.&lt;/ol&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-109820916219295056?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/10/were-going-for-it.html</link><guid>df173e367c23849be9045941f3b85e0e</guid></item>
<item><title type="text">TPointer &amp; Event Processing...</title><description type="html">I have been learning about the Croquet event processing loop, in my attempt to get a pickable overhead view. &lt;br /&gt;&lt;br /&gt;1) It all starts with Squeak and Morphic. The TeapotMorph is just another morph as far as Squeak is concerned. By default it registers itself for the full compliment of mouse  and keyboard events. &lt;br /&gt;&lt;br /&gt;2) I haven't fully groked Squeaks focus handling.  Sometimes it uses mouse-over, sometimes it is click-to-focus. Unfortunately, click-to-focus does not seem to work on the TeaportMorph and keystrokes continue to go to the last selected morph. You can force it by putting this in a mouse event:&lt;br /&gt;ActiveHand keyboardFocus: teaportMorph.&lt;br /&gt;&lt;br /&gt;3) The TeapotMorph's default behavior is to route all it's events to it's activeCamera, which is a TUserCamera. The interesting call for me is camera &gt;&gt; pointerXY: evt position.  This takes the viewpoint coordinates of the mouse and updates the TPointer that is attached to the userCamera.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-110270672659525648?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/12/tpointer-event-processing.html</link><guid>6fa33f283ac1de468d92adb739b1c8ac</guid></item>
<item><title type="text">Tweak - good first impressions</title><description type="html">I have been converting our morphic popup menu's over to Tweak.  Our needs have all been simple so far, so not a deep test, but so far so good.  The code has been pretty clean and does what I would expect it to do.  And I have been enjoying the &quot;do something wrong, get an error message, fix it and keep going&quot; experience that I have been told is the really excitement about squeak, but has never really worked for me in Croquet, where it has been more like &quot;do something wrong, restart the image, search the recent changes log to recover your code, make a small change &amp; repeat&quot;. But I am now seeing the fun.&lt;br /&gt;&lt;br /&gt;We are working with Tweak 1.0, in the Jasmine image, which, I think,  puts us two versions behind. The mailing list says they are now working on 1.2 for Squeak 3.8.  Hopefully we will see grand unification sometime this summer, with a 3.8 version of Croquet bringing us into the Tweak mainstream.&lt;br /&gt;&lt;br /&gt;Other big news around the office here is that I set up the Mantis bug tracker on our server for the digital gallery project.  It's much easier to use that the wiki arrangement we were using before.  And best of all, it makes Orion happy.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111454005488446044?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/04/tweak-good-first-impressions.html</link><guid>6db82c2e6cb367b268b2d7ae1ff8ceff</guid></item>
<item><title type="text">Unsafe at any speed?</title><description type="html">Things have been puttering along at CITRIS world headquarters, as our Croquet-only gallery builder demo nears completion, things continue up and down.  Up, because crafting using interactions &amp; UI elements is so much easier in Croquet that it was in Torque; Down, because Croquet remains amazingly unstable. Not a day of development goes by without a couple of VM crashes or image freezes, and some days get well into the double digits, especially with my recent venture into Video. The really frustrating bit is that most of the VM crashes seem to be either unreproducible, or reproducible only in one particular saved image.&lt;br /&gt;My current hunch is that our system is particularly vunerable because it is a hybrid of 2D Morphic and 3D Croquet &amp; that this combinantion has not been tested much.  So our current plan is to phase out the Morphic code as soon as we can &amp; keep our fingers crossed.   &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-110183865321148178?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/11/unsafe-at-any-speed.html</link><guid>944d25c6205be01a9bb84fbf8e48a6cb</guid></item>
<item><title type="text">TMPEGDisplay</title><description type="html">We now have a working simple MPEG movie player in our Croquet Gallery. It would have been very easy to just embed one of the the two morphic players in a TMorphMonitor, but we have decided to go 100% Moph-free wheneven possible. The winning stratagy was to have the player be a subclass of TRectangle with a texture, and the MPEGFile object's videoReadFrameInto on that texture's form.&lt;br /&gt;&lt;br /&gt;Interesting/Weird Stuff:&lt;br /&gt;1) The default TMaterial causes my player to be completely invisible.  Setting the material's ambiant alpha to 1.0 is a must.&lt;br /&gt;&lt;br /&gt;2) The MPEGDisplayMorph has code that looks like it is sync'ing the video with the soundtrack, but it is not. It's just making an estimate based on when the soundtrack started playing &amp; how much time has passed, which is why it does not handle pause. I keep my own starttime &amp; reset it on pause.&lt;br /&gt;&lt;br /&gt;3) Squeaks mpeg player seems to choke on some of our mpegs.  Chopping them up into smaller segments makes it happier.  But chopping involved re-encoding, so who knows.&lt;br /&gt;&lt;br /&gt;4) I experimented with rendering the video on render vs step.  Putting it in render does get more video frames on the screen (on my computer I average every 3rd frame in step and every 2nd frame in render), but the video is very jittery when done in render, which surprises me.  Why would one render cycle take a different amount of time than the next?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-110244551271148315?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/12/tmpegdisplay.html</link><guid>226154691c2cc10e487b11f2ad83dca7</guid></item>
<item><title type="text">Squeak Change Sets</title><description type="html">Scott has explaned to me why his change set could not be filed-out and then filed back in.  Turns out there are timing issues with his change set &amp; he had to hand edit his .cs file before it could be filed-in. I guess B1llG must be right about my naivette, because I find this new bit of information horrifying.&lt;br /&gt;&lt;br /&gt;Scott also gave me an overview of the steps that would be needed to get Jasmine working in the 3.7 image, and it is pretty hairy, and not even possible unless I get currently unpublished bits from the Croquet dev team.  So it looks like I need to continue hacking pieces out of the Gallery Builder until it will work under 3.6. Scott gave me another clue there too: the 3.7 image automatically calls initialize on objects when they are new'd...which Morphs do in 3.6, but non-Morphs do not.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-109847832133014437?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/10/squeak-change-sets.html</link><guid>ce87d701abedd2ce1991f618b886b9fe</guid></item>
<item><title type="text">Portals Good, Crashing Bad</title><description type="html">The portal generation all turned out to be very easy to work with. I ended up sticking with morphic for UI.  Couple of fun brain twisters once we go collaborative.  Got to remember that my currentSpace might not be that same as yours.  Any meta'ed calls that effect the currentSpace need to have that space handed into them.&lt;br /&gt;&lt;br /&gt;On the downside, Croquet continues to be massively unreliable.  We had a public demo today &amp; that damn VM crash is like a plague.  We narrowed down our features to only the most reliable &amp; it still crashed twice durning the demo.  And we had to abort showing even the basic collabortation at the last minute.  It all worked fine friday, but this morning, with the exact same set up, no go.  One image or the other froze up on connection every time. Ugh.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111265260402416304?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/04/portals-good-crashing-bad.html</link><guid>c459fc995fb112bc3214ef2ced2d568d</guid></item>
<item><title type="text">Day2</title><description type="html">Well, my day two impressions are mixed.  Jasmine has lots &amp; lots of bugs.  Seems like I cannot go for more than minute without doing something that pops up one of those cute debug dialogs. But, they are doing an amazing job of responding to bug reports and fixing things (&quot;They&quot; being David Smith, Andreas Raab &amp; Mark McCahill).  They fixed one of my bug reports within 12 hours.  This is exactly why it was so important to me (and them too, I am sure), that they get out a public release. A small group just keeps repeating the same tests.&lt;br /&gt;&lt;br /&gt;They could use some automated tests to help avoid regression thou.  Takashi Yamamiya mentions in his &lt;a href=&quot;http://propella.blogspot.com/2004/09/croquet-unit-test.html&quot;&gt;blog entry&lt;/a&gt; that he got a Croquet Unit Test runner working with TeaTime (which then changed breaking his code) and that he has started porting all his work over to Jasmine.  Very exciting.  &lt;br /&gt;&lt;br /&gt;I am told that Takashi (a core squeak developer) is working on a Croquet game project, Chain Reaction, with Yoshiki Ohshima (ditto re: squeak, out of U of Kyoto) &amp; 3DSolve (a North Carolina simulation and learning software company).  I should find out more about this project.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-109772812862745972?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2004/10/day2.html</link><guid>b2e20e015f73a557f3b0ff80e7f3804c</guid></item>
<item><title type="text">Creating Portals to new galleries &amp; Croquet UI</title><description type="html">Ok, I am back working on the gallery builder (after an extended detour back to the java web apps I was working on last year).&lt;br /&gt;First feature on the todo list is adding an interface to create portals to link gallery with different themes.  The immediate question is what kind of GUI tools to use.  There is morphic (the current squeak toolkit, which is nice, but we've been warned that it will be unsupported has Croquet moves forward), tweak (maybe the next generation, still in active development with little docs or examples), or building something out of TObjects. Also there is David Smith's intriguing declaration of a completely new UI &amp; huge changeset coming down the pike.  Prob the best bet is to use Morphic until I can't &amp; see what has baked up by then.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111170214468850282?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/03/creating-portals-to-new-galleries.html</link><guid>7118204d81c5afd00ef4393114a9674a</guid></item>
<item><title type="text">Tweak to the rescue?</title><description type="html">Our basic problem is that our target user base is people who are not excited about computers. So we need an interface that is not just usable, but is actively seductive. And Morphic is not it. So what about Tweak?&lt;br /&gt;Andreas says he thinks they are close to being stable enough for &quot;outside consumption&quot;. And pointed me at their &lt;a href=&quot;http://tweak.impara.de/&quot;&gt;brand new documentation project.&lt;/a&gt; Honestly, I am probably getting to old to be a programmer, as the thought of a bleeding edge UI toolkit just fills me with dread. But, DAS says it is the future, so effort put into trying to get nice Morphic behaviors would just be wasted. And I just had a good talk with Howard Stearns (in Julian's group at U of Wisc) about their interface work. (Note to self: keep up with his &lt;a href=&quot;http://www.wetmachine.com/index.php?query=Inventing+the+Future&amp;blogid=1&quot;&gt;blog.&lt;/a&gt; Too bad I can't get a clean RSS stream for it). Seems they have been having pretty good luck getting tweak to do what they want, although only by attaching it to the Morph. They haven't gotten it into the world yet. Fortunately, that is all we need.&lt;br /&gt;Unfortunately, Andreas does not have Windows look &amp;amp; feel on the todo list. So if we want if, we'll have to do it ourselves...At least for the moment.&lt;br /&gt;Well, enough gathering external information, nothing for it but to jump into the whirring blades of death &amp; see what I find.&lt;br /&gt;&lt;br /&gt;Update: the tweak tutorial does not work with the version in Croquet.  Drat.&lt;br /&gt;&lt;a href=&quot;http://www.wetmachine.com/index.php?query=Inventing+the+Future&amp;amp;blogid=1&quot;&gt; &lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111361104869194424?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/04/tweak-to-rescue.html</link><guid>4e3eef3b140e152bf4bbe7f7ba62efec</guid></item>
<item><title type="text">Citris Gallery Builder in the News</title><description type="html">http://www.uchri.org/newsletter/HASTAC/Issue1/VirtualMuseum.html&lt;br /&gt;&lt;br /&gt;(If only they were not using a screen shot from the obsolete Torque based version)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111393872914948602?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/04/citris-gallery-builder-in-news.html</link><guid>25a39577a2592675474417d9ecaa88db</guid></item>
<item><title type="text">We're got competition!</title><description type="html">http://www.arco-web.org/TextVersion/Description/Description1.html&lt;br /&gt;&lt;br /&gt;ARCO - Augmented Representation of Cultural Objects.  &lt;br /&gt;&quot;ARCO is a research project, funded by the European Union, aimed at developing technology for museums to create 3D Virtual Exhibitions on the Web.&quot;&lt;br /&gt;&lt;br /&gt;Lot's of documents, especially on XML based object representations.&lt;br /&gt;Nothing since 2003. Probably another dead project.&lt;br /&gt;&lt;br /&gt;Links to a spin-off http://www.arco-web.org/vmesite/index.htm&lt;br /&gt;VME - Virtual Museums Exhibition; put that site barely exists.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111298182753536340?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/04/were-got-competition.html</link><guid>86ef97152516aa8f7adc900383d7e0aa</guid></item>
<item><title type="text">Meeting with Croqueteer</title><description type="html">Orion &amp; I had a great meeting with David A Smith this afternoon. Croquet always seems so much more real when David is in the room.&lt;br /&gt;&lt;br /&gt;Big Stuff Coming&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;David Reed has extracted TeaTime from Croquet core. He will continue to work on TeaTime and David Smith will be responsible for integrating it in to Croquet as a discrete module. Supposedly TeaTime is working inside it's test environment. I cannot wait for this! It is so painful learning about meta &amp;amp; all its subtleties knowing that it is soon to be replaced.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;New Interface approach. DAS is moving all the nutty pointer &amp; event code out of the camera &amp;amp; render loop and putting it into special interface portals, called Filters. This could make the UI work much simpler. He gave us his prototype to poke around in. Very exciting. Especially nice is the idea that the filters can be in the world, or attached to your screen. There is something really sexy about UI's &amp; custom views that you can tear off and drop into the world. And David demo'd ghosts, objects that appear to be in the world but really belong to the filter &amp;amp; can only be seen through it. Could be great for annotations.&lt;/li&gt;   &lt;li&gt;Tweak - don't know that much more about tweek than before David came, but it is definitely going to replace Morphic as Croquet's 2D UI &amp; scripting language. We are not so interested in scripting, but we desperately need a 2D UI toolkit that can impersonate windows. Our target users don't want a double click to be exactly what they expect it to be, or they are prepared to walk away. Unfortunately Tweak is not stable yet &amp;amp; David cannot recommend us jumping on it yet. Much pain here. He recommend talking to Andreas about Tweak in general (good luck to us) and Julian &amp; Marc b/c they also have users who need to not be surprised. David thinks a Window's mimicking toolkit is fine, as long as he doesn't have to use it (which is to say, Croquet must be flexable enough to work with other toolkits). This is going to continue to cause us trouble, I think. A clean UI toolkit is an entire project in itself.  I wonder if this is something we could through a couple of undergraduates at?&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Farther out &amp; very interesting is moving Croquet to a JIT backend. Squeak becomes just one of the platforms that Croquet speaks, including C &amp;amp; Python and maybe more. Huge potential speed increases, which we would love, especially loading big/complex 3D objects.&lt;/li&gt;   &lt;li&gt;Nearer term - Croquet will move to Squeak 3.8 (or just possibly 3.7). So it looks like David is going to wrap #1, #2 &amp; #5 up into a new release - Croquet 0.2? Ah but when, that is the question!&lt;/li&gt; &lt;/ol&gt; Smaller stuff&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;Probably the best thing we found out in the conversation is that DAS is using feedback from us to help guide Croquet's evolution.  Sometimes we feel like we are shouting into the void here.  It is very good for morale to know that the void is listening.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Avatar switching - it has worked at some point. FOLLOW UP&lt;/li&gt;    &lt;li&gt;WorldBase &amp; file streaming - he has no idea where this is, but thinks we could probably weld on the file streaming without too much trouble if we need it sooner that the whole WorldBase package.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;High Res Object - we are having trouble with 10K vertex objects. DAS said to up the depth of the bounding spheres &amp;amp; check out the buffer limit in openGL.&lt;/li&gt;   &lt;li&gt;Level of Detail on high-res meshes - DAS has great C++ code to do this, based on paper by Hughes &amp; Hoppe - and would be just tickled if we wanted to take it on.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Lot's o' Text - ditto for dynamic texture management. Maybe once the JIT is in place, he will just be able to use all his old C code?&lt;/li&gt; &lt;/ol&gt; Lots of info for a short meeting. The really fun thing with DAS - Orion &amp;amp; I are constantly saying to each other &quot;why in the world does it do that?&quot; and then just shrugging. David knows.&lt;br /&gt;&lt;br /&gt;Also, David will not be at the May 18th Croquet Consortium, but thinks we should be, if only to get to know the other players.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111352920899076288?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/04/meeting-with-croqueteer_14.html</link><guid>9f04cfecbc07494990dfe845bd434fe9</guid></item>
<item><title type="text">A group exhibition &quot;First Passage&quot;</title><description type="html">I'm going to Osaka in the chiristmas season to join the exhibition. This is a kind of &quot;college reunion show&quot; and all of artists were students of Prof. Hitoshi Nomura. I'm very excited to see old friends of the sculpture course. Now I'm quite busy to build a new version of wooden half adder. This is my first exhibition since 1999 anyway. Time is running so fast.&lt;h4&gt;&lt;a href=&quot;http://www.artcourtgallery.com/e/ex/upcoming.html&quot;&gt;First Passage&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;ARTCOURT Gallery &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=ARTCOURT+Gallery+Tenmabashi+1-8-5,+Kita-ku,+Osaka+530-0042+Japan&amp;sll=34.702054,135.518975&amp;sspn=0.011131,0.013926&amp;ie=UTF8&amp;hq=ARTCOURT+Gallery+Tenmabashi+1-8-5,&amp;hnear=530-0042&amp;ll=34.702054,135.518825&amp;spn=0.011131,0.013926&amp;z=16&quot;&gt;Tenmabashi 1-8-5, Kita-ku, Osaka 530-0042 Japan&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Hitoshi Nomura, Koji Nishimatsu, Kawai+Okamura, Osamu Kokufu, Tamaki Nagatani, Takashi Yamamiya, Yui Ishiyama, Kohei Nawa, Yasutaka Yamada, Yoshihiko Maeda, Ichiro Okada, Takao Machiba, Kenta Ogaya, Takayuki Okamoto, SHINCHIKA, Yasuyoshi Uchiyama and Taro Okumura&lt;/p&gt;&lt;ul&gt;&lt;li&gt;December 15 - 26, 2009&lt;/li&gt;&lt;li&gt;Gallery Hours: 11:00 - 19:00 ( - 17:00 on Saturdays) Closed on Sundays&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Event : Artists Talk Show&lt;/li&gt;&lt;li&gt;Saturday, Dec.19, 14:00 - 15:30 (*15:30 - 17:00 Reception)&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-5428591035715298171?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/11/group-exhibition-first-passage.html</link><guid>dd7eb4cfbd300a7ad5c1446e256fddca</guid></item>
<item><title type="text">Wooden Half Adder Video</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/WOdN-d-JogQ&amp;hl=en_US&amp;fs=1&amp;&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/WOdN-d-JogQ&amp;hl=en_US&amp;fs=1&amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;*UPDATED* New half adder video is released!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-5719112857369803856?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/12/wooden-half-adder-video.html</link><guid>ead4638d9379a93d2d7d5c283fc4f0a0</guid></item>
<item><title type="text">Virtus Walkthrough</title><description type="html">I just posted the video I made of Virtus Walkthrough. I created this in 1990 with David Easter and Mark Uland. I am actually demonstrating Virtus 4 here. Scott Haynes was responsible for this version, and I think it is the best version of Walkthrough we ever did. It was also, unfortunately the last. The overall design and interaction is almost identical to the original 1990 version, though. This is using a software renderer that I wrote and was greatly enhanced by the team led by Greg Rivera. It uses portals extensively, and though you won't notice it, it does not actually have a z-buffer. The objects are sorted using a kind of BSP thing I did that is extremely fast. I am actually running this on Parallels on an older Macbook, and it feels faster to me than Sketchup 7.1, which I run native. But of course, considering that this had to run in real time on sub-20 mHz 68010 and 68020 machines, this had to be pretty damn fast to work at all.&lt;br /&gt;&lt;br /&gt;This is the system I first prototyped the virtual collaboration space in that I showed to Alan Kay. This led to the development of ICE (see previous post), OpenSpace, the Croquet Project, and Teleplace.&lt;br /&gt;&lt;br /&gt;Virtus Walkthrough won many awards, including the very first Breakthrough Product of the Year from MacUser Magazine, and the PC Computing Best Drawing Program, where we beat Adobe Photoshop. &lt;br /&gt;&lt;br /&gt;Here is the demo:&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/RKYMZzGPSjM&amp;hl=en&amp;fs=1&amp;rel=0&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/RKYMZzGPSjM&amp;hl=en&amp;fs=1&amp;rel=0&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-6850884555607549101?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2009/11/virtus-walkthrough.html</link><guid>4b3faa3ceb8d61d653cb716f56273fb6</guid></item>
<item><title type="text">Qwaq in WSJ</title><description type="html">We were in the Wall Street Journal - with a picture! Check it out here:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot; http://online.wsj.com/article/SB120719726445485981.html&quot;&gt;Virtual World Gets Another Life&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It includes an image of the new &quot;Business Avatars&quot; which have not been release yet, but look wonderful.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-24963843539168842?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2008/04/qwaq-in-wsj.html</link><guid>c327a5865073652623308785dec49595</guid></item>
<item><title type="text">On/off world</title><description type="html">Brandon Boyer at Boing Boing Offworld was kind enough to post a link to the Colony videos I made. You can see it here:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot; http://www.offworld.com/2009/02/a-look-back-at-the-colony-the.html&quot;&gt;A Look Back At the Colony&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-5125364447466469840?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2009/02/onoff-world.html</link><guid>f6cc93ecff247c4f956238128d0d0a6f</guid></item>
<item><title type="text">Interoperability</title><description type="html">I have been spending a large amount of time talking to people about interoperability in virtual worlds. One problem is defining what it means - and why it is important. From what I can tell, the main thing people are looking for is a way to easily traverse from one virtual world to another. It would be great to be able to jump through a portal from Second Life into Qwaq and back. We already support URLs as links between Qwaq spaces. Adding a Second Life island would be a bit tricky, but I think it could be done.&lt;br /&gt;&lt;br /&gt;There is also mention of having one's avatar go along for the ride, but it turns out that this is not that important, and may not even be a good idea. One way to think about it is people already have multiple identities online. I have a work email address, personal email, and a number of random older email addresses that I still get mail from. I don't like mixing them, and I have different expectations for the kind of mail I get from them, and people have different expectations from me depending on whether it is a work or personal email. That doesn't even begin to address the difference in security requirements.&lt;br /&gt;&lt;br /&gt;Avatars are context specific artifacts. My avatar in World of Warcraft makes no sense in my business world. An obfuscated name model like Second Life makes no sense in business either - good business practice is built upon a strong trust relationship. If I don't even know who you are I can't do business with you. &lt;br /&gt;&lt;br /&gt;On the other hand, if you like how your avatar looks in world A, it would be nice to have a similar version in world B. I like having the same name for my email addresses at gmail and at Qwaq, even if my role in each is different.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-6164435346925350312?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2008/03/interoperability.html</link><guid>a4ce6a89c2accad90b4c48fd77e6abef</guid></item>
<item><title type="text">Qwaq + Intel = Collaborative Mirimar</title><description type="html">Qwaq and Intel just announced that we will be collaborating to bring Mirimar technologies that were developed at Intel to market. This is exciting for a number of reasons. Mirimar is a beautiful and seamless interface with the users desktop, which will make Qwaq Forums even more of a compelling experience. And of course we get the opportunity to work directly with Intel and in particular with John David Miller, one of the principals behind Mirimar to develop and integrate this technology. JDM is definitely one of us - and we have had a lot of fun working with and learning from him over the last year. It will be fun to roll this product out the door.&lt;br /&gt;&lt;br /&gt;Press release here:&lt;br /&gt;&lt;a href=&quot;http://www.intel.com/pressroom/archive/releases/20070920corp_a.htm&quot;&gt;Intel-Qwaq Press Release&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Official video of Justin Rattner's keynote including a guest appearance by Greg Nuyens. This seems to require IE and a PC:&lt;br /&gt;&lt;a href=&quot;http://www.intel.com/pressroom/kits/events/idffall_2007/webcasts.htm &quot;&gt;Intel Developer Forum Webcasts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is just the video part - no slides, but seems to work everywhere:&lt;br /&gt;&lt;a href=&quot;http://mfile.akamai.com/28603/wmv/intelstudio.download.akamai.com/10670/idf/fall_2007/070920_JR/mshigh.wmv&quot;&gt;Intel Developer Forum Video&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-4831879421851426847?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/09/qwaq-intel-collaborative-mirimar.html</link><guid>55a48757287f825f4ccecb20ea13a992</guid></item>
<item><title type="text">Croquet Priorities</title><description type="html">Mark McCahill and I have been discussing the top priorities for Croquet moving forward. Here is the list of the top six things that we will be doing for 2008. The main theme is interoperability. This is interoperability at many levels. First, ensuring Qwaq Forums and Open Croquet worlds are interoperable. Looking beyond that is allowing Croquet worlds and avatars to interoperate with other platforms. This will be a large effort, but many of the technical hurdles have already been jumped. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- XML space description: a common space description file format in XML to allow the open source and QWAQ clients to read stored copies of each other's worlds.&lt;br /&gt;&lt;br /&gt;Minimizing the size of objects being replicated is important so that spaces may be saved compactly and new user joining the replicated space can do so quickly.&lt;br /&gt;&lt;br /&gt;In practice this means meshes and textures should be referred to by name in the replicated space, and fetched by each client&lt;br /&gt;independently of joining the space. By fetching these large objects independently of the replicated space, clients can maintain locally cached copies which speeds joining the space. An XML description of the space also simplifies programatically generating space descriptions, and aids in integration with various search engine technologies.&lt;br /&gt;&lt;br /&gt;Moreover, an XML-based space description also allows for the possibility of a croquet browser written in another language or based on a different code base. However, this implies changes to the rendering engine since we would be moving textures/mesh definitions outside the replicated space. QWAQ's forums have shown that this approach has many virtues. Ultimately we might want to use an extended version of Collada - but the first step would be to align the Open source and QWAQ code bases so we can read each other's world definitions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- robust Jabber client: SSL TLS support ( OpenSSL plugin?)&lt;br /&gt;&lt;br /&gt;This work can happen in the open source arena and is relatively independent of changes to space description formats. The current Jabber client does not support SSL transport level security and needs to - since most Jabber servers require SSL TLS. Supporting an open standard IM/Chat is a key for interoperability with the chat world, and ideally would allow cross world chat with other environments (such as Second Life) should those worlds decide to do the right thing and support a standards based chat protocol for inter world chatting. We also need this work so that we can advertise presence outside Croquet using an open standards-base approach.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- message router/timestamper: optional message router/timestamper as an Apache plugin?&lt;br /&gt;&lt;br /&gt;The microserver is a message router/timestamper for sites that want a standalone message router to augment the croquet client built-in router. We can leverage the support that the apache server codebase has by providing an option to externalize the message router function.&lt;br /&gt;&lt;br /&gt;This also opens the possibility of simplifying access control/authentication integration with existing enterprise AuthN/AuthZ&lt;br /&gt;systems. By creating a microserver that plays in the apache space we can leverage existing Apache web server authentication/access control modules.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- plugin API for extending space definitions: various browsers will extend functionality of spaces by adding new features, we need a definition for how this happens&lt;br /&gt;&lt;br /&gt;We expect that various browsers will extend functionality of spaces by adding new features. We need a standard way to describe these plugins that allows less well endowed clients to at least display a placeholder for content they cannot render and point to how to get the required extension. This is analogous to plugins for web pages.&lt;br /&gt;&lt;br /&gt;Note that these plugins may affect both the replicated space -and- the non-replicated inside-the-helmet user interface of a croquet client.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- scripting for user-defined behaviors: Javascript, Lua, panels, roll-your-own, and all that jazz&lt;br /&gt;&lt;br /&gt;If we have a common XML format for describing spaces we have half of what we need. The other half is a common way of describing user-created behaviors, so a scripting language - like lua or javascript - would allow for actions to be stored along with models and textures. This implies that browsers will all need to support the scripting language.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- avatar definitions: enabling Akbar 'n Jef's Avatar Hut&lt;br /&gt;&lt;br /&gt;Users of social spaces care a lot about their representation in-world&lt;br /&gt;- we need to converge on avatar standards so that each implementation of croquet is not re-inventing this particular wheel. That, and a good babyfur avatar should be a lifetime investment.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-4221152758784253593?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/11/croquet-priorities.html</link><guid>503b2b868654f8cf8c58eab60a0b7773</guid></item>
<item><title type="text">Hydra!</title><description type="html">Andreas Raab wrote:&lt;br /&gt;&lt;br /&gt;In its ongoing commitment to Open Source, Qwaq has decided to release&lt;br /&gt;the first multi-core capable Croquet VM under the MIT license.&lt;br /&gt;&lt;br /&gt;Hydra VM is a virtual machine capable of running multiple Croquet images&lt;br /&gt;side-by-side, therefore being able to effectively utilize multi-core&lt;br /&gt;CPUs. Hydra VM is still in an early phase of development, but given the&lt;br /&gt;(very successful) early results, Qwaq has decided to make it available&lt;br /&gt;to general public in the hope that other people will help Igor to make&lt;br /&gt;further progress in developing Hydra VM.&lt;br /&gt;&lt;br /&gt;The offical release is available here:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot; http://www.qwaq.com/HydraVM&quot;&gt; http://www.qwaq.com/HydraVM&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;and contains the following files:&lt;br /&gt;&lt;br /&gt;* HydraVM-bin.zip - A prebuilt Windows version of Hydra VM.&lt;br /&gt;* HydraVM-src.zip - The (C) source tree for building Hydra VM.&lt;br /&gt;* HydraVM-pkg.zip - The (Squeak) packages needed to build Hydra VM.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-7324020145469295294?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2008/02/hydra.html</link><guid>d7c1698d0e8b3f846b90bc8a2542c103</guid></item>
<item><title type="text">The Colony Videos</title><description type="html">I finally got around to posting the videos I made of The Colony. I had to borrow an old Macintosh from David Easter (who also did the ports to the PC and the Amiga) to make these, and I used a video camera to record them. This demonstrates the game, and I talk a bit about the technology behind it and why I designed the game play the way I did. Let me know what you think. I will also be posting some videos of Virtus ICE (Interactive Collaboration Environment). This was where the ideas for what became Croquet and then Qwaq Forums began.&lt;br /&gt;&lt;br /&gt;The Colony videos are in two parts and you can see them here. &lt;br /&gt;&lt;br /&gt;Part 1:&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/i1XENlUUOhA&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/i1XENlUUOhA&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Part 2:&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/3k3qrt76Ddk&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/3k3qrt76Ddk&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-5705215728120992728?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2009/01/colony-videos.html</link><guid>ba8aba15ddac15ce5dcc43b73f7ed3c4</guid></item>
<item><title type="text">Colony Walkthrough</title><description type="html">Searching through my digital archives, I found the following walkthough for &quot;The Colony&quot;. Not terribly useful anymore, but it will give you an idea of the depth of the game. This walkthrough was written 20 years ago...&lt;br /&gt;&lt;br /&gt;&quot;The Colony&quot; Revealed&lt;br /&gt;&lt;br /&gt;Copyright  1989 by David A. Smith&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;GETTING STARTED&lt;br /&gt;&lt;br /&gt;Where am I?&lt;br /&gt; You are on the DAS cruiser on the bridge.  You have just crash landed  on the colony planet 5-DELTA-5. &lt;br /&gt;Why is everything so dark and nothing seems to be working?&lt;br /&gt; The ships reactor is out; you need to turn on the emergency power.&lt;br /&gt;How do I use the console?&lt;br /&gt; Run into it.&lt;br /&gt;Why does the right button of the bridge console blow up the ship?&lt;br /&gt; That is not its intention.&lt;br /&gt;How do I turn on the emergency power?&lt;br /&gt; Press the left button on the bridge console.&lt;br /&gt;I can't open the airlock.&lt;br /&gt; You must unlock it using the decoder and the console directly to the  left of the airlock.  Don't forget to press the &quot;E&quot; (Enter) key after  entering the code.  Unlocking it does not open it.  You still need to  press the +/- button on the airlock door.&lt;br /&gt;When I go out the second airlock door I die.&lt;br /&gt; Did you close the first door behind you first?&lt;br /&gt;How do you close the inner door once inside the airlock?&lt;br /&gt; Simply turn around and run into the airlock door again (the one you  just came through) and press the +/- button.&lt;br /&gt;Yes, I closed the inside airlock door.  I still die.&lt;br /&gt; Are you wearing your power spacesuit?&lt;br /&gt;How do I put on my power spacesuit?&lt;br /&gt; Use the power spacesuit installer.&lt;br /&gt;What is that?&lt;br /&gt; That is the strange looking device you see as you come down the  stairs.  Run into it and set your armor and weapons power levels.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I die when I go into the room on the lower level just to the left of the stairway.&lt;br /&gt; Don't go in that room, it is a holding cell for prisoners (you are a Space  Marshall remember?), you were standing on an electrified security  grid on the floor.&lt;br /&gt;What's wrong with the spaceship?&lt;br /&gt; The reactor core has been damaged.&lt;br /&gt;How do I fix the reactor?&lt;br /&gt; You need to visit the colony first.&lt;br /&gt;&lt;br /&gt;ON THE PLANET SURFACE&lt;br /&gt; &lt;br /&gt;What are the pyramid shaped objects all over the planet surface?&lt;br /&gt; These are &quot;natural occurring rock formations&quot;.&lt;br /&gt;How many 'bug' creatures are there?&lt;br /&gt; There are an infinite number of creatures on the surface of the planet.&lt;br /&gt;I keep getting killed when I fight them.&lt;br /&gt; Then don't fight them.&lt;br /&gt;They chase me.&lt;br /&gt; You can run faster than they can.&lt;br /&gt;Even if I don't fight the creatures I do not last very long on the planet surface.&lt;br /&gt; See Power Spacesuit.&lt;br /&gt; &lt;br /&gt;FINDING THE COLONY&lt;br /&gt;&lt;br /&gt;Where is the colony?&lt;br /&gt; It is outside of the ship.&lt;br /&gt; It is underground.&lt;br /&gt; The entrance looks like a large box with a door in it.&lt;br /&gt; It is not far.&lt;br /&gt; You can see both the colony and your spaceship when you are directly  between them.&lt;br /&gt; Go north-east from the space ship.&lt;br /&gt;&lt;br /&gt;POWER SPACESUIT&lt;br /&gt; &lt;br /&gt;I found the power spacesuit installer but I can't get it to work. Nothing happens when I run into it.&lt;br /&gt; The emergency power needs to be on before the installer will work.&lt;br /&gt;Why do I die so quickly, even when I use the heavy armor and weapons?&lt;br /&gt; The power spacesuit drains your energy in proportion to the level  you set it at.  The heavier your setting the faster the drain. When all  of your energy is gone you are dead.  &lt;br /&gt;What is the meaning of the power suit scale on the left of the screen?&lt;br /&gt; This indicates the energy levels of you weapons, armor and life force.   When the life force level reaches zero you are dead.&lt;br /&gt;What kind of scale does it use?&lt;br /&gt; It is logarithmic.  For example, the lowest bar is equal to 1, then next  up is 2 or more, then 4 or more, then 8,16,32,...&lt;br /&gt;&lt;br /&gt;INSIDE THE COLONY&lt;br /&gt;&lt;br /&gt;I found the colony but when I try to open the inside airlock door I died.&lt;br /&gt; See GETTING STARTED.&lt;br /&gt;Once inside the colony, just past the airlock, there is a door that is always blocked.  What's on the other side?&lt;br /&gt; You don't need to know yet.&lt;br /&gt;I keep running out of energy, how can I raise my energy levels?&lt;br /&gt; Eat the small &quot;eggs&quot; of the creatures.  These are energy pods that will  hatch later but when they are in the dormant state your power  spacesuit can absorb the energy they contain.&lt;br /&gt;What are these creatures inside the colony?&lt;br /&gt;  Search for the Conference Room on level 1.  There you will find  some interesting information on the different alien types and their  capabilities.&lt;br /&gt;&lt;br /&gt;EGGS&lt;br /&gt;&lt;br /&gt;Where do the &quot;eggs&quot; come from?&lt;br /&gt; From the creatures.  They are actually dormant creatures that may  &quot;hatch&quot; at any time.  Note that most creatures can lay eggs but  only of  the same type.  The queens can lay any type of egg.&lt;br /&gt;What are they good for?&lt;br /&gt; Your power spacesuit can actually absorb the energy they contain, at  the same time destroying the creature that would normally be  hatching from it.  Note that different eggs help your power ratings in  different ways, compare the eggs shapes to your power suit display.&lt;br /&gt;&lt;br /&gt;REACTORS&lt;br /&gt;&lt;br /&gt;How do I fix the reactor on the spaceship?&lt;br /&gt; The reactor core is damaged, it needs to be replaced.&lt;br /&gt;Where can I get a new reactor core?&lt;br /&gt; Somewhere inside the colony.&lt;br /&gt;How do I get to the reactor core?&lt;br /&gt; You need to lower the core from the ceiling. Use the console in front of  the reactor.&lt;br /&gt;What are the codes I need to enter at the console to lower the reactor cores?&lt;br /&gt; The code for the ship reactor is inside a desk on the ship.&lt;br /&gt; The code for the colony reactor is inside a desk in the colony.&lt;br /&gt;Where is the code for the colony reactor?&lt;br /&gt; On level 1.&lt;br /&gt;I tried to retrieve the colony reactor core and tote it to the ship.  Succeeded admirably. But when I lowered it to the floor prior to switching it with the ship's reactor core, guess what?  It disintegrated.  Poof!  No more colony reactor.&lt;br /&gt; The only place that you can put the reactor core without breaking it is  inside a reactor (either one).&lt;br /&gt;Then how do I put the colony reactor core in the ship's reactor?&lt;br /&gt; You need to have already taken out the ship's reactor core!&lt;br /&gt;&lt;br /&gt;TELEPORTERS&lt;br /&gt; &lt;br /&gt;Where are the teleporters?&lt;br /&gt; On level 4 and in Lab A.&lt;br /&gt;I can not get any of the teleporters to work, what do I need to do?&lt;br /&gt; Keep looking for other teleporters.&lt;br /&gt;I found the teleporters in Lab A but can't move them anywhere to make use of their capabilities.&lt;br /&gt; You need a forklift.&lt;br /&gt;What is the order of the teleporters in Lab A?&lt;br /&gt; 1 to 2, 2 to 3, 3 to 4, and 4 to nowhere!&lt;br /&gt;How are the teleporters going to help me play the game?&lt;br /&gt; If you manage to get them to strategic locations, you will be able to  make many effortless trips (such as between your ship and the  colony) with the various objects you need to successfully complete the  game.&lt;br /&gt;If I'm inside the forklift and try to enter a teleporter, the forklift thinks I want to lift the teleporter. &lt;br /&gt; Try picking up something else (a box is usually handy) with the  forklift before entering the teleporter.&lt;br /&gt;If I'm in the forklift and want to pick up a transporter WITHOUT entering it...how is that done?&lt;br /&gt; Teleporters and forklifts work this way:&lt;br /&gt;&lt;br /&gt; 1. You can enter a teleporter if you are not inside a forklift.&lt;br /&gt; 2. If you are in a forklift and you are carrying an object (such as a&lt;br /&gt;    box) you will also enter the teleporter.&lt;br /&gt; 3. If you are not carrying any objects with the forklift you &lt;br /&gt; will pick up the teleporter with the forklift.&lt;br /&gt;&lt;br /&gt; The reason for this is simply that the user interface was much simpler&lt;br /&gt; to build and understand.  The alternative was to have the user answer&lt;br /&gt; a dialog about whether he/she wished to enter or lift the teleporter.&lt;br /&gt; I did not want to have a dialog box anywhere in Colony (except for &lt;br /&gt; saving games of course).  This was to keep the game as natural as &lt;br /&gt; possible.  In this case the forklift is allowed to make the decision&lt;br /&gt; for you.&lt;br /&gt;&lt;br /&gt; Similarly,  a number of things are the way they are to make the game  players life easier.  I would have preferred all  doors to be opened  AND closed by the game player but this gets tedious quickly.  So the  compromise is the airlock.  A number of things are the way they are  to make the game players life more miserable but that is the nature of  these things.&lt;br /&gt;&lt;br /&gt;FORKLIFT&lt;br /&gt; &lt;br /&gt;Where is the forklift?&lt;br /&gt; In the colony.&lt;br /&gt; On level 5.&lt;br /&gt; In storage room 5.&lt;br /&gt;What is it good for?&lt;br /&gt; It can carry large objects.&lt;br /&gt;What large objects?&lt;br /&gt; Teleporters, cryogenic chambers, boxes,  and reactor cores.&lt;br /&gt;I have trouble getting out of the forklift sometimes.&lt;br /&gt; The forklift will not let you exit if there is an object directly&lt;br /&gt; behind you (something about not allowing two objects to occupy the&lt;br /&gt; same space at the same time).  It will also not allow you to exit&lt;br /&gt; into a wall.  This may seem slightly random until you start considering&lt;br /&gt; exactly what is around you.  Remember this game takes place in 360&lt;br /&gt; degrees.  Just because you can't see an object does not mean that it is  not there.&lt;br /&gt;I have trouble dropping objects sometimes.&lt;br /&gt; The forklift drops the object in the square you are in.  Since only one  object can occupy a square, you (and the forklift) get pushed back a  square.  However if there is something behind you ( wall, post, alien,  etc), it appears to drop it but doesn't.  You can tell because the forklift  thinks it is still carrying the object (which it is) and the object is not  sitting in front of you ready to be picked up again.&lt;br /&gt;The forklift can not go upstairs. &lt;br /&gt; That's right.&lt;br /&gt;How do I get the forklift up the stairs to the colony airlock?&lt;br /&gt; There is another way to the airlock that does not use stairs.&lt;br /&gt;Can the forklift go outside?&lt;br /&gt; Yes.&lt;br /&gt;Does the forklift protect me from the creatures shooting?&lt;br /&gt; Not at all, in fact you can not even shoot back while inside!&lt;br /&gt;&lt;br /&gt;CRYOGENIC CHAMBERS&lt;br /&gt;&lt;br /&gt;How many cryogenic chambers are there?&lt;br /&gt; There are 6 of them.&lt;br /&gt;Where are the cryogenic chambers?&lt;br /&gt; Level 1 - 1&lt;br /&gt; Level 2 - 0&lt;br /&gt; Level 3 - 1&lt;br /&gt; Level 4 - 2&lt;br /&gt; Level 5 - 1&lt;br /&gt; Level 6 - 1&lt;br /&gt;Can you be a little more specific?&lt;br /&gt; The first cryogenic chamber is  in the security area on level 1.  Be careful of the security grid as you make your way to it.  It is in the upper part of the level 1 map.&lt;br /&gt; The second chamber is on level 3.  It is actually near the stairs located in the upper right hand corner but you need to go through apartment 33 to get to it.  It is through the door behind the dining room table.&lt;br /&gt; The next two chambers are on level 4. One is located inside of Lab 1 at the lower right of the map but you need to be pretty strong to get across all of the security grids that you will encounter on the way.  Don't forget that you need to come back the same way.  The next one is located in the maze found in the lower left.  Just follow the map to be safe, you may make a wrong turn and wind up in the Dave Bowman memorial room.&lt;br /&gt; The next chamber is found on level 5.  It is in the very center of the maze in the lower left of the level 5 map.  See STRANGE ROOMS AND MAZES for more information.  You can get out of it if you do not go into the same room as the cryogenic chamber is in, however, then you can not rescue that child.  Something to think about.&lt;br /&gt; The last chamber is found on level 6.  It is also in a maze (see the level 6 map) that starts behind a column after you have gone down one level of stairs from level 5.&lt;br /&gt;&lt;br /&gt;STRANGE ROOMS AND MAZES&lt;br /&gt;&lt;br /&gt;Is there a way out of the David Bowman suite?&lt;br /&gt; Niy,ha,ha,...There is no way out of the David Bowman Suite.  Yes, you  have fallen into my trap!  You will be in there FOREVER!!!!!&lt;br /&gt; (or at least until you load the game you saved right before entering  it.....)&lt;br /&gt;I am lost in the Level 5 maze. I feel like I am going around and around in circles.&lt;br /&gt; Yes, you probably are.  You can sometimes use the pattern of eggs in  each room to map out the maze.  Or use boxes and the forklift.&lt;br /&gt;I still can't figure out the Level 5 maze!&lt;br /&gt; This maze is actually a 5X5 set of 3X3 rooms that folds in on itself.  &lt;br /&gt;I just got into the room with the cryogenic chamber in the maze on Level 5.  I have the forklift to carry the cryogenic chamber but I can't get out of the room!  There is no door!   &lt;br /&gt; You need to carry a teleporter in with you to teleport out again with  the cryogenic chamber.&lt;br /&gt;If you go east five squares from the east elevator on Level 5, you can look east across a vent grid into another area, but I never found an access point to that area.  Am I missing something, or is there really no way to get there?&lt;br /&gt; The vent grid area that you referred to is actually a joke.  I thought  that I would create this really interesting room that no one could ever  get to thus creating a great mystery.  Turned out that Peter Sills of  Mindscape figured out a way to get into that room so I guess the joke  is on me.&lt;br /&gt;I can't seem to get into Lab 1 on Level 4...the security grids suck me dry before I can get anywhere. &lt;br /&gt; You need to be pretty strong to get by this.  Also try going very  quickly through these corridors, the less time you spend on them the  better.&lt;br /&gt;On Level 4, just around the corner from the elevators is a door that leads to an infinite corridor that also contains a security grid. Does it lead anywhere?&lt;br /&gt; No, it simply wraps on itself.&lt;br /&gt;&lt;br /&gt;QUEENS&lt;br /&gt;&lt;br /&gt;What happens when I kill a queen on a level?&lt;br /&gt; Almost all of the creatures on that level revert to eggs.  Munch,  munch.   Keep in mind that once you have done this and have already   eaten all the eggs on this level you may wind up starving yourself to  death.&lt;br /&gt;I have located the Prime Queen at the reactor, but everytime I get through the security grid and attempt to attack - I'M DEAD. &lt;br /&gt; Although she can be destroyed if you are strong enough, ask yourself,  &quot;is that really what I want to do with the next few hours of my life?&quot;.&lt;br /&gt;&lt;br /&gt;END GAME&lt;br /&gt;&lt;br /&gt;I have six frozen kids on my ship.  I have a new reactor core. I killed the Prime Queen.  What the heck do I do now?  I am really lost.  I can't get the ship to take off.  I'm getting old.  Help, please! &lt;br /&gt; Go to the main console on the bridge of the space ship and press the  bar on the far right.  This will take you into orbit.&lt;br /&gt;How do I blow up the colony without blowing up myself with it?&lt;br /&gt; Use the planet smasher, remember the button on the bridge console  that tends to self destruct?  Remember it is the button on the right!&lt;br /&gt;&lt;br /&gt;MISCELLANEOUS&lt;br /&gt;&lt;br /&gt;The aliens get stronger the further you descend into the colony.  This is due&lt;br /&gt;to the proximity to both the Prime Queen and the central reactor.  Also, the&lt;br /&gt;eggs laid by the creatures get more potent as well.&lt;br /&gt;&lt;br /&gt;Medium and Heavy Weapons use more energy than light!  On the first couple of levels the energy you are picking up per egg is relatively weak and does not lend a lot of power to the weapons and armor you are carrying.  However, as light weapons and armor use significantly less power, a little can go a long way.&lt;br /&gt;&lt;br /&gt;It takes less energy to kill the aliens on the higher levels.  You can &quot;overkill&quot; the aliens on level 1 for example if you were using heavy weapons.  Sort of like using 10 sticks of TNT when one will do.&lt;br /&gt;&lt;br /&gt;Don't duke it out with the aliens if you do not have to!!!  We won't think you're a coward if you just run for it.&lt;br /&gt;&lt;br /&gt;THE STORY OF THE COLONISTS&lt;br /&gt;&lt;br /&gt;     Many research scientists, military personnel and other professionals (along with their families) lived here.  The purpose of the colony was to conduct teleportation research.  The risks involved in this sort of pioneering work warranted the isolated location.  It was classified just how much progress had been made, but it was known that a prototype teleportation system was in the works.  The scientists closest to the project knew, however, just how far they had come.  They had successfully transported objects and, yes, people with no adverse effects.  It was actually possible to short-cut space and time! &lt;br /&gt;     But then unexplainable things started occuring.  First it was noticed that rooms and walls in some parts of the colony were warping.  Colonists would go out a door on one level and emerge on another.  Corridors became labyrinthine.  Rooms became exitless.  And then strange creatures were sighted.  There was speculation that these creatures had been either created by, or emerged from another dimension because of, the teleportation experiments.&lt;br /&gt;     It was also quickly realized that these creatures were dangerous.  Every possible measure was taken.  The experiments were stopped.  Colonists tried desperately to fight back.  They were largely unsuccessful, but discoveries were made about the nature of the creatures' existence:  if they were shot at enough, instead of being killed they reverted to a pure energy form.&lt;br /&gt;     Eventually, the colonists realized that it was hopeless.  They sent out a distress call, and used the few cryogenic chambers they had to keep the children out of danger.  All they could do was pray that somehow, someone would come and discover the horrors that had happened, rescue their precious children and destroy the results of their hasty research.&lt;br /&gt;            &lt;br /&gt;THE WALKTHROUGH&lt;br /&gt;&lt;br /&gt;TRUST ME...  it's really an easy game... heh heh ...&lt;br /&gt;&lt;br /&gt;Note that the following is to be used only as an example solution to &quot;The Colony&quot;.  There are many other ways to complete the game!&lt;br /&gt;&lt;br /&gt;5-DELTA-5 REPORT&lt;br /&gt;2/11/57&lt;br /&gt;&lt;br /&gt;After crash landing on the planet where colony 5-DELTA-5 is located, I slowly regained consciousness.  I realized that my reactor core was damaged.  So was my memory.  I did remember to press the left button on the bridge console (instead of the right, which would have been an instant disaster!).  I went downstairs to the power spacesuit installer and, since my energy reserves were low, installed my suit at lowest levels for both weapons and armor. &lt;br /&gt;&lt;br /&gt;&quot;So far so good&quot; I thought to myself as I used the security console to the left of the airlock to unlock the airlock control button.  I entered the corresponding code from my decoder, pressed the &quot;E&quot; button (for &quot;Enter&quot;) and went to the airlock, pressed the now unlocked +/- button and stepped through.  I almost forgot to go back to the inside door to close it again, but once that was done I opened the outside airlock door and stepped out onto the planet.  &lt;br /&gt;&lt;br /&gt;BANG!  Something shot at me!  I looked around and saw a squat giant bug like creature coming straight at me.  It was obvious that this was no friendly hello so I ran away from it as fast as I could go.  Since I didn't know where the entrance to the colony was and since I didn't want to get lost, I kept the ship in sight as I circled it, trying to keep away from the creature and all of his friends at the same time. &lt;br /&gt;&lt;br /&gt;I finally saw the entrance directly north-east of the ship and ran to it with the creatures close behind.  If these things were indicative of what I was to find inside of the colony, I was in real trouble!   I got to the colony and found, much to my relief, that the airlock door was open and that the airlock was the same model type as the one on the spaceship.&lt;br /&gt;&lt;br /&gt;I went inside, closed the airlock behind me and turning around noticed a large pyramidal shaped creature eyeing me suspiciously.  It didn't eye long for it immediately began an attack.  Since I was not in any position to run now all I could do was shoot back.  After about two or three shots the creature shuddered and actually began to shrink.  I went up to it to study the remains a little closer and when I went too near my power spacesuit began to whir and the collapsed creature disappeared!  I checked my power levels and noted that all of them had increased, which was useful because I was very near a terminal condition when I found the entrance to the colony.   So these creatures, or at least their remains, were useful after all.&lt;br /&gt;&lt;br /&gt;Entering the inside airlock door, I noticed a door on the other side of the room.  I tried to go through it but there was something on the other side blocking the entrance.  Turning around, I noticed the stairs and went down these instead.  I looked around this area, saw a hallway leading from the stairs and, double doors leading to an auditorium.  I went down the hallway and made a right turn.  I found an office at the end of this corridor and inside it in the lower left drawer, found a reactor code of the same type I kept in my desk on the ship.  &quot;Great&quot;, I thought to myself, &quot;They have the same kind of reactor as I use on my ship,  all I have to do is borrow theirs to get things working again!&quot;.&lt;br /&gt;&lt;br /&gt;I didn't have long to rejoice about my good fortune because another one of the creatures came up behind me and started blasting.  This one was just like the previous except that he was kind of upside down.  I dispatched with him,  and this time decided to examine the little beastie.  After a short time the collapsed creature began to shudder again and then it grew back to its full size.  Knowing what to expect this time I shot it down to size again and this time stopped to let my suit suck up the remains.  &lt;br /&gt;&lt;br /&gt;I went out of the office back into the hall and saw yet another creature, looking away from me.  This one was diamond shaped.  As I watched it I saw it actually lay a miniature carbon copy of itself.  &quot;So the collapsed creatures are actually eggs!&quot; I said to myself.  Not waiting for an invitation from the creature I started blasting away at it.  This time instead of shrinking away it just blew up!  I guess that since it was standing on one of its eggs it had no where to go.  I ran to the newly laid egg and feasted my suit on it.  Things were definitely improving!&lt;br /&gt;&lt;br /&gt;Further down the hall I saw a cafeteria on one side and a conference room on the other.  Inside the conference room on the table I found a slide projector.  Turning it on, I flipped through the slides while the voice over told me all about what I was up against.  Looked like there was going to be a tough battle ahead.&lt;br /&gt;&lt;br /&gt;I walked back out into the hall and needless to say I ran into even more of the creatures and their eggs.  I avoided the creatures because I didn't feel like my suit was up to the fight but the eggs were delicious, thank you.  After a little of this, my power spacesuit was beginning to look healthier.  I just had to make sure that I ate as many eggs as I could.  &lt;br /&gt;&lt;br /&gt;I came to the elevators next.  I decided to explore this level a little more and build up my strength before I went down there.  In my exploration of level one I found a library, a storage area, and a security area.  One thing I didn't find was people.  Not even any bodies.  That is until I came to the first cell in the security area.  There inside was a cryogenic chamber.  Not only that, but it was occupied.  A couple of creatures were hanging around so I took care of them.  The cryochamber had a note warning not to open it up so I had to figure out a way to get this thing back to the ship intact.  Well, it would have to wait until later.&lt;br /&gt;&lt;br /&gt;I went back to the elevators, and took one to level 2.  As soon as I stepped off I ran into the biggest eyeball I had ever seen.  I thought it might be one of the kid's balloons until it fired at me.  I shot back.  This one was a little tougher than the creatures on level one.  In fact all of the creatures were a bit nastier.  I could hardly wait till I got to the bottom level.&lt;br /&gt;&lt;br /&gt;This was an apartment level.  Nothing really useful that I could find.  There weren't any cryochambers here.  Just a lot of empty beds and a school.  Very depressing.  I did run into a queen.  Very nasty thing.  I nearly lost it all here.  A number of other creatures were standing around, looking pretty disinterested in the battle.  They are not very smart.  When I did kill the queen, she didn't shrink like the others, she just blew up.  When she was gone all of the other creatures seemed to lose the will to live also and they collapsed to their egg state.  Needless to say, this did wonders for my ego and my power spacesuit.  &lt;br /&gt;&lt;br /&gt;The next level was another apartment level.  Here I found another cryochamber in apartment 33.  I could also tell that things were beginning to get weird.  I went through a closet door and found myself on another level at one point.  The creatures must have had something to do with it.&lt;br /&gt;&lt;br /&gt;The next level was the lab area.  Here I found a number of labs with partially working teleporters.  They didn't look particularly safe so I stayed away from them.  I did find another cryochamber in Lab 1, however.  This was not easy to get to.  There were a lot of security grids to cross.  Another cryochamber was in a maze on this level.  Well, I would have to come back for them later. &lt;br /&gt;&lt;br /&gt;Inside of Lab 2, in the closet of all places, was a corridor that led to tunnel that brought me out to a hidden laboratory.  Inside this lab there were four teleporters.  These looked like they were ready to go, so I decided to try one out.  I entered teleporter number 1 and after closing the door there was a tremendous burst.  I opened the door and found myself coming out of teleporter 2.  &quot;This may prove to be useful&quot;, I said to myself, having expected to come out of teleporter one again.&lt;br /&gt;&lt;br /&gt;I went back to level 4 and took the elevator down to level 5.  This was the storage area.  Inside of storage room 5 was a nice big forklift.  This was going to be easy, I thought.  Also, while I was on this level, a voice came to me (suspension of disbelief required here) that told me there was yet another child somewhere in a maze on this level and that it was inside a room that had doors into it, but no doors out.  Well, since I always listen to voices, I stayed out of the maze, but I did keep the teleporters in mind for use later.&lt;br /&gt;&lt;br /&gt;Since this was the lowest level that the elevator went to I took the stairs down to the next level.  I found another cryochamber here, inside a maze that was hidden behind a column.  I took the stairs down two more levels where I not only found the reactor, but I found a set of security grids protecting it and what looked to be the Prime Queen of the creatures.  Not wanting to deal with her just yet I decided to first rescue all of the children.&lt;br /&gt;&lt;br /&gt;The first thing I did was to go back to level five and retrieve the forklift out of storage room 5.  I took this up the elevator and into Lab 2, down the secret hall into the tunnel and I picked up teleporter number 3.  I took it back to where the elevators were, then up to level 1.  I carried it to the stairs leading to the airlock and then came to the numbing realization that forklifts can't go up stairs.  Well, that was a disappointment.  But they must have gotten it into the colony in some way.  Then I remembered the blocked door just as you enter the colony from the airlocks.  What was on the other side?  After a little more exploration I found that inside the storage area on this level was a number of boxes blocking a door.  I put down the teleporter, picked up the boxes and moved them out of the way, and then picked the teleporter up again and went out.   Lo and behold, I found myself in front of the airlock doors!   I simply went through them, turned southwest, and carried the teleporter back to the ship. &lt;br /&gt;&lt;br /&gt;Once inside the ship I was being really clever.   I put the teleporter down inside of the reactor room and then tried to take the forklift into it instead of lifting it.  This did not work.  The forklift insisted on trying to carry it.  I realized that since that was what it was programmed to do I had no choice but to carry something with me when I went through it.  So I went to the ship store and picked up a box with the forklift and, since the forklift could not carry more than one object at a time it was forced to enter the teleporter.  After closing the door, I was teleported back to teleporter number 4, just like before.  I put down the box , picked up teleporter 2, and carried it back to the elevators on level 4.  &lt;br /&gt;&lt;br /&gt;Now I was ready to do some serious rescuing.  I took the forklift up to security area in level one and picked up the first cryochamber.  I carried it down to level 4 and into the teleporter and teleported to the ship.  I carried it to the front empty room of the ship.  One down and five to go.  I picked up another box, and teleported back to the lab.  This time I picked up teleporter 4 and carried it back, and placed it beside teleporter 2.  &lt;br /&gt;&lt;br /&gt;I then went to level 3 and apartment 33 and carried the cryo back down the elevator, through teleporter 2 back to the ship, got another box and was back in a flash.  This was almost too easy.  But then I realized I was running out of boxes on the ship. &lt;br /&gt;&lt;br /&gt;The next cryochamber was in the maze on level 4 so I went in and, carefully avoiding the Dave Bowman memorial room, retrieved it (I'm really good at mazes).  Teleporting back to the ship I placed it beside the other two.  I was halfway done!  I grabbed another box and noted that there was only one left after this.  Back to the colony and into Lab 1.  &lt;br /&gt;By this time I was pretty strong,  so the security plates in this area were not too much of a problem.  I also went over them as fast as I could;  they can hurt if you stick around.  I had to pause every so often to dispatch a creature or two, nothing serious.  I got to the lab, retrieved the cryochamber and went back the same way I came, much faster this time since there were no creatures blocking my path.  I then teleported back to the ship with cryochamber number 4.  &lt;br /&gt;&lt;br /&gt;Alas, I was down to my last box.  I picked it up and teleported back to the colony.  Now I was going to have to think.  The next cryochamber was somewhere in the maze on level 5, inside a room with no exit doors.  Luckily, I had another teleporter that I could waste on this project so I went back through Lab 2 to the tunnel and the hidden lab and picked up the last teleporter.  I carried it back up, then down the elevator to level 5 and into the maze.  I quickly found the room with the cryochamber in it, put down the teleporter, picked up the chamber and stepped into teleporter 1 inside the room and was transported to teleporter 2 near the elevators.  Then I turned around, got back into teleporter 2 and found myself back on the ship.  &lt;br /&gt;&lt;br /&gt;Well, there were five of the cryogenic chambers sitting next to each other.  Only one left.  Unfortunately, I had to walk back to the colony because I didn't have any boxes left.   It was a short trip.&lt;br /&gt;&lt;br /&gt;Emerging from the airlock, I wasn't paying attention and walked down the stairs while I was inside the forklift.  When I woke up, I was down at the bottom of the stairs.  I could tell that getting cryochamber number 6 was not going to be fun. &lt;br /&gt;&lt;br /&gt;I took the elevator down to level 4, picked up teleporter number 2 and went down the elevator again to level 5.  There I took the stairs down to level 6 (yet another fall, nothing damaged though) and went into the maze to recover the sixth and last cryogenic chamber.  Once this was done and I had placed it next to the other five on the ship I realized that I had no boxes left to carry into the teleporter and that the outside airlock door was open.  I was stuck!&lt;br /&gt;&lt;br /&gt;I then remembered that I had to replace the ship's reactor core.  I got out of the forklift, went upstairs to my desk and read the code inside the drawer.  I went back down to the reactor console and entered the code, being very careful because the wrong code would blow it up.  The reactor core dropped down from the ceiling and I got back into the forklift and picked it up and then got back into the teleporter.  I found myself back on level 4.  I took the elevator back down to where I had left teleporter 2 and put down the spent reactor core.   Since these cores are very fragile, when I dropped it, it smashed into a million pieces.  No great loss however.  I picked up the teleporter and carried it back to the stairs down to level 7 and then to level 8.  I then ran across the security grid, dropped the teleporter, jumped out of the forklift and ran smack into the Prime Queen.  Boy, was she mad.  I didn't feel up to arguing  with her so I ran around to the other side of the teleporter.  She lost interest in chasing after me.  All I had to do was enter the reactor code I found in the desk back on level one.  I entered the code, the reactor core dropped, I jumped back into the forklift and amid a flurry of shots from the Queen and her friend, I grabbed the reactor core, and got back into the teleporter.  I noticed that the lights went out in the colony when the core was removed, but there wasn't anybody left to miss it.  &lt;br /&gt;&lt;br /&gt;I closed the teleporter door and the next thing I knew, I was back on the ship.  I placed the new core into the reactor.  Got out of the forklift, entered the reactor code to lift the core back inside and went upstairs.&lt;br /&gt;&lt;br /&gt;All systems were &quot;GO&quot; when I got back to my console.  I pulled up the accelerator and the next thing I saw was the planet shrinking under me as I went into orbit.  I looked down at the innocent sphere which I was about to crush the life out of and said &quot;No matter where you go, there you are.&quot;  I smiled as I pressed the planet smasher button and sat back to watch one of the best fireworks displays this side of the galaxy.  The only thing left to do was to collect my medals.&lt;br /&gt;&lt;br /&gt;SPACE MARSHALL ACADEMY ENTRANCE EXAM&lt;br /&gt;&lt;br /&gt;What happens when you set the date to 12/25?&lt;br /&gt;How many queens are there inside the Colony?&lt;br /&gt;Where do you go when you lift teleporter 3 with the lifter and enter teleporter 2?&lt;br /&gt;What is the voice saying in the slide shows (Only on Macintosh version)? (Hint: .sdrawkcab s'tI)&lt;br /&gt;What year does the adventure take place? Bonus: what is its significance?&lt;br /&gt;Where are the chattering teeth?&lt;br /&gt;What topological shape is the planet?&lt;br /&gt;Assuming that at your slowest speed each step is a distance of 1 meter what is the radius of the planet?&lt;br /&gt;Where do the doors in the room on the other side of the big pit on level 5 lead?&lt;br /&gt;What happens when you hold down both the mouse button and the space bar when you are in the middle of a fight?&lt;br /&gt;If you don't have the will or the energy to fight a creature, but it is blocking your path, how can you get by it?&lt;br /&gt;How many movies can you name that influenced some aspect of the design of &quot;The Colony&quot;?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-8656758330571971231?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2009/11/colony-walkthrough.html</link><guid>591dbe9a76c113ee0a54a8fae8d49e1f</guid></item>
<item><title type="text">More Scripting</title><description type="html">I am sure everyone has their own opinion about scripting inside of Croquet. Here are mine:&lt;br /&gt;&lt;br /&gt;- The scripting we use should be a popular language. Javascript is the obvious choice. Lua gets high marks for coolness, but most people have never even heard of it. It would be great to include any language, but getting the first one to work is a big enough project.&lt;br /&gt;- It needs to work INSIDE of the Island. That is, it should offer the exact same guarantees of determinism that Croquet Islands provide. &lt;br /&gt;- It must utilize the same numerics package that we have added to Squeak/Croquet. (Otherwise the previous will fail.)&lt;br /&gt;- It must be enhanced to support #future messages directly. You MUST NOT loop to simulate in Croquet. Bad bad bad.&lt;br /&gt;- The interface for editing the scripting language must be INSIDE of the Island. In other words - extreme programming on steroids! Scripting is a form of communication. When we came up with the idea for Croquet the intent was not to have a virtual mall and hang out. It is intended to be a high bandwidth communication medium. This includes the ability to dynamically express a simulation as part of the conversation! Hence the expression itself is a part of the communication. The editing is part of the argument between the participants.&lt;br /&gt;&lt;br /&gt;This is probably more important to me than others, but until this is available, it ain't Croquet.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-2642439597194516949?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2007/10/more-scripting.html</link><guid>e50c8c613e8bf8fa234da1933f595085</guid></item>
<item><title type="text">Palm Pixi Rox</title><description type="html">I just bought a new phone, and it wasn't an iPhone, but it is still very cool. I have been planning to buy an iPhone as my next communication device - all my friends have one. I am very glad that they no longer feel the urge to demonstrate how cool they are by showing me some stupid picture or new app on their iPhone - except for Frank, of course. &lt;br /&gt;&lt;br /&gt;So why didn't I buy an iPhone? Well, it is a bit complicated. My family has five phones with Sprint. I actually had a Rumor, which is a pretty good texting phone, but not much use for anything else. I was reasonably happy with it, though the blue-tooth quality was pretty poor. It was not too useful in California - unless you are married to the governator. Sprint is pretty good for quality of reception, but I always thought the selections of their phones sucked. A few years ago, I decided I needed a Blackberry and tried to upgrade at Sprint. Believe it or not, they would not sell me one. They only sold them to businesses. Morons. I did buy a Blackberry from someone else and carried two phones. I dropped the Blackberry after a while, because I realized I could almost always check my email with my MacBook, even when I was traveling. &lt;br /&gt;&lt;br /&gt;So why the new phone? Somehow, I must have either dropped or stepped on my Rumor. I had made two or three phone calls earlier in the day from my office. I put it in my pocket and went downstairs to talk to my wife and while I was talking to her I received another call. I took the phone out and pressed the answer button and then saw that it had a big crack in the center of the screen. Worse, the voice quality on the other end was totally garbled - like some sort of electronica convolution filter. It was basically toast. I needed my phone to work this week, as there are many things going on in my life (that I will be writing about soon) so whether I liked it or not, I had to go visit the Sprint store for a replacement.&lt;br /&gt;&lt;br /&gt;When I got there I had a few nice surprises - first the selections of phones was not terrible. In fact it was getting interesting. No iPhone of course - this wasn't AT&amp;T, but they had an Android phone and yes, they finally were offering Blackberries to real people, and a they had the new Palm WebOS-based phones. I was interested in the Google phone, but a friend of mine had just bought one and was trying to take some pictures in the bright sunlight. The screen was unusable. Also it was kind of big and bulky - sort of like what the old Soviet Union might build if they were trying to make an iPhone knock-off. &lt;br /&gt;&lt;br /&gt;What really caught my eye was the Palm Pixi. It is the smaller and slightly cheaper brother to the Palm Pre (which had the very strange commercials last year). I like small phones, as I already carry too much hardware in my pockets. The Pixi was actually smaller than my old Rumor (which really wasn't that small) and it was a real smart phone. Better yet, Sprint was offering a hell of a data plan where my family's monthly costs, which did not include data, would actually drop with the new plan which did include it. The phone was $200 with a $100 rebate - including a new two year contract, but now, even that was pro-rated. Sprint is definitely getting aggressive.&lt;br /&gt;&lt;br /&gt;So now the review of the Pixi. In a nutshell, it is terrific.&lt;br /&gt;&lt;br /&gt;Here is a list of pros followed by cons:&lt;br /&gt;&lt;br /&gt;Pros&lt;br /&gt;- Setup was trivial. The guy at the Sprint store did most of the work and I had a working phone with all my contact info when I walked out.&lt;br /&gt;- The phone perfectly integrates with Gmail, which is my main email connection these days. It pulled all of my contact info into the phone and I was immediately reading the most recent emails.&lt;br /&gt;- It supports Google Calendar, which my wife and I share. And it issued calendar alerts. Very nice.&lt;br /&gt;- It is quite small, but the built in thumb-keyboard is quite usable. It took a little getting used to, but it works fine and has a nicer feel than my Blackberry or my earlier RIM device. I do love the size - it is quite thin and feels very nice in my hands.&lt;br /&gt;- Sprint's wireless network performance is great. I was at a Starbuck's with a friend of mine and wanted to show him a video I had posted to YouTube. He tried to access it with his iPhone, but I had it running on the Pixi well before he even had an connection. He never did get it to work, but he was using the AT&amp;T network and not the local Wi-Fi. &lt;br /&gt;- Web browsing works pretty good, given the size of the screen. Certain sites, like Boing Boing are excellent, because they have a mobile version automatically loaded. Amazon was a bit crappy, surprisingly.&lt;br /&gt;&lt;br /&gt;Cons&lt;br /&gt;- The text is too small, especially for us old guys.&lt;br /&gt;- The sound volume is not quite loud enough, even with it maxed out.&lt;br /&gt;- When I called my mother, she said the sound quality on her end was echo-y, like I was far away from the phone.&lt;br /&gt;- I tried to read a PDF document using the included Adobe reader app, but it didn't word wrap, so this was basically a lost cause. Seriously - if I zoom into a document using PDF, you really need to provide an option to wrap the text so I don't have to scroll left and right.&lt;br /&gt;- Camera quality is poor. Good enough for a random picture now and then, but it won't replace my Casio Exilim.&lt;br /&gt;- Takes a long time to charge (maybe 4-5 hours?)&lt;br /&gt;- Charge lasts about 3 days with use. Since it was a new phone, I probably did more with it than I normally will in the future, so this probably caused the battery to drain quickly. &lt;br /&gt;- Some apps re-orient based on the orientation of the phone. Others don't.&lt;br /&gt;- It really needs a search app that has instant access.&lt;br /&gt;&lt;br /&gt;Overall, this is a great non-Android Google phone. It is really nice how cleanly and easily it interfaces with my Google life. And I love the size. It is really quite elegant. It has only been three days now, so let's see how it holds up over the next few months.&lt;br /&gt;&lt;br /&gt;As an aside, I had a rental car last week - a Ford Flex. This included the Microsoft Sync software. I might comment more on this later, but short answer - it was terrible. I actually liked the car (more of an SUV actually), but this software was really opaque. After linking it to my now sadly demised phone via BlueTooth I could not figure out how to get to the phone interface to make a call. I nearly had an accident trying to figure this thing out. I never did figure out how to use the built-in GPS for directions. Luckily I had my Garmin Nuvi with me. Sync is Bad Bad Bad. If anyone from Ford is reading this - I did like the Flex, but will never buy anything with Sync installed.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-7179993793146449486?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2010/02/palm-pixi-rox.html</link><guid>ba8db2553f8f8b8cfba6ec7faf3393b1</guid></item>
<item><title type="text">The ICE Videos</title><description type="html">ICE stands for Interactive Collaboration Environment. This is the real proto-Croquet architecture I built at Virtus. The ideas were strongly influenced by Apple's OpenDoc architecture and conversations with Alan Kay. There were two versions of this, one with some really neat recursive drag and drop capabilities. This system was collaborative from the start, including voice and video. The &quot;avatars&quot; were flying TVs with video images of the other users on them. The video was from some special cards that are long gone, so I could not show that in this demo. Once again, thanks to David Easter for providing the machine I used to record this demo. David also designed much of the component architecture that we built here. The second video is in some ways even more interesting than the first. We actually made the entire ICE system itself a component which meant that we could drag and drop ICE into a 3D window in the space. Early portals!&lt;br /&gt;&lt;br /&gt;Enjoy it.&lt;br /&gt;&lt;br /&gt;ICE Version 1&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/KFdeVRteiSY&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/KFdeVRteiSY&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;ICE Version 2&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/fI-uwgHIR4I&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/fI-uwgHIR4I&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8378574-4695896943291084740?l=croqueteer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croqueteer.blogspot.com/2009/01/ice-videos.html</link><guid>93f0dc2d5791f1a516ba5499720255c6</guid></item>
<item><title type="text">mmm donuts</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;As a quick aside in the pursuit of point-clouds,&lt;br /&gt;i generated some point clouds which are points 'near' the surface of a torroid.&lt;br /&gt;The nifty part is that the points are evenly distributed on the donut surface.&lt;br /&gt;That is, if you were standing on the donut, you'd perceive the average point density around you to be pretty much constant no matter where you were standing.&lt;br /&gt;&lt;br /&gt;This is actually non-trivial.&lt;br /&gt;Consider the traditional simple mapping of wrapping a rectangle around a donut via theta = x , phi = y. This mapping contracts the map on the inner wall of the donut and expands it on the outter.&lt;br /&gt;&lt;br /&gt;Similarly with a sphere, theta = x, phi = y contracts at the poles.&lt;br /&gt;For a sphere this turns out to have a simple analytical solution which i think is just theta = x, phi = sqrt(y). (I explore this mapping &lt;a href=&quot;http://elenzil.com/orion/progs/randompoints/index.html&quot;&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;However such an analytical mapping of a rectangle onto a donut turns out to be much more complex. &lt;a href=&quot;http://www.sciencenews.org/&quot;&gt;Science News&lt;/a&gt; had an article in 2003 or 2004 which talked about a recent solution, but i can't find it.&lt;br /&gt;&lt;br /&gt;For evenly distributing Random points however,&lt;br /&gt;there's a fairly simple if brutish approach:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;choose a random point inside the rectilinear volume which contains the torus.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;if the point is within some threshhold of the torus surface keep it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;optional: project the point onto the torus surface. (this actually introduces a bit of non-even distribution, but it allows you to relax the threshhold quite a bit)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;repeat until you have as many points as you want.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Torroid with 100,000 points evenly distributed within 0.01 units of its surface, not projected:&lt;br /&gt;&lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/torroid/eventorroid1.png&quot;&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/torroid/eventorroid1.png&quot; width=&quot;48%&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/torroid/eventorroid2.png&quot;&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/torroid/eventorroid2.png&quot; width=&quot;48%&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Comparison of filtered and non-filtered projected points:&lt;br /&gt;&lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/torroid/torroidcomparison2.png&quot;&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/torroid/torroidcomparison2.png&quot; width=&quot;48%&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/torroid/torroidcomparison1.png&quot;&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/torroid/torroidcomparison1.png&quot; width=&quot;48%&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.. honestly, it barely makes a visual difference, but it's nice to see anyhow.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Actually, after doing some more comparisons with donuts of different shapes,&lt;br /&gt;i've come to the conclusion that the whole threshholding thing is pretty much unnecessary if you project the points onto the donut surface.&lt;br /&gt;&lt;br /&gt;Funnily, projecting a point onto the surface of a donut is suprisingly simple and doesn't involve and trig.&lt;br /&gt;Just project the point in question onto the circle which is the core of the donut and then project onto the surface.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-111886418751744327?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/06/mmm-donuts.html</link><guid>fe13b23b21d59fd8b6c22c777dc0fc5f</guid></item>
<item><title type="text">annotating</title><description type="html">Annotating seems to be a pretty hot topic lately,&lt;br /&gt;and Tao &amp; i are starting a stab at it.&lt;br /&gt;&lt;br /&gt;The  big debate for us is how to present the text.&lt;br /&gt;&lt;br /&gt;We've argued over it a lot and i think we're going to try a few different methods and see which one(s) we like.&lt;br /&gt;&lt;br /&gt;* 2D morphic pop-up windows in screen-space. (external to the whole croquet window)&lt;br /&gt;* TWindows in camera-space. (ala the default croquet HUD pop-up for left-click)&lt;br /&gt;* TWindows in world-space.&lt;br /&gt;&lt;br /&gt;Re Collaboration:&lt;br /&gt;&lt;br /&gt;* The last approach has a default solution. Just zoom up to the window and edit. (Some tweaks will have to be made to allow an avatar to select thru another avatar when they're superimposed)&lt;br /&gt;&lt;br /&gt;* The first two will need some work. We'd like the annotation to be visible only to those folks who want to see it.  That is if A, B and C are editing the annotation, and D doesn't care, then the annotation shouldn't take up World or Screen real-estate for D.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Meanwhile,&lt;br /&gt;here's a nifty-looking screenshot of the first pass at the annotation incidators.&lt;br /&gt;This required a small change to TRay&gt;&gt; pickTriangles: list: because that routine did not return a normal. I added some very brutish normal calculation and it seems to work as well as could be expected. (quite well in the four or so objects i've tried it on) Change set is available &lt;a href=&quot;http://bugs.impara.de/view.php?id=918&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/surfacemarkers.png&quot;&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-110989165964201764?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/03/annotating.html</link><guid>3ffa44d61c42f293bee9fe7a19ffda51</guid></item>
<item><title type="text">Input Validation</title><description type="html">This is kinda neat.&lt;br /&gt;&lt;br /&gt;With the new Properties editor for primitives,&lt;br /&gt;there's a number of input fields which need to have the user's input validated before being used.&lt;br /&gt;&lt;br /&gt;For example, maybe the user types in a word where a number is wanted,&lt;br /&gt;or enters a value outside of the allowed range,&lt;br /&gt;(or, because i thought it might come in handy, the user types in 0 when 0 in particular is disallowed).&lt;br /&gt;&lt;br /&gt;Validation becomes somewhat trickier when the fields affect the scene immediately - that is, as soon as the user hits a key, it's reflected in the scene. In this situation, you absolutely need validation.&lt;br /&gt;&lt;br /&gt;For example, in the case of TSphere segments, the minimum value is 2 (altho i'm using 3).&lt;br /&gt;A natural and frequent user interaction will be to delete the value currently in the field and then type in a new value. After deletion but before typing, the value of the field is invalid, and so must be handled.&lt;br /&gt;&lt;br /&gt;I subclassed CNumberConverter and added members for min, max, zero disallowment, as well as a pointer (?) back to the CInputField itself, and some helper variables.&lt;br /&gt;When the input goes invalid, the CInputField background is changed to lightRed (the man's pink!) and the last valid value is reported. The text content of the input field is left unchanged, however, because changing would interfere with the user's typing.&lt;br /&gt;When the input goes valid, the background color is changed to the CInputField's container's background color, and the current value is stored as the last valid value.&lt;br /&gt;&lt;br /&gt;Basically, it works fairly nicely.&lt;br /&gt;&lt;br /&gt;The file-outs of the new classes are &lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads/CNumberConverterOxe_20050728.zip&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/inputfields/validatedfields.png&quot;&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112258766184991107?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/07/input-validation.html</link><guid>ab8e814ec725a288d194c8756796d212</guid></item>
<item><title type="text">getting ready for citris open house thursday</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;After a bit of thought,&lt;br /&gt;Tao and I decided to show the new version of the gallery software at a CITRIS open-house this thursday. While the newer version does not have the media support quite in place, it does feature actual collaborativity and a more intuitive and sexy user interface.&lt;br /&gt;&lt;br /&gt;Today i got the bulk of Tao's mpeg player into the new version,&lt;br /&gt;along with the usual control buttons, but still have a bit of work to do.&lt;br /&gt;&lt;br /&gt;Loading VRML2 files still needs a bit of work and we'll be faking it a little (but truly only a little) at the demo.  One problem we're facing here is collaborative manipulation of 3D objects with the TEditBox.  TEditBox is a wonderful interface but hasn't been meta-fied yet, unlike TDragger.  I may take another stab at bringing meta into the TEB now that i'm a little familiar with how meta works.&lt;br /&gt;Also the texture field of a VRML2 file seems to be being ignored, which i plan on trying to just fix, but i may have to do some work-around like assigning a texture w/ the same name as the file.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-110790921185465028?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/02/getting-ready-for-citris-open-house.html</link><guid>2a7e357c108bad571aead14acf1e3681</guid></item>
<item><title type="text">Go Here, Primitive Properties, SkyBox</title><description type="html">There's a new partial release up at:&lt;br /&gt;&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads.html&quot;&gt;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Added a pop-up dialog for Primitives allowing you to&lt;br /&gt;manually edit their position, size, and other properties.&lt;br /&gt;This seems to work with save &amp; load,&lt;br /&gt;but i'm a bit nervous about it,&lt;br /&gt;especially the extent of cubes and squares.&lt;br /&gt;(well, formerly cubes and squares ;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Added 'go here' item in the pop-up menu for most items,&lt;br /&gt;  under options.&lt;br /&gt;&lt;br /&gt;- Fixed skybox problems, added 'none' as an option.&lt;br /&gt;  (Still need a 'background color' option tho!)&lt;br /&gt;&lt;br /&gt;- various other small changes.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112250677662411795?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/07/go-here-primitive-properties-skybox.html</link><guid>867c6d7de220f8fba85b14e092954e3e</guid></item>
<item><title type="text">Primitive Editor</title><description type="html">Ed Boyce is interested in using the Gallery software to present solar system simulations. (Is &quot;solar&quot; Sol-centeric ?  ie, is there only one solar system in the universe, one solar wind, etc ? or does Alpha Centauri or Sirius produce a solar wind as well ?) To that end, a couple new features are in the worls:&lt;br /&gt;&lt;br /&gt;* numerical positioning of objects.&lt;br /&gt;  - for starters a simple dialog which lets you edit the properties of a primitive.&lt;br /&gt;i've been wanting to make one of those for a while. It's a relatively generic dialog with fields for position, radius, inner radius, top radius, base radius, segments, wedges, etc, in essence all the potential fields a primitive may support. The fields are only shown if the passed-in primitive supports the methods to set/get those fields. ie via &quot;aTPrimitive class includesSelector: someSelector&quot;.&lt;br /&gt;It's a bit clunky, definitely, but works so far.&lt;br /&gt;  - I'm not sure if i want to include Texture, Spin, etc in here.&lt;br /&gt;  - for seconds, we may work out a table format to input the data, altho this seems to be straying a bit from a general gallery app to me.&lt;br /&gt;&lt;br /&gt;* &quot;Go To&quot; feature.&lt;br /&gt;  - added a menu item to all objects which reads &quot;Go Here&quot; and simply zooms the camera/avatar up to the object.  The behaviour is similar to that of TWindow, but somewhat different in that it doesn't pay attention to the 'front' face of the object. With TWindow, the viewer always ends up aligned facing the front of the object, which is as it should be. However that's a bit unintuitive when you just see some object in the distance and want to go to it.  With &quot;Go here&quot; it's as if you simply walked (quickly) over to the object.&lt;br /&gt;  - I would like to add a pop-up window listing all the objects (of interest) in the scene and allowing you to select, edit, and of course, go to them.&lt;br /&gt;&lt;br /&gt;* Providing hooks to ODE for physics&lt;br /&gt;&lt;br /&gt;* Ed would like to see 128-bit numbers instead of 32-bit.&lt;br /&gt;  - I think this is somewhat out of the scope of the Gallery project and more in the purview of Croquet or Squeak itself. itselves. themself.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112232856154328189?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/07/primitive-editor.html</link><guid>e053575118099c636fad74bdd92747e3</guid></item>
<item><title type="text">Humanoid PointClouds</title><description type="html">Towards bringing together the gallery project and CITRIS's &lt;a href=&quot;http://www.eecs.berkeley.edu/%7Esangj/teleim/&quot;&gt;tele-immersion lab&lt;/a&gt;, we've taken some data from Sang-Hack Jung and imported it into croquet.&lt;br /&gt;&lt;br /&gt;The data is simply lots and lots of points with XYZ &amp;amp; RGB info.&lt;br /&gt;Each frame is approximate 150,000 points, with a framerate of about 12Hz.&lt;br /&gt;&lt;br /&gt;Below are preliminary results showing simply getting some of the data in to Croquet.&lt;br /&gt;Next steps are reading in approximately 50 frames from 50 files,&lt;br /&gt;followed hopefully by networking.&lt;br /&gt;&lt;br /&gt;Qualitative observations:&lt;br /&gt;The data reads in from disk nigh instantly via AsyncFile, straight into a B3DVector3Array.&lt;br /&gt;Additionally it scales quite fast, which surprised me because the actual points are scaled rather than having the scale in the matrix.&lt;br /&gt;Very slow however is computing the bounding sphere/box of the cloud.&lt;br /&gt;I'll probably pre-calculate this and include it in the data files.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/2pointclouds.png&quot;&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-111956885916201951?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/06/humanoid-pointclouds.html</link><guid>82d93c364a1c36a16c8976b0a75414b7</guid></item>
<item><title type="text">Small new release - Good Stuff</title><description type="html">There's an image/changes-only release up at &lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads.html&quot;&gt;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Most notably there was an old bug around which was causing a dump to the log file at least every frame in some situations, which pretty severely impacted performance, to say nothing of filling up the harddrive !  Folks should download this version just for this.&lt;br /&gt;&lt;br /&gt;Also included are the heads-up navigation keys described in the previous blog post,&lt;br /&gt;which are really pretty nice,&lt;br /&gt;&lt;br /&gt;and some other improvements:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Citris Gallery 2.8.2&lt;/b&gt;&lt;br /&gt;    &lt;ul&gt;        Partial Release (Image &amp;amp; Changes file only)&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://citrissrv2.eecs.berkeley.edu:8888/mantis/view.php?id=87&quot;&gt;Fixed bad bug that was often dumping ~4KB/second to log file.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://citrissrv2.eecs.berkeley.edu:8888/mantis/view.php?id=74&quot;&gt;Added heads-up navigation keys.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://citrissrv2.eecs.berkeley.edu:8888/mantis/view.php?id=49&quot;&gt;Cursor changes according to which part of EditBox it's over.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Various other improvements/fixes.&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-111825874953928425?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/06/small-new-release-good-stuff.html</link><guid>739f3d4754ea4fc71c8399d8ce4ab9fa</guid></item>
<item><title type="text">Heirarchy between gallery objects</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;you asked for it and now you almost get it!&lt;br /&gt;&lt;br /&gt;There's a new image/changes file here:&lt;br /&gt;&lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads.html&quot;&gt;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Primitives and VRML objects now have a new menu called 'heirarchy'&lt;br /&gt;which lets you make one object a child of another.&lt;br /&gt;&lt;br /&gt;This way you can group things together,&lt;br /&gt;like a vase on a table,&lt;br /&gt;and work with them conveniently.&lt;br /&gt;&lt;br /&gt;How to do it:&lt;br /&gt;&lt;br /&gt;this is admittedly real clumsy for now but:&lt;br /&gt;1. find the object you want to be the parent.&lt;br /&gt;2. heirarchy | select&lt;br /&gt;3. find the object you want to be the child&lt;br /&gt;4. heirarchy | make child of &lt;something&gt;&lt;br /&gt;&lt;br /&gt;there's also &quot;make me a child of nobody&quot;,&lt;br /&gt;orphanize children (makes them children of their grandparents).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;it seems to work with saving and loading of .ctrgal files,&lt;br /&gt;but that could use some testing..&lt;br /&gt;&lt;br /&gt;&lt;/something&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-111827574822974323?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/06/heirarchy-between-gallery-objects.html</link><guid>a5d782f3cd2dc5d3f9fbaf0642373a6f</guid></item>
<item><title type="text">one megapixel</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;We're looking at combining (live) tele-immersion data with the croquet gallery project.&lt;br /&gt;&lt;br /&gt;The tele-immersion data comes in the form of a huge point cloud: xyz, rgb per point,&lt;br /&gt;with millions of points. (~ 640x480x20 or so per frame at about 10Hz.)&lt;br /&gt;&lt;br /&gt;I did some initial tests to see if there's even a remotre feasability and discovered some interesting things:&lt;br /&gt;&lt;br /&gt;1. you can send at least a million points straight to openGL in an array.&lt;br /&gt;2. openGL can render at least a million point at slow but interactive rates, say 13Hz.&lt;br /&gt;3. openGL rendered big points faster than small points!&lt;br /&gt;   - with pointsize at 1, i got 9Hz, with pointsize at 15, i got 13Hz, very consistently.&lt;br /&gt;  Weird!&lt;br /&gt;&lt;br /&gt;some screenshots.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/onemegapixel/megapixel1.png&quot;&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/onemegapixel/megapixel1.png&quot; width=&quot;48%&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/onemegapixel/megapixel2.png&quot;&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/onemegapixel/megapixel2.png&quot; width=&quot;48%&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-111879170249069696?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/06/one-megapixel.html</link><guid>36e478edebbc5a2eb564d2c4bedce83a</guid></item>
<item><title type="text">New features, Release, Installer</title><description type="html">Have finally rolled Croquet into a Nullsoft installer package,&lt;br /&gt;which works great of Windows users.  Have continued to release .zip files&lt;br /&gt;for cross-platform users.&lt;br /&gt;&lt;br /&gt;New release out:&lt;br /&gt;&lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads.html&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It notably includes two new sample galleries which are content-lite &amp; -heavy, and a demo of the animated pointcloud tele-immersion stuff.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Just added ability to zoom-to an object, similar to TWindow's (but without facing you &quot;in front&quot; of the object, just close to the object.) it works nicely.  Thanks to Ed Boyce for lighting a fire under that one.&lt;br /&gt;&lt;br /&gt;Also added ability to put Markers on TPrimitives. This was also thanks to Ed, who is using the Sphere primitives to model a solar system, and i realized that one might want to annotate a planet.&lt;br /&gt;&lt;br /&gt;Animated point clouds have been added with pre-calculated geometrical summaries. Am beginning work on networking to dynamically pull in tele-immersion data.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Am at work now on an input dialog for Primitives,&lt;br /&gt;to allow numerical placement.  - Will probably generalize that for TGalleryBase objects.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112198848565141564?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/07/new-features-release-installer.html</link><guid>4f5f9f421780100ea27480ea5726c69e</guid></item>
<item><title type="text">Cloth again</title><description type="html">(related to &lt;a href=&quot;http://orionelenzil.blogspot.com/2005/08/vernet-cloth.html&quot;&gt;this&lt;/a&gt; previous post)&lt;br /&gt;&lt;br /&gt;I couldn't stay away from the cloth,&lt;br /&gt;so i've put together a change set which includes a decent demo.&lt;br /&gt;&lt;br /&gt;I added collision with spheres,&lt;br /&gt;and in addition added something which altho i'm sure it's been done, i've never seen, which is: not only does cloth make way for the sphere, it also pushes the sphere around. I've only ever seen fairly static objects which the cloth humbly obeys, but it's simple enough to additionally have the cloth push the sphere.&lt;br /&gt;&lt;br /&gt;The changeset files-in to a stock Croquet0.3 image, and is located here:&lt;br /&gt;&lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/cloth/ClothOxe.5.cs&quot;&gt;http://www.citris-uc.org/hosted/projects/ith/cloth/ClothOxe.5.cs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The changeset includes a pop-up menu with different preset situations.&lt;br /&gt;The presets run fairly fast (20 or 30Hz or so) on my 3.2GHz windows machine,&lt;br /&gt;&lt;b&gt;with the major caveat&lt;/b&gt; that performance seriously degrades over time. I'm not sure why this is. I think it may have something to do with squeak garbage collection.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/cloth/clothoxe1.jpg&quot;&gt;&lt;br /&gt;Pretty close to some initial conditions. It's billowing up because of 'wind'.&lt;br /&gt;The cloth is anchored along its four edges.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/cloth/clothoxe2.jpg&quot;&gt;&lt;br /&gt;A bit more billowing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/cloth/clothoxe3.jpg&quot;&gt;&lt;br /&gt;Holding a sphere. The sphere rolls around fairly nicely.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/cloth/clothoxe4.jpg&quot;&gt;&lt;br /&gt;One of 8 exciting preset scenes: A sphere bowling into a cloth which is anchored only along the top edge.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112535539739389641?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/08/cloth-again.html</link><guid>ea80e29163b938ee187d39112b2efbe1</guid></item>
<item><title type="text">getting it</title><description type="html">A month or so ago when i had been working with meta for a little bit&lt;br /&gt;i went and tried to meta-fy TEditBox so that it would be collaborative&lt;br /&gt;the way TDragger is.  I rapidly fell into a cats cradle of confusion,&lt;br /&gt;hanging images, etc etc.&lt;br /&gt;&lt;br /&gt;Last friday i decided to take another crack,&lt;br /&gt;and it took about half an hour and works great!&lt;br /&gt;&lt;br /&gt;Here's the changeset for any who're interested:&lt;br /&gt;&lt;br /&gt;&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://bugs.impara.de/view.php?id=883&quot;&gt;http://bugs.impara.de/view.php?id=883&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Also improved TTorus, giving it a snugly-fitting frameBox and a fun texture Twist parameter.&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/donut%20con%20twist.png&quot;&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-110841425175295190?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/02/getting-it.html</link><guid>1911f6e7c9430c67169eb34f3cff9c86</guid></item>
<item><title type="text">Collision Detection</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;Well i was not looking forward to reimplementing collision detection between the avatar and the gallery walls, especially as this time around the walls aren't parameterized as lines on the floor.&lt;br /&gt;&lt;br /&gt;Previously i basically just did 2D intersection, intersecting the line on the floor with the line representing the avatar's movement for this frame.&lt;br /&gt;&lt;br /&gt;This time i decided to try going at it the 'right' way and it worked great.&lt;br /&gt;&lt;br /&gt;The 'right' way of course is to transform the avatar into the wall's coordinate system and do the collision stuff there. It took a bit of flailing around, and the calls i ended up using seem rather like misnomers to me, but in the end it worked great.&lt;br /&gt;&lt;br /&gt;Here's the algo i ended up with:&lt;br /&gt;&lt;br /&gt;1. convert the avatar's position to wall-space.&lt;br /&gt;&lt;blockquote&gt;a1  _ geometry inverseGlobalTransform localPointToGlobal: avatar globalPosition.&lt;br /&gt;&lt;/blockquote&gt;2. extend the wall's extent by the avatar's extent.&lt;br /&gt;   (This is actually somewhat inaccurate unless you also transform the avatar's extent&lt;br /&gt;    out of the avatar's orientation and into the wall's orientation, but what the heck.)&lt;br /&gt;&lt;br /&gt;3. test if the avatar's position (in wall space) is outside the expanded wall extents.&lt;br /&gt;   if so, no collision.&lt;br /&gt;&lt;br /&gt;4. move the avatar outside of the wall.&lt;br /&gt;- I really shortcutted here. The walls are represented as just Cubes who are relatively thin in their Z component. So i just set the avatar's Z (still in wall space) component to be the expanded Z-extent of the wall. (Taking into account the sign of course). This seems to work really well.&lt;br /&gt;&lt;br /&gt;5. convert the modified wall-space avatar position back to global space:&lt;br /&gt;&lt;blockquote&gt;avatar translation: (geometry globalTransform localPointToGlobal: a1).&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;ta da!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-Also integrated Tao's contentBrowser, improved the menus, and done i don't know what all.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-110739025637719390?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/02/collision-detection.html</link><guid>b5a471dca7d6d3129593f3f4f65fc559</guid></item>
<item><title type="text">too much meta can be a bad thing</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;This afternoon i learned that too much meta can be a bad thing.&lt;br /&gt;&lt;br /&gt;In our software, you layout walls, and then add 'items' (think paintings) to the walls. This has all been done with meta-fied collaborativity in mind.&lt;br /&gt;&lt;br /&gt;I discovered that when connected, the AddItem method would work as intended on the machine which initiated the AddItem, but on the other machine (or, i presume, machines) a sort of bastard doppelganger of the item would be added in addition to the reglar one. &lt;br /&gt;That is, a nice textured picture would appear on the wall as intended, but an untextured duplicate would appear in the same place.&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;The correct item and the doppelganger would have the same teaObjectName, and thus of course have strange collaborative behaviour.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After some fooling around i learned that it was too much meta !&lt;br /&gt;&lt;br /&gt;Here's the basic code structure which caused the problem:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;----------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;TWall &gt;&gt; addItemWithFileName: fn&lt;br /&gt;  &quot;This method gets called from a user event, so it's not currently meta'd&quot;&lt;br /&gt;&lt;br /&gt;  item := self meta createNewItem.&lt;br /&gt;  item meta setUpStuff: fn.&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;TWall &gt;&gt; createNewItem&lt;br /&gt;  &quot;This is the &lt;span style=&quot;font-weight: bold;&quot;&gt;wrong&lt;/span&gt; way to do it - there should be no metas!&quot;&lt;br /&gt;  item := TItem meta new.&lt;br /&gt;  self meta addChild: item.&lt;br /&gt;  ^ item.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;----------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.. the solution was simply to remove the metas from createNewItem.&lt;br /&gt;&lt;br /&gt;- which is easy enough but somewhat intimidating,&lt;br /&gt;as i was under the impression that using meta while already 'inside' of meta was a safe thing to do. Is this not the case ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-110747864975799979?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/02/too-much-meta-can-be-bad-thing.html</link><guid>02d0d566148bf4de9a33b9e77c79f2af</guid></item>
<item><title type="text">Vernet Cloth</title><description type="html">Dave Faught pointed me to Thomas Jakobsen's article &quot;&lt;a href=&quot;http://www.gpgstudy.com/gpgiki/GDC%202001%3A%20Advanced%20Character%20Physics&quot;&gt;Advanced Character Physics&lt;/a&gt;&quot;, which was used by the guy who made the&lt;a href=&quot;http://www.pekkasandborg.com/portfolio/?id=2&quot;&gt; Falling Woman demo&lt;/a&gt;.&lt;br /&gt;Jakobsen writes about particle systems, a subject dear to my heart, and interestingly advocates using Vernet Integration rather than Euler. I've traditionally just gone with Euler because it's straight-forward.&lt;br /&gt;&lt;br /&gt;Review:&lt;br /&gt;&lt;br /&gt;In Euler,&lt;br /&gt;the basic per-frame per-particle process is something like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;position'     = position + velocity * dt.&lt;br /&gt;velocity'     = velocity + acceleration * dt.&lt;br /&gt;acceleration' = whatever.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;With Verner,&lt;br /&gt;instead of storing velocity, you store the previous position. And thus:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;position'     = position - positionOld + acceleration * dt^2.&lt;br /&gt;positionOld   = position.&lt;br /&gt;acceleration' = whatever.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- I have to confess i don't understand the derivation of that core line,&lt;br /&gt;but it seems to work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Jakobsen also gives a nice approximation for square root.&lt;br /&gt;&lt;br /&gt;So i thought i'd try out implementing the Cloth simulation outlined in Jakobsen's paper. Basically it's a triangular mesh with every edge a spring. Velocity of the nodes is not stored, but the previous position is.&lt;br /&gt;&lt;br /&gt;A very heavy part of the computation is calculating normals.&lt;br /&gt;For every node, i pre-compute a list of 2 pairs of other nodes (4 nodes total) which represent vectors to be cross-producted with each other. Essentially, for most nodes in the mesh, the node is the center of a hexagon and i calculate the normal as the cross-product of two of the hexagon's three obvious bisectors. The edges are special cases and work allright but not great, and i ignored the four corners.&lt;br /&gt;To speed up normal computation, i also only calculate every Nth normal per frame. When N is 3 or 4, this is a significant speedup.&lt;br /&gt;&lt;br /&gt;The simulation runs fairly well on my 3Ghz PC with about 25x25 nodes. Fairly well = about 20Hz or so.&lt;br /&gt;&lt;br /&gt;Here are the &lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads/ClothOxe1.zip&quot;&gt;change sets for the classes&lt;/a&gt;, and here is &lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery/downloads/ClothOxe1_image.zip&quot;&gt;an image file&lt;/a&gt; if you're in a hurry.&lt;br /&gt;&lt;br /&gt;Screenshots:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/cloth/cloth1.png&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/cloth/cloth2.png&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/cloth/cloth3.png&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/cloth/cloth4.png&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112430153284912063?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/08/vernet-cloth.html</link><guid>74280f683314a32dd75a5c8e89409144</guid></item>
<item><title type="text">CInputFieldWithReset</title><description type="html">I seem to be writing small Tweak classes lately.&lt;br /&gt;&lt;br /&gt;This afternoon added &quot;CInputFieldWithReset&quot; to allow users to easily reset the values in the primitive properties editor dialog.&lt;br /&gt;&lt;br /&gt;This object is available here: &lt;a href=&quot;http://bugs.impara.de/view.php?id=1598&quot;&gt;http://bugs.impara.de/view.php?id=1598&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112302652826696177?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/08/cinputfieldwithreset.html</link><guid>4e0b06596298b4a8b3ca655f3824720d</guid></item>
<item><title type="text">Another New Version of the Gallery Released</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;.. I think i need to change the title of this blog to something more like &quot;Release Notices&quot;.&lt;br /&gt;&lt;br /&gt;In any event,&lt;br /&gt;Tao and i have been working steadily on the Gallery software&lt;br /&gt;and finally decided to let loose with a beta release of what we've got.&lt;br /&gt;&lt;br /&gt;You can download it &lt;a href=&quot;http://www.citris-uc.org/hosted/projects/ith/gallery/software.html&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;Citris Gallery 2.8.0&lt;/b&gt;&lt;br /&gt;     &lt;ul&gt;        Beta Release&lt;br /&gt;      Many, many new features. (Some of these have links to more info)&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Tweak UI&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Load &amp; Save to XML&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://citrissrv2.eecs.berkeley.edu:8888/mantis/view.php?id=18&quot;&gt;Manipulate lights&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Primitives&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://citrissrv2.eecs.berkeley.edu:8888/mantis/view.php?id=6&quot;&gt;Change wall &amp;amp; floor textures&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Portals to other Spaces!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://citrissrv2.eecs.berkeley.edu:8888/mantis/view.php?id=49&quot;&gt;Improved TEdit Box&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Improved VRML Loading&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Changeable Avatars&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Spinning Objects&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://citrissrv2.eecs.berkeley.edu:8888/mantis/view.php?id=40&quot;&gt;Patch for locked-down firewalls&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;More included Content&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://citrissrv2.eecs.berkeley.edu:8888/mantis/main_page.php&quot;&gt;.. and so much more!&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-111663203105612150?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/05/another-new-version-of-gallery.html</link><guid>8159d88efa69d7360dc8b2e5179d2413</guid></item>
<item><title type="text">Navigation Buttons</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;We've been kicking around the idea for a while of putting some heads-up buttons on the screen for navigation. That is, buttons to press for 'forward', 'back' etc.&lt;br /&gt;&lt;br /&gt;Watching a new user yesterday struggle with the QWE/ASD keyboard navigation (mouse navigation was even harder) i decided to add it in sooner rather than later.&lt;br /&gt;&lt;br /&gt;So there's now 6 floating overlay buttons which mirror the layout of QWE/ASD.&lt;br /&gt;When you mouse-click a button, the expected thing happens.&lt;br /&gt;&lt;br /&gt;But what's really good, i think, is that when you press or release a key on the keyboard, these buttons reflect that. It's a very nice visual feedback.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/navbuttons.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-111697018193492712?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/05/navigation-buttons.html</link><guid>7b78c396e60fc8839eb2ff2b5ad6f7b6</guid></item>
<item><title type="text">New Version of Gallery Released</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;Well it's far from finished&lt;br /&gt;but our rewrite of the Digitial Gallery software&lt;br /&gt;has reached a point where we'd like to share it!&lt;br /&gt;&lt;br /&gt;Documentation and download are available here:&lt;br /&gt;http://www.citris-uc.org/hosted/projects/ith/gallery&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you used the first version at all,&lt;br /&gt;we think you'll be much happier with this one.&lt;br /&gt;We certainly are.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Additions &amp; Improvements:&lt;br /&gt;&lt;br /&gt;* Gallery design is now entirely in the 3D world,&lt;br /&gt;  no more split 2D/3D business.&lt;br /&gt;&lt;br /&gt;* Collaboration Actually Works!&lt;br /&gt;&lt;br /&gt;* 3D Annotations.&lt;br /&gt;&lt;br /&gt;* VRML model loading.&lt;br /&gt;&lt;br /&gt;* Overall streamlining, improved ease-of-use, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ideas, suggestions, criticism, and bug reports are always welcome-&lt;br /&gt;please use the links at the bottom of the project's web page.&lt;br /&gt;&lt;br /&gt;We've also started an online forum for users of the software,&lt;br /&gt;please feel free to ask questions or report bugs there:&lt;br /&gt;http://makephpbb.com/phpbb/?mforum=citrisgallery&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Best Regards,&lt;br /&gt;&lt;br /&gt;Ruzena, Tao &amp;amp; Orion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-111059071617378442?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/03/new-version-of-gallery-released.html</link><guid>dcb596a912ecea38d121c08a1da0e6d2</guid></item>
<item><title type="text">Collision Refinements &amp; Smalltalk Gripe</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;First, the smalltalk gripe: The syntax for boolean logic is just ugly.&lt;br /&gt;Compare smalltalk and 'C' here:&lt;br /&gt;&lt;br /&gt;(x &lt;= y and: [x &lt;= z]) ifTrue:&lt;br /&gt;&amp;nbsp;&amp;nbsp;[foo := 10.].&lt;br /&gt;vs.&lt;br /&gt;if (x &lt;= y &amp;amp;&amp; x &lt;= z)&lt;br /&gt;&amp;nbsp;&amp;nbsp;foo = 10;&lt;br /&gt;&lt;br /&gt;or, worse horrors, here:&lt;br /&gt;&lt;br /&gt;(a &lt; b and: [a &lt; c and: [a &lt; d]] ifTrue:&lt;br /&gt;&amp;nbsp;&amp;nbsp;[aIsSmall := true.].&lt;br /&gt;vs.&lt;br /&gt;if (a &lt; b &amp;amp;&amp; a &lt; c &amp;amp;&amp; a &lt; d)&lt;br /&gt;&amp;nbsp;&amp;nbsp;aIsSmall = true;&lt;br /&gt;&lt;br /&gt;in both cases, it's pretty easy to tell at a glance what's going on in the 'C' code, whereas the smalltalk code requires you to actually count the brackets etc.&lt;br /&gt;true, i've only barely cut my teeth on smalltalk and have years of 'C' under the belt, but i think there's no denying that smalltalk obsfucates boolean algebra.&lt;br /&gt;&lt;br /&gt;On to Collisions!&lt;br /&gt;&lt;br /&gt;So in the previous post i referred to a shortcut i took in assuming that the avatar needed to be pushed out in the local Z direction, which was more or less valid for cubes which are relatively thin in Z. But i expanded it to do the test for which face of the cube the avatar is closest to, and push it out along that face instead, which works nicely for all faces.&lt;br /&gt;&lt;br /&gt;I also noticed that the rabbit avatar is *not* spherical in extent, and therefor the amount by which the wall extents are expanded should really take into account the orientation of the avatar, which is achieved via this line:&lt;br /&gt;gex _ geometry extent + (geometry inverseGlobalOrientation localPointToGlobal: avatar extent) abs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;that's all for now.&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-110746438209177433?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/02/collision-refinements-smalltalk-gripe.html</link><guid>4d8fe70516404a98bcf4e113555a3191</guid></item>
<item><title type="text">Byte Color Components versus Floats</title><description type="html">The tele-immersion data sets are point-clouds where each point has XYZ and RGB information. Previously, each of component of XYZ and RGB have been floats.&lt;br /&gt;However, since colors are eventually converted to 8-bit components, RGB could be 3*8 bits instead of 3*32 bits.&lt;br /&gt;&lt;br /&gt;Below is a comparison of tele-immersion data with 7-bit* color components versus 32-bit floats. Basically it looks fine. The 7-bit file is 2,004,809 bytes, and the float file is 3,207,668 bytes, so the ration is about 5/8!&lt;br /&gt;&lt;br /&gt;Future directions:&lt;br /&gt;I'd assumed that OpenGL required float data for XYZ information,&lt;br /&gt;but i just checked and GLVertex3s is a call for specifiying XYZ with 'GLShort' components, which i presume are 16-bit. If we're able to get that to work, the data would go from 64 bits per point to only 24 bPP, or a ratio of 3/8.&lt;br /&gt;&lt;br /&gt;Current streaming speeds indicate a theoretical maximum frame rate of about 6Hz with 64bPP, so that maximum could go up to about 16Hz, which is much more appealing.&lt;br /&gt;&lt;br /&gt;On the resolution of 16-bit spacial information:&lt;br /&gt;16 bits has a resolution of one part in 65,000.&lt;br /&gt;The tele-immersion &quot;playpen&quot; is approximately 10 feet in each dimension, which translates to a 16-bit resolution of about .002 inches, or about .05 millimeters, which is pretty good.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/bytecolors/7bitfloatcomparison.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;* For some reason, OpenGL via Croquet interprets byte color components as being in the range 0-127, not 0-255. Values over 127 are clamped to zero. See &lt;a href=&quot;http://bugs.impara.de/view.php?id=1684&quot;&gt;http://bugs.impara.de/view.php?id=1684&lt;/a&gt;.&lt;br /&gt;edit: Bert Freudenberg has clued me in that GLBYTE is a signed value; i want GLUNSIGNEDBYTE or equivelant. Thanks Bert !&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112449350990084462?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/08/byte-color-components-versus-floats.html</link><guid>b37af130b4078516e9025933763d29cf</guid></item>
<item><title type="text">Using Shorts for spacial Coordinates</title><description type="html">The teleimmersion project generates huge point-cloud datasets,&lt;br /&gt;with approximately 100,000 points per frame, each point having XYZ and RGB data.&lt;br /&gt;&lt;br /&gt;In the interest of increasing the performance of (future) streaming of this data from the source machines into a target machine running croquet, i've been working on simply reducing the precision of the data.&lt;br /&gt;&lt;br /&gt;I assume a maximum streaming thruput of 18MB per second, based on tests streaming within my own computer.&lt;br /&gt;&lt;br /&gt;Originally, XYZ and RGB were each represented as triples of four-byte floats.&lt;br /&gt;So, 3 * 4 + 3 * 4 = 24 bytes per point * 100,000 = 2.4MB per frame -&gt; up to  7.5Hz.&lt;br /&gt;&lt;br /&gt;RGB is an obvious target, since rendering cards at their base level can only handle colors with single-byte components.&lt;br /&gt;&lt;br /&gt;So i made an option to represent the RGB values as triples of single-byte components.&lt;br /&gt;So, 3 * 4 + 3 * 1 = 15 bytes per point * 100,000 = 1.5MB per frame -&gt; up to 12.0Hz&lt;br /&gt;&lt;br /&gt;I'm nearly finished with an option to represent the XYZ values as triples of two-byte signed shorts.&lt;br /&gt;So, 3 * 2 + 3 * 1 =  9 bytes per point * 100,000 = 0.9MB per frame -&gt; up to 20.0Hz&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is a screenshot showing three different types of representations.&lt;br /&gt;Random-point placement aside, they look pretty much identical.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.citris-uc.org/hosted/projects/ith/screenshots/shortxyz/shortxyz1.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Implementation Issues&lt;br /&gt;---------------------&lt;br /&gt;&lt;br /&gt;Changing to single-byte color components was relatively straight-forward.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Changing to two-byte spacial components&lt;/b&gt; has been a bit trickier.&lt;br /&gt;OpenGL is perfectly happy being passed GLShorts for spacial data;&lt;br /&gt;the card must be converting them to floats before running them thru the graphics pipeline. I haven't yet tested for performance issues here, but i don't expect any.&lt;br /&gt;More complicated however is that Croquet of course works with B3DVector3, which is based on B3DFloatArray,which is based on FloatArray, which is of course, Floats.&lt;br /&gt;Furthermore, Squeak doesn't even have a ShortArray!&lt;br /&gt;What Squeak does have is ByteArray, which has convenience methods for accessing pairs of elements as shorts. (and longs, if you're in to that sort of thing)&lt;br /&gt;So the data can be accessed for purposes such as finding bounding boxes and doing calculations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Dealing with Scaling&lt;/b&gt; is so far definitely the trickiest issue.&lt;br /&gt;Croquet does not use the usual scale feature of transformation matrices; rather it requires the actual vertices to be actually changed. David Smith once explained to me that this is to enable/simplify picking thru portals, if i recall correctly. In any event, i felt that reimplementing scale as a per-point conversion, multiplication, and unconversion would be prohibitively slow. So i'm trying out just putting scale right in the matrix.  The sphere on the far right has been scaled this way.  So far it's working well altho there must be some remaining issues with bounding box, as a TEditBox no longer works with the byte-spatial-components pointclouds. I'm about to look at this.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112613819345440970?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/09/using-shorts-for-spacial-coordinates.html</link><guid>7ac4133e646dfc143f87d9aa28c093f7</guid></item>
<item><title type="text">gallery mark 2 demo available</title><description type="html">&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;a href=&quot;http://citris-uc.org/hosted/projects/ith/gallery/mark2demo.html&quot;&gt;http://citris-uc.org/hosted/projects/ith/gallery/mark2demo.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tao and I felt like showing the new version of the gallery in its current state, in hopes of getting feedback etc. This demo is of more interest i think to the Croquet development community than to the actual target users of the software, which are humanities academics.&lt;br /&gt;&lt;br /&gt;We're especially looking for feedback in these areas&lt;br /&gt;&lt;br /&gt;* does it run ?&lt;br /&gt;   * what sort of framerate (and system description)&lt;br /&gt;&lt;br /&gt;* does it run collaboratively ?&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;   * what sort of framerate (and system description)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;* how's the interface ?&lt;br /&gt;   * menus&lt;br /&gt;   * overhead view ('!' button | views | dual view)&lt;br /&gt;   * manipulating walls&lt;br /&gt;&lt;br /&gt;any thought you have are highly welcome.&lt;br /&gt;please email starbow@eecs.berkeley.edu or oxe@eecs.berkeley.edu.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-110755220368816197?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/02/gallery-mark-2-demo-available.html</link><guid>886af99f7a54b8b721f450f04182b4d9</guid></item>
<item><title type="text">Fond Adieu.</title><description type="html">&lt;font face= arial&gt;&lt;br /&gt;I think this is probably the last post for this blog.&lt;br /&gt;&lt;br /&gt;I've taken a new position as a physics research assistant at the south pole of the earth, where i'll be from about mid-october 2005 thru november, 2006.&lt;br /&gt;There's more info (and a blog) here: &lt;a href=&quot;http://www.elenzil.com/ohpolar&quot;&gt;http://www.elenzil.com/ohpolar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's been a pleasure working with the Croquet community, and i hope to stay in touch. I'll definitely continue following the Croquet scene from down there, but i doubt i'll have time to do much more than dabble.&lt;br /&gt;&lt;br /&gt;best,&lt;br /&gt;Orion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9100018-112835899138478094?l=orionelenzil.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://orionelenzil.blogspot.com/2005/10/fond-adieu.html</link><guid>7040f05b4775ddb0ca8fb9113a404cf1</guid></item>
<item><title type="text">New Posting . . . At Last</title><description type="html">First, I apologize for not blogging for such a long while.  Like everyone else involved in Croquet, I've been juggling full-time responsibilities at work with dedication to the Croquet cause.  Okay, no excuses.  &lt;br /&gt;&lt;br /&gt;The Third International Conference on Creating, Connecting and Collaborating through Computing (C5 2005) conference in Kyoto, Japan was a great opportunity to make progress on the Wisconsin/Minnesota plan to build an international alliance of educational institutions around the Croquet Project.  Much more on this in later postings.&lt;br /&gt;&lt;br /&gt;While Mark and Julian demonstrated new interface elements geared towards making the Croquet experience as intuitive as possible for educators and their students, I presented on &quot;Croquet and Higher Education.&quot;  I spoke to a growing realization at the highest levels of the American academic technology community that commercial course management systems will never touch the heart of education -- teaching and scholarship -- in a transformative way.  Our colleagues in Japan agreed.&lt;br /&gt;&lt;br /&gt;After all, the CMS was never meant to support innovative teaching practice.  It was intended as an administrative container or set of containers for course management (connoting efficiency and restraint).  Regardless of the number of improvements grafted onto the CMS platform, the conceptual framework will always give primacy to administrative matters over pedagogical experimentation.  &lt;br /&gt;&lt;br /&gt;In point of fact, we have been far too easy to please until now, but as greater and greater numbers of faculty members commit themselves to using CMSs, vendors are likely to be confronted with a considerably less pliable customer base. To put it bluntly, its about time we (e.g. universities, colleges, academic technologists and educators) learned to feed ourselves.  After all, give a man [sic] a fish; you have fed him for today.  Teach a man to fish, and you have fed him for a lifetime. &lt;br /&gt;&lt;br /&gt;One powerful organization that agrees with this argument is NLII, the National Learning Infrastructure Initiative of the Educause organization.  In fact, NLII will soon be renamed to reflect a new strategic focus on the neo-millennial learner and how to address that learner's needs through emerging technologies.   Croquet is going to be a large part of that focus, I'm sure.&lt;br /&gt;&lt;br /&gt;So here's an ANNOUNCEMENT -- check out the upcoming March/April issue of Educause Review for my column &quot;Standing on the Plateau,&quot; which introduces Croquet to univerity CIOs, Chancellors, Provosts, and the like.  You'll also find a link to a longer version published online by NLII.  The extended article will also be available for download on the Croquet Project site's &quot;Whitepaper&quot; page.  &lt;br /&gt;&lt;br /&gt;When you have a chance to read the article, we'd really appreciate your feedback.  Post your comments to my blog.  Thanks!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8747177-110926214076203335?l=croquet4education.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquet4education.blogspot.com/2005/02/new-posting-at-last.html</link><guid>ed1b6bec7c2464dc3c0e64e83d0c87a2</guid></item>
<item><title type="text">In-depth review of XO in German c't magazine</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp2.blogger.com/_gCu9ub99Rz4/Rf--bJVJK5I/AAAAAAAAACE/3PDaDQgmOwA/s1600-h/xo-sophie.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;http://bp2.blogger.com/_gCu9ub99Rz4/Rf--bJVJK5I/AAAAAAAAACE/3PDaDQgmOwA/s200/xo-sophie.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5043959481248590738&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;There's a glowing review of the OLPC project and its XO machine in the current issue 07/2007 of &lt;a href=&quot;http://www.heise.de/ct/&quot;&gt;c't magazine&lt;/a&gt;. The &lt;a href=&quot;http://www.heise-medien.de/presseinfo.php/ct,07,03_19_a/41&quot;&gt;in-depth article&lt;/a&gt; by Dr. Jrgen 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:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.heise-medien.de/presseinfo.php/ct,07,03_19_a/41&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;http://bp0.blogger.com/_gCu9ub99Rz4/Rf-74pVJK4I/AAAAAAAAAB8/O35rnaEV4So/s400/xo-microscope.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5043956689519848322&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;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 &lt;a href=&quot;http://wiki.laptop.org/go/Sugar_EToys&quot;&gt;Etoys&lt;/a&gt; projects.&lt;br /&gt;&lt;br /&gt;The magazine is available now at kiosks until next week, or via &lt;a href=&quot;https://www.heise.de/abo/ct/hefte.shtml&quot;&gt;mail order&lt;/a&gt;. In a few weeks the article should be available online via &lt;a href=&quot;http://www.heise.de/kiosk/&quot;&gt;click&amp;amp;buy&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-8878669578234706031?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/03/in-depth-review-of-xo-in-german-ct.html</link><guid>b90b3392dc5dca2b5cc9b5e447b2fca8</guid></item>
<item><title type="text">Peaceful Holidays ...</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_gCu9ub99Rz4/SU-n5JYaFiI/AAAAAAAAAEg/IJKvGNdfm10/s1600-h/xo-hugger.jpg&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 200px;&quot; src=&quot;http://4.bp.blogspot.com/_gCu9ub99Rz4/SU-n5JYaFiI/AAAAAAAAAEg/IJKvGNdfm10/s320/xo-hugger.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5282625488141555234&quot; /&gt;&lt;/a&gt;&lt;div&gt;... and a Happy 2009 to everyone from me and my family.&lt;/div&gt;&lt;div&gt;Presented by my XO-hugging &lt;a href=&quot;http://shop.ebay.de/?_nkw=usb+%28marsfigur%2Cgummimensch%29&quot;&gt;USB men&lt;/a&gt; (who seem to have more memory capacity than me at times).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Featuring a seriously tree-infested Etoys project, with snow (for those living south who cannot enjoy the white fluff this time of the year).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And see you at &lt;a href=&quot;http://events.ccc.de/congress/2008/wiki/OLPC&quot;&gt;25C3&lt;/a&gt; I hope!&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-2752971592019279550?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2008/12/peaceful-holidays.html</link><guid>552cf8f6930a52749860fd0be6dae33c</guid></item>
<item><title type="text">OLPC review now online, English too</title><description type="html">The extensive OLPC article by c't magazine is now available online in both original &lt;a href=&quot;http://www.heise.de/mobil/artikel/88439&quot;&gt;German&lt;/a&gt; and an &lt;a href=&quot;http://www.heise.de/mobil/artikel/88916&quot;&gt;English translation&lt;/a&gt;. 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.&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.heise.de/mobil/artikel/88916/3&quot;&gt;&lt;img style=&quot;margin: 10px; float: left;&quot; src=&quot;http://bp3.blogger.com/_gCu9ub99Rz4/RijDniTPsPI/AAAAAAAAACo/Y3U24qclhCM/s320/1.jpeg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5055505665713221874&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-2848720280456903502?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/04/olpc-review-now-online-english-too.html</link><guid>15c1f5030c4ee546125c39a107fea230</guid></item>
<item><title type="text">Etoys kid-tested on XO</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp0.blogger.com/_gCu9ub99Rz4/RbPn6l8B_mI/AAAAAAAAABI/Us45v3XKeng/s1600-h/OLPCSophie2.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;&quot; src=&quot;http://bp0.blogger.com/_gCu9ub99Rz4/RbPn6l8B_mI/AAAAAAAAABI/Us45v3XKeng/s200/OLPCSophie2.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5022613003250564706&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;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.&lt;br /&gt;&lt;br /&gt;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 &quot;forward by&quot; and &quot;bounce&quot; tiles in a tiny two-line script making it move around. I made the mistake of pointing out that the &quot;bounce&quot; tile can produce some noise when bouncing. Endless fun trying the different noises ensued. Oh well.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp1.blogger.com/_gCu9ub99Rz4/RbPn618B_nI/AAAAAAAAABQ/eDfr0-fxWAo/s1600-h/OLPCSophieJakob2.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10pt 10px 0px; float: left; cursor: pointer;&quot; src=&quot;http://bp1.blogger.com/_gCu9ub99Rz4/RbPn618B_nI/AAAAAAAAABQ/eDfr0-fxWAo/s200/OLPCSophieJakob2.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5022613007545532018&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;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 &quot;cow girl&quot;.  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 ...&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-2513343767600019122?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/01/etoys-kid-tested-on-xo.html</link><guid>64040990d85a4902da42610bd02d6380</guid></item>
<item><title type="text">OLPC talk at design school</title><description type="html">I gave a talk about the $100-laptop at the Magdeburg school of &lt;a href=&quot;http://www.gestaltung.hs-magdeburg.de/&quot;&gt;Industrial Design&lt;/a&gt;. 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.&lt;br /&gt;&lt;br /&gt;Carola Zwick, dean of the school, wrote a book &lt;a href=&quot;http://www.avabooks.com.sg/avauk/details.php?id=107&quot;&gt;Designing for Small Screens&lt;/a&gt; that certainly gives valuable insight for OLPC developers, and she provided (though indirectly) some very important infrastructure for the OLPC office: her &lt;a href=&quot;http://www.seven5.com/&quot;&gt;group&lt;/a&gt; designed the &lt;a href=&quot;http://www.hermanmiller.com/mirra/&quot;&gt;chairs&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;A student took some &lt;a href=&quot;http://www.wretch.cc/album/album.php?id=hangxdesign&amp;book=34&amp;amp;page=1&quot;&gt;photographs&lt;/a&gt; during the talk. Also, from his &lt;a href=&quot;http://hangxdesign.blogspot.com/2007/01/the100-dollar-laptop.html&quot;&gt;blog post&lt;/a&gt; it seems I convinced him of the merits of the OLPC project (it was a lively discussion). Thanks for posting, Cheng!&lt;a href=&quot;javascript:void(0)&quot; onclick=&quot;return false;&quot; tabindex=&quot;7&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-6570186759354313299?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/01/olpc-talk-at-design-school.html</link><guid>8a1363728120302e635be27b6d57b3e8</guid></item>
<item><title type="text">Sophie, Tweak on the OLPC laptop</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp2.blogger.com/_gCu9ub99Rz4/RaZekV8B_kI/AAAAAAAAAAk/6P8mXeoRYL8/s1600-h/SophieOnXO-2.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: right; cursor: pointer;&quot; src=&quot;http://bp2.blogger.com/_gCu9ub99Rz4/RaZekV8B_kI/AAAAAAAAAAk/6P8mXeoRYL8/s320/SophieOnXO-2.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5018802813208231490&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;I just installed &lt;a href=&quot;http://sophieproject.org/&quot;&gt;Sophie&lt;/a&gt; on my green machine. Sophie is a project of the &lt;a href=&quot;http://www.futureofthebook.org/&quot;&gt;Institute for the Future of the Book&lt;/a&gt;, is implemented in &lt;a href=&quot;http://squeak.org/&quot;&gt;Squeak&lt;/a&gt; (just like my &lt;a href=&quot;http://wiki.laptop.org/go/Etoys&quot;&gt;Etoys activity&lt;/a&gt; on the laptop) using &lt;a href=&quot;http://tweak.impara.de/&quot;&gt;Tweak&lt;/a&gt; as its UI framework (which is the original topic of my blog). Tweak is also the base for the next-gen Etoys.&lt;br /&gt;&lt;br /&gt;Installation went pretty smooth. I downloaded the cross-platform zip file using the  Web activity from Sugar&lt;br /&gt;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!&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Michael Rger of &lt;a href=&quot;http://impara.de/&quot;&gt;impara&lt;/a&gt; (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:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp2.blogger.com/_gCu9ub99Rz4/RaZooV8B_lI/AAAAAAAAAAs/PEvYnG3fCKQ/s1600-h/SophieOnXO-1.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;http://bp2.blogger.com/_gCu9ub99Rz4/RaZooV8B_lI/AAAAAAAAAAs/PEvYnG3fCKQ/s320/SophieOnXO-1.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5018813877043986002&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-2070333274906015010?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/01/sophie-tweak-on-olpc-laptop.html</link><guid>00686e5e2137246fb381af6775f47a55</guid></item>
<item><title type="text">Stripped XO</title><description type="html">Early in January, my laptop was the star of a photo shooting for the German issue of MIT's Technology Review&lt;a href=&quot;http://www.heise.de/tr/magazin/&quot;&gt;&lt;/a&gt;. We took off the plastic enclosure of the &quot;brick&quot;, it was pretty interesting, for example to see how the whole display in its metallic housing is carefully held by rubber mounts.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp0.blogger.com/_gCu9ub99Rz4/Rb_Dql8B_oI/AAAAAAAAABg/377aeAeQpRg/s1600-h/xostripped.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 0pt 0px 0px; float: center; cursor: pointer;&quot; src=&quot;http://bp0.blogger.com/_gCu9ub99Rz4/Rb_Dql8B_oI/AAAAAAAAABg/377aeAeQpRg/s320/xostripped.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5025950845674585730&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Image courtesy of &lt;a href=&quot;http://www.heise.de/tr/magazin/&quot;&gt;http://www.heise.de/tr/magazin/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot; &gt;&lt;span style=&quot;color: rgb(102, 102, 102);&quot;&gt;The colors are off for some reason after uploading to blogger - they were fine on my disk. Sorry.&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-2140132911973763292?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/01/stripped-xo.html</link><guid>1e9a89ecec12bf5fe18cf3403be6c77c</guid></item>
<item><title type="text">Be a magician</title><description type="html">A very nice post about the &lt;a href=&quot;http://peripateticaxiom.blogspot.com/2006/04/keywords-magic-and-edsls.html&quot;&gt;Magic of Smalltalk&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-114444221679527345?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/04/be-magician.html</link><guid>2f3ef1ef8f87b9647b83f3ff0ba3093d</guid></item>
<item><title type="text">OLPC video from NECC</title><description type="html">Just found a nice &lt;a href=&quot;http://www.youtube.com/watch?v=UvpP3Farb2g&quot;&gt;video on youtube&lt;/a&gt; about the $100 laptop at &lt;a href=&quot;http://web.uoregon.edu/ISTE/NECC2006/&quot;&gt;NECC 06&lt;/a&gt;, including a cameo of our very own Kim Rose (at 3:21) while the speaker is mentioning &quot;creativity&quot; - very apt, I'd say.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-116153400875766976?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/10/olpc-video-from-necc.html</link><guid>f9ab5f16daa9756d8035f3a399e0e29e</guid></item>
<item><title type="text">Performance Profiling</title><description type="html">Andreas Raab wrote a &lt;a href=&quot;https://lists.wisc.edu/read/messages?id=1411189&quot;&gt;nice primer&lt;/a&gt; on profiling in Squeak. MessageTally might be the single most undervalued Squeak performance tool - a mandatory read for every serious developer.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-115952747167731510?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/09/performance-profiling.html</link><guid>9e83b23b23db8c0a9656f191b4d92f0e</guid></item>
<item><title type="text">European grassroots meeting</title><description type="html">&lt;div&gt;I went to Brussels last weekend, meeting with folks from OLPC Europe, OLPC Boston, and some other European grassroots (me representing &lt;a href=&quot;http://olpc-deutschland.de/&quot;&gt;OLPC Germany e.V.&lt;/a&gt;). We mostly discussed how to implement the new &lt;a href=&quot;http://laptop.org/global&quot;&gt;Give-1-Get-1&lt;/a&gt; program as well as &lt;a href=&quot;http://laptop.org/en/participate/give-many.shtml&quot;&gt;Give-many&lt;/a&gt;here in Europe. Some &lt;a href=&quot;http://wiki.laptop.org/go/Grassroots_meetings/November_29%2C_2008&quot;&gt;notes&lt;/a&gt; are available.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href=&quot;http://squeakland.org/launcher/?http://freudenbergs.de/bert/etoys/OLPC-Europe.pr&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 137px;&quot; src=&quot;http://4.bp.blogspot.com/_gCu9ub99Rz4/STmmDZO3mvI/AAAAAAAAAEY/OtX8h4w0mN0/s200/OLPC-Europe.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5276431015684315890&quot; /&gt;&lt;/a&gt;And, while sitting together at a nice Cafe on Sunday I made this little Etoys project to celebrate OLPC Europe. Just click &lt;a href=&quot;http://squeakland.org/launcher/?http://freudenbergs.de/bert/etoys/OLPC-Europe.pr&quot;&gt;here&lt;/a&gt; if you are on an &lt;a href=&quot;http://laptop.org/&quot;&gt;XO&lt;/a&gt; or have the &lt;a href=&quot;http://squeakland.org/&quot;&gt;Squeakland&lt;/a&gt;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.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the Etoyers out there - if you put a copy of a player in one of its own variables repeatedly, this creates an evergrowing &quot;linked list&quot; of player copies. Bad idea. Reset the variable first (by assigning dot for example) then do the copy: see my example.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-364282043877713009?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2008/12/european-grassroots-meeting.html</link><guid>e53769c3021a034babbdc2e82f6ad864</guid></item>
<item><title type="text">Emulating the latest stable OLPC XO software</title><description type="html">Even with XO laptops &lt;a href=&quot;http://laptop.org/global&quot;&gt;readily available now&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;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 &lt;a href=&quot;http://lists.laptop.org/pipermail/devel/2008-December/021591.html&quot;&gt;reportedly&lt;/a&gt; does record video), and a &quot;Sugar restart&quot; does not actually restart Sugar, but apart from that it seems fully functional, and much nicer than the emulations I had used to date.&lt;br /&gt;&lt;br /&gt;Click to see actual screenshots (calibrated to match the XO's physical extent using the Ruler activity on my MBP's &lt;a href=&quot;http://members.ping.de/%7Esven/dpi.html&quot;&gt;110 ppi&lt;/a&gt; screen):&lt;div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://dev.laptop.org/%7Ebert/Ruler-emulated.png&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 120px; height: 105px;&quot; src=&quot;http://dev.laptop.org/%7Ebert/Ruler-emulated.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://dev.laptop.org/%7Ebert/Home-emulated.png&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 120px; height: 105px;&quot; src=&quot;http://dev.laptop.org/%7Ebert/Home-emulated.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://dev.laptop.org/%7Ebert/Journal-emulated.png&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 120px; height: 105px;&quot; src=&quot;http://dev.laptop.org/%7Ebert/Journal-emulated.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;/a&gt;&lt;img style=&quot;cursor: pointer; width: 120px; height: 105px;&quot; src=&quot;http://dev.laptop.org/%7Ebert/TamTamMini-emulated.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;br /&gt;And here you can get that virtual machine (665 MB, 2 GB unzipped): &lt;a href=&quot;http://dev.laptop.org/%7Ebert/VMWare-8.2-767-bf.zip&quot;&gt;VMWare-8.2-767-bf.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I made this using &lt;a href=&quot;http://www.vmware.com/products/fusion/&quot;&gt;VMWare Fusion&lt;/a&gt;, 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.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Update:&lt;/span&gt; Reportedly it does work in &lt;a href=&quot;http://www.vmware.com/products/player/&quot;&gt;VMWare Player&lt;/a&gt; on Windows and Linux, too (see comments). And maybe someone can make an appliance for even easier use?&lt;br /&gt;&lt;br /&gt;(*) Now to the hoops:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I started with the 767/ext3 image from &lt;a href=&quot;http://download.laptop.org/xo-1/os/official/&quot;&gt;http://download.laptop.org/xo-1/os/official/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;extended to 2 GB by appending /dev/zero&lt;br /&gt;(jffs2 compression gives roughly 2 GB too)&lt;/li&gt;&lt;li&gt;enlarged the partition to full 2 GB&lt;br /&gt;(using fdisk and ext2resize)&lt;/li&gt;&lt;li&gt;mounted that in a Fedora 10 virtual machine&lt;br /&gt;&lt;/li&gt;&lt;li&gt;copied over the F10 kernel, initrd, and modules&lt;br /&gt;(olpc kernel wanted AMD instructions)&lt;/li&gt;&lt;li&gt;edited grub.conf to use that kernel&lt;br /&gt;&lt;/li&gt;&lt;li&gt;and appended a root=/dev/sda1 kernel arg&lt;br /&gt;(the fedora kernel wants to use LVM otherwise)&lt;/li&gt;&lt;li&gt;unmounted&lt;br /&gt;&lt;/li&gt;&lt;li&gt;created new virtual machine&lt;br /&gt;(that disk, 1 CPU, 256 MB RAM, NAT networking)&lt;/li&gt;&lt;li&gt;booted into that new system&lt;br /&gt;&lt;/li&gt;&lt;li&gt;installed Perl&lt;br /&gt;(for vmware tools installer)&lt;/li&gt;&lt;li&gt;installed vmware tools&lt;br /&gt;(to get the X driver)&lt;br /&gt;(but none of the kernel modules, would need make/gcc/etc.)&lt;/li&gt;&lt;li&gt;deleted Perl&lt;br /&gt;(to restore the default sw environment)&lt;/li&gt;&lt;li&gt;copied the existing xorg-vmware.conf to xorg.conf&lt;br /&gt;(to get 1200x900 resolution w/ 200 dpi)&lt;/li&gt;&lt;li&gt;booted into Sugar&lt;br /&gt;(looks really nice so scaled down)&lt;/li&gt;&lt;li&gt;installed activities&lt;br /&gt;(took a long time, maybe it's my DSL)&lt;/li&gt;&lt;li&gt;tested a bit&lt;br /&gt;&lt;/li&gt;&lt;li&gt;rm -r ~olpc/.sugar&lt;br /&gt;(to remove my personal data)&lt;/li&gt;&lt;li&gt;should have deleted sshd host keys, too, but didn't&lt;br /&gt;&lt;/li&gt;&lt;li&gt;shut down&lt;br /&gt;&lt;/li&gt;&lt;li&gt;zip&lt;br /&gt;&lt;/li&gt;&lt;li&gt;upload&lt;br /&gt;&lt;/li&gt;&lt;li&gt;...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;still no profit? ;)&lt;/li&gt;&lt;/ul&gt;Enjoy.&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-1100506158715727729?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2008/12/emulating-latest-stable-olpc-xo.html</link><guid>d32f2fcc1c2765e6b8620fb70176aa9c</guid></item>
<item><title type="text">Croquet SDK 1.0 released</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://croquetconsortium.org/&quot;&gt;&lt;img style=&quot;margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;&quot; src=&quot;http://bp0.blogger.com/_gCu9ub99Rz4/Rgk0fJVJK7I/AAAAAAAAACU/_YzlsRyHg6E/s200/Croquet-Logo-small.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5046622567130540978&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Get it while it's hot from the equally new &lt;a href=&quot;http://croquetconsortium.org/&quot;&gt;Croquet Consortium&lt;/a&gt; web site.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-3700814658261302983?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/03/croquet-sdk-10-released.html</link><guid>502a134d8afed5fe9d69ed939998d391</guid></item>
<item><title type="text">Sophie movies</title><description type="html">Steve is posting &lt;a href=&quot;http://www.geeksrus.com/sophie/&quot;&gt;screen clips&lt;/a&gt; of progress in Sophie (a.k.a. the Future of the Book), which is  developed in Squeak with a Tweak UI. It's looking nicer and nicer every week.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-114124831938825828?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/03/sophie-movies.html</link><guid>c1121f246078cbab9da148470f451dc1</guid></item>
<item><title type="text">Interactive OLPC XO Display Simulation</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://squeakland.org/project.jsp?http://freudenbergs.de/bert/etoys/OLPC-XO-Display.pr&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;http://bp1.blogger.com/_gCu9ub99Rz4/Resga6xtdFI/AAAAAAAAABs/6CGTXxZzVgM/s400/OLPC-XO-Display.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5038156254970475602&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Many people still have not seen the innovative display of the OLPC project's &quot;XO&quot; 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 &quot;color resolution&quot; 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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;For the interactive simulation, download &lt;a href=&quot;http://squeakland.org/detect.html&quot;&gt;Squeak&lt;/a&gt; (this version installs both, a regular application and a browser plugin), then &lt;a href=&quot;http://squeakland.org/project.jsp?http://freudenbergs.de/bert/etoys/OLPC-XO-Display.pr&quot;&gt;click here&lt;/a&gt; to run the simulation in your browser, or download the &lt;a href=&quot;http://freudenbergs.de/bert/etoys/OLPC-XO-Display.pr&quot;&gt;project file&lt;/a&gt;, launch Squeak, and drop the project into it.&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Intel-Mac users&lt;/span&gt; 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.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-5092299994185428197?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/03/interactive-olpc-xo-display-simulation.html</link><guid>e9ce049392c44f0124e04aab7b56a8df</guid></item>
<item><title type="text">Croquet for Business: Qwaq Forums</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://qwaq.com/&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;http://bp2.blogger.com/_gCu9ub99Rz4/RffMO0XO9MI/AAAAAAAAAB0/sSw1Tpzf7nQ/s400/Slide1_34pct.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5041722862810887362&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;So &lt;a href=&quot;http://qwaq.com/&quot;&gt;Qwaq&lt;/a&gt; came out of &quot;stealth-mode&quot; and reveiled what they have been working on  for a while now, &lt;a href=&quot;http://qwaq.com/qwaq_forums.html&quot;&gt;Qwaq Forums&lt;/a&gt;:&lt;br /&gt;&lt;blockquote style=&quot;font-style: italic;&quot;&gt;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.&lt;br /&gt;&lt;/blockquote&gt;And I'm proud to say I contributed a little, which most probably will find its way into the next &lt;a href=&quot;http://opencroquet.org/&quot;&gt;Croquet&lt;/a&gt; release.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Update: &lt;/span&gt;Here's a few nice stories of fellow bloggers who have seen Forums already.&lt;br /&gt;&lt;br /&gt;From Steve Borsch's &lt;a href=&quot;http://www.iconnectdots.com/ctd/2007/03/qwaq_launches_v.html&quot;&gt;Connecting The Dots&lt;/a&gt;:&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;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.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span class=&quot;post-author&quot;&gt;Glyn Moody&lt;/span&gt; writes on &lt;a href=&quot;http://opendotdotdot.blogspot.com/2007/03/going-quaqqers-about-quaq.html&quot;&gt;Open dot dot dot&lt;/a&gt;:&lt;br /&gt;&lt;a href=&quot;http://www2.blogger.com/post-edit.g?blogID=10460112&amp;postID=2510783906925727101#%20http://www.iconnectdots.com/ctd/2007/03/qwaq_launches_v.html&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;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.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;And in &lt;a href=&quot;http://collaborationblog.typepad.com/collaboration/2007/03/qwaq_exits_stea.html&quot;&gt;The Culture of Collaboration&lt;/a&gt;, Evan Rosen writes:&lt;br /&gt;&lt;blockquote style=&quot;font-style: italic;&quot;&gt;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.&lt;/blockquote&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-2510783906925727101?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/03/croquet-for-business-qwaq-forums.html</link><guid>fc9d2e92fcd06e2193bd8de4d68dbd7f</guid></item>
<item><title type="text">Squeak for every child</title><description type="html">&lt;img src=&quot;http://photos1.blogger.com/blogger/1210/665/400/olpc-squeak.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Lately I work on Squeak integration in the One Laptop Per Child (&lt;a href=&quot;http://laptop.org/&quot;&gt;OLPC&lt;/a&gt;) project, perhaps better known as the &quot;$100 laptop&quot;. The whole etoys group came over to OLPC's office in Cambridge. Squeak looks surprisingly well on the display prototype, and also etoys are reasonably fast. Ian Piumarta took some nice &lt;a href=&quot;http://piumarta.com/photos/olpc/&quot;&gt;pictures&lt;/a&gt;, which might very well be the first photos of the actual display in the wild.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-115801261793100987?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/09/squeak-for-every-child.html</link><guid>cb82ca63267aa63ec74680b62ac6a09f</guid></item>
<item><title type="text">Squeak Elections</title><description type="html">The first-ever &lt;a href=&quot;http://people.squeakfoundation.org/article/53.html&quot;&gt;elections&lt;/a&gt; are held in the Squeak community. Candidates have to be nominated by February 17, same deadline for getting certified at &lt;a href=&quot;http://people.squeakfoundation.org/&quot;&gt;SqP&lt;/a&gt; if you want to vote.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-113970329939638255?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/02/squeak-elections.html</link><guid>74dfe2fe61d9a06892449d8c71fbb2ed</guid></item>
<item><title type="text">How to write a Sugar activity in Squeak/Etoys</title><description type="html">&lt;div&gt;Milan just started a blog describing how to write activities in Squeak, see his &lt;a href=&quot;http://etoys-squeak-and-sugar.blogspot.com/2009/12/use-etoys-to-develop-xo-sugar-activity.html&quot;&gt;first post&lt;/a&gt;. There are already a few of these, most notably the &lt;a href=&quot;http://hpi.uni-potsdam.de/hirschfeld/projects/olpc/&quot;&gt;games&lt;/a&gt; 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!&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-4946033051576430153?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2010/01/how-to-write-sugar-activity-in.html</link><guid>84d25ea924271263f5439edd04dfc305</guid></item>
<item><title type="text">Croquet SDK 1.0 Beta out</title><description type="html">Get it at &lt;a href=&quot;http://www.opencroquet.org/&quot;&gt;opencroquet.org&lt;/a&gt;!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-114556211000396449?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/04/croquet-sdk-10-beta-out.html</link><guid>cb07fd57aea3b2d783cad9a44f622cb8</guid></item>
<item><title type="text">OLPC, graphics, and more</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://wiki.laptop.org/images/0/0f/CameraInEtoys.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;&quot; src=&quot;http://wiki.laptop.org/images/0/0f/CameraInEtoys.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;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 &lt;a href=&quot;http://diegogomezdeck.blogspot.com/2006/12/video4squeak-funcionando-en-la-olpc.html&quot;&gt;Diego&lt;/a&gt;'s code.&lt;br /&gt;&lt;br /&gt;We also went to visit Keith Packard and Carl Worth of &lt;a href=&quot;http://cairographics.org/&quot;&gt;Cairo&lt;/a&gt; fame in Portland. Had a nice chat about &lt;a href=&quot;http://geek.vtnet.ca/doc/ols2005-notes/html/d1-15h00.html&quot;&gt;Twin&lt;/a&gt; and then hacked away on a &lt;a href=&quot;http://piumarta.com/pepsi/&quot;&gt;Pepsi&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;And back to OLPC, read this nice essay titled &lt;a href=&quot;http://alchemicalmusings.org/2006/12/19/free-laptops/&quot;&gt;Free Laptops: Creating, Producing and Sharing a Revolution&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-116654329642180701?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/12/olpc-graphics-and-more.html</link><guid>632b8d3173f8d1a4889a9149ab20165b</guid></item>
<item><title type="text">Smalltalk Party Brussels 11 March 2006</title><description type="html">Only six days left to the &lt;a href=&quot;http://www.cdegroot.com/blog/2006/02/16/smalltalk-party-brussels-11th-march-2006/&quot;&gt;Smalltalk Party in Brussels&lt;/a&gt;! I'll be there, and &lt;a href=&quot;http://prog.vub.ac.be:8080/SmalltalkParty/&quot;&gt;more interesting people&lt;/a&gt;, too. You should come, too!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-114155895642679160?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/03/smalltalk-party-brussels-11-march-2006.html</link><guid>f067eb17d7e33c60379b7b5e40a2aebf</guid></item>
<item><title type="text">OpenGL in a Workspace</title><description type="html">On 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 &lt;a href=&quot;http://impara.de/&quot;&gt;impara&lt;/a&gt; tracked it down to the &quot;Composite&quot; extension that is enabled by default nowadays. With Composite disabled, it works, enable it, and it does not.&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;blockquote&gt;&lt;pre style=&quot;font-family: arial;line-height:1.1em&quot;&gt;| ogl green |&lt;br /&gt;ogl := OpenGL newIn: (0@0 extent: 100@100).&lt;br /&gt;green := 1.&lt;br /&gt;[[&lt;br /&gt;        ogl glClearColor(0, green, 0, 1).&lt;br /&gt;        ogl glClear(16r4000).&lt;br /&gt;        ogl swapBuffers.&lt;br /&gt;        Sensor waitClickButton.&lt;br /&gt;        green := 1 - green.&lt;br /&gt;] repeat] ensure: [ogl destroy]&lt;/pre&gt;&lt;/blockquote&gt;Beauty, eh? ;-) I guess nobody has done this in a workspace for a long time. Stop it with Alt-.&lt;br /&gt;&lt;br /&gt;Anyway, NVIDIA could reproduce the problem, and found our bug:&lt;br /&gt;&lt;blockquote&gt;[...] 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.&lt;/blockquote&gt;Doh! I forgot to specify the &lt;a href=&quot;http://www.tronche.com/gui/x/xlib/window/attributes/border.html&quot;&gt;border&lt;/a&gt;! 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 &lt;a href=&quot;http://developer.nvidia.com/&quot;&gt;NVIDIA developer support&lt;/a&gt;!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-4770989905943515991?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2007/02/opengl-in-workspace.html</link><guid>322178b0514cbff2d2c738fe12e9cfc7</guid></item>
<item><title type="text">Simplified TeaTime</title><description type="html">The next Croquet release, code-named &quot;Hedgehog&quot;, will be centered around a real replicated object model, rather than the ad-hoc meta sends in Jasmine. See Andreas' and David's &lt;a href=&quot;http://croquetproject.org/about_croquet/05.10.16HedgehogArchitecture.pdf&quot;&gt;OOPSLA presentation&lt;/a&gt; (PDF) for an overview.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-113439690869642029?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2005/12/simplified-teatime.html</link><guid>5080cfb970fb1643e9c1ba76a5da03aa</guid></item>
<item><title type="text">Croquet &amp; Tweak at NASA</title><description type="html">Ted Shab &lt;a href=&quot;http://www.aito.org/pipermail/ecoop-info/2006-January/000208.html&quot;&gt;posted&lt;/a&gt; a job offer to the ECOOP list. Part of it was this:&lt;br /&gt;&lt;blockquote style=&quot;font-style: italic;&quot;&gt;We are currently building a [...] testbed for user-experience exploration in Squeak (Smalltalk) (really). The resulting framework will be used by the various NASA centers [...] to build distributed, multi-mission systems for planning and executing a variety of NASA missions, including robotic (e.g. Mars rovers &amp; deep- space probes) and manned (e.g. the new Moon/Mars exploration effort, including the Crew Exploration Vehicle currently being designed).&lt;br /&gt;&lt;/blockquote&gt;Andreas Raab &lt;a href=&quot;http://lists.squeakfoundation.org/pipermail/squeak-dev/2006-January/100029.html&quot;&gt;commented&lt;/a&gt;:&lt;br /&gt;&lt;blockquote style=&quot;font-style: italic;&quot;&gt;FWIW, this project uses Croquet and Tweak. If you ever wanted to work with a bunch of really sharp guys this is definitely a place to consider.&lt;br /&gt;&lt;/blockquote&gt;Sounds cool :)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10460112-113818946435929018?l=croquetweak.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://croquetweak.blogspot.com/2006/01/croquet-tweak-at-nasa.html</link><guid>c28247ac1107a3c427fecf54fd80c810</guid></item>
<item><title type="text">Avatars in First Life</title><description type="html">&lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/flkgNn50k14&amp;amp;rel=1&quot;&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/flkgNn50k14&amp;amp;rel=1&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;This video illustrates what real life might be like if we were limited to the avatar capabilities/interactions presently available in virtual worlds such as Second Life.  It very much underscores the limitations in the ways we are able to represent ourselves within  today's 3D gaming and chat environments.  If we are going to leverage virtual environments to support interactions between people, then we need far better ways of representing ourselves within them.   Our representations should ideally be able to project as fully as possible the broadest range of human cues and capabilities.  Clearly, 3D virtual worlds have a long way to go in this regard. As a first step, we need to get past the &lt;span style=&quot;font-style: italic;&quot;&gt;dress-up doll house&lt;/span&gt; metaphor that appears to have emerged for interaction within these environments.&lt;br /&gt;&lt;br /&gt;The static avatars presently made available as placeholders in the Croquet SDK are far less capable than those of Second Life.  Still, the Croquet SDK offers developers an opportunity to change whatever they need about the way people are represented with virtual environments. Opportunities for avatar experimentation are huge.  Just imagine avatars that contain action triggers, link buttons, or even multiple on-board virtual environments.  The possibilities through Croquet are as limitless as the imaginations brought to bear on the problem (and of course the resources expended in implementing them).  The flexibility and efficiency of the Croquet programming environment gives researchers and other creatives far more capability in exploring how best to represent presence in virtual environments than is available with today's commercial 3D world technologies.&lt;br /&gt;&lt;br /&gt;I should point out that all of the .mdl avatars that the Croquet SDK now uses actually came from an early version of the &lt;a href=&quot;http://www.alice.org/&quot;&gt;Alice&lt;/a&gt; project and from &lt;a href=&quot;http://coweb.cc.gatech.edu/cs2340/3367&quot;&gt;Squeak's Wonderland&lt;/a&gt;.  However, the Croquet team at the University of Minnesota is working on some nicer avatars that will likely be made available in the next version of the Croquet SDK. A preview of the Minnesota avatars can be seen briefly on the Croquet video in a &lt;a href=&quot;http://jlombardi.blogspot.com/2007/09/croquet-demo-movie.html&quot;&gt;previous post&lt;/a&gt;. Also, &lt;a href=&quot;http://xaverse.blogspot.com/&quot;&gt;Matt Schmidt&lt;/a&gt; and his team in Missouri are also beginning to experiment with avatar improvements and it will be interesting to see what they come up with.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-3498260186838855573?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2007/11/avatars-in-first-life.html</link><guid>00a653b083e5cd24bacf8d5ec447cce7</guid></item>
<item><title type="text">Building a Lesson in EduSim</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/Fqwnj0pC5-4&amp;rel=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/Fqwnj0pC5-4&amp;rel=1&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Here is another video tutorial developed by Rich White at the &lt;a href=&quot;http://edusim.greenbush.us/&quot;&gt;Greenbush EduSim project&lt;/a&gt; showing how to bring resources into an EduSim/Croquet world and how apply textures to those resources.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-4183153529083018036?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2007/11/building-lesson-in-edusim.html</link><guid>d14bb2159302c979e7f38113e54690b2</guid></item>
<item><title type="text">Why Second Life Won't Get a Third</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R4__5GaeHaI/AAAAAAAAAUc/VvOp4qVT8aI/s1600-h/afterlife1.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R4__5GaeHaI/AAAAAAAAAUc/VvOp4qVT8aI/s320/afterlife1.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5156621454801771938&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Max Borders &lt;a href=&quot;http://www.tcsdaily.com/article.aspx?id=110207A&quot;&gt;opines&lt;/a&gt; on what he views as the key differences between &lt;a href=&quot;http://en.wikipedia.org/wiki/Second_Life&quot;&gt;Second Life&lt;/a&gt; and Croquet.  Another piece comparing the two technologies can be found &lt;a href=&quot;http://www.edutechie.com/2007/07/7-ways-croquet-is-better-than-second-life/&quot;&gt;here&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-5845131140697608471?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/01/why-second-life-wont-get-third.html</link><guid>78b4551e6c44b29a43f3e4b430ed90ce</guid></item>
<item><title type="text">Cobalt Released</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R86F8DRzrfI/AAAAAAAAAVM/0dF6MqcO9J0/s1600-h/Cobalt+Parrish.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R86F8DRzrfI/AAAAAAAAAVM/0dF6MqcO9J0/s320/Cobalt+Parrish.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5174220288613920242&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cobalt is an emerging open source and multi-platform metaverse browser and toolkit application being built using the open source Croquet SDK. A pre-alpha build of the Cobalt application is being made freely available to the emerging virtual worlds community by Duke University and its partners under the Croquet license.  We hope that by doing so, we will foster a viable community-based software development effort leading to open virtual world technologies supporting the needs of education and research.&lt;br /&gt;&lt;br /&gt;The &lt;span style=&quot;font-style:italic;&quot;&gt;current build&lt;/span&gt; of Cobalt is located &lt;a href=&quot;http://croquet-src-01.oit.duke.edu/cobalt.html&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;span style=&quot;font-style:italic;&quot;&gt;Monticello source code repository&lt;/span&gt; for Cobalt is located &lt;a href=&quot;http://croquet-src-01.oit.duke.edu:8886/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The Cobalt-specific &lt;span style=&quot;font-style:italic;&quot;&gt;Mantis bug tracker&lt;/span&gt; is located &lt;a href=&quot;http://croquet-src-01.oit.duke.edu/mantis/index.php&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Software testing and bug reporting is a very important contribution to the effort. Doing so will help the Cobalt development community to identify areas in need of programming and re-engineering. Well-written bug reports can be an especially useful contribution by non-developers who are interested in advancing this effort during these early stages of Cobalt development. We hope that many of the community's software developers will consider taking on bug fixes.&lt;br /&gt;&lt;br /&gt;Mark McCahill will be coordinating updates and code contributions to Cobalt to ensure compatibility with the base classes within the present Croquet SDK. In this way we can ensure that Cobalt development does not create a fork from the Croquet SDK. The goal here is to build a Croquet-based application that end-users can really use and then to contribute the application back to the Croquet Consortium for distribution as part of a future Croquet release. We hope that by making the pre-alpha available we can tap into the creative potential of the broader community as a way of advancing something that all of us can freely use to create deeply collaborative, greatly featured, and widely interlinked virtual environments on a very large scale.  Lets do it!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-5598610686329261610?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/03/cobalt-released.html</link><guid>6673ece0d3e50aca792681aecef1c89d</guid></item>
<item><title type="text">Another Digital Rainout</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp0.blogger.com/_8RhdmQ9Bi6c/R__3fHCDVaI/AAAAAAAAAVs/lBduSf2Wwts/s1600-h/StormCloud1.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp0.blogger.com/_8RhdmQ9Bi6c/R__3fHCDVaI/AAAAAAAAAVs/lBduSf2Wwts/s320/StormCloud1.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5188137409589761442&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Today, for the second time in as many weeks, &lt;a href=&quot;http://secondlife.com/&quot;&gt;Second Life&lt;/a&gt; became unavailable for  the same reasons that 3rd party large-scale server-based architectures should not be relied on to support mission-critical virtual worlds in any serious way.  The outage happened, once again, just at the time that Aaron Walsh of the &lt;a href=&quot;http://immersiveeducation.org/&quot;&gt;Media Grid Immersive Education Initiative&lt;/a&gt; was trying to host a &lt;a href=&quot;http://secondlife.com/&quot;&gt;Second Life&lt;/a&gt; in-world meeting. Here is what Linden Lab had to say:  &lt;span style=&quot;font-style:italic;&quot;&gt;Logins have temporarily been restricted to staff-only as Operations addresses a slowdown in the asset system. Weve also broadcast a request in world for residents who are currently logged in to refrain from manipulating or transferring assets. Well have more info ASAP.&lt;/span&gt;  Obviously, this company is in real trouble given the frequency of these problems in a system that so many have come to rely on....&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-4746158045115295653?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/04/another-digital-rainout.html</link><guid>d9df72f20a4c4e97e1ad1747fe763d84</guid></item>
<item><title type="text">Croquet Simulation Work</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/D51Vx9giJVg&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/D51Vx9giJVg&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;This new video by Willi Griephan of Bremen, Germany shows the operation of two Croquet simulation spaces that he created using the Croquet SDK.  The first is a falling &quot;Domino&quot; simulation that leverages the &lt;a href=&quot;http://www.ode.org/&quot;&gt;Open Dynamics Engine&lt;/a&gt; for its physics.  The second scene depicts swarm behavior in an aquarium simulation where two members of a swarm can pair, and by doing so, spawn new offspring. The Swarm algorithm that Willi used is described &lt;a href=&quot;http://www.red3d.com/cwr/steer/gdc99/&quot;&gt;here&lt;/a&gt; by Craig W. Reynolds.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-8500335901084905670?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/07/croquet-simulation-work.html</link><guid>0a7858c995837e2e49ab6d5d5c9fb403</guid></item>
<item><title type="text">Better Avatars!</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/ykriYbq-oyI&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/ykriYbq-oyI&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Better avatars for Cobalt are almost ready!  Here is a video showing an early test implementation of a motion-cycle enhanced avatar in Cobalt.  Peter Moore has been doing a wonderful job with this and in getting the Ogre3D XML importer to work with models developed in Maya or exported from Blender. That means that we will all soon have at least two art paths for getting avatars and other animated meshes into Cobalt worlds.  It'll also be great to finally retire the stilted Alice and Rabbit avatars.  This particular video also provides a sneak peak at some of the texture and environmental/directional lighting work that I hope to have make its way into the next update of the Cobalt code-base.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-3756795044622089822?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/07/kill-rabbit.html</link><guid>3d92720d1644da9f96f7688fbfe65380</guid></item>
<item><title type="text">Duke Receives Mellon Award</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R2CNuH89EaI/AAAAAAAAATk/EQqs3sMxOVk/s1600-h/Mellon.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R2CNuH89EaI/AAAAAAAAATk/EQqs3sMxOVk/s320/Mellon.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5143266598005313954&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Today, the Andrew W. Mellon Foundation awarded Duke University a $100,000 prize for leadership and development work to advance Croquet in the open source.  The prize was one of ten presented as part of the second annual Mellon Awards for Technology Collaboration (MATC) which are given each year to notforprofit organizations for leadership in the collaborative development of open source software tools with application to scholarship in the arts and humanities.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp2.blogger.com/_8RhdmQ9Bi6c/R2RMvmaeHVI/AAAAAAAAAT0/M7suvg2r2u4/s1600-h/2007-12-10+at+13-25-09.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp2.blogger.com/_8RhdmQ9Bi6c/R2RMvmaeHVI/AAAAAAAAAT0/M7suvg2r2u4/s320/2007-12-10+at+13-25-09.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5144321055013084498&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The award was presented at the Fall Task Force meeting of the Coalition for Networked Information in Washington D.C. by Sir &lt;a href=&quot;http://en.wikipedia.org/wiki/Tim_Berners-Lee&quot;&gt;Timothy BernersLee&lt;/a&gt;, Director of the World Wide Web Consortium and the inventor of the World Wide Web. Dukes MATC award was one of three that received the top prize of $100,000. The other award winners received prizes of $50,000 each. Award recipients were selected by the MATC Award Committee, which included BernersLee, &lt;a href=&quot;http://en.wikipedia.org/wiki/Mitchell_Baker&quot;&gt;Mitchell Baker&lt;/a&gt; (CEO, Mozilla Corporation), &lt;a href=&quot;http://en.wikipedia.org/wiki/John_Seely_Brown&quot;&gt;John Seely Brown&lt;/a&gt; (former Chief Scientist, Xerox Corp.), &lt;a href=&quot;http://en.wikipedia.org/wiki/Vinton_G._Cerf&quot;&gt;Vinton G. Cerf&lt;/a&gt; (Vice President and Chief Internet Evangelist, Google, Inc.), &lt;a href=&quot;http://en.wikipedia.org/wiki/John_Gage&quot;&gt;John Gage&lt;/a&gt; (Chief Researcher and Director of the Science Office, Sun Microsystems, Inc.), and Tim OReilly (Founder and CEO, OReilly Media).&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-76992878734793493?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2007/12/duke-receives-mellon-award.html</link><guid>9d975fab0c1caecc426d84c652b1dda8</guid></item>
<item><title type="text">A Croquet Winter Wonderland</title><description type="html">&lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/djcEQeR-Uqc&amp;amp;rel=1&quot;&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/djcEQeR-Uqc&amp;amp;rel=1&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;It has emerged as a type of practice here in the United States for people to begin putting up holiday decorations on the weekend after our annual &lt;a href=&quot;http://en.wikipedia.org/wiki/Thanksgiving&quot;&gt;Thanksgiving&lt;/a&gt; celebration. In keeping with this, I offer this link to a new video from the folks at &lt;a href=&quot;http://edusim3d.com/&quot;&gt;EduSim&lt;/a&gt;.  In this one, they use a projected Croquet space in combination with a very compact &lt;a href=&quot;http://www.e-beam.com/&quot;&gt;eBeam&lt;/a&gt; input device that converts any surface (in this case a regular wall) into an interactive surface.  The result is an on demand and relatively low cost interactive white board solution ($800-900 US) that, in combination with a data projector ($600-2,500 US) and Croquet software (free), may represent the beginnings of an economical alternative to traditional in-classroom visual communication boards (the typical front-of-the-classroom whiteboard/bulletin board installation is comparable in price).  Could this be the earliest manifestation of a new form of broadly available classroom media for K-12?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-3902083799076024404?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2007/11/croquet-winter-wonderland.html</link><guid>c604f1dc39e016ddbfb38dab900d2149</guid></item>
<item><title type="text">Touchy-Feely Croquet</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp2.blogger.com/_8RhdmQ9Bi6c/R20OoWaeHYI/AAAAAAAAAUM/InTiROkbJq0/s1600-h/Novint+Falcon.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp2.blogger.com/_8RhdmQ9Bi6c/R20OoWaeHYI/AAAAAAAAAUM/InTiROkbJq0/s320/Novint+Falcon.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5146786035528506754&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;UNC's Jeff VanDrimmelen has recently begun exploring ways to integrate haptic technology with Croquet virtual worlds.  Haptic technology allows simulations to convey information to users in the form of mechanical stimulation.  Haptic devices typically transmit information in the form of vibrations or motions, thereby creating a sense of &lt;span style=&quot;font-style:italic;&quot;&gt;touching&lt;/span&gt; or &lt;span style=&quot;font-style:italic;&quot;&gt;feeling&lt;/span&gt; virtual objects.  The main types of haptic devices are 1) &lt;span style=&quot;font-style:italic;&quot;&gt;tactile feedback devices&lt;/span&gt; (that generate resistance to user input movement) and &lt;span style=&quot;font-style:italic;&quot;&gt;force feedback devices&lt;/span&gt; (that generate movement back to the input device). &lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://home.novint.com/products/novint_falcon.php&quot;&gt;Novint Falcon&lt;/a&gt; device is a new haptic device developed for use as a gaming peripheral and input device. The user interacts with  a small knob with three degrees of freedom in movement at the front of what is otherwise a stationary desktop device. The knob is attached to the main body via three multi-hinged and motorized arms. The step motors within the arms feel what the user is doing as well as apply forces back to the knob.&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;373&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/S5h4owxpHcI&amp;rel=0&amp;border=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/S5h4owxpHcI&amp;rel=0&amp;border=1&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;373&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Jeff recently posted this video about his earliest effort to integrate the Novint Falcon haptic device with Croquet technology.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-5725458674594210177?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2007/12/touchy-feely-croquet.html</link><guid>0a28121969140cbb5a04e5c578dc6082</guid></item>
<item><title type="text">Saving and Loading Spaces</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R98S_NOOWNI/AAAAAAAAAVk/TLOyvkjtaBk/s1600-h/SaveAndLoad.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R98S_NOOWNI/AAAAAAAAAVk/TLOyvkjtaBk/s320/SaveAndLoad.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5178878973589739730&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A new build of Cobalt has just been made available download.  Added functionality includes the ability to save and load spaces from web or local directories.  This means that you can now make your custom Cobalt spaces available to others as a kind of template virtual world over the web!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-6562084312584448852?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/03/saving-and-loading-spaces.html</link><guid>cb1ae613913564eaf19ff970a366433f</guid></item>
<item><title type="text">MS-OLPC?</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp0.blogger.com/_8RhdmQ9Bi6c/SC18SzZ-M5I/AAAAAAAAAV8/k2t2orxWt8Y/s1600-h/olpc.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp0.blogger.com/_8RhdmQ9Bi6c/SC18SzZ-M5I/AAAAAAAAAV8/k2t2orxWt8Y/s320/olpc.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5200949807161422738&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Nicholas Negroponte just posted the following announcement:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;&quot;One Laptop per Child is announcing an agreement with Microsoft&lt;br /&gt;to make a dual boot, Linux/Windows, version of the XO laptop. In addition, our intention is to engage one or more third parties to port Sugar to run on Windows in order to reach a wider installed base of laptops. In the meanwhile, OLPC remains fully committed to our goal: a completely free and open learning platform for the world's children. The mission statement of OLPC has not changed in three years.&lt;br /&gt;&lt;br /&gt;Sugar is the first user interface specifically designed for children and teachers to learn and collaborate, and remains central to our strategy. Broadening Sugar's reach to as many children as possible remains key to OLPC's mission.&lt;br /&gt;&lt;br /&gt;To enable the Sugar environment to reach as many children as possible, particularly in the poorest areas of the world, OLPC must be able to bid on educational technology contracts, some of which require that Microsoft Windows be able to run on our hardware. The increased volumes will lower the XO-1's price, already lowest in the industry with capabilities no other laptop shares.&lt;br /&gt;&lt;br /&gt;OLPC is substantially increasing its engineering resources and all software development continues entirely on GNU/Linux.  We will continue to work to make Sugar on Linux the best possible platform for education and to invest in our expanding Linux deployments in Peru, Uruguay, Mexico and elsewhere.&lt;br /&gt;&lt;br /&gt;No OLPC resources are going to porting Sugar to Microsoft Windows, although as a free software project, we encourage others to do so. The Sugar user interface is already available for Fedora, Debian and Ubuntu Linux distributions, greatly broadening Sugar's reach to the millions of existing Linux systems. We continue to solicit help from the free software community in these efforts. Additionally, the Fedora, Debian and Ubuntu software environments run on the XO-1, adding support for tens of thousands of free software applications.&lt;br /&gt;&lt;br /&gt;Open Firmware V2, the free and open source BIOS, is now capable of running Linux, Microsoft Windows XP and other operating systems, and was developed by Firmworks with support from OLPC. This will enable dual boot of OLPC XO laptops with Microsoft Windows XP in addition to the existing Fedora-based system and will become the standard BIOS/bootloader for all XO systems when completed. With this &quot;free BIOS,&quot; the XO-1 continues to be the most open laptop hardware currently&lt;br /&gt;available.&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For more information, see http://wiki.laptop.org/go/AnnounceFAQ.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-5542876454174968190?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/05/ms-olpc.html</link><guid>aaf170caf8156625f35d994a477d8e30</guid></item>
<item><title type="text">Collaborative CAD in Cobalt!</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/ffUQ24GXFW0&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/ffUQ24GXFW0&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Thanks again to the work of Aik-Siong Koh and his team, Cobalt now makes it possible for users to work in a deeply collaborative CAD environment. This video shows how two Cobalt users on separate computers can work with relatively sophisticated CAD capabilities over a LAN.  This newly-implemented collaborative CAD capability in Cobalt opens up a wide range of possibilities for engineers and others at a distance to develop sophisticated simulations and architectures in Cobalt worlds.  The ability to develop animated content within a full-featured &lt;span style=&quot;font-style:italic;&quot;&gt;virtual world&lt;/span&gt; CAD environment sets Cobalt apart from other virtual world technologies in a very significant way.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-7043953166494247605?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/12/collaborative-cad-in-cobalt.html</link><guid>bad668f84f490ee7d2f4d4ebf1b6d2b6</guid></item>
<item><title type="text">NSF SGER</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/SEp4rmnRcQI/AAAAAAAAAWY/cPBVrK3DGZk/s1600-h/NSF_logo.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/SEp4rmnRcQI/AAAAAAAAAWY/cPBVrK3DGZk/s320/NSF_logo.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5209108609502376194&quot; /&gt;&lt;/a&gt;&lt;br /&gt;I've just been awarded an NSF Small Grant for Exploratory Research (SGER) to advance exploratory work towards a more complete open source Croquet-based browser application and toolset that can support the large scale needs of the scientific community. With this support, we will be helping to advance the Cobalt effort by 1) making general improvements to the user interface which includes the more complete buildout of Cobalt's menus as well as improvements to basic navigational control, 2) fully implementing and testing of the ability for end-users to tag and electronically store their Cobalt-created worlds to online directories, 3) designing and implementing methods for finding and contacting other users of Croquet spaces by leveraging XMPP/Jabber as a presence registration and rendezvous mechanism, and 4) designing and implementing of methods that enable Cobalt users to browse a directory of all registered and active Cobalt spaces and to make it possible for users to contact current participants of those spaces by leveraging XMPP/Jabber and institutional IAA infrastructures as a means of defining user permissions by group affiliations. At the end of this, we hope to have a full Beta of the Cobalt application available for download to all.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-587543660357709209?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/06/nsf-sger.html</link><guid>8c2ccb242fe99d953ee870b88e257101</guid></item>
<item><title type="text">Squeak by Example</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp2.blogger.com/_8RhdmQ9Bi6c/R0Tfhhe6ZXI/AAAAAAAAATE/CLagUSfiFJg/s1600-h/Squeak_Cover.png&quot;&gt;&lt;img style=&quot;cursor: pointer;&quot; src=&quot;http://bp2.blogger.com/_8RhdmQ9Bi6c/R0Tfhhe6ZXI/AAAAAAAAATE/CLagUSfiFJg/s320/Squeak_Cover.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5135475242125911410&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Croquet is written in &lt;a target=&quot;_blank&quot; href=&quot;http://www.squeak.org/About/&quot;&gt;Squeak&lt;/a&gt;, a modern open-source development environment for the classic &lt;a target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Smalltalk&quot;&gt;Smalltalk-80&lt;/a&gt; programming language (the first purely object-oriented language and environment).  Squeak was used because Croquet required a number of capabilities that could only be provided by a true late bound, message sending language. Croquet's relationship to Squeak gives Croquet the property of a purely object-oriented system. This has allowed for some significant flexibility in the design and the nature of the protocols and architectures that have been developed for Croquet.&lt;br /&gt;&lt;br /&gt;An essential property of Squeak is its ability to keep the system running while testing and making changes. Squeak allows even major changes to be performed incrementally and within a mere fraction of a second. Another key feature is Squeak's generalized storage allocator and garbage collector that is efficient in &lt;span style=&quot;font-style: italic;&quot;&gt;real-time&lt;/span&gt; so that animations and dynamic media of many kinds can be played while the garbage collector is collecting.  It also allows reshaping of objects to be done safely.  This is important to the creation and delivery of media rich collaborative virtual environments.&lt;br /&gt;&lt;br /&gt;Early on in the project, a &lt;a href=&quot;http://en.wikipedia.org/wiki/Java_%28programming_language%29&quot;&gt;Java&lt;/a&gt;-based  Croquet was considered&lt;a href=&quot;http://en.wikipedia.org/wiki/Java_%28programming_language%29&quot;&gt;&lt;/a&gt;. However, that approach was abandoned because Java lacks needed meta facilities. In many ways Squeak/Smalltalk is still far ahead of its successors in promoting a vision of an environment where &lt;em&gt;everything is an object&lt;/em&gt;, and &lt;span style=&quot;font-style: italic;&quot;&gt;anything&lt;/span&gt; can change at run-time.  This is an important property for virtual environments that are deeply flexible and modifiable as an immediate result of the actions people take within those environments.  Still, the lack of significant corporate backing and marketing muscle behind Squeak/Smalltalk has meant that less capable technologies are the ones with which most of today's developers are most familiar.&lt;br /&gt;&lt;br /&gt;To help more people get familiar with Squeak's very powerful programming environment, the new book &lt;a href=&quot;http://squeakbyexample.org/&quot;&gt;&lt;em&gt;Squeak by Example&lt;/em&gt;&lt;/a&gt; is now being made available under the Creative Commons Attribution-ShareAlike 3.0 license.  It's intended for both students and developers and guides readers through the Squeak language and development environment by means of a series of examples and exercises. This is very useful to those who wish to become more familiar with the Croquet programming environment.  You can either &lt;a target=&quot;blank_&quot; href=&quot;http://squeakbyexample.org/SBE.pdf&quot;&gt;download the PDF for free&lt;/a&gt;, or you can &lt;a target=&quot;_blank&quot; href=&quot;http://www.lulu.com/content/1171965&quot;&gt;buy a softcover copy from lulu.com&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-6873028870723042111?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2007/11/squeak-by-example.html</link><guid>77688b5606594601cdf6cd62632b72ca</guid></item>
<item><title type="text">VNC in Cobalt!</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_8RhdmQ9Bi6c/SSgGbL9huqI/AAAAAAAAAYE/2yuIPYvQYU4/s1600-h/VNC1.png&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 320px; height: 237px;&quot; src=&quot;http://4.bp.blogspot.com/_8RhdmQ9Bi6c/SSgGbL9huqI/AAAAAAAAAYE/2yuIPYvQYU4/s320/VNC1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5271470427974253218&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Rajeev Lochan has just been successful in getting VNC to work within a shared Cobalt space! VNC is a graphical desktop sharing system which uses the RFB protocol to remotely control another computer. This is a big breakthrough for our open project.  It means that  a Cobalt-based VNC client can connect to a VNC server on any other operating system. Cobalt users will soon be able to view and interact with remote applications (including full featured web browsers) or even collaboratively access remote desktops within the Cobalt application. Because the VNC protocol can use a lot of bandwidth, we still have some optimization to deal with - but this progress is great to see.  Thank you Rajeev!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-6494946713862518351?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/11/vnc-in-cobalt.html</link><guid>f0be4ce64a80c85c4a1d1432f64f7bda</guid></item>
<item><title type="text">Wii-mote Possibilities</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/5s5EvhHy7eQ&amp;rel=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/5s5EvhHy7eQ&amp;rel=1&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Here is a clever video from Johnny Lee at Carnegie Mellon University showing how you can use a  Nintendo Wii-mote and home-made infrared LED light pens to create a low cost multi-touch interactive whiteboard system.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-3605450581147273309?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/01/wii-mote-possibilities.html</link><guid>cf82cdf7aa9f3b185a7dcd284e986dfb</guid></item>
<item><title type="text">Julian Lombardi's Blog Has Moved</title><description type="html">I've moved my blog to another address and will no longer post here.  Please go to &lt;a href=&quot;http://julianlombardi.blogspot.com&quot;&gt;julianlombardi.blogspot.com&lt;/a&gt; to see all my posts, both old and new.&lt;br /&gt;&lt;br /&gt;-Julian&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-5196634228264046360?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2009/05/julian-lombardis-blog-has-moved.html</link><guid>d8b4546c2544ac7c4d483abce853de06</guid></item>
<item><title type="text">A Croquet Spoof</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/pPCyJHEQHL8&amp;rel=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/pPCyJHEQHL8&amp;rel=1&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Recently posted by David Faught.  Happy New Year!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-3065742473089096596?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/01/croquet-spoof.html</link><guid>ae512410fc69bde0d9fc80fba8ab76ec</guid></item>
<item><title type="text">Croquet Skeletal Animation Part 2</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/iU4Xp6iomwA&amp;rel=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/iU4Xp6iomwA&amp;rel=1&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Another example video of skeletal animation in Croquet.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-9111449590944392019?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/02/croquet-skeletal-animation-part-2.html</link><guid>5832acd1909f892922b5a71fee34f9b0</guid></item>
<item><title type="text">Another KMZ Import</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_8RhdmQ9Bi6c/SPvBjWFt8JI/AAAAAAAAAXM/c8tda2eEy_Y/s1600-h/seymour.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://4.bp.blogspot.com/_8RhdmQ9Bi6c/SPvBjWFt8JI/AAAAAAAAAXM/c8tda2eEy_Y/s320/seymour.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5259009802854330514&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another test of the new KMZ importer from Aik-Siong Koh.  Note that the textures are mapping nicely onto the relatively complex model!  Soon we will be able to import lots of content from Google's 3D Warehouse into Cobalt.  That will be nice...&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-1046486170180668260?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/10/another-kmz-import.html</link><guid>e0ded6c1e4984f9f869e27f6b2862801</guid></item>
<item><title type="text">Strangely Attractive</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/10h2XhP0u0g&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/10h2XhP0u0g&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Matthew Chadwick has been exploring the creation of GPU-computed chaotic attractors of dynamical systems using the Croquet SDK. The code he is using is based on David Faught's procedural textures code. In this implementation, the cube to the left defines a parameter space for controlling the system.  Matthew says that the same code he is developing could also be used for other things like in-world physics simulations. Matthew will make all of this available for public release once the code is ready.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-2697287613434886120?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/07/strangely-attractive.html</link><guid>9c820118e668651476cbb96c71c2544f</guid></item>
<item><title type="text">Immersive Workspaces</title><description type="html">&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/j5I2ZV2ppeE&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/j5I2ZV2ppeE&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Linden Lab has announced that its now going to be moving into the enterprise 3D collaboration space. It recently announced a new product called &quot;Immersive Workspaces&quot; which is basically an area in Second Life set aside for corporate meetings. That more secure area represents &quot;a completely exclusive and secure experience, with no connectivity to the Second Life mainland.&quot; Their intent is to develop a complete collaboration experience for the enterprise.  I guess that is Linden Lab's attempt to try and ensure that business meetings are not disrupted by griefers or by unwelcome barrages of flying penises.  Looks like the enterprise virtual worlds space is getting a bit more crowded.  It will be interesting to see how this all plays out.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-8561808529628422340?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/10/immersive-workspaces.html</link><guid>21ef9002fecb59e62268dc76051e9bfa</guid></item>
<item><title type="text">The Server Dilemma</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R8BnL6NGxLI/AAAAAAAAAVE/qC2xfRNf5RE/s1600-h/servers.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp3.blogger.com/_8RhdmQ9Bi6c/R8BnL6NGxLI/AAAAAAAAAVE/qC2xfRNf5RE/s320/servers.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5170245826521777330&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The following quote from the article &lt;span style=&quot;font-style:italic;&quot;&gt;Second Earth&lt;/span&gt; (MIT Technology Review, July-August 2007) provides some interesting numbers around the server dilemma associated with server hosted virtual worlds such as Second Life:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;This reimagining of the real world can go only so far, given current limitations on the growth of Linden Lab's server farm, the amount of bandwidth available to stream data to users, and the power of the graphics card in the average PC.&lt;br /&gt;&lt;br /&gt;According to&lt;/span&gt; [Cory]&lt;span style=&quot;font-style:italic;&quot;&gt; Ondrejka&lt;/span&gt; [Linden Lab's now former CTO]&lt;span style=&quot;font-style:italic;&quot;&gt;, Linden Lab must purchase and install more than 120 servers every week to keep up with all the new members pouring into Second Life, who increase the computational load by creating new objects and demanding their own slices of land. Each server at Linden Lab supports one to four &quot;regions,&quot; 65,536-square-meter chunks of the Second Life environment--establishing the base topography, storing and rendering all inanimate objects, animating avatars, running scripts, and the like. This architecture is what makes it next to impossible to imagine re-creating a full-scale earth within Second Life, even at a low level of detail. At one region per server, simulating just the 29.2 percent of the planet's surface that's dry land would require 2.3 billion servers and 150 dedicated nuclear power plants to keep them running. It's the kind of system that &quot;doesn't scale well,&quot; to use the jargon of information technology.&lt;br /&gt;&lt;br /&gt;But then, Linden Lab's engineers never designed Second Life's back end to scale that way. Says Ondrejka, &quot;We're not interested in 100 percent veracity or a true representation of static reality.&quot;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-5958755932185298068?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/02/server-dilemma.html</link><guid>e87d84fd206bbb4ee940862f8315b5a2</guid></item>
<item><title type="text">Croquet Selected!</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://bp1.blogger.com/_8RhdmQ9Bi6c/R2kLAGaeHWI/AAAAAAAAAT8/6k5baPu8CEs/s1600-h/2008_SummitPoster_Header.png&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;http://bp1.blogger.com/_8RhdmQ9Bi6c/R2kLAGaeHWI/AAAAAAAAAT8/6k5baPu8CEs/s320/2008_SummitPoster_Header.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5145656145597046114&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This past weekend, it was announced at &lt;a href=&quot;http://MediaGrid.org/summit/&quot;&gt;The Boston Media-Grid Summit&lt;/a&gt; that the &lt;a href=&quot;http://immersiveeducation.org/&quot;&gt;Immersive Education Initiative&lt;/a&gt; (see &lt;a href=&quot;http://chronicle.com/daily/2007/12/925n.htm?rss&quot;&gt;article&lt;/a&gt; on the initiative's goals) has selected Croquet as one of three official &quot;next generation&quot; immersive education platforms.  The Immersive Education Initiative is an international collaboration of universities, colleges, research institutes, consortia companies, and foundations that are working together to define and develop open standards, best practices, platforms, and communities of support for virtual reality and game-based learning and training systems. The other two immersive education platforms selected were Sun's open source &lt;a href=&quot;https://lg3d-wonderland.dev.java.net/&quot;&gt;Project Wonderland&lt;/a&gt; client and the now open source &lt;a href=&quot;http://secondlife.com/community/downloads.php&quot;&gt;Second Life client&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What this all means is that the open source Croquet platform's value will become better known and that the Immersive Education Initiative will now &lt;span style=&quot;font-style:italic;&quot;&gt;direct both funding and programming resources towards the development and deployment of open source Croquet technologies and open source Croquet-based educational applications&lt;/span&gt;. Selection criteria for this important honor included the following: 1) support for the Windows and Macintosh operating systems; 2) availability as open source code; 3) vendor-neutral client and server architectures (no vendor lock-in); 4) stable and reliable runtime implementations; 5) integrated text chat and voice chat; 6) high resolution graphics; 7) multi-user support for collaboration; 8) highly customizable avatars that support high resolution graphics and body animation (gestures); and 9) support for user-created content.&lt;br /&gt;&lt;br /&gt;The event in Boston was an invitation-only affair hosted and sponsored by the &lt;a href=&quot;http//mediagrid.org/&quot;&gt;Grid Institute&lt;/a&gt;, the &lt;a href=&quot;http://www.bc.edu/schools/advstudies/&quot;&gt;Woods College of Advancing Studies&lt;/a&gt; at Boston College, and the City of Boston with participation from the &lt;a href=&quot;http://www.fas.org/main/home.jsp&quot;&gt;Federation of American Scientists&lt;/a&gt; and the &lt;a href=&quot;http://www.kauffman.org/&quot;&gt;Ewing Marion Kauffman Foundation&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8731714-5951781894116449827?l=jlombardi.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://jlombardi.blogspot.com/2008/01/croquet-selected.html</link><guid>8ed0291d8bd9a718e38260ba4c8a1208</guid></item>
<item><title>Oh. Canada. </title><link>http://www.wetmachine.com/itf/item/1917</link><description>Our weekly engineering meeting has a conference table and a huge projection screen. On this Monday, the Vancouver Olympics had just closed, and our three Canadian engineers were celebrating their climactic hockey victory. Being virtual, it was rid...</description><pubDate>Sat, 06 Mar 2010 12:06:47 -0500</pubDate><guid>54b41af1b02d92e435c1166a7c0b5d3f</guid></item>
<item><title type="text">UNDO!</title><description type="html">&lt;p&gt;To tell the truth, I haven't cared about UNDO in my work at all. Although I am really interested in brand new feature and fancy demonstration of computer programming, but I never have been concerned real user's experience. Ah, but the time seems to be coming to do about UNDO.&lt;p&gt;From the stand point of developer, I'm really taking care of undo. Programmer's undo is revision control systems. I love to use Monticello to manage my private project in Squeak, and Subversion for other stuff. I couldn't do anymore unless such system. So I realize that one interesting issue here is why undo system is implemented in various way?!&lt;p&gt;In minimal scale, we can use just undo key in your editor. Each application has its own undo policy. But the undo buffer is removed when the editor is shutdown. Revision control helps the situation. Besides, sometimes we use more file oriented backup system. So far, my company did differential backup for whole PCs at office into file server (I made the script in Perl). In any case, the goals are same, we want to back some point in history of our computing activity. Are there any core concept in?&lt;p&gt;Let's talk about other angle of undo. Sometimes undo is implemented as command pattern. Look, we have already have another commands in our etoys system, a tile, so we can imagine if undo buffer is made in etoys tiles. If so, one can learn how tile script is written looking undo history. This is basically same as macro recording (actually, I have learned emacs lisp to record/read macro scripts so far). To achieve such feature, all operation including painting a form and editing a text should be recorded as commands (as HyperTalk has all commands for menu / editor operation).&lt;p&gt;If all operation is recorded into undo buffer, we can see the undo buffer is document itself. That is an interesting side-effect. Instead of saving document data, we can save a sequence of command. The benefit of it would have a power of generalization. Documents, undo, playback, etc. are formed same way of commands.&lt;p&gt;To proceed this concept, you can see two different documents as two snapshot from same revision tree. Because certainly, a document is written from empty document. We could see any document of same application derives one root. Hence, any document of Squeak space is regard as different version of one big revision tree described in commands.&lt;p&gt;I know the idea is based on too simplification. I didn't care any performance issue neither space nor time. But it is important to start where the simple enough point.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-112617885283425359?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2005/09/undo.html</link><guid>953bc23e751265075fd1a4426d681b32</guid></item>
<item><title type="text">Active Essays on the Web</title><description type="html">&lt;p&gt;Active Essays is a concept of an essay mixed with computer programcoined by Alan Kay. The goal is to explain mathematical or scientificideas to kids with some interesting program like a computersimulation.&lt;p&gt;It is similar as a math book which includes a couple of paragraphs andformulas in a page, so that a reader would follow the author's idea bynot only reading a text but also &quot;do it&quot; formulas. In case of ActiveEssays, computer programs are embedded in a page instead offormulas. The largest advantage of Active Essays to math book is that aprogram is often more dynamic than a formula. It is really fun to seea small lines of code generating a little surprise on screen. Thesecond advantage would be that you don't have to calculate numbers byyourself, a computer must to do better job than you to fiddlevariables.&lt;p&gt;Because Active Essay is not a definitive genre in computer media, soI'm not sure how many active essays have ever been written so far. ButHyperCard might be the first media which affords contents mixed withtext and program. And you would find many projects with this style ineToys on the web.&lt;p&gt;What I want to make in next a couple of months is an authoring toolfor Active Essays taking advantage of Internet technology. And finalgoal is to describe entire system as a Active Essay itself.&lt;p&gt;Internet had a huge impact on our literacy. A lot of amateurs writetexts, take photos, and publish to the web them every day. Even it iscommon that there are families whose every members have each blog.Besides social aspect, a new medium makes a new style ofwriting. Because actual appearance of writing is depended on reader'sweb browser or RSS reader, you don't have a full control of finallooking of your text. And it is encouraged to take care about logicalstricture instead of physical looking. I'm sure the those phenomenaaffects way of writing.&lt;p&gt;However, there is a something what have not been changed yet.Internet contents still tend to mimic traditional media. Even thoughit is highly depend on computer technology, it lacks the mostinteresting aspect, programming language as a communication media.&lt;p&gt;Programming language is the primary tool to talk between man andmachine, and often even better way to exchange ideas among humans.  Ifthere were enough support tools, it would be natural that we write ablog post in programming language, chat with source code, and evenwrite a novel running as a program. Especially when the topic isscience or mathematics, programming language would be the mostaccurate way to tell an idea.  It is irony that you can't play a LOGOprogram when you read LOGO's article on Wikipedia.&lt;blockquote&gt;However, e.g. while the article on &lt;ahref=&quot;http://en.wikipedia.org/wiki/Logo_programming_language&quot;&gt;Logo&lt;/a&gt;has some good information and examples, none on them can be run,dynamically changed and tried, etc. To me this is outrageous giventhat the browser was done some years after Hypercard, longer after theApple ][, and long long after the prior art of the 60s and 70s. --Alan Kay&lt;/blockquote&gt;&lt;p&gt;What kind of tool is useful to support the idea? Abundant introductorymaterial for science written in eToys would be a good start toexamine. And history of Literate Programming shows another interestingaspect of the topic. We would make a progress from these instances interms of functionality and style.&lt;p&gt;As functionality, Don Knuth's original idea could evolve more in latebinding language like JavaScript than Pascal or C, because WEB's someclumsy convention like macro is needed only for language'sinflexibility. And as style, we can avoid limitation coming fromphysical paper. We don't have to care about pages nor font size, butlet's concentrate its logical structure. Hyper link helps to supportnavigating in random access instead of page numbers.&lt;p&gt;This is an outline of current thought. I don't think special fancyfeature is needed for first prototype (actually, I have made a lot ofprototypes already, and this is not exactly the first). The simplestsolution might be best. And when we need more, I would make everythingfrom scratch in &quot;Ian's System&quot; later.&lt;ul&gt;&lt;li&gt;Active Essays: &lt;a href=&quot;http://www.squeakland.org/whatis/a_essays.html&quot;&gt;http://www.squeakland.org/whatis/a_essays.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;About LogoWiki: &lt;a href=&quot;http://www.squeakland.org/whatis/a_essays.html&quot;&gt;http://www.redhat.com/archives/olpc-software/2006-April/msg00035.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-2405528360076909454?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/08/active-essays-on-web.html</link><guid>b4ac0d8d2274e04338c1032f0abd33bf</guid></item>
<item><title type="text">Next Goals of My Hobby</title><description type="html">&lt;p&gt;I need my next three month research goals by next Tuesday'smeeting. But it is too hard for me to write a documentation beforewriting source code.  Because I'm a 100% pure programmer, I programtherefore I am.&lt;p&gt;But I have to write something anyway. It might be better to writesomething fun idea before serious documentation. So my brain willswitch to &quot;writing mode&quot; smoothly. So I made up my next three monthhobby goals. This is it.&lt;h3&gt;Simple Electronics Device&lt;/h3&gt;&lt;p&gt;When I was first interested in electronics was around ten yearsold. I have tried a couple of electronics projects. However, I hadnever understood how to decide parameters of component. Sure, resistorsand ohm's law are pretty easy, but capacitor, transistor, coil, suchcomponents are quite difficult. I hate numbers and I am too lazy tohandle complicated equation.&lt;p&gt;Those knowledge is completely unnecessary as a programmer. But sametime, I couldn't tolerate the fact that I was ignorance aboutelectronics. So I got started to learn it again a couple of monthago. First goal is to make a simple device to communicate between acomputer and real world. This is one of early attempts.&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/aQxPazQgKUw&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/aQxPazQgKUw&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;h3&gt;FPGA Block RAM and Demonstration&lt;/h3&gt;&lt;p&gt;I happen to get a source code of tiny CPU in Verilog. This is quitebeautiful so I bought a Spartan-3A FPGA board for $200 to test thiscode. FPGA is very interesting gadget. But it requires different waysof thinking against programmer's view. So I still do nothing forit. One of the problems is I don't understand how to use BlockRAM. And I don't have nice idea to demonstrate it. Just running a CPUis too boring. I wish I can run the verilog CPU with fun demoperfectly.&lt;h3&gt;A Compiler in Javascript&lt;/h3&gt;&lt;p&gt;It still doesn't go beyond a joke. I have played a tiny source codein x86 assembler with GNU as. It was when I was teen that I played Z80CPU, and I was surprised the some essence of Z80 machine code is stillalive in modern CPUs (I had imagined as if modern CPU might havehundreds and thousands of generic registers, but still we call EAXregister as an accumulator!). I can't say as it is good though, it isvery appealing to me.&lt;p&gt;So I think that it would be fun if I will make a compiler,assembler and linker in Javascript on a web browser. It might supportonly one CPU and one platform like x86 linux, still it should be agood exercises.&lt;p&gt;I could write those ideas more. But this is it today.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-1165555990205943196?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/08/next-goals-of-my-hobby.html</link><guid>c0bca2599e525d5dcc98ad87f8b58ad7</guid></item>
<item><title type="text">Learning Erlang and Adobe Flash format same time</title><description type="html">&lt;img src=&quot;http://languagegame.org/pub/swf_simple.png&quot;&gt;&lt;/img&gt;&lt;p&gt;Since &lt;a href=&quot;http://lukego.livejournal.com/&quot;&gt;Luke Gorrie&lt;/a&gt;encouraged me to learn Erlang, I have been playing with a bit with thelanguage. One of the most attracting points is&lt;a href=&quot;http://erlang.org/doc/programming_examples/bit_syntax.html&quot;&gt;bitsyntax&lt;/a&gt;. When you want a byte array with 65, 66, 67. I can write itas &amp;lt;&amp;lt;65,66,67&amp;gt;&amp;gt;. Further more, When you want a bit pattern of 4 infour bits, 1 in four bits and 0x4243 in 16 bits, you may say &amp;lt;&amp;lt;4:4,1:4, 16#4243:16&amp;gt;&amp;gt;. What a cool!&lt;/p&gt;&lt;pre&gt;$ erlEshell V5.6.4  (abort with ^G)1&amp;gt; &amp;lt;&amp;lt;65,66,67&amp;gt;&amp;gt;.  % numbers are printed with ASCII&amp;lt;&amp;lt;&quot;ABC&quot;&amp;gt;&amp;gt;2&amp;gt; &amp;lt;&amp;lt;4:4, 1:4, 16#4243:16&amp;gt;&amp;gt;.&amp;lt;&amp;lt;&quot;ABC&quot;&amp;gt;&amp;gt;&lt;/pre&gt;&lt;p&gt;I was soon tempted to build a meaningful binary data with thissyntax. What does suit? Adobe Flash format would be the weirdest andcoolest. It's weirdest because of very bits oriented taste by perhapshistorical reasons. It's coolest because it's popular. I want to showyou how Erlang is powerful by writing complicated SWF format in thesophisticatedsyntax. Fortunately, &lt;a href=&quot;http://www.adobe.com/devnet/swf/&quot;&gt;theSWF specification&lt;/a&gt; is now free and everybody can write a flasheditor by themselves.&lt;/p&gt; &lt;p&gt;First of all, Ichose &lt;a href=&quot;http://erlang.org/doc/man/escript.html&quot;&gt;scriptingstyle&lt;/a&gt; because I'm too lazy to wait for a compiler. And I start ashell bang line.&lt;/p&gt;&lt;pre&gt;#!/usr/bin/env escript%% -*- erlang -*-%%! debug verbose&lt;/pre&gt;&lt;p&gt;I don't understand how it works, but I just copied from themanual. And then, I have to decide what my first flash file lookslike. I'm modest enough to satisfy just a salmon colored window. Thisis a spec file representing my flash.&lt;/p&gt;&lt;pre&gt;% an example flash contents.spec() -&amp;gt;    {{frame_size, 2000, 3000},     {frame_rate, 10},     {frame_count, 10},     [{set_background_color, {rgb, 250, 100, 100}},      {show_frame},      {end_tag}]}.&lt;/pre&gt;&lt;p&gt;This is already reflected by the structure of a flash file. A flashfile starts with meta data of file size, frame rate, and framecount. And a bunch of tagged data are followed. Tagged data is the keyof extensibility of the flash format. You can embed various kinds ofmedia as various type of tags in a file. In Erlang, fixed sized datais represented as {tuples}, and variable sized data is [lists]. Iwrite each element as {key, arg1, arg2, ...} style, and tags arerepresented as a list. You might understand each tuple's meaning. Youcan change the color or size if you like.&lt;/p&gt;&lt;p&gt;Rest of the program reads this data and write a SWF file. I'llexplain the program in a top down fashion. The simple main functionopens a file and write something. Actual data is created by swf/0(name/arity is Erlang's way to point to a function) as a sequence ofbinary.&lt;/p&gt;&lt;pre&gt;main(_) -&amp;gt;    Filename = &quot;simple.swf&quot;,    {ok, S} = file:open(Filename, [binary, write]),    file:write(S, swf(spec())),    file:close(S).&lt;/pre&gt;&lt;p&gt;Now interesting part begins. If you read Chapter 2: SWF StructureSummary in the SWF specification, you may find that the Erlang programis much more concise and easier to understand than long description inthe specification (although, I admit that I omitted somedetails). Especially, a bit syntax part is obvious, &quot;FWS&quot; is threebyte characters, 'Version:8/unsigned-little' is a 8 bits integer forversion number, and 'FileLength:32/unsigned-little' follows as a 32bits little endian unsigned integer for file length. 'Rest/binary'looks tricky, but it means that another binary data Rest is embeddedhere.&lt;/p&gt;&lt;pre&gt;% SWF Structureswf(Spec) -&amp;gt;    Version = 10,    Rest = swf_rest(Spec),    FileLength = size(Rest) + 8,    &amp;lt;&amp;lt;&quot;FWS&quot;,     Version:8/unsigned-little,     FileLength:32/unsigned-little,     Rest/binary&amp;gt;&amp;gt;.&lt;/pre&gt;&lt;p&gt;Because I needed to know the file size in advance, I had to splitthe main part in two. Swf_rest/1 composes every elements in data, andswf/1 mesures its file size and puts to the top. To pass my sampledata to swf_rest/1, Iuse &lt;a href=&quot;http://erlang.org/doc/reference_manual/expressions.html#pattern&quot;&gt;patterns&lt;/a&gt;. Thanksto to tuples and patterns, I don't have to remember an order ofarguments. It lookslike &lt;a href=&quot;http://docs.python.org/tutorial/controlflow.html#keyword-arguments&quot;&gt;keywordarguments&lt;/a&gt; and more generic. Note that words begins with a lowercase like 'frame_size' are symbols and words begins with a capitallike 'Width' are variables in Erlang, in my case, 2000 is set toWidth. In SWF file, a special unit 'twips' is used, 20 twips are apixel.&lt;/p&gt;&lt;p&gt;A &lt;a href=&quot;http://erlang.org/doc/programming_examples/list_comprehensions.html&quot;&gt;listcomprehensions&lt;/a&gt; is another useful feature. I only used it as ashorthand of &quot;map&quot; function like [tag(X) || X &amp;lt;- Tags], which meansapply tag/1 function to each element in Tags, but it saved manytyping.&lt;/p&gt;&lt;pre&gt;swf_rest({{frame_size, Width, Height},   {frame_rate, FrameRate},   {frame_count, FrameCount},   Tags}) -&amp;gt;    FrameSize = rectangle({rectangle, 0, Width, 0, Height}),    FrameRateData = fixed8dot8(FrameRate),    TagsData = list_to_binary([tag(X) || X &amp;lt;- Tags]),    &amp;lt;&amp;lt;FrameSize/binary,     FrameRateData/binary,     FrameCount:16/unsigned-little,     TagsData/binary&amp;gt;&amp;gt;.&lt;/pre&gt;Let's take a look at some detail of data type used in SWF. Color issimple, it is just an array of three bytes for Red, Green, and Blue.The description of 16-bit 8.8 fixed-point number in the specificationlooks very complicated, but it just said that you have to put theinteger part last.&lt;pre&gt;% Basic Data Typesrgb({rgb, R, G, B}) -&amp;gt; &amp;lt;&amp;lt;R:8, G:8, B:8&amp;gt;&amp;gt;.fixed8dot8(N)-&amp;gt;    IntegerPart = trunc(N),    SmallPart = trunc((N - IntegerPart) / 1 * 256),    &amp;lt;&amp;lt;SmallPart:8, IntegerPart:8&amp;gt;&amp;gt;.&lt;/pre&gt;&lt;p&gt;This is my favorite part. Rectangles are stored as verybit-oriented way. First, you must get a enough bit size to store eachelement (Nbits). Second, four elements are stored in this bitsize. Third, entire bits should be byte-aligned. This kind of tasksare very tricky in other languages, it require a lots of shifts, ands,ors, etc. But Erlang's bit syntax helps me a lot.&lt;/p&gt;&lt;p&gt;I wrote two (actually three) helper functions to make rectangle/1simpler. nbits_signed/1 calculate enough bit size for a list of signedintegers, and padding/1 fills zeros to align byte width. '/bitstring'is same as '/binary', but you can use it for any odd size of bits datawhile binary works only byte arrays.&lt;/p&gt;&lt;pre&gt;rectangle({rectangle, Xmin, Xmax, Ymin, Ymax}) -&amp;gt;    Nbits = nbits_signed([Xmin, Xmax, Ymin, Ymax]),    padding(&amp;lt;&amp;lt; Nbits:5,      Xmin:Nbits/signed-big,      Xmax:Nbits/signed-big,      Ymin:Nbits/signed-big,      Ymax:Nbits/signed-big&amp;gt;&amp;gt;).nbits_unsigned(XS) -&amp;gt; % Necessary bits size for a list of integer values.    Max = lists:max([abs(X) || X &amp;lt;- XS]),    trunc(math:log(Max) / math:log(2)) + 1.nbits_signed(XS) -&amp;gt; nbits_unsigned(XS) + 1.padding(Bits) -&amp;gt;    Padding = 8 - bit_size(Bits) rem 8,    &amp;lt;&amp;lt;Bits/bitstring, 0:Padding&amp;gt;&amp;gt;.&lt;/pre&gt;&lt;p&gt;Tags are the most important data structure in SWF. There are shortand long tags. Short one is used for 62 bytes of data or less. Becausetag code and length is packed in one place, you can save precious 16bits space with short tag! Tricky part is here. In short tag, typecode and length are stored respectively 10 bits and 6 bits, however,you have to save it as whole 16 bits integer in a little endian.&lt;pre&gt;Big endian|Type               |Length     ||9|8|7|6|5|4|3|2|1|0|5|4|3|2|1|0|Little endian|Typ|Length     |Type           ||1|0|5|4|3|2|1|0|9|8|7|6|5|4|3|2|&lt;/pre&gt;What a crazy?! (actually, it is not so strange than it looks if yousee carefully. Hint: bits runs right to left, bytes runs left toright). Even these funny endianess conversion is handled easily inErlang because bit syntax can be used in patterns (input).&lt;pre&gt;% Tag Formatrecord_header_body(Type, Body) -&amp;gt; record_header_body(Type, Body, size(Body)).record_header_body(Type, Body, Length) when Length &amp;lt; 63 -&amp;gt;     &amp;lt;&amp;lt;TagCodeAndLength:16/unsigned-big&amp;gt;&amp;gt; = &amp;lt;&amp;lt;Type:10, Length:6&amp;gt;&amp;gt;,    [&amp;lt;&amp;lt;TagCodeAndLength:16/unsigned-little&amp;gt;&amp;gt;, Body];record_header_body(Type, Body, Length) -&amp;gt;    &amp;lt;&amp;lt;TagCodeAndLength:16/unsigned-big&amp;gt;&amp;gt; = &amp;lt;&amp;lt;Type:10, 63:6&amp;gt;&amp;gt;,    [&amp;lt;&amp;lt;TagCodeAndLength:16/unsigned-little&amp;gt;&amp;gt;,     &amp;lt;&amp;lt;Length:32/unsigned-little&amp;gt;&amp;gt;,     Body].&lt;/pre&gt;Finally, I'll show you the format of actual contents. Now I have onlythree tags for End (type=0), ShowFrame(type=1), andSetBackgroundColor(type=9). You might easily add new tags to supportmore convincing flash contents. Latest tag number is 91 forDefineFont4, see APPENDIX B Reverse index of tag values in thespecification.&lt;pre&gt;% Control Tagstag({end_tag}) -&amp;gt; record_header_body(0, &amp;lt;&amp;lt;&amp;gt;&amp;gt;);tag({show_frame}) -&amp;gt; record_header_body(1, &amp;lt;&amp;lt;&amp;gt;&amp;gt;);tag({set_background_color, RGB}) -&amp;gt; record_header_body(9, rgb(RGB)).&lt;/pre&gt;I uploaded an entire programat &lt;a href=&quot;http://languagegame.org/pub/swf_simple.erl&quot;&gt;swf_simple.erl&lt;/a&gt; Erlangis famous for its concurrent programming model, but I found anotheraspects like bit syntax and pattern matching are also attractive anduseful to real application.&lt;ul&gt;&lt;li&gt;The SWF Specification: &lt;a href=&quot;http://www.adobe.com/devnet/swf/pdf/swf_file_format_spec_v10.pdf&quot;&gt;http://www.adobe.com/devnet/swf/pdf/swf_file_format_spec_v10.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-8331947757026252709?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/03/learning-erlang-and-adobe-flash-format.html</link><guid>4e97d7440bdb554b99bc6adb2f696bb2</guid></item>
<item><title type="text">OpenDocument on Squeak</title><description type="html">&lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;http://photos1.blogger.com/x/blogger/7724/552/1024/568636/odfWorkspace.jpg&quot;&gt;&lt;img style=&quot;CLEAR: all; MARGIN: 0px 10px 10px 0px; CURSOR: hand&quot; alt=&quot;&quot; src=&quot;http://photos1.blogger.com/x/blogger/7724/552/400/424461/odfWorkspace.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The end of last month, a french student asked me about my OpenDocumentFormat module for Squeak. ODF??? Yes, I have been written a ODF exporter based on Diego's stuff for a project. &lt;a href=&quot;http://www.squeaksource.com/OpenDocument.html&quot;&gt;http://www.squeaksource.com/OpenDocument.html&lt;/a&gt; But I haven't maintenance for a while because I was busy for another project now. I was feeling somewhat guilty because it should be useful even on normal Squeak image if I put some fix. So actually his bug report was a good opportunity to clean up my code. And this is one. It works with Squeakland, Squeak3.8, and Squeak3.9 (YAXO is needed).&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.squeaksource.com/OpenDocument/OpenDocument-Core-tak.35.mcz&quot;&gt;http://www.squeaksource.com/OpenDocument/OpenDocument-Core-tak.35.mcz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.squeaksource.com/OpenDocument/OpenDocument-Workspace-tak.1.mcz&quot;&gt;http://www.squeaksource.com/OpenDocument/OpenDocument-Workspace-tak.1.mcz&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&amp;nbsp;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-117595808594713288?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2007/04/opendocument-on-squeak.html</link><guid>9a85b491890a414c389b7f2a399c6d03</guid></item>
<item><title type="text">My next three months goals.</title><description type="html">&lt;p&gt;The main point of my previous three months goals was making a texteditor on Ian's stuff &lt;a href=&quot;http://tinlizzie.org/svn/trunk/bottle/&quot;&gt;http://tinlizzie.org/svn/trunk/bottle/&lt;/a&gt;. I admitthat it has not been finished in terms of building a really usefultext widget. Making a text editor looks simple requirement. But evenjust a substitute widget for Squeak's ParagraphEditor from scratch isquite complicated because it has to deal with a large number of issueslike text layout, scroll, font rendering, etc. To make the goalclearer and smaller, I propose one concrete prototype and one realimplementation.&lt;h3&gt;An authoring tool for Active Essays on web browser.&lt;/h3&gt;&lt;p&gt;It will be direct successor of TileScript &lt;a href=&quot;http://tinlizzie.org/jstile/&quot;&gt;http://tinlizzie.org/jstile/&lt;/a&gt;  and YUI-based tool for Active Essays&lt;a href=&quot;http://tinlizzie.org/ometa-js/alan/essays.html&quot;&gt;http://tinlizzie.org/ometa-js/alan/essays.html&lt;/a&gt;. Those were difficultto use even sometimes for myself because they were too heavy and UIwas complicated. The focus of this project is brushing up the UI. Iwill not add a new function, but it will have enough features toexpress some of examples in Appendix A of STEP paper and Ted's puzzle.&lt;ul&gt;&lt;li&gt;Basic text emphasis (header, list, in-line image)&lt;li&gt;Wiki based collaboration mechanism.&lt;li&gt;&quot;include&quot; mechanism&lt;li&gt;OMeta/JS can be used through &quot;include&quot;&lt;li&gt;Supported platform: IE6 and Firefox3&lt;/ul&gt;&lt;h3&gt;A basic widget component for Active Essays on Ian's stuff.&lt;/h3&gt;&lt;p&gt;This is a real stuff based on above prototype. Every necessary widgetwhich needed for text editing including text emphasis and in-lineimage will be implemented.  Wiki-based collaboration part won't beincluded.&lt;p&gt;This text widget can be used a part of Ted's DB Jr.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-8886332194677632434?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/08/my-next-three-months-goals.html</link><guid>8d395573d8660c6c82f5319e108fdbe5</guid></item>
<item><title type="text">Lazy list and Data flow in Squeak</title><description type="html">&lt;h4&gt; Introduction &lt;/h4&gt;&lt;p&gt;I have been working on lazy list these days. A lazy list is acollection where each element is evaluated only when it'snecessary. Lazy lists are very useful to express mathematical infinitesequence naturally like all natural numbers, entire prime numbers, orso.&lt;/p&gt;&lt;p&gt;Lazy lists are also practical when you deal with a large sequenceof data. Imagine that you want to replace particular words in a largetext, and print out just the first 100 characters. Without lazy list,you must either, 1) replace all words and take first 100 characters,or 2) count character position carefully each time when a word isreplaced. 1) requires time, and 2) tend to lost modularity. With lazylists, you can write such program as simple as former way, butperformance is still reasonable.&lt;/p&gt;&lt;p&gt;Non-strict functional language like Haskell supports this featurein everywhere, but I was also interested in implementations of lazylists in &quot;normal&quot; languages.  Even though its long history, lazy listshave not been widely used. Lazy lists are sometimes called as&quot;Stream&quot;, and indeed, Unix's pipe can be seen as a kind of lazylist. But it lacks generality. I wondered if I can find some traps tobe solved when I implement it myself. Squeak is a powerful tool forthe purpose because it has flexible runtime debugging support. And Ibelieve most part of difficulty in the concept comes from difficultyof its runtime behavior.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://mitpress.mit.edu/sicp/full-text/sicp/book/node69.html&quot;&gt;SICP&lt;/a&gt;is a good tutorial and I found further discussionsin &lt;a href=&quot;http://srfi.schemers.org/srfi-40/srfi-40.html&quot;&gt;SRFI-40&lt;/a&gt;and&lt;a href=&quot;http://srfi.schemers.org/srfi-41/srfi-41.html&quot;&gt;SRFI-41&lt;/a&gt;. Rubyhas good &lt;a href=&quot;http://lazylist.rubyforge.org/&quot;&gt;implementation&lt;/a&gt;similar to SRFI-41. And even Squeak has two implementations(&lt;a href=&quot;http://www.squeaksource.com/LazyList.html&quot;&gt;LazyList&lt;/a&gt;and &lt;a href=&quot;http://www.squeaksource.com/LazyCollections.html&quot;&gt;LazyCollections&lt;/a&gt;)!And here is my story.&lt;/p&gt;&lt;h4&gt; Natural numbers &lt;/h4&gt;&lt;p&gt;You can download a demo imagefrom &lt;a href=&quot;http://languagegame.org/pub/LazyList.zip&quot;&gt;LazyList.zip&lt;/a&gt;or current source code from&lt;a href=&quot;http://www.squeaksource.com/Leisure/Collections-Lazy-tak.5.mcz&quot;&gt;Collections-Lazy-tak.5.mcz&lt;/a&gt;.This source only uses basic functions in my home brewed image, butplease let me know if it doesn't work in your Squeak image.&lt;/p&gt;&lt;p&gt;This is an expression to make natural numbers with LazyList.&lt;/p&gt;&lt;pre&gt;list := LazyList nat.&lt;/pre&gt;&lt;p&gt;I took advantage of Squeak tools, inspector and explore. If youinspect the variable &quot;list&quot; (select &quot;inspect it&quot; in the context menu),you will see internal structure of the list. And if you explore thelist (select &quot;explore it&quot;), you see public &quot;interface&quot; of thelist. I'll show you what I meant.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/3618079605/&quot; title=&quot;LazyList1 by propella, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3342/3618079605_3252d9eb72_o.jpg&quot; width=&quot;435&quot; height=&quot;202&quot; alt=&quot;LazyList1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;And when you open a list at the explorer (the right window), values ofpublic accessors &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; are shown,and also the inspector is updated. The first element 1 is made onlybecause someone send&lt;code&gt;head&lt;/code&gt; message. And you can get further numbers withclicking &lt;code&gt;tail&lt;/code&gt; accessor. Note that while explorer triggersthe list, inspector is inert so that you can freely observe internalbehavior of the list.&lt;a href=&quot;http://www.flickr.com/photos/propella/3618974548/&quot; title=&quot;LazyList2 by propella, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2455/3618974548_b828e71321_o.jpg&quot; width=&quot;432&quot; height=&quot;197&quot; alt=&quot;LazyList2&quot; /&gt;&lt;/a&gt;&lt;p&gt;You can do this by a program. Message &lt;code&gt;head&lt;/code&gt; answers thefirst element of a list, and &lt;code&gt;tail&lt;/code&gt; answers followinglist. This is same as CAR and CDR pair in lisp. Many other methods aredefined e.g. &lt;code&gt;take:&lt;/code&gt; returns a LazyList including first nelements, and contents convert LazyList to Array.&lt;/p&gt;&lt;pre&gt;list head. &quot;=&gt; returns 1&quot;list tail. &quot;=&gt; returns LazyList ..&quot;(list take: 10) contents. &quot;=&gt; #(1 2 3 4 5 6 7 8 9 10)&quot;&lt;/pre&gt;&lt;p&gt;And then, try next expression. You might know that select: is amessage where a selected collection specified by a block as acondition is returned (this is &quot;filter&quot; in other language). But howpossibly all natural numbers can be used with select:? Unlike othercollection methods, it doesn't evaluate a condition blockimmediately. Instead, this method returns a new list which will bebehave as a filter of natural numbers.&lt;/p&gt;&lt;pre&gt;list select: [:e | e odd].&lt;/pre&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/3618367779/&quot; title=&quot;LazyList3 by propella, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3614/3618367779_5ea1c429ba_o.jpg&quot; width=&quot;420&quot; height=&quot;196&quot; alt=&quot;LazyList3&quot; /&gt;&lt;/a&gt;&lt;h4&gt; Define a new LazyList &lt;/h4&gt;Most useful way to construct a new lazy list would be using&lt;code&gt;followedBy:&lt;/code&gt; method. The receiver becomes head of newlist, and the argument becomes tail. You can use it with any receiver,and the argument must be a LazyList or block that returns aLazyList. LazyList nil is used to specify end of the list.&lt;pre&gt;1 followedBy: (2 followedBy: (3 followedBy: LazyList nil))&quot;=&gt; same as LazyList withAll: #(1 2 3)&quot;&lt;/pre&gt;You can define natural numbers using &lt;code&gt;followedBy:&lt;/code&gt; likethis.&lt;pre&gt;nat := 1 followedBy: [nat collect: [:e | e + 1]].&lt;/pre&gt;It seems very strange! But please be relax. The first element of thelist is obviously 1. How about the second? &lt;code&gt;collect:&lt;/code&gt; issometimes called as map function in other languages, and &lt;code&gt;natcollect: [:e | e + 1]&lt;/code&gt; answers a LazyList with all element isjust larger by 1 than nat itself. Therefore the sequence is generatedby recursive fashion. How clever!&lt;pre&gt;nat                                           = 1, ...nat collect: [:e | e + 1]                     = 2, ...nat = 1 followedBy: nat collect: [:e | e + 1] = 1, 2, ...nat collect: [:e | e + 1]                     = 2, 3, ...nat = 1 followedBy: nat collect: [:e | e + 1] = 1, 2, 3, ...nat collect: [:e | e + 1]                     = 2, 3, 4, ...nat = 1 followedBy: nat collect: [:e | e + 1] = 1, 2, 3, 4, ...&lt;/pre&gt;Squeak Smalltalk has some great heritage from APL. Many arithmeticfunctions are defined in collections. So does LazyList. There is amuch simple definition of natural number.&lt;pre&gt;nat := 1 followedBy: [nat + 1].&lt;/pre&gt;It reminds me an ugly assignment expression with side effect.&lt;pre&gt;x := x + 1.&lt;/pre&gt;&lt;p&gt;This is ugly because it looks like an equation but it isnot. &lt;code&gt;x&lt;/code&gt; is never equal to &lt;code&gt;x + 1&lt;/code&gt;!  Sometimesit confuses a beginner programmer. Still, it is too useful toignore. We need some reasoning of such side effect to use safely. Onthe other hand, &lt;code&gt;nat := 1 followedBy: [nat + 1]&lt;/code&gt; is similarenough to &lt;code&gt;x := x + 1&lt;/code&gt; yet, it is actually anequation. This is a significant coincidence, isn't it?&lt;/p&gt;&lt;h4&gt; Iteration, Data flow, Lazy list, and Polymorphic functions &lt;/h4&gt;&lt;p&gt;One of the problems in &lt;code&gt;x := x + 1&lt;/code&gt; is that value of xdepends on the position in the source code. So you have to be carefulabout order of each expression. Are there any better ways? You canimagine more mathematical programming language to allow you to definea function as a equation.&lt;/p&gt;&lt;pre&gt;x&lt;sub&gt;1&lt;/sub&gt; = 1 --- some initial numberx&lt;sub&gt;n&lt;/sub&gt; = x&lt;sub&gt;n - 1&lt;/sub&gt; + 1&lt;/pre&gt;&lt;p&gt;In this equations, it is clear that right hand side of x is olderthan left hand side of x. This is pure and easy to reason. But anotherproblem occurs. In practice, the program requires whole history of xsbecause now a programmer can specify any old value like &lt;code&gt;x&lt;sub&gt;n -100&lt;/sub&gt;&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;So I would add a restriction. What if only addition is allowed insubscript. In other words, what if only &quot;future&quot; value can be referredbut &quot;past&quot; so that we can forget our unnecessary past conveniently (itis possible with nice GC).&lt;/p&gt;&lt;pre&gt;x&lt;sub&gt;1&lt;/sub&gt; = 1 --- some initial numberx&lt;sub&gt;n + 1&lt;/sub&gt; = x&lt;sub&gt;n&lt;/sub&gt; + 1&lt;/pre&gt;It makes the relationship between an iteration &lt;code&gt;x := x + 1&lt;/code&gt;and a lazy list more clear.  This iteration can be converted a lazylist definition directly.&lt;pre&gt;nat := 1 followedBy: [nat + 1].      ~~~            ~~~~~~~~~    x&lt;sub&gt;1&lt;/sub&gt; = 1;        x&lt;sub&gt;n + 1&lt;/sub&gt; = x + 1&lt;/pre&gt;&lt;p&gt;I know this discussion is still rough. You can find betterdiscussionfrom &lt;a href=&quot;http://en.wikipedia.org/wiki/Lucid_(programming_language)&quot;&gt;Lucid&lt;/a&gt;. However,my theory is that data flow structures (mathematical iteration) can beexpressed by lazy lists and polymorphic methods without speciallanguage.&lt;/p&gt;&lt;p&gt;Here is another example of definition of a lazy list in iterativeway to compute Fibonnaci numbers. &lt;code&gt;next&lt;/code&gt; is a synonymof &lt;code&gt;tail&lt;/code&gt;.&lt;/p&gt;&lt;pre&gt;fib := 1 followedBy: [1 followedBy: [fib + fib next]].&lt;/pre&gt;&lt;p&gt;This corresponds next mathematical equations.&lt;/p&gt;&lt;pre&gt;fib&lt;sub&gt;1&lt;/sub&gt; = 1fib&lt;sub&gt;2&lt;/sub&gt; = 2fib&lt;sub&gt;n + 2&lt;/sub&gt; = fib&lt;sub&gt;n&lt;/sub&gt; + fib&lt;sub&gt;n + 1&lt;/sub&gt;&lt;/pre&gt;&lt;h4&gt; Simulations &lt;/h4&gt;&lt;p&gt; As a little bit more realistic example, I will show you a gravitysimulation using lazy lists. In this demo, a global variable Y showsheight of an object, the first position is 400, and it is increased bySpeed. The initial value of Speed is 0 and the value is decreased by 1while the hight Y is positive. If Y is negative, Speed is negatedwhich means the object is bounced by the ground!&lt;/p&gt;&lt;pre&gt;Y := 400 followedBy: [Y + Speed next].Speed := 0 followedBy: [Y &gt; 0 whenTrue: Speed - 1                             whenFalse: Speed negated].&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/3620577198/&quot; title=&quot;LazyList by propella, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3591/3620577198_689d22aba0_o.gif&quot; width=&quot;628&quot; height=&quot;426&quot; alt=&quot;LazyList&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Morphic part of this demo used a special morph named ListPointerthat worked as an interface between LazyList and Morphs.&lt;/p&gt;&lt;p&gt; I began this library as a replacement of Stream andOrderedCollection. But it turned out that combination of polymorphicmethods and LazyList has unexpected cute property as data flow. I'mvery happy about the fact! If you are interested in rather practicalaspect of lazy lists, please check out List &gt;&gt; show method in thislibrary. printString for LazyList is implemented this frameworkitself. &lt;/p&gt;&lt;p&gt; I already noticed that there are a lot of rooms I could improveit. The design was briefly along with SRFI-40, but I will include moreideas in SRFI-41 and Ruby's lazylist.  I have ignored them so farsimply because I am lazy! &lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-7692350129107574145?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/06/lazy-list-and-data-flow-in-squeak.html</link><guid>3526b7c7ca915f7728879151051dea31</guid></item>
<item><title type="text">My personal history of Web Authorizing Tools (1)</title><description type="html">&lt;p&gt;I have been facinated by the idea of combining web authorizing andprogramming even before I realize it is called Active Essay. ActuallyI made a numbers of projects along with the idea. Here is a shortstory of my side.&lt;h3&gt;Scamper Workspace&lt;/h3&gt;&lt;p&gt;Scamper Workspace is a extention for Scamper, a web browser written inSqueak. It runs a Smalltalk code on any web page with simpleoperation.&lt;p&gt;I often write a tiny source code in Squeak on my blog. And it isnatural that you want to run the code without any effort. Usually, youmight have to copy and paste from web browser to Squeak. However,although Squeak has already a web browser named &quot;Scamper&quot;, why do weneed such clumsy way? What's wrong if a web page is just a text assame as other Squeak's text object, and if you can use full featureswhich Squeak IDE has on it.  Scamper has very limited as a webbrowser, but it is just O.K. to examine a code on blog. Only missingthing is a direct way to execute code on web page.&lt;p&gt;&quot;No Application&quot; is Squeak's original motto. Squeak consists with anumber of objects that they have each different tiny functions, andthose are connected naturally. In that sense, there are no need of&quot;Application&quot; because application is just an artificial boundary. Soit seems to me natural to add Workspace menu into Scamper.&lt;p&gt;Because all necessary code is already available in Squeak image. Theimplementation was very easy. However the result was surprisinglyattractive and profound.  Thoru Yamamoto made a lot of contents forScamper Workspace and each of them are so exciting.&lt;p&gt;Typical page written for Scamper Workspace consists with a short storyand a couple of codes. A reader would executes the codes while readinga story. This format is very effective when the story is to explainhow to make a graphical program in Squeak.  Especially the fearure isemphasized when a page consists only text and source code. Even itlookes if it were 1995's website, it make large variety of effects ifyou run the code. I would say that it could be another possibleevolution path for the Web.&lt;h3&gt;StackWiki&lt;/h3&gt;&lt;p&gt;StackWiki is a multimedia authorizing tool written in Squeak. Documentis saved as original binary format with Swiki Server.&lt;p&gt;I made StackWiki inspired by Zest and Marmalade. Zest is WYSIWYGauthoring tool like Wiki uses local disk, which allows you to makelink to other page, and dynamic content in Smalltalk language. Aboveall, StackWiki emphasis more features in HyperCard and Wiki.&lt;p&gt;A StackWiki project consists with one or more pages. In WWW, nomallyrelationship between pages is maintained only hyper link, but there isno structure like hierarchy or order. Some websites attempt to showsuch structure with navigation link.&lt;p&gt;Structure among pages helps user to know a point within the contextthough, it often makes UI complicated. Addition to historicalnavigation, forward and backword navigation is needed if pages have anorder. Above all, if there is hierarchy, three dimensional navigationwould be necessary, In StackWiki, only foward and backword structureis used.&lt;p&gt;With background, you can put together similar structures in multipleplace in one. StackWiki only allows one background, although HyperCardcould handle more. Background is implemented as a special &quot;background&quot;page. If you add something onto background page, the element are shownsame place behind other elements in all pages.&lt;p&gt;Here is another interesting trade off. How complicated background isneeded?  Background can be seen as a special version of macro. Macrois a generic term to represent common structure among document. Macrois very useful to reduce redundancy and to improve maintenancefactor. However, it is easy to make too complicated macro whichincludes macro of macro. In end user's point of view, background canbe better than full macro.&lt;p&gt;Each StackWiki's page is stored as a binary format in Swikiserer. Although, Swiki is itself web application, it is used just asfile upload feature. StackWiki doesn't use any web standard exceptHTTP transport to save data. It doesn't so good attitude in terms ofdata transparency. But it makes the development so quick that it tookonly three days to implement it.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-1228975022962267431?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/09/my-personal-history-of-web-authorizing.html</link><guid>b7a3adf9d31b2afdcc1e636230c33c3b</guid></item>
<item><title type="text">A simple boolean logic table generator in Javascript</title><description type="html">&lt;a href=&quot;http://www.flickr.com/photos/propella/3737237456/&quot; title=&quot;booltable by propella, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2469/3737237456_00b3fa5d6c_o.jpg&quot; width=&quot;581&quot; height=&quot;354&quot; alt=&quot;booltable&quot; /&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;http://languagegame.org/pub/booltable/booltable.html&quot;&gt;http://languagegame.org/pub/booltable/booltable.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Boolean logic is a basic knowledge for all programmers. The idea isvery simple and straightforward, yet still it often annoys you alot. One of the reasons might be that boolean logic is not continuousbehavior, and just a bit of changes makes completely differentresult. This is why it is hard to grab whole character of a booleanexpression, I think.&lt;/p&gt;&lt;p&gt;This tiny program shows every possible state of a boolean expressionto make sure your logic is correct. I wrote this to help me reading atextbook about logic, and to make programming nested conditionstatements easy.&lt;/p&gt;&lt;p&gt;One nice thing is &quot;permlink&quot; function. You can bookmark your favoriteboolean expressions to play again. It works even in file URL as thisis written entirely in Javascript. So feel free to download to yourlocal disk.&lt;/p&gt;&lt;p&gt;Here are a couple of examples to link boolean tables:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://languagegame.org/pub/booltable/booltable.html?q=A%2BB&quot;&gt;A or B&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://languagegame.org/pub/booltable/booltable.html?q=-P%2BQ&quot;&gt;A implies B&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://languagegame.org/pub/booltable/booltable.html?q=(P%3D%3EQ)*(Q%3D%3ER)%3D%3E(P%3D%3ER)&quot;&gt;(P=&amp;gt;Q)*(Q=&amp;gt;R)=&amp;gt;(P=&amp;gt;R)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-4680421063277570293?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/07/simple-boolean-logic-table-generator-in.html</link><guid>9df13d9d65c56fa4b7b89217179e10b1</guid></item>
<item><title type="text">Ostranenie - Crossover between Art and Programming</title><description type="html">&lt;p&gt;It looks like that I have to say something at a camp nextweek. So I trumped up the most easy topic for me, the art. For me, theart is very common and familiar thing that I spent a lot of time todiscuss such matter in my youth. And more importantly, it is somewhatstrange topic for colleagues. I hope it will be fun.&lt;p&gt;One of the most important functions in the art is ostranenie.Ostranenie is a term coined by Russian critic Shklovsky,which means looking a familiar things in unfamiliar ways to find aunexpected side of the subject. For example, most surprising thing fora student who learns a sketch first time was there are no outlines inthe world. Young kids often draw an outline to express the mom'sface. But reality is that a human brain extracts an outline from acontrast of of light and shade.&lt;p&gt;Also a programmer often faces ostranenie. A human tends to think basedon an intuition. But a computer only obeys logics, it never caresabout human's common sense or intuition. The conflict often causeerrors. But the errors give us precious ideas that we have nevernoticed. Human beings have developed common sense and intuitionthrough the long history and culture, so it is very difficult toperceive a difference between logic and intuition without a computer.&lt;p&gt;We can regard the invention of computer in philosophy as the inventionof photograph in the history of art. The invention of photographprovided an artist first different eyes beside human's. And it broughtImpressionism in 19th. Likewise, we met another kind of brain for thefirst time by computers. No one knows what is born from there becausethe history of computer is still young. But we can explore newdirections in terms of ostranenie.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-2690382546741152166?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/09/ostranenie-crossover-between-art-and.html</link><guid>83cd6b65ea1a20a0e44b28f325b1f990</guid></item>
<item><title type="text">Inspy from Turtle Geometry</title><description type="html">&lt;p&gt;&lt;a href=&quot;http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&amp;tid=7287&quot;&gt;TurtleGeometry&lt;/a&gt; by Harold Abelson and Andrea diSessa has a lot ofinteresting examples of turtle graphics. Especially I was fascinated&quot;inspy&quot; program. The basic structure of inspy is same as spiral. Butinstead of the side, value of the angle is changed in each step. Ihave explored a bit for a demo of Chalkboard project&lt;a href=&quot;http://tinlizzie.org/chalkboard/#Inspi&quot;&gt;http://tinlizzie.org/chalkboard/#Inspi&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;To make the study easier, I made a trick to connect an eventhandler and an inspy program. You can play with a dynamic version ofinspy program with it (Please move the mouse on next rectangle). Andyou may find various patterns even from such simple program. Here Ipresent stand alone version (Only Firefox and Safari are supported).&lt;/p&gt;&lt;canvas width=&quot;400&quot; height=&quot;400&quot; id=&quot;canvas&quot; onmousemove=&quot;turtleInit()&quot; style=&quot;border: 1px solid #808080; background: #e0f0e0;&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/propella/2920068605/&quot; title=&quot;inspy by propella, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3126/2920068605_ff84d6909a_o.png&quot; width=&quot;410&quot; height=&quot;409&quot; alt=&quot;inspy&quot; /&gt;&lt;/a&gt;&lt;/canvas&gt;&lt;div id=&quot;watcher&quot;&gt;&lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;if (window.Element &amp;&amp; !Element.prototype.getBoundingClientRect) {  Element.prototype.getBoundingClientRect = function() {    var coords = { left: 0, top: 0, width: this.offsetWidth, height: this.offsetHeight };    var element = this;    while (element) {      coords.left += element.offsetLeft;      coords.top += element.offsetTop;      element = element.offsetParent;    }    return coords;  };}turtleInit = function() {  if (window._watcher) return  canvas = document.getElementById(&quot;canvas&quot;);  _watcher = document.getElementById(&quot;watcher&quot;);  source = document.getElementById(&quot;source&quot;);  ctxt = canvas.getContext('2d')  ctxt.lineWidth = 1  canvas.onmousemove = canvas_onmousemove  Turtle = {    x: canvas.width / 2,    y: canvas.height / 2,    angle: 0,    color: &quot;black&quot;,  }  move(function() {    inspi(15, mouseX(), mouseY())  })}forward = function(n) {    ctxt.strokeStyle = Turtle.color    ctxt.beginPath()    ctxt.moveTo(Turtle.x, Turtle.y)    Turtle.x += n * Math.cos(Turtle.angle)    Turtle.y += n * Math.sin(Turtle.angle)    ctxt.lineTo(Turtle.x, Turtle.y)    ctxt.stroke()    ctxt.closePath()}back = function(n) { forward(0 - n) }right = function(n) {    Turtle.angle += n * Math.PI / 180}left = function(n) { right(0 - n) }clean = function(n) {    ctxt.clearRect(0, 0, canvas.width, canvas.height)    Turtle.x = canvas.width / 2    Turtle.y = canvas.height / 2    Turtle.angle = 0    Turtle.penDown = true}color = function(aColor) {  Turtle.color = aColor}// Register an event handlermove = function(func) {  _whenMove = function() {    clean()    func()  }}// Utility functionsmouseX = function() { return _mouseX }mouseY = function() { return _mouseY }_whenMove = null_mouseX = 0_mouseY = 0canvas_onmousemove = function (e) {  var rect = this.getBoundingClientRect()  _mouseX = Math.floor(e.pageX - rect.left)  _mouseY = Math.floor(e.pageY - rect.top)  _watcher.innerHTML = &quot;mouseX: &quot; + _mouseX + &quot; mouseY: &quot; + _mouseY  source.innerHTML = &quot;inspi(15, &quot; + _mouseX + &quot;, &quot; + _mouseY + &quot;)&quot;  if (_whenMove != null) _whenMove()}// if (window.addEventListener) window.addEventListener(&quot;load&quot;, turtleInit, false)&lt;/script&gt;&lt;script type=&quot;text/javascript&quot;&gt;inspi = function(side, angle, inc) {  for (var i = 0; i &lt; 720; i++) {    forward(side)    right(angle + inc * i)  }}&lt;/script&gt;&lt;pre&gt;inspi = function(side, angle, inc) {  for (var i = 0; i &lt; 720; i++) {    forward(side)    right(angle + inc * i)  }}&lt;/pre&gt;&lt;pre id=&quot;source&quot;&gt;inspi(15, mouseX(), mouseY())&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-5610833801987440020?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/10/inspy-from-turtle-geometry.html</link><guid>6472ddfb3e5bc4c9d17718e7b82b84c2</guid></item>
<item><title type="text">Chalkboard</title><description type="html">&lt;a href=&quot;http://www.flickr.com/photos/propella/2848646517/&quot; title=&quot;Chalkboard by propella, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3038/2848646517_728c485d17.jpg&quot; width=&quot;500&quot; height=&quot;363&quot; alt=&quot;Chalkboard&quot; /&gt;&lt;/a&gt;&lt;p&gt;Chalkboard is my latest web authorizing tool for active essay. I havejust uploaded it here &lt;ahref=&quot;http://tinlizzie.org/chalkboard/&quot;&gt;http://tinlizzie.org/chalkboard/&lt;/a&gt;.I tested both Firefox and Safari. I know there are still a lot of UI /technical issues though, I am sure that basic feature is enough for mypurpose, and I will keep it simple.&lt;p&gt;My biggest concern at now is supporting Internet Explorer. I thoughtit was not so difficult for such a simple web application. Butactually it was horrible! and I couldn't solve yet. I might go baddirection though, I was really disappointed about different behaviorof layout. One can say that it is unnecessary to support variousplatforms for such an experimental project. But I think it isimportant because I hope it will get real users finally.&lt;p&gt;When I had to decide a name of directory for this project. I named it&quot;chalkboard&quot;. I felt the spell was too long as a directory name, butI'm comfortable about this naming now.&lt;h3&gt;Here are features.&lt;/h3&gt;&lt;p&gt;The screen have three areas, editor, play area, and transcript.  Youcan write text or source code on the editor. Any text is executed as aJavaScript program with [do it] or [print it] command. [do it] commandprints the answer on the transcript, and [print it] shows the answeron the point of cursor.  The play area provides a free space touser. It is used any purpose, for example, you can make a drawing toolto attach canvas element on it. See &lt;ahref=&quot;http://tinlizzie.org/chalkboard/#Scribble&quot;&gt;http://tinlizzie.org/chalkboard/#Scribble&lt;/a&gt;.&lt;p&gt;The Chalkboard includes a bunch of pages. Each page consists text andsource code. Sauce code is usually written on &amp;lt;pre&amp;gt; tag.&lt;p&gt;All source codes written on &amp;lt;pre&amp;gt; tag in a page are invoked with[run] from top to bottom. This is useful when you encounter unknownpage, and want to try at first. &amp;lt;pre&amp;gt; tag is used when theproject is called by includes function. See &lt;ahref=&quot;http://tinlizzie.org/chalkboard/#Polygon&quot;&gt;http://tinlizzie.org/chalkboard/#Polygon&lt;/a&gt;&lt;p&gt;You can make a new page to specify new name after hash mark of the URLlike http://tinlizzie.org/chalkboard/#NewPage. In this case, a pagenamed NewPage will be made.&lt;h3&gt;Here are some design decisions.&lt;/h3&gt;&lt;p&gt;The editor allows only paragraph level editing. You can make a linebecome h1 (header 1), p (paragraph), or pre (program), but you cannotmake a word become bold or italic. Link command is only exception case(you can make a word become a link). The reason is web browsers havedifferent behavior on the editor component, and I don't want tosupport each corner case. Rather than that, decided to provide minimalset of features.&lt;p&gt;Chalkboard uses IFRAME + editorMode property for the rich texteditor. There were another possibility. One is DIV + contentEditable,and another one is FRAMESET. Those were pros and cons. I use IFRAMEsimply because it was easiest way in Firefox and Safari to makeavailable this layout configuration, but I might change my mind.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-5494457014372816545?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/09/chalkboard.html</link><guid>6b72ff91ef12caaaac612368d117ebb4</guid></item>
<item><title type="text">What does documentation lose?</title><description type="html">&lt;p&gt;I realized that Knuth emphasized narrative way to express a program documentation instead of formal way in &quot;Literate Programming&quot; paper. The reason why WEB needed macro mechanism which Pascal didn't have was that it was needed to make the program flexible enough so that an author can keep order of original thinking flow on the text. Using WEB, whatever each symbol dependents on others, you can write down in any order which you like.&lt;/p&gt;&lt;blockquote&gt; a program is, likewise, ready to comprehend it by learning its various parts in approximately the order in which it was written. -- LITERATE PROGRAMMING&lt;/blockquote&gt;&lt;p&gt;Such consideration have been lost in current documentatin mechanisms like JavaDoc. Major goal of documentation generator for programming language is to make a comprehensive reference, certainly, literary value would be out of scope in those systems. I expect thet My Active Essays project would be a missing link following the lost feature.&lt;p&gt;However, before diving too deep, I need to know current art and science of program documentation... to be countinued.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-3125518672114707786?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/08/what-does-documentation-lose.html</link><guid>53d48698528fcaeb2d89230bdb6a0400</guid></item>
<item><title type="text">A Prolog In Haskell</title><description type="html">&lt;h3&gt;Prolog In Haskell&lt;/h3&gt;&lt;p&gt;I have been obsessed by Prolog language recent weeks. While I firstlearned Prolog long time ago, and actually I was attracted, I havenever used it fluently because it's too hard to get familiar withoutany practical necessity.  Although, there are a lot of interestingliteratures which require certain knowledge of logic programming incomputer science. So, I decided to do another approach; writing aProlog interpreter to learn Prolog.&lt;/p&gt;&lt;p&gt;I chose Haskell as the implementation language because of itssuccinctness. I'm a beginner Haskell programmer, and I thought it wasalso a good opportunity to learn Prolog and Haskell same time! Thestarting point was a Prolog implementation in Hug98 distribution&lt;a href=&quot;http://darcs.haskell.org/hugs98/demos/prolog/&quot;&gt;http://darcs.haskell.org/hugs98/demos/prolog/&lt;/a&gt;. Ithink this is a great Haskell program, but its too difficult tome. Rewriting it as my level would be a good exercise.&lt;/p&gt;&lt;h4&gt;Data structures&lt;/h4&gt;&lt;p&gt;Here is my version of Prolog in Haskell.  Entire program is about200+ lines. There is no cut operator but it has a list notation sothat you can write [apple, orange | banana] stile literal. Let's takea look at the first part.&lt;/p&gt;&lt;pre&gt;module Prolog    (Term(..), Clause(..), w, s, cons,     parse, parse',     atom, variable, struct, list, nil, terms, arguments, term, clause, clauses, query,     display,     unify, unifyList, applyTerm, prove, rename, solveString) whereimport Text.ParserCombinators.Parsecimport Data.Maybeimport Char&lt;/pre&gt;&lt;p&gt;I used Parsec as a parser, and defined some data structures. &lt;/p&gt;&lt;pre&gt;infix 6 :-data Term    = Var String Int | Struct String [Term] deriving (Show, Eq)data Clause  = Term :- [Term]                        deriving (Show, Eq)data Command = Fact Clause | Query [Term] | ShowAll | Nooptype Rules = [Clause]type Substitution = [(Term, Term)]&lt;/pre&gt;&lt;p&gt;Term represents Prolog's term like &quot;apple&quot; or &quot;father(abe,homer)&quot;. It can be a variable, or a structure. A variable has an indexnumber which I used it later to distinct a same variable name indifferent contexts. A simple term like &quot;apple&quot; is also represented asa structure without elements like &lt;code&gt;Struct &quot;apple&quot; []&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Clause is a Prolog rule like &quot;mortal(X) :- man(X)&quot;. I stole a userdefined operator constructor &quot;:-&quot; from original Hugs' Prolog to writea Haskell expression in Prolog like. So &quot;mortal(X) :- man(X)&quot; inHaskell expression becomes &lt;code&gt;Struct &quot;mortal&quot; [Var &quot;X&quot; 0] :-[(Struct &quot;man&quot; [Var &quot;X&quot; 0])]&lt;/code&gt;. Well, it's not quitenice. Although the parser will provide better notation later, I haveto use this expression when debugging the interpreter meanwhile. Itscumbersome. So I made up tiny utility functions to make Prolog dataeasier.&lt;/p&gt;&lt;pre&gt;-- Utility constructors for debuggingw :: String -&amp;gt; Termw s@(x:xs) | isUpper x = Var s 0           | otherwise = Struct s []s :: String -&amp;gt; [Term] -&amp;gt; Terms n xs = Struct n xscons s cdr = (Struct &amp;quot;cons&amp;quot; [w s, cdr])&lt;/pre&gt;Using this functions, now &quot;mortal(X) :- man(X)&quot; is written as &lt;code&gt;s&quot;mortal&quot; [w&quot;X&quot;] :- [s&quot;man&quot; [w&quot;X&quot;]] &lt;/code&gt;. It is much better, isn'tit?&lt;h4&gt;Unification&lt;/h4&gt;&lt;p&gt; By the way, I like the word unification. It sounds peace andspiritual! Unification is one of two most peculiar concept in Prolog(another one is the control structure by depth firstsearch). Unification is solving a logical equation. For example, theanswer of &quot;[X, orange] = [apple, Y]&quot; must be X = apple, and Y =orange. It is almost same as variable binding in a normal programminglanguage, but tricky part is that a direction is symmetry, so X = Yand Y = X is same meaning. How can it be possibly implemented?? Thinkabout the data structure of the answer at first.&lt;/p&gt;&lt;pre&gt;---- Unification ----type Substitution = [(Term, Term)]true = []&lt;/pre&gt;&lt;p&gt; I used a list of tuples of terms, or an associate list torepresent a substitution. For example, &quot;X = apple, Y = orange&quot; isrepresented as [(X, apple), (Y, orange)] (in actual Haskellcode, &lt;code&gt; [(w&quot;X&quot;, w&quot;apple&quot;), (w&quot;Y&quot;, w&quot;orange&quot;)] &lt;/code&gt;). A tupleof left hand side is always a variable name, and right hand side isany term, concrete value preferably. The goal of unification is makingassociations with variable and term. To make this process easier,&quot;transitive&quot; substitution is allowed. Think about an equation &quot;X = Y,Y = banana&quot;. It is represented like [(X, Y), (Y, banana)], which issolved as X = banana, and Y = banana in apply function. Let's look atthe implementation.&lt;pre&gt;-- apply [(w&amp;quot;X&amp;quot;, w&amp;quot;Y&amp;quot;), (w&amp;quot;Y&amp;quot;, w&amp;quot;Z&amp;quot;)] [(w&amp;quot;X&amp;quot;), (w&amp;quot;Y&amp;quot;)] == [(w&amp;quot;Z&amp;quot;), (w&amp;quot;Z&amp;quot;)]apply :: Substitution -&amp;gt; [Term] -&amp;gt; [Term]apply s ts = [applyTerm s t | t &amp;lt;- ts]applyTerm [] (Var y n)                                  = Var y napplyTerm ((Var x i, t):s) (Var y j) | x == y &amp;amp;&amp;amp; i == j = applyTerm s t                                     | otherwise        = applyTerm s (Var y j)applyTerm s (Struct n ts)                               = Struct n (apply s ts)&lt;/pre&gt;&lt;p&gt;The function apply substitutes a variable name of its value. Tosupport transitive apply, applyTerm is called recursively if the valueis also a variable. But it can solve only one way. Think about oppositecase &quot;Y = banana, X = Y&quot;. Apply can't find the fact X = banana because&quot;Y = banana&quot; is appeared before. So what I should do is applying X = Ybefore adding the substitution.&lt;/p&gt;&lt;table border=&quot;1&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Equation&lt;/td&gt;&lt;td&gt;Substitution(solution)&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Y = banana, X = Y&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;X = Y&lt;/td&gt;&lt;td&gt;Y = banana (append)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;X = banana (apply: Y = banana) &lt;/td&gt;&lt;td&gt;Y = banana&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Y = banana, X = banana (append)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;I suppose that this two fold way solve all of logicalequation. Apply is always needed before append it to thesolution. Actual source implementation seems to be complicated becausethere are cases where a variable can appears any side, and sometimesthere is no solution. To represent no-answer case, a Maybe monad isused. So there are variations such as;&lt;/p&gt;&lt;ul&gt;&lt;li&gt; No Answer : Nothing &lt;/li&gt;&lt;li&gt; Always true (like apple = apple) : Just true (true is a synonym of empty list []) &lt;/li&gt;&lt;li&gt; Substitution found : Just [X = some answer...] &lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;-- unify (w&amp;quot;X&amp;quot;) (w&amp;quot;apple&amp;quot;) == Just [(w&amp;quot;X&amp;quot;, w&amp;quot;apple&amp;quot;)]unify :: Term -&amp;gt; Term -&amp;gt; Maybe Substitutionunify (Var x n) (Var y m) = Just [(Var x n, Var y m)]unify (Var x n)      y    = Just [(Var x n,       y)]unify      x    (Var y m) = Just [(Var y m,       x)]unify (Struct a xs) (Struct b ys)      | a == b = unifyList xs ys      | otherwise   = NothingunifyList :: [Term] -&amp;gt; [Term] -&amp;gt; Maybe SubstitutionunifyList [] [] = Just trueunifyList [] _ = NothingunifyList _ [] = NothingunifyList (x:xs) (y:ys) = do s &amp;lt;- unify x y                             s' &amp;lt;- unifyList (apply s xs) (apply s ys)                             return (s ++ s')&lt;/pre&gt;&lt;p&gt;Note that I just use append (++) to add a new substation inunifyList. But if you design carefully, recursive apply is notnecessary. Using something like a map is a better idea.&lt;/p&gt;&lt;h4&gt;Solver&lt;/h4&gt;&lt;p&gt;As a programming language, Prolog is unique as it has no explicitcontrol structure. Instead, a Prolog program can be seen as a bignested if then else statement. This find and branch functions areimplemented of this behavior. While unification is a technique of howto solve a equation, solver deals with when each equation should besolved.  There are two most important concepts to understand controlstructures in Prolog.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Goals (AND relationship) : are terms which should be solved.&lt;/li&gt;&lt;li&gt;Branches (OR relationship) : are options which might have a solution&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; A proof's fate is decided by branch function, branch functionreturns a list of goals (with corresponding substitutions). If thelist is empty, this branch is failed. If the list includes empty goal,it is actually succeed because empty goal means that it is unifiedagainst a fact like &quot;food(apple).&quot;. Well, is it complicated?&lt;/p&gt;&lt;ul&gt;&lt;li&gt; If branch returns [] &amp;lt;--- this is failed &lt;/li&gt;&lt;li&gt; If branch returns [ [some goals] [some goals] [(empty)] &amp;lt;--- this is succeed! ]  &lt;/li&gt;&lt;/ul&gt;The goal of find function is traverse all of goals to find whether ifit is true or false.&lt;pre&gt;---- Solver ----prove :: Rules -&amp;gt; [Term] -&amp;gt; [Substitution]prove rules goals = find rules 1 goals-- Depth first search-- find (parse' clauses &amp;quot;p(X):-q(X). q(a).&amp;quot;) 1 [parse' term &amp;quot;p(X)&amp;quot;]find :: Rules -&amp;gt; Int -&amp;gt; [Term] -&amp;gt; [Substitution]find rules i [] = [true]find rules i goals = do let rules' = rename rules i                        (s, goals') &amp;lt;- branch rules' goals                        solution &amp;lt;- find rules (i + 1) goals'                        return (s ++ solution)-- Find next branches. A branch is a pair of substitution and next goals.-- branch (parse' clauses &amp;quot;n(z). n(s(X)):-n(X).&amp;quot;) (parse' query &amp;quot;?-n(X).&amp;quot;)branch :: Rules -&amp;gt; [Term] -&amp;gt; [(Substitution, [Term])]branch rules (goal:goals) = do head :- body &amp;lt;- rules                               s &amp;lt;- maybeToList (unify goal head)                               return (s, apply s (body ++ goals))&lt;/pre&gt;&lt;p&gt; Find function has an argument for index number to show the depthof the tree. This number is used to rename all variables used in wholerules. This is necessary because same variable name in differentclauses are actually represented different variables.&lt;/p&gt;&lt;pre&gt;-- Rename all variables in the rules to split namespaces.rename :: Rules -&amp;gt; Int -&amp;gt; Rulesrename rules i = [ renameVar head :- renameVars body | head :- body &amp;lt;- rules]    where renameVar (Var s _)     = Var s i          renameVar (Struct s ts) = Struct s (renameVars ts)          renameVars ts           = [renameVar t | t &amp;lt;- ts]&lt;/pre&gt;I have only explained evaluator part of the REPL, but still there arereader, printer, and loop. You can browse and download whole sourcecodefrom &lt;a href=&quot;http://github.com/propella/prolog/tree&quot;&gt;http://github.com/propella/prolog/tree&lt;/a&gt;.Someday I might write some of interesting topics in the program...&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-7753716355336785152?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/04/prolog-in-haskell.html</link><guid>0c487d9139d092f76e76a8d4f38cc5d3</guid></item>
<item><title type="text">Things in my mind recently</title><description type="html">&lt;img src=&quot;http://f.hatena.ne.jp/images/fotolife/p/propella/20070202/20070202205219.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;p&gt;A couple of people asked me about this blog, so I add a new post finally. Because I don't spent my major time for Squeak recently, I changed the title of it with more general flavor than &quot;Squeak Everyday&quot;. But &quot;Workspace&quot; is still a keyword from Smalltalk. What I am doing everyday is still dynamic hacking with / without computer.&lt;p&gt;I'm quite interested in relationship among programming and documentation. It was 80' when Knuth wrote about literate programming &lt;a href=&quot;http://www.literateprogramming.com/knuthweb.pdf&quot;&gt;http://www.literateprogramming.com/knuthweb.pdf&lt;/a&gt;. In this article, he seems to be too excited about his idea that a program is a literature. How far we have elaborated the idea since then. Yes, from Emacs's documentation to JavaDoc, there are a lot of great works. But I'm not sure those are really literature, in other words, those are fun to read. In fact, although I am really fun of API documentation as a hacker, it could be more entertainment. That's what I am thinking these day.&lt;p&gt;When I was working on my old work &lt;a href=&quot;http://metatoys.org/propella/js/workspace.cgi/Home&quot;&gt;http://metatoys.org/propella/js/workspace.cgi/Home&lt;/a&gt; (2007), such idea was in my mind, too. And I'm going to visit it again.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-7535101540084076092?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2008/08/things-in-my-mind-recently.html</link><guid>31e7ba8b09f4e8b69d04bc024d4603af</guid></item>
<item><title type="text">Learning Erlang and Adobe Flash format same time part 2</title><description type="html">&lt;img src=&quot;http://languagegame.org/pub/erlang_swf.png&quot; /&gt;&lt;p&gt;I have already written most important part about SWF format andErlang's bit syntaxat &lt;a href=&quot;http://propella.blogspot.com/2009/03/learning-erlang-and-adobe-flash-format.html&quot;&gt;previouspost&lt;/a&gt;. But just for the record, I take a note of miscellaneousknowledge to construct an interesting Flash shape. This entire notedoesn't have any practical value because there are already many otheruseful libraries to build a swf file. But some of historical esotericmagical peculiar internal might interests you.&lt;/p&gt;&lt;p&gt; In the previous example, I only made three control tags:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;End (Tag type = 0)&lt;/li&gt;&lt;li&gt;ShowFrame (Tag type = 1)&lt;/li&gt;&lt;li&gt;SetBackgroundColor (Tag type = 9)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; Here, I introduce you two additional tags,&lt;/p&gt;&lt;ul&gt;&lt;li&gt;DefineShape (Tag type = 2) defines a vector graphics, and&lt;/li&gt;&lt;li&gt;PlaceObject2 (Tag type = 26) shows the graphics to an actual screen.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I designed new data structure to represent a SWF shape. Whilespec/0 is almost same as previous program, I add sample_shape/0 todefine DefineShape.&lt;/p&gt;&lt;pre&gt;% an example shape.spec() -&amp;gt;    {{frame_size, 6000, 3000},     {frame_rate, 16},     {frame_count, 160},     [{set_background_color, {rgb, 240, 250, 250}},      sample_shape(),      {place_object2, 1},      {show_frame},      {end_tag}]}.sample_shape() -&amp;gt;    {define_shape,     {shape_id, 1},     {bounds, {rectangle, 2000, 3000, 1000, 2000}},     {shapes, {{fills, [{solid_fill, {rgb, 50, 200, 50}}]},        {lines, [{line_style, 100, {rgb, 100, 255, 100}},   {line_style, 100, {rgb, 50, 150, 50}}]},        {shape_records,  [{style_change, [{move_to, 2000, 2000}]},   {style_change, [{line_style, 1},     {fill_style0, 1}]},   {straight_edge, 0, -1000},   {straight_edge, 1000, 0},   {style_change, [{line_style, 2},     {fill_style0, 1}]},   {straight_edge, 0, 1000},   {straight_edge, -1000, 0},   {end_shape}]        }}}}.&lt;/pre&gt;&lt;p&gt; It looks complicated though, it is actually verystraightforward. A DefineShape has a shape ID (or character ID), itsbounding box, and actual shapes. &quot;shape_id&quot;, &quot;bounds&quot;, and &quot;shapes&quot;tuples at sample_shape/0 denote these information. Shape ID is usedlater for a reference by PlaceObject2. &lt;/p&gt;&lt;p&gt; A Shapes part consists of further sub elements, fills, lines andshape records. Every style information are defined in advance, andreferenced with corresponding ID. In this case, one solid fill and twoline styles are defined. After styles are defined, shape records arefollowed. A shape record is the most interesting and complicatedpart. I'll draw a moss green rectangle in 1000 x 1000 twips (20 twips= 1 pixel) with light and dark green borders in a pseudo 3-Dstyle.&lt;/p&gt;&lt;p&gt; This is an actual implementation of DefineShape andPlaceObject2. I'm afraid it seems to be complicated, but it is just adirect translation from the specification. Thanks to Erlang's patternmatching syntax, It is easy to add a new tag by putting a newpattern. But sometimes distinction between ; (semi colon is usedbetween patterns in a function) and . (dot is used after a functiondefinition) annoys me.&lt;/p&gt;&lt;pre&gt;tag({define_shape,     {shape_id, ShapeId},     {bounds, Bounds},     {shapes, ShapesWithStyle}}) -&amp;gt;    BoundsBits = rectangle(Bounds),    Shapes = shape_with_style(ShapesWithStyle),    record_header_body(2, list_to_binary([&amp;lt;&amp;lt;ShapeId:16/unsigned-little&amp;gt;&amp;gt;, BoundsBits, Shapes]));tag({place_object2, CharacterId}) -&amp;gt;     PlaceFlagHasClipActions = 0,    PlaceFlagHasClipDepth = 0,    PlaceFlagHasName = 0,    PlaceFlagHasRatio = 0,    PlaceFlagHasColorTransform = 0,    PlaceFlagHasMatrix = 0,    PlaceFlagHasCharacter = 1,    PlaceFlagMove = 0,    Depth = 1,    record_header_body(26, &amp;lt;&amp;lt;PlaceFlagHasClipActions:1,       PlaceFlagHasClipDepth:1,       PlaceFlagHasName:1,       PlaceFlagHasRatio:1,       PlaceFlagHasColorTransform:1,       PlaceFlagHasMatrix:1,       PlaceFlagHasCharacter:1,       PlaceFlagMove:1,       Depth:16/unsigned-little,       CharacterId:16/unsigned-little&amp;gt;&amp;gt;).&lt;/pre&gt;&lt;p&gt; shape_with_style/1 is used to construct SHAPEWITHSTYLE structurein the specification. &lt;/p&gt;&lt;pre&gt;shape_with_style({{fills, Fills}, {lines, Lines}, {shape_records, Shapes}}) -&amp;gt;    FillBits = nbits_unsigned([length(Fills)]),    LineBits = nbits_unsigned([length(Lines)]),    ShapeRecords = shape_records({shape_records, Shapes}, FillBits, LineBits),    [fill_style_array({fills, Fills}),     line_style_array({lines, Lines}),     &amp;lt;&amp;lt;FillBits:4,      LineBits:4&amp;gt;&amp;gt;,     ShapeRecords].&lt;/pre&gt;&lt;p&gt;The tricky part is FillBits and LineBits. As I have alreadymentioned when explaining a rectangle format in previous post, the SWFformat tries to shorten a file size by all means, bit by bit. FillBitsdefines maximum bit size needed by fill style id. For example, if youuse only one fill style, one is enough for FillBits. But if you useseven, FillBits is three (because seven is 111 as a binary). AfterFillBits and LineBits are calculated, they are needed in next helperfunction shape_records/3. But before I show you shape_records/3, somesimple functions to construct styles are followed. &lt;/p&gt;&lt;pre&gt;fill_style_array({fills, FillStyleArray}) -&amp;gt;    FillStyleCount = length(FillStyleArray),    [&amp;lt;&amp;lt;FillStyleCount:8&amp;gt;&amp;gt;, [fill_style(X) || X &amp;lt;- FillStyleArray]].fill_style({solid_fill, RGB}) -&amp;gt; [&amp;lt;&amp;lt;16#00:8&amp;gt;&amp;gt;, rgb(RGB)].line_style_array({lines, LineStyleArray}) -&amp;gt;    LineStyleCount = length(LineStyleArray),    [&amp;lt;&amp;lt;LineStyleCount:8&amp;gt;&amp;gt;, [line_style(X) || X &amp;lt;- LineStyleArray]].line_style({line_style, Width, RGB}) -&amp;gt;    [&amp;lt;&amp;lt;Width:16/unsigned-little&amp;gt;&amp;gt;, rgb(RGB)].&lt;/pre&gt;&lt;p&gt; I think these are straightforward. Perhaps, next is the mosttricky part of the SWF shape. Shape records include a number ofrecords, each record represents style change or position change orso. While a rectangle format must to be byte aligned, each record mustnot be aligned, but whole shape records including them must bealigned! This fact is described in the specification very obscure way,so I didn't find out what to do unless many try-and-errors. Although,I might misunderstood what is a shape record...&lt;/p&gt;&lt;blockquote&gt;Each individual shape record is byte-aligned within an array of shape records; one shape record is padded to a byte boundary before the next shape record begins.  --- SWF File Format Specification Version 10&lt;/blockquote&gt;&lt;p&gt;To concatenate many bit strings into one, and align whole bits, I madetwo functions padding/1 and concat_bits/1 (padding/1 is same one asprevious post). It is likely that concatenating bitstrings existsalready, but I couldn't find out from the library.&lt;/p&gt;&lt;pre&gt;shape_records({shape_records, ShapeRecords}, FillBits, LineBits) -&amp;gt;    padding(concat_bit([shape_record(X, FillBits, LineBits) || X &amp;lt;- ShapeRecords])).padding(Bits) -&amp;gt;    Padding = 8 - bit_size(Bits) rem 8,    &amp;lt;&amp;lt;Bits/bitstring, 0:Padding&amp;gt;&amp;gt;.concat_bit(XS) -&amp;gt; lists:foldl(fun(X, Y) -&amp;gt; &amp;lt;&amp;lt;Y/bitstring, X/bitstring&amp;gt;&amp;gt; end, &amp;lt;&amp;lt;&amp;gt;&amp;gt;, XS).&lt;/pre&gt;Rest of the source is definitions of each record. I omitted a lot offeatures to the explanation purpose. EndShapeRecord andStraightEdgeRecord are quite simple.&lt;pre&gt;shape_record({end_shape}, _, _) -&amp;gt; &amp;lt;&amp;lt;0:1, 0:5&amp;gt;&amp;gt;;shape_record({straight_edge, DeltaX, DeltaY}, _, _) -&amp;gt;    NumBits = nbits_signed([DeltaX, DeltaY]),    GeneralLineFlag = 1,    &amp;lt;&amp;lt;1:1, 1:1, (NumBits - 2):4, GeneralLineFlag:1, DeltaX:NumBits, DeltaY:NumBits&amp;gt;&amp;gt;;&lt;/pre&gt;&lt;p&gt; But StyleChangeRecord is the second tricky and daunting part inspite of Erlang's succinct syntax. A part of reasons of the complexityis that StyleChangeRecord allows to define a couple of operations atonce optionally; line style, fill style, and pen move. So we need somedata structure to represent such option. &lt;/p&gt;&lt;p&gt; In object oriented languages, a dictionary or a map is commonlyused while an associated list is popular in functional languages.  InErlang, a list of tuples might be enough. lists:keysearch/3 find atuple in a list where first argument is matched, so we can use it as adictionary like structure.  In our example, [{line_style, 1},{fill_style0, 1}] means we want to change line style and fill stylesame time. and lists:keysearch(line_style, 1, ChangeSpec) detects aline style change option.&lt;/p&gt;&lt;pre&gt;shape_record({style_change, ChangeSpec}, FillBits, LineBits) -&amp;gt;    TypeFlag = 0,    StateNewStyles = 0,    StateFillStyle1 = 0,    {StateLineStyle, LineStyleData} = case lists:keysearch(line_style, 1, ChangeSpec) of     {value, {_, LineStyle}} -&amp;gt; {1, &amp;lt;&amp;lt;LineStyle:LineBits&amp;gt;&amp;gt;};     false -&amp;gt; {0, &amp;lt;&amp;lt;&amp;gt;&amp;gt;} end,    {StateFillStyle0, FillStyle0Data} = case lists:keysearch(fill_style0, 1, ChangeSpec) of     {value, {_, FillStyle0}} -&amp;gt; {1, &amp;lt;&amp;lt;FillStyle0:FillBits&amp;gt;&amp;gt;};     false -&amp;gt; {0, &amp;lt;&amp;lt;&amp;gt;&amp;gt;} end,    {StateMoveTo, MoveData} = case lists:keysearch(move_to, 1, ChangeSpec) of     {value, {_, MoveDeltaX, MoveDeltaY}} -&amp;gt;  MoveBits = nbits_signed([MoveDeltaX, MoveDeltaY]),  {1, &amp;lt;&amp;lt;MoveBits:5,       MoveDeltaX:MoveBits/signed,       MoveDeltaY:MoveBits/signed&amp;gt;&amp;gt;};     false -&amp;gt; {0, &amp;lt;&amp;lt;&amp;gt;&amp;gt;} end,    &amp;lt;&amp;lt;TypeFlag:1,     StateNewStyles:1,     StateLineStyle:1,     StateFillStyle1:1,     StateFillStyle0:1,     StateMoveTo:1,     MoveData/bitstring,     FillStyle0Data/bitstring,     LineStyleData/bitstring&amp;gt;&amp;gt;.&lt;/pre&gt;I uploaded finalprogram &lt;a href=&quot;http://languagegame.org/pub/swf.erl&quot;&gt;http://languagegame.org/pub/swf.erl&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8272979-8783119771683326717?l=propella.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://propella.blogspot.com/2009/04/learning-erlang-and-adobe-flash-format.html</link><guid>8f26a826c9b5ae3562a4661272c0e672</guid></item>
<item><title type="text">CroqueTweak: Connecting fields</title><description type="html">Bert explains the proper tweak way to wire up two fields.  Very useful.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://croquetweak.blogspot.com/2005/05/connecting-fields.html&quot;&gt;CroqueTweak: Connecting fields&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692218-111592078850892082?l=crnci.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://crnci.blogspot.com/2005/05/croquetweak-connecting-fields.html</link><guid>6dde17ff7bd4baeb90c16b079b4606c8</guid></item>
<item><title>Taking the Red Pill</title><link>http://www.wetmachine.com/itf/item/1890</link><description>Under a banner that says &amp;#8220;make a difference in the world&amp;#8221;, there's a wonderful piece at active rain about using collaborative virtual worlds for Web 3.0 activity in the real estate industry. I think we made a difference. </description><pubDate>Tue, 02 Mar 2010 09:00:00 -0500</pubDate><guid>e5d120d65135f647e354f192fb1c837f</guid></item>
<item><title>Situation Room</title><link>http://www.wetmachine.com/itf/item/1889</link><description>Real situation rooms devote an awful lot to physical requirements. Here's a virtual situation room from Forterra's Olive platform, where there is lot more emphasis on dealing with the situation.Of course, a real operations center needs...</description><pubDate>Sun, 28 Feb 2010 09:00:00 -0500</pubDate><guid>9397a48332b882af3485c9015a23486c</guid></item>
<item><title>Dial Tone</title><link>http://www.wetmachine.com/itf/item/1887</link><description>William Gibson has said, &amp;#8220;I think in a very real sense cyberspace is the place where a ... telephone call takes place.&amp;#8221;David says he thinks of Croquet as the dial tone for Cyberspace.</description><pubDate>Fri, 26 Feb 2010 09:00:00 -0500</pubDate><guid>db397b2b46177f0bdaafb6cfa33eaf32</guid></item>
<item><title>Sit Down and Shut Up</title><link>http://www.wetmachine.com/itf/item/1886</link><description>Impressive Steve Jobs product presentations are built around a unifying theme. Really, the theme of our last version(*) is scalability for large institutions. This is largely architectural work hidden from most users, such as network topology or a...</description><pubDate>Wed, 24 Feb 2010 09:00:00 -0500</pubDate><guid>5bcf08f679b1cb78189bd5f3c0068397</guid></item>
<item><title>Asset Risk</title><link>http://www.wetmachine.com/itf/item/1885</link><description>Julian Lombardi makes some terrific points about asset risk for virtual worlds on his blog. I think the issue is a pretty fertile area for exploration as we all continue to invent new ways of working together, but  Blogspot simply doesn't allow th...</description><pubDate>Mon, 22 Feb 2010 09:00:00 -0500</pubDate><guid>073c618ba55f12fa40d2d14ee22904ac</guid></item>
<item><title>Meeting DVR</title><link>http://www.wetmachine.com/itf/item/1883</link><description>We've been creating new technologies faster than I can blog about them. Of course, I can't say anything until they're out, and then I'm focused on the next challenge instead of describing the last.  One thing we've had for a while now is a &amp;#8220;...</description><pubDate>Sat, 20 Feb 2010 13:51:10 -0500</pubDate><guid>e2b5fd347ff6eab222c503a5499f9e8d</guid></item>
<item><title>Virtual Events</title><link>http://www.wetmachine.com/itf/item/1870</link><description>We've discussed here how collaborative virtual worlds and other technology can be used to facilitate better business meetings while reducing business travel. (See here and its links.) What about when the purpose of the meeting can almost be said t...</description><pubDate>Sun, 14 Feb 2010 13:31:24 -0500</pubDate><guid>b82b080f50cdb51d7c5d4006c167ed01</guid></item>
<item><title>Vinge Vision</title><link>http://www.wetmachine.com/itf/item/1869</link><description>Our David Smith has long had a vivid vision of ubiquitous computing that has complemented that of author Vernor Vinge.  Here's another step towards making that real.</description><pubDate>Sun, 14 Feb 2010 12:56:17 -0500</pubDate><guid>36b71f3e2ad3cd1b1b31946b518fda60</guid></item>
</channel></rss>