<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5956904987508681406</id><updated>2011-10-10T15:41:30.204-05:00</updated><title type='text'>Tom Talks Too Much</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default?start-index=101&amp;max-results=100'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>151</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6513942940214460883</id><published>2011-10-10T12:40:00.002-05:00</published><updated>2011-10-10T15:41:30.248-05:00</updated><title type='text'>Google's Dart is nothing new</title><content type='html'>Ran across &lt;a href="http://www.dartlang.org/docs/technical-overview/index.html"&gt;Google's Dart programming language&lt;/a&gt; today with an announcement they made.&lt;br /&gt;&lt;br /&gt;Those design goals are interesting. Hrmm. Only Node.js and GWT target client and server? How about &lt;a href="http://fantom.org/"&gt;Fantom&lt;/a&gt; and &lt;a href="http://haxe.org/"&gt;haXe&lt;/a&gt;? I suspect there are many more. I'm just mentioning ones that I'm most familiar with. I haven't gone on a link search.&lt;br /&gt;&lt;br /&gt;I think Fantom is especially aligned with many of the goals of Dart. But making one's own language is fun (and time-consuming). Been there before myself. Maybe again someday. In addition to having been around longer, Fantom has the benefit of the compiler being implemented in Fantom. Dart seems &lt;a href="http://code.google.com/p/dart/source/browse/#svn%2Ftrunk%2Fdart%2Fcompiler%2Fjava%2Fcom%2Fgoogle%2Fdart%2Fcompiler"&gt;not to be self-hosted&lt;/a&gt; yet. Maybe they'll get there someday.&lt;br /&gt;&lt;br /&gt;Meanwhile, if Dart sounds interesting to you, I'd recommend taking a look at Fantom first. It even has &lt;a href="http://www.xored.com/f4"&gt;Eclipse&lt;/a&gt; and &lt;a href="http://fantomide.colar.net/home"&gt;NetBeans&lt;/a&gt; plugins already.&lt;br /&gt;&lt;br /&gt;Update: It seems &lt;a href="http://code.google.com/p/dart/source/browse/trunk/dart/editor/build/README.txt"&gt;Google Dart has some Eclipse IDE stuff&lt;/a&gt; in the works, but I'm having trouble finding detailed discussions on it.&lt;br /&gt;&lt;br /&gt;Update 2: I also missed the &lt;a href="http://code.google.com/p/dart/source/browse/trunk/#trunk%2Fdart%2Fruntime%2Fvm"&gt;native VM&lt;/a&gt;. With the compiler in Java, I wrongly assumed the whole back end thing was Java-based despite their discussion of a VM for Dart.&lt;br /&gt;&lt;br /&gt;Update 3: It seems &lt;a href="http://bracha.org/Site/Home.html"&gt;Gilad Bracha&lt;/a&gt;'s involved, and the type system is more dynamically-focused than I thought at first glance. I'm concerned that making types too optional will make code tooling weaker, but maybe they have clever tricks planned for performance and tooling. (I mean, V8's pretty good at performance with little-to-no static type information at all.) On the happy side, generics are reified.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6513942940214460883?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6513942940214460883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/10/googles-dart-is-nothing-new.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6513942940214460883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6513942940214460883'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/10/googles-dart-is-nothing-new.html' title='Google&apos;s Dart is nothing new'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-758974981542719719</id><published>2011-07-16T16:57:00.002-05:00</published><updated>2011-07-16T17:05:11.441-05:00</updated><title type='text'>Thanks for git, Google!</title><content type='html'>I assume everyone else is in the know by now, too, but I still wanted to say a public thank you to Google for &lt;a href="http://code.google.com/p/support/issues/detail?id=2454"&gt;supporting git&lt;/a&gt; at Google Project Hosting.&lt;br /&gt;&lt;br /&gt;Now I need to decide if it's worth the effort to consider switching from GitHub. I don't even know if Google supports the sweetly convenient &lt;a href="http://help.github.com/linux-set-up-git/#_set_up_ssh_keys"&gt;ssh keys thing&lt;/a&gt;. At first glance, I don't see it.&lt;br /&gt;&lt;br /&gt;At least I know git is an option at Google now, should I decide to go back.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-758974981542719719?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/758974981542719719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/07/thanks-for-git-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/758974981542719719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/758974981542719719'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/07/thanks-for-git-google.html' title='Thanks for git, Google!'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2382791478541347454</id><published>2011-07-15T10:10:00.004-05:00</published><updated>2011-07-15T10:19:43.988-05:00</updated><title type='text'>Node.js on the way</title><content type='html'>I've been becoming a fan of Node.js. Liberally licensed, V8 speediness, JS enjoyment. I haven't followed all the news, and I'd missed the recent great announcement of &lt;a href="http://blog.nodejs.org/2011/06/23/porting-node-to-windows-with-microsoft%E2%80%99s-help/"&gt;Microsoft helping with first-class Windows support&lt;/a&gt;. Also, while &lt;a href="http://www.indeed.com/jobtrends?q=erlang%2C+scala%2C+%28node+javascript%29+or+%28node+js%29+or+nodejs&amp;l="&gt;job listings for Node.js&lt;/a&gt; are still few, they are caught up to Erlang and keeping pace with Scala.&lt;br /&gt;&lt;br /&gt;I look forward to JS replacing Java (and the JVM) all around someday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2382791478541347454?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2382791478541347454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/07/nodejs-on-way.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2382791478541347454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2382791478541347454'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/07/nodejs-on-way.html' title='Node.js on the way'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2218313392653598621</id><published>2011-07-14T09:23:00.003-05:00</published><updated>2011-07-14T09:31:42.222-05:00</updated><title type='text'>Robots that eat</title><content type='html'>For years, I've been occasionally distracted with a fascination about robots that eat, either plants or meat or whatever. I have not investigated research in artificial chemical reactions of this sort for producing energy, but I suspect some work has been done (&lt;a href="http://www.newscientist.com/gallery/dn17367-carnivorous-domestic-entertainment-robots"&gt;such as this example&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I think a carnivorous robot could also make a great just-barely-sci-fi story. Probably also been done. There's nothing new under the sun. I just haven't run across it myself yet, nor have I searched such a thing out much. I'm not much a fan of horror, so I wouldn't take it there myself, but I don't mind getting a bit edgy and uncomfortable. I think it could be well done.&lt;br /&gt;&lt;br /&gt;In any case, just got reminded of that notion &lt;a href="http://www.robotshop.com/blog/robots-cannot-eat-hamburgers-yet-1352"&gt;by this blog post&lt;/a&gt;. I haven't actually watched the mentioned ads yet, but I'll likely get around to it.&lt;br /&gt;&lt;br /&gt;And, of course, &lt;a href="http://en.wikipedia.org/wiki/Mars_Exploration_Rover"&gt;solar powered robots&lt;/a&gt; are a lot more palatable (pun considered) to our sensibilities and are clearly practical for some situations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2218313392653598621?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2218313392653598621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/07/robots-that-eat.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2218313392653598621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2218313392653598621'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/07/robots-that-eat.html' title='Robots that eat'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3705603701751186634</id><published>2011-06-15T10:10:00.005-05:00</published><updated>2011-06-15T10:56:30.972-05:00</updated><title type='text'>Coburn vs. Robots</title><content type='html'>It seems that Senator Coburn (of the state of Oklahoma, where I currently live) has &lt;a href="http://spectrum.ieee.org/automaton/robotics/robotics-software/us-senator-calls-robot-projects-wasteful"&gt;decided that research in domestic robotics is wasteful&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I beg to differ. (&lt;a href="http://streebgreebling.blogspot.com/2011/06/on-wasting-money-on-robots.html"&gt;Another example of someone else who also differs.&lt;/a&gt;) General purpose robots are a bit pie-in-the-sky but are also amazingly important, in my view, both to understanding who we are as people and in their possible pragmatic application. Domestic tasks are often at the center of this, in my view.&lt;br /&gt;&lt;br /&gt;Say we did shave the 1-3 billion dollars that Coburn thinks could be saved through better NSF management. Sweet, &lt;a href="http://en.wikipedia.org/wiki/Military_budget_of_the_United_States"&gt;that's like up to 0.4% of US military funding&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I don't have numbers on it, but a couple of years ago, I sat with a small group of researchers at a robotics conference who were lamenting how far behind the US is in robotics research, at least outside the military perspective. Supposedly, at least Europe and Japan do a much better job of funding basic robotics research. I wonder what the effects might be of that? Hard to say.&lt;br /&gt;&lt;br /&gt;I agree research funding is hit and miss, but so is entrepreneurship or anything else in life. And I'd love to see more robotics funding in the US, not less.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3705603701751186634?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3705603701751186634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/06/coburn-vs-robots.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3705603701751186634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3705603701751186634'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/06/coburn-vs-robots.html' title='Coburn vs. Robots'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-9027432062789312244</id><published>2011-05-20T09:36:00.002-05:00</published><updated>2011-05-20T09:44:45.145-05:00</updated><title type='text'>Cloud Robotics vs. Safety</title><content type='html'>So, with Google also now pushing &lt;a href="http://www.google.com/events/io/2011/sessions/cloud-robotics.html"&gt;cloud robotics&lt;/a&gt;, it seems likely to get more and more attention. However, I want to see more discussion of safety on the matter.&lt;br /&gt;&lt;br /&gt;I mean, didn't we already have a &lt;a href="http://en.wikipedia.org/wiki/I,_Robot_(film)"&gt;Will Smith movie implying safety risks&lt;/a&gt; for combining the internet with robots? Robot perception is linked with behavior, and if either perception or behavior can be downloaded at any moment, &lt;strong&gt;there had better be some serious safety mechanisms outside of any such easy cloud intelligence&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;There really needs to be some underlying primitive coping level that enforces certain levels of safety, there needs to be serious levels of "don't dare touch this without top security clearance" baked in.&lt;br /&gt;&lt;br /&gt;As long as we are talking toys, maybe it's not a big deal, but anything strong enough to do real work is strong enough to cause damage, and that needs secured.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-9027432062789312244?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/9027432062789312244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/05/cloud-robotics-vs-safety.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/9027432062789312244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/9027432062789312244'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/05/cloud-robotics-vs-safety.html' title='Cloud Robotics vs. Safety'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-4992421590734092218</id><published>2011-05-13T13:06:00.003-05:00</published><updated>2011-05-13T13:19:33.974-05:00</updated><title type='text'>Native ROS (Robot OS) for Java ... and MATLAB?</title><content type='html'>So, Google and Willow Garage just announced about an &lt;a href="http://code.google.com/p/rosjava/"&gt;alpha-status pure Java implementation of ROS&lt;/a&gt;, the &lt;a href="http://www.ros.org/"&gt;robot operating system (from Willow Garage)&lt;/a&gt;. ROS in some ways is just another messaging system, and there are already about five billion of those in Java. However, it's also getting &lt;a href="http://www.ros.org/news/2010/11/happy-3rd-anniversary-ros.html"&gt;serious&lt;/a&gt; &lt;a href="http://www.ros.org/news/2011/05/100-repositories.html"&gt;traction&lt;/a&gt; from all over the robotics community, has lots of ready-made robot awesomeness, and nicely seems to be overshadowing &lt;a href="http://www.microsoft.com/robotics/"&gt;non-open competitors&lt;/a&gt; in robot middleware.&lt;br /&gt;&lt;br /&gt;They are pushing it as a solution for Android. Android-brained robots are cool, but in our lab (and others), we use MATLAB a lot. There presently isn't any stable support for MATLAB is ROS, just GNU Octave. We have connected ROS with MATLAB, but the software hasn't been much more stable than the official support from Willow. Though I've been dodging Java since the Oracle lawsuit, I'm seriously planning to try out the new rosjava as a MATLAB option. MATLAB integrates easily with Java. Just import packages/classes, and use them.&lt;br /&gt;&lt;br /&gt;As a side note, it seems like the new rosjava (unlike normal ROS) supports multiple nodes per process. I'll have to see if I can work multiple Java threads into communication with the main MATLAB thread ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-4992421590734092218?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/4992421590734092218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/05/native-ros-robot-os-for-java-and-matlab.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4992421590734092218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4992421590734092218'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/05/native-ros-robot-os-for-java-and-matlab.html' title='Native ROS (Robot OS) for Java ... and MATLAB?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-538034668592312066</id><published>2011-03-08T10:09:00.003-06:00</published><updated>2011-03-08T10:19:36.904-06:00</updated><title type='text'>WebGL not there on Firefox, either</title><content type='html'>I recently lamented the lack of general support for WebGL in Chrome. Here's &lt;a href="https://wiki.mozilla.org/Blocklisting/Blocked_Graphics_Drivers"&gt;what Mozilla says about the state of Firefox WebGL&lt;/a&gt;. Google says they are working on a &lt;a href="http://blog.chromium.org/2011/03/gpu-acceleration-old-drivers.html"&gt;software renderer for Chrome&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;However WebGL reaches the masses, I have to say that it's not there yet. I'd consider it an early adopter technology at best. Would it have been better to focus on older OpenGL features to reach everyone today? Or is it better that they focused on the current modern, so that we don't regret old lock-in later? Whatever is best, I think WebGL will be safe to use for most of the web in about 5 years or so. I say five years because we need time for implementations to stabilize, support more drivers, use software rendering effectively, old computers to get replaced, and so on.&lt;br /&gt;&lt;br /&gt;That's my guess. Five years. So 2016, I guess. (And I'm ignoring IE. I consider IE only as relevant as Microsoft wants it to be, by playing nice with everyone else.)&lt;br /&gt;&lt;br /&gt;We'll see if I'm being too conservative.&lt;br /&gt;&lt;br /&gt;But 2016 is still cool. Arbitrary 3D awesomeness. And &lt;a href="http://google-opensource.blogspot.com/2010/01/love-for-luajit.html"&gt;I suspect JS will run &lt;em&gt;very&lt;/em&gt; close to native speed by then&lt;/a&gt;, too.&lt;br /&gt;&lt;br /&gt;What platform are you targeting for 2016?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-538034668592312066?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/538034668592312066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/03/webgl-not-there-on-firefox-either.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/538034668592312066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/538034668592312066'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/03/webgl-not-there-on-firefox-either.html' title='WebGL not there on Firefox, either'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6406821446516072309</id><published>2011-03-03T22:28:00.003-06:00</published><updated>2011-03-03T22:37:28.308-06:00</updated><title type='text'>Bullet in JS</title><content type='html'>I've recently found &lt;a href="https://github.com/feisty/node-bullet"&gt;node.js bindings for Bullet&lt;/a&gt; and a &lt;a href="http://code.google.com/p/bulletjs/"&gt;JS port of JBullet&lt;/a&gt;. I'm not sure whether either supports hinges or capsules or other things I like. Lousy LGPL on that port. Not sure about the license on the bindings.&lt;br /&gt;&lt;br /&gt;Or maybe &lt;a href="https://github.com/JigLibJS/JigLibJS"&gt;JigLibJS&lt;/a&gt; is the right thing to try?&lt;br /&gt;&lt;br /&gt;Maybe robot sim in browser will come before too many years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6406821446516072309?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6406821446516072309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/03/bullet-in-js.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6406821446516072309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6406821446516072309'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/03/bullet-in-js.html' title='Bullet in JS'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2638588592155084008</id><published>2011-02-18T10:56:00.003-06:00</published><updated>2011-02-18T11:02:16.487-06:00</updated><title type='text'>Chrome WebGL a no go, methinks</title><content type='html'>So, Chrome has WebGL on by default ... if you have hardware OpenGL 2.0 support, so far as I can tell. Well, I suppose modern Direct3D support on Windows would also suffice, given their &lt;a href="http://code.google.com/p/angleproject/"&gt;ANGLE compatibility library&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One of the Linux computers I use regularly has no such support, so WebGL content doesn't render at all. Said computer is a little over two years old, so I suspect I'm not the only one with problems.&lt;br /&gt;&lt;br /&gt;Saying "Sorry, the web doesn't work on your fairly modern computer" isn't good enough.&lt;br /&gt;&lt;br /&gt;Until WebGL &lt;em&gt;just works&lt;/em&gt; on everyday computers and handhelds across Chrome and Firefox and Safari (and Opera?), it's a no go for me.&lt;br /&gt;&lt;br /&gt;Anyway, if I'm misunderstanding the state of Chrome WebGL support, let me know, but for now it's just vaporware in my book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2638588592155084008?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2638588592155084008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/02/chrome-webgl-no-go-methinks.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2638588592155084008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2638588592155084008'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/02/chrome-webgl-no-go-methinks.html' title='Chrome WebGL a no go, methinks'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-4940726203588535668</id><published>2011-02-09T09:33:00.003-06:00</published><updated>2011-02-09T09:40:01.109-06:00</updated><title type='text'>Web server in CoffeeScript and Node</title><content type='html'>So, here's a first stab at a web server using &lt;a href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript&lt;/a&gt; and &lt;a href="http://nodejs.org/"&gt;Node&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# Imports.&lt;br /&gt;{createServer} = require 'http'&lt;br /&gt;{parse: parseUrl} = require 'url'&lt;br /&gt;{readFile} = require 'fs'&lt;br /&gt;{resolve} = require 'path'&lt;br /&gt;&lt;br /&gt;# Setup.&lt;br /&gt;base = "#{resolve('.')}/"&lt;br /&gt;log = console.log&lt;br /&gt;&lt;br /&gt;# Server definition.&lt;br /&gt;server = createServer (request, response) -&gt;&lt;br /&gt;  reqPath = parseUrl(request.url).pathname&lt;br /&gt;  filePath = ".#{reqPath}"&lt;br /&gt;  status = 500&lt;br /&gt;  respond = (content) -&gt;&lt;br /&gt;    response.writeHead status,&lt;br /&gt;      'Content-Length': content.length&lt;br /&gt;      'Content-Type': 'text/html'&lt;br /&gt;    response.end content&lt;br /&gt;    log "#{request.method} #{reqPath} #{status}"&lt;br /&gt;  # Verify the path is local to the base!!!&lt;br /&gt;  # TODO Better startsWith&lt;br /&gt;  if resolve(filePath).indexOf base&lt;br /&gt;    # TODO status = forbidden?&lt;br /&gt;    respond("")&lt;br /&gt;    return&lt;br /&gt;  # Handle the request.&lt;br /&gt;  if request.method is 'GET'&lt;br /&gt;    readFile filePath, (err, data) -&gt;&lt;br /&gt;      if err&lt;br /&gt;        if err.errno is 2&lt;br /&gt;          status = 404&lt;br /&gt;        data = ""&lt;br /&gt;      else&lt;br /&gt;        status = 200&lt;br /&gt;      respond(data)&lt;br /&gt;  else&lt;br /&gt;    respond("")&lt;br /&gt;&lt;br /&gt;# Start the server.&lt;br /&gt;port = 8080&lt;br /&gt;server.listen port, -&gt;&lt;br /&gt;  log "Running on #{port} from #{base} ..."&lt;/pre&gt;&lt;br /&gt;Not so bad. Probably could be cleaned up. I get tangled in CoffeeScript sometimes, but usually it's straightforward.&lt;br /&gt;&lt;br /&gt;I don't drink coffee, but this is nice little scripting all right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-4940726203588535668?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/4940726203588535668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/02/web-server-in-coffeescript-and-node.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4940726203588535668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4940726203588535668'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/02/web-server-in-coffeescript-and-node.html' title='Web server in CoffeeScript and Node'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-137882448750777077</id><published>2011-02-02T10:31:00.002-06:00</published><updated>2011-02-02T10:33:02.769-06:00</updated><title type='text'>Python import angst</title><content type='html'>I've said it before, and I'll say it again, Python importing stinks. Either you corrupt your module namespace, or you put imports in all your individual functions. Both are horrible options.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-137882448750777077?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/137882448750777077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2011/02/python-import-angst.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/137882448750777077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/137882448750777077'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2011/02/python-import-angst.html' title='Python import angst'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3780590302650482624</id><published>2010-11-29T10:14:00.002-06:00</published><updated>2010-11-29T10:20:54.406-06:00</updated><title type='text'>New algorithms are painful in any language.</title><content type='html'>I think &lt;a href="http://langref.org/erlang+fantom+fsharp+groovy+haskell+java+perl+php+python+ruby+scala/algorithms/geometry/find-all-pythagorean-triangles-with-length-or-height-less-than-or-equal-to-20"&gt;this set of examples from langref.org&lt;/a&gt; helps to show the pain of unexpected algorithms. It's a simple case, but note that none of the examples is remarkably clearer or shorter than most of the others. Library and language niceties often help for common use cases (hashtables, sorting, matrix multiplication, ...). With time, the set of what's common grows. Most programmers don't need to write new algorithms. But if you do, you can't always expect your language or library to save you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3780590302650482624?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3780590302650482624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/11/new-algorithms-are-painful-in-any.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3780590302650482624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3780590302650482624'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/11/new-algorithms-are-painful-in-any.html' title='New algorithms are painful in any language.'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5733661202729645555</id><published>2010-11-11T11:43:00.006-06:00</published><updated>2010-11-11T12:18:37.459-06:00</updated><title type='text'>Abortion of convenience is plain horrifying</title><content type='html'>Every now and then I feel a need to return the abortion topic. Whenever someone _makes a choice_ that results in a pregnancy that they find inconvenient, the answer is _not_ to kill an innocent person.&lt;br /&gt;&lt;br /&gt;I mean really. That's completely horrifying.&lt;br /&gt;&lt;br /&gt;Can you prove that's not a person you're killing? Really? Not enough to convince large segments of the population, it doesn't seem.&lt;br /&gt;&lt;br /&gt;Now, if infanticide is an acceptable parental right, are those who promote abortion in favor of such strong parental rights across the board? I don't have stats, but think about that for a moment. Where do you think the political spectrum lies here?&lt;br /&gt;&lt;br /&gt;The reason to promote abortion (other than doing business of abortion) is to allow sex with fewer consequences. Men don't have such consequences (especially if they can avoid dodge child support). Why should women? But should the answer be to promote sexual liberation all around or should it be to promote responsible conduct by men as well as women? I also feel that sexual promiscuity is aimed at weakening _family_ strength and empowerment, thereby reducing competing powers between the government and the individual. Not that it's a conspiracy theory. More that there are clearly ideologies in the world that feel such additional powers shouldn't exist. But hey, I could be wrong about these ties. I haven't done formal research.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://art-bin.com/art/omodest.html"&gt;In any case, go Jonathan Swift. You were ahead of your time.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Is adoption really so much more painful than killing someone? And is it justifiable to perform ethnic cleansing of people with disorders like Down syndrome?&lt;br /&gt;&lt;br /&gt;Do we really want to be proud of &lt;a href="http://tomobag.blogspot.com/2010/08/some-2005-violent-death-statistics.html"&gt;killing a million babies per year&lt;/a&gt; in the US?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Note:&lt;/strong&gt; I _don't_ condone violent or illegal treatment or any kind of harassment of those who promote, have, or perform abortions. If we could finally get some legislation criminalizing abortion of convenience, I'd strongly recommend general amnesty to all previously guilty parties. That is, I wouldn't apply any penalties retroactively. I also understand that abortion for life endangerment or other reasons (e.g., rape, not just because someone doesn't want consequences for choosing to have sex whether "protected" or not) might be justifiable in some cases. I'm also not speaking against other forms of birth control at the moment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5733661202729645555?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5733661202729645555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/11/abortion-of-convenience-is-plain.html#comment-form' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5733661202729645555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5733661202729645555'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/11/abortion-of-convenience-is-plain.html' title='Abortion of convenience is plain horrifying'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8287899919739572517</id><published>2010-11-08T10:28:00.002-06:00</published><updated>2010-11-08T10:37:36.780-06:00</updated><title type='text'>Trying to exit Java</title><content type='html'>Just before the Oracle vs. Google lawsuit, I started a Java project for my PhD research. It was my first Java project in a while. I do more C++, MATLAB, and Python these days. I chose Java because I know it well and it simplifies cross-platform for me. I considered JavaScript, but this project included (2D) physics. I wasn't convinced by the JavaScript physics engines out there compared to the state of JBox2D.&lt;br /&gt;&lt;br /&gt;Well, I'm one of the folks that has been convinced that Java isn't really open source nor independently implementable. If you get in the way of Oracle revenue, they will sue you. That's not open. Sorry.&lt;br /&gt;&lt;br /&gt;So, where do I go?&lt;br /&gt;&lt;br /&gt;I have a language idea of my own with primary output targets being JS (for client) and C++ (for speedy batch programming or native apps), but I don't really have the time to implement that. I could use &lt;a href="http://haxe.org/"&gt;haXe&lt;/a&gt;. It's the most credible JS/C++ targeting language out there, in my experience, but I'm not convinced I want to go that route either.&lt;br /&gt;&lt;br /&gt;My current plan is to improve my C++ skills. Really. Anti-C++ rhetoric is strong in the Java community, but I'm being convinced that it can be used for good instead of evil. I also plan to stay in touch with JS land. And maybe someday I'll make or use a language that targets both (such as haXe).&lt;br /&gt;&lt;br /&gt;I just wished I'd used C++ for that 2D physics project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8287899919739572517?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8287899919739572517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/11/trying-to-exit-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8287899919739572517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8287899919739572517'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/11/trying-to-exit-java.html' title='Trying to exit Java'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3506309585222416134</id><published>2010-11-07T22:13:00.004-06:00</published><updated>2010-11-07T23:04:38.978-06:00</updated><title type='text'>Mormon Articles of Faith: Number 1</title><content type='html'>I've recently felt like sharing some of my beliefs about more important things than tech. I belong to &lt;a href="http://lds.org/"&gt;The Church of Jesus Christ of Latter-day Saints&lt;/a&gt;. In other words, I'm a &lt;a href="http://mormon.org/"&gt;Mormon&lt;/a&gt;. We get that nickname because of the &lt;a href="http://en.wikipedia.org/wiki/Book_of_Mormon"&gt;Book of Mormon&lt;/a&gt;, which we believe is a record of ancient Christians living in the Americas. That, among other things, makes us different from many other folks.&lt;br /&gt;&lt;br /&gt;We are also called LDS (Latter-day Saints, from the name of the church).&lt;br /&gt;&lt;br /&gt;To share our beliefs, I feel like working from our Articles of Faith. (See here for &lt;a href="http://en.wikipedia.org/wiki/Articles_of_Faith"&gt;what "articles of faith" are in general&lt;/a&gt; and &lt;a href="http://lds.org/library/display/0,4945,106-1-2-1,FF.html"&gt;here for the full list of the LDS articles&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;I'll start with our first article:&lt;br /&gt;&lt;br /&gt;1. We believe in God, the Eternal Father, and in His Son, Jesus Christ, and in the Holy Ghost.&lt;br /&gt;&lt;br /&gt;Here's &lt;a href="http://lds.org/ldsorg/v/index.jsp?locale=0&amp;sourceId=281757b60090c010VgnVCM1000004d82620a____&amp;vgnextoid=2354fccf2b7db010VgnVCM1000004d82620aRCRD"&gt;a great discussion of this subject&lt;/a&gt; from &lt;a href="http://en.wikipedia.org/wiki/Gordon_B._Hinckley"&gt;Gordon B. Hinckley&lt;/a&gt;, who under Christ's direction was the leader of the church at the time of his passing in 2008. He had authority to speak officially for the church, and I don't.&lt;br /&gt;&lt;br /&gt;Still, I may continue this thread and speak from my own understanding. If I do that, I may emphasize that it's what I personally believe, not what &lt;em&gt;we&lt;/em&gt; believe. Again, I don't have authority to speak for the church, and I definitely don't know everything. But I still try to stay in harmony with the teachings of the church and with the will of God as I understand it. I do my best (sometimes). Note that even President Hinckley (the term we use for the leader of the church) used the phrase "I believe" in his discussion. Despite his authority, I think he also liked to emphasize a personal perspective sometimes. I once listened to President Hinckley speak at a soccer stadium in Guatemala City. (&lt;a href="http://speeches.byu.edu/reader/reader.php?id=7940"&gt;Here's a reference from him to that occasion in Guate.&lt;/a&gt;) He said (to the extent I remember his wording), "If you remember one thing from today, remember you heard Gordon Hinckley say that he knows God lives." I actually do remember very little else from his message that day.&lt;br /&gt;&lt;br /&gt;Anyway, to summarize my take-aways for the first article of faith: I believe in a personal God, not just universal forces. Even more specifically, there are three distinct persons to which I refer as God. &lt;a href="http://scriptures.lds.org/en/morm/7/7f"&gt;All three can be called "one God"&lt;/a&gt; because of their great unity. While I seek to follow the promptings of the Holy Spirit in my life, I understand Him less as an individual. That's just where I'm at. The Father and the Son are clearer to me, even if I haven't seen them myself during my time here on earth. The Son, Jesus Christ, came to earth (as discussed in the New Testament in the Holy Bible) as a manifestation of God on earth. He also came to be like us. He knows first hand what we go through. I find that comforting. Further, &lt;a href="http://www.biblegateway.com/passage/?search=John+14:8-9&amp;version=NIV;KJV"&gt;knowing the Son helps us to know the Father&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If I continue this subject, I'll have more to say about Jesus. Mormons really are Christians in the sense that Jesus is at the center of our belief and worship.&lt;br /&gt;&lt;br /&gt;Finally, again, in case anyone skims too much (as I do): Everything I say is my personal perspective. I &lt;em&gt;don't&lt;/em&gt; speak officially for the church by any means.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3506309585222416134?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3506309585222416134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/11/mormon-articles-of-faith-number-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3506309585222416134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3506309585222416134'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/11/mormon-articles-of-faith-number-1.html' title='Mormon Articles of Faith: Number 1'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-4454046034374586264</id><published>2010-10-29T16:41:00.002-05:00</published><updated>2010-10-29T16:46:40.446-05:00</updated><title type='text'>Mac OS X Lion goes full screen</title><content type='html'>As a former Amiga user, I've &lt;em&gt;long&lt;/em&gt; been a fan of full screen apps. This is also an area where Windows and Linux have outshined Mac with its not-really-even-a-maximize-button user interface. So this new plan &lt;a href="http://www.apple.com/macosx/lion/#apps"&gt;full screen apps plan&lt;/a&gt; for Lion is really interesting to me.&lt;br /&gt;&lt;br /&gt;Sadly, I fear the Mac App Store is just the first step toward completely eliminating traditional application distribution on the Mac. We'll see where they are in 10 years.&lt;br /&gt;&lt;br /&gt;On a side note, I do still need to pardon Apple since they removed the draconian anti-Flash clause for iPhone app development. Can't ignore them, though. They'll likely be back at things along those lines (or other troubles of similar magnitude) before too long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-4454046034374586264?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/4454046034374586264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/10/mac-os-x-lion-goes-full-screen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4454046034374586264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4454046034374586264'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/10/mac-os-x-lion-goes-full-screen.html' title='Mac OS X Lion goes full screen'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-4160762142612802023</id><published>2010-09-15T10:13:00.006-05:00</published><updated>2010-09-15T10:24:47.624-05:00</updated><title type='text'>Wishing for TextPad bookmarks in Eclipse ...</title><content type='html'>There's one feature of TextPad that's just wonderfully convenient and helpful. It's called bookmarked lines.&lt;br /&gt;&lt;br /&gt;You can mark lines by search (meaning by regexes), you can cut or copy marked lines, go forward/backward to next marked line, see them visually of course, and do other similar things.&lt;br /&gt;&lt;br /&gt;What's the point? It means you don't need to drop down to a shell for things like grep or such like. They're really nice, actually. I used them just constantly when I was regularly on TextPad. I can't say enough nice things about them, really.&lt;br /&gt;&lt;br /&gt;Please, please, please, please, please could someone put them in Eclipse? (Sorry for being a beggar rather than a helper.)&lt;br /&gt;&lt;br /&gt;If Eclipse weren't already too complicated, I'd recommend an easy swap technique between different bookmark categories. Sometimes I would want to remember certain markings when temporarily moving to others. One option is to open the same contents multiple times (such as by copy and paste to a new document), but that was a pain really. But I'm afraid that anyone in Eclipse land would make a horror out of trying to manage multiple marker categories. So just one would be great for now.&lt;br /&gt;&lt;br /&gt;And as another point, current Eclipse bookmarks are _nowhere_ near as good as TextPad's, despite a superficial similarity. But they could perhaps be improved to provide real service.&lt;br /&gt;&lt;br /&gt;Thanks in advance!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-4160762142612802023?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/4160762142612802023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/09/wishing-for-textpad-bookmarks-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4160762142612802023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4160762142612802023'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/09/wishing-for-textpad-bookmarks-in.html' title='Wishing for TextPad bookmarks in Eclipse ...'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8539107462957413532</id><published>2010-08-29T18:17:00.001-05:00</published><updated>2010-08-29T18:20:22.092-05:00</updated><title type='text'>Some 2005 violent death statistics</title><content type='html'>Apologies on the weak formatting, but here we go:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;US penal executions: 60 - &lt;a href="http://www.deathpenaltyinfo.org/executions-united-states-2005"&gt;http://www.deathpenaltyinfo.org/executions-united-states-2005&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Iraq &amp;amp; Afghanistan coalition military deaths: 1,028 (including overlap with terrorism deaths?) - &lt;a href="http://icasualties.org/"&gt;http://icasualties.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Worldwide terrorism deaths: 14,482 - &lt;a href="http://www.state.gov/s/ct/rls/crt/2009/140902.htm"&gt;http://www.state.gov/s/ct/rls/crt/2009/140902.htm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Iraqi civilian violent deaths: 14,975 (including overlap with terrorism deaths, I think) - &lt;a href="http://www.iraqbodycount.org/database/"&gt;http://www.iraqbodycount.org/database/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;US murders &amp;amp; nonnegligent manslaughter: 16,692 - &lt;a href="http://www.fbi.gov/ucr/05cius/data/table_01.html"&gt;http://www.fbi.gov/ucr/05cius/data/table_01.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;US auto accident deaths: 42,636 - &lt;a href="http://www.car-accidents.com/pages/stats.html"&gt;http://www.car-accidents.com/pages/stats.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;US abortions: 1,198,960 - &lt;a href="http://www.census.gov/compendia/statab/cats/births_deaths_marriages_divorces/family_planning_abortions.html"&gt;http://www.census.gov/compendia/statab/cats/births_deaths_marriages_divorces/family_planning_abortions.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Why 2005? That's the most recent year for which I found stats on abortions. (So, yes my focus is biased.) Good news is that the abortion rate seems to be declining despite being a behemoth here. I have guesses of why, but I haven't studied enough to state hypotheses right here.&lt;br /&gt;&lt;br /&gt;Feel free to add to or improve the data or to find better sources.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8539107462957413532?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8539107462957413532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/08/some-2005-violent-death-statistics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8539107462957413532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8539107462957413532'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/08/some-2005-violent-death-statistics.html' title='Some 2005 violent death statistics'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5080056340164545791</id><published>2010-08-23T06:27:00.007-05:00</published><updated>2010-08-23T11:22:45.402-05:00</updated><title type='text'>Oracle: We've got a bill of sale right here!</title><content type='html'>This is what Oracle reminds me of:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wPeY2Yl5IkQ/THJdjPzftPI/AAAAAAAAAF8/nCz1yNP7KW4/s1600/petes-dragon-winters.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 180px;" src="http://4.bp.blogspot.com/_wPeY2Yl5IkQ/THJdjPzftPI/AAAAAAAAAF8/nCz1yNP7KW4/s320/petes-dragon-winters.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5508568154346861810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cell phone Java a la Pete's Dragon follows.&lt;br /&gt;&lt;br /&gt;Oracle: We got a bill of sale right here that says he belongs to us!&lt;br /&gt;&lt;br /&gt;Google: You don't love him. All you've done up 'til now is break his heart. You'll abuse him, and just use him.&lt;br /&gt;&lt;br /&gt;As for me, I'm sick of the corporate shenanigans in Java. And why didn't Google buy Sun when they had the chance? I'm getting tired of Java in general. But sorry Miguel, that doesn't mean I'm running to Mono. There are plenty more fish in the ocean.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5080056340164545791?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5080056340164545791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/08/oracle-weve-got-bill-of-sale-right-here.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5080056340164545791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5080056340164545791'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/08/oracle-weve-got-bill-of-sale-right-here.html' title='Oracle: We&apos;ve got a bill of sale right here!'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wPeY2Yl5IkQ/THJdjPzftPI/AAAAAAAAAF8/nCz1yNP7KW4/s72-c/petes-dragon-winters.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8903786080426464337</id><published>2010-06-29T10:49:00.003-05:00</published><updated>2010-06-29T11:12:20.549-05:00</updated><title type='text'>In-Mouse Accelerometers</title><content type='html'>From the &lt;a href="http://msftkitchen.com/2010/06/windows-8-plans-leaked-numerous-details-revealed.html"&gt;leaked Windows 8 plans&lt;/a&gt;, it seems that Microsoft is looking at a future with richer sensors on personal computers. I would love to see this happen. I'm a big fan of Apple's popularization of accelerometers in mobile devices, too. Interaction can be so much richer than just keyboard, mouse, monitor, and speakers. Ubiquitous cameras and microphones would be sweet, though creepy.&lt;br /&gt;&lt;br /&gt;On that topic, someone in my research lab recently made a comment about how cool it would be to put accelerometers and gyros in mice. Potentially you could go without the light sensor entirely. See &lt;a href="http://en.wikipedia.org/wiki/Inertial_measurement_unit"&gt;IMUs&lt;/a&gt; for more. The Wii remote is sort of like this. And &lt;a href="http://www.google.com/search?q=accelerometer+mouse"&gt;accelerometer mice&lt;/a&gt; have been made before.&lt;br /&gt;&lt;br /&gt;The counter argument (from someone else in my lab here) is that full accelerometers and gyros would be much more expensive than current mouse technology, especially for the same amount of reliability and precision. But &lt;a href="http://www.sparkfun.com/commerce/categories.php?c=163"&gt;accelerometers&lt;/a&gt; and &lt;a href="http://www.sparkfun.com/commerce/categories.php?c=160"&gt;IMUs&lt;/a&gt; aren't completely off the charts for price. Maybe you could go cheap and just augment normal mice with accelerometer only for now. (And the &lt;a href="http://search.digikey.com/scripts/DkSearch/dksus.dll?Cat=1966355&amp;k=mma7361"&gt;raw part is even much cheaper&lt;/a&gt; than the breakout boards.)&lt;br /&gt;&lt;br /&gt;I mean, it would be sweet if you could pick up your mouse and wave it around for 3D control in certain apps and games, right?&lt;br /&gt;&lt;br /&gt;Logitech, Microsoft, Apple, someone, please get this out there. Thanks in advance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8903786080426464337?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8903786080426464337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/06/in-mouse-accelerometers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8903786080426464337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8903786080426464337'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/06/in-mouse-accelerometers.html' title='In-Mouse Accelerometers'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2290090614550878505</id><published>2010-05-20T11:48:00.006-05:00</published><updated>2010-05-20T12:05:05.857-05:00</updated><title type='text'>WebGL and NaCl on Google Chrome on Lucid 64-bit</title><content type='html'>Just reporting that the latest &lt;a href="http://www.chromium.org/getting-involved/dev-channel"&gt;dev channel version of Google Chrome&lt;/a&gt; runs &lt;a href="http://code.google.com/p/nativeclient-sdk/"&gt;NaCl&lt;/a&gt; demos (using local Python-based server) and &lt;a href="http://www.khronos.org/webgl/wiki/Demo_Repository"&gt;WebGL demos&lt;/a&gt; beautifully on the 64-bit Ubuntu 10.04 computer I'm using. Just '--enable-nacl --enable-webgl' (and maybe '--user-data-dir=...'), and you're running.&lt;br /&gt;&lt;br /&gt;Don't use this configuration for everyday browsing, of course. Who knows how many security holes there are.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/chrome/extensions/getstarted.html"&gt;Chrome Extensions are a piece of cake&lt;/a&gt; to work with, too. I hope Mozilla Jetpack gets Firefox there soon. Old-timey Firefox extensions are just painful. Well, not that I should need an extension if I have NaCl, but it's still nice. And the extension would potentially allow one load for all sites instead of separate load per site.&lt;br /&gt;&lt;br /&gt;Hrmm. Next question, can I put Bullet Physics into Chrome NaCl without much blood, sweat, or tears? If so, I think I won the sweepstakes.&lt;br /&gt;&lt;br /&gt;Please say we get this stuff by default in our browsers soon. Pretty please. I mean, I can't hardly believe how nice this would be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2290090614550878505?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2290090614550878505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/05/webgl-and-nacl-on-google-chrome-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2290090614550878505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2290090614550878505'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/05/webgl-and-nacl-on-google-chrome-on.html' title='WebGL and NaCl on Google Chrome on Lucid 64-bit'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6812412370621534533</id><published>2010-05-11T16:29:00.000-05:00</published><updated>2010-05-11T16:30:50.001-05:00</updated><title type='text'>'null' is a weak excuse for an empty list.</title><content type='html'>That's all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6812412370621534533?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6812412370621534533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/05/null-is-weak-excuse-for-empty-list.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6812412370621534533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6812412370621534533'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/05/null-is-weak-excuse-for-empty-list.html' title='&apos;null&apos; is a weak excuse for an empty list.'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-821148650677187203</id><published>2010-04-22T09:18:00.003-05:00</published><updated>2010-04-22T09:26:13.389-05:00</updated><title type='text'>Google Chrome Frame is my hero.</title><content type='html'>Well, I hope it will be once it's out.&lt;br /&gt;&lt;br /&gt;The thought of fixing IE once and for all just gives me chills.&lt;br /&gt;&lt;br /&gt;In any case, &lt;a href="http://code.google.com/chrome/chromeframe/"&gt;Chrome Frame&lt;/a&gt; answers &lt;a href="http://weblogs.mozillazine.org/roadmap/archives/2007/03/the_open_web_and_its_adversari.html#c905212"&gt;my previous hopes for a Gecko-based version&lt;/a&gt; of the same idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-821148650677187203?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/821148650677187203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/04/google-chrome-frame-is-my-hero.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/821148650677187203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/821148650677187203'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/04/google-chrome-frame-is-my-hero.html' title='Google Chrome Frame is my hero.'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-7542751345431035258</id><published>2010-04-16T13:32:00.002-05:00</published><updated>2010-04-16T13:43:07.895-05:00</updated><title type='text'>And a function never cries.</title><content type='html'>I've been getting fed up with the question of what methods to put in a class which helper methods should be elsewhere. &lt;a href="http://en.wikipedia.org/wiki/Mixin"&gt;Mixins&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Extension_method"&gt;extension methods&lt;/a&gt; are two ways to address this topic. They have their pros and cons.&lt;br /&gt;&lt;br /&gt;But I'm becoming more and more a fan of simple, top-level functions. Wither OOP. Everything old is new again for me, and each function can be an island, especially with &lt;a href="http://en.wikipedia.org/wiki/Multiple_dispatch"&gt;multiple dispatch&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Well, there's that question of how to control data access and abstraction of types. I don't have it fully worked out yet, but I'm hoping to find a nice solution that keeps things as simple as possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-7542751345431035258?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/7542751345431035258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/04/and-function-never-cries.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7542751345431035258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7542751345431035258'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/04/and-function-never-cries.html' title='And a function never cries.'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6538539851777113819</id><published>2010-04-13T10:53:00.003-05:00</published><updated>2010-04-13T10:57:52.817-05:00</updated><title type='text'>Why developmental robotics?</title><content type='html'>The field of &lt;a href="http://en.wikipedia.org/wiki/Developmental_robotics"&gt;developmental robotics&lt;/a&gt; is often approached in a philosophical fashion. That's awesome and all, but there's also the practical reason: &lt;a href="http://en.wikipedia.org/wiki/Larry_Wall#Virtues_of_a_programmer"&gt;laziness&lt;/a&gt;. But I guess &lt;a href="http://tomobag.blogspot.com/2009/05/answers-already-there.html"&gt;I've said this before&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Side note, I'm not sure I really get the difference between laziness and impatience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6538539851777113819?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6538539851777113819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/04/why-developmental-robotics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6538539851777113819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6538539851777113819'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/04/why-developmental-robotics.html' title='Why developmental robotics?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-1938713744100679341</id><published>2010-04-09T14:37:00.004-05:00</published><updated>2010-04-09T14:47:15.839-05:00</updated><title type='text'>Reason to boycott (and litigate against) Apple?</title><content type='html'>This whole &lt;a href="http://daringfireball.net/2010/04/why_apple_changed_section_331"&gt;iPhone section 3.3.1 thing&lt;/a&gt; is nasty. Sure, UIs are notoriously bad when ported, despite some examples to the contrary, but let an approver or the user base sort that out. Further, some base features (not always written in C!) are helpful across platforms even if the UI is tricked out for each.&lt;br /&gt;&lt;br /&gt;Apple's a worse monopoly than Microsoft. I can't think enough how much I don't ever want to give Apple any money ever again.&lt;br /&gt;&lt;br /&gt;Sadly, my convictions wane with time, but I'm not in the habit of giving Apple money anyway. One Mac Mini and one iPod a few years ago. A bit of iTunes. But I think it's time for me to write them off.&lt;br /&gt;&lt;br /&gt;The only reason to have a Mac is to make sure apps and web pages do work there.&lt;br /&gt;&lt;br /&gt;I wouldn't be surprised if Apple's in a &lt;em&gt;long&lt;/em&gt;-term strategy to eliminate traditional Macs &lt;em&gt;entirely&lt;/em&gt;. They'll have revenue reasons enough with some time as well as migration strategies for developers currently banking on Mac. Then, it's just App Store land ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-1938713744100679341?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/1938713744100679341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/04/reason-to-boycott-and-litigate-against.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1938713744100679341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1938713744100679341'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/04/reason-to-boycott-and-litigate-against.html' title='Reason to boycott (and litigate against) Apple?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2882062192997030341</id><published>2010-04-09T13:22:00.002-05:00</published><updated>2010-04-09T13:33:39.431-05:00</updated><title type='text'>Surroundings as Database</title><content type='html'>I've been studying how a robot (or a person) can make sense of the world around them. How do you focus on (or extract) what matters most?&lt;br /&gt;&lt;br /&gt;Some systems of describing world/environment state make these look almost like queries. If there "exists some table such that there exist chairs around it and also plates around on the table, one per chair" then I suspect it's a table set for a meal. If "I'm driving and there exists a person in front of me that is too close" then I need to hit the breaks. Things like that.&lt;br /&gt;&lt;br /&gt;Those with DB experience see the queries just standing out. Trick is that a big DB needs indexing to be fast enough.&lt;br /&gt;&lt;br /&gt;Look around you. Imagine all the tables, columns, and rows you could imagine describing every feature from large to small scale. That's a HUGE database. When dropped in an unfamiliar setting, we talk about "getting our bearings". I'm starting to think this is sort of like populating a DB and building indexes. Somewhat familiar settings allow us to prioritize such data loads easier.&lt;br /&gt;&lt;br /&gt;Now, the world isn't static. Visit a place you know, and some things might have changed behind your back. Stay in one place or walk around, and slight changes occur constantly. That's like ordinary DB updates, inserts, and deletes. Should be faster than working from scratch, since most of the data is static and already indexed.&lt;br /&gt;&lt;br /&gt;As I've written this out just now, I've become more and more convinced that this is a good model for things. Well, it doesn't need &lt;em&gt;enslaved&lt;/em&gt; to DB idioms, but the general concepts are still so close.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2882062192997030341?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2882062192997030341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/04/surroundings-as-database.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2882062192997030341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2882062192997030341'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/04/surroundings-as-database.html' title='Surroundings as Database'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6044555009837334032</id><published>2010-04-08T09:23:00.002-05:00</published><updated>2010-04-08T09:28:13.829-05:00</updated><title type='text'>Accessible AI Research: MakeME PlayME</title><content type='html'>Just heard about &lt;a href="http://makemeplayme.com/"&gt;MakeME PlayME&lt;/a&gt; from the Cognitive Computing Lab at Georgia Tech. It might not be a perfect site, but it's still a great example of exposing research to the general public. This is along the lines of &lt;a href="http://tomobag.blogspot.com/2009/12/more-research-notes-for-future.html"&gt;how I'd like to present research (especially the 2nd-to-last bullet there)&lt;/a&gt;. Maybe someday.&lt;br /&gt;&lt;br /&gt;Meanwhile, hats off to the MakeME PlayME team (and other teams with similar styles).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6044555009837334032?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6044555009837334032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/04/accessible-ai-research-makeme-playme.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6044555009837334032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6044555009837334032'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/04/accessible-ai-research-makeme-playme.html' title='Accessible AI Research: MakeME PlayME'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8074793734138837569</id><published>2010-03-26T09:29:00.002-05:00</published><updated>2010-03-26T09:36:10.249-05:00</updated><title type='text'>Don't EVER pop open windows at me!</title><content type='html'>One thing that Linux (well, my Gnome on Ubuntu 8.04), Mac, and Windows all fail at MISERABLY is the whole popping open unexpected windows thing.&lt;br /&gt;&lt;br /&gt;Really, really, really, no window manager should EVER put another window in front of me while I'm doing something unrelated. Put it behind my current window. Put a notice on the task bar. Maybe even slide out a little notice bubble in the corner, but DON'T COVER WHAT I'M DOING, and DON'T STEAL MY KEYBOARD FOCUS!&lt;br /&gt;&lt;br /&gt;I bet enough information is already available to most window managers to cover 95% of the cases where I currently have problems. Just come on folks, don't you think you can take care of this problem????&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8074793734138837569?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8074793734138837569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/03/dont-ever-pop-open-windows-at-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8074793734138837569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8074793734138837569'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/03/dont-ever-pop-open-windows-at-me.html' title='Don&apos;t EVER pop open windows at me!'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6148301357830986062</id><published>2010-02-26T11:52:00.003-06:00</published><updated>2010-02-26T12:10:20.233-06:00</updated><title type='text'>The iPad vs. The Programmer</title><content type='html'>Whether Apple has literally used magic or not in the creation of the iPad, it seems primarily targeted at everyday users with common needs. One can't run arbitrary software on it, so it can't do the same thing for me as my Dell Mini where I frequently use Eclipse.&lt;br /&gt;&lt;br /&gt;But the iPad &lt;em&gt;can&lt;/em&gt; run office software, games, other apps, and HTML. My understanding is that JITs aren't supported on the iPhone, but I guess you could do interpreted program execution.&lt;br /&gt;&lt;br /&gt;I think that HTML is the important item here. If the iPad or other limited devices gain enough traction to impact usage of traditional notebook computer, what does that do to programmers like me? I can always still be a minority notebook user or stick to desktops, but what do I do when cheap and convenient leave me behind?&lt;br /&gt;&lt;br /&gt;I predict that such market trends will push even more app usage onto the web. Development environments like &lt;a href="https://bespin.mozilla.com/"&gt;Mozilla's Bespin&lt;/a&gt; might eventually catch on. All I need is a browser to code, and the iPad has that.&lt;br /&gt;&lt;br /&gt;Further, what is the best deployment platform? Sure, I can write iPad apps ... or I can make web apps which can work all around. Firefox 3.6 includes support for &lt;a href="https://developer.mozilla.org/en/Detecting_device_orientation"&gt;device orientation detection&lt;/a&gt;. I don't know where HTML5 or other browsers are in relation to support for such features, but I imagine it's coming.&lt;br /&gt;&lt;br /&gt;So, where do we code? The web. What do we code for? The web. It's not a completely true story today, but devices like the iPad push it closer. Web domination marches on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6148301357830986062?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6148301357830986062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2010/02/ipad-vs-programmer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6148301357830986062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6148301357830986062'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2010/02/ipad-vs-programmer.html' title='The iPad vs. The Programmer'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-7015374504826900729</id><published>2009-12-16T08:02:00.004-06:00</published><updated>2009-12-16T08:54:46.929-06:00</updated><title type='text'>More research notes for the future</title><content type='html'>Notes not for today, but maybe tomorrow.&lt;br /&gt;&lt;br /&gt;Catch phrase:&lt;br /&gt;Physically rich intelligence and autonomy.&lt;br /&gt;&lt;br /&gt;Research topics:&lt;br /&gt;* Domestic robots.&lt;br /&gt;* Learning and control of many sensors and actuators.&lt;br /&gt;* Dynamic environments. Real-time control. Anytime algorithms.&lt;br /&gt;* Life-long learning. Many concepts to relate and scale.&lt;br /&gt;&lt;br /&gt;Platforms:&lt;br /&gt;* World simulator. Parameterized, articulation, fluids, particles, sound and light tracing. The higher fidelity, the better.&lt;br /&gt;* Miniature off-the-shelf humanoids (such as the Aldebaran Nao) with many actuators and sensors.&lt;br /&gt;* Build on and in support of low-end computers, though allow scalability.&lt;br /&gt;&lt;br /&gt;Goals:&lt;br /&gt;* Open-source, liberally-licensed, productized-quality software projects.&lt;br /&gt;* Publicly accessible research, both in software (WebGL?) and articles/documentation.&lt;br /&gt;* Support a few grad students and as much academic freedom for them as possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-7015374504826900729?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/7015374504826900729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/12/more-research-notes-for-future.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7015374504826900729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7015374504826900729'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/12/more-research-notes-for-future.html' title='More research notes for the future'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8656173127844629637</id><published>2009-12-01T09:49:00.002-06:00</published><updated>2009-12-01T09:53:37.701-06:00</updated><title type='text'>Solution density</title><content type='html'>In the real world, there are so many variables to consider that we'd never get anything done if considered all the options. Do we need to check the headlights of the neighbors cars to know if we should make oatmeal or pancakes for breakfast? Does the arrangement of dust particles on the back porch matter?&lt;br /&gt;&lt;br /&gt;We're good at focusing on the important details. Along with our experience, that allows to make quick decisions.&lt;br /&gt;&lt;br /&gt;I'm wondering what formulations exist for intractable problems in computer science that relate to solution density in the sparse area of world configurations that actually matters. Seems perhaps more meaningful than trying to measure actual problem size.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8656173127844629637?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8656173127844629637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/12/solution-density.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8656173127844629637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8656173127844629637'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/12/solution-density.html' title='Solution density'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-727341549331467045</id><published>2009-11-24T10:07:00.002-06:00</published><updated>2009-11-24T10:16:32.309-06:00</updated><title type='text'>Dynamic constness</title><content type='html'>I've been thinking about how 'const' (C++ style) seems like a good idea but can cause pain in practice. It leads to duplicate definitions of methods (termed a "shadow world" by Anders Hejlsberg). It is really is hard to enforce statically.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.iwebthereforeiam.com/iwebthereforeiam/2009/07/c-and-const-correctness.html"&gt;See here for some great summaries.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Personally, I think the "bit" idea might work. That is, pointers are usually aligned to 4-byte boundaries. That gives two bits to play with. One of those bits might serve well for indicating constness in a dynamic fashion.&lt;br /&gt;&lt;br /&gt;Two different pointers to the same object. One carries const. The other doesn't. Enforcement happens at runtime. Sounds maybe doable.&lt;br /&gt;&lt;br /&gt;I'd need to think more about the container issue, though. First thought is that any const pointer is just deeply const.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-727341549331467045?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/727341549331467045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/11/dynamic-constness.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/727341549331467045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/727341549331467045'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/11/dynamic-constness.html' title='Dynamic constness'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-1966140802984382334</id><published>2009-11-20T10:39:00.002-06:00</published><updated>2009-11-20T10:42:46.118-06:00</updated><title type='text'>Course pre tests</title><content type='html'>I was just wondering what the value might be of testing folks at the beginning of a course on the subject matter. Some people come in with more knowledge than others.&lt;br /&gt;&lt;br /&gt;I'm afraid that without that, it's harder to see who's actually learning. And without that, it's harder to know when teaching has been effective.&lt;br /&gt;&lt;br /&gt;Or in other words, when evaluating learning, I'd like to subtract out those who already knew a lot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-1966140802984382334?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/1966140802984382334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/11/course-pre-tests.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1966140802984382334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1966140802984382334'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/11/course-pre-tests.html' title='Course pre tests'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5940434935406200944</id><published>2009-11-18T10:27:00.003-06:00</published><updated>2009-11-18T10:59:03.601-06:00</updated><title type='text'>Exceptions, Processes, Java, &amp; Go</title><content type='html'>My opinions on exception/error handling is like so: I (and I believe most other programmers) don't want to spend the time to carefully analyze every possible unlikely error case as I go. Some cases should be carefully handled. But if things go bad in an unexpected fashion, I believe this is what should happen: clean up all resources safely and then crash.&lt;br /&gt;&lt;br /&gt;Seriously. And that's what exception handling does, if you design your code right. Either nice automatic resource cleanup (such as what's common in C#, Ruby, Python, C++, or upcoming in Java 7) or somewhat manual work such as Java finally blocks can take care of cleanup during crash.&lt;br /&gt;&lt;br /&gt;But crash? Yes. The question is the scope of the crash.&lt;br /&gt;&lt;br /&gt;The crash should affect the current request. For a web server, yep, that's the HTTP request. For a database, it would be the current query. For a GUI, it's the current user action.&lt;br /&gt;&lt;br /&gt;In olden Unix days, processes were designed to do one thing and do it well. Globals were less (though still somewhat) evil, since every process was sort of like its own object. Global death was also less evil. Therefore, the old-timey C 'assert' feature was somewhat reasonable. If you kill the process, it generally kills the whole pipe chain, which also effectively kills the user command-line request. Quite reasonable in most cases.&lt;br /&gt;&lt;br /&gt;If each response to a GUI command ran as its own process (interesting thought and probably been done by someone before), then killing that process by assert wouldn't be so evil.&lt;br /&gt;&lt;br /&gt;But most of us seem to have decided that multi-process is too heavy and slow. We don't really need all that process weight. Even to the extent of "stackless" and subthread coroutines like in Erlang, Stackless Python, and now Go. But in any case, whether threads or smaller, killing processes by assert is clearly scary. Instead of kill the "request", you crash the whole system. Bad news.&lt;br /&gt;&lt;br /&gt;Enter exception handling, which works well enough that almost all recent programming languages use very similar models with equivalents of 'throw' and 'catch'.&lt;br /&gt;&lt;br /&gt;What doesn't work is expecting that everyone will want to pay attention to every possible unlikely error case along the way. Checked exceptions in Java and manual error code checking in C lead to the same problem that people ignore errors. Checked exceptions lead to ignored errors? Yes. I've seen it a lot, especially in the pre-chaining days in Java. And still it's an easy thing to do today. Why? Because I don't know what to do with the checked exception, but I have to catch it. So I catch it. And um, if I'm extra lazy (and surely no one's lazy, right?), I just ignore it. Maybe I'm nice enough to log it or wrap it.&lt;br /&gt;&lt;br /&gt;But manual error code checking is just &lt;em&gt;begging&lt;/em&gt; to be ignored instead of likely to be ignored.&lt;br /&gt;&lt;br /&gt;And if you ignore errors, instead of crashing the request (and cleaning up resources), you end up in an unstable, dangerous program state.&lt;br /&gt;&lt;br /&gt;So, the fine folks behind Go (and yes, some them obviously have many more years under their belts than me) say &lt;a href="http://golang.org/doc/go_lang_faq.html#exceptions"&gt;they don't need exceptions and can't make them work with serious parallelism anyway&lt;/a&gt;. Nice and well, but expect most programmers to create unstable, buggy code.&lt;br /&gt;&lt;br /&gt;You &lt;em&gt;can't&lt;/em&gt; expect programmers to write "a good error message now", emphasis on the &lt;em&gt;now&lt;/em&gt;. If do, expect instead that laziness will lead to extreme bugs.&lt;br /&gt;&lt;br /&gt;Seriously, figure out how to crash a specific "request" with automatic cleanup when errors happen, or expect bugs.&lt;br /&gt;&lt;br /&gt;Oh, and figuring out how to produce only one error report in the logs for each failure is also awesome. Those of you who've worked in complex Java software (checked exceptions everywhere) can imagine what I mean by this. Similar issues seem easy to come by in a land of extreme parallelism, if you don't draw that "request" circle well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5940434935406200944?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5940434935406200944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/11/exceptions-processes-java-go.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5940434935406200944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5940434935406200944'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/11/exceptions-processes-java-go.html' title='Exceptions, Processes, Java, &amp; Go'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5104019336318051642</id><published>2009-11-17T22:38:00.002-06:00</published><updated>2009-11-17T22:42:45.636-06:00</updated><title type='text'>Fan language now Fantom</title><content type='html'>The Fan programming language (targeting the JVM, JavaScript, and the .NET CLR) has been &lt;a href="http://fantom.org/sidewalk/topic/821"&gt;officially renamed to Fantom&lt;/a&gt; to improve searchability.&lt;br /&gt;&lt;br /&gt;New domain name: &lt;a href="http://fantom.org/"&gt;fantom.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happily, file name extensions and tool names remain unchanged.&lt;br /&gt;&lt;br /&gt;It's a great language, and here's wishing them some good times ahead!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5104019336318051642?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5104019336318051642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/11/fan-language-now-fantom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5104019336318051642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5104019336318051642'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/11/fan-language-now-fantom.html' title='Fan language now Fantom'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-9206413640062279076</id><published>2009-11-16T14:26:00.002-06:00</published><updated>2009-11-16T14:30:50.378-06:00</updated><title type='text'>Replicating vs. Understanding</title><content type='html'>In reading a recent dialog in an IEEE Autonomous Mental Development newsletter, they are discussing the principles vs. black art of developmental robotics. I tend to think of it as a question:&lt;br /&gt;&lt;br /&gt;Do you want to focus more on creating intelligent robots or on understanding the details of intelligent beings actually operate? Both are meaningful questions, but principles of self-organization are not necessarily the same as the principles used in the end by a self-organized system. These topics sometimes get blurred, I think.&lt;br /&gt;&lt;br /&gt;But principles perhaps can be found in relation to either question. So maybe I blurred the original topic myself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-9206413640062279076?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/9206413640062279076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/11/replicating-vs-understanding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/9206413640062279076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/9206413640062279076'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/11/replicating-vs-understanding.html' title='Replicating vs. Understanding'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3115150827834596791</id><published>2009-11-12T22:20:00.005-06:00</published><updated>2009-11-12T22:47:05.354-06:00</updated><title type='text'>So like Google's Go is from Mars: A first glance</title><content type='html'>Well, I heard about the new language Go this afternoon, and it sucked a bit of time that I'm really short on. First note is that Go is from Mars. Take this sample from &lt;a href="http://golang.org/doc/go_tutorial.html"&gt;the tutorial&lt;/a&gt;:&lt;pre&gt;&lt;br /&gt;for i := 0; i &lt; flag.NArg(); i++ {&lt;br /&gt;    if i &gt; 0 {&lt;br /&gt;        s += Space&lt;br /&gt;    }&lt;br /&gt;    s += flag.Arg(i);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Personally, I've never seen curly-based syntax without parens on fors and ifs. Just doesn't seem right to me. There's some other style in the language that's new to me. It looks so strange that I'd almost think it were an April Fools joke ... if it were April 1st, I guess.&lt;br /&gt;&lt;br /&gt;But to get past the initial shock of alien appearance, here's my take at a first glance. This is based on their docs. I haven't actually tried it out.&lt;br /&gt;&lt;br /&gt;The good:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Pure interface, simple struct, no-inheritance, straight functions OO. If you've read other posts on my blog, you can imagine I'd love this. I'm glad someone was brave enough to try it out.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Super fast compiler. C and C++ stink in this arena.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fast execution, supposedly near native.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lightweight threads and message passing, a la Erlang. Scalability should be sweet.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Normal goodies like closures and type inference.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Opinionated in some things: UTF-8 source, public/private by naming convention (caps for public).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fairly simple namespacing.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;BSD licensing.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It's from Google. Google has $$$$$$. They can push things forward.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The bad:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The syntax. It's just grating to me at this point.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Too much focus on ad hoc solutions rather than general principles.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No concept for nullable pointers vs. not.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No operator overloading.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No easy interfacing to C++.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Is it cross-platform (meaning at least Windows, Mac, and Linux) yet? I'm not sure.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The ugly:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Um, no exception handling. Seriously. So, um, expect to have to manually check for errors all the time. Which means, expect average programmers to ignore lots of errors and write buggy code.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Well, I'd complain about this if there were exceptions, but there's no mechanism for automatic resource cleanup (beyond garbage collection) that I could find. Less need without exceptions, but it still seems like a glaring hole to me. Also, if the closures and&lt;br /&gt;anonymous functions are good enough, maybe I'm also overstating this one.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Probably forgetting something.&lt;br /&gt;&lt;br /&gt;Between the ugly and the fact that they aren't really production-ready yet, I think I'll just keep a watch on it for now. What I really want is language that IDE-friendly and human-friendly, compiles and runs like lightning (including fast starts and low memory usage), and instantly consumes C and C++ libraries. Oh, and doesn't make it painfully easy to ignore errors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3115150827834596791?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3115150827834596791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/11/so-like-googles-go-is-from-mars-first.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3115150827834596791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3115150827834596791'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/11/so-like-googles-go-is-from-mars-first.html' title='So like Google&apos;s Go is from Mars: A first glance'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-461808456650000819</id><published>2009-11-11T09:39:00.002-06:00</published><updated>2009-11-11T09:44:24.057-06:00</updated><title type='text'>GPGPU in the browser</title><content type='html'>This &lt;a href="http://mozillalabs.com/jetpack/2009/11/10/jetpack-0-5-contest-a-winner/"&gt;winning entry in the Mozilla Labs Jetpack competition&lt;/a&gt; might get many of the details wrong (as examples, why part of Jetpack instead of as its own extension and how it uses Nvidia CUDA instead of a cross-vendor solution), but I'm still super excited that it has drawn attention to putting GPGPU in the browser. So, three cheers for Alexander Miltsev!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-461808456650000819?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/461808456650000819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/11/gpgpu-in-browser.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/461808456650000819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/461808456650000819'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/11/gpgpu-in-browser.html' title='GPGPU in the browser'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5705424378082404531</id><published>2009-11-03T12:32:00.002-06:00</published><updated>2009-11-03T12:37:41.591-06:00</updated><title type='text'>Inverse Programming Assignments</title><content type='html'>I was just wondering today if there was a good way to let students play the part of the computer instead of the programmer. That is, they would be given a program and be required to push and pop off the stack, change variable values, allocate objects on the heap, deal with arrays, handle conditionals and loops, choose which line to execute next, and so on.&lt;br /&gt;&lt;br /&gt;It might be possible on paper, in board game format, or maybe more reasonable as a video game of sorts. Increasing levels of complexity (introducing new language features and machine concepts) might be nice.&lt;br /&gt;&lt;br /&gt;Just wondering if playing the computer would help some folks with understanding the system better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5705424378082404531?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5705424378082404531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/11/inverse-programming-assignments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5705424378082404531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5705424378082404531'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/11/inverse-programming-assignments.html' title='Inverse Programming Assignments'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5432327891562881545</id><published>2009-11-03T11:54:00.003-06:00</published><updated>2009-11-03T11:59:14.224-06:00</updated><title type='text'>Liberally licensed embeddable web server for C or C++?</title><content type='html'>I've done some searching in the past but couldn't find a liberally licensed embeddable web server for C or C++. That surprised me. I'm so used to having multiple good options in Java (such as Jetty) or built-in web servers say in Fan or Ruby.&lt;br /&gt;&lt;br /&gt;Two options I've looked at are libmicrohttpd (but it's LGPL which causes too much bother) and lighttpd (but it's not really designed to have an embedded option so far as I can tell, which rather surprises me). Anything else out there?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5432327891562881545?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5432327891562881545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/11/liberally-licensed-embeddable-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5432327891562881545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5432327891562881545'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/11/liberally-licensed-embeddable-web.html' title='Liberally licensed embeddable web server for C or C++?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3879961632117677752</id><published>2009-10-20T16:32:00.002-05:00</published><updated>2009-10-20T17:03:29.717-05:00</updated><title type='text'>Member access syntax: dots, brackets, and functions</title><content type='html'>I've spent some time thinking about common alternative syntaxes for accessing object members. By members, I mean methods or fields or whatever. For example, we have the struct dot syntax:&lt;pre&gt;&lt;br /&gt;person.age&lt;br /&gt;array.length&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And so on. C++ extended C to use the same syntax for method calls:&lt;pre&gt;&lt;br /&gt;person.age() or person.getAge()&lt;br /&gt;array.length()&lt;br /&gt;pen.moveTo(x, y)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Languages like Eiffel, Ruby, or Fan that treat all method calls as abstract messages don't distinguish between field access and method calls.&lt;br /&gt;&lt;br /&gt;Anyway, then we have array or hashtable access syntax, a different kind of membership:&lt;pre&gt;&lt;br /&gt;persons[4]&lt;br /&gt;properties["background"]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And languages like JavaScript unify the two; &lt;code&gt;properties.background&lt;/code&gt; and &lt;code&gt;properties["background"]&lt;/code&gt; mean the same thing. There's some nicety to that.&lt;br /&gt;&lt;br /&gt;But I'm working through a series of issues that will eventually get tangled. First, I need to go back to C. I can abstract member access there, too:&lt;pre&gt;&lt;br /&gt;age(person)&lt;br /&gt;length(array)&lt;br /&gt;moveTo(pen, x, y)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I'll pretend to have those namespaced for the moment (since otherwise in C they'd have uglier names), and if I have dynamic dispatch on the first (or more) arguments, this syntax could have the same meaning as virtual methods in C++ or Java or whatnot. For example, MATLAB can do OOP method dispatch with standard function call syntax.&lt;br /&gt;&lt;br /&gt;So the syntax question becomes do you like nested function calls or postfix member dot access? I think the postfix (or somewhat infix) C++ style is easier to understand:&lt;pre&gt;&lt;br /&gt;toUpper(firstName(person)) vs.&lt;br /&gt;person.firstName.toUpper&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The chain is just easier to read. And apparently the C# folks thought so enough that they introduced extension methods. A semi-complicated way of allowing dot chain syntax. Why not just make a language such that both syntaxes are equivalent?&lt;br /&gt;&lt;br /&gt;One reservation. Here's that tangle to which I was referring. Lets look at arrays again. Why do we really need a separate array access syntax vs. function call syntax? An array is just a function that hardcodes the responses, in one way of looking at it. So, like Scala or MATLAB, we could make them the same:&lt;pre&gt;&lt;br /&gt;persons(4) vs.&lt;br /&gt;persons[4]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And that frees up brackets for other uses (like generics in Scala). But, if like JavaScript, we consider struct membership and array-ish access to be the same, then 'persons[4]' is the same as 'persons.4', and that would be the same as '4(persons)', and all the worse if it's the same as 'persons(4)'.&lt;br /&gt;&lt;br /&gt;So, it tells member that array/hashtable lookup should best be separate syntax from function calls. I like it ('persons[4]') as shorthand for notions like 'persons.get(4)'. I think otherwise the unification of concepts leads to entanglement.&lt;br /&gt;&lt;br /&gt;At least, I haven't worked out another solution I like better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3879961632117677752?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3879961632117677752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/10/member-access-syntax-dots-brackets-and.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3879961632117677752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3879961632117677752'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/10/member-access-syntax-dots-brackets-and.html' title='Member access syntax: dots, brackets, and functions'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2708309272101783046</id><published>2009-10-09T09:10:00.002-05:00</published><updated>2009-10-09T09:14:01.646-05:00</updated><title type='text'>Teaching Ideas: Quick Syllabus</title><content type='html'>I've been thinking about teaching ideas. I'm still rather sold on the weekly, multiple choice, open book quiz thing.&lt;br /&gt;&lt;br /&gt;I think I've also decided that the syllabus should fit in one page. I'd love to get to real content even the first lecture. And the first quiz should include questions about the syllabus.&lt;br /&gt;&lt;br /&gt;Unrelated question: Could it possibly be easier to introduce Python and then teach Java in one semester than just to jump directly into Java? Maybe for some people. Not sure I'd be that brave (or be able to get approval) to try it out, though.&lt;br /&gt;&lt;br /&gt;I do hope to get the chance to teach soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2708309272101783046?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2708309272101783046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/10/teaching-ideas-quick-syllabus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2708309272101783046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2708309272101783046'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/10/teaching-ideas-quick-syllabus.html' title='Teaching Ideas: Quick Syllabus'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-4106351031802771599</id><published>2009-10-07T17:29:00.002-05:00</published><updated>2009-10-07T17:33:49.897-05:00</updated><title type='text'>Tamarin Nanojit</title><content type='html'>I sometimes get a hankerin' for programming languages. And I love script-style execution and high speed. I also love fast start-up and low memory consumption. Both of those points are making me more and more shy of the JVM.&lt;br /&gt;&lt;br /&gt;So, how do you get your hands on a well-maintained cross-platform JIT? Maybe &lt;a href="https://developer.mozilla.org/En/Nanojit"&gt;Nanojit&lt;/a&gt; (used by Tamarin and therefore Flash; also used by Firefox 3.5's TraceMonkey) is a good choice. Looks small and fast. Maybe even tasty. Something to keep in mind perhaps.&lt;br /&gt;&lt;br /&gt;Tamarin also includes a garbage collector, as a related morsel. Here's hoping it's all thread-safe.&lt;br /&gt;&lt;br /&gt;Again, just notes for the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-4106351031802771599?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/4106351031802771599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/10/tamarin-nanojit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4106351031802771599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4106351031802771599'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/10/tamarin-nanojit.html' title='Tamarin Nanojit'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6196621336092719725</id><published>2009-10-06T13:04:00.002-05:00</published><updated>2009-10-06T13:13:55.455-05:00</updated><title type='text'>Parameterized Subtasks</title><content type='html'>I've been studying logical planning and hierarchical reinforcement learning. It's common to see parameterized subtasks. For example, "grab the apple" vs. "grab the box". Those could be seen as function call "grab(apple)" and grab(box)".&lt;br /&gt;&lt;br /&gt;Some of the logical systems manage to deal with parameterized tasks really as parameters, using some strategy for plugging in possible argument values. But not all. It's easier to look through the options if you just instantiate every possible case (or at least the relevant cases???). So instead of the general "grab(x)", you deal with "grab(apple)" and "grab(box)" as individual cases.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;All&lt;/em&gt; of the reinforcement learning algorithms I've seen so far deal with it this way (instantiating each individual case). But it's hard to read every paper. Maybe I just haven't seen the right papers yet. Anyway, depending on the representation of the arguments, it seems like you lose a lot of ability to learn general concepts by learning each of the instantiations from scratch.&lt;br /&gt;&lt;br /&gt;I also wonder about genetic programming. Do they generate parameterized functions there? Or do they usually just generate lower-level constructs?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6196621336092719725?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6196621336092719725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/10/parameterized-subtasks.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6196621336092719725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6196621336092719725'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/10/parameterized-subtasks.html' title='Parameterized Subtasks'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5212066328792055821</id><published>2009-10-02T10:29:00.002-05:00</published><updated>2009-10-02T10:39:50.865-05:00</updated><title type='text'>LDS General Conference</title><content type='html'>The 179th Semiannual General Conference of the Church of Jesus Christ of Latter-day Saints is this Saturday and Sunday (October 3-4). It's a chance to receive guidance from living prophets, apostles, and others chosen by Christ. (For those of you who aren't familiar with Mormonism, yes, I meant what I said.) Anyway, &lt;a href="http://www.lds.org/broadcast/gc/0,5161,8870,00.html"&gt;you can watch most of it online&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sadly not available for Linux (or is there some way to view or listen to Windows Media?). We've viewed byu.tv streams on Mac and Windows before. It's usually high quality video, even if the interface on the site is quirky.&lt;br /&gt;&lt;br /&gt;Anyway, I highly recommend tuning in if you get the chance. Don't expect raw entertainment, though. It's a rather formal occasion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5212066328792055821?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5212066328792055821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/10/lds-general-conference.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5212066328792055821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5212066328792055821'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/10/lds-general-conference.html' title='LDS General Conference'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2570750353090557122</id><published>2009-09-29T21:11:00.002-05:00</published><updated>2009-09-29T21:23:12.270-05:00</updated><title type='text'>Yet Another Cognitive Architecture (or Web Framework)</title><content type='html'>There's nothing new under the sun.&lt;br /&gt;&lt;br /&gt;Back when I followed java.net better, it seemed like several times a week I'd see passing announcements of new Java web frameworks. &lt;a href="http://java-source.net/open-source/web-frameworks"&gt;This list (on java-source.net)&lt;/a&gt; shows at least a few of them.&lt;br /&gt;&lt;br /&gt;Studying AI and machine learning again, seems like I'm getting some deja vous. Everyone has another algorithm, or even full cognitive architecture (though that term itself is only used in certain circles). Apparently folks &lt;a href="http://www.google.com/search?q=%22yet+another+cognitive+architecture%22"&gt;noticed this even years ago&lt;/a&gt;. I'd like to eat more pudding, personally.&lt;br /&gt;&lt;br /&gt;Side note, sort of interesting to see Google suggestions for searches beginning with "yet another".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2570750353090557122?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2570750353090557122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/09/yet-another-cognitive-architecture-or.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2570750353090557122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2570750353090557122'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/09/yet-another-cognitive-architecture-or.html' title='Yet Another Cognitive Architecture (or Web Framework)'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3839443608949454339</id><published>2009-09-18T14:43:00.001-05:00</published><updated>2009-09-18T14:45:11.223-05:00</updated><title type='text'>WebGL (3D graphics) in Firefox and WebKit</title><content type='html'>This &lt;a href="http://blog.vlad1.com/2009/09/18/webgl-in-firefox-nightly-builds/"&gt;news on WebGL&lt;/a&gt; is seriously cool. This &lt;a href="http://www.raphkoster.com/2009/08/05/webgl-vs-o3d/"&gt;O3D vs. WebGL&lt;/a&gt; concept is also interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3839443608949454339?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3839443608949454339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/09/webgl-3d-graphics-in-firefox-and-webkit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3839443608949454339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3839443608949454339'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/09/webgl-3d-graphics-in-firefox-and-webkit.html' title='WebGL (3D graphics) in Firefox and WebKit'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6491213159536351388</id><published>2009-09-18T13:31:00.002-05:00</published><updated>2009-09-18T13:41:48.045-05:00</updated><title type='text'>Taming C++</title><content type='html'>For certain reasons, I've been coding C++ recently. While I'd learned C++ before, this is the most consistently I've dug at it for a while.&lt;br /&gt;&lt;br /&gt;Thing is, I don't like the std (STL) way of looking at things. I'm glad that C++ has a more standard library, and Boost tries to fit the same mold, but there's still a large diversity of style vs. the comparative uniformity in Java land or some other languages.&lt;br /&gt;&lt;br /&gt;So, I'm going to the pain of adapting C++ to my style, wrapping various external libraries. (Trying to keep dependencies to a minimum, though.) Sort of a domain-specific view of the world, as is so common for C and C++ coding.&lt;br /&gt;&lt;br /&gt;End result is that I've figured out how to make non-nullable opaque handle types with optional auto-disposal (simplified beyond auto_ptr) and whatnot. Some simple templates, too, but nothing crazy. Made a type similar to Scala's Option to get nullable when I want it.&lt;br /&gt;&lt;br /&gt;I also have the build incrementally making sublibraries to enforce dependency ordering.&lt;br /&gt;&lt;br /&gt;And Eclipse CDT is autocompleting and so on across most of the system quite nicely. Debugger's not working in Eclispe, though.&lt;br /&gt;&lt;br /&gt;The end result isn't perfect, but it's really not that painful at the moment. Lots of tasks not solved yet, though, like IO, character set conversion, networking, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6491213159536351388?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6491213159536351388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/09/taming-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6491213159536351388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6491213159536351388'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/09/taming-c.html' title='Taming C++'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5098593915291138280</id><published>2009-09-14T10:19:00.002-05:00</published><updated>2009-09-14T10:31:15.116-05:00</updated><title type='text'>Particle-Based Physics</title><content type='html'>I'm interested in rather detailed (and still high-speed) world simulation. I still don't know all what's out there to handle things for me. I have been learning Bullet Physics. What I'll want someday, and what I'm not sure Bullet provides is fluid simulation. I want air and water.&lt;br /&gt;&lt;br /&gt;Seems like the most straightforward way to do this is to simulate particles. Reminds me of smoothed particle hydrodynamics models that I worked with a bit at LANL many years ago. Seems like if you represent matter as particles, and those particles have properties to represent how they bond with each other based on proximity and whatnot, then you can get water and air resistance and so on.&lt;br /&gt;&lt;br /&gt;If bonds can be more or less rigid, and if you prebond some particles, you can make rigid bodies, too. 8 particles with strong, rigid bonds and zero radius could make a box. 2 particles with positive radii could make a capsule. Strong yet flexible bonds make soft bodies, like what Bullet provides. But if the bonds are still breakable (and don't easily reform), seems like you could simulate awesomeness like breaking objects into pieces or otherwise damaging them.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://legacy.wolfire.com/rotationconstraintpaper/paper.html"&gt;Sauerbraten's ragdoll physics system&lt;/a&gt; seems related, too.&lt;br /&gt;&lt;br /&gt;Oh, and of course there's also a relation to finite element analysis.&lt;br /&gt;&lt;br /&gt;The question is if you could optimize dynamic resolution and certain common cases such that the generalized system could still run at high speed. Seems like it could be super awesome if so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5098593915291138280?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5098593915291138280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/09/particle-based-physics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5098593915291138280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5098593915291138280'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/09/particle-based-physics.html' title='Particle-Based Physics'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5654155754161761074</id><published>2009-09-03T12:45:00.002-05:00</published><updated>2009-09-03T12:48:48.931-05:00</updated><title type='text'>Uncharted 2 Cinema Mode</title><content type='html'>This peek at &lt;a href="http://www.youtube.com/watch?v=CG5kwtsDXfE"&gt;Uncharted 2 machinima support&lt;/a&gt; looks pretty good. Much nicer than Spore GA in many ways, but it doesn't seem to have built-in, high-level scripting support. Probably lower-level mods could cover in some ways.&lt;br /&gt;&lt;br /&gt;I still think high-level machinima is much more the future of home animation than traditional tools like, say, Blender. I guess that's part of why the Blender Game Engine seems so important.&lt;br /&gt;&lt;br /&gt;Got to make it easy. Simulate and automate. That's more approachable and, in the end (probably sooner than later), likelier to be more realistic than than expecting people to do all that stuff manually.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5654155754161761074?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5654155754161761074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/09/uncharted-2-cinema-mode.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5654155754161761074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5654155754161761074'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/09/uncharted-2-cinema-mode.html' title='Uncharted 2 Cinema Mode'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-170208538233039192</id><published>2009-09-02T09:10:00.003-05:00</published><updated>2009-09-02T09:35:54.368-05:00</updated><title type='text'>Unit Tests in the Core Language for Improved Duckiness</title><content type='html'>I've thought some about how you could make a language that looks ducky (no types required) but still is semi-statically typed for speed, toolability, and so on. One option is the run-time tracing option used by Psyco, TraceMonkey, and so on. That is, see what types are needed as the program runs and JIT specialized code on the fly.&lt;br /&gt;&lt;br /&gt;Another alternative, really making things more static is to make unit tests an important part of compiling code. Sort of like how to need to give examples to C++ for template creation. It only knows what typed versions it needs to generate if you try to use those types.&lt;br /&gt;&lt;br /&gt;For example:&lt;pre&gt;&lt;br /&gt;def factorial(n, one) = {&lt;br /&gt;  var result = one&lt;br /&gt;  while (n &gt; one) {&lt;br /&gt;    result *= n&lt;br /&gt;    n -= one&lt;br /&gt;  }&lt;br /&gt;  result&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No types to be seen. Expected available operations ('&gt;', '*', '-'), yes. Side note, that need to specify the "one" above is annoying, but I don't want to think of anything more clever at the moment.&lt;br /&gt;&lt;br /&gt;Now, in my unit tests, I could say this:&lt;pre&gt;&lt;br /&gt;assertThat(1) == factorial(1, 1)&lt;br /&gt;assertThat(24) == factorial(4, 1)&lt;br /&gt;assertThat(6.0) == factorial(3.0, 1.0)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If the main compiler/builder is aware of the unit tests (which I should have anyway, right?), it is aware of which types are available for the function/class/whatever in question. So, 'factorial' clearly needs both integer and floating-point (or whatever) implementations. I'm being vague on the language specifics here. Also, the main code base could also be used for inference. The unit tests just have a chance to go beyond that.&lt;br /&gt;&lt;br /&gt;Such a system should even be able to determine which spots are co or contravariant. Not sure how many examples would be needed. I'm not even sure if this a good idea, but it's interesting to think about. Maybe some type placeholders, like templates in C++, would still be helpful.&lt;br /&gt;&lt;br /&gt;This technique wouldn't require unit tests to be embedded in the main code. I personally tend to like the current common technique of parallel dirs. Main code here, tests over there.&lt;br /&gt;&lt;br /&gt;Oh, and I also like screaming fast compilers. I'm afraid fanciness like this might slow things down just a tad ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-170208538233039192?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/170208538233039192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/09/unit-tests-in-core-language.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/170208538233039192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/170208538233039192'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/09/unit-tests-in-core-language.html' title='Unit Tests in the Core Language for Improved Duckiness'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8433064148516591275</id><published>2009-08-18T12:37:00.002-05:00</published><updated>2009-08-18T12:42:37.097-05:00</updated><title type='text'>Learning New without Losing Old</title><content type='html'>I have lots of opinions on how to do certain things (programming, robot AI, ...). In order to really ingest and learn new ideas, I often have to let go of my preconceptions, at least temporarily. If I dive deep into new ideas, they can wash out my prior perspective. And some of that perspective probably has some good value.&lt;br /&gt;&lt;br /&gt;So sometimes I try to correlate ideas. What's the big picture? How does what I know relate to what I'm learning? If I can figure out where they fit both fit on the big map, I can learn better and retain what's best from before.&lt;br /&gt;&lt;br /&gt;It's just easier to either (1) hang on to old ideas without allowing new ones in or (2) just give up and focus on the new. It takes effort to assemble grand unification theories on the fly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8433064148516591275?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8433064148516591275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/08/learning-new-without-losing-old.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8433064148516591275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8433064148516591275'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/08/learning-new-without-losing-old.html' title='Learning New without Losing Old'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-4693520936325918796</id><published>2009-08-03T15:53:00.002-05:00</published><updated>2009-08-03T16:05:02.954-05:00</updated><title type='text'>CMake rocks!</title><content type='html'>When I first ran across &lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt; being used, I thought "Oh no, another build system!" That means I need to install some lame software to build this thing.&lt;br /&gt;&lt;br /&gt;After seeing it used some more and reading about it and thinking about alternatives, I've changed my tune.&lt;br /&gt;&lt;br /&gt;If you need to build C or C++ (can't speak for other things), and you want to be cross platform (though I haven't tried cross-platform yet, it does seem promising), and you don't want too much pain, I currently recommend CMake. I haven't tried every alternative out there, which is why I don't give a stronger endorsement. But from what I've seen so far, CMake rocks.&lt;br /&gt;&lt;br /&gt;And it definitely beats writing Makefiles (and I'm scared of autoconf, too, for some reason).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-4693520936325918796?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/4693520936325918796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/08/cmake-rocks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4693520936325918796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4693520936325918796'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/08/cmake-rocks.html' title='CMake rocks!'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-4750716984954404603</id><published>2009-07-24T08:43:00.006-05:00</published><updated>2009-07-24T15:09:34.489-05:00</updated><title type='text'>Spore Galactic Adventures for Machinima?</title><content type='html'>My kids earned money to buy Spore after enjoying the free Creature Creator trial. I had though, "Wow, this could be great for &lt;a href="http://en.wikipedia.org/wiki/Machinima"&gt;machinima&lt;/a&gt; (making movies)!", but it wasn't really all there enough. And then my kids earned enough to buy Spore Galactic Adventures. After trying that out, I was really excited about the possibilities. But it's still not all there.&lt;br /&gt;&lt;br /&gt;Here's an example of something I could do:&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-153abd8f3eca1e34" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v8.nonxt6.googlevideo.com/videoplayback?id%3D153abd8f3eca1e34%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330022962%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D73878D808679B59832E6B9BB152D4132F6537C8F.5C24610A8A7EDDAA5081355747CBC8614C29ED26%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D153abd8f3eca1e34%26offsetms%3D5000%26itag%3Dw160%26sigh%3DLff618fyPAyarj90VRahBng-j0U&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v8.nonxt6.googlevideo.com/videoplayback?id%3D153abd8f3eca1e34%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330022962%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D73878D808679B59832E6B9BB152D4132F6537C8F.5C24610A8A7EDDAA5081355747CBC8614C29ED26%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D153abd8f3eca1e34%26offsetms%3D5000%26itag%3Dw160%26sigh%3DLff618fyPAyarj90VRahBng-j0U&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Talk about low res.&lt;br /&gt;&lt;br /&gt;And they don't have recording of dialog. And it stops recording automatically every couple of minutes or so and some features of interaction are lacking and ...&lt;br /&gt;&lt;br /&gt;You can't play the games themselves unless you own Spore Galactic Adventures either. So all I can really export is just the movies, which are lacking.&lt;br /&gt;&lt;br /&gt;Could someone please make a serious, general-purpose, high-quality video machinima engine, please? I'm interested in it myself, and I might take my research directions into that someday (as well as robotics and AI which I focus on more at this point). Cause I can say that Spore GA is &lt;em&gt;way&lt;/em&gt; higher level and easier to work with than Blender (even the Blender Game Engine). I personally don't mind lower quality for easier work. I'm not a full studio.&lt;br /&gt;&lt;br /&gt;Spore GA might still be good for storyboarding, though, even if it's still lacking for movie production.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-4750716984954404603?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=153abd8f3eca1e34&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/4750716984954404603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/07/spore-galactic-adventures-for-machinima.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4750716984954404603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/4750716984954404603'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/07/spore-galactic-adventures-for-machinima.html' title='Spore Galactic Adventures for Machinima?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-688843041875933384</id><published>2009-07-20T10:00:00.007-05:00</published><updated>2009-07-20T13:21:23.638-05:00</updated><title type='text'>Fan vs. Scala: Nullability (including quizzes!)</title><content type='html'>Scala's great, but I personally prefer another new statically-typed language for the JVM, called Fan. I think some others might, too. This blog post is my next in a series of &lt;a href="http://tomobag.blogspot.com/2009/06/why-choose-fan-over-scala.html"&gt;some reasons why I personally prefer Fan to Scala&lt;/a&gt;. Here was my next claimed advantage from my original post:&lt;br /&gt;&lt;br /&gt;5. Fan types are not-nullable by default, with the concept built into the core of the language, instead of being "Option"al.&lt;br /&gt;&lt;br /&gt;This particular subject is interesting. I've rarely seen ClassCastExceptions in practice, but I've seens plenty of NullPointerExceptions. Without good documentation (remember path of least resistance here), it's really hard to know whether a method expects to support null pointers or not. And in a method that has been around for months or years, it's hard to analyze whether all the callers (however far up the call chain) are passing in nulls or not. It's common to get null pointer exceptions in random places in your code all the time with enough developers and a large enough code base. And the solution to random breakage is ad hoc null checks and best-guess alternative behavior. That clutters up code and leaves expectations still unclear.&lt;br /&gt;&lt;br /&gt;So, my answer is that nulls are usually evil. Apparently, I'm not alone in this opinion. Tony Hoare, for example, called &lt;a href="http://qconlondon.com/london-2009/speaker/Tony+Hoare"&gt;null references his "billion dollar mistake" in ALGOL W&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My opinion of the right answer for Java is "don't use null if you can avoid it" and "document your methods as whether they support null" and "throw exceptions early if you get a null when you shouldn't". That takes a lot of manual effort in Java. And then there's the primitives not-nullable vs. objects nullable distinction, which is there mostly for convenience/performance. But it leaves the language more complicated than necessary.&lt;br /&gt;&lt;br /&gt;So, both Fan and Scala seem to feel nulls are bad, too. They both discourage them. Fan avoids them by making every type not-nullable by default:&lt;br /&gt;&lt;pre&gt;Str a := "hello"&lt;br /&gt;Str? b := "world"&lt;br /&gt;b = null // okay&lt;br /&gt;a = b // NullErr run-time error&lt;br /&gt;Str c := null // compile-time error&lt;/pre&gt;&lt;br /&gt;Lovely, lovely, in my opinion. The same type rules apply for method parameters. Yes, you should still document what your parameters mean, but your path of least resistance leaves you safe from nulls by default. And often, I think that's what coders mean, anyway. Usually, you get NullPointerExceptions because you just presume everything's not null, without even thinking about it. At least, that's how it often seems to me.&lt;br /&gt;&lt;br /&gt;Also in Fan, the types 'Bool', 'Float' (64-bit), and 'Int' (64-bit) can be nullable or not. When not nullable, they are called "value types" because they are stored expanded (using 'boolean', 'double', and 'int' primitives in the JVM, for example). Fan also supports autoboxing along these lines. Happily, the '==' operator will compare values for these types (and is one of the overloadable operators for your own types, though I don't recommend overloading except for 'const' types in most cases). Anyway, this strategy also allows for faster math in many cases vs. purely reference-based languages. There are still some improvements needed relative to making the value types blend more transparently into the rest of the type system, but they are in the queue. The final goal is to make it blend almost seamlessly into the rest of the null-vs.-not-null type system.&lt;br /&gt;&lt;br /&gt;Scala also recommends against null but in a very different way. They have very distinct reference vs. value types. All value types are predefined (I think) and mostly (but not entirely) correspond to the primitive types in Java. The reference types correspond to objects in Java. All reference types are nullable, but good style says don't use null. At least, when you don't need to interoperate with Java or whatnot. &lt;a href="http://www.scala-lang.org/docu/files/api/scala/Option.html"&gt;So, just keep in your head not to use null. Instead, you use 'Option'&lt;/a&gt; (usually, as there are other alternatives, too). My Fan examples above now look like this in Scala (if I'm not making any mistakes at the moment -- already fixed a few since my original post):&lt;br /&gt;&lt;pre&gt;var a: String = "hello"&lt;br /&gt;var b: Option[String] = Some("world")&lt;br /&gt;b = None&lt;br /&gt;a = b.get // NoSuchElementException run-time error&lt;br /&gt;var c: String = None // compile-time error&lt;/pre&gt;&lt;br /&gt;I'm ignoring 'getOrElse' at the moment (just as I ignored the elvis '?:' operator in Fan above), by the way. I'm just focusing on the basic rules. My opinions on handling nulls when you have them are beyond my current scope.&lt;br /&gt;&lt;br /&gt;So again, Fan has a (mostly) unified type system defaulting to not-null. Scala has a branched type system supporting value types on one side and and nullable references on the other, but don't use null. I think Fan's system is simpler, and I like that it pushes not-null into the strong position.&lt;br /&gt;&lt;br /&gt;Well, I could be done here, but I'm not.&lt;br /&gt;&lt;br /&gt;There's another word in Java that gives the same idea as the English word "null". That word is "void". If you know Java, you know what both keywords mean, but I think the relationship is interesting, and it brings up additional exploration for Fan vs. Scala, too. The value "null" is actually out there. It's a real thing that represents "no object". On the other hand, "void" really means "nothing". It doesn't exist. You can't assign it to anything. As a type, it is an empty set. I should also mention 'Void' in Java as the reflection-friendly type corresponding to the keyword 'void'.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Scala quiz time!&lt;/strong&gt; Instead of describing what they mean, I'll give a list of similar concepts in Scala and see if you can match them with the correct meaning. If you read above, you'll get some of these. And maybe you can guess the others. First the Scala list of terms (all related to null and void in Java):&lt;br /&gt;&lt;br /&gt;1. Null&lt;br /&gt;2. null&lt;br /&gt;3. Nothing&lt;br /&gt;4. Nil&lt;br /&gt;5. None&lt;br /&gt;6. Unit&lt;br /&gt;7. ()&lt;br /&gt;&lt;br /&gt;And here are the definitions to match them against (in a mixed order):&lt;br /&gt;&lt;br /&gt;A. The empty list.&lt;br /&gt;B. The empty set type, corresponding to the meaning of 'void' in Java. The subtype of all value and reference types in Scala. The type parameter used for the empty list.&lt;br /&gt;C. The single instance of type 'Unit'. I think it's purposely not supposed to mean anything.&lt;br /&gt;D. The single instance of type 'Null'. Corresponds to 'null' in Java, but don't use it that way.&lt;br /&gt;E. A subtype of all reference types in Scala whose only value is 'null'.&lt;br /&gt;F. The instance of type 'Option' that means the option was not chose to be 'Some' value. Use with 'Option' types instead of 'null' for direct reference use. Also a kind of empty list.&lt;br /&gt;G. A value type with only one (meaningless) member. Used in place of 'void', although it has a different meaning in my opinion.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Fan quiz time!&lt;/strong&gt; I'm leaving out empty lists here, although you can have those in Fan just like in Java. They just don't have names or meanings so intertwined with 'null' and 'void', so just like Java, I think they are less relevant in Fan. Anyway, here are the terms I think should be considered:&lt;br /&gt;&lt;br /&gt;1. null&lt;br /&gt;2. Void&lt;br /&gt;3. Void?&lt;br /&gt;&lt;br /&gt;And here are the definitions to consider:&lt;br /&gt;&lt;br /&gt;A. A type that corresponds quite closely to 'void' in Java. An empty set with no members, and only used for return types from functions.&lt;br /&gt;B. A type with just the 'null' reference as a member. Somewhat related to the 'Unit' type in Scala, but I'm not sure it has any practical use. I think I'm glad it's there (just for consistency), and maybe it has some use I haven't figured out yet.&lt;br /&gt;C. Corresponds to 'null' in Java. Assignable to vars of any nullable type.&lt;br /&gt;&lt;br /&gt;Anyway, I hope this post was sufficiently readable. I think it's an important subject, and I personally like the solution that I think is simpler, more orthogonal, and less null-friendly. (And that particular personal preference is presumably easy to guess at this point.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-688843041875933384?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/688843041875933384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/07/fan-vs-scala-nullability-including.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/688843041875933384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/688843041875933384'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/07/fan-vs-scala-nullability-including.html' title='Fan vs. Scala: Nullability (including quizzes!)'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-778667764164992458</id><published>2009-07-08T11:22:00.004-05:00</published><updated>2009-07-17T09:37:44.195-05:00</updated><title type='text'>Prioritized Reduction Engine</title><content type='html'>I've been using MATLAB a lot in the past year. Many pros and cons with it, but it has definitely had me thinking from a batch update perspective. Saying 'a + b' can be really fast if 'a' and 'b' are both huge matrices. Despite some JIT support, MATLAB is generally quite slow if you want to write your own loops. While I still haven't done any explicit GPGPU programming, I have to imagine that the MATLAB batch/parallel operation mentality would map nicely to GPGPU thinking. I'm fairly excited about the whole OpenCL thing coming up. I like small computers rather than supercomputers, but I don't mind making more efficient use of them.&lt;br /&gt;&lt;br /&gt;Anyway, while I've sort of gotten into the groove, I'm actually interested in a much fancier form of parallel computing. See &lt;a href="http://tomobag.blogspot.com/2008/11/more-research-bullet-points.html"&gt;my second bullet point here (on bubbling up)&lt;/a&gt;. This has some relationships to the whole MapReduce concept, too, but I tend to imagine it fancier than that. The scheduler (or metathinker) becomes much more sophisticated, so it can handle the most important things first.&lt;br /&gt;&lt;br /&gt;For example, I might want to add the elements in matrix 'a' and 'b', but maybe I care more about some of the results than others. And maybe I want to use those results in a later operation, say '(a + b) * c'. And I might have different tasks going on at the same time with dynamically adjustable priorities. And there might be different ways of getting to the same answer. A map might tell me where to go when I'm driving, but if I'm close enough, maybe I can look out and see where I need to go. Whatever data is available should also drive the later steps.&lt;br /&gt;&lt;br /&gt;So we need a way to assess the value of single components of the operation and a way to execute the most important parts at all levels in parallel, such that the most important operations are getting done first. I haven't worked out all the details, but I know what I want it to look like. For example, I should be able to say '(a + b) * c' or much fancier programs and &lt;strong&gt;have it all just work&lt;/strong&gt; prioritized and parallel in batch form. The priorities would have to be registered somehow, too, but perhaps separately from the algorithm chaining.&lt;br /&gt;&lt;br /&gt;The ability to label intermediate computations for reuse at various steps could also be nice.&lt;br /&gt;&lt;br /&gt;I think this concept isn't far off from the &lt;a href="http://msdn.microsoft.com/en-us/library/dd460693(VS.100).aspx"&gt;parallel&lt;/a&gt; and &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/concurrency/overview.html"&gt;concurrency&lt;/a&gt; frameworks being built today. It's also not far off from current autoparallelization features today in systems like MATLAB and &lt;a href="http://projectfortress.sun.com/Projects/Community"&gt;Fortress&lt;/a&gt;, but none of these have the same level of sophistication in dynamical scheduling that I want to see.&lt;br /&gt;&lt;br /&gt;My current name for such a system is a "prioritized reduction engine". This is somewhere in between algorithms (iterative/online algorithms specifically) and parallel computing. Maybe I can find things in the literature about it. Sometimes it's hard to know the right words to use when searching.&lt;br /&gt;&lt;br /&gt;Side thought I had while writing this: I wonder if there's ever any chance of getting GPGPU-powered math engines into web browsers. I guess I can dream.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-778667764164992458?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/778667764164992458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/07/prioritized-reduction-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/778667764164992458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/778667764164992458'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/07/prioritized-reduction-engine.html' title='Prioritized Reduction Engine'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6326147571218031302</id><published>2009-07-07T12:25:00.005-05:00</published><updated>2009-07-07T13:31:32.797-05:00</updated><title type='text'>Fan vs. Scala: Operators</title><content type='html'>Scala is a great, statically-typed language for the JVM with many advantages over Java. Some expect it to be "the next Java". It definitely has some momentum. However, I personally prefer another new statically-typed language for the JVM, called Fan. I think some others might, too. This blog post is my next in a series of &lt;a href="http://tomobag.blogspot.com/2009/06/why-choose-fan-over-scala.html"&gt;some reasons why I personally prefer Fan to Scala&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here was my next claimed advantage from my original post:&lt;br /&gt;&lt;br /&gt;4. In Fan, you can't invent your own &lt;**==!!! operator. (I haven't double-checked this particular one in Scala, but I've seen some doozies.)&lt;br /&gt;&lt;br /&gt;Personally, I like operator overloading, because I'd rather say 'a * (b + c) - d' than 'a.multiply(b.add(c)).subtract(d)'. The former is more readable to me, and apparently someone felt that way in Java since they gave operators for basic numeric types in the first place. Well, it also helps to provide the separate worlds of primitives and objects that pervades Java.&lt;br /&gt;&lt;br /&gt;However, in C++, people used operator overloading for the purposes of evil. That is, people sometimes have used say '+' to mean things very different from addition. That might have been encouraged by the C++ standard library immediately hoisting the bit shift operators (such as '&gt;&gt;') to provide IO services. Still, I don't see the evidence of widespread abuse even in C++, let alone other languages with operator overloading support. But I get the concern.&lt;br /&gt;&lt;br /&gt;Scala is different from C++ in that you can invent your own operators. (I think Haskell might be the same and maybe other languages, too.) Then there's no need to abuse '+' when you can invent '+:+' instead (or whatever). For that matter, you can use normal methods as if they were operators. For example, instead of saying 'a.add(b)', you can say 'a add b'. My concern with Scala is the easy invention of creative operators. I have less concern about the use of named methods as operators.&lt;br /&gt;&lt;br /&gt;My concern with invented operators is that I can't pronounce them, and I don't know what they mean. If I can read method names, I can guess what they mean. If I see a new operator, I have no idea. I also have trouble remembering lots of things, if I can't pronounce them. (Side note, IDEs may become vital in this matter for Scala.) I'll dodge the English-vs.-other-languages question at the moment, but feel free to weigh in on that, if you want.&lt;br /&gt;&lt;br /&gt;Also, just like C++ immediately encouraged changing the semantics of operators (i.e., with "&gt;&gt;"), Scala has encouraged the use of fancy operators. Here's a list of operators extracted from the Scala standard library (based on &lt;a href="http://jim-mcbeath.blogspot.com/2008/12/scala-operator-cheat-sheet.html"&gt;this list&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;^ ^^ ^^^ ^?  ~ ~&gt; ~!  &amp;lt; &amp;lt;~ &amp;lt; &amp;lt;= == &gt; &gt;= &gt;&gt; &gt;&gt;&gt; | || ||| - -= -&gt; -- --= :: ::: :/: :\ !  != !!  !?  ?  / /: /% * ** \ \\ &amp;amp; &amp;amp;~ &amp;amp;&amp;amp; &amp;amp;&amp;amp;&amp;amp; &amp;amp;+ % + += +: ++ ++= ++: unary_~ unary_- unary_!  unary_+&lt;br /&gt;&lt;br /&gt;Off the top of my head, I can't guess at all what ':/:' should mean. Nor '^^^'. Nor some others. Combining this with implicit type conversion can make it so tracking down the source of an operator could also be tricky. So, I hope context usually makes things clear. And then there's that IDEs to the rescue again. IDEs are a fact of life these days, though, and once Scala IDEs get good enough, that might mitigate this concern to a large degree. Hard to say for every use case. By the way, an operator ending in ':' in Scala is right-associative. Meaning that 'a :: b' means 'b.::(a)' rather than 'a.::(b)'. I know some of why they did that, but it's definitely another issue to be aware of.&lt;br /&gt;&lt;br /&gt;Here are &lt;a href="http://dev.day.com/microsling/content/blogs/main/scalajcr4.html"&gt;some other discussions&lt;/a&gt; that show &lt;a href="http://tomobag.blogspot.com/2009/06/fan-vs-scala-type-system.html#c1055062936741015719"&gt;attempts at making&lt;/a&gt; up &lt;a href="http://www.codecommit.com/blog/scala/implementing-groovys-elvis-operator-in-scala"&gt;interesting operators in Scala&lt;/a&gt;. Might be some good and some bad in there, but overall it seems like excessive complexity to me. And in my opinion, hats off to Bill (in one of the links above) for choosing a clear name for his method.&lt;br /&gt;&lt;br /&gt;Anyway, Fan lets you use operators (since like Scala and many other languages, it tries to avoid excessive primitive vs. object distinctions), but they are effectively shorthand for method names. This technique is also used in Groovy, MATLAB, Python, and presumably other languages. I like it because it reminds you what that operator should do. &lt;a href="http://"&gt;Here are the operators and rules for operator overloading in Fan.&lt;/a&gt; So, really, saying 'a * (b + c) - d' in Fan is exactly the same thing as saying 'a.mult(b.plus(c)).minus(d)'. Personally, I like that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6326147571218031302?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6326147571218031302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/07/fan-vs-scala-operators.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6326147571218031302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6326147571218031302'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/07/fan-vs-scala-operators.html' title='Fan vs. Scala: Operators'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8085093949306649404</id><published>2009-07-06T22:09:00.001-05:00</published><updated>2009-07-06T22:09:37.013-05:00</updated><title type='text'>.NET core spec more openly licensed than Java?</title><content type='html'>For the legally minded folks, how does &lt;a href="http://tirania.org/blog/archive/2009/Jul-06.html"&gt;this news from Microsoft&lt;/a&gt; compare to the &lt;a href="http://www.jroller.com/scolebourne/entry/no_more_java_7"&gt;licensing trouble between Sun/Oracle and Apache&lt;/a&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8085093949306649404?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8085093949306649404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/07/net-core-spec-more-openly-licensed-than.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8085093949306649404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8085093949306649404'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/07/net-core-spec-more-openly-licensed-than.html' title='.NET core spec more openly licensed than Java?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5021123869532880056</id><published>2009-07-03T11:50:00.002-05:00</published><updated>2009-07-03T11:56:12.224-05:00</updated><title type='text'>Formalized Path of Least Resistance</title><content type='html'>Just a quick note to myself (or others). I've more than once talked about how programming languages should be convenient but that the path of least resistance should encourage good programming. For example, Java's checked exceptions cause the path of least resistance to end up hiding error conditions and details. I don't like Java's checked exceptions.&lt;br /&gt;&lt;br /&gt;It just occurred to me (though it's likely been done before by others) that you could formalize the path of least resistance when programming by approximating the gradient descent across some kind of vastly multidimensional space. By observing conditions when programming (maybe only visible in the programs produced, perhaps across time for openly accessible version control), you might be able to define a statistical distribution of cost functions used by programmers when making decisions. Hard to factor in things like deadlines, interpersonal concerns, life circumstances, and so on, but maybe some vague approximate model could be made.&lt;br /&gt;&lt;br /&gt;Summary, hopefully in English, is that some folks like formalisms. Otherwise, they don't believe you at all. It might be possible to make a formalism to study the usability of programming languages for writing good software. Not 100% sure, though. Too many assumptions might be needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5021123869532880056?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5021123869532880056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/07/formalized-path-of-least-resistance.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5021123869532880056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5021123869532880056'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/07/formalized-path-of-least-resistance.html' title='Formalized Path of Least Resistance'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-7541244825670768348</id><published>2009-07-03T08:26:00.006-05:00</published><updated>2009-07-03T10:19:16.077-05:00</updated><title type='text'>Fan vs. Scala: Globals and Variables</title><content type='html'>This is the next installment in my series hoping to elucidate my own preferences for Fan after &lt;a href="http://tomobag.blogspot.com/2009/06/fan-vs-scala-my-background.html"&gt;having been a fan of Scala&lt;/a&gt;. I realize that the same thing isn't for everyone. If Scala works for you, great, and feel free to comment and/or correct any of my mistakes. For today, I'm now moving on to global variables. Here was my claim from &lt;a href="http://tomobag.blogspot.com/2009/06/why-choose-fan-over-scala.html"&gt;my original post&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;3. Fan doesn't encourage or even support global variables. It has an almost Erlang level of attention to concurrency. (Hopefully, people don't abuse 'object' in Scala for global vars, but I fear it's an easy trap, at least for newbies.)&lt;br /&gt;&lt;br /&gt;This was perhaps one of my most unfair comparisons, but I still think there are interesting points to be made here.&lt;br /&gt;&lt;br /&gt;One of the first questions is, what globals? When I speak of globals, I speak of globally accessible objects. Being in a namespace doesn't make something less global, for my present concerns. Such globals include types, packages/pods, and static functions/methods and variables/constants. Anything not "injected" (passed in from outside) is a global, really.&lt;br /&gt;&lt;br /&gt;Here's where Scala takes an interest variation from most common languages. There are no "statics" in Scala. That's actually a nice simplification in ways. Instead of static members, you define &lt;a href="http://hestia.typepad.com/flatlander/2009/01/scala-for-c-programmers-part-2-singletons.html"&gt;singleton objects&lt;/a&gt;, like so (Scala here):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;object OneAndOnly {&lt;br /&gt;  val favoriteNumber = 3&lt;br /&gt;  def favoriteDoubled() = 2 * favoriteNumber&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then you have an object accessible as 'OneAndOnly' (in whatever package), and you access its members sort of like you'd access statics in Java (or C++ or C# or Fan or such languages). See perhaps &lt;a href="http://www.artima.com/scalazine/articles/steps.html"&gt;a more authoritative discussion in section 11 of this article&lt;/a&gt;. Singletons are also how you make applications in Scala:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;object HelloWorld {&lt;br /&gt;  def main(args: Array[String]) {&lt;br /&gt;    println("Hello, world!")&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here's my main complaint: I'm a big dependency injection fan, with or without a framework to do it for me. I think singletons are teh evil. I don't want them to be easier to do. I'd sort of like to see a language without static access to type names and such like, though at some point it gets in the way of convenience, and sneaky tricks behind the scenes (classloader tricks and bytecode manipulation in Java, perhaps) can still inject behavior. Lots of pros and cons floating around here. But in any case, I'll at least stick to not encouraging singletons. I'm sure you could make (constant) singleton objects in Fan the old-fashioned way, but I don't recommend it.&lt;br /&gt;&lt;br /&gt;Here's hello world in Fan, by the way:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class HelloWorld {&lt;br /&gt;  Void main() {&lt;br /&gt;    echo("Hello, world!")&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I could have made 'main' static or allowed for args or whatnot, but Fan also allows simple modes like this where it instantiates a (non-singleton) HelloWorld object for you.&lt;br /&gt;&lt;br /&gt;Anyway, where I was unfair in my original point for Fan vs. Scala was saying that Scala encourages global &lt;em&gt;variables&lt;/em&gt;. It's not true. Scala encourages singletons, and you can have variables in those singletons, but every tutorial in Scala encourages the use of 'val' (think 'final' in Java) and 'def' (making methods) over 'var' (non-final vars or in other words, actual variables). While it's just as easy to say 'var', everyone will encourage you not to do so. Furthermore, they have lots of immutable types in the Scala standard library. That said, it might be easy to fall into the trap of using mutable vals or even just vars in your singletons. Especially if you aren't versed in the art of functional programming.&lt;br /&gt;&lt;br /&gt;Fan, on the other hand, &lt;em&gt;doesn't let you make global variables&lt;/em&gt;. And I'm talking your static members have to be 'const' not just 'final'. Further, closures are tracked dynamically for whether they reference non-const items, and you can't start a thread with access to mutable state from outside (Fan here, skipping into the middle of a method for convenience):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;pool := ActorPool()&lt;br /&gt;nums := [1, 2, 3]&lt;br /&gt;a := Actor(pool) |Obj msg| {&lt;br /&gt;  echo("$Time.now: $msg")&lt;br /&gt;  nums[0]++ // &lt;-- Error to reference non-const locals outside this block.&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This nicely skirts the issues with 'final' or not for &lt;a href="http://www.javac.info/closures-v05.html"&gt;Java closures&lt;/a&gt;. (See more on &lt;a href="http://fandev.org/doc/docLang/Actors.html"&gt;Fan threading here&lt;/a&gt;, where I modified the above sample from.) And if I remember right in Fan (not double-checked right now), this is figured out at runtime. That is, some &lt;a href="http://fandev.org/doc/docLang/Classes.html#const"&gt;'const classes'&lt;/a&gt; are known to be have const instances at compile time. But some types (such as List and Map) might have const instances or not. So a runtime check can tell whether a closure is const or not, too.&lt;br /&gt;&lt;br /&gt;It might be possible these days to pass around non-const messages between actors in Fan. I'm not sure, but the idea would be that only one actor should own a mutable object at a time. I don't recall the details. Someone who's more expert on this should feel free to chime in.&lt;br /&gt;&lt;br /&gt;In any case, while Scala pushed immutable, it doesn't hold you to it the same way that Fan does. And sometimes code development just flows in the path of least resistance. That least resistance should keep your code clean, in my opinion, and I think Fan is stronger here.&lt;br /&gt;&lt;br /&gt;That said, Fan best practices do &lt;em&gt;not&lt;/em&gt; emphasize final locals the same way that Scala does. Least resistance in Fan has all kinds of non-final mutability in your local scope (Fan here):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;evenCount := 0 // Hey, look! I'm not final!&lt;br /&gt;[1, 2, 3].each {&lt;br /&gt;  if (it % 2 == 0) {&lt;br /&gt;    evenCount++ // Okay since Fan knows you are using this in the same thread.&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Personally, I like the mixture of mutable local state but const globals and cross-thread data. Apparently some other folks like the same style. See, for example, &lt;a href="http://wiki.reia-lang.org/wiki/FAQ#How_can_you_write_reliable_concurrent_programs_in_an_imperative_language.3F"&gt;this discussion of the Reia programming language that allows non-final vars while compiling to Erlang's BEAM virtual machine&lt;/a&gt;. Good stuff, in my opinion, though I can't claim to be the super expert here. Just speaking from my own experience and understanding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-7541244825670768348?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/7541244825670768348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/07/fan-vs-scala-globals.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7541244825670768348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7541244825670768348'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/07/fan-vs-scala-globals.html' title='Fan vs. Scala: Globals and Variables'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3346508703528498869</id><published>2009-06-30T21:46:00.005-05:00</published><updated>2009-07-01T09:09:16.451-05:00</updated><title type='text'>Firefox 3.5 and Ogg</title><content type='html'>Just wanted to say thanks to the Mozilla folks for having the guts to put Ogg in the browser. I know it won't have a deep impact overnight, but I think it might have deep long-term impacts.&lt;br /&gt;&lt;br /&gt;Project idea for the willing and able: Make the video tag work cross browser. Swap via JS to Flash (or Silverlight or Quicktime or Java or ...) if video's not supported, automatically picking a different source. And make the paired sources easier to prepare on the server.&lt;br /&gt;&lt;br /&gt;I guess the down side is that no one distributes video themselves, due to the large size, but maybe such a project would encourage the Vimeos, Hulus, and YouTubes of the world to consider support for open video. The goal in this case would be to make it easy for them to swap to Ogg (or whatever) video when Flash is unavailable.&lt;br /&gt;&lt;br /&gt;Bonus points to Firefox if they ever get Canvas 3D in there. Even better to have an additional integrated mode for content inside and out of a 3D scene graph. (I suppose shouldn't get my hopes too high for Bullet physics ...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3346508703528498869?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3346508703528498869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/06/firefox-35-and-ogg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3346508703528498869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3346508703528498869'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/06/firefox-35-and-ogg.html' title='Firefox 3.5 and Ogg'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2770374559744429189</id><published>2009-06-25T22:10:00.003-05:00</published><updated>2009-06-25T22:55:19.968-05:00</updated><title type='text'>Fan vs. Scala: Type System</title><content type='html'>It's been a while, but here's my next installment of detailed discussion of &lt;a href="http://tomobag.blogspot.com/2009/06/why-choose-fan-over-scala.html"&gt;my personal reasons for preferring Fan to Scala&lt;/a&gt;. Here is my next claimed advantage:&lt;br /&gt;&lt;br /&gt;2. In Fan, you don't have to figure out existential types or other complex typing. Fan will even do your casting for you in many cases.&lt;br /&gt;&lt;br /&gt;There's a huge debate about dynamic vs. static typing. I like static typing (because of easier toolability, performance, and hints for the programmer but yes I know there are pros and cons). I &lt;em&gt;don't&lt;/em&gt; like typing to get in my way. That means I only want to say as much as I want to say. That is, infer where possible, and sometimes I just don't care what's co or contravariant. (Oh, the blasphemy!) I also don't want the type system to tie me in knots. Sometimes static enforcement blocks me from doing something correct the way I want to do it, even if other times it catches my mistakes.&lt;br /&gt;&lt;br /&gt;Both Fan and Scala (and C# and others) do limited type inference. Usually, you have to specify types for public methods and such. Sure, they could be inferred in some cases. Some languages do that, but I like it to be explicit. The exact limits of type inference differ among these languages, but most of the focus is on local vars. For example (in Fan):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;greeting := "hello"&lt;br /&gt;size := greeting.size&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In Fan, ':=' is used for var initialization as opposed to the 'var' keyword in Scala or C#. You even use it when specifying an explicit type for the var, just for consistency. I like either style better than the "guess where the var is defined" behavior you get in Python or Ruby. (Actually, Python has fairly simple rules, but they can get annoying sometimes. I've heard Ruby is cleaning up their ambiguity in this arena, too.)&lt;br /&gt;&lt;br /&gt;But, anyway, my discussion had more to do with this list of features from Scala.&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://www.scala-lang.org/node/105"&gt;Abstract Types&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://www.drmaciver.com/2008/01/minor-revelation-about-scala-existential-types/"&gt;Existential Types&lt;/a&gt; (officially not recommended except for interoperability with Java, is my understanding)&lt;br /&gt;3. &lt;a href="http://www.scala-lang.org/node/113"&gt;Generics&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://www.scala-lang.org/node/136"&gt;Type&lt;/a&gt; &lt;a href="http://www.scala-lang.org/node/137"&gt;Bounds&lt;/a&gt;&lt;br /&gt;5. &lt;a href="http://www.scala-lang.org/node/129"&gt;Variances&lt;/a&gt;&lt;br /&gt;6. &lt;a href="http://www.scala-lang.org/node/130"&gt;Views&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And probably things I'm forgetting. Yes, the type system is serious in Scala. They want to you get it right. Personally, I see the need for awesome static typing in a language like OCaml that has no dynamic type safety (no casting exceptions) but still wants to be type safe and avoid security risks.&lt;br /&gt;&lt;br /&gt;But in a language with dynamic type safety (like Java or ducky languages like Python, JavaScript, or Ruby), how often do you really see casting exceptions? If I make a mistake, it will be found (rather than opening security holes), and I don't usually make mistakes.&lt;br /&gt;&lt;br /&gt;So, to make life easy, Fan will do your casting (up or down a hierarchy) automatically. For example (in Fan):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Obj[] items := ["something", "and", "more"]&lt;br /&gt;Str message := items[0]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In Java, you'd have to make that second cast explicit, being a down cast. Welcome to "I don't need generics to have my casting done for me" land.&lt;br /&gt;&lt;br /&gt;And while I know that Scala folks will be all over me about this feature of Fan, think first about &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=179766"&gt;Scala's automatic type conversion&lt;/a&gt;. Fan only casts for you (yay! in my book). Scala, for all its type safety will magically convert integers into strings, if you set up the right magic. I'm personally really scared of automatic variable swapping going on behind my back. It's also something I dislike about C#.&lt;br /&gt;&lt;br /&gt;One thing that I don't like about Fan is its lack of generics (except for Lists, Maps, and Funcs). Yep, I like generics (despite my list above on Scala). I just want autocasting and arbitrary support for co and contravariance. I'm a hippie that way. I think Scala's generics go too far. So really, I'd prefer some land in between Scala and Fan on the generics front. But between the two, I'll take Fan.&lt;br /&gt;&lt;br /&gt;Side note, Fan also supports dynamic duck typing. If you say, "myVar-&gt;something", that does a dynamic lookup rather than the static form "myVar.something". Note that this is different from duck typing support in languages such as C#, Boo, and haXe, where method calls look the same, but the variable type is declared to be dynamic. The two styles have different effects on your code. Scala shuns dynamic typing in favor of static structural typing. I'm not sure either take is fully necessary, but between the two (duck typing vs. structural), I'd prefer structural. I just don't want the rest of Scala typing with it. Sorry for being too quick to find good links, but Google can probably help out.&lt;br /&gt;&lt;br /&gt;I'll give at least one link, though, to the &lt;a href="http://fandev.org/doc/docLang/TypeSystem.html"&gt;official description of Fan's system&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2770374559744429189?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2770374559744429189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/06/fan-vs-scala-type-system.html#comment-form' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2770374559744429189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2770374559744429189'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/06/fan-vs-scala-type-system.html' title='Fan vs. Scala: Type System'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-7158026424271969732</id><published>2009-06-15T09:55:00.002-05:00</published><updated>2009-06-15T10:20:38.949-05:00</updated><title type='text'>Fan vs. Scala: Target Platforms</title><content type='html'>This is a post in a series on some reasons why I prefer Fan to Scala. I don't hate Scala, and I don't mind if you use it. Still, I'm being biased here. And I don't speak authoritatively. I'm just some guy. The creators of Fan (Brian Frank and Andy Frank) are much smarter and nicer than I am. That's why they're wise enough not to do a series of blog posts like this.&lt;br /&gt;&lt;br /&gt;So, back to my foolishness, in &lt;a href="http://tomobag.blogspot.com/2009/06/why-choose-fan-over-scala.html"&gt;my original post&lt;/a&gt;, I claimed this as an advantage for Fan:&lt;br /&gt;&lt;blockquote&gt;1. Fan has a core goal to support Java, .NET, and JavaScript platforms.&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://www.scala-lang.org/node/25#ScalainteroperateswithJavaandNET"&gt;Scala has great support for Java, and it claims support for .NET, too.&lt;/a&gt; I've never used Scala nor Fan on .NET nor Mono, so I can't say which handles the platform better. So I'll just pretend they are equal on this subject (lacking time to gather evidence either way).&lt;br /&gt;&lt;br /&gt;Still, I think JavaScript is just important a platform as either Java or .NET. &lt;a href="http://www.scala-lang.org/node/1910/results"&gt;I don't see any reference to JavaScript on the recent poll at scala-lang.org.&lt;/a&gt; I have seen references to past efforts, and it seems &lt;a href="http://www.scala-lang.org/node/2132"&gt;David Pollak of Lift fame is working on some kind of Scala to JS compiler&lt;/a&gt;. (&lt;a href="https://twitter.com/dpp/status/2078221337"&gt;Another reference here.&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;On the other hand, here's an example of &lt;a href="http://fandev.org/sidewalk/topic/640"&gt;upcoming Fan JavaScript support&lt;/a&gt;. And they list JavaScript as a core focus on their home page. I find that important.&lt;br /&gt;&lt;br /&gt;Side note, obviously GWT is more mature than either of these efforts, and &lt;a href="http://haxe.org/doc/intro"&gt;for serious cross-platform support (though without Java or .NET so far), see haXe&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-7158026424271969732?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/7158026424271969732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/06/fan-vs-scala-target-platforms.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7158026424271969732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7158026424271969732'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/06/fan-vs-scala-target-platforms.html' title='Fan vs. Scala: Target Platforms'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2234059175402602700</id><published>2009-06-12T09:19:00.005-05:00</published><updated>2009-06-12T09:45:22.910-05:00</updated><title type='text'>Fan vs. Scala: My background</title><content type='html'>Well, my previous post on &lt;a href="http://tomobag.blogspot.com/2009/06/why-choose-fan-over-scala.html"&gt;why I prefer Fan to Scala&lt;/a&gt; got some attention. It also got &lt;a href="http://www.dzone.com/links/why_choose_fan_over_scala.html"&gt;a few votes up and down at DZone&lt;/a&gt;. Also, I'm afraid I wasn't sufficiently clear in my post. I too rarely am. In any case, it seemed like it might be worth extending my discussion of the points I listed.&lt;br /&gt;&lt;br /&gt;I ought to give some personal history first, though. I love Eclipse and what other such modern IDEs do for Java. I can navigate and fairly well tame code bases made of 1000s of files. I also love that Java performance is sometimes near C, except that I can just download and run jars. Getting stinking complex open-source C or C++ code to build correctly can really make me mad. (The download and run mentality of Windows or Mac really beats Linux in this respect, too, though maybe if Ubuntu becomes more ubiquitous, people can just target that and make life easier. Official packages are always so far behind for the few apps and libs that I really want fresh.) But back to Java, I really don't like it as a language. Checked exceptions, needing to repeat oneself, lack of closures, and so on really don't make my day. And I like to learn other languages, new and old.&lt;br /&gt;&lt;br /&gt;I occasionally noticed Scala over the past few years. It seemed very promising. When I saw it starting to get attention a couple of years ago, I figured I'd learn it more and help be part of the momentum to see if it could overturn Java. Among other things, I submitted &lt;a href="http://tomobag.blogspot.com/2008/01/scala-pong-4k-source-code-now.html"&gt;a game to the Java 4K game competition (jar size, not source size!) written in Scala&lt;/a&gt;. Scala doesn't shrink as nicely as Java, but I got it mostly working and in the right size. And I kept learning the language. I gave a brown bag presentation at my job on Scala about a year ago.&lt;br /&gt;&lt;br /&gt;And just about the same day as my brown bag presentation, I saw posts from Cedric Beust and Stephen Colebourne about this other new language, Fan. I got to the site, looked around it, and I immediately switched my interests. I thought, hey, this is even closer to my own preferences, and it doesn't smell like you need a PhD to understand it (despite the fact that I'm now working on getting a PhD). I don't prefer every decision that had or has been made, but it's just so much closer to what I want than anything else out there with any momentum. It's statically typed with important limitations to structure programs, but it still has the feel of a scripting language. Scala might be convenient (usually), but it doesn't have that same relaxed air. And it doesn't even make some of the same guarantees you get from Fan.&lt;br /&gt;&lt;br /&gt;So history aside, I'll try to delve deeper into my list of good things about Fan in the near future. And I'll keep the "vs. Scala" perspective, as well as "vs. Java" and maybe a few others. Nothing personal against Scala. If it's good for you, then good for you. I'm just afraid that for many folks looking at Scala, Fan is a better choice, but it's not high enough up the radar yet. Or the differences might not be clear enough. That's why I'm giving this focus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2234059175402602700?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2234059175402602700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/06/fan-vs-scala-my-background.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2234059175402602700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2234059175402602700'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/06/fan-vs-scala-my-background.html' title='Fan vs. Scala: My background'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3866755980438961994</id><published>2009-06-10T09:19:00.009-05:00</published><updated>2009-06-11T15:22:36.835-05:00</updated><title type='text'>Why choose Fan over Scala?</title><content type='html'>So, if &lt;a href="http://scala-lang.org/"&gt;Scala&lt;/a&gt; is the top contender for the "new Java", and it's a convenient yet statically-typed language, why bother to consider &lt;a href="http://fandev.org/"&gt;Fan&lt;/a&gt;? Both target the JVM, both have static typing, type inference, closures, and so on. Well, I personally think Fan is a better choice for me.&lt;br /&gt;&lt;br /&gt;Here are some of my own top reasons to choose Fan:&lt;br /&gt;&lt;br /&gt;1. Fan has a core goal to support Java, .NET, and JavaScript platforms.&lt;br /&gt;2. In Fan, you don't have to figure out existential types or other complex typing. Fan will even do your casting for you in many cases.&lt;br /&gt;3. Fan doesn't encourage or even support global variables. It has an almost Erlang level of attention to concurrency. (Hopefully, people don't abuse 'object' in Scala for global vars, but I fear it's an easy trap, at least for newbies.)&lt;br /&gt;4. In Fan, you can't invent your own &lt;**==!!! operator. (I haven't double-checked this particular one in Scala, but I've seen some doozies.)&lt;br /&gt;5. Fan types are not-nullable by default, with the concept built into the core of the language, instead of being "Option"al.&lt;br /&gt;6. The Fan core library is simple and straightforward. It has functional features but doesn't try to shove complexity down your throat.&lt;br /&gt;7. In Fan, building and modifying nested objects is straightforward.&lt;br /&gt;8. Fan package (or rather pod) namespacing is simple.&lt;br /&gt;9. For Fan, I only have to follow &lt;a href="http://fandev.org/sidewalk/topic/"&gt;one group on a single lovely site&lt;/a&gt; to keep up with the core language happenings.&lt;br /&gt;10. In Fan, all the Ints and Floats are 64-bit. So you don't have to worry about choosing something smaller. And chars are just Ints (using 32-bit code points which fit easily and without worrying about sign bits in that 64-bit space). Breath easy. Oh, and you do still have easy (Big)Decimal support, too, so don't worry about that.&lt;br /&gt;&lt;br /&gt;I'm going to be biased and omit my reasons for &lt;em&gt;not&lt;/em&gt; choosing Fan, except one. They haven't yet hit 1.0. (Don't let the version numbering scheme fool you.) There are still some backwards-incompatible changes to be made. But the goal is to stabilize things soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3866755980438961994?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3866755980438961994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/06/why-choose-fan-over-scala.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3866755980438961994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3866755980438961994'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/06/why-choose-fan-over-scala.html' title='Why choose Fan over Scala?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-7686532404674094634</id><published>2009-06-09T08:52:00.003-05:00</published><updated>2009-06-09T09:12:16.044-05:00</updated><title type='text'>Java, .NET, and ECMAScript Regex Compatibility - Expert advice wanted!</title><content type='html'>I'm trying to figure out the compatibility of regexes for &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html"&gt;Java&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/az24scfc.aspx"&gt;.NET&lt;/a&gt;, and &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"&gt;ECMAScript&lt;/a&gt;. I did a quick skim, but I don't really have the experience to know what practical implications exist. So I'm going fishing here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;At first glance, it seems that ECMAScript 3 regexes are a subset of those for Java or .NET.&lt;/span&gt; Does anyone happen to know if this is correct? Any specific practical gotchas encountered?&lt;br /&gt;&lt;br /&gt;(Side note, it seems that Perl 5 sure left its mark on the world. It made a semi-standard for half-decent regexes in the world. And I call that a good thing. Even if Perl 6 changed their own regexes again. Side note 2, even if you don't know the answers to my questions, please forward to your friends who might be experts on this matter. Many thanks!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-7686532404674094634?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/7686532404674094634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/06/java-net-and-ecmascript-regex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7686532404674094634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7686532404674094634'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/06/java-net-and-ecmascript-regex.html' title='Java, .NET, and ECMAScript Regex Compatibility - Expert advice wanted!'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5325495043463555631</id><published>2009-06-03T11:53:00.003-05:00</published><updated>2009-06-03T14:01:05.104-05:00</updated><title type='text'>Review of Mere Christianity</title><content type='html'>&lt;a href="http://www.goodreads.com/book/show/1861395.Mere_Christianity" style="float: left; padding-right: 20px"&gt;&lt;img alt="Mere Christianity" border="0" src="http://photo.goodreads.com/books/1223620516m/1861395.jpg" /&gt;&lt;/a&gt; &lt;a href="http://www.goodreads.com/book/show/1861395.Mere_Christianity"&gt;Mere Christianity&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/1069006.C_S_Lewis"&gt;C.S. Lewis&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/show/54698156"&gt;&lt;h3&gt;My review&lt;/h3&gt;&lt;/a&gt;&lt;br /&gt;Rating: 4 of 5 stars&lt;br /&gt;&lt;br /&gt;A really good book overall. Teaches lots of practical issues related to Christianity (as a religion and as a relationship with Christ) and Christian behavior. One sample of good advice is how giving ought to hurt. For instance, if we our charitable donations don't hamper our personal desires some, then we probably aren't giving enough. On that word "charitable", there's a nice discussion of charity (Christian love) itself.&lt;br /&gt;&lt;br /&gt;From a philosophical/logical perspective, I think sometimes Lewis claims more than he's proven. For example, I believe in right and wrong, and I believe him that it shows the existence of God. Also, that everyone, if they really think about it, can figure it out. But I don't think Lewis logically proved that there aren't alternative explanations. Still, the arguments are convincing if not watertight.&lt;br /&gt;&lt;br /&gt;Going on a tangent, I feel there's some value in comparing Lewis's theology with that of Mormonism (my being a Mormon and all). There are several differences, but I think the most fundamental is the nature of humanity. In Mormonism, we believe that all people are begotten spirit children of God. Christ has a special status. He was/is perfect. He also had a special role to play, and we refer to him as God in that role. But we believe that the rest of mankind are also spirit children of God, not merely creatures.&lt;br /&gt;&lt;br /&gt;However, in our fallen world, and given our fallen natures, much of the same principles apply as Lewis describes. That is, Christ's redemption brings us _back_ into the state of being God's children. The process of that redemption overlaps much with the nature of choice and grace that Lewis describes. Lewis was obviously very inspired in his doctrine, and I agree with a majority of his teachings here.&lt;br /&gt;&lt;br /&gt;With the differences being subtle at that level, I've had to think some about what the practical effects of the difference might be. I'm not sure I have a full answer at this point, but it does create a different psychological effect. The world isn't "progressing" in the way Lewis describes. The fall itself was necessary, and the fallen world is part of the experience God wants for us. Also, Christians go back to the beginning of the world. The atonement works retroactively.&lt;br /&gt;&lt;br /&gt;Anyway, in all it was a great book, and I'm glad I read it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/1552336-tom"&gt;View all my reviews.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5325495043463555631?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5325495043463555631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/06/review-of-mere-christianity.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5325495043463555631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5325495043463555631'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/06/review-of-mere-christianity.html' title='Review of Mere Christianity'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2024801158156827149</id><published>2009-06-01T10:27:00.003-05:00</published><updated>2009-06-01T10:32:39.463-05:00</updated><title type='text'>Exuberant Ctags</title><content type='html'>I've been spending more time in Vim than Eclipse recently, so I was missing the source navigation features of Eclipse. Well, I finally dug into making ctags work, so I have my basic navigation features back again (the "go to definition" kind).&lt;br /&gt;&lt;br /&gt;Then I found out that GNU ctags doesn't seem to support local variables. Then I found &lt;a href="http://ctags.sourceforge.net/"&gt;Exuberant Ctags&lt;/a&gt;, which is working great for me (in C and C++, at least). For now, I use an alias defined like so:&lt;br /&gt;&lt;br /&gt;alias tags='$HOME/.local/bin/ctags --c++-kinds=+l --c-kinds=+l'&lt;br /&gt;&lt;br /&gt;I wonder if there's some way to tell Vim to update the tags for a project each time I save ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2024801158156827149?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2024801158156827149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/06/exuberant-ctags.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2024801158156827149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2024801158156827149'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/06/exuberant-ctags.html' title='Exuberant Ctags'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3804773709004436128</id><published>2009-05-27T14:01:00.003-05:00</published><updated>2009-05-27T14:08:54.339-05:00</updated><title type='text'>Review of Beautiful Evidence</title><content type='html'>&lt;a href="http://www.goodreads.com/book/show/17743.Beautiful_Evidence" style="float: left; padding-right: 20px"&gt;&lt;img alt="Beautiful Evidence" border="0" src="http://photo.goodreads.com/books/1185504550m/17743.jpg" /&gt;&lt;/a&gt; &lt;a href="http://www.goodreads.com/book/show/17743.Beautiful_Evidence"&gt;Beautiful Evidence&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/10775.Edward_R_Tufte"&gt;Edward R. Tufte&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://www.goodreads.com/review/show/39545648"&gt;&lt;h3&gt;My review&lt;/h3&gt;&lt;/a&gt;&lt;br /&gt;  Rating: 3 of 5 stars&lt;br /&gt;&lt;br /&gt;First a comment that I read this book because of all the buzz on sparklines a few years ago.&lt;br /&gt;&lt;br /&gt;As for my review itself: I liked the emphasis on the power of the human vision system to process large amounts of data quickly. The focus here, then, is on high information density with as much context as possible. Tufte really likes figures right next to related text, or even within the text. He likes scales on pictures, or perhaps well-known objects for context. Also, information to convey statistical significance is also considered important, and the ability to relate relationships, too. Summary: easily understood, easily available, honest, dense information is good.&lt;br /&gt;&lt;br /&gt;I found the diatribes on PowerPoint and sculpture pedestals interesting. I did not think he presented convincing evidence against slide presentations. He could easily have handpicked so few example sources (even the dozens he had). I saw no claim against bias except a statement that they were "unbiased" selections. He chose some people claiming that slide presentations were responsible for the space shuttle Columbia disaster, including himself (if I remember correctly). Any claims of value for slide presentations were quickly dismissed by saying that important other folks found slide presentations bad.&lt;br /&gt;&lt;br /&gt;I find it sad that he fights so hard against misrepresented information then proceeds to use diatribe, one-sided arguments, and psychological appeals with references to Soviet oppression as ways to state his case.&lt;br /&gt;&lt;br /&gt;I think people want information summarized in many cases. Not everyone wants or should need to read a detailed report.&lt;br /&gt;&lt;br /&gt;So maybe the better conclusion would be, "If you have a highly-visible and expensive risk of several people dying, maybe you should err on the side of caution and be willing to spend more time and money to make sure you are right." I think that's better than "PowerPoint kills people" (paraphrased by me).&lt;br /&gt;&lt;br /&gt;I still do find it interesting to read the arguments for real tech reports, use of standard sentences and paragraphs, and so on. Also the complaint against "pitch culture". So, even though I disagree with the extremity of his position, I think there is a lot to learn here and think about.&lt;br /&gt;&lt;br /&gt;Side note, it seems clear that he carefully laid out each page (or pair of facing pages) throughout the book with great attention to how to final physical product would look. In that sense, this book is definitely a work of art. I don't get the impression many technical books tech presentation so seriously.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/1552336-tom"&gt;View all my reviews.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3804773709004436128?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3804773709004436128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/05/review-of-beautiful-evidence.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3804773709004436128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3804773709004436128'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/05/review-of-beautiful-evidence.html' title='Review of Beautiful Evidence'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2182920228183796859</id><published>2009-05-20T18:57:00.002-05:00</published><updated>2009-05-20T18:59:56.149-05:00</updated><title type='text'>Jetpack: Firefox extension development escapes the 80s!</title><content type='html'>&lt;a href="http://labs.mozilla.com/2009/05/introducing-jetpack-call-for-participation/"&gt;Read about Mozilla Jetpack here&lt;/a&gt;. Totally sweet. No restart required. No painful horrors in XUL, RDF, or project setup.&lt;br /&gt;&lt;br /&gt;Finally.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2182920228183796859?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2182920228183796859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/05/jetpack-firefox-extension-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2182920228183796859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2182920228183796859'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/05/jetpack-firefox-extension-development.html' title='Jetpack: Firefox extension development escapes the 80s!'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3131137520779450171</id><published>2009-05-19T09:08:00.002-05:00</published><updated>2009-05-19T09:13:40.459-05:00</updated><title type='text'>Open Source Real-Time Raytracer</title><content type='html'>A recent paper out of Stanford from Saxena and Ng mentioned that they could train computer vision from raytracer output and use that knowledge effectively in real images. They couldn't do the same with raster (OpenGL) output. It wasn't the main focus of the paper, but I still found it very interesting.&lt;br /&gt;&lt;br /&gt;And I like fast. And I don't like supercomputers.&lt;br /&gt;&lt;br /&gt;Therefore, I'm rather interested in the idea of high-speed raytracing. That's why I liked this &lt;a href="http://matt.eifelle.com/2009/05/19/interactive-raytracer/"&gt;blog post on open and closed source real-time raytracers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'd like to see a serious real-time-or-faster, open source world simulator someday. Something that could gradually add new simulation features with time. Real-time raytracing seems to be fundamental part of that (along with physics, audio, and so on).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3131137520779450171?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3131137520779450171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/05/open-source-real-time-raytracer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3131137520779450171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3131137520779450171'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/05/open-source-real-time-raytracer.html' title='Open Source Real-Time Raytracer'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5763096833216876236</id><published>2009-05-18T13:14:00.002-05:00</published><updated>2009-05-18T13:19:15.165-05:00</updated><title type='text'>The Answer's Already There</title><content type='html'>I've been thinking about robots learning how to act in the world around them. For any task, let's presume a program could be written to get the job done. How much effort to cover the task, including all the corner cases? Most solid software needs a lot of effort. The devil's in the details.&lt;br /&gt;&lt;br /&gt;However, the details are all around us. Why use automated learning? If a strategy doesn't work, modify it. Automate the modification. This glosses over lots of the &lt;span style="font-style: italic;"&gt;how&lt;/span&gt; question, and bootstrapping some answers into the system might speed things along. But why work out all the bugs for the system if the system can work out the bugs for itself?&lt;br /&gt;&lt;br /&gt;I think the same issue can apply to many types of software, by the way.&lt;br /&gt;&lt;br /&gt;The ability to &lt;span style="font-style: italic;"&gt;sense&lt;/span&gt; the effects of actions is important in all this, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5763096833216876236?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5763096833216876236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/05/answers-already-there.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5763096833216876236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5763096833216876236'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/05/answers-already-there.html' title='The Answer&apos;s Already There'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-7321920928955829079</id><published>2009-05-07T09:09:00.003-05:00</published><updated>2009-05-07T09:15:24.519-05:00</updated><title type='text'>Kindle DX for Textbooks?</title><content type='html'>So, I skimmed about Amazon's new Kindle DX. Larger than before. Supposedly good for textbooks and newspapers. Still gray scale.&lt;br /&gt;&lt;br /&gt;I don't get it. Maybe a novel is fine in gray, but some things need color for full effect. Like picture books. Or textbooks.&lt;br /&gt;&lt;br /&gt;Really. It's WAY easier to convey detailed information in color, and effective textbooks use that to their advantage. (My apologies in advance to those who can't see color.) Your product won't be effective for textbooks without color. That's my opinion.&lt;br /&gt;&lt;br /&gt;Second, many students already carry laptops, often clunky ones. The Kindle might be sleeker, but expecting two devices (laptop and Kindle) seems a bother to me.&lt;br /&gt;&lt;br /&gt;I just don't see this working. Give me a simple PDF or something (DRM'd or whatever). I'll get by. Really.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-7321920928955829079?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/7321920928955829079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/05/kindle-dx-for-textbooks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7321920928955829079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7321920928955829079'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/05/kindle-dx-for-textbooks.html' title='Kindle DX for Textbooks?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6956137866908666832</id><published>2009-04-20T22:53:00.003-05:00</published><updated>2009-04-21T07:17:51.538-05:00</updated><title type='text'>JFreeChart Item Rendering</title><content type='html'>So, it seems that the only way built into JFreeChart to render lines is one segment at a time, rather than making it all into one path.&lt;br /&gt;&lt;br /&gt;And yes, this can make a different when you, say, have dashed lines with many points along the way. Thick lines can also make certain end/join types cause trouble. (Sorry, too lazy to put up example pictures at the moment.)&lt;br /&gt;&lt;br /&gt;Is there any way to make it draw a whole line at once?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6956137866908666832?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6956137866908666832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/04/jfreechart-item-rendering.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6956137866908666832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6956137866908666832'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/04/jfreechart-item-rendering.html' title='JFreeChart Item Rendering'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6824513456883011920</id><published>2009-04-17T12:25:00.002-05:00</published><updated>2009-04-17T12:33:13.472-05:00</updated><title type='text'>GPGPU in our Eyes</title><content type='html'>Been reading Beautiful Evidence. With all the emphasis on information density, it makes me think about our minds as parallel processing engines. But you still need to get the data in there. Eyes are a really great way to input high-resolution 5-dimensional data (2 spacial, 3 color) for most people. Way better than reading words. Well, unless the picture can be conveyed in a few words.&lt;br /&gt;&lt;br /&gt;This also reminds me of systems like numpy or MATLAB or such things where the language is slow but if you can get data into the low-level primitives, you can chunk things fast.&lt;br /&gt;&lt;br /&gt;On a side note, I wonder how easy it is for people (especially those who are fully blind) to learn to make sense of bas relief data by touch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6824513456883011920?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6824513456883011920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/04/gpgpu-in-our-eyes.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6824513456883011920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6824513456883011920'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/04/gpgpu-in-our-eyes.html' title='GPGPU in our Eyes'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-1792141782244709918</id><published>2009-04-08T19:08:00.002-05:00</published><updated>2009-04-08T19:11:23.165-05:00</updated><title type='text'>Mono Gets Continuations</title><content type='html'>Looks like Mono is planning to one up Java (and Microsoft's .NET) again. It's &lt;a href="http://tirania.org/blog/archive/2009/Apr-07.html"&gt;continuations&lt;/a&gt; this time.&lt;br /&gt;&lt;br /&gt;Miguel seems to be all about enabling technologies. Instead, Java seems to be about philosophy.&lt;br /&gt;&lt;br /&gt;I'm still trying to dodge Mono for now, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-1792141782244709918?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/1792141782244709918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/04/mono-gets-continuations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1792141782244709918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1792141782244709918'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/04/mono-gets-continuations.html' title='Mono Gets Continuations'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-6838785872843127645</id><published>2009-04-07T12:20:00.002-05:00</published><updated>2009-04-07T12:30:35.836-05:00</updated><title type='text'>OOP and Object Affordances</title><content type='html'>It occurred to me in the past week that there's a relationship between object-oriented programming and the psychological concept of real-world object &lt;a href="http://en.wikipedia.org/wiki/Affordance"&gt;affordances&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In our robotics research, we've mention Gibson's focus on how an affordance is not just about the object but about the agent (person) and the object. I can't grasp a basketball with one hand, for instance, but someone else can.&lt;br /&gt;&lt;br /&gt;This reminds me of the topic of minimal interfaces on OOP and issues like mixins vs. extension methods. You can't possibly put everything you want about an object into its class (even with mixins). But how common are certain contexts (agents)? Only the most common things (if that can be determined) should be inside the class. That's my opinion. And the language should make other extensions as easily available as possible, now depending on your &lt;span style="font-style: italic;"&gt;real&lt;/span&gt; context.&lt;br /&gt;&lt;br /&gt;Multimethods also fit into this topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-6838785872843127645?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/6838785872843127645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/04/oop-and-object-affordances.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6838785872843127645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/6838785872843127645'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/04/oop-and-object-affordances.html' title='OOP and Object Affordances'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-523622980486957012</id><published>2009-04-07T12:10:00.002-05:00</published><updated>2009-04-07T12:20:04.338-05:00</updated><title type='text'>Quick, Regular, Open Book Quizzes</title><content type='html'>I've been thinking that weekly quizzes would help teach programming (or other subjects). They'd be online and multiple choice, focusing on concepts.&lt;br /&gt;&lt;br /&gt;They'd be automatically graded, and open book (or internet, but maybe not open friend) would be fine, too.&lt;br /&gt;&lt;br /&gt;The idea would be to "force" people to think regularly about the concepts. In order to answer the question, you'd have to think about it at least a little.&lt;br /&gt;&lt;br /&gt;I say &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; open friend, because I don't want the help to be of the form ABBDCABADC. No thinking would be involved. Or maybe just make the answers in random order and unlabeled. Still maybe say no friends, but if they at least clicked the answers themselves, the answer-as-label might still require thinking.&lt;br /&gt;&lt;br /&gt;Example question (and multiple answer could be nice, and I had a recommendation that partial-credit answers could also be cool):&lt;br /&gt;&lt;br /&gt;Which of the following are expressions of type int?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;5&lt;/li&gt;&lt;li&gt;(int)Math.random()&lt;/li&gt;&lt;li&gt;4.5&lt;/li&gt;&lt;li&gt;-4 + 1&lt;/li&gt;&lt;li&gt;"Hello"&lt;/li&gt;&lt;li&gt;"Hello".length()&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Things like that. Maybe 5-10 questions per quiz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-523622980486957012?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/523622980486957012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/04/quick-regular-open-book-quizzes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/523622980486957012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/523622980486957012'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/04/quick-regular-open-book-quizzes.html' title='Quick, Regular, Open Book Quizzes'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8785206123039645538</id><published>2009-03-31T21:00:00.001-05:00</published><updated>2009-03-31T21:01:15.361-05:00</updated><title type='text'>Canvas 3D News</title><content type='html'>Oh, I'm so happy to hear updates on the &lt;a href="http://blog.mozilla.com/blog/2009/03/24/mozilla-and-the-kronos-group-announce-initiative-to-bring-accelerated-3d-to-the-web/"&gt;3D web&lt;/a&gt; front.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8785206123039645538?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8785206123039645538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/03/canvas-3d-news.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8785206123039645538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8785206123039645538'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/03/canvas-3d-news.html' title='Canvas 3D News'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3568908607850701694</id><published>2009-03-25T10:04:00.004-05:00</published><updated>2009-03-25T10:18:37.690-05:00</updated><title type='text'>Java, Mono, Python, and SIMD</title><content type='html'>I've been interested in &lt;a href="http://tirania.org/blog/archive/2008/Nov-03.html"&gt;Mono's direct support for SIMD operations&lt;/a&gt;. As far as I can tell, it does &lt;a href="http://ressim.berlios.de/benchmark.html"&gt;make a difference in performance&lt;/a&gt;. Even things like NumPy (for Python) effectively use SIMD under the covers, if I understand correctly. But, apparently, &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6526380"&gt;we don't need support for SIMD in Java, because HotSpot will (at some magical point) make all the pain go away&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you can tell, I'm disappointed in the Sun response to the problem. And how hard would it be to recognize when low-level 'for' loops are parallelizable with SIMD operations? My guess is that it would be very difficult to recognize automatically compared with the ease of writing code in parallel form to begin with.&lt;br /&gt;&lt;br /&gt;I'm rather convinced that basic, and maybe some additional advanced, matrix operations ought to be in the core JRE. After some time in MATLAB, I'm convinced it's a better level of abstraction than 'for' loop everywhere, anyway. And I like pure Java. If it requires native code outside the JRE, it's uncool. I'm also tired of having no clear path for matrix support in Java.&lt;br /&gt;&lt;br /&gt;If scientific work (or other number crunching such as for games) takes people to MATLAB or Python or Mono or C, that leaves a huge hole for Java.&lt;br /&gt;&lt;br /&gt;Maybe someday they'll care about this hole. Really, a matrix absraction layer allows for easier, high level coding and easier optimization. Pretty please, Sun or IBM or whatever?&lt;br /&gt;&lt;br /&gt;Bonus points for including GPGPU implementations and abstractions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3568908607850701694?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3568908607850701694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/03/java-mono-python-and-simd.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3568908607850701694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3568908607850701694'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/03/java-mono-python-and-simd.html' title='Java, Mono, Python, and SIMD'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-105019276911944927</id><published>2009-03-18T10:20:00.002-05:00</published><updated>2009-03-18T10:23:00.391-05:00</updated><title type='text'>Web in Our Minds</title><content type='html'>Hmm. Been thinking a lot recently about how much of our symbol handling in our minds might not be too unlike the world wide web. Not exactly the same either, though. And there need to be ties between rich physical data and any "symbols".&lt;br /&gt;&lt;br /&gt;Also thinking that our hypothesis representation (problem reduction?) space ought to be Turing complete. Not sure that this is related to symbol handling.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-105019276911944927?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/105019276911944927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/03/web-in-our-minds.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/105019276911944927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/105019276911944927'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/03/web-in-our-minds.html' title='Web in Our Minds'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8162271785746728565</id><published>2009-03-11T13:03:00.003-05:00</published><updated>2009-03-11T13:27:02.531-05:00</updated><title type='text'>Teaching Expressions</title><content type='html'>I've found in recent days that many students can understand expressions better when built up one at a time. For example:&lt;br /&gt;&lt;br /&gt;int i = 5;&lt;br /&gt;if (Math.sqrt(i + 1) &lt; 4.5) {     /* ... */ }&lt;br /&gt;&lt;br /&gt;So, the idea is to work outward with types: &lt;ul&gt;&lt;li&gt;What's the type of expression 'i'? int&lt;/li&gt;&lt;li&gt;What's the type of expression '1'? int&lt;/li&gt;&lt;li&gt;What's the type of expression 'i + 1'? int (then converted to double)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;What's the type of expression 'Math.sqrt(i + 1)'? double&lt;/li&gt;&lt;li&gt;What's the type of expression '4.5'? double&lt;/li&gt;&lt;li&gt;What's the type of expression 'Math.sqrt(i + 1)  &lt; 4.5'? boolean (required for if)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Going over this in front of students and letting them give the answers seems an effective way to teach the concepts (for some people). Showing assignment, boolean operators, and other such examples can also be useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8162271785746728565?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8162271785746728565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/03/teaching-expressions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8162271785746728565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8162271785746728565'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/03/teaching-expressions.html' title='Teaching Expressions'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5547807968326154400</id><published>2009-03-04T10:26:00.002-06:00</published><updated>2009-03-04T10:28:40.884-06:00</updated><title type='text'>Build Objects looks interesting</title><content type='html'>I haven't tried it out yet, but &lt;a href="http://code.google.com/p/buildobjects/"&gt;Build Objects&lt;/a&gt; looks like the closest thing today to my &lt;a href="http://tomobag.blogspot.com/2009/02/can-has-build-for-java.html"&gt;Can Has Build&lt;/a&gt; idea that I would like much better than either Ant or Maven.&lt;br /&gt;&lt;br /&gt;If you are looking for a better mousetrap, Build Objects is something you might want to consider.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5547807968326154400?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5547807968326154400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/03/build-objects-looks-interesting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5547807968326154400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5547807968326154400'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/03/build-objects-looks-interesting.html' title='Build Objects looks interesting'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3160015143580569921</id><published>2009-03-04T10:22:00.003-06:00</published><updated>2009-03-04T10:30:16.676-06:00</updated><title type='text'>Bullet for Physics, I think</title><content type='html'>The more I look at and think about different options, the more I'm convinced that the physics platform with legs is Bullet. And sadly, I don't think it's JBullet. That's too bad, because I definitely prefer Java. Maybe someday, native DLLs will just run as Java transparently, but &lt;a href="http://tomobag.blogspot.com/2008/11/enough-with-java-ports.html"&gt;until then ...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(Side note, I'm getting less convinced on using Blender as the Bullet wrapper for simulations, but maybe someday on that, too.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3160015143580569921?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3160015143580569921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/03/bullet-for-physics-i-think.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3160015143580569921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3160015143580569921'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/03/bullet-for-physics-i-think.html' title='Bullet for Physics, I think'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-214736607651789426</id><published>2009-02-27T11:31:00.003-06:00</published><updated>2009-02-27T11:33:38.069-06:00</updated><title type='text'>Compiling GWT in GWT?</title><content type='html'>Um, just wondered today if it would be possible to use GWT's Java-to-JS compiler to compile the GWT compiler itself? Maybe the result would be too huge anyway, but if it worked you could easily push Java compiling into the browser itself. Could be great for Java tutorials, among other things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-214736607651789426?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/214736607651789426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/02/compiling-gwt-in-gwt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/214736607651789426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/214736607651789426'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/02/compiling-gwt-in-gwt.html' title='Compiling GWT in GWT?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-5210136107158222586</id><published>2009-02-26T19:07:00.003-06:00</published><updated>2009-02-27T09:02:15.607-06:00</updated><title type='text'>Hacking Up Statistics for Fun and Profit</title><content type='html'>The more I'm learning about inference and learning, the more I'm convinced that statistics is the "correct" way. My subject goes beyond statistics, too. For example, if you want to maximize something, you take the derivative and set it to 0 (and look at the second derivative to be sure you have a max and not a min or saddle point).&lt;br /&gt;&lt;br /&gt;In contrast to this, some machine learning is full of hacks that seemed like good ideas at the time: neural networks, decision trees, and so on. Many algorithms seem ad hoc. Now I'm being someone over-the-top in my assessment. Lots of those folks have been more formal than I ever really want to be. But it's also so removed from traditional techniques at times.&lt;br /&gt;&lt;br /&gt;Well, my current conjecture is that if there is a "right" way to do something (and that's a strong statement in algorithms), you should still be able to see how well your "hack" approximates to it. And meanwhile, it might be fun. And, you might still do well enough but be faster or have other desirable properties absent from the right way.&lt;br /&gt;&lt;br /&gt;Well, I'm speaking from ignorance anyway. Just some thoughts on my mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-5210136107158222586?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/5210136107158222586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/02/hacking-up-statistics-for-fun-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5210136107158222586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/5210136107158222586'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/02/hacking-up-statistics-for-fun-and.html' title='Hacking Up Statistics for Fun and Profit'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8632158649542344159</id><published>2009-02-20T09:12:00.004-06:00</published><updated>2009-02-20T11:39:18.804-06:00</updated><title type='text'>Can Has Build ... Again</title><content type='html'>Well, since javablogs.com was broken, and I'm not sure how to get them to push my entry through, and I actually want people to read this entry (looking to get others thinking about it if at all possible), here's another post just to link to my &lt;a href="http://tomobag.blogspot.com/2009/02/can-has-build-for-java.html"&gt;Can Has Build&lt;/a&gt; system description.&lt;br /&gt;&lt;br /&gt;Summary, the idea is to &lt;span style="font-style: italic; font-weight: bold;"&gt;beat out Maven for easy conventions&lt;/span&gt; and to &lt;span style="font-style: italic; font-weight: bold;"&gt;beat Ant for reliability and low dependencies&lt;/span&gt;. As in, win each of those categories big time.&lt;br /&gt;&lt;br /&gt;I could have missed it, but I haven't heard of any other Java build systems that work like this one.&lt;br /&gt;&lt;br /&gt;So like, &lt;a href="http://tomobag.blogspot.com/2009/02/can-has-build-for-java.html"&gt;here's the link again&lt;/a&gt;. Please read and comment (and make it for me?) if you have the time. Thanks much.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8632158649542344159?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8632158649542344159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/02/can-has-build-again.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8632158649542344159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8632158649542344159'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/02/can-has-build-again.html' title='Can Has Build ... Again'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8619201779581562813</id><published>2009-02-19T08:52:00.008-06:00</published><updated>2009-02-19T09:26:05.143-06:00</updated><title type='text'>Can Has Build for Java</title><content type='html'>While not sleeping this morning, I thought through some ideas I'd had in the past on build systems. Ant is too manual, and coding in XML is a pain. Maven is too unreliable, and it sure requires a lot of configuration and magical incantations for a convention-based system. I want minimal dependencies, real convention-over-configuration, and a sane way to extend.&lt;br /&gt;&lt;br /&gt;For the moment, I'm affectionately calling my (hypothetical) system "&lt;a href="http://en.wikipedia.org/wiki/I_Can_Has_Cheezburger"&gt;Can Has&lt;/a&gt; Build". Here's what a basic project directory structure looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;project-name/&lt;br /&gt;    build.jar &lt;-- the Can Has Build main jar (which is very small and executable)&lt;br /&gt;    lib/ &lt;-- jars needed for build and at runtime go here&lt;br /&gt;    src/ &lt;-- source folder for which the class files will go in your jar&lt;br /&gt;    test/ &lt;-- source folder for unit tests&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After running the build (which by default does a clean build all, since your IDE is probably doing incremental compiling for play-as-you-go anyway; I think build systems are primarily for making a final product, so it's all right to be slow):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;project-name/&lt;br /&gt;    build.jar&lt;br /&gt;    lib/&lt;br /&gt;    out/ &lt;-- not 100% sure what to call this ("test" and "target" both start with "t")&lt;br /&gt;        project-name.jar &lt;-- or maybe project-name-SNAPSHOT.jar&lt;br /&gt;        test-results/&lt;br /&gt;            ...&lt;br /&gt;    src/&lt;br /&gt;    test/&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;All you need for this to work is a JDK and "java -jar build.jar". Can Has figures out everything else on its own.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Say you want to specify a version number? Then add a "project.xml" under your project dir:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;project-name/&lt;br /&gt;    project.xml&lt;br /&gt;    ... all else as before ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Why XML? Because I know XML better than properties files, and I think most other devs do, too, and it allows for hierarchical data if needed, but to give an idea of what I think would go in here at first, here's an example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;project&lt;br /&gt;    name="Can Has Build"&lt;br /&gt;    jar-name="build"&lt;br /&gt;    version="0.0.0.0.0.0.1-SNAPSHOT"&lt;br /&gt;    version-jar-name="false"&lt;br /&gt;    main="canhas.build.Builder"&lt;br /&gt;/&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I mean, is that so bad? I can imagine JRE version requirements and so on, too.&lt;br /&gt;&lt;br /&gt;So, say I want custom tools in my build such as Test Tool X or Parser Generator Z or Class Bundler/Renamer Q? Or my own custom script? I envision a "build" subdir:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;project-name/&lt;br /&gt;    build/&lt;br /&gt;        lib/ &lt;-- jars needed just at build time&lt;br /&gt;        src/ &lt;-- source code for custom build scripts&lt;br /&gt;        tools/ &lt;-- auto-registered tools that can filter the automatic build process&lt;br /&gt;    ... all else as before ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Or something like that. Again, this is convention-over-configuration. These custom tools should get picked up automatically by "java -jar build.jar".&lt;br /&gt;&lt;br /&gt;I've also considered conventions for grouping related projects and easy specification of dependencies between them, but I'll forgo commenting on that right now. In any case, all 3rd-party libraries would need added manually. That's the reliability thing.&lt;br /&gt;&lt;br /&gt;So, the summary, Can Has (which doesn't exist, so feel free to make it) has the following features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No dependence on someone else's server being up.&lt;/li&gt;&lt;li&gt;No configuration needed for basic builds.&lt;/li&gt;&lt;li&gt;No dependencies except a JDK (or just JRE if you bundle your own compiler under "build/").&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8619201779581562813?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8619201779581562813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/02/can-has-build-for-java.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8619201779581562813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8619201779581562813'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/02/can-has-build-for-java.html' title='Can Has Build for Java'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8005994652838071749</id><published>2009-02-14T14:16:00.003-06:00</published><updated>2009-02-14T14:19:30.504-06:00</updated><title type='text'>Finally Translucent Scrollbars</title><content type='html'>I'm so happy that &lt;a href="https://bespin.mozilla.com/"&gt;Mozilla's Bespin&lt;/a&gt; has translucent scrollbars. Maybe been around before (other than in prototype ideas of my own in the past), but it sure hasn't been common, at least.&lt;br /&gt;&lt;br /&gt;Maybe it will take a lot of use to see if it's a good idea for sure, but I'm still so happy that someone put it in a (sure to be) high profile project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8005994652838071749?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8005994652838071749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/02/finally-translucent-scrollbars.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8005994652838071749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8005994652838071749'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/02/finally-translucent-scrollbars.html' title='Finally Translucent Scrollbars'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-7875374801151377016</id><published>2009-02-14T14:09:00.004-06:00</published><updated>2009-02-14T14:16:03.330-06:00</updated><title type='text'>USB Microcontroller Programmers on Linux without Sudo</title><content type='html'>I was doing some microcontroller programming for the first time this week. Found out I had to 'sudo' to use 'avrdude' to write to the programmer on the USB port. Lame. After a couple hours of study learning about udev (and other worse alternatives), I put this in a file I named '/etc/&lt;span class="nfakPe"&gt;udev&lt;/span&gt;/rules.d/85-avr.rules':&lt;br /&gt;&lt;br /&gt;ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2104", MODE="0666"&lt;br /&gt;&lt;br /&gt;Specifically, that's for the AVR ISP mk II (also called stk500v2).&lt;br /&gt;&lt;br /&gt;My question is, why would I ever not want write permission to a USB device attached to my computer? Is that &lt;span style="font-style: italic;"&gt;ever&lt;/span&gt; a security risk?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-7875374801151377016?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/7875374801151377016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/02/usb-microcontroller-programmers-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7875374801151377016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7875374801151377016'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/02/usb-microcontroller-programmers-on.html' title='USB Microcontroller Programmers on Linux without Sudo'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-1068465704684354065</id><published>2009-02-11T08:33:00.002-06:00</published><updated>2009-02-11T08:42:22.226-06:00</updated><title type='text'>Don't use System.exit()!</title><content type='html'>Just a quick comment/plea about the evils of &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/System.html#exit%28int%29"&gt;System.exit()&lt;/a&gt; (or whatever other equivalents in other languages if they are anything like Java). Really, 'exit' is like a global variable. You think you want to kill the program, but you really don't. The moment you use it anywhere, you've set up a trap that makes your software unusable by third parties. Consider these alternatives instead:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Throw an exception.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;End your thread, but this is a deep subject of itself which is beyond my current scope.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;For real newbies (or others) working in main() alone, just use 'return'.&lt;/li&gt;&lt;/ul&gt;Really, please, and based on real-world pain, leave exit() alone unless that's really really really really really really really what you want. The status code might be one reason, but Java really isn't so often used for writing traditional processes. If you do need that, make sure you have your "traditional process" nicely distinct from the rest of your code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-1068465704684354065?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/1068465704684354065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/02/dont-use-systemexit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1068465704684354065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1068465704684354065'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/02/dont-use-systemexit.html' title='Don&apos;t use System.exit()!'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-7334042146788676710</id><published>2009-02-05T09:16:00.005-06:00</published><updated>2009-02-05T09:28:27.177-06:00</updated><title type='text'>Reinforcement Learning Competition</title><content type='html'>&lt;div style="float:left;padding-right:1em"&gt;&lt;img style="width: 150px; height: 317px; border:0" src="http://2009.rl-competition.org/img/octopus.jpg" alt=""/&gt;&lt;/div&gt;Looks like some great problems (ranging from "Infinite Mario" to a helicopter simulator) to work on for this &lt;a href="http://2009.rl-competition.org/domains.php"&gt;2009 reinforcement learning competition&lt;/a&gt;. If you have experience or want experience programming AI, this could be a bunch of fun. I'm too busy with a mountain of other things, or else I'd probably look at that octopus problem. I just love high-dimensional action spaces.&lt;br /&gt;&lt;br /&gt;Side note, looks like they use Java in their software, but not exclusively. I haven't dug deep enough to see everything going on.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img style="width: 222px; height: 100px; border:0" src="http://2009.rl-competition.org/img/helicopter.jpg" alt="" /&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-7334042146788676710?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/7334042146788676710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/02/reinforcement-learning-competition.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7334042146788676710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7334042146788676710'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/02/reinforcement-learning-competition.html' title='Reinforcement Learning Competition'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-3905893818852487844</id><published>2009-01-26T13:43:00.002-06:00</published><updated>2009-01-26T13:49:31.403-06:00</updated><title type='text'>Has Git actually won?</title><content type='html'>I think one of the things hampering the world moving on from svn has been the lack of a clear successor. Both hg and git (and bzr earlier on) were getting a lot of attention which means that neither was an obvious choice. But git has been getting the air time recently. I've toyed with both and have to admit a preference to git myself, too.&lt;br /&gt;&lt;br /&gt;The git port to windows (&lt;a href="http://code.google.com/p/msysgit/"&gt;msysGit&lt;/a&gt;) has also been good.&lt;br /&gt;&lt;br /&gt;I guess if we ever see Google Code hosting adding git support, that would be a real sign. Curious to see. (For a few objective and also some personal reasons, I'd rather use Google than GitHub, but not everyone will have the same concerns I do.)&lt;br /&gt;&lt;br /&gt;In any case, I also find using git for local history tracking to be a nice choice. Not quite so automatic as Eclipse local history, but it allows more definite control and beats some other options.&lt;br /&gt;&lt;br /&gt;Does anyone else have an opinion? Has git beat hg for mindshare as the successor to svn?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-3905893818852487844?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/3905893818852487844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/01/has-git-actually-won.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3905893818852487844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/3905893818852487844'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/01/has-git-actually-won.html' title='Has Git actually won?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-7520524663093927392</id><published>2009-01-23T17:28:00.006-06:00</published><updated>2009-01-26T13:50:20.739-06:00</updated><title type='text'>Are killing and government control inescapable?</title><content type='html'>My second political post here. Apologies in advance, but do we have to trade war-mongering (and big government) for baby killing (and big government)?&lt;br /&gt;&lt;br /&gt;Maybe I'm grossly misrepresenting everyone, but I'd love to find politicians to vote for that are honest, charitable, and competent. I know that means playing tough sometimes, but I think a lot of caution is in order for certain topics. Oh, and knowing how to balance a budget would be just sweet.&lt;br /&gt;&lt;br /&gt;And, yes, I'm in the US. I can speak in an even less informed fashion about politics elsewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-7520524663093927392?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/7520524663093927392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/01/is-killing-and-government-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7520524663093927392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/7520524663093927392'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/01/is-killing-and-government-control.html' title='Are killing and government control inescapable?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-835851393587164955</id><published>2009-01-19T14:04:00.002-06:00</published><updated>2009-01-19T14:16:12.962-06:00</updated><title type='text'>Maybe Blender for Robot Simulations?</title><content type='html'>In the recent past, I've been eying JBullet and/or jMonkeyEngine and jME Physics for robot simulation. I think these could work, but I'm starting to like the idea of Blender instead. Blender is an opaque interface for newbies like me but still a lower barrier to entry for so many features than what I find trying to learn jME. At least for me right now. And I can do Python, too.&lt;br /&gt;&lt;br /&gt;One concern I have with Blender is the GPL license, but that's not an immediate concern. I do love that I can download a binary easily on different platforms. And it might be interesting to make a network (or even web) server driven system with it, anyway. Easy way to allow for different languages, too.&lt;br /&gt;&lt;br /&gt;Here's a &lt;a href="http://people.mech.kuleuven.be/%7Ebruyninc/blender/roadmap.html"&gt;nice detailed investigation into the use of Blender for robotics&lt;/a&gt;, by the way.&lt;br /&gt;&lt;br /&gt;(Oh, and if you've heard of it, I might like Gazebo more if they distributed binaries and/or didn't try to make it so hard to build. Talk about having a billion dependencies on the latest version of everything.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-835851393587164955?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/835851393587164955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/01/maybe-blender-for-robot-simulations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/835851393587164955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/835851393587164955'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/01/maybe-blender-for-robot-simulations.html' title='Maybe Blender for Robot Simulations?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-1228270734393885071</id><published>2009-01-12T15:12:00.003-06:00</published><updated>2009-01-12T15:19:16.843-06:00</updated><title type='text'>Use amsmath, not eqnarray</title><content type='html'>Being bothered in LaTeX by my difficulties with eqnarray, I searched a bit and found the &lt;a href="http://www.tug.org/pracjourn/2006-4/madsen/"&gt;recommendation to use amsmath&lt;/a&gt; instead, which generally already comes built in. I guess I'll give it a try.&lt;br /&gt;&lt;br /&gt;LaTeX sure is a complex ecosystem. I like to imagine having better alternatives, but I haven't yet seen any. Well, someday, I may try to stick to pure web environments for most cases. Do I really care about ensuring sweet ligatures and so on? We read tons of web pages all the time. There've got to be tools for LaTeX-to-MathML (or images), but for actual conference and journal papers, I have a hard time imagining ever switching from LaTeX. Though, really, I'd love to see a conference or journal emphasize HTML publishing over PDF someday. I think it's possible.&lt;br /&gt;&lt;br /&gt;Just that knowing HTML well &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; knowing LaTeX/PDF well seems like a lot of overhead. I'd like to limit the number of things I need expertise in. Maybe someday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-1228270734393885071?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/1228270734393885071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/01/use-amsmath-not-eqnarray.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1228270734393885071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/1228270734393885071'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/01/use-amsmath-not-eqnarray.html' title='Use amsmath, not eqnarray'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-2580544506333677229</id><published>2009-01-07T13:52:00.001-06:00</published><updated>2009-01-07T13:54:18.328-06:00</updated><title type='text'>haXe to C++ Compiler</title><content type='html'>Um, &lt;a href="http://gamehaxe.com/2008/12/23/hxcpp-03-released/"&gt;compiling haXe to C++&lt;/a&gt; (in addition to SWF, JS, and PHP) just might make it a killer platform. Maybe I should invest some time in it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-2580544506333677229?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/2580544506333677229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/01/haxe-to-c-compiler.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2580544506333677229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/2580544506333677229'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/01/haxe-to-c-compiler.html' title='haXe to C++ Compiler'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5956904987508681406.post-8575792768159159218</id><published>2009-01-06T11:06:00.004-06:00</published><updated>2009-01-06T11:15:16.015-06:00</updated><title type='text'>Java Open Sourced and Abandoned?</title><content type='html'>I'm tempted to read &lt;a href="http://weblogs.java.net/blog/robogeek/archive/2009/01/it_will_be_open.html"&gt;"instead of producing JDK7 we did JDK6u10 and JavaFX"&lt;/a&gt; as "Sun open sourced Java SE and then abandoned it to work on proprietary products (with some pure GPL side effects)". I think that's a bit too cruel, but it's also somewhat true.&lt;br /&gt;&lt;br /&gt;The interesting thing is that few people have cared &lt;em&gt;too&lt;/em&gt; much. I guess most Java is used in enterprise settings where stability is favored over bleeding edge. The Java community at large is very conservative when it comes to updates and changes. And we're used to just going along with Sun, too, I think (for core Java SE, at least). I think many other projects out there would have been forked by now if something like this happened.&lt;br /&gt;&lt;br /&gt;Anyway, hopefully things get back on track some day (with nice licensing for the plug-in, JavaFX, and so on and/or progress on OpenJDK). I mean, &lt;strong&gt;Flash/Flex is about as open as JavaFX right now&lt;/strong&gt;, if I understand things correctly. (And if you really want open, watch HTML 5, WebKit, Mozilla, and such.) Why not just go to the market leader?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5956904987508681406-8575792768159159218?l=tomobag.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomobag.blogspot.com/feeds/8575792768159159218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomobag.blogspot.com/2009/01/java-open-sourced-and-abandoned.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8575792768159159218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5956904987508681406/posts/default/8575792768159159218'/><link rel='alternate' type='text/html' href='http://tomobag.blogspot.com/2009/01/java-open-sourced-and-abandoned.html' title='Java Open Sourced and Abandoned?'/><author><name>Tom</name><uri>http://www.blogger.com/profile/15808034942220416445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://2.bp.blogspot.com/_wPeY2Yl5IkQ/ScEQ6LfSpAI/AAAAAAAAAFY/qw89i4N-cUc/s1600-R/n1513298171_24156_2300.jpg'/></author><thr:total>0</thr:total></entry></feed>
