Scripting
Danny Ayers talks about scripting, and how Smalltalk doesn't really need a distinction between the "real stuff" and the scripts:
What 19s more Smalltalk doesn 19t need the distinction between a scripting language and 18the real stuff 19 - it 19s all the same language, available to the developer/user. Ok, Konfabulator and Dashboardhave got access to web functionality, but then so do most ST systems, in a considerably more transparent fashion.
What's interesting is that there doesn't need to be a separation between runtime and development time either - I've scripted BottomFeeder, for instance. This should get even better starting with the 7.3 release of VisualWorks (late November). Why? because we are going to push out support for a defined runtime environment - including support (on all platforms) for stdin/stdout). That should make things interesting.
Excellent observations
A lot of good observations here - go look at all of them. I'll quote the three I liked best:
- Bad code without bugs beats good code with bugs.
- Shipping code with bugs beats non-shipping code without bugs.
- Write code for clarity rather than speed. Please. More problems are caused by complicated code and than "inefficient" code.
Very good things to keep in mind on any project...
Heavy duty
Joi's post on yard work reminds me of my experience putting in a patio. We were putting in a 20'x20' square brick patio - I started with a shovel, clearing out the grass. I'd gotten a few feet into that when a neighbor marched over, demanding our phone book. He opened it to a rental place, and explained to me how I really, really wanted a turf cutter. Boy, was he ever right. I rented on of those, and the grass was off in a jiffy. That still left the sand and gravel though - and you always need more than you think. I can tell you, 9 1/2 tons of sand and gravel by wheelbarrow from driveway to back yard is a "character building" experience. I never learn, either - I just ordered more brick for some more walkways we want to put in...
Some Bf questions answered
In this post, I asked for some feedback on Bf. I got quite a bit, thanks! I should explain a few things to make it clear how and why some things are the way they are:
- Startup times - startup can be slow after updates have been downloaded. Why? Well, because patches are newer versions of parcels (components) that are already loaded into the system. I ship a base image (or exe on Windows) with the parcels pre-loaded, since there are 15 components that can be updated. If they are loaded at startup, it would be slower (yes, I've tested this :) )
The question I got asked is - "Can you save the image after patches are loaded?" Well, no. On Windows, I have a merged executable and image - so it's not really a possibility. But beyond that, saving an image at such a point would put it into a different state than the known startup state. Patches can also be loaded on the fly, without restarting - a save in that case would also save all current application level state - not something you would want. This aspect of the system is what it is, more or less - unless someone can come up with a brilliant idea that I haven't thought of...
- During update cycle bf 'hiccups' too much, sometimes I have to wait multiple seconds before the app responds to a mouse click.
Well, that's simply some kind of name resolution or network access issue - it's a general problem with network applications. If Bf becomes completely unresponsive, it means that a network access is waiting at the VM level. This is a general issue that I've asked our engineers (VW engineers) about
- Redo of the folders
Rich and I have talked a lot about this - it's something we will likely approach when we make the cutover to Pollock.
Development, as translated....
Hehe - this is funny:
| Development phase, by its old name | Truly representative name for the phase |
|---|---|
| Analysis | Dream |
| Design | Guess and Waffle |
| Build | Hack and Play |
| Test | Wobble and Groan |
| Deploy | Push and Pray |
| Support | Duck and Deny |
About the size of it...
RSS Marketing
RSS looks like the next wave for marketing:
The Redwood City, Calif., company this quarter will release a version of LiveMessage that lets users send messages via RSS feeds. LiveMessage, released earlier this year, uses public instant messaging networks to send communications not only via IM but also via e-mail, SMS (Short Message Service) and desktop alerts.
Bf 3.6 is close
The latest dev downloads (scroll down on that page) have been updated to the latest stuff - I'm hoping that the only change I'll need to make is in marking the "About" box as not beta. I listed the new features over here
Tinfoil connections
Whatever my local power company did when they set up power in my neighborhood, they did it wrong on my end of the street. We lost power for 4 hours this afternoon - the entire rest of the neighborhood (other than the strip of houses near us on down) were fine. The cable company showed up and put a generator on the cable box in my front yard, so that everyone else could watch TV and use the net. Grr. This isn't the first time this has happened either - it's a fairly common thing around here. It came at a very bad time though - I was about to head out and buy supplies for tomorrow's cookout... which I put off because the power (and thus all the refrigeration) was offline. Swell - so instead, we spent the day doing yard work. It needed doing, but now I'm exhausted and sunburned. Off to the grocery store anyway, for burgers, etc....
Croquet gets noticed
Looks like Croquet is getting more attention - Alan Kay's talk from last year is starting to get noticed.
BottomFeeder site facelift
Thanks to Denis Johnson, the BottomFeeder home page has received a facelift - using the same graphics he gave me for the application itself. It's a very nice improvement, and I couldn't have done it without the help. Thanks!
Happy 4th!
We'll be celebrating the 4th in the traditional manner - barbecuing hamburgers and hot dogs, and consuming vast quantities of various beverages. I'll be getting ready for the shindig most of the day, so don't expect a lot of blogging from me. In the meantime, have a look at Blaine's post - more real world Smalltalk!
Proof that politics isn't always serious
All I can say about this is ROFL. How often do you see a cabinet member doing YMCA? :)
A Smalltalk Solutions Question
We (STIC) have started planning for StS 2005 - we are trying to select a location. We have some ideas, but I have a general question - if we held the show in a "vacation" location, would you be more likely to come, or less likely? Would you be interested in combining the trip with a vacation if we did that? Or, would you rather that we made a selection along the same lines as the last few (Seattle, Toronto, Chicago...)? Thanks!
Mission Accomplished
Burgers and dogs were grilled, kids ran around like maniacs, and one of the neighbors lit off some impressive fireworks. We had some early rain, but then it cleared up and got to be pretty nice. It was a great 4th!
Why things don't always get better
Improvements come in spurts, not in a straight line. Why? Well, here's an example of wait time: Scoble is off about the Tablet again:
Tim's "senior person without a soapbox" was complaining about not seeing any improvements to notebooks in 14 years. Hmm, ever see a Tablet PC? You can't use your notebook while standing up, but I can. That's a huge improvement in UI.
Hmm - I can count the number of times I've wanted to use a computer while standing - it's a small number. And no, airport security lines don't count. Why? Well, you imagine holding a tablet PC, a shoulder bag with your clothing, and the computer bag - and then figure out just how comfortable you'll be with a Tablet taking up both hands. Now add a child to watch, or a wife you should be talking to... this isn't a use case, it's a non-use case. I've yet to see anyone doing this at an airport, and I travel a fair bit. So far as I'm concerned, the Tablet really isn't a big deal - No one I know wants to write with a pen.
Now, the question is, are we about to see a 3D user interface revolution? Sun has been showing around its cool LookingGlass user interface. Microsoft has a bunch of 3D stuff in the lab.
Yeah, and I've been pointing to Croquet as well. We were talking about this on the IRC channel the other day - outside the games space, just how useful would a 3D user interface be? At least Scoble is properly skeptical about this one (follow the link to his site).
Maintain distrust
Charles Miller gives a great example of how little it takes to make you wonder. In discussing "The DaVinci Code", he describes how he felt after reading a segment that talked about Cryptography, a subject he knows something about:
It would be easier to overlook this if the name-drop served any purpose other than as a shout-out to crypto nerds. It's not as if Bob Bookreader is going to think aha! The writers, respectively, of Applied Cryptography, and PGP!, A small part of one percentile of the book's audience would have the vaguest clue who the names belonged to, and those people would also understand why it's wrong. For everyone else, you may as well have skipped the names entirely. Surely that's worth the two minute Google search to find out who to credit?
This is the same kind of Cognitive Dissonance I experience every time I read a story in the popular press about software developement (or just about any aspect of computer science). It's a subject I know well enough to know when I'm reading uneducated cruft, and it then makes me ponder the other news in the journal/newspaper - I think "If this section is so bad, then just how much should I trust the information they convey on technical subjects I don't know much about?". I've gotten really cynical about science reporting in general because of this...
BottomFeeder 3.6 released
BottomFeeder 3.6 is out. What's new?
- Added "Newspaper view" to BottomFeeder. Users can view all new items (on feed/folder selection) in an html summary, or limit those summaries to individual feeds via property settings. The view summarizes all items (either all new or all today's) at the appropriate selection level. If there are too many items, a paging view is displayed
- Added remote synchronization. A running Bf can query another Bf via HTTP (on port 8666) for its state of items (read/unread). The local image will be appropriately updated. This may be limited by firewalls, so there is also a file import/export mechanism.
- Improved the "is this item new" algorithm significantly, and decoupled the logic from the size of the feed cache.
- Upgraded the Blog Poster with more wiki markup options
- Added the ability to toggle the spell checker on and off for the poster and for the comment tool
- If you browse a document link inside of Bf, Bf will now prompt you to download the file. Previously, Bf logged an error on such requests
- Image display in the HTML component has received more upgrading. This should be improved in the latest release
- Fixed a bug that prevented "Regenerate Feed" from working
There were also a lot of under the cover fixes as well. If you are running BottomFeeder, you should grab the appropriate baseApp zip file from the download site, and then delete all files in the 'app' directory. That's it; you'll be updated after you unzip. You'll see a new directory with some images; thanks go to Denis Johnson for providing the new BottomFeeder logo! Suggestions and comments welcome - I've got a number of ideas for new things in the app, and I'll be posting on them shortly.
How to deal with leftovers
What do you do with all that leftover food? Why, combine it with leftover fireworks! There's a Quicktime video as well :)
Things look right at the All Star break
This is how things are supposed to look going into the All Star break:
| 2004 American League Standings | ||||||||||||
| E A S T - RACE | W | L | PCT | GB | HOME | ROAD | RS | RA | STRK | L10 | ||
| NY Yankees | 51 | 30 | .630 | - | 29-11 | 22-19 | 447 | 400 | Lost 1 | 6-4 | ||
| Boston | 44 | 37 | .543 | 7 | 26-14 | 18-23 | 437 | 380 | Won 1 | 3-7 | ||
| Tampa Bay | 41 | 41 | .500 | 10.5 | 23-18 | 18-23 | 364 | 401 | Won 1 | 4-6 | ||
| Toronto | 37 | 46 | .446 | 15 | 21-20 | 16-26 | 370 | 391 | Won 1 | 5-5 | ||
| Baltimore | 36 | 45 | .444 | 15 | 19-23 | 17-22 | 418 | 448 | Lost 1 | 6-4 | ||
Is it too early to start looking forward to the playoffs?
Primitives and auto-boxing transparency
Patrick Logan points to some pages with some "surprises" for Java developers using auto-boxing. This is the one that tosses some people:
Integer i1 = new Integer( 2); Integer i2 = new Integer( 2); System.out.println( i1==i2);
Integer j1 = 2; Integer j2 = 2; System.out.println( j1==j2);
The interesting issue is that the first answers false, the second true. Now, this isn't a huge surprise; the "==" is doing an identity check - in Smalltalk, this gives you false as well:
1.5 == 1.5
It's an artifact of optimization that 2 == 2 gives you true in Smalltalk. The reason this generates some confusion in Java-land is that an equality check takes more work to write out - recall that "=" is assignment in Java (I didn't recall this at first - it's been too many years since I did C). So to get an equality check:
Java
"hello".equals "hello"
In Smalltalk:
'hello' = 'hello'
And of course, you can override #= in your own classes in order to create a localized definition of equality. The upshot is, people tend to write == in Java where they should be using equals() - and now auto-boxing is going to bite them when they do that. Just look at the comment thread here for an example of the confusion. The problem arises because you can "get away" with using the == operator when using primitive data types. You'll then get bitten if you let the habit carry over to using the new auto-boxing feature. This is another one of those cases where creeping complexity ends up being a real problem...
Blah blah blah
Mark Pilgrim gets pedantic again:
We've been grappling with this issue for some time now on atom-syntax. There's no way around RFC 3023, and believe me we've tried. If you've been downloading XML and throwing it blindly into your XML parser without looking at the Content-type header, *you are doing it wrong*. There's no two ways to look at it. You're just wrong. Stop doing that.
It all depends on context. In a business application, this matters, a lot. You don't want to make assumptions about data there; your assumptions could be disasterously wrong. However, it's not the same thing at all in a consumer context with textual content. For news aggregators, making assumptions about the sort of content you have is fine, because the end user just wants to read the blasted content - we typically aren't talking about B to B data interchange here any more than we are in usenet content. Telling aggregators to reject data that can be interpreted fairly accurately is like telling people to toss the newspaper if parts of the front page are smudged.
Based on current real world feeds, an aggregator simply can't toss feeds based on RFC 3023; you would end up rejecting feeds in large numbers and - trust me on this - have end users telling you that you have bugs in your application. At this point, the best you can do with Content-Type headers is use them as a hint when you see them - because actual practice varies too widely.
Scripting with VisualWorks
Thomas Gagne continues to enhance the scripting support he's been building for VisualWorks Smalltalk - I saw this in CLS today:
VisualWorks Command Line Smalltalk 1.1.3*
Send comments and questions to tgagne@wideopenwest.com
For help, enter:
self help
!!
st self compile: { xyzzy ^'Nothing happens.' }
st !!
st self xyzzy
st !!
'Nothing happens.'
I can even compile the method to another class using #compile:toClass:
I like it so far.
Looks interesting...
Hardhat needed
Some people should bring hardhats to the game:
The next time Sara Denoyer attends a St. Louis Cardinals game, she might want to sit way, way out in the bleachers.
Denoyer and her boyfriend sat down the first-base line at Busch Stadium, watching a game the Cards eventually won against the Seattle Mariners 2-1 on Sunday.
Early in the game, a foul ball struck Denoyer in the neck. Then in the ninth inning, Seattle's Scott Spiezio hit a foul that also struck Denoyer -- this time in the head.
Denoyer was admitted to a hospital for one night for the blow to the head. She chalked it up to bad luck and said she still loves the Cardinals.
Microsoft isn't ceding China to Linux
CNET News reports that MS is heads down in China:
Software giant strikes new deal with the largest system integrator in mainland China.
Tux isn't going to get that market without a fight...
Coming in 7.3 - The SRE
For the Fall release (7.3 VW) we will have a first cut (meaning, this will not be the final word on this) at a well defined runtime environment for VisualWorks. What do we think we'll have? Well, this is what engineering thinks will be there by release time:
- Including a non-tools image that folks can load their parcels into. There will likely still be stripping with RuntimePacakger after that, but if so, we'll try to make the RTP process be as close to one-step as possible.
- Easy access to stdio/stdout in the image
It won't be as clear cut as "drop your parcels here and away you go... yet. We intend to get there. BottomFeeder is a rough proof of concept of that - we want to end up with a system that is:
- Easy to define
- Easy to deploy
- Easy to update in place
The basics will show up in 7.3 (late fall 2004), with more to follow. It's quite possible that we'll have updates to this out of synch with a major release - stay tuned.
SpaceShipOne ready to go
Looks like SpaceShipOne is ready to rock and roll - take a look at the Wired story
Blogging and Syndication in Sydney
I'll be discussing blogs and syndication - with BottomFeeder as an example application - in Sydney next week:
James Robertson of Cincom Systems will be discussing the world of RSS, Atom and Blogging in general at:
Australian Computer Society NSW Branch
joint OOSIG - FOSS SIG meeting:
Date: 15th July, Thursday
Time: 6 for 6:15pm.
Place: ACS NSW offices.
Lvl 4, 122, Castlereagh St
Sydney 2000
Phone: 9261-4411
You can RSVP by leaving a message on the following number - 0413-821-454 or via the contacts for the OOSIG and FOSS SIGS
This session will discuss blogs, blogging, and some of the associated technology (RSS in particular). The focus of the talk will be whether blogs are something of relevance - for project managers, marketing staff, or developers. I expect an interactive session with many questions, as well as an interactive introduction to what a blog is. I'll be taking the tack that blogs are, in fact, useful and worth investigating. I have my own blog - and I also sponsor other blogs on our site
A quick check of the InfoWorld site, the O'Reilly site, Microsoft or Sun will demonstrate that many of the industry analysts and evangelists have started blogging - what this talk will explore is whether anyone in the audience should be.
The talk will reference BottomFeeder - an open source RSS/Atom news aggregator. Other technical issues covered will include:
- Development issues (dealing with RSS, character encoding issues)
- Deployment issues (building a deployable and installable application)
- Cross platform issues (Unicode, character sets, libraries, look and feel)
- On the fly updating of a deployed application
I'll be giving other talks in Melbourne and Canberra - should be a busy 11 days
How dynamic is dynamic?
Keith Mantell is checking on the level of dynamic support in various languages - he tried Smalltalk first:
How dynamic is your (programming) language? I'm doing some experiments on changing classes at runtime without affecting existing instances. With Smalltalk ( at least with Visualworks) this was a breeze: added the code for a variable, accepted it and, hey presto, any inspector open on an instance got a new variable field set to nil.
I can't imagine trying to manage a server without this capability. This blog hasn't been taken down in months, but I've made major changes to the underlying code base. How? By making use of the facility keith mentions, that's how. All the blogs listed here are running in one server, and all of them have a bunch of objects instantiated at any given time. If I make a shape change to a class, I need it to change all the existing instances as well. What I do is test my changes on a local server. If it all works out, I upload the new version of the code to the server (so that a new start would load it), and I upload the change set. I don't restart the server; I just load the change set. Presto, everything gets updated with no downtime. And none of the weird jumping through hoops that .NET requires for this sort of thing either. If you want zero downtime, you need a dynamic language. If you like restarting every time you need to make a change - sure, go grab one of those mainstream systems....
Comment spam
I have no idea how much time the comment spammers spent adding 2-3 spams to each message posted over the last 4 days, but it took me a couple of minutes to delete it all. Nice try bozos...
Running as non-Admin?
Ted Neward says we should run without admin rights on Windows. I agree with him... but it's unfortunately not generally feasible. Why? Go ahead, grab a random set of applications lying around. Now just try to run them as a non-admin user. This actually works on Unix or Linux; for all I know it works on OS X as well (I have no idea). It doesn't work on Windows. Should it? Sure. Until it does, chastising others for doing what they have to do to get by isn't terribly helpful, IMHO.
Recently, Nick Wienholt posted a blog entry over on his APress blog about why he doesn't particularly care about running as a lower-privileged account on his machine when developing software.
With all due respect, this is probably why Nick Wienholt doesn't come up in the list of names of recognized security experts.
How old code bases can be ugly
Panopticon has some fascinating "war stories" about the date handling code in parts of the Windows code base. And this part that I quoted is just priceless:
(I also heard tell that at one point back in the mists of Excel 5 days, the VB team experimented with allowing the language syntax to be localizable. So you could say, I don't know, 1CPor x = 1 a 5 : Escribe x : Siguiente x 1D, if you pardon my horrible Spanish. This turned out to be such a horrible idea that they quickly dropped it and never looked back. But supposedly the legacy lives on in OLE Automation and the fact that IDispatch takes a locale ID when converting names to DispIDs (i.e. so that you could have different method names for different languages). I can't vouch for the absolute truthfulness of this story, but it's one of those stories that's 1Ctoo good to check. 1D)
Without care and feeding, old code bases can get really, really crufty...
Now keep that thought
Jonathan Schwartz had a thought he needs to have someone apply to the JVM:
The industry keeps trying to solve both problems with the same systems. I'm not sure I believe that's a useful pursuit - it seems more true every day: there is no one hammer for all nails.
So about when will the JVM not suck for dynamic languages? Oh, right.... when hell freezes over. Moving right along then...
Internationalization bits
After letting BottomFeeder 3.6 go, I had someone in Germany send me a message about menu performance. One of the recent changes is that the application uses UserMessages instead of strings (I'm still looking for volunteers to translate the catalog, by the way). This makes it possible to have the application translated - but I hadn't actually set up catalogs in the runtime. Well, that can cause speed issues related to the lookup (which defaults to a string) for the messages. Well. Into the doc I went. After learning about half of what I needed, I decided to do the simplest thing in Smalltalk - I executed this and ran through the debugger to see how lookup worked:
(UserMessage defaultString: 'Add Comment to Selected Item' key: #bfAddCommentOnItem) asString
What I discovered was that VW expects a root level directory for catalog searches, and then proceeds to look for subdirectories and catalogs based on locale settings. Ok, I indexed the catalog I had (fixing a bunch of missing quote issues) this way:
IndexedFileMessageCatalog compileAllCatalogsFor: 'catalog'.
and then made sure that the catalog directory was in the search path for catalogs:
"add directory to message catalogs list for lookup purposes" mine := IndexedFileMessageCatalog directoriesModel value detect: [:each | 'catalog' = each asString] ifNone: [nil]. mine ifNil: [| file | file := PortableFilename named: 'catalog'. IndexedFileMessageCatalog directoriesModel value add: file].
Now, I don't know that this is the best way to do this - there's a whole system for registering catalog ids and such, but I'm not using any of that. I'm doing a new build of the BottomFeeder files, and I'll have them uploaded shortly. If you have Bf and have noticed an odd slowdown in menu or UI performance, then grab the appropriate base file:
And grab the new exe or image, as well as the 'catalog' directory. Restart, and that should solve the problem. As usual, inform me of any problems. Hat tip to Thomas Brodt for letting me know about this problem!


