Thursday, March 23, 2006

ajaxLaunch? Eh.

You know what? I was writing a really scathing review of Michael Robertson's ajaxLaunch and its first application, ajaxWrite.

I was going to lament how he started off with a really cool premise, gotten my hopes up for a cross-platform Steam-like content distribution system, but then failed me with a lackluster AJAX application that only worked in Firefox, was slow as molasses, and had a terrible file-handling system.

And then ajaxWrite crashed by my browser.

That's right. Your crappy web application crashed the very thing it was designed to run on.

Oh, but that's not all of the irony, you see.

Blogger's post editor is a bit of an AJAX application itself. For instance, every few seconds Blogger is making a copy of my post for safe-keeping, in case I get disconnected or something, right?

Oh, wrong. Because, you see, Blogger apparently can't tell the difference between a page crash and the user navigating away, so when I restore my web-browser, using the awesome Crash Recovery extension for Firefox, I'm greeted with an empty blog post. That's right. Nothing.

So, when ajaxWrite crashed--destroying any valuable work I might have been in the progress of creating with it--it also brought down the rest of the house, thus throwing the baby, the bath water, and most of the tub out the window.

No, I'm sorry. AJAX web applications are never going to replace desktop applications.

Applications like OpenOffice.

You know, the office suite that has a robust document recovery mechanism that ensures all your content does not belong to /dev/null?

Not at this rate.

Here's the best part. It is the most egregious thing of all:

ajaxWrite doesn't work in Internet Explorer because it apparently uses XUL. Look, I can understand that you might want to short-circuit a lot of work that XUL does for you. Hell, I'm all for it, I use languages like C#/Ruby/Boo just because they do a lot of the grindstone work for you. But when you start yammering about the web and interoperability and people not following standards, and then do this...

From ajaxLaunch's FAQ:
"ajaxWrite requires Firefox 1.5, or newer, browser. We are investigating extending ajaxWrite to other browsers such as Internet Explorer. Let us know your feedback on the forum."
What makes this really rib-crackin' funny?
"ajaxWrite is compatible with any operating system, Windows/Mac/Linux, but does require that you use a Firefox 1.5, or newer, browser."
Yeah, OK. Trade-in one form of vendor lockin for another. That's real, uh, heroic.

Coup d'é·tat right there, mofos.

Wait, WAIT, I KNOW WHAT YOU'RE THINKING.

It just gets better, though. I mean, we've got Writely.com, which, fantastically enough, works in any standards compliant web-browser you've got, has a rich user interface, is a very responsive AJAX application...

This is easily the most disappointing thing I've ever seen come from Michael Robertson. The sad part is he really thinks this will replace Microsoft Office.

Man, you're starting to slip. Seriously starting to slip.

Saturday, March 18, 2006

IO Language

Someone just linked to me to Io, a language inspired by Smalltalk, Lisp, and Self. What surprised me the most is not that it embodies the concepts of these languages, but the fact that its syntax is clean, crisp, and for the most part, easily readable.

What I've really disliked about these kinds of languages is that their syntax is not something you read; it is something you study. That's always really kind of annoyed me, because I have other things to do than decrypt a language by constantly flipping through a dictionary or keep a cheat-sheet next to the computer.

Io, on the other hand, seems like a refreshing change of pace. Clear, concise. No violent cacophony of paranthesis clawing at the gates. Sweet.

The unfortunate bit is that its another one of those languages that has its own runtime and libraries, which always leads to the problem of there not being a lot of libraries. So not only do you have to learn the language, you have to learn the unique set of libraries available for it. Not really my concept of a good day, since the knowledge really isn't reusable outside this particular library.

I guess that's why I enjoy .NET so much--when I switched from primarily coding in C# to coding in Boo, I only had to learn the unique syntax. The framework library was familiar to me, so once I was down with the syntax everything else just kind of flowed together and became like gel.

Hm. Its almost 4AM and I'm still up. Guess I'm hungry. Hopefully this will be the last errant post tonight.

Shame on you!

I feel bad for this guy. Both for the hassle Google is giving him, and the insipid people trolling his journal.

Sometimes I have to really wonder, do people read about these things, or do they simply act on reflex and hatred?

I try my best not to fall into those kinds of social and mental pit-falls; evaluate each situation, make sure I understand before I shoot off on the mouth and make myself look stupid. I really think this is key for me because I was "raised" on the computer and understand that in the age of Google and other powerful information networks, data persists. For years.

Any thing I'll say on this blog will be enshrined in Google's search engine for years to come. If I were to say something terrifyingly stupid, I would have to abandon all traces of this nickname, forever and permanently, for all time.

I guess the people posting comments on that guys blog won't have that problem, because they're mostly anonymous, or ashamed of being linked to such slow, meandering thought patterns.

Other GUIs for .NET?

Someone asked me why I stopped blogging in detail about the other UI solutoins for .NET programming.

I'll be honest with you: they suck. Bad. wx.NET has an API that is only comfortable to C++ programmers, and System.Windows.Forms is basically a slightly cleaned up version of MFC.

While this is OK--no API is perfect--they're not really interesting enough to warrant a blog post for each individual one. While they are powerful APIs, they are also APIs that are showing their age. I wouldn't use them unless it was absolutely positively a requirement, which it often is. Still, I hate's em. Damn, do I hate's em.

I know people say the right tool for the right job, but if the right tool happens to be a feces-covered shovel, well, hell, you're screwed either way, right?

Guess I just like living on the edge of new technology.

Monday, March 13, 2006

Minor msbuild modifications for Boo.

I wanted to make sure my boo copy was in sync with the repository, so I went ahead and finished up the tweaking of the msbuild files for Boo. Mainly it was wiring up project properties to the booc task. For some reason the code to generate all the proper command-line switches was in the booc task, but the back-end wasn't wired up to the Boo msbuild target.

Those of you using #dev 2.0 and Boo and wondering where your .pdb files went and why you couldn't debug inside of #dev, well, its fixed now, but you'll have to copy the Boo msbuild lewt from svn over to #develop 2.0's addin directory.

I think what happened is, Daniel (Boo #develop hacking hero) had a modified copy of the boo msbuild stuff to make sure that it emitted debug info, and when he upgraded to the latest and greatest svn version of boo, he lost those modifications. Anyway, fixed now, so no harm no foul.

These'll probably be my last few modifications for awhile, unless something heinous pops up while I'm coding something.

Sunday, March 12, 2006

Oops!

In my previous post, I mentioned the new anyall module. Well, bamboo removed the module from svn, so please ignore the previous post about them.

Author: bamboo
Date: 2006-03-12 15:53:09 -0500 (Sun, 12 Mar 2006)
New Revision: 2167

Removed:
boo/trunk/src/Boo.Lang.Useful
/Functional/
boo/trunk/tests/Boo.Lang.Useful.Tests/Functional/
Log:
any/all were not formally approved and the tests were not passing
When I first checked in anyall.boo, the tests were passing, so I'm not sure what to make of that message. Looks like a minor bugfix I made to the anyall module last night exposed another problem, but I'm not sure if its a problem in Boo or in the module. Since its probably in the module there's no point in trying to debug it. ;)

Rant
What actually bothers me is the first half of the message -- that they weren't formally approved. I don't mind in particular that they were removed because the testcases were failing; its my bad for checking in the minor fix without running the unit tests.

But the first half of his message brings to light one of the most irritating things about Boo development. The major reason I stopped contributing code to Boo in the first place was that patches were just kind of dangling on JIRA with feedback from users, but in general ignored by bamboo. My given-when, Doug's given-when, the BOO-1 custom unit patch, Boo.Lang.Useful contributions, ckknight's optimized for-loop, are just kind of rotting as the codebase gradually change and the patches become out of sync.

Its very depressing--a lot of the people that have attached bugfixes to JIRA issues and contributed modules for Boo.Lang.Useful review that have been ignored in general. Nobody wants to write a patch that doesn't at least get looked at; it feels like a bit of a waste of your time, since the feasability of maintaining your own copy of Boo with the patch is very unlikely.

With SVN access, I was kind of hoping I could change some of that by at least working with the Useful contributions, updating the patches and merging the ones that seem the most popular, but if its going to take formal approval then everything is in the same situation it was before.

But, it is bamboo's baby, so the choice on how to handle the situation is ultimately his. I should probably take a bit of a break from hacking on Boo and find something else to do for awhile.

Sidenote: The one majorly annoying things with RTF input forms on a webpage is that you can't press tab and indent text. Tab has been historically reserved for jumping over hypertext elements in a web page, which means that some editors have simply adopted "indent" and "deindent" buttons on the toolbar.

Blogger doesn't have those.

Kinda hoping that the "threat" of XAML/WinFX encourages better user interface design on the web. XUL is nice but aside from the one Amazon.com XUL browser everyone uses to herald The Coming of The XUL, there's not much else using it.

I pine for the day I can press tab while editing a document in a webpage and stuff works like a real text editor.

Friday, March 10, 2006

Boo, life, etc.

Boo!

I got Boo SVN access. My first commit was a feature, BOO-675 I think, basically better delegate adaption. Boo is smarter now.

In .NET 2.0, the Thread constructor has can accept two kinds of delegates. One of them is parameterless, one takes one object as a parameter.

This meant that Boo had ambiugation problems with this kind of code:

t = Thread( { print 'Boo!' } ) because it wasn't sure if the closure was a ThreadStart delegate or a ParameterizedThreadStart delegate. I modified the scoring system so that Boo would check a callable (closure, first class function, etc) compared to any delegates it might match. In the example I just gave you, the scoring algorithm would give higher precedence to ThreadStart instead of ParameterizedThreadStart, since ParameterizedThreadStart takes one parameter, while ThreadStart takes no parameter--and this matches, perfectly, the callable, that does not accept a parameter either.

In the case of t = Thread( { i| print i } ) Boo would pick ParameterizedThreadStart instead, since they both match the best (one parameter!)

I also added the any() and all() functions. BOO-604. Here's a quick self-explaintory sample.

import System
import Useful.Functional from 'Boo.Lang.Useful'
class Vector:
public X as int
public Y as int
static id as int
def constructor():
id++
def constructor(x as int, y as int):
self()
X = x
Y = y
def ToString():
return "Vector #${id}; (${X}, ${Y})"
Above:
get:
return X >= 0
vectors = []
r = Random(DateTime.Now.Second)
gimmie = { return r.Next(-5, 5) }
for index in range(10):
vectors.Add(Vector(gimmie(), gimmie()))

#for the sake of argument let's say this is a videogame.
#we're making sure none of our vectors are in the negative, since that means they're underwater or something.
result = all(vectors).Above
if result:
print 'All vectors above ground'
print result
else:
print 'There are vectors not above ground!'
print 'The following vectors failed.'
print result.Failed
#Let's assume this is a vehicle coordinate system. At least one of the vehicle's vectors has to be above ground
#for it to be working correctly.
result = any(vectors).Above
if result:
print 'At least one vector above ground'
print result
else:
print 'None of the vectors above ground!'
print 'The following vectors failed'
print result.Failed


Here's some sample output.
There are vectors not above ground!
The following vectors failed.
[Vector #10; (-2, 0), Vector #10; (-4, 2), Vector #10; (-4, 0), Vector #10; (-5,
-1), Vector #10; (-5, 1)]
At least one vector above ground
Passed (5): [Vector #10; (3, -1), Vector #10; (2, -3), Vector #10; (2, -3), Vect
or #10; (4, -3), Vector #10; (3, 4)]
Failed (5): [Vector #10; (-2, 0), Vector #10; (-4, 2), Vector #10; (-4, 0), Vect
or #10; (-5, -1), Vector #10; (-5, 1)]

Its a bit more useful in actual practice.

EDIT: oops. You'll notice I made a juvenile mistake with the id. I meant to have a private _id property to go with the static id property, but I got bogged down in tracking down a bug I found in the any/all implementation concerning null values. Tch. Oh well. Go ahead, laugh, jackass.

The upside is that the anyall module is now minus 1 bug. ;)

Dolla Dolla Bills

Haven't gotten much love on the code front, lately. Not surprised--the usual suspects seem to be busy or not in desperate need of a code mercenary. However, the prospect of having to float a resume'--an actual, genuine resume'--on somewhere like Monster.com does not strike a chord with me. Hopefully something comes my way, as I'm not looking to get my fingers into anything seriously long term--I like the short-term hit-and-run kind of stuff, myself.

We'll see what happens.

Saturday, March 04, 2006

Subliminal advertising: YOU WILL HIRE ME.

Yeee haw! Its that time of the month (that was a quick one, wasn't it?)

I'm available, again, for short term .NET-based contracting work.

I'm a very discreet software engineer, as some of you may not know. What it means is, if asked, I'll be sure not to rattle you off as a reference when asked about previous employment opportunities. I understand that, on the Internet, anonymity is preferred in a great number of situations.

As a result of this, though, I've given up on carting a resume' around (never updated the one I had, anyway) and typically like to say that I know what I'm doing when dealing with:

Languages:
  • C#
  • Boo
User interfaces:
  • Windows.Forms
  • wx.NET
  • GTK#
.NET platforms:
  • 1.1
  • 2.0
.NET/relevant technologies:
  • ADO.NET
  • COM interop (RWAR!)
  • XML
  • SQL
  • Sockets
  • Webservices
  • Reflection
  • In general, the requisite technologies needed to build and maintain.NET application.
Misc:
  • I have experience in exposing Boo as a scripting language.
  • I also have minor experience in writing technical documentation, but am confident that I can deliever concise, easy to understand documentation on demand.

and I have dabbled with (and can learn more on demand for)
  • ASP.NET (cavaet: I am /not/ good at making things look pretty)
  • Code Access Security
  • IronPython
Money (The Green):
Typically I charge a flat rate. I like doing this because people can come to me with small problems and not feel like they've been gutted like a pig afterwards. However, if the work is in flux, or you estimate that you'll need X amount of man hours to make the magic happen, I can quote you on some hourly figures if you give me the sufficient information required.

I'm also down with "profitable charity work," like software bounties for your favorite open-source .net applications. I prefer these software bounties to be very precise due to the constantly changing nature of open source projects, and some project mantainers being hostile to patches from strangers. ;)

email / jabber: l33ts0n@gmail.com
My cell is available on request.