Resurgence
It's starting to look like a board game renaissance. Can Smalltalk be far behind :)
It's starting to look like a board game renaissance. Can Smalltalk be far behind :)
One of the things a lot of people get wrong is user spikes. Whether it's spike in downloads of a product, or a spike in traffic, a lot of people will tout the sudden increase as if it matters. In reality, as this post makes clear, it usually doesn't:
Josh Kopelman has a perfect post up today called 53,651. This is the number of RSS subscribers to Michael Arrington’s great TechCruch blog, and is exactly at the core of the “first 25,000 user” issue. Since there are 53,651 RSS subscribers of TechCrunch (at least as of 5/12/06) , if something gets reviewed there, it’s likely to get 5,000 to 10,000 users in the next 24 hours “just to try it out.” As so many traffic graphs of these “TechCrunched” products show, there is a huge spike in use for a day or two, and then it goes right back down to where things were before they were TechCrunched.
There's a nice chart that goes with that; follow the first link to see it. As most of you know, a post I made last week hit Digg, Reddit, and Slashdot - and gave me a sudden flood of traffic. That flood didn't last - it's not as if every reader of those sites suddenly became fascinated by Smalltalk :) I know plenty of marketing people who would make sure to include that spike in a report on traffic averages thoug, in order to make themselves look better. It's no more real than the initial spike in users described above.
If you're trying to build a new business, those mentions help, but they won't put you into "lie on the couch and wait for the orders" mode...
It's often the case that management - and in particular, VC management - spend way too much time focused on irrelevant details. For instance, Thomas Gagne writes:
Too many potential investors spent too much time looking at the technology. The answer was always the same: lots of scalability, too little system documentation. The technical due diligence reports would often comment about the Smalltalk in the "risks" section something like, "Using Smalltalk may make it difficult to find programmers, but by using it they won't need many anyway."
Why is the worry about technology use irrelevant? Either the startup being funded has a good product or they don't. If they engage in a long effort to rewrite it in an "approved" language, they'll almost certainly miss whatever market window they are going after. The phrase Thomas used next is very telling:
Many of those VCs don't exist anymore.
I rather expect that a lot of them "managed" their startups into oblivion by asking them to do stupid things. To follow the story:
When we finally found some real investors I was surprised they didn't seem too interested in the technology. They wanted to know it worked. They wanted to know it balanced. They wanted to know the president had confidence in it and me. After they understood the business plan and what the company was preparing to do I really don't think it mattered much to them what the code was written in. They weren't buying into language marketing or hype, they were buying into a commercial finance revolution. The system could have been written in 16-bit Fortran-IV and they wouldn't have cared as long as it was supportable, scalable and correct.
Couldn't have said it better myself. This reminds me of something that came up many years ago, back before Java was around. I was teaching a Smalltalk class with Russ Pencin, who is one of the two best instructors I've ever met. We had a C programmer in the class who really, really wanted to know how strings were implemented at the VM level. Russ' answer was brilliant:
Why do you care?
Why indeed? If the system performs well, what difference does it make? The same goes for funding, really - training developers in a language they don't know already isn't that hard. If it was, C++, Java, and C# never would have succeeded. Sure, the syntax is similar - but they don't really work like C. If it was that hard to train developers, we would all still be using Cobol and Fortran, for that matter.
Thomas also quotes Paul Graham - and this is one of the smartest things I've ever read:
"In a big company, you can do what all the other big companies are doing. But a startup can't do what all the other startups do. I don't think a lot of people realize this, even in startups."
If all you strive for is mediocrity, then sure - hire cheap developers and use what everyone else is using. If you want the chance to do better, you have to be different.
Brad Wilson on starting the day:
I don't know about you, but I sure don't read the newspaper any more. It's a stale version of information compared to what I can get 24 hours a day from the web. And, letting someone else pick my comics? Never!
I start my morning with a bowl of cereal and my comics. On the web, of course!
heh. I go the extra step here - I created scrapers for the various comics I like that don't show easily via RSS, and create local (i.e., on my HD) RSS feeds for them. I have a BottomFeeder plugin that periodically runs the scripts, and each day I have all the comics I want, right there in my aggregator.
James Governor likes the usage numbers being reported for Sun's app server software:
Go buy some stock? The evidence is coming together in some interesting ways.... and if Sun's Java Enterprise System app server has momentum, anything can happen.
In the accompanying data, Sun's market share has jumped up to almost 20%, which does look good. However, that may not mean much revenue:
Download a complete enterprise-class solution -- Solaris 10, Java Enterprise System, development tools, desktop infrastructure and N1 management software -- at no cost, no kidding.
You only pay if you want support. There was an article on the uptake of support licenses for JBoss awhile back, and it wasn't encouraging:
Problem is, most people just take the free stuff and run. Only 3% to 5% of JBoss customers buy support contracts.
Which is one of the reasons that JBoss ended up selling out to RedHat - the ongoing development costs simply weren't being met by those paltry incomes. So let's look at the app server and OS for Sun, shall we? Schwartz has made Solaris free and open source, and championed it running on x86. So even if I decide to run Solaris instead of Linux, I still don't need to pay Sun a nickel. The same goes for the app server. This is the ideology of free masquearding as a business plan, and I doubt that it will end up happier for Sun than it did for JBoss.
If you give it all away for free, you can't make it up in volume.
In the same vein as the last post, I thought it might be valuable to go over the way Smalltalkers normally construct new execution at runtime. One way, as I covered in my last post, is to compile code from a string. All by itself, that gives you a fair bit of power - you can compile anything, including new classes. You can add new instance variables to existing classes, and have all the subclasses get recompiled for you - at runtime. When I do live updates of this server, I'm often doing just that.
So a few examples - say I wanted to add a new instance variable to an existing class. I could do that a couple of ways. I could recompile the class definition. Here's my class in the browser before that step:
Now, I execute the code below:
Compiler evaluate: 'Smalltalk defineClass: #Foo
superclass: #{Core.Object}
indexedType: #none
private: false
instanceVariableNames: ''var1 var2 ''
classInstanceVariableNames: ''''
imports: ''''
category: ''test'''
The double quotes are to tell the compiler that the things wrapped that way are strings, not the end of the string being defined. Executing that yields:
You can also tell the class to add an instance variable, rather than recompiling the class:
Foo addInstVarName: 'var2'.
In Smalltalk, all your objects - including the classes - are live at runtime. They aren't dead text lying in the version control system, and they can all be manipulated. You can insert new methods into a class in much the same way:
Foo compile: 'initialize var1 := 1. var2 := 2'.
Which adds the #initialize method to class Foo. You can inject new code into a class at runtime this way - so if you have a code generator for some reason (database interfacing, whatever) - you could have the code dynamically generated and added all at once.
You can also dynamically create message sends that didn't exist at deployment time via #perform. Say you have a variety of API methods, all similarly named, but their use depends on a base selection (in the post tool I'm using, that's how code fires, based on whether the tool is set for my API, the MetaWebLog API, the MT API, or the Blogger API.
So how does that happen? Here's an example. I have the following message send:
^self performForAPI: 'GetAllItems'
And that code looks like:
performForAPI: messageString ^self performForAPI: messageString with: #() performForAPI: messageString with: arguments | prefix msg | prefix := self perform: self apiToUse. msg := (prefix, messageString) asSymbol. ^msg isKeyword ifTrue: [self perform: msg withArguments: arguments] ifFalse: [self perform: msg]
The message is created by appending strings, turning that into a symbol, and then firing it. This is not a completely great idea in all circumstances (it makes it hard to trace senders, for instance) - and I wouldn't write the post tool that way were I to do it now. It's a nice capability, and very valuable when you need it - but you really need to be sure you need it.
In any case, that shows some of the more dynamic features of Smalltalk.IMHO, they are far less baroque than what C# is adding, because Smalltalk was created with this kind of thing in mind. C# wasn't, and it shows.
Wired has a column that wistfully looks back at the days of powerful unions, and dreams of a unionized Microsoft. Towards the end of the column, there's this:
So, will we ever see a unionized Microsoft? With his own union working on the Redmond behemoth, Courtney certainly won't rule it out.
"WashTech has been actively trying to build the union at the company. (It's been) recently reported how wages at the company have been stagnant while profits are soaring, and that the review process has become an unfair management tool. These are core issues that a union can address."
Microsoft needs to become more agile, not less. Right now, they suffer from the same kind of rigidity that cost IBM so much money back in the mid to late 80's. What if the work force there joined a union? Well, they would see work rules and process - just like now - only from the employee side, rather than from the management side. I fail to see how that would help the company in the long run. It might help a few people in the short term, but I rather expect that it would drive the company toward an Eastern Airlines sort of ending.
What MS needs is more people like Scoble, who are willing to shake the rafters and try to create positive change. Unions, like management, are conservative forces that fight change. That's not what MS needs.
Update: Stephen Pair gives a parse tree example in the comments.
Don Box has another post up showing how to create lambdas in C#. The syntax for all that looks pretty baroque to me. In any event, Don asked in the comments to my last post on this for the Smalltalk equivalent. I'm not going to generate a list and compile that, as he does with Scheme and C# - in Smalltalk, we'd have a string, and just evaluate that at runtime. Same idea, just not the same machinery. So the way I'd approach his problem in Smalltalk:
" Creates the function that adds one to the input value " func1 := [:a | a + 1]. " String for the same function " func2String := '[:a | a + 1]'. " Print that to the Transcript window " Transcript show: func2String. "This will raise a MessageNotUnderstood: #value " func2String value: 4 " Have the compiler evaluate the string, which gives us the function " func2 := Compiler evaluate: func2String. "Now execute that, which gives us the desired answer of 5 " func2 value: 4
If you were really hung up on creating a List, you could do that with MessageSend objects, and then hack the compiler a bit to get it to deal with lists instead of strings. That's not how Smalltalk works though (it's kind of cool that you could make it work that way - I've had University students tell me about projects to implement that in Smalltalk). The Compiler is just another object that you can subclass and/or extend - the IDL compiler for CORBA and the DLLCC parser for our foreign language interface are both implemented that way. In general, you can tell any class which compiler to use (allowing you to easily create domain specific languages).
The bottom line is, creating code whose execution is deferred until later is easy in Smalltalk - and is still easy if you want to create that code on the fly by generating the code and then compiling it at runtime.
Over the last few days, there was a flood of spam to the CST Wiki. That was causing two problems:
To solve the first problem, I added a simple blacklist. The spam that hits the Wiki seems to come in waves, against a bunch of pages, and all of the same kind. So adding a specific filter to the blacklist solves the problem. The second problem was something I suspected, but didn't verify until this evening. After loading all pages into memory, the system was running right into the (system imposed) limits on memory. So that meant that it was getting into thrashing - it always needed more memory, but the internal limits wouldn't allow it to.
As it happens, that's easy to fix in Cincom Smalltalk. First, you can raise the upper bounds on memory, at runtime, like this:
ObjectMemory currentMemoryPolicy memoryUpperBound: someDesirableNumberHere.
That solves part of the problem. The other part is ensuring that the system has big enough memory zones right at startup, so that it doesn't have to thrash to get there. That's accomplished by sending a message like this:
ObjectMemory sizesAtStartup: #("array of seven numbers goes here")
The documentation for that method is probably called for here:
"Sets the suggested initial sizes of various memory spaces for future snapshots. The spaces whose sizes can be set are as follows:
- Eden
- SurvivorSpace
- LargeSpace
- StackSpace
- CompiledCodeCache
- OldSpaceHeadroom
- FixedSpaceHeadroom
These sizes are suggestions only, the virtual machine may have to deviate from these settings in order to successfully load an image. In general, the sizes are specified as a multiple of the platform-dependent default value for each space. In other words, if the first element of arrayOfSizes is 1.5, then Eden's suggested size will be 1.5 times the default size of Eden on the platform that the system is being started up on. A value of 1.0, on the other hand, will result in the default value being used. A value of nil in a particular slot of the arrayOfSizes, will have no effect on the current setting for that particular space. Fails if the arrayOfSizes is not as large as the number of spaces whose initial sizes can be specified or if the values in the arrayOfSizes are not either nils or Floats that are greater than or equal to zero and less than or equal to 1000. Returns the receiver."
The important one in the case of the Wiki was number 6 - old space. Any runtime objects that survive initial GC end up in old space, so making it bigger solved the thrashing problem. Of course, you could argue that the Wiki shouldn't cache everything in memory, and you would probably be right. That's the way the current codebase works though, and mucking with memory settings lets me keep it running while I have a look at the base problem.
A few years ago, we had some issues with hosting the Cincom Smalltalk Non-Commercial downloads - the server they were on didn't have sufficient disk space to hold everything, so we got a new one. In order to keep things running, I hacked together a"temporary" application that would keep the downloads flowing.
Well, that temporary application is still running, nearly 4 years later. It was never written to be permanent, and the way data was being stored made duplicate entries pretty much inevitable. Well, today I finally got around to weeding those dupes out - on the live server. If you tried to login or register for the NC in the last little while, you might have gotten an "application maintenance" screen. That's done now, and things are cleaned up.
The lesson? No application is every temporary. Does that mean that you need to do the whole enterprisey design up front and set it to scale to the hilltops? No, but it does mean that you shouldn't have delusions of temporariness, either :)
Don Box points to the new support for lambda expressions in C#:
Expression<Func<int, int>> expr = a => a + 3; Console.WriteLine(expr); // prints "a => Add(a, 3)" Func<int, int> func = expr.Compile(); // LCG's an MSIL method from the expr Console.WriteLine(func(4)); // prints "7"
Yes, it's nice that Microsoft has added this to C# - it gets them up to Lisp and Smalltalk levels of technology, only a few decades late :)
Personally, I find the following easier to look at:
expression := [:input | input + 3]. Transcript show: expression method getSource; cr. Transcript show: (expression value: 4) printString; cr.
You don't have the separate compile step, because of the way Smalltalk works. What's also neat is this:

That's the block expression being inspected, with the bytecode highlighted. In Smalltalk, it's turtles all the way down.
Lee Gomes of the WSJ reports on the TopCoder contest, and comes to this conclusion:
The results have been carefully tabulated by a computer and, thus, are beyond dispute: Of the 48 best computer programmers in the world, only four of them are Americans. But what that bit of data says about the state of the U.S. education system is open to debate.
Hmm. So Lee, if I set up an online survey, can I take those results as representative? What you have here is a self selecting pool of respondents. You simply can't make the jump from a self selected pool to any kind of general conclusion.
Once you have a DVR, it becomes irresistible. In fact, getting a second (or more) suddenly seems reasonable. We now have 4 devices recording various things for us:
Decadent as that sounds, they come in handy. There are nights when multiple things we watch air at the same time, and we have them picked up by one of those devices. The Replay TVs are the nicest ones; we can stream between rooms, and skipping ads is much more pleasant with 30 second skip. The cable box DVR is truly annoying, but it allows recording of HD content, which neither the Media Center nor the Replays can do. And yes, I know that Media Center PC's can stream - but then I'd need one in the family room, and the fan is loud - the ReplayTV is quiet. Maybe when Apple has a full solution a new mini will be an answer.
At this point, I don't even know what day most of the shows I watch actually air. This kind of behavior explains the attempts by the industry to create what Doc Searls calls value subtracting solutions. The idea of disabling channel surfing during ads is just too brain dead for words - never mind us DVR using folks, the entire population of TV viewers would barf at that. The bottom line is, the advertising model for TV has never worked that well - DVRs simply bring the long simmering worries about it straight to the surface. Like the RIAA with DRM, the industry is fighting tooth and nail to hold onto the old model, but it's not going to work - for the simple reason that the advertisers are starting to understand the problem. I expect to see more and more subscription models (moving down from cable to individual shows).
The future of local newspapers is local bloggers. Simple as that. Call them "stringers" if you like. But if you're going to build a bridge from the past to the future of journalism, you'll need bloggers to help build it.
It's not because their bloggers, either - the people that local papers need are bloggers because that's the easiest way for anyone interested in local affairs to publicize them now. John Dvorak was onto something when he coupled the decline of newspapers to the decline in local reporting.
One thing to remember about Long Tail effects- is that something out in the tail can, in the right circumstances, reemerge as a fully fledged mainstream hit. The Touching the Void, Into Thin Air effect.
While I am certainly not about to make the argument that smalltalk is set to come back and displace .NET, Eclipse and whatever scripting framework du jours is oh so hot with the cool kids, there are some interesting green shoots around the platform worth noting.
Dabble DB has the blogosphere going brock wild (nice take here on Dabble and other situated online databases). Reviews for this database, targeted at the Read/Write , Programmable Web have been pretty much uniformly positive. Dabble DB is written in smalltalk running on the seaside web apps framework. Dabble, if it does break out into the mainstream, will surely drag some smalltalk developer adoption with it.
With the long tail, there's space for everything. The Enterprisey people and the agile folks can all do their own thing. I think Java was the last "big thing" to hit software development - from here on out, there are going to be bunches of small things, all appealing to different niches.
Via Dare, I found Rakesh Agrawal talking about GMail as a work tool. I mostly use GMail that way myself, so I had a look. One quibble on the downsides:
No offline access: I guess this isn't true because you can always use Gmail's POP support to download messages into an offline client, but then I'd lose that notion of having one single email box for everything. And I guess I also haven't felt the pain as much on this as of late because I haven't been traveling quite as much as I have in the past.
Well, not exactly. I use the POP interface so that I have normal client interaction, but I still have everything archived by Google. So I get the benefits of both - if I've aged off my mailboxes here on the client, I can still go to GMail and search.
I've grown tired of having to promote 5-10 pages out of the spam jail on the CST Wiki every day, so I went ahead and added some simple spam checking to it. We'll see how it goes - I'm sure I'll have to monitor the system over time.
Either McGovern can't read, or he's an elaborate hoax:
Mr Petrilli starts to attack James Robertson by referring to him as a servile self-seeker. In the past he has also commented with passion on several of my postings. He is now going after Robert McIlree for his views on EA. Of course, within his posting he does some chest-pounding about how he designed interoperable PKI systems for governments before most folks even heard of PKI. I wonder if we were to look at his past work, would we think it was of high quality?
If you actually read Chris' blog - which McGovern didn't link to - maybe he's with Gillmor and Goldstein on this "links are bad for you" thing - you would find that it was McIlree who described me as a sycophant of Chris. If you were present for any of our knock down, drag out arguments over politics (usually in a private channel on the Smalltalk IRC), you would know just how amusing that is. I think it's safe to say that we both march to our own drummer.
So the question remains: Is McGovern's site an elaborate hoax, or is he really that clueless?
Dave Buck shows you how to find the code you need to look at, even though you might be only minimally familiar with it. Once again, the capabilities of Cincom Smalltalk shine through.
James McGovern gives some advice to me:
Minimally consider becoming an advocate of all developer tools to become 100% free of charge. This has happened in several other communities where developer seats are now free but the charge remains for production server implementations. This positions Smalltalk and similar tools that still have legacy models behind them to now be learned by folks in countries such as India where they can gain critical mass in order to support large enterprises who may consider developing with the tools.
Well, it turns out that Cincom Smalltalk is free for non-commercial use already - it's only when you deploy it that you need to pay for a license. Simply download it from our site, and use the online tutorials. He mentioned open source first; I'll point out that Java is not open source, and has spread quite widely. When you grab Cincom Smalltalk, all the sources are available. For commercial users, that includes the VM.
Figure out a way to get the folks over at RedMonk and other analyst firms to change their perception that Smalltalk is dead or has been delegated to minor-league status within the enterprise. Start first by adding influential industry analysts to your blogroll. I would suggest starting with Brenda Michelson and James Governor.
Actually, I read (and link to) James Governor fairly often. I don't always agree with him, but I like his take on things. As to this:
While you are adding folks to your blogroll, consider also adding several enterprise architects from Fortune enterprises. Don't attack them and instead engage in a meaningful dialog with them. Never alienate potential customers.
Well, maybe it's a personality flaw. I call things the way I see them. When I see stuff I like, I say nice things about them. When I see stuff I don't like, I say not so nice things. A suggestion back, though: you'll note that I don't do politics here. There's a reason for that; it's because I figure that people with different worldviews still have money to spend. Those pictures McGovern uses on his blog? They create a perception problem.
I'm with Mark Bernstein - links are neither currency nor attention destroyers, and asserting, as Seth Goldstein does, that "strong web bloggers no longer link" is just nonsense. There have been people who've raged against punctuation too, and they were every bit as silly. When I read a long missive that references someone else, a link to the source is proper web punctuation. Omitting it means that I have to waste time with Google instead, which is just stupid - and impolite.
Meanwhile, Gillmor is proving every day that listening too him actively destroys brain cells:
As for links being dead, Nick [ed: Carr] demurs with an "I don't really get what you're trying to say Steve." Amanda Congdon does. Dave Winer does. What's not to get? Links produce economic ripples that keep incumbents in charge; removing links puts users in charge. Clicking on a link does not pay the author; it pays the signaller (in this case the aggregator, publisher, or arbitrager of the link's "value.") The author of the content is paid in link credits, which tether him or her to the tyranny of the mediocrity of broadcast economics.
I can't get straight to Carr's comments, because Gillmor has some asinine notion that not linking to him empowers me (the reader). Here's a tip, Steve - if that's empowerment, I want a whole lot less of it. He's pushing the idea of what he calls a gesture bank, where we all share meta data in some kind of vast xml ocean. Sure, sure. While you go about building that, the rest of us will just follow the links. Those don't take any effort to create, while the whol gestire sea thing will require lots of buy in, as well as a new tool infrastructure. Given human nature, I won't hold my breath.
Gillmor continues with this:
That's the problem with links: We're all waitresses on this gig. We're waiting on the Big Day when we hit the Big Show, when Mike Arrington or Doc Searls or Dave Winer bestows the Big Link on us that gets us another 10,000 in ValleyWag bucks. Some of my best friends are linkers. Don't forget to tip your linkers. Don't want to link? What, and give up show business?
Umm, no. Links are mostly akin to footnotes in a book, except that they are a hell of lot easier to follow. Steve just doesn't get it. He's out there thinking that we all consider links a desperate bid for attention from the so called A-Listers. No Steve - we mostly think they're a way to get more information about a particular subject. Attention? Heck, I wish Gillmor would start paying attention...
Sony has gone public with details of their pricing for the PS3 - and it looks like the guesswork about how much money they are willing to lose per unit haasn't been far off. They are going $100 up from the XBox, at $499 and $599. That's pretty steep, IMHO - we'll see if my notions about game system price points hold water. The details:
The 20GB HDD version will retail for $499, and the 60GB HDD version will go for $599. They promise 4 million launch units by December 31st. Update: 05/09 03:57 GMT by Z : Apparently, not only does the $499 system have a smaller harddrive, but it has fewer features as well.
Now it's down to how many units actually sell, and who's right about what the market will bear.
Update: Meanwhile, Engadget has a rumor about pricing for the Nintendo Wii.
Bob Congdon isn't sure about the new Mac ads:
The Mac is a young guy in casual clothes with a boyish stubble. In contrast, the PC is a middle-aged, suited business man. Do these two look familiar? It's no coicidence that the Mac looks like Steve Jobs circa 1975 while the PC is an overstuffed caricature of Bill Gates.
The ads may be entertaining but are they effective at getting users to switch? I'm not so sure. By relying on tired stereotypes Apple runs the risk of alienating and insulting the audience it's trying to convert.
I just saw this for the first time last night, and I thought it worked. The "what apps come bundled" thing was truly funny (although, to be fair, most PCs you buy from a vendor will come with some variant of Office pre-loaded). I don't think these ads will alienate anyone, but we'll have to wait and see whether they are effective.
Cincom's Helge Nowak sends along news of two upcoming events in Europe, both with a call for presentations/papers out:
There are two conferences coming up in Germany that would be very nice platforms to present Smalltalk with interesting talks as an up-to-date hot technology. While they are held in Germany both of them are interesting for international presenters and audience:
- Net.ObjectDays is a framework for a lot of interesting international sub conferences: http://www.netobjectdays.org/en/index.html
- these are the call for papers: http://www.netobjectdays.org/en/news/news.html
- iX Conference: the well recognised German IT magazine iX (http://www.heise.de/ix/) organises a conference on "Better Software!"
- this is the call for papers: http://www.ix-konferenz.de/
If it fits your plans, these are good shows - I've attended the first one before
Gee - what a shocker. OPML, yet another underspecified format that Dave Winer created, isn't as interoperable as people would like. As is par for the course, everyone is gushing about how great an idea the OPML sharing thing is, while tip toeing around the suckage:
First, I exported the group of feeds (the channel) from FeedDemon. That created an OPML file. Yet when I tried to upload it to Share Your OPML, I got an error that the file contained no feeds. I looked and it did - all the feeds were there.
So I then opened that OPML file in Dave Winer’s OPML Editor, did a ’save as…’ and then looked at that file. It had one thing the original didn’t - the <opml version="1.1"> container as the very first line. Uploading that new file to Share Your OPML worked without error.
So yeah, as I've said before, OPML just sucks. If the idea behind "Share Your OPML" takes off, I fully expect the following to happen:
Gee, it's almost like I've seen the movie before.
Demonstrating just how enterprisey he can be, Robert McIlree takes a shot at Chris Petrilli and me:
I got a 'visit' from self-proclaimed enterprise architect debunker Christopher Petrilli, and later, as it appears customary in posts by EA-types, from his sycophant James Robinson. Before I deconstruct their commentary, I'd like to thank both guys for the huge traffic they directed to my blog today. To those of you coming here from their links or a feed for the first time, welcome. Take the time to read my posts, judge for yourself where I'm coming from, and comments, whether you agree or disagree on anything I've written about, are welcomed.
So ask yourself - how reliable is a *cough* enterprise architect *cough* going to be when he can't get the spelling of one of his critics names right? It's not like my name is hard - it's right there at the top of my blog.
I can see it now: "ESB? Gosh, I'm sorry, I had it down as EJB..."
I should be 2 inches taller, given the location of the smoke detector in the bedroom. Here's the ladder set up to get there - believe me, I wasn't happy up near the top, changing the battery out:

This one gives you some idea of where the ceiling is:

So if I were 2 inches taller, I wouldn't need to be so close to the top of the ladder. My dad is over 6 feet tall; I could have used some of that :/
Dave Buck's excellent screencast demonstrating Smalltalk has hit reddit - go and give it some up points so more people see it.
Don Box asks a couple of Ruby questions:
- What's the performance penalty for passing/calling a block vs. executing the code "directly" on the current frame? Does the cost go up/down if the block doesn't reference any symbols in the enclosing frame? I know the answers for the CLR and C#, but I'm not sure my intuitions from that environment apply here.
- Do people wind up using blocks to model simple CPS-like idioms and if so, how does the runtime's stack management hold up?
I can't answer specifically for Ruby, but I can give my impression from its close cousin, Smalltalk. I created a simple class that ran one of two tests:
testDirect: n | val | val := Time millisecondsToRun: [n timesRepeat: [1000 factorial]]. Transcript show: 'Direct for ', n printString, ' repetitions: ', val printString; cr testBlock: n | val | val := Time millisecondsToRun: [n timesRepeat: [myBlock value]]. Transcript show: 'Direct for ', n printString, ' repetitions: ', val printString; cr
Then I ran each test 1000 times, to get something representative. Over 1000 runs, I got 3100 ms for the direct run, and 3300 for the block (with a variance of about 100 ms per run). Upping that to 10,000 repetitions each, the difference between the two dropped to an irrelevant 60 ms (i.e., noise). So in Smalltalk at least, there aren't performance reasons to avoid blocks.
Which leaves it to being a "does it make sense from a design standpoint". Blocks are used quite frequently in Smalltalk in places where other languages have built in operators (i.e., various iteration methods in the Collection hierarchy). It's never caused an issue with the runtime stack that I know of - and the fact that Seaside (which carries full blown context stacks around) holds up tells me that there shouldn't be a problem.
That may not help for Ruby, but it does point out that a system using Blocks can be implemented efficiently.
Dr. Dobbs has a long write up on the state of Smalltalk - apparently taken in part from this year's Smalltalk Solutions. In particular, it's taken in large measure from Georg Heeg's talk. I didn't see his talk this year, but it sounds like it went well. Check it out - it's a nice write up
A small preface - here's what I think is going on with McGovern:
His blog is an elaborate piece of satire
If you follow the link to his blog, you'll find that he links here, with the comment "One blogger that has a great perspective that the community should read is Charlie Savage". Well - that blog is all about mapping and GIS. Somewhere, the guy who actually writes the silliness on McGovern's site has been having a great laugh at my (and others) expense, as we took him seriously. I suppose the images he uses should have been a bigger hint :)
Update: In the comments, Chris is of the opinion that McGovern is for real. In which case, there's possibility two, which I edited out of my original draft: He's perhaps the dumbest individual capable of walking upright that I've encountered in some time
Having said that, there's some (small) value in pointing a couple of things out:
James Robertson seems to be stuck in a loop on Smalltalk. Whenever there is controversy of any sort within the blogosphere, folks will more often that not express their perspective from the outsider looking in point of view. I wonder what James would think if he worked for a large Fortune enterprise...
Hmm - Seeing as how I'm the Product Manager for Cincom Smalltalk, is my advocacy position so hard to fathom? If I didn't believe in Cincom Smalltalk, I'd be off working for a client company somewhere, instead of being the head cheerleader here.
Oh, and as to me working at a Fortune 500 company? Gads no. I worked in the US Department of Defense for a few years, and stifling bureaucracy is not my idea of a good time. Thanks, but no thanks.
I've said for awhile that the Tablet PC is a solution in search of a problem; Microsoft's new Origami idea is helping prove me right. The Washington Post's Rob Pegoraro is highly unimpressed with Samsung's entry into the space. It ships with no CD/DVD player, which makes loading new software hard:
The tested Q1 arrived with almost no third-party software; a copy of Microsoft Office and last year's version of Norton AntiVirus were the only notable additions. The copy of Windows Media Player included an extra "skin" for that program, with large buttons meant to be selected with a thumb (should you want to employ something the size of two Walkmen duct-taped together as an MP3 player).
He also points out that the screen is small, and that using the Tablet interface for writing or typing is just painful. It only has 36 GB of disk, so you're better off with a video iPod if you want to store music and movies - it's smaller, and has more storage. With the screen size, using normal Windows apps is going to be painful (try using 800x600 resolution on your PC for an hour and see how you do). For $1100, this is an expensive door stopper that won't stop your door. I have no idea who the target market is; Since you can't slap a DVD into it, it's utility for watching movies while traveling is limited. It's too big to be an MP3 player. The screen is too small to be useful as a PC, and without a keyboard, it's not a desktop replacement.
Why dynamic is hard on static VMs:
Ruby actually requires more in the way of support than just continuations, but it's not necessarily impossible to implement on the CLR; it's just hard to implement on the CLR in a high-performing manner using today's CLR. That's part of what Jim is there to do, evolve the CLR to better support languages with Ruby's interesting featureset (like open classes and the "missing_method" method) in such a way that it doesn't tear down perf.
I've been following Less is Better, which covers implementing Ruby on the CLR. If you read there, you'll find that doing Ruby on the CLR pretty much means implementing a full VM on top of the CLR. Which tells me that the CLR is not that nice an environment for a dynamic language. The JVM is no better, and will likely remain worse. Yes, I know that there's a JSR on that. Wake me in 2015 when they get around to implementing it, and try not to asct surprised when the level of baroqueness they've added (can you say generics?) is absurd.
The bottom line is, the original designs for the CLR and the JVM did not encompass dynamic languages and the things they do. They aren't optimal for the kind of lookup a dynamic language uses for methods - in fact, they have been optimized in a different direction altogether. Then we get to continuation support - not critical for all dynamic languages, but useful if you want something like Seaside. Just look at this reasoning:
Continuations are not impossible to support, however they are currently more or less impossible to support given the current lack of access to the underlying stack frames in the managed environment--you'd need some support from the runtimes (either the JVM or the CLR) to make it work. Such runtime support would not be too difficult to add, however, as both environments already have rich and powerful stack-walking mechanisms (because both environments use the thread stack as bookkeeping tools, among other things, and need to be able to crawl through those stack markers for a variety of reasons, such as security checks), and it would not be hard to create a runtime-level mechanism that allowed code to "take a snapshot" of the stack--and its related object graph--from a certain point to a certain point, and save off that state to some arbitrary location. In many respects, it would be similar to serializing an object, I believe.
To summarize: "Continuations won't be hard on the CLR, so long as we can achieve 6 impossible things before breakfast". Sure. I'll return to what I said above - the static VMs weren't designed with this in mind, and adding it won't be easy.
Here's a simpler idea: You want the advantages of a dynamic language? Why not use a system that was designed that way? You know, right tool for the job and all that...
Janko Mivsek announced the latest version of Aida/Web on the vwnc mailing list, and I thought I'd give it a wider distribution:
I invite you to try the newest release of a web application server Aida/Web from:
- demo and discussion page: http://aida.eranova.si
- VW parcels: ftp://ftp.eranova.si/aida/aida-5.0.tar.gz
- Cincom Public repository, bundle AIDA/Web
AIDA/Web is a web application server based on Swazoo and a framework for building complex web applications of many sorts. In that respect it is similar to Seaside. It has everything you need for a real web app, together with Ajax.
It is also a mature one, running real web apps since 1996. It is used in many intranet business apps from Gas billing system for all gas in Slovenia to logistics management system called e-logis and recently a CMS like system for Quality and Business process management.
A new version has a lot of new stuff:
- Integrated Ajax support, (among others: async update of any element, autocomplete fields, in-place editing)
- integrated Ajax libraries Prototype and Scriptaculous (javascript in methods)
- Javascript components like Calendar
- WYSIWYG editor support (TinyMCE)
- strong WebGrid support with Ajax sorting and filtering
- Scheduler for scheduling one-time or periodic events
- WebDAV support
Installation:
- load parcel Swazoo.pcl
- load parcel AIDAWeb.pcl
- doit SwazooServer demoStart
- in web browser open http://localhost:8888
- login with admin/password
More on:
- http://www.eranova.si/aida
- http://aida.eranova.si (demos, discussions)
Enjoy!
You can usually find Janko on the Smalltalk IRC Channel as well
We're getting a demo of Croquet from Julian Lombardi and David Smith of Open Croquet , which is a 3D world. Something like Second Life, but runs P2P.
We have just seen a new world.
Cool stuff, this Smalltalk :)
Update: As David Buck says in comments, this was hardly the first demo; I blogged the 2003 Smalltalk Solutions presentation.
I think Eric Raymond's post on the new generation of boardgames (starting with Settlers of Catan back in the 90's) is ontop something. I'm not as hungry for the kind of wargame that he is; for one thing, it's a lot harder to find like-minded gamers for that than it is for the more general game. That, and I'd have to be convinced that a wargame didn't involve investing an entire weekend :) Anyway, I think Raymond is spot on with this evaluation of the changes:
I enjoy strategy games. I’ve been playing them since the heyday of the elaborate hundreds-of-tiny-counters hex-map historical-simulation wargames in the 1970s and early 1980s. But those games don’t get played much any more, largely because they took so long to set up and learn; after 1985 or so younger gamers moved to computer simulations instead, and as the hex-wargame genre stagnated many old-school gamers eventually abandoned it in favor of military-miniatures gaming.
The set up is a killer. I used to play Third Reich (a European Theater level game of WWII), and just setting up for a game took over an hour - part of that was deciding how to do initial deployment. It took forever, and the game mechanics were tedious. Computer Automation has taken that ground over, I think. Where I've gone is the so-called "EuroGame":
Be that as it may…in the late 1990s we started to see a new wave of fresh, innovative game designs in a different style. Settlers of Catan in 1995 was the harbinger. This game of trade and civilization-building featured an elegant combination of simple mechanics with tricky, relatively deep strategy. There are several possible routes to victory in Settlers, all requiring both positional tactics and careful management of constrained resources. The game is made more attractive by colorful, high-quality physical furniture and tasteful artwork. It can be played lightly and socially or in an intense minimaxing mode, and (importantly) is really designed for three or four players though it can be played one-on-one. It rewards repeated playing.
Our current favorite is Caylus, which combines many of the elements of Puerto Rico and Settlers of Catan. It's a longer game, but well worth it, IMHO. I'm not looking to get back into wargames like Raymond is, but I'm sure glad that board game design has had a renaissance.
InfoWorld has a scary article about how malware can get right under the SSL connection to a bank, and execute a "man at the endpoint" attack. The problem? Once malware is on the machine, any transaction that occurs is trusted - and "safely" encrypted. Thus everything looks ok to both the bank and the customer, even though they may be seeing differing transactions. Here's the gist:
“The problem is,” according to one bank regulatory security auditor, “SSL isn’t broken. SSL states that the connection between your PC’s network card and the bank’s network card isn’t compromised. This is still true. Nobody is sniffing the transaction off the wire. Instead, this is a ‘man-in-the-end-point’ attack.” In other words, the Trojan is sniffing or manipulating the transaction before it is ever sent across the Internet to the bank.
...
“It’s not a problem of authentication but one of transactional authorization,” says Bruce Schneier, leading security expert and CTO of Counterpane Internet Security. “No matter how hard you make the initial authentication for the end-user or hacker, the malware can just wait until the authentication is done and then manipulate the transaction.”
So what does my post title have to do with that? Well, InfoWorld interviewed a number of bank and regulatory personnel. Here's the bottom line - changing the security setup looks politically (corp. politics-wise) difficult, so it's not going to happen - at least, not until something really awful happens (and gets reported). In other words, not before you see the scary tag-lines on the 7 pm news:
When told how SSL-evading Trojans can bypass any authentication mechanism, most offered up additional ineffective authentication as a solution. When convinced by additional discussion that the problem could be solved only by fixing transactional authorization, most shrugged their shoulders and said they would remain under pressure to continue implementing authentication-only solutions.
They were also hesitant to broach the subject with senior management. It had taken so long to get banks to agree to two-factor authentication, they said, it would be almost impossible to change recommendations midstream. That puts the banking industry on a collision course with escalating attacks.
You've seen this one before. Someone (maybe even you) recommends some new security procedure. You then find out that as effective as you would like - but it was expensive, both in monetary and political terms - to implement. People had to change their business processes and implement new systems to support it - and now you've found that it's not enough. The all too common result: "Let's ignore it and hope it doesn't hit us".
Which is where bank and regulatory management seems to be on this. From the sounds of it, it's not executive management either - it's not getting that far. It's middle tier people, afraid to stick their necks out on something that will cost money to fix. Wait until this hits the fan - the finger pointing is going to be everywhere.
Bill Hobbs has a good roundup of the way the WKPA lawsuit imbrogolio fell out. Ad Age gave McCartin a chance to give his rationale for ending the suit:
"It had really taken on a life of its own and it had really become more of a distraction to the business at hand, which is to advance the tourism industry in Maine," Tom McCartin, president of WKPA, said about his reasons for dropping the suit. "And above all, as I think any good agency would tell you, we have the interests of our client at heart."
Read the next paragraph, and you'll find that the client was getting pretty peeved at the blog-storm:
Dann Lewis, director of the Maine Office of Tourism, was not available for comment. But he had told Ad Age earlier that the suit was affecting his office staffers time more than his state's image. "The only thing that's hurting us is it's distracting a number of my staff from dealing with the issues that really matter here -- our day-to-day activity in promoting tourism to Maine."
Which goes right back to what I said about this at the beginning - WKPA created a Negative PR Event. Maine will get past this (and I would not be surprised if they get past it by ending the contract with WKPA). WKPA, on the other hand, is going to have to live with this for awhile. As they pitch clients, those clients will be doing something that didn't occur to WKPA before all this - looking them up in the search engines. Before this, a search for WKPA gave back inocuous results. Possibly disturbing for reasons of omission - i.e. - "why is an ad agency so invisible on the web?" - but not negative.
Now? It's pretty much all bad, and it'll stay that way for a good while. That will almost certainly hurt their business. The only question at this point is whether they've learned anything by it. A smart company would put a summary of this on their own website, admitting that they were in error - and apologizing for it. That way, people searching for corporate references would find an explanation that came from someone other than critics. Don't hold your breath though - their website is a pure Flash thing. Utterly non-sticky, and utterly useless.
This week's logs should be a little different - there was a huge traffic spike from Thursday evening forward: this post got posted to the top of reddit.com, and then it appeared on slashdot yesterday afternoon. The server survived all that with only a brief hiccup - which is pretty good considering that I'm running on an underpowered PIII with only 256MB of RAM! Anyway, the numbers for BottomFeeder downloads:
| Platform | BottomFeeder Downloads |
| Windows | 646 |
| Mac X | 152 |
| Linux x86 | 128 |
| CE ARM | 85 |
| Mac 8/9 | 76 |
| Update | 48 |
| Solaris | 30 |
| HPUX | 30 |
| Windows98/ME | 29 |
| AIX | 17 |
| Sources | 13 |
| Linux Sparc | 11 |
| Linux PPC | 9 |
| SGI | 3 |
| ADUX | 2 |
That's a slight uptick, to a rate of 182 per day. Not bad, and there was a spike on Thursday and Friday - the downloads ran at a rate of 230 per day for those two days. Now the HTML page accesses, which should show an interesting spike for those days as well:
| Tool | Percentage of Accesses |
| Mozilla | 69.7% |
| Internet Explorer | 23.3% |
| Other | 2.7% |
| MSN Bot | 1.9% |
| Opera | 1.4% |
| Megite | 1% |
The total number of unique IP addresses nearly tripled, with nearly all of that coming on Thursday and Friday - and look at the percentages - Mozilla up about 5 percent over the normal distribution, and up enough to drive most of the bots that hit my site down into statistical irrelevance. I guess you can tell what the Slashdot reading crowd browses with :) Finally, the RSS accesses:
| Tool | Percentage of Accesses |
| Mozilla | 28.9% |
| BottomFeeder | 15.1% |
| Net News Wire | 9% |
| BlogLines | 9% |
| Other | 9.4% |
| Internet Explorer | 6.4% |
| Safari RSS | 4.5% |
| Google Feed Fetcher | 3.7% |
| NewsGator | 1.9% |
| BlogSearch | 1.7% |
| RSS Bandit | 1.6% |
| Planet Smalltalk | 1.5% |
| JetBrains | 1.2% |
| SharpReader | 1.1% |
| Feed Demon | 1% |
| Java | 1% |
| News Fire | 1% |
| Liferea | 1% |
| Attensa | 1% |
The number of tools that made my cutoff of 1% dropped slightly, which is consistent with the HTML results. The overall number of unique IP addresses hitting the feeds rose by over 1000 last week - I hope some of them stick around. Anyway, that's the roundup on the activity - the server stayed up, and took the traffic.
Currently, the MS Live team is busily blowing that first chance with Darren Barefoot:
We run Google AdWords campaigns for a few of our clients. Seeing an opportunity to get a jump on some of the competition, I figured I’d sign up to adCenter and check things out. Unfortunately, when I tried to sign up, I encountered the following message
Microsoft adCenter does not currently support the web browser you are using. Please sign in using Internet Explorer 6+. More about system requirements
Scoble has noted this, and it seems like the MS Live team has as well. However, they should have noticed it before they went live.
Last night, my post on the "Is Google Full" thing hit reddit.com. This afternoon, it got slashdotted. That's caused a wee bit of stress on the server :) Smalltalk seems to be handling the load though, and it's a back version too - I haven't yet upgraded from VW 7.1 (for a variety of lame reasons). I'm off to dinner, but I'll be back to check later.
The concept of a Negative PR Event seems to have finally sunken in at WKPA: they've dropped their suit. As the Media Bloggers association said in a statement:
"As it should be, the story of 'Warren Kremer Paino and the Maine Blogger' is now a cautionary tale", said MBA President Robert Cox, "future potential plaintiffs would do well to consider WKP's experience in attempting to silence a blog critic through the Federal courts.
PR professionals should pay attention to this mess - this is where things go when you decide to use the lawsuit howitzer against the blogosphere.
It's looking pretty bad. I updated my earlier post, after noticing that a Maine legislator is calling on the state to drop WKPA. The link-fest of negative news continues; Instapundit posted on the legislator story today; Jeff Jarvis' take back on April 27th is looking prescient. Scroll down to the bottom of this post to see how many people have commented on the matter - or go to Technorati and see their linkage.
It's turning out to be what I described back when I first noticed this - it's a Negative PR Event that's going badly for WKPA and their client. And their client has started to notice.
I've alluded to the patching capabilities of BottomFeeder before, but it seems that I've never actually gone into much detail. I had an email on that this morning, so I figured I should post on it.
The basic capabilities are built into the product - assuming you've left the compiler in your runtime, loading new code in via file-in or parcel loading is easily possible. What I added for my application was this:
If you have access to the Public Store Repository, you can check out the package PatchFileDelivery (which should have no dependencies on BottomFeeder - I may have to weed a couple out). The name is something of a misnomer, due to the evolution of the package. When I started, I was delivering small patch parcels, but I moved away from that and on to delivery of new versions of already loaded parcels - it made version control in the runtime a lot simpler. The basic steps look like this:
So let's take a brief look at those steps. The manifest is a collection of ComponentDefinition objects. That class looks like this:
Smalltalk.Patch defineClass: #ComponentDefinition
superclass: #{Core.Object}
indexedType: #none
private: false
instanceVariableNames: 'parcelName parcelFilename version oldVersion releaseDate vwVersion isPlugin descriptiveName description fileSize allowDynamicLoad '
classInstanceVariableNames: ''
imports: ''
category: 'PatchFileDelivery'
The important pieces of that are the version, parcelName, and allowDynamicLoad. The last one of those is a flag to the client - if it's false, the component in question requires a restart. That comes up when I have an update that does major changes to the UI, for instance. There are ways of dealing with that, but I figured a restart was simpler, and haven't really received complaints. The version is just that - a value derived from Store, the source file repository I use. The name and version are compared to what's loaded to come up with the list for the user.
Once that's figured out, the user's selections are downloaded via HTTP. The only difference between the base HTTP capabilities of VW and what I do is the progress dialog - and that's code that was submitted by Bob, one of our engineers. The change? Additional code in a subclass of the relevant HTTP class to raise notifications of status. Once the code is downloaded, it's either simply saved, or saved and loaded. If it's the latter, the following code gets used to load the new version of the parcel:
actuallyLoadParcelFrom: parcelFile [[Parcel loadParcelFrom: parcelFile] on: Parcel parcelAlreadyLoadedSignal, CodeStorageError do: [:ex | ex resume: true]] on: DuplicateBindingsError do: [:ex | ex resume]
The first handler catches the "already loaded" signal - which normally raises a dialog. I didn't want that, so I catch it and just have the system resume with true. Which illustrates one of the cool things about Smalltalk exception handling, btw - the ability to rewind back and have the system move along with the correct answer.
The second handler catches transient errors that arise during the load of the new parcel - in some situations, the new version of code can look like a duplicate code binding. That gets resolved as the load continues, so I just catch it and continue. Which again demonstrates the coolness of Smalltalk exception handling.
Once that's done, we have the new code loaded and are ready to run again. What about the next startup? Well, BottomFeeder looks in a known directory for new versions of code, and that's where the upgrade manager saves them. So when the application is started up, it does step (5) from above. And that's it - pretty simple.
WKPA continues to take an online beating over the lawsuit they've brought against Lance Dutson. Have a look at the results of a Technorati search for Warren Kremer Paino Advertising. That's PR all right, just not the kind any agency wants. It's not much prettier with a Google search either. Yahoo results and MSN results look pretty bad for them too.
The longer this goes on, the more damage it will do to WKPA - they'll be living with bad search results for a long, long time as a result of this - and that won't help them in their prospecting.
Update: Seems the legislature in Maine has noticed that this isn't reflecting well on the state. What a shocker:
A Maine legislator, Stephen Bowen, has written to the state tourism office to request the suspension of Warren Kremer Paino Advertising's contract with the state.
Seth Godin points out the obvious, which is apparently too obvious for those bright guys at WKPA:
Most lawyers view their job as a defensive one. They use phrases like, "keeping you out of trouble."
Unfortunately, when they interact with the public or with a partner or even a landlord, they are marketing your organization, whether they want to or not.
I rather suspect that a lot of lawyers are going to be slow figuring this out, given their love of obscurantist language.
Everyone has their moments; mine happened the other day when I was setting up the new STIC blog. I had everything set up, had the server recache its setup files (so that it would know about the new service), and did the basic configuration of the new blog from its ini file. And the thing returned 404s. This baffled me for a couple of hours - I went so far as to ask the guy who admins Apache if there was a configuration problem.
Then I actually looked at the problem as if it were my fault (which it was). Dohhh - the various SSP files have been factored to load in some include files, so that I don't need to maintain parallel versions of every basic file. I had forgotten to copy those over to the new directory. Which about like forgetting to plug the computer in...
Without giving too much way, I consider it a bad sign when the body count on "Lost" is higher than the body count on "The Sopranos". Just saying...