sab39 ... Bloghttp://www.sab39.org/
NetReach cmScribe v5.4.123Dear GoogleTue, 20 Nov 2007 11:45:44 -0500http://www.sab39.org/Blog/Blog/12/vobId__406/http://www.sab39.org/Blog/Blog/12/vobId__406/
Software<p>It's nice that you've revamped Gmail's UI. The redesign is slick and addresses several of my complaints about the way things used to work. It seems snappier too.</p>
<p>However, it'd be nice if all of this didn't come at the expense of reliability. I use Chat in Gmail an awful lot, even more than I use it for mail, perhaps. In the older version this was as reliable as it could possibly be given the inherent limitations of running inside a browser. If I lost connection, switched my VPN on or off, hibernated and unhibernated my computer, or generally screwed around with stuff, it never seemed to miss a beat.</p>
<p>In the new UI, what I've encountered so far:</p>
<ul>
<li>It NEVER recovers after hibernate. Anything I type or receive after hibernating is invisible to me until I reload Gmail from scratch.</li>
<li>Frequently I'll get something from a chat as an offline message, twenty minutes or more after it was originally sent. With no indication whatsoever to myself or the person I'm talking to that a message was lost in the first place. And without me ever having gone offline, or appeared so to the other party.</li>
<li>The deal-breaker for me was, in the middle of a conversation, several messages in a row simply disappearing into thin air - as if the person I was talking to hadn't said anything at all. But still showing as present and active through the whole of it.</li>
<li>Thanks for giving me the choice to switch back to the old UI - but it'd be nicer yet if you actually honored my choice! Every time I visit Gmail it switches me back to the new version until I can revert it again.</li>
</ul>
<p>I really wanted to like the newer version. But you need to make it work right first! And in the meantime, don't keep trying to force my hand. I made the choice to switch back for a reason; do you REALLY think that pushing me forward again every time I load the page is going to do anything but annoy me?</p>The good, the bad and the Gutsy, reduxWed, 14 Nov 2007 16:42:28 -0500http://www.sab39.org/Blog/Blog/12/vobId__404/http://www.sab39.org/Blog/Blog/12/vobId__404/
Software<p>I'd been using Gutsy for a few weeks and continued to have problems with it. My experience was so unlike everything I was reading from other Gutsy users - and there were so few reports of similar bugs that I could find in Ubuntu's bug tracking system - that I started to believe I must have hardware problems. This became all the more plausible when I realized that my CPU fan had stopped working a while back - although replacing it didn't help matters.</p>
<p>Once the crashes started to be consistently several times per day, I decided that this was no longer tolerable and asked my boss if a new computer could be spared. He found one that had been lying around, and today I did a clean Gutsy install on it.</p>
<p>WOW. It's like having a new computer. Exactly like that, in fact :) The computer I had before, I suspect, was very underpowered in the CPU department (Pentium III, although I never found out the speed) and had a Savage graphics card which seems to be entirely unaccelerated. The one I have now is hardly brand-spanking-new but it's definitely a step up - a 64 bit AMD processor and an nvidia graphics card of some sort that's considered &quot;nvidia-legacy&quot;. I had some hopes that by installing the proprietary driver (yeah yeah I know :( ) I'd be able to get desktop effects enabled, but apparently not. Still, on the old machine everything from clicking buttons to typing in gmail was sluggish. Long web pages would take forever to load, as if I was on dialup. Now, everything seems to happen immediately, no lag.</p>
<p>So I take back all the criticism I had of Gutsy (although I reserve the right to re-criticize if I discover new issues after using it for more than a few hours :) ). There are a few niggles still - sound doesn't work in rdesktop, no matter what I do. I had to google for a workaround to the fact that installing the proprietary nvidia driver locked me down to 800x600. And we'll see if performance is still good after I get all my music off the old computer's hard drive, because Rhythmbox seemed to be one of the most consistent &quot;machine-killer apps&quot; on the old box. (My quirky choice of gtk theme might not have helped, either. I'll pay $25 for someone to take the old marblegtk GTK1 pixmap theme and turn it into a nicely optimized GTK2 theme, whatever that means[1]. Just getting it to work is easy, but I'm sure it's not ideal for best performance in the GTK2 world).</p>
<p>Anyway. Point is - loving the Gutsy experience now. And getting new hardware is awesome!</p>
<p>[1] I really mean that, but to qualify, you'll have to explain to me what it actually entails so that I can see the difference at a code or .gtkrc level, and understand what's changed and why. Because &quot;hey look, it's faster!&quot; applies to <em>everything</em> on my desktop right now :)</p>O noes, somebody I don't like did something I agree with!Thu, 08 Nov 2007 18:18:52 -0500http://www.sab39.org/Blog/Blog/12/vobId__402/http://www.sab39.org/Blog/Blog/12/vobId__402/
PersonalSoftware<p>I'm not sure what the psychology behind this is, but it seems to be a fairly common reaction. I noticed it today on <a href="http://mjr.towers.org.uk/blog/2007/business#conscoopsw">MJ Ray's blog</a> where - as far as I can tell - he's upset that the Conservative party, whom he doesn't support, are advocating Co-ops, which he does support. (I know that's an oversimplification of mjr's position, but hopefully it's not an outright misrepresentation of it. UPDATE: Ok, yes, I did have his position wrong - see the comments).</p>
<p>I can only presume that it's the same thing that ensures that every time Microsoft does something pro Open Source / Free Software, there'll be a furious post on Groklaw about it.</p>
<p>Or why people who for years have hated the way the MPAA and RIAA treat their creative talent are now annoyed that the Writers Guild of America is standing up to them, because the WGA is a union and unions are baaaad.</p>
<p>I suspect that the temptation to react this way is similar to the temptation to <a href="http://en.wikipedia.org/wiki/Bozo_bit">flip the bozo bit</a> on people. Instead of deciding that the person is an idiot and therefore can't possibly have anything useful to contribute - and so can be ignored - we decide that the person (or group) is evil and anything they do must be outright harmful and must be opposed.</p>
<p>In reality not even a single person is ever completely useless or completely &quot;evil&quot;; <em>everyone </em>will at some point have an idea that's worth considering or an opinion you agree with. And that goes double if there's more than one person involved - any <em>large</em> organization, in particular, will probably have <em>some </em>subgroups that you agree with more often than not. Recognize when you have common ground even with people you normally disagree with. That's a vindication of your ideas, not something to be upset about, surely?</p>
<p>&nbsp;</p>The good, the bad and the GutsyFri, 19 Oct 2007 08:58:50 -0400http://www.sab39.org/Blog/Blog/12/vobId__400/http://www.sab39.org/Blog/Blog/12/vobId__400/
Software<p>So yesterday I upgraded my main work machine to Gutsy. The upgrade finished just as I was leaving last night so I've spent a limited amount of time using it so far, but enough to form some definite impressions.</p>
<h3>The Good</h3>
<ul>
<li>The icons are much nicer. This is especially noticeable in Gaim, which has had a rather radical re-theming. It will take a little getting used to but I already appreciate the improved consistency.</li>
<li>Performance seems better, the display seems less glitchy, and my music (in Rhythmbox) no longer seems to cut out every time I do anything intensive like switch virtual desktops. (My video card driver can't handle the fancy bling though, so I don't have desktop effects).</li>
</ul>
<h3>The Bad</h3>
<ul>
<li>Not related to Gutsy as such but a longstanding pet peeve with the upgrade tool: the estimated download time remaining is based solely on the rate for the last 5 seconds or so of downloading, and this fluctuated for me between 20Kbps and 80Kbps - several times a minute. Would it really be so hard to take into account a rather longer period to get a more realistic estimate? I shouldn't be seeing the time go from 2 hours 30 minutes to just 45 minutes - and back - within a span of 30 seconds.</li>
<li>Also in the upgrade tool - there was a message saying the upgrade couldn't be cancelled once you started it, and then there was a cancel button that remained active during the download phase. I didn't want to cancel, but if I HAD, I'd have been very scared to click that button after being told I couldn't.</li>
<li>My virtual desktops no longer honor the setting that lets me arrange them in more than one row. The setting is still present in the user interface and the value is still saved - but it has no effect on the actual desktops. Since I use Brightside to enable edge-flipping, and frequently flip up and down, that's a BIG usability regression for my setup.</li>
<li>My gdm theme went rather strange. I wasn't using the default, but I was using one of the themes that are <em>installed </em>by default. Those shouldn't break on an upgrade!</li>
<li>I no longer get any kind of visual progress indication during login - just a blank screen until the desktop comes up.</li>
</ul>
<h3>The Ugly</h3>
<ul>
<li>When I arrived this morning my screensaver had activated. Good. And I like the new &quot;leave message&quot; button. HOWEVER, when I typed my password in (perhaps incorrectly), it went to &quot;Checking...&quot; and STAYED THERE. For at least ten minutes. Eventually I Ctrl+Alt+Backspace'd and as expected X died (this isn't exactly a good feature when the screen is supposed to be locked, but helpful in this situation), but it didn't come back up. Ctrl+Alt+F1 to get to a text terminal, login, sudo /etc/init.d/gdm restart ... nothing. In fact the terminal hung and things like Ctrl+C or Ctrl+Z to kill the command were ignored. Ctrl+Alt+F2, login again, sudo shutdown -r now ... same nothing, same hang. Had to hard-reboot. And now I'm rather scared about what happens next time my screensaver activates...</li>
</ul>
<p>I really hope that at least the virtual desktop issue and the screensaver issue get solved quickly! The improved performance and nicer visuals would make this a nice and worthwhile upgrade for me, but those two issues make it a definite downgrade instead. For now.</p>The reinvigoration of Classpath?Fri, 21 Sep 2007 08:47:07 -0400http://www.sab39.org/Blog/Blog/12/vobId__396/http://www.sab39.org/Blog/Blog/12/vobId__396/
JapiSoftware(Disclaimer: I'm just observing all this from the sidelines; my opinion is almost entirely derived from Planet Classpath and the Classpath mailing lists. If I'm wrong on some salient point, please comment and let me know!)<br/><br/>I'm very pleased to see that the Classpath project seems to be picking up some of the steam it lost on the announcement of OpenJDK. I have mixed feelings about OpenJDK itself: on the one hand, Sun did exactly the right thing by releasing the JDK under the best possible choice of license as we'd all wanted for years; on the other hand, I've seen at least two blog entries on Planet Classpath in the past week that were variations on "hooray, the trivial patch I submitted to OpenJDK the week it was released has been accepted a mere three months later!"<br/><br/>IcedTea appears to have picked up some of this slack and last I heard had built a mostly-working Java implementation by plugging in Classpath code to fill the holes in OpenJDK. Haven't heard much about it lately though - has development stalled or are people just not blogging about it?<br/><br/>However, part of me feels that IcedTea is approaching the problem from the wrong end. The code that the Classpath developers have labored over for ten years deserves a higher place than being used as filler to patch the holes in an inferior, ex-proprietary codebase. I'm not trying to argue that Sun's code is "bad" or that Classpath's code is perfect, but I do know that code developed in the bright light of public view, with no schedule pressures other than "when it's right", is invariably [UPDATED: Jeroen points out in the comments that this isn't so invariable after all] higher quality than code developed inside a large, bureaucratic organization with constant pressure to ship to a deadline. The fact that these things have historically affected Java's development is apparent in the public API: public members whose types are nonpublic, public RCSID fields, serialVersionUID fields defined on interfaces.<br/><br/>The difference is apparent in the sheer size of the codebases - the JDK is several times the size of Classpath, despite Classpath providing the vast majority of the same level of functionality. (I'm actually considering sticking with an older version of IKVM for this reason - file size matters when you're building an installer that's being shipped over the network). It's apparent in the fact that Classpath has a clean API for targeting multiple VMs including VMs for which native code is unnecessary, where the JDK's VM interface is internal and relies heavily on native code.<br/><br/>It seems to me that there would be a lot of value in approaching an OpenJDK / Classpath merge in the same way the libgcj and Kaffe merges were approached: compare the code on a class-by-class basis, bring in whichever implementation is best, and change it if necessary to account for things the other implementation did better. My gut instinct says a lot more Classpath code would survive that process than is surviving today in IcedTea - and the end result would be significantly smaller, cleaner, faster and bug-free-er.<br/><br/>I don't know whether the copyright ownership issues have been resolved yet to make it possible to actually pull OpenJDK code directly into Classpath though.<br/><br/>Regardless of what approach ends up being taken, though, it's good to see work happening on Classpath again, and a new release being contemplated. I guess it means I need to get those darn Japi runs happening again though!<br/>UpgradeSat, 09 Jun 2007 16:57:47 -0400http://www.sab39.org/Blog/Blog/12/vobId__382/http://www.sab39.org/Blog/Blog/12/vobId__382/
cmScribeSoftwareMy blog is now running on cmScribe 5.0. This will mean nothing to most people reading this, but it's a big deal to me, because in 5.0 I managed to achieve a whole lot of things that have been goals of mine for cmScribe since before it had a name, and before anyone else who still works at NetReach now was even employed there. Except for Will but he cheated by leaving and coming back.<br/><br/>The upgrade process is fairly seamless but under the hood everything's changed. As well as running on .NET 2.0 (we could run on 3.0, but since the two are identical, why bother?) we're taking full advantage of the new capabilities of the 2.0 version of the framework: every ArrayList and Hashtable in our code has been replaced by a List&lt;&gt; or a Dictionary&lt;&gt; and our custom-coded nullable type wrappers have been replaced by the framework's Nullable&lt;&gt;. Instead of a kludged-together build process, we integrate nicely into Visual Studio's build process using msbuild. We've moved from SourceSafe to Team Foundation internally. And taken advantage of the fact that msbuild and tf are true managed applications by replacing all our hacky vbscript, perl and bat scripts for branching, upgrading and pushing with a single C# application.<br/><br/>The change that's most interesting to me is that in 5.0 we've managed to make cmScribe truly modular. We had something like modules before, but everything got compiled in one go into the same assembly, so there was no way to enforce rules about what code depended on what (except for me going over to people's cubes and saying OMGWTFBBQ at them). We also had a nasty habit of adding customizations to individual customer installations of cmScribe by changing files that were part of cmScribe itself; this was expedient but always caused issues when it came time to upgrade to a newer version.<br/><br/>Today, each module is built separately; dependencies are declared explicitly (and circular dependencies are impossible). And we've added - and enforced the use of - mechanisms to customize the behavior of cmScribe panels by adding extensions to them, rather than changing the original. The extensions typically live in a separate module from the panel being extended, so the base cmScribe modules are used unchanged.<br/><br/>The end result being that cmScribe modules are strictly separated from each other, and customer customizations are strictly separated from core cmScribe code.<br/><br/>Next up: trying to convince the Powers that Be that building a community of developers around some of the cmScribe core modules is possible and valuable and that liberty is the best way to achieve that :)<br/>10 Downing Street responds - "software already unpatentable"Mon, 26 Feb 2007 21:50:33 -0500http://www.sab39.org/Blog/Blog/12/vobId__378/http://www.sab39.org/Blog/Blog/12/vobId__378/
SoftwareAt least, that's how I read the <a href="http://www.number-10.gov.uk/output/Page11077.asp">Prime Minister's response</a>. While there's a degree of weasel-wordage as would be expected from a politician, the gist definitely seems to be anti-software-patent. As opposed to parroting the industry party line of "patents are good for innovation"...<br/>A rant about blind spotsWed, 31 Jan 2007 10:33:08 -0500http://www.sab39.org/Blog/Blog/12/vobId__376/http://www.sab39.org/Blog/Blog/12/vobId__376/
Software<a href="http://tirania.org/blog/archive/2007/Jan-30.html">This post by Miguel</a> articulates very well something that I've been hoping for a long time that someone would say in the debate regarding ODF and Microsoft's OOXML format: that "ODF good, OOXML bad" is a GROSS oversimplification of the situation. Mainly because ever since it's release, ODF has been content to rest entirely on its laurels as the "Open" and "ISO Standard" office file format specification - completely ignoring the fact that on a technical level it just plain SUCKS.<br/><br/>Isn't the Open Source movement supposed to be all about making software that doesn't suck? Isn't Free Software supposed to be about the freedom to FIX problems? Aren't we supposed to be a meritocracy?<br/><br/>A spreadsheet format "standard" that doesn't define formulas? What the hell? How ANYONE with a straight face can claim that the problem of standardizing office file formats is "solved" by ODF and all we need to do is get people to use it, is beyond me. Maybe it's the best starting point - but where's the group working to fill in the glaring holes and get that standardized too? Free Software interprets sucky standards and glaring holes in standards as damage and routes around them... by forming other groups to specify the behavior, or by moving to other standards that don't suck. See WHATWG. See CORBA on the desktop. See XML Schema. Perhaps OOXML is that better standard, perhaps it isn't, but I don't see anyone on the ODF side even admitting there's a problem to be solved [UPDATE: Apparently there is such a group, called OpenFormula, working to fix that particular hole. That's great and I wish them every success, but it's mostly irrelevant to my main point. See the comments for more...] As long as that attitude persists, OOXML has a better chance of being that better standard than ODF does of evolving into it.<br/><br/>We take pride in the fact that our licenses will never discriminate against any person or organization or field of endeavor. Any licence that passes the DFSG or OSD is GUARANTEED to ensure that the software may be equally used by an evangelical Christian group or an abortion clinic or a gay rights group or a pornographer, by the United States government or by islamist extremists, by the EFF or by patent lawyers, by pacifists or by the military, by spammers or by antispam organizations... I could keep going, but you get the idea. But this isn't just a minor point, this is the CORNERSTONE of what Free Software is all about. Freedom means nondiscrimination. Including against people we as the developers of the software find distasteful.<br/><br/>So why is it that we make a point to treat pornographers, extremists, spammers, and even evangelicals ( ;) ) with fairness and equality, but the moment Microsoft is mentioned we forget all about that freedom and fairness and meritocracy, and immediately object vociferously and almost unanimously, EVEN when what they're doing is RIGHT?<br/><br/>Why is it that Groklaw, the site that earned a reputation for fairness and objectivity by making a point to give SCO's claims every possible benefit of the doubt and patiently examine every one of their claims including any time there was the ghost of a chance they might have some semblence of a real point - why is it that Groklaw had a fit when someone wanted to submit a Microsoft license to the OSI for evaluation, when by all accounts the license in question DOES pass the OSD and DFSG?<br/><br/>Why is it that Groklaw reported the MS-Novell deal with the headline NOVELL SELLS OUT - long before there was ANY chance for ANYONE to have examined the nature of the deal to know whether it was actually problematic or not? Why are otherwise reasonable people like Bruce Perens claiming that Novell is the next SCO, when it's completely obvious that Novell's lawyers simply made a mistake and are working with a perhaps intransigent group of MS lawyers to figure out a way to fix the problems? Even one of MS's lawyers has come out and said this outright.<br/><br/>So why are we vilifying Novell and treating them as outcasts, rather than recognizing that they, like IBM with patent lawsuits, like Sun until very recently with their Java licensing, like Canonical with binary drivers, and even I'm sure like Red Hat although I can't think of a blatant recent example - are a company that does a lot of good things but have made a bad decision?<br/><br/>And why are we treating Microsoft as the embodiment of pure evil rather than a company that does a lot of bad things but in the case of OOXML is actually doing the right thing - coming up with a file format that is by all accounts a vast IMPROVEMENT over ODF, is freely licensed including patents, independently implementable, doesn't have any HUGE GLARING HOLES in it, is actually documented and specified in detail, and being submitted to ISO for standardization.<br/><br/>Yes, there are problems with OOXML. It's stupid to standardize options for backward compatibility with old proprietary software when you've gone to all this trouble to invent an extensible format with all sorts of ways to embed extra proprietary information. Using that extensibility to support the legacy crap should be a no-brainer, and I hope this will be fixed in the ISO comments period. I'm sure there are other issues too. Maybe lots of them. But at least it's (almost) fully specified, open, and freely implementable - of which ODF manages only two out of three.<br/><br/>If you want a child to learn good behavior, it isn't enough to point out and punish the bad behaviors. You have to point out and reward the good ones too. It's well established that rewarding the good behaviors has a vastly greater effect, in fact. And punishing the GOOD behaviors is OBVIOUSLY counterproductive. Microsoft obviously isn't going away any time soon; to ignore them or think we can make them irrelevant is delusional. If we ever want them to be a good citizen, if we ever hope for them to become a productive MEMBER of the Free Software community, we should be pointing out the - perhaps small and rare - good things they do and making a HUGE deal about them.<br/><br/>I'd bet quite a large sum of money that in ten years time Microsoft will be the largest producer of Free Software in the world; that Windows and Office will both be released under Free, Open Source, DFSG-compatible licenses by that time. We can bring that day about sooner by working with the elements within Microsoft that are pulling in the same direction as us, or we can delay it by treating Microsoft as the enemy which only strengthens the elements within Microsoft that think of US that way. I know which future I'd rather see.<br/><br/><br/>As a footnote: Microsoft just released the ASP.NET AJAX client libraries under a DFSG compliant license. I don't know if that will be the first package in Debian main with Microsoft as the upstream, but I am completely sure it won't be the last...Dear LazywebSat, 04 Nov 2006 20:14:48 -0400http://www.sab39.org/Blog/Blog/12/vobId__332/http://www.sab39.org/Blog/Blog/12/vobId__332/
SoftwareAnyone know of a good Jabber client library for Java (that works with Free implementations) or C# (that works with Mono) - and, more significantly, some clear understandable sample code for said library to implement a bot that can talk to people and react to things said to it, and respond to their presence or absence?<br/>Gmail + TalkThu, 09 Feb 2006 20:50:56 -0500http://www.sab39.org/Blog/Blog/12/vobId__296/http://www.sab39.org/Blog/Blog/12/vobId__296/
SoftwareI'm annoyed at Gmail today.<br/><br/>Its new integrated chat feature is quite possibly the killer app that will drive adoption of Google Talk, which up until now has been fairly uninspiring compared to the other networks, mainly because it didn't have any compelling features and everyone you might want to talk to is on one of the other networks already. Or to put it another way, it was missing the single most important feature of an IM network - users.<br/><br/>But since half the world has Gmail accounts these days, Google Talk just inherited a whole bunch of users for free. And running inside your browser window that you already have open for mail is a pretty compelling user interface benefit too: no client to install and available anywhere with net access. I was really looking forward to trying this out.<br/><br/>With all these advantages, why am I annoyed? Well, because <a href="http://mail.google.com/support/bin/answer.py?answer=33504&amp;topic=8405">Gmail's chat features don't work over https</a>. Why? It's not like advanced dynamic AJAX functionality can't work over https, because Gmail itself does. This means I have to choose between the convenient in-browser chat interface and the security of ensuring that my password and cookie aren't being sent in plaintext. Especially since they encourage me to store my entire chat history in my gmail account, I'd think they'd understand the value of having a little security to go with that. For now I've decided I'll do without the chat. And that hurts Google more than it hurts me, because the thing they need most is passionate users...<br/><br/>Oh, and <a href="http://www.anotherdiaper.com/">Janene</a>, dear, I hope this counts as not <a href="/Blog/Blog/12/vobId__294/">sounding like binary or leet speak</a>. If it's still too technical for you, I suppose I could blog about your new DVD instead?<br/>Things that just should existTue, 31 Jan 2006 09:37:42 -0500http://www.sab39.org/Blog/Blog/12/vobId__294/http://www.sab39.org/Blog/Blog/12/vobId__294/
Software<p>The <a href="http://www.ikvm.net/faqdoc.html">IKVM FAQ</a> says that one of the main reasons for its existance is that it "just seems obvious that something like this should exist". That phrase struck a chord with me because I completely agree - if it <em>didn't</em> exist, I have the impression that the universe would have a distinctly IKVM-shaped hole in it.</p>
<p>In the last couple of weeks I've been working on a couple of possible small features (coincidentally, <em>for</em> IKVM) which leave me with the same impression.</p>
<p>The first one I only implemented a tiny fraction of - which happens to be the exact tiny fraction I need.</p>
<p>Some background: nrdo (which I run through IKVM) connects to your database at compiletime and creates your tables for you. However, since it's a Java program, it does that through JDBC, which isn't ideal if you're working on a .NET project for several reasons. Firstly, you need an IKVM-compiled version of the JDBC driver for your database. If your database (and driver) are proprietary, this constitutes a modified version of proprietary code and is therefore probably illegal to redistribute. Secondly, you need to specify your database connection information twice, once as a JDBC URL for use at compiletime, and once as an ADO.NET ConnectionString for use at runtime. And thirdly (at least if SQL Server is your database), the JDBC driver requires you to enable TCP/IP connections, while the ADO.NET provider can use some magic Windows protocol which can be better in various ways from a security standpoint (unlikely as that sounds).</p>
<p>So what I implemented was an implementation of the (very few... okay three) JDBC functions that nrdo actually calls, implementing them using ADO.NET underneath. Just stick "jdbc:sharp:System.Data.SqlClient:" in front of your ADO ConnectionString and you have a JDBC URL for the same database, as long as you don't want to do anything overly complicated like, I dunno, getting any results back from your queries.</p>
<p>This definitely seems like "something that just obviously should exist", but since it met my immediate need I don't have any time or motivation to add the other 99% of the JDBC driver API. I offered it to Jeroen for inclusion (and possible further development) as part of IKVM proper, but he (reasonably enough) doesn't want perpetually unfinished code rotting in his CVS repository. From his email (quoted with permission):</p>
<blockquote>I have had the opposite (an ADO.NET wrapper for JDBC drivers, written by
Mainsoft) sitting in my mailbox for a long time. It would definitely be
nice to include both of these, but realistically, I don't have time to
maintain them (which is why I never got around to doing anything with
the ADO.NET wrapper) and I don't want to put them in cvs just to sit
there and rot away.</blockquote>
<blockquote>So, yes I'd like it, but you'd also need to volunteer to maintain it ;-)</blockquote>
<p>So if anyone has the need, interest or motivation to maintain and finish that code, there's a JdbcSharp-shaped hole in the universe waiting for you ;)</p>
<p>The second hole in the universe I'm trying to fill is something I noticed the very first time I ever used IKVM. I immediately wrote a comment on the IKVM blog about <a href="http://weblog.ikvm.net/CommentView.aspx?guid=e9b34df7-3efd-4675-a5fa-82167a41696a">how schizophrenic it seemed</a> to be writing code in C# that looked like this:</p>
<pre>for (Iterator i = myList.iterator(); i.hasNext(); ) {<br/> object o = i.next();<br/> ...<br/>}<br/></pre>
<p>It's marginally weird working with Java APIs through IKVM in general because they adhere to a different naming convention than other .NET APIs, but you can at least pretend the author just didn't read the Framework Design Guidelines. And if you're working in an IDE you don't even need to change the way you type - the casing will be corrected for you. But the moment you need to deal with any kind of Java collection you slam into a mental speedbump - you can't get at the data in the list in any way that any .NET programmer would <em>ever</em> think of. You have to switch gears and - for all practical purposes - write two lines of Java code in the middle of your C# program.</p>
<p>Congratulations, you just hit a foreach-shaped hole in the universe.</p>
<p>So I've been working with Jeroen to figure out what would be necessary to make C# foreach (and VB "For Each") work on Java collections when exposed through IKVM. We've got the code working to the extent that this code works:</p>
<pre>java.util.ArrayList list = new java.util.ArrayList();<br/>foreach (object o in list) {<br/> ...<br/>}<br/></pre>
<p>But this code doesn't:</p>
<pre>java.util.List list = new java.util.ArrayList();<br/>foreach (object o in list) {<br/> ...<br/>}<br/></pre>
<p>because the extra mapping is only done on classes, not interfaces. Stay tuned: I'm also planning on tackling the other direction (which is harder), so that if you have a 1.5-compatible Java compiler you'll be able to do:</p>
<pre>cli.System.ArrayList list = new cli.System.ArrayList();<br/>for (Object o : list) {<br/> ...<br/>}<br/></pre>The Unix philosophy of Lego bricksWed, 26 Oct 2005 20:56:45 -0400http://www.sab39.org/Blog/Blog/12/vobId__280/http://www.sab39.org/Blog/Blog/12/vobId__280/
cmScribeSoftware<p>As a child I spent an inordinate amount of time playing with Lego (was
it just me or did anyone else invent names for the bricks? I had
Long-ers, Square-ers, Tippees, Flat Tippees, Very Flat Tippees, Tipping
Up Tippees...) The fact that a tubful of basic components could become
the most fabulous spaceship I was capable of imagining had a huge
influence on me and was probably a large factor in why I became a
programmer.</p>
<p>I really think I'm onto something with cmeScribble but I've had a
hard time coming up with a way to explain exactly <em>what</em> I think I'm
onto. Part of that is because, obviously, I'm writing largely for an
audience that isn't familiar with cmScribe, the philosophy it tries to
embody, the strengths of its approach or the limitations we're starting
to hit. Perhaps I should let my ten-year-old self explain by analogy.</p>
<p>We needed a powerful layout system so we came up with <a href="http://www.lego.com/">Lego</a>.<br/>
Then we needed flexible hierarchical navigation so we built in <a href="http://www.lego.com/eng/preschool/duplo.asp">Duplo</a>.<br/>
Then we needed some place to put the content so we made a <a href="http://www.geocities.com/jaapsch/puzzles/magic.htm">Rubik's Magic</a>.<br/>
We built an eCommerce system out of <a href="http://www.meccano.com/">Meccano</a>.<br/>
We built a document repository out of <a href="http://www.amazon.com/exec/obidos/ASIN/B00005BY2A/102-9284484-5540966">Rubik's Snakes</a> (those were great, weren't they?)<br/>
We made a general-purpose form builder out of <a href="http://www.megabloks.com/">MegaBloks</a>.<br/>
We made a permissions system out of whatever that cool thing was that
had all the translucent octagonal pieces with slots in the sides.</p>
<p>And every time we add a new feature we get a different type of construction toy to make it out of.</p>
<p>We've done a good job of making all these things work together. To
display products in the nav we built an adapter that allowed Meccano to
attach to Duplo. We built adapters so that octagons could be attached
to anything. We built adapters to connect Meccano to Rubik's Magic. We
built adapters and adapters and more adapters.</p>
<p>What we've ended up with is something that's extremely flexible and
powerful, but in doing so we've solved the same problem lots of times -
making one kind of toy talk to another, or making one toy appear as if
it's a different kind of toy, or solving a problem for one kind of toy
that was already solved for one of the others (notably, our
Rubiks-Magic search is entirely separate from our Meccano search).</p>
<p>The idea behind cmeScribble is "what would happen if we just did it all with Lego<sup><a href="#legoFootnote">[1]</a></sup>?"</p>
<p>The Lego philosophy and the Unix philosophy have a lot in common. In
cmScribe we got the bit about "Do one thing and do it well" right,
whether the one thing is "match a regular expression" or "be two by
four, full height and red" or "display a product list". But just as
important, if less expressable in a pithy slogan, is that the reason
Lego and Unix work as well as they do is that every part has a common
interface. In Unix it's the plain text file with each line representing
some kind of value. In Lego it's the little round bump and the little
bump-sized hole. In both cases the power comes from the fact that any
piece's bumps can attach to any other piece's holes without having to
create a custom Long-er-To-Very-Flat-Tippee-Adapter.</p>
<p>In the next thrilling installment: What do I propose as cmeScribble's little-round-bump-equivalent?</p>
<p><a name="legoFootnote"><small><sup>[1]</sup> Lego is, after all, the One True Construction Toy and MegaBloks can bite my small cuboidal plastic butt ;)</small></a></p>Are you mocking me?Mon, 24 Oct 2005 21:20:02 -0400http://www.sab39.org/Blog/Blog/12/vobId__278/http://www.sab39.org/Blog/Blog/12/vobId__278/
cmScribeSoftware<p>Before I wrote a line of code for cmeScribble I decided that I'd code
it the right way. Retrofitting "right-way-ness" onto an existing
project is almost impossible, so I was determined not to miss the
chance to build it in from day one.</p>
<p>The particular "right way" I had in mind was using Test-Driven
Development, or TDD. For anyone unfamiliar with the TDD methodology,
the idea is that before you write any code or fix any bug you first
write a test or two to make sure the code works or the bug is fixed.
The test should fail when you first run it, because the code <em>doesn't</em>
work and the bug <em>hasn't</em> been fixed. Once you've written the test and
verified that it fails, <em>then</em> you write the code to make it pass.</p>
<p>The advantages of TDD are well-documented elsewhere, but in a nutshell:
writing the test forces you to know in advance exactly what you want
the code to do, and also as you develop more and more code you have a
library of tests to make sure you don't break anything.</p>
<p>I could easily see how to write tests for self-contained functions, but
I couldn't figure out how to write tests for user interfaces or
database-backed logic. Since cmeScribble is all about building user
interfaces from database data, this posed something of a challenge.
Maybe I can get away without testing the UI layer, but I can count
features that won't need database data in some way on the fingers of
Captain Hook's right hand. Okay, I thought, Google to the rescue... but
searching for databases and TDD provided lots of people with similar
issues and no straightforward answers.</p>
<p>A common suggestion was to use "mock objects". The idea is that you
create a "fake" version of your database layer which returns plausible
values without actually needing a database. This solves the problem but
the downside is that you have to actually <em>write</em> the mock version of
each database table, and since cmScribe has over a hundred tables at
last count<sup><a href="#mockFootnote">[1]</a></sup> I didn't relish that thought much either.</p>
<p>Facing a potential deal-breaker for something you don't want to
compromise on tends to focus the mind, and eventually I hit on a
solution. A full SQL database is hideously complex, but cmeScribble
will be doing it's database access through nrdo (I'm biased, but I
honestly don't see how people can work any other way...) and for 99% of
uses, nrdo provides a fairly simple object model over the top of the
database. Simple enough that if you don't care about persistence (which
in a test situation is actually a bad thing) or performance, it's
possible to implement the vast majority of it very simply in memory, as
part of the nrdo runtime library and generated code, backed by simple
List&lt;T&gt;s. A couple of days of hacking later and that's exactly
what I've now checked into nrdo's CVS: If you use the C# 2.0 template
and set the configuration setting "NrdoMock" to "True", all your code
will run purely in memory, with a clean "database" for each run.</p>
<p>There are a few things missing - at a wild guess I'd say it covers 60% of
what you'd want to do right now, and I should be able to get that up
to about 90% without too much trouble by filling in things as I need
them (after writing tests!). Most of the rest can't be handled
automatically (because they'd require a full SQL engine in the mocking
layer) but can be done with a little manual intervention (by the
programmer providing a C# equivalent of the SQL clause in question; the
SQL clause itself doesn't get tested but all the logic around it does).</p>
<p>The most satisfying part of the whole thing was watching it pass the tests I'd prepared in advance :)</p>
<p><a name="mockFootnote"><small><sup>[1]</sup> cmeScribble will have a lot less because of the "enterprise"
features that aren't being included and also hopefully by unifying lots
of things that were separate tables in cmScribe, but still.</small></a></p>cmeScribble - coming soon!Fri, 21 Oct 2005 23:28:08 -0400http://www.sab39.org/Blog/Blog/12/vobId__276/http://www.sab39.org/Blog/Blog/12/vobId__276/
cmScribeSoftware<p>Last night I came up with the seed of a way to implement some things in
cmScribe (the CMS that I work on as a day job and happens to run
my website too) that I've wanted to do for ages but not known how - and
get a bunch more cool features that I never even thought of before for
free. That was the good news. The bad news was that the ideas are a
radical departure from the way cmScribe works now and would require an
almost complete rewrite - only a few pieces of code could be salvaged
anything like intact. It's taken us three years of team development to
get cmScribe to where it is now - which is, in my not-entirely-unbiased
opinion, a pretty good place in lots of ways - so the idea of throwing
all that away and starting over based on a mad programmer's wild and
unproven blue-sky ideas was probably not something I could sell to the
boss ;)</p>
<p>(Basically, the entire architecture of cmScribe today revolves around
building templates and pages out of building blocks that we call
panels. The idea I had leaves no concept of a panel left at all, and
templates and pages don't have any independent existence but just
become particular ways of combining lower-level ideas...)</p>
<p>But I think I found a way to turn the bad news to my - and NetReach's,
and maybe your - advantage. Because it <em>does</em> mean a complete rewrite,
there's no need to use any existing cmScribe code to implement it. So I
suggested to my boss that I'd be happy to work on this in my own time
as a hobby project / technology testbed, and wouldn't it be cool to do
it as an Open Source project? As a hobby project it wouldn't even
attempt to provide the "enterprise" features that cmScribe does, but if
it successfully proves the concept, it would also be possible to use it
to rebuild those enterprise features and get a next-generation cmScribe. My boss agreed.</p>
<p>So without further ado, I give you...<br/>
<img src="/SiteData/images/cmeScribble/1aef84fe53fe399ea96e880afaa6ed9e/cmeScribble.png" alt="cmeScribble" border="0" height="40" width="220"></p>
<p>Well, actually, I don't, because all cmeScribble is right now is a
logo, a pronunciation (see-me-scribble!) and some partly-formed ideas.
There are parts of the design that are defined as being done "by
magic". And while some incredibly rich and powerful scenarios are
enabled by this architecture, I'm a little fuzzy on how to implement
obscure things like, say, pages.</p>
<p>When I have some code (I've started, but I don't want to release until
it can do something that at least gives a hint of the power to come)
I'll put it online for people to try out. In the meantime I'll blog a
bit about the process by which I arrived at the new design, where I
think I'm going with it, and why you should care. Or at least give you
enough information to decide that in fact you don't ;) As I write more
about the ideas I have I'll also be interested in feedback on whether
what I'm doing makes sense, whether there are important scenarios it
misses, and what I could do to make you interested in using it.</p>
<p>Ok, at this point I'm announcing vaporware. Sorry; I'm excited about
this and don't have the discipline to wait until it really works.
Besides, I've noticed that when I see an announcement of a new project,
if it's provided as a <em>fait accompli</em> with lots of code and
documentation, I'm not terribly likely to invest the time to delve
through all that to learn what it's all about. If someone on one of the
planets I'm subscribed to introduces their project over a series of
blog posts, though, I find myself learning quite a lot about the
project - and maybe wanting to use it - without feeling like I've
invested any time or effort at all (after all, reading blogs is what
you do to <em>avoid</em> putting effort into something else). If I cmeScribble
can benefit from that effect in others, everyone wins.</p>
<p>Oh, and I guess I have to say that it's very Web 2.0. I'm not sure
what that means except that all the cool kids are doing it these days.
As far as I can understand of what that particular meaningless buzzword
means, though, it does actually fit.</p>My compiler is psychic...Tue, 20 Sep 2005 22:35:25 -0400http://www.sab39.org/Blog/Blog/12/vobId__258/http://www.sab39.org/Blog/Blog/12/vobId__258/
Software<pre>C:\projects\japitools\src&gt;jikes -d .. net\wuffies\japi\*.java<br/><br/>Found 1 syntax error in "C:/projects/japitools/src/net/wuffies/japi/Japize.java":<br/><br/> 955. if (i != index &amp;&amp; excps[i] is ClassType &amp;&amp;<br/> &lt;&gt;<br/><br/>*** Syntax: instanceof expected instead of this token<br/><br/>C:\projects\japitools\src&gt;</pre>
<p>Talk about friendly error messages! How did it know? Does jikes encounter confused C# programmers often?</p>C# 3.0Tue, 13 Sep 2005 16:51:29 -0400http://www.sab39.org/Blog/Blog/12/vobId__252/http://www.sab39.org/Blog/Blog/12/vobId__252/
Software<a href="http://msdn.microsoft.com/vcsharp/future/">C# 3.0 looks like it will be really really cool</a>. That is all.<br/>
<br/>
(Although I'm sure I'll have <span style="font-style: italic;">much</span> more to add once I go over the specs in more detail and think about them a bit...)<br/>Nullable Victory!Fri, 12 Aug 2005 11:14:31 -0400http://www.sab39.org/Blog/Blog/12/vobId__244/http://www.sab39.org/Blog/Blog/12/vobId__244/
Software<p><a href="http://blogs.msdn.com/somasegar/archive/2005/08/11/450640.aspx">Microsoft are going to fix Nullable Types for VS2005!</a></p>
<p>This is fantastic news - I suspect my feedback may even have played a role in this decision for them, which is pretty cool :)
</p>
<p>
Needless to say, I'm thrilled. Now if only they'd do the same thing for web projects, but that's a rant for another day...
</p>
<p><strong>Update:</strong> Wow, looks like I <a href="http://blogs.msdn.com/cyrusn/archive/2005/08/13/451206.aspx">suspected right</a>! That's quite an ego boost ;)</p>Updated NRobot and DAThu, 07 Jul 2005 20:44:53 -0400http://www.sab39.org/Blog/Blog/12/vobId__213/http://www.sab39.org/Blog/Blog/12/vobId__213/
SoftwareThe version of my NRobot entry I previously posted had a little flaw -
if (due to security restrictions or any other reason) any robot teams
fail to load, it turned into a very complicated
spin-in-a-circle-and-do-nothing bot. That scenario happened in the
default configuration, because LatteBot is prohibited from running by
the security sandbox. <a target="_blank" title="DA.zip" href="/SiteData/docs/DA/8ce251bd8a7820916c002c31ef5be1bd/DA.zip">This version</a> has the bug fixed.<br/>
<br/>
I also uploaded a new version (0.21) of NRobot, to fix a few
compilation issues on Linux and push some other minor tweaks that have
been made since 0.20. This doesn't include the 3D frontend - I belive I
need to reimplement Microsoft's Mesh3DObjects sample class, because it
comes with no explicit license, before I can release that. Even if it
had been included, you'd need the WinFX alpha toolkit and the .NET
framework 2.0 beta to run it anyway.<br/>
<br/>
Anyone want to try implementing a 3D frontend using OpenGL or some other freely-implemented API instead?<br/>
I feel dirtyWed, 06 Jul 2005 18:49:34 -0400http://www.sab39.org/Blog/Blog/12/vobId__211/http://www.sab39.org/Blog/Blog/12/vobId__211/
SoftwareI believe in Open Source for technical reasons, but I also believe in
Free Software for ethical ones. I make a point not to choose one of
these philosophies over the other, but instead to emphasise how great
it is that the same rules - epitomized by the DFSG or OSD - are worth following for two entirely different reasons.<br/>
<br/>
Anyway, while I don't always live up to the goal of never using
non-free software, when programming for personal reasons I have at
least aimed for the goal that there should be a not-so-distant prospect
that what I write can run on an entirely Free system.<br/>
<br/>
Thus when I wrote nrdo, its initial versions may have depended on Java
and Oracle, but I was entirely confident that Classpath and company
would eventually be able to run it, and that a Postgres backend could
be developed (both of these happened). When I ported it to C# it was
(quite apart from being necessary for my job) under the assumption that
it would run under mono in the near future (it does, as far as I know,
although it's been a long time since I tested it and mono has changed a
lot since). <br/>
<br/>
When I wrote NRobot, running under mono was a primary goal, although I test it less often than I would like.<br/>
<br/>
Even cmScribe, which is proprietary software that I'm paid to work on,
I fully expect to be ported to mono and Postgres eventually (if only
because it will make our company's story about hosting cheaper - no SQL
Server license required!).<br/>
<br/>
But I've succumbed to temptation and written something that has no
prospect of running on a free system anytime soon. Apparently Microsoft
has said that it does not believe it's possible for the mono project to
clone its new Avalon GUI toolkit and Indigo messaging system without
licensing some "Intellectual Property" from them, and apparently (at
least in the case of Indigo) the mono people have accepted this and are
not currently planning Avalon or Indigo clones.<br/>
<br/>
Which is a shame, because it means that I've violated my principle of
only doing stuff which will ultimately be runnable on Free systems, and
means that mono users won't be able to see this:<br/>
<br/>
<img title="nrobot3d.png" alt="nrobot3d.png" src="/SiteData/Images/nrobot3d/f789c6a2f0afb2319894130f47f78b4e/nrobot3d.png" border="0" height="306" width="517"><br/>
"Wa Eebots Peas!"Thu, 19 May 2005 14:19:15 -0400http://www.sab39.org/Blog/Blog/12/vobId__206/http://www.sab39.org/Blog/Blog/12/vobId__206/
SoftwareI finally got around to bundling up the last few months worth of work on <a href="http://home.gna.org/nrobot/">NRobot</a>,
checking it in and calling it a release. There are a bunch of new
features, but the most important is that if you're running under .NET
robots are run in a sandbox - they are no longer given complete control
over your system. This means that it's actually reasonable to download
a robot written by someone you don't know or trust, and attempt to
shoot the crap out of it - as long as you don't pass the "-insecure"
option on the command line.<br/>
<br/>
Another significant improvement in 0.20 is that it now ships with a
sample robot written in Java. This isn't actually an improvement in
NRobot at all, but an improvement in IKVM. As of IKVM 0.14 it is now
possible to apply custom attributes to Java code, which was the only
remaining feature required for use in NRobot. So at last I'm posting
something on my blog that's actually vaguely on topic for Planet
Classpath ;) All you Java programmers, go download it and start writing
robots ;)<br/>
<br/>
Unfortunately there are a couple of catches.<br/>
<br/>
Currently Mono's security support is not complete enough for me to
confidently guarantee your safety if you are running untrusted robot
code in it. Work is ongoing on adding this support and I'm confident
that it will eventually be safe, but if you're running NRobot under
Mono today, I recommend using a user account with restricted
permissions.<br/>
<br/>
The other big catch is that IKVM can't currently generate code that
will run inside a sandbox. Jeroen has done some work proving that this
isn't impossible in theory, but will require very careful auditing of
IKVM code to be certain that no security holes have been introduced. So
for now, you must pass the -insecure option in order to run robots
written in Java - in which case you again ought to run NRobot under a
user account with restricted permissions.<br/>
<br/>
Oh, the other big improvement in 0.20 is a feature that was actually
requested - the ability to fine-tune the strengths and weaknesses of
your robot. You can adjust 8 different properties (roughly categorized
into 4 offensive and 4 defensive) to be either "better", "worse" or
"neutral", but you must be sure that your choices balance out. That is
to say, for every property you make better, you must make another one
worse.<br/>
<br/>
Here's <a target="_blank" href="/SiteData/docs/da/e6159f9fa2f8df03eff288ff23a1e352/DA.zip">my own robot DLL</a>. Unzip it into the Bots/Win or Bots/Mono
directory (as appropriate) of your NRobot installation. Naturally,
unless you trust me implicitly, you shouldn't do this if you're running
under Mono or with the -insecure flag unless you've taken other
precautions to safeguard your system.<br/>
<br/>
So what the heck does "Wa Eebots Peas!" mean? Well, Alexa loves
watching games of NRobot play themselves. If she sees me working on my
laptop, she'll come over, stare at the screen, and say her best
impression of "Want Robots Please!".<br/>