First Movie
It's only a few seconds, but the first movie footage ever shot, sometime prior to October 1888, is online here. Produced by Louis Aimé Augustin Le Prince
It's only a few seconds, but the first movie footage ever shot, sometime prior to October 1888, is online here. Produced by Louis Aimé Augustin Le Prince
Not only is the RIAA jihad against file sharing a huge PR mess, it's also technically illiterate. You have to love these folks - they really care about their customers. A lot.
The Times has yet another article about Wikipedia, and how you need to be careful about trusting it - it's not a bad article, although the title - "Snared in the Web of a Wikipedia Liar" - certainly tells me something about the way the Times sees things. To wit - they have fact checkers, and those web folks don't. They bring up a good example of what can go wrong, with a guy who's name was smeared in a bio piece on the site.
However, it's not as if the Times' hands are clean of this sort of thing. Steven Hatfill comes to mind - the man who was publicly trashed as a "person of interest" in the Anthrax investigations from 2001. There were lots of breathless articles about him in the Times (and other media outlets) - and the damage done to Mr. Hatfill by the Times is far more extensive than anything Wikipedia has done.
In fact, the Times is now the subject of a suit brought by Hatfill. In the Wikipedia case, whoever put the bogus information on the page is unknown - but that's not true of the thing with the NYT. So before they get all high and mighty about the unreliability of Wikipedia, I have a simple question for them: why does Kristof still have a job after he went on a mission to destroy Hatfill's reputation?
More fallout from the Sony Rootkit fiasco - the person quoted here works a Saturday shift at a classical music station. Here's what the DRM publicity has done for Sony:
The prospect of taking a recent Sony release into the production studio, and using a selection from it for a pre-recorded program, or one of the staff popping it into the CD drive of their desk computer to review… and corrupting the production and library index on which the whole station depends… well, it is enough to give us all the cold shivers. I’ve been told that the station librarian is not ordering any new Sony classical releases until this whole thing is resolved. Now, there are probably series techies out there who can explain that the chances of this happening are pretty low, that Sony’s anti-piracy spyware couldn’t possibly damage our library and production set-up, and would they even bother doing this with classical releases anyway? But however small that chance would be, we still can’t take it. CD’s with potentially damaging programs hidden in them, versus the security of systems upon which the whole station’s programming depends?
My wife was commenting on this vis-a-vis "mission critical" systems last night - how happy do you suppose the IT staff at your company is going to be when they discover that security holes opened by Sony's DRM allowed malware to get into the network? Especially when all the employee in question did is pop a CD into his laptop while he was on a plane, so he could listen to some music? Never mind what the actual risk of that happening is - the fact is, this is well on its way to being perceived fact.
The upside: with any luck, the negativity will be aimed at DRM in general.
Sometimes, when I have a modification I think would be useful for BottomFeeder, I figure it would make sense to try it out in a runtime environment before I send it off as an update. I can package the thing up as a parcel and simply load it into my application, of course - I just open the System>>Execute Smalltalk Code menu item, and enter the following into the workspace:
Parcel loadParcelFrom: 'ParcelNameHere.pcl'.
I highlight that and execute, and then answer "yes" to the confirming dialog (which pops because I'm reloading a new revision of a parcel that's already loaded). Other times, I want to try a smaller modification - a few method changes (which, if they work out, I'll package as an update. In that case, I export the modified code from my development environment as a fileout, and then execute this in a workspace in the runtime:
'FilenameHere.st' asFilename fileIn.
That loads the small change. If it's something that shouldn't go into production, but that I'd like to load at startup anyway, I can save the new file into the BottomFeeder directory, and just slap the code above into the .btfrc file (which gets auto-loaded at startup, if it's there).
The cool thing about all this is that Smalltalk provides its own scripting language. I ship BottomFeeder with the compiler and workspace present so that I can experiment like this, and also so that other people with Smalltalk knowledge can dive in, if they want to. Unlike a Java application, I don't have to tell people to use a "simpler" scripting language - which, btw, should be a sure sign that there are problems in Java - if the base language is too complicated for that task, that's a problem - at least IMHO.
In any event, it's a neat thing about Smalltalk - and it's something that allows customization of a runtime application, if the developer(s) of that application want to allow that.
I was in the kitchen, getting breakfast (and lunch) prepared for my daughter, and I thought I'd have a look at the weather channel - they've been calling for snow for a few days, and the forecast tends to be pretty solid this close to the event.
Not today though. They have one of their guys in DC (they like to send them on the road, so they can get "action shots" in the bad weather), and he was talking about the forecast. My ears perked up when he mentioned how it works. They run a number of forecast models, and then, as they get closer to the event in question, their models tend to converge. At that point, they go with the convergence as the forecast. This time, that's not happening.
It happens more often than I might have thought - I can recall a fair number of times when the local weather guy was pretty shaky on which way things were going to go, or simply said he was thinking "A" (while others might be thinking "B"). The models that are in use are better than they were (say, 10 years ago), but they still have a long way to go.
If you like unpredictable things, the weather is still partly in that camp. But hey - snow in Maryland in early December? That would be fun :)
If BellSouth was trying to look Grinch-like coming into Christmas, they certainly did so - is there some kind of corporate competition for "best stupid PR stunt" going on that we don't know about? How else to explain the tantrum like outburst over New Orleans' plan to offer free WiFi:
Hours after New Orleans officials announced Tuesday that they would deploy a city-owned, wireless Internet network in the wake of Hurricane Katrina, regional phone giant BellSouth Corp. withdrew an offer to donate one of its damaged buildings that would have housed new police headquarters, city officials said yesterday.
...
City officials said BellSouth was upset about the plan to bring high-speed Internet access for free to homes and businesses to help stimulate resettlement and relocation to the devastated city. Around the country, large telephone companies have aggressively lobbied against localities launching their own Internet networks, arguing that they amount to taxpayer-funded competition. Some states have laws prohibiting them.
Of course, one of BellSouth's PR flacks disputed the story from the mayor's office. Not quite as stupid as Sony paying graffiti artists, but it's right up there.
Mike Loukides on "scripting" languages:
So I really have to ask: what's the "scripting language mystique" all about? You don't have to run javac? Rubbish--I don't believe that's a big issue. You don't have to write declarations? Bull--writing declarations means (to me) that it's easier to debug misspelled variable names. That's a HUGE time saver. As Brett McLaughlin has often said, "whenever you can get the compiler to do the debugging, it's a win." Is it that scripting languages are better "glue" languages for calling UNIX utilities and other external programs? Well, I don't see why it's so difficult to call Runtime.exec(). The fact is--if you have some documentation, you can use Java to call into the guts of other Java programs, not just their external command-line interfaces. That's some pretty powerful glue. If you understand reflection or have been watching what's going on with lightweight containers like Spring, you've got real computation superglue.
He goes on to say that he can do various tasks easier in Java because he knows Java. That's fine - I can do things easier in Smalltalk for that reason as well. However, I've done C, C++, and some Java - so I think I have some grounds to do comparative criticism. Loukides though?
"I don't know (insert language here), so it must be harder than Java"
That's right Mike - stay in your cave. It's probably safer there.
Ian Prince has some screenshots and explanation of a DabbleDB/Seaside application up - have a look, it looks like it's very, very easy to work with.
Martin Kobetic has put up a post on security code in VW 7.4, including a beta level DLLCC wrapper for OpenSSL. Check it out.
Maybe Java development does rot the brain - have a look at this screed from Cafe au Lait against Martin Fowler. Martin says the following about Ruby's List class (and the same things could be said about Smalltalk's List class):
The obvious contrast to a minimal interface is that humane interfaces tend to be much larger, and indeed humane interface designers don't worry too much about the interface being big. This isn't to say that classes with humane interfaces need be larger in terms of implementation. The fundamental functionality of the two is often quite similar.
A good way of looking at the difference between humane and minimal interfaces is to compare the list components in Java and Ruby. Java has an interface (java.util.List) which declares 25 instance methods. Ruby has an Array class (which is a list not an array) that has 78 methods. That difference in size is something of a clue of that there's a different style here. Both components offer the basic same service, but Ruby's array includes a lot of additional functionality. This functionality is all relatively small things that can be built on Java's minimal interface.
Seems reasonable to me - one of Martin's examples is that Ruby (and Smalltalk) have #first and #last methods. So with a Ruby collections, you can do this:
aList.last
Whereas in Java, you have to do this:
aList.get(aList.size -1)
The response from Cafe au Lait on this is just stunning:
A 78 method List class is about three times as bad as a 25 method List class, not three times as good. A 12 method List class would be about twice as good. Simplicity is a virtue for both users and implementers. There's simply no reason for 78 methods in a basic List class. In fact, there's no reason for 78 public methods in any class. 78 public methods in one class is a code smell. 78 public methods make a class hard to learn, hard to use, hard to test, and hard to maintain. When a class has 78 public methods, it's time to refactor.
The raw number of methods tells us nothing about whether we need to refactor or not; we would have to actually look at the methods, and see if any of them don't fit. However, that's not his objection; he's very worried about all these methods - he really, really wants his classes to be sparse. For instance:
Fowler likes the first and last methods in Ruby, but list.first() is not significantly simpler than list.get(0). list.last() is perhaps a little simpler than list.get(list.size() - 1) but only because Java stupidly indexes everything from 0 rather than 1. And how often do you actually need to get the first item in the list? Needing the last item in a list is even less common. Normally the reason we have a list in the first place is so we can iterate through it using an Iterator or foreach. More often than not no single element -- first, last, or middle -- is explicitly identified in the code. Java's List class does not lack any of the functionality in Ruby's. Java just factors it out into a few more classes, especially the Collections class, and skips a couple of rarely used "convenience" methods. The result is a simpler, easier-to-understand, easier-to-use, more humane API.
Umm, yeah. It's so much simpler to write extra code every time. I suppose that showing this guy the four search methods in Smalltalk's collection classes (which I'm sure Ruby has as well) - #select: , #detect: , #reject: , #collect: would just make his head explode.
I use #first all the time, btw, and I use #last a fair bit as well. Perhaps Java developers don't simply due to their absence? It can be hard to miss what's not provided.
This isn't the first time I've seen this reaction. If I recall, Java's Object class has something like 11 methods. A base VisualWorks image? Object has 235 mthods. I've seen Java guys recoil in horror over that, ranting about the horrid OO design. Funny how Smalltalkers have gotten by for over 25 years this way.
There seems to be a general desire for sparseness in Java-ville. It's a value that neither Smalltalkers nor Rubyists seem to worry over. We are far more interested in solving application problems than we are in the production of extra code to support sparseness.
Update: More from Cees de Groot. And make sure to follow the comments link for more.
Update 2: More here.
Now here's a Forest Gump moment, podcast was chosen word of the year by the editors of the New Oxford American Dictionary. "Podcast was considered for inclusion last year, but we found that not enough people were using it, or were even familiar with the concept. This year it's a completely different story. The word has finally caught up with the rest of the iPod phenomenon."
Betsy Devine is a Wikipedia editor , and exactly the kind of person who should be in that role. Now if you could quantify what makes Betsy so ideal, and then find ten thousand volunteers with the same qualifications, then you'd really have something. The current Wikipedia system, as I've observed for a long time, gives anonymous trolls way too much power, although recent incidents should help to mitigate that. And Wales has been far too dismissive of the problem in the past. It may be time to find a new leader for that community, he's been more of a hypester and a flamer than a maven for information and a realistic community leader. To be clear, the previous situation, where Wikipedia was considered authoritative, yet at the same time had such low quality, was unacceptable. Either it loses the authority, or something is done to improve the quality.
Next, I expect Dave to be utterly stunned when the pace of content addition to Wikipedia slows to a crawl. Because in Dave's world, nothing is connected, and stuff just happens.
Apple continues to make progress with the iPod - they've gotten NBC and others to jump (at least partially) on the iTMS store bandwagon:
Get out the popcorn and your 5G iPods everyone, because Apple has added a ton of new shows to the iTMS from the likes of NBC, USA, SciFi and Disney. The Office, Monk, Battlestar Galactica (including the miniseries), The Tonight Show, Late Night with Conan O'Brien, Law & Order and Surface are among the newcomers. But wait! There's more: peep the vintage NBC shows like Knight Rider (no joke), Dragnet and even some Alfred Hitchcock.
Friends of ours got interested in Lost after picking up the season one DVD set - they are now catching up by buying season two shows from Apple. I think the current commercial model for TV is about to flip to mass customization via individual subscription. Even Nielson sees it coming.
Hat tip Steve Rubel
Wow, the Giants can actually win games now that they have a real quarterback - Kerry Collins had delusions that he was the second coming of John Elway, and continually tried to slice the ball into two and three man coverage. Game after game, he was just stunned that his passes were getting picked off. This year, with Eli Manning, that's not happening - and the Giants are 8-4.
It's December, and I actually have football games being played that I care about. Amazing.
Tim Bray talks about the new Sun Niagara chips, and the systems that will use them. It's a cool sounding technology, and I followed this link to a performance page on it, which raised a question in my mind. All things considered, the new system wasn't that much faster than the 3.6 Ghz Dell system at the bottom end. Especially when you consider that a lot of web applications can scale by throwing more hardware at them - the big question is this: What's the cost of the new SunFire systems, quantity one, versus the cost of 2-3 commodity intel boxes. Given the simple scale savings intel gets from their volume, it's going to be hard for Sun to compete there. I'll give them credit for being aggressive - this is neat stuff. It's an open question how well it will sell.
Mind you, I have a soft spot for bad movies, but I found that "The Triangle" was an ok show last night. It's a SciFi channel min-series with a decent cast, and the spin that they seem to be using is one that appeals to me - parallel universes. It's pretty clear to me that Neeno (played by Lou Diamon Phillips) is bouncing between at least two realities - he has one child in one, and two in another. The Crosstime Traffic series by Turtledove is one example of this genre (although, it's really aimed more at my daughter's age group than at adults).
In general, I really fiction in this area. I may end up disappointed in this show, but I'll be watching part two tonight.
I see that the European Publisher's Council doesn't like search engines very much:
"The new models of Google and others reverse the traditional permission-based copyright model of content trading that we have built up over the years," said Francisco Pinto Balsemao, the head of the European Publishers Council, in prepared remarks for a speech at a Brussels conference.
His stance backs French news agency AFP, which is suing Google for pulling together photos and story excerpts from thousands of news Web sites.
"It is fascinating to see how these companies 'help themselves' to copyright-protected material, build up their own business models around what they have collected, and parasitically, earn advertising revenue off the back of other people's content," he said.
Geez, these clowns must have talked to this guy. Just like librarian Gorman, Balsemao wants to make everything harder to find, and - even worse than Gorman - wants there to be a tollbooth in front of it all. I'd try explaining the concept of "Fair Use" to him, but I expect it would make his tiny little head explode.
Here's an example of the discussion problem:
The Wikipedia page on the Tet Offensive, which is the first hit in a Google search, is clearly partisan. "The Tet Offensive is widely, however incorrectly, seen as a turning point of the war in Vietnam," it says in the second paragraph. Now of course I want to know who said that. See the problem? Same set of facts, two different views. In the case of Dowbrigade, I know who's speaking.
I talked about this problem in October. Like the origins of WWI (the example I used in that post), the Vietnam war is still controversial - more so, actually, since many of the partisans are still alive. We won't have anything that begins to resemble a historical consensus on that war (or the part played in it by Tet) for decades - it's too raw, and the people who were of age then - on all sides - simply can't step back far enough. The (American) Civil War is far enough back to enable objective discussions; there are few people out there who still have strong partisan feelings about it. The closer in time an event is to the present, however, the worse the problem gets.
What are the correct facts on something like Tet? It's too close to the present to have a universally accepted view. Trying to declare one now would be like trying to find a consensus on the Civil War in 1900 - the partisans were too close to the event. The power of something like Wikipedia is that (before the recent changes) it allowed for ongoing editing to iterate toward a consensus. Where one is lacking, dispute pages could be created. Now? We'll have editors, and tons of submissions. Like printed encyclopedias, events this close to the present will fall one of two ways:
Yeah, that's a whole lot better than what we have now. Especially given that "experts" suffer from the same closeness problem that the rest of us do. Great - we've now got an electronic copy of the hidebound print editions. Editing is time consuming and expensive as well - the further Wikipedia runs down this road, the more pressure there will be to make it ad/subscription supported, in order to pay for that back end editing expense. A good thing ruined, because the MSM pros don't like competition, and a few people who disliked a few things in Wikipedia pitched a fit.
Looks like the musicians have started to cry "foul" over DRM - this is exactly the kind of thing that the labels fear most. In a NYT Op/Ed piece, Damian Kulash Jr. (of Ok/Go) has spelled out the problems succinctly:
The Sony BMG debacle revealed the privacy issues and security risks tied to the spyware that many copy-protection programs install on users' computers. But even if these problems are solved, copy protection is guaranteed to fail because it's a house of cards. No matter how sophisticated the software, it takes only one person to break it, once, and the music is free to roam and multiply on the peer-to-peer file-trading networks.
That's the technical problem right there - none of these schemes are break-proof, and the people willing to break them will do so quickly. Meanwhile, the bigger problem is with the people who legally buy the music, and then can't do what they want with it:
Meanwhile, music lovers get pushed away. Tech-savvy fans won't go to the trouble of buying a strings-attached record when they can get a better version free. Less Net-knowledgeable fans (those who don't know the simple tricks to get around the copy-protection software or don't use peer-to-peer networks) are punished by discs that often won't load onto their MP3 players (the copy-protection programs are incompatible with Apple's iPods, for example) and sometimes won't even play in their computers.
Conscientious fans, who buy music legally because it's the right thing to do, just get insulted. They've made the choice not to steal their music, and the labels thank them by giving them an inferior product hampered by software that's at best a nuisance, and at worst a security threat.
Damian then goes on to point out that having the music spread - even if some of it spreads illegally - is a net positive for the artists. More people hear it, and more people end up buying it. The attempt to lock it up merely gets in the way of the good people, and does nothing to stop the bad people.
Which is why all of these sorts of schemes - DRM for music, the absurd PVP-OPM thing that Microsoft wants to harm us with - these are all stupid ideas that get in the way of law abiding customers trying to legally use a product (CD, DVD, etc).
Lee Gomes of the WSJ thinks that a subset of the technical blogosphere is shaking up tech reporting:
The reality is that while there are now as many tech blogs as stars in the sky, only a tiny fraction of them matter. And those that do aren't part of some proletarian information revolution, but instead have become the tech world's new elite. Reporters for the big mainstream newspapers and magazines, long accustomed to fawning treatment at corporate events, now show up and find that the best seats often go to the A-list bloggers. And living at the front of the velvet rope line means the big bloggers are frequently pitched and wooed. In fact, with the influence peddling universe in this state of flux, it's not uncommon for mainstream reporters, including the occasional technology columnist, to lobby bloggers to include links to their print articles.
There's a reason for this - when you look across the group of people blogging on technology, most of them are "hands on" people - i.e., they are not just talking about tech, they are producing it. Most (but not all) of the technical journalists suffer from the same problem as a lot of technical management: they hung up their tech spurs years ago, and now rely on other people (or their gut) in order to make decisions.
In business, smaller, nimbler companies "disintermediate" the plodding giants that have forgotten how to be nimble (think MS, circa 1985, or Google 4 years ago). In technology reporting, bloggers are getting the jump on many reporters, because they are still working in the field. Not all technical people can write, but there are plenty who can - and they can report on something far more quickly than the journals can.
One thing I've noticed on this - the technical journals - InfoWorld and ComputerWorld come to mind - have embraced blogging in a way that the MSM really hasn't. This has allowed the smarter publications to stay in the game. I no longer have to wait a week to see what Jon Udell thinks, for instance - he shows up in my aggregator instead. Over on the non-tech side of things, look at the New York Times as the epitomy of not getting this change in the landscape: they've put all the opinion columnists behind a pay wall. It's been a pretty good way of removing those folks (and the Times in general) from the conversation.
Hat tip to Daver Winer.
One of the things that came up in this thread was how method categories and partial class definitions make browsing code simpler in Smalltalk. Here's an example of why. In BottomFeeder, I have a package called RSSViewer (it holds most of the UI code for the application). Here's a screen shot of the upper four panes of the browser (the lower code pane is omitted), with one of the extension methods that have been added to selected:

What we are looking at is the top set of panes - starting from the left, we have:
Notice how most of the protocols are italicized? If I were to select one, I wouldn't see any methods. What that's showing me is that there's more code for this class, but not in the selected package. I can narrow my view down to just the methods that are part of this package. However, I don't need to do that - I can see everything, if I want to. Here's another shot, of the same browser, but in hierarchy view:

Notice what's changed - the leftmost pane now shows the hierarchy for the selected class, and the second pane now shows all the packages that define code for that class. By selecting all those packages, I can see all the code for the class - or I can select only a subset of the packages, and see only that.
This is why commenters in the aforementioned thread say that Smalltalk's browsing tools and class extensions make larger numbers of methods palatable - we can add code directly to a class when we think it belongs there (instead of having to define a utility class), and then version off our changes independently of the rest of the system. We can then view our changes without having to see the whole class (or not - we can limit our view by package/class/protocol).
The Smalltalk tools give us a lot of ways to slice our view into the system.
Sources say AOL's role as a critical player in search traffic makes it attractive to prospective partners.
Now, my referers are not representative of the web, but - I rarely see search requests from AOL. I see tons from Google and Yahoo, a trickle from MSN, and virtually none from anywhere else. AOL is bleeding subscribers and revenue - what value do they have to any buyer?
Dare Obasanjo wrote a good piece (quoting 37Signals) on when to worry about scalability. Read the whole post - his summary is very strong:
If you are a startup, don't waste your time and money worrying about what happens when you have millions of users. Premature optimization is the root of all evil and in certain cases will lead you to being more conservative than you should be when designing features. Remember, even the big guys deal with scalability issues.
On a much smaller scale, I can speak from some experience here. When I first coded up the blog server running this site (back in 2002), I had no idea what kinds of scaling issues I'd hit - heck, at the time, I knew next to nothing about HTTP or XML. Had I spent time trying to solve whatever problems I could have imagined then, it would have been a complete waste. I had to learn from experience. Which is not to say that research and knowledgeable staff won't help; just don't assume that you know the answers up front. As Dare says, this is a problem that even the giants (who have a lot more cash on hand than the rest of us do) run into.
Aaron Swartz has a long post up on reddit.com's move from Lisp to Python. It's an interesting post - especially so if you are looking for information on Python web frameworks - but the anecdotes about the reaction of the Lisp community sound very familiar to me as a Smalltalker. Sadly, lots of people in niche development communities have "conspiracy theory" reactions to this sort of thing.
The funny thing is, this gives me an excuse to make a point about reddit versus things like digg and blogniscient. The latter two services provide headlines and snippets in their feeds; reddit only provides a headline (title) and an url to follow - even on their web page. As someone who reads primarily in his aggregator, that makes reddit virtually useless to me. I do a lot of scanning, and - while I favor full content over partial content - partial content is better than just headlines.
John Mitchell makes some assertions in his post about this discussion (my previous post on this is here). The assertion?
However, Elliot is completely right that having 78 methods in any class is an atrocity. Something that has that much surface area is way too complicated for humans to keep manageable. In addition, it also sets a bad example for coders learning the recommended ways of doing things -- i.e., "just throw anything you feel like in there."
I like the way he baldly asserts that 78 methods is "an atrocity". So what's the magic number? Is 22 methods ok, but 23 - heck no, that gets into atrocity range? There's absolutely no way to look at the raw number of methods and make that statement. He's assuming that there must be fluff in there - but that's an assumption, not evidence. The rest of his post is actually quite reasonable - it's just that one thing I object to.
From Blaine Buxton:
It's time for the Smalltalk User's Group. This week we will be discussing Dabble and showing the video demo. It should be a lot of fun! As always bring your cool pieces of code!
Here's all of the details:
When: December 13, 2005, 7pm - 9pm
Where: Offices of Northern Natural Gas
1111 S 103rd Street
Omaha Nebraska 68154Office is at 103rd & Pacific. Guests can park in the Northern visitors parking area back of building, or across the street at the mall. Enter in front door, we'll greet you at the door at 7:00pm. If you arrive a bit later, just tell the guard at the reception desk you're here for the Smalltalk user meeting in the 1st floor training room.
Blaine Buxton, Mad Scientist In Training
"Tipping cows in fields Elysian"-Clutch
http://www.blainebuxton.com
Elliotte adds another post to the "Humane Interface" debate - the quote below follows on from an analogy about which remote is easier to use (an example Steve Jobs gave when introducing Front Row) - follow the link for the picture and analogy. Here's the meat, IMHO:
More buttons/methods does not make an object more powerful or more humane, quite the opposite in fact. Simplicity is a virtue. Smaller is better. Do you want to go all the way down to the absolutle theoretical minimum? For a list class that's probably about four public methods (new, insert, delete, get). Probably not. That's too few, but 78 is way too many. 10-12 is ideal purely from human-interface concerns. (I'd say 7-8 except I don't think most classes can really get that small. Maybe it is 7-8 if we count all overloaded variants as a single method though.) 25-30 is sort of the outside maximum: roughly the most signatures you can fit on a single piece of paper so that the programmer can see the whole class at once without scrolling their eyes. If that still doesn't convince you, tomorrow I'll take another look at the Array class that started this whole brouhaha and show exactly how pointless most of those 78 methods really are.
Well, I'm going to have to refer back to this post for part of the argument. Instead of dwelling on Ruby though (with which I'm less familiar), I'll look at Smalltalk, class OrderedCollection. In a base image, there are 55 instance methods in that class. There might be more with more packages loaded; have a look at this post on extensions to see how that's managed.
Now, I'm pretty sure that Elliotte would dislike 59 methods as much as he dislikes 78 :) Some of this is an Apples to Oranges comparison though. To wit: there are methods in the Smalltalk class implemented for polymorphic reasons that would not be done the same way in Java. For instance: #inspectorClass lets the collection tell the system how the development tools should look at the object. I'm fairly certain that Java IDE's approach that problem differently.
Additionally, exception raising has been factored out to individual methods. For instance:
notEnoughElementsError self error: (#errRemovedTooManyCollection << #dialogs >> 'attempt to remove more elements than are in the collection')
That's an exception that gets raised if we try to access past the end of a collection (on either end). An example:
removeFirst: numElements "Remove the first numElements elements of the receiver, and answer an Array of them. If the receiver has fewer than numElements elements, create an error notification." numElements > limit ifTrue: [^self notEnoughElementsError]. ^self privateRemoveIndex: 1 to: numElements returnElements: true
In Smalltalk, there's a strong bias to make the object responsible for its own actions. So when you try to index past the end, the object itself raises the exception - it's not handled by deep machinery in the VM.
Elliotte says that 10-12 methods are "enough" and that past that, we get into bloat. Well, looking at class OrderedCollection, I'm not sure what he'd want me to pull out. I suppose he might consider #add:before: fluff, but it's a useful method - it allows me to add some object before some other object in the collection. There's a ton of convenience methods of that sort in the class. Would it be better to simply have #add:, and then force developers to write their own versions of all the convenience protocol in their own classes? Recall that in Java, I can't extend a class, so these new methods will end up in some utility class. Clean OO, that's not.
Smalltalkers - and I think Rubyists - look at this problem very differently from Java folks. The Java people seem to like sparse classes, but they don't seem to realize that sparse classes combined with an inability to extend leads to everyone creating their own set of utility classes. In Smalltalk, the useful protocol that people add tends to migrate up to the vendor over time. For instance, in VisualWorks 3.0, OrderedCollection had 53 methods. More interestingly, the abstract Collection class (Collection) had 40 methods in VisualWorks 3.0 - and has 51 now. What we seem to have a two very different approaches to the class design problem. I think the Smalltalk/Ruby one is better, because it favors putting code where it belongs. The Java approach implicitly favors lots of utility classes.
This kind of weather is not what we normally see in December in Maryland - at this time of year, it's usually the full excitement of 40 degree rain :)

Time to man the sleds!
Elliotte Harold jumps the shark (with an assist from Cedric Beust) with this:
there is a bigger problem with dynamic languages in general, and this problem has been completely underestimated so far, which probably explains why dynamic languages are not making fast progress in developer mindshare.
This problem is the lack of IDE support.
*Cough*
I hardly know where to start with such nonsense. I suppose I could mention that Smalltalk has had auto-completion available for years, and that it was first implemented (and integrated into the tools) by customers. There may be a lot of Eclipse plugins, but how many of them are created as a "I wonder if I could..." thought over a couple of hours? Not many, I'd warrant. But just ask these guys - there's no IDE support in dynamic languages, so it didn't actually happen. Cedric manages to keep digging:
Auto-completion in IDE's has become extremely smart these past years. Refactoring is also a practice that modern developers have become completely hooked on, and for good reasons.
IDE's for dynamic languages come nowhere close to this level of functionality, and whenever I program in Ruby or Groovy, having to leave my IDE of choice is not only hard, it sometimes makes me decide against using the dynamic language, even if it's a clear winner on paper.
Ahh yes, for the examples he picks an Open Source project that isn't funded by a large corporation (I'm speaking of Eclipse), and a language that was dropped into the JVM and then forgotten. No mention of Smalltalk, or Lisp. Would it be too hard to have a look at the ancestors of all dynamic languages?
And refactoring? Where do Cedric and Elliotte think that was invented? I'll give them a hint - it wasn't here. Or here.
These guys need to go here, or here - grab Cincom Smalltalk or Squeak. See what power tools look like.
Update: Cees doesn't think much of Cedric's point either, and explains why.
Bill Machrone at PC Magazine lays out the problems that have come out of the DMCA (here in the US - there are similar laws either on the books or being pushed elsewhere):
But if I did, I'd probably be in violation of the Digital Millennium Copyright Act, and it just might become the high-visibility test case that has me, PC Magazine, and Ziff Davis Media staring down the barrels of a lawsuit. Everything you need to know is on the Web, of course, and pointing you to the links would be the courteous thing to do. I'd planned to write a Solutions story on how to remove the driver that prevents your PC from ripping protected CDs, but I chickened out, because companies such as Sony and EMI have announced that they are upping their commitment to SunnComm and Macrovision copy protection on their releases. This means that they're now after the little guys, in addition to the counterfeiters, bootleggers, and big file-sharing networks.
This is the place the bozos at the RIAA and MPAA want to take us - and companies like Microsoft are only to happy to help them. Bill has an idea about what should be done:
Fortunately, the DMCA was enacted with a built-in review period, and it's time for the federal Copyright Office to review the anticircumvention provisions. If you would like to comment online, you can do so at www.copyright.gov/1201 /comment_forms/index.html.
I'm with Bill on this one
I got this note from Andrew McNeil, a Cincomer in Sydney, Australia:
The Sydney Smalltalk Users Group is meeting on Monday 12th December 6PM at the James Squire at Kings Street Wharf down at Darling Harbour.
http://www.malt-shovel.com.au/frames.asp?page=brewhouse.asp
Special guest will be David Long.
David is the inventor of Atlantis Business Technology and produced the company's first patent application. He is the Chief Technical Officer and co-founder of the Atlantis software startup.
David will be talking about Development of Real-Time Applications with Atlantis and about the Atlantis technology in general.
Atlantis application is uniquely able to capture expert knowledge from human input and automatically generate a running program in a matter of minutes. The program duplicates programming functions in exact replication using a new modelling language known as ESGATEA.
This new and powerful programming language is designed to fast-track the product development process, in turn enabling customers to focus on their core business of bringing their products to market.
This is kind of an inside baseball thing for the podcasting world, but if you follow that stuff at all, it's funny :)
Learning Seaside points to a set of community provided components for Seaside. Check out the Shore.
Blaine explains the difference between a Smalltalk environment and something like Eclipse:
I generally look at Smalltalk's IDE as playing with a live patient. You are in the middle of a living and breathing system that reacts immediately to you. There's no shutdown, compile, restart, and retry. It's all happening right here and now. It's an incredibly cool experience especially when you realize that you can execute any code and inspect the state of the system. Eclipse on the other hand is like looking at your objects through a window. You can do some manipulation, but you can't mess around with the guts of the patient like you can in Smalltalk. The thing that truly shocks me is why Ruby and Python developers still try to mimic Eclipse (ie. run the code in a different process) in the IDEs available. There's no IDE for them that allows you to be in the middle of a live system. Why wouldn't you want that? I can't wait till Ruby does have a great IDE like Smalltalks. It turns the amp to 12 instead of a mere 11.
And that really is the difference. Take the server running this blog - it's a headless (i.e., no UI) development image. When I update it, I can load code that modifies existing objects in the system. Need to add an attribute to all the registered users? No problem - I load the code, and every single extant instance gets the new attribute.
The same power exists at development time and and runtime. In the Java sphere, you don't get that power during development, much less at runtime. Which is why I call Java tools - even well regarded ones, like Eclipse - pale shadows.
Well, the forecasts were all calling for 3-8 inches of snow overnight - it looks more like 2 on my driveway right now. The schools closed, of course - this is Maryland :) Heck, they only just managed to get the roads cleared off. It might be enough for sledding, but I'm trapped on conference calls at the moment. We are making our go/no go decision on the release candidate for Cincom Smalltalk this afternoon - fingers crossed, it all looks good.
I boggled when I started reading Tom Yager's latest column - "Reviving Native Traditions". He's out there, but at least I know why he still thinks that the iTanium has a future - he's pushing for a resurgence of C++ (et.al.):
Even though it tags me as a graybeard, I have a firm belief that the welcome trend toward slower, cooler, more power efficient systems, as well as powerful converged mobile devices, requires nosing away from VB, Java, and .Net and back toward software that compiles from an editor down to byte patterns that match a target CPU’s unique, or native, machine language. One finds the antithesis of Java and .Net in C, C++, and Objective-C, the most popular programming languages that compile down to native code.
Yes, please pass me more buffer overflows now. Yeah, I know there are techniques to avoid them, and I know that "everyone" should know them. I think the history of the last decade shows that far too many people don't care - even at major vendors. System level sandboxing (something he mentions later in the column) is a great idea - and far better than the Java theory on that - but having an application take down an OS sandbox, while less bad than taking down the whole system, is still bad.
Heck, his own magazine contradicts him in the same issue.
In news fthat should be from the past, Microsoft announces that they are bringing Windows up to the state of the art... circa the mid 80's:
Microsoft Corp. is working on a significant new feature for Windows Vista, known as Restart Manager, which is designed to update parts of the operating system or applications without having to reboot the entire machine.
Microsoft officials have not talked much publicly about this new feature, but Jim Allchin, the co-president of Microsoft's platform products and services division, recently told eWEEK that this is an example of just how important the reboot issue was to the Redmond-based software giant.
Yahoo has purchased del.icio.us:
We’re proud to announce that del.icio.us has joined the Yahoo! family. Together we’ll continue to improve how people discover, remember and share on the Internet, with a big emphasis on the power of community. We’re excited to be working with the Yahoo! Search team - they definitely get social systems and their potential to change the web. (We’re also excited to be joining our fraternal twin Flickr!)
That will definitely help them with ongoing scaling. Looks like it's a Google/Yahoo/MS fight for web eyeballs.
I posted on a confusing story out of France awhile back, and asked for clarification. Now, there's a good story on what's going on here. As it happens, France (and Spain, for that matter) are in the process of codifying an EU directive on copyright law from 2001. The issue comes up based on a few potentially troublesome aspects of that law - troublesome for OSS advocates and for commercial vendors alike. Here's what the OSS side doesn't like:
One proposal would require that all software enforce digital rights management, or DRM, a sort of digital lock intended to prevent illegal copying.
"This would basically undermine the fundamental principles of open-source software," said Loïc Dachary, vice president of the Free Software Foundation France, who is a software developer for Mekensleep, a Paris video game maker.
Based on how vendors currently want to "help" us with DRM (Sony and Microsoft come to mind), I think this is a terrible idea. It will bring all the worst aspects of the DMCA to Europe, in my opinion. The vendors have their own issues with the proposed law:
One would require software makers to show competitors the underlying source code of any DRM components in their products. The other would make software makers liable for damages from entertainment companies or artists even if their software were altered by criminals to perform illegal copying.
"We are very concerned about these two proposed amendments," said Francisco Mingorance, director of public policy in Brussels for Business Software Alliance Europe.
A sponsor of the French legislation, however, played down the concerns expressed by both factions as exaggerated and said lawmakers would ultimately strike the right balance between business and open-source interests. "What you are hearing now is a lot of nervousness as the legislation moves closer to a vote," said Senator Michel Thiollière, the main sponsor of the copyright legislation in the French Senate, which will vote on the issue in January. "I believe lawmakers will ultimately find the balance to protect the rights of artists and to preserve the best possible access for people who want to legally enjoy the Internet."
The danger is, since both OSS advocates and vendors have problems with the proposed law, it could easily be seen as the sort of "valid compromise" that makes everyone a little unhappy (excepting the RIAA and their European brethern, of course). This sounds like a train wreck law - let's hope it gets derailed.
Via Steve Rubel, news that Google is launching Google Earth for the Mac. They must be seeing a decent proportion of Macs out there to do this.
Time for the weekly look at the logs - looks like 376 BottomFeeder downloads per day this last week. The details:
| Platform | BottomFeeder Downloads |
| Windows | 591 |
| HPUX | 527 |
| Mac 8/9 | 439 |
| Sources | 385 |
| Mac X | 297 |
| Linux x86 | 154 |
| Update | 84 |
| CE ARM | 64 |
| Linux Sparc | 23 |
| Solaris | 22 |
| Windows98/ME | 20 |
| AIX | 9 |
| Linux PPC | 9 |
| SGI | 6 |
| CE x86 | 3 |
| ADUX | 2 |
| Source Script | 2 |
That looks about the same as last week - on to the html page accesses:
| Tool | Percentage of Accesses |
| Mozilla | 47.3% |
| Internet Explorer | 40.9% |
| Other | 5.3% |
| MSN Bot | 3.1% |
| Google Bot | 2.4% |
| BottomFeeder | 1% |
Total readership was up last week - I guess that "Humane Interface" kerfuffle added a few :) Finally, the RSS results:
| Tool | Percentage of Accesses |
| Mozilla | 25.8% |
| Other | 16.3% |
| BottomFeeder | 13.3% |
| Net News Wire | 10% |
| Safari RSS | 4.5% |
| Internet Explorer | 3.7% |
| BlogSearch | 3.4% |
| Magpie | 2.8% |
| SharpReader | 2.7% |
| Planet Smalltalk | 2.4% |
| RSSReader | 2.3% |
| NewsGator | 2% |
| RSS Bandit | 1.6% |
| Feed Reader | 1.4% |
| Java | 1.4% |
| BlogLines | 1.3% |
| JetBrains | 1.3% |
| Feed Demon | 1.2% |
| Liferea | 1% |
| News Fire | 1% |
| Python | 1% |
| Google Bot | 1% |
Still tons of diversity in that tool list.
digg.com has a funny bit - there's an iesucks.com out there, and MS bought the domain mozillasucks.com :)
I though that patent laws in the US were getting ridiculous. Well, it seems to be a race to the bottom, with the EU poised to take the lead: they want patent violations to carry criminal (i.e., jail time) provisions:
For once, declared adversaries are on the same side of an argument in the technology industry: Both sides are urging European lawmakers to drop legislation that would impose prison time on patent violators and that they say would stifle innovation across Europe.
It's a rare thing to see industry lining up with the EFF, but here it is:
Heavyweights like Nokia and Microsoft on one hand, and the grass-roots Foundation for a Free Information Infrastructure on the other, are making common cause against wide-ranging legislation proposed by the European Commission that would criminalize all intellectual property infringements, including patents. The law would provide blanket protection to all forms of intellectual property through the 25 countries of the union.
I suppose it's a small comfort for software developers that the EU rejected software patents recently (although, that fight is hardly over). If the people pushing this kind of thing in patents, along with the forces of copyright madness (the RIAA, MPAA, and their brethern in Europe) have their way, we can look forward to a complete stifling of forward motion.
Until a few minutes ago, the server was running slowly - I wasn't sure what the original problem was, but on restarting it, it turns out that I had a timing issue with the startup of one of the services. I've gotten that handled, and things are back to normal now.
Just when I was getting ready to slingshot around the sun for a trip to 1066, they tell me it's not possible. Now my whole day is ruined :)
Heh. About the size of it, I think :)
Oh, and there's another great post on that blog - make sure to read this.
Mark Derricutt weighs into the live/dead debate with some comments based on his Smalltalk experience:
Sure, alot of the time Smalltalk gives you this "everything is live" scenario, the problem I have is when Blaine (and others) say "there's no shutdown, compile, restart, and retry" which goes all the window when you start asking them about deploying an application.
I've been using Dolphin Smalltalk from Object Arts off and on for the last year for a small windows project, to get an executable you strip the running image down to the executable you ship to clients. As part of this "stripping" process, all the classes and methods that are unused in your application are (as they process implies) stripped/removed leaving you with a nice small redistributable application.
A problem I've often encountered with this is that often methods or classes that I'm using, but don't reference directly in code (class names set in config files etc.) also get stripped causing a problem that only occurs at "run time" - a state of the application where all the wonderfull "everything is live" functionality of the image isn't available. There's no means to update classes on the fly because the compilers been stripped out, I could include it - but then I'd be violating Object Arts licence aggreement. My only hope of debugging any problems is to take a generated .ERRORS file (stack trace, thankfully one that includes all local variables at each point in the stack), load up the image, load the strack trace into Ghoul and hope I've not changed the source too much.
Well, let me take these in turn. Producing an application in Smalltalk is often the hardest part - the downside to having there be a blurred line between development and deployment is the line drawing. Now, I don't use Dolphin, so I can't comment on their process. In VisualWorks, I have a fairly automated process for turning the crank on a BottomFeeder executable. It's not as simple as it could be, but it's not Makefile maintenance either :)
As to the compiler and online updates - there are no license restrictions in Cincom Smalltalk that prevent you from shipping the compiler. Way, way back in the day, when VW 2.5 was the current release (around 1995), ParcPlace-Digitalk (The vendor at that time) had such restrictions. They went with the release of VW 3, and have not come back. I post examples of screwing around with the Smalltalk system in BottomFeeder all the time here, for instance - and I ship updates as new versions of parcels, that get re-loaded over the existing code.
The issue Mark's talking about is a legal problem, not a technical one - and it's not a legal problem in any other Smalltalk system that I know of.
One last thing on deployment - it really depends on whether you are talking about a client or a server. For a client (especially a Windows or Mac client), you want to package up an executable. This matters a whole lot less on the server. The server running this blog, for instance, is a development system that was saved with the GUI turned off. It's still a full bore development system. In fact, if I were having a real problem with it, and wanted to know why it was doing something, I could have it save itself in the state it got into - and then download that image (meaning, I could save it separately, not impacting the running server outside the save window itself).
I've done that a few times, in order to see why certain things are happening. Which is the difference between live and dead.
I've won my first game of civ 4, but I've also learned something less fun - and my friend Mike warned me about the same thing. After I play a game and quit, the PC simply isn't in a good state. Everything is slower - there must be things still running (although, I can't find them). So the only answer is, after each session I need to reboot. Joy.
Troy posted a comparison of some C# logging code and a simple translation to Smalltalk - and then noticed that the Smalltalk code was a lot slower (nearly 5x). Well, this calls for the profiler. I got the same results for all three of his scenarios in Smalltalk, so I'll compare the code for the class test and for the instance test. First, I loaded Troy's code. Second, I went to the Parcel Manager and loaded the Advanced Tools (there's a legacy name for you) - which brings in the profiler. Profiling the code:
TimeProfiler profile: [TimeLoggers timeClassLogger: 200000].
Leads to this result:
You can click through to see the larger view. The upshot is, the original logging code sends #today to class Date multiple times within the logging code (instead of once). Additionally, it turns out that #expandMacrosWith: - while convenient - is fairly expensive. You can see all that in the expanded view. In any case, here's the original code:
writeToLog: aString
(self fileStream)
nextPutAll: ('%<!--
<1p>/<2p>/<3p>'
expandMacrosWith: Date today
dayOfMonth
with: Date today monthIndex
with: Date today year)
To change the performance, I did two things. First, I changed the code above to just print the string that was sent in, and then I changed the calling code to send in the string with the Date formatted. I could have encapsulated that in the new code for the above, but in any case, here's the new caller:
1 to: iterations
do:
[:i |
si
writeToLog: ('Testing write to log via
basic logger - line number ', i printString,
' ', todayString)].
A better variation would have the todayString done in the logger - it doesn't force work on the user of the code. In any case, this variation yields logging code that is still slower than the C# code, but not absurdly so. I also posted that - 1.1 is the faster (but less well coded) version, with 1.2 being the better way. That code has the caller simply send in a string, to which the date will be appended, as follows:
| todayString | todayString := Date today printFormat: #(2 1 3 $/ 1 1 ). (self fileStream) nextPutAll: '<-- '; cr; nextPutAll: aString, ' '; nextPutAll: todayString; cr; nextPutAll: '-->'; cr; flush
On my system, that runs a a bit faster than the better encapsulated version, but not much.
The upshot of all this? Two things:
Again, all the code for this is in the public Store.
Steve Wessels has a nice roundup on some very good board games. I've played most of them, and can heartily recommend them as well. Put these on your gift lists!
Vassili has posted a bunch about his new Announcements framework - if you want to catch up, there's a Wiki page with links to everything.
Date Obasanjo is frustrated with the Newsgator API, and I recognize his frustration:
So what does this have to do with the Newsgator API ? Users of recent versions of RSS Bandit can synchronize the state of their RSS feeds with Newsgator Online using the Newsgator API. Where things get tricky is that this means that both the RSS Bandit and Newsgator Online either need to use the same techniques for identifying posts OR have a common way to map between their identification mechanisms. When I first used the API, I noticed that Newsgator has it's own notion of a "Newsgator ID" which it expects clients to use. In fact, it's worse than that. Newsgator Online assumes that clients that synchronize with it actually just fetch all their data from Newsgator Online including feed content. This is a pretty big assumption to make but I'm sure it made it easier to solve a bunch of tricky development problems for their various products. Instead of worrying about keeping data and algorithms on the clients in sync with the server, they just replace all the data on the client with the server data as part of the 'synchronization' process.
There are plenty of feeds in my list that don't have guids, and I moved away from using the link item a couple of years ago as a backup - too many were nil, and too many items seemed to crop up with the same link. Those problems don't seem so bad now, but I came up with a manufactured ID when there's no GUID. Which there frequently isn't - running this code in my BottomFeeder image:
(RSSFeedManager default getAllItems select: [:each | each guid isString and: [each guid size = 32]]) size
gives me 8,378 items - out of a total of 17,045. Nearly half. So yeah, it's frustrating.