Tuesday, September 30, 2003

FINALLY

OK, I got everything switched over and ok. As you can see, the template has been changed. Now, you might ask me, "Blaine, Why did you change the layout of your blog?" Well, I could say I was sick of the old one, but the truth is simple this: the old one got trashed for some odd reason. So, why not start new? I got almost everything back except for the comments. I plan on getting them assed back REAL SOON. So, don't fret, a minor bump in the road. Anyway, I hope everyone finds their way here!
The Eyes of Alice Cooper

Wow....Again, Alice surprises the hell out of me. The man simply always amazes and I never know what to expect from an Alice release except quality. This is no different! Some of the songs are just plain flat out rock, some punk, but all are loud. They have Alice's trademark snarls and lyrical play. I always thought "Last Temptation" was the closest that he had gotten to the 70's Alice sound, but this one takes the cake. The production sounds awesome! It's going to take several listens to catch everything since Alice always hides a few surprises underneath the covers so to speak. Anyway, a GREAT ALBUM from the MASTER! What are you doing still reading this? GO BUY THE DAMN THING!
Cult Of Dead

The Squeak Wiki is a wealth of information and I enjoy reading it. I regularly read the changes page to see what's new and changed. Well, I came across this excellent article by Jim Benson called:
Cult of Dead. It's a great read. It take a critical look at our community (Squeakers and even Smalltalkers) and pulls no punches. Great stuff!
You made it

Welcome to my new place on the web. If you're seeing this message, you made it...=) Now, I can get back to the business of blogging....=)
Alice Cooper Release Day

Yep, the new Alice Cooper is released today and I can't wait to head down to the local record store and pick it up. Every Alice is worthy of celebration. The master calls my name. I must go!

Monday, September 29, 2003

Moving Domains

Alright everyone. I'm switching domain servers, so the old links to my posts might stop working. I updated all of the links to use my "www.blainebuxton.com" domain name instead of "members.cox.net/blainebuxton". This will probably be the last post I make to the blog at this location. I'll be switching over to a new service tonight. In the iterim, everything is successfully going through my domain name. It's just when I switch servers there might be problems...=) So far, so good though...Sorry for the short notice, but this has to happen in part because of the move to Nebreska. But, I promise once it moves...It's staying for a LONG TIME. Again, I apologize....Please update your links and your RSS feeds!

http://members.cox.net/blainebuxton/weblog/blogger.html is now: http://www.blainebuxton.com/weblog/blogger.html

The RSS feed changes from: http://members.cox.net/blainebuxton/weblog/index.rdf to: http://www.blainebuxton.com/weblog/index.rdf

THANKS AND SORRY!
Ruby Interview With Matz

A friend sent me this link to an interview with Matz, the inventor of Ruby. I met Matz briefly at LL2 and loved his talk. He's one of my new heros. I love the way he thinks and Ruby is an absolute pleasure to work with. I always refer to Ruby as the new Smalltalk with funny syntax and without the environment (I would love to write an environment for it!). Anyway, go read the interview and have F-U-N! Matz Interview
Bloated IDEs

James Robertson made a great blog entry this morning about IDEs: IDE Fun.

The funny thing is that I can start and shutdown Dolphin Smalltalk 6 times while trying to startup Eclipse ONCE. Squeak is the same way (I think I might have gotten 7 out of Squeak though). Maybe everyone should try it as a fun experiment. I mean, I've never had Smalltalk image from any vendor that didn't come up in seconds on modern computers. At work, I have 768 megs of RAM and a Pentium 4, and Eclipse still goes off to lala land (hitting the disk drive for 5 minutes) several times in a day. I still think Eclipse is the best IDE for Java, but I wind up using Scite for all my non-Java needs (html, javascript, ruby, etc) simply because it comes up quickly and doesn't bog me down at all....=) It's a simple text editor that doesn't pretend to be anything more with highlighting and searching.

But, then again, if I had my choice....Oh, how I can't wait to be back in Smalltalk land....21 days till the love is back! But, for now, No sleep till Smalltalk...=)
Erlang
I got the following reply from Alan Kay on the Squeak Mailing List when I replied about Erlang to a fellow Squeaker. I thought it was cool that he too thought it was worthy of looking at.

Hi Folks --

Erlang is worth looking at.

At 11:53 AM +0000 9/29/03, Blaine Buxton wrote:
    Hey,
    I've been reading up on Erlang myself. They have an approach where everything is a process and you send messages to these processes.

This was the approach of the original Smalltalk. It is also used by David Reed in the object-process scheme in Croquet (back to the future!).

    Just imagine having a separate process for each Squeak object.

Andreas Raab has made process switching in Squeak extremely efficient ....

    They argue that processes should be as easy to create as objects. You would think this would kill performance, but actually, the systems they have written in it scale very well (the web server they wrote in Erlang can handle 10x the capacity of a Apache server, if I remember correctly). They also boast numbers of 99.99999% availablity for the Ericsson switch that was written in mostly Erlang. Now, those boasts are what got me interested. It is a functional language and they are big on no mutable state like most functional languages. They argue that Erlang makes multi-processing easy and in fact easier than single process systems. They seem very anti-OO on their list,

Then they don't understand OO or history ...

    but I have found that the whole process thing maps very well to objects.

It does.

    But, I haven't gotten that far. It just seems they have been scarred by the {} crowd and static typed OO systems.

These are OO systems?

    I haven't had a whole lot of time to really get much deeper than that. I bought the book and have been working through some of the examples. They do a lot with pattern matching

Again, like Smalltalk-72.

    and it's made me think about certain programming topics differently.

As I mentioned, this approach is well worth studying. It also harks back to the tail-recursive ideas of Actors (Carl Hewitt) which were derived from Smalltalk, but have many interesting contributions of their own.

Cheers,

Alan

    I know I wasn't the person you were asking for the answer, but I thought I'd chime in.
    ------------------------------------------------
    Blaine Buxton
    My Amps: Smalltalk, Lisp, and Ruby
    http://www.blainebuxton.com

      From: Daniel Vainsencher
      Hi Richard.

        "Richard A. O'Keefe" wrote:
        I like Smalltalk (and Erlang and Prolog) a lot

      [snip]

      Sorry about the off topic interjection, but can you write a paragraph or
      two about Erlang? I've tried to get the flavor of it from
      site/documentation, but haven't quite made it yet.

      Daniel

Could Javascript be more elegant than Java?

I'm starting to believe that I should really try to get Rhino plugged into our Java environment at work. I have wanted it before, but ran into problems that I shall not mention here. Anyway, I would have a dynamic, prototype-based, and functional language at my disposable that takes a lot less code to express the same idea than in Java. Excellent article...Read it now!
Event Handlers and Callback Functions - article - w3future.com
More Javascript Stuff To Read

Think Javascript is not advanced? Go read this blog entry and then read the links. Who would have a thought?! I'm becoming impressed. The prototypical guys might be winning....=) Good reading...
Curiosity is bliss: Advanced Javascript links
Important Words in Marriage

I picked this up from Joeri's Weblog. I must say it's a very good list and great advice.

  • The 6 most important words: 'I am sorry, I was wrong'

  • The 5 most important words: 'You have done it well'

  • The 4 most important words: 'What do you think?'

  • The 3 most important words: 'I love you

  • The 2 most important words: 'Thank you'

  • The most important word: 'WE!'

  • The least important word: 'I'

  • Do Not Read While Drinking Coffee

    Thanks to Micheal Lucas-Smith for this funny link: RoShamBo Programming Contest

    Sunday, September 28, 2003

    Funny FedEx Commercial

    I about rolled over the floor laughing when I saw this commercial: Funny FedEx Commercial.
    Congratulations RAM

    Just wanted to congratulate my friend, Ram Nukala and his wife on the upcoming new Smalltalker set to appear in January! Ram told me last night that they were expecting a new child. WAY TO GO! Ram also showed me some new code he had been working on using JavaScript and CSS. Very cool stuff. I was extremely impressed. He had written a simple rules engine in JavaScript that could be run on both the client and the server. The code was very small and he did his best to convince me on the powers of a prototypical language. I'm thinking he might be succeeding...=) Anyway, I can't wait to see the pictures of their new baby when it is born! CONGRATS, my friend!
    Call me a nut as well...

    James Robertson has been called a "nut" in one the java newsgroups. Too funny. Read about it here. It's nice to be in the company of fellow nuts...=) I think you know you are pushing people's buttons when they have to go to the level of calling you names. How "smart" of them...
    More thoughts on VMs

    I read Richard Demer's comments on VMs and now, this whole idea of a universal VM has got me thinking. My thoughts are that I think current VMs are too static. Why couldn't we make features loadable via shared libraries? Want to have more byte codes? Plug in a new "feature" into the VM and your new byte codes work. Want to support type safety? Plug that in too. Now, I would recon that some features might actually clash with others, but then, we could partition our VM so that multiple languages could run in the same space. Binding features at runtime to VMs sounds like a cool idea for research...Maybe I should chalk this up to YAPTD (yet, another project to do)? Anyway, it would be fun to play with, I must admit....=) I wish I was going to Lightweight Languages this year and discuss this with the folks there. Some extremely bright folks out there!
    Re: Nifty Trick

    Got the following reply via email about my Nifty Trick post. I've posted my reply along with the original email. Enjoy!


    Hey,
    First off, thanks for your comments! I thought about doing it the way you specified. But, I decided the proxy was too much. Here's why: There's only a handful of methods that need to be recorded in the public interface of the agent actually. And I thought the #triggerCommandEvent was easier to implement. Now, the agent simply "broadcasts" events and doesn't care if anyone is recording them or even listening to them. So, you could have mulitple recorders listening to the same agent. The tape registers itself as a listener on the agent object only when it is in "reocrd" mode. Otherwise, the tape is not registered and does not care what the agent is doing. Actually, the tape has several states it can be in and this is implemented via the State pattern. So, it's acutally, the "record" state that registers itself to the agent and unregisters when stop is pressed. I need to put up the source for the Agent program soon. But, I love these types of design discussions.

    I posted the nifty trick simply because "walking the stack" is a pretty cool feature of Smalltalk and most dynamic languages actually. I must admit that I try NOT to use it, because like you said, "it makes the code less portable", but I knew when I wrote the agent that it would just run in Dolphin. Also, I thought it was cool to generically "record" the method by walking the stack and then calling that method with its parameters on any object that implemented that protocol. Now, my code for the Java Serialization is a different matter. I want to make that portable as I can. But, I thought I would at first implement it in Squeak and then worry about portability issues.

    Thanks for reading my blog!
    ------------------------------------------------
    Blaine Buxton
    My Amps: Smalltalk, Lisp, and Ruby
    http://www.blainebuxton.com

    >From: Reinout Heeck
    >To: blainebuxton@hotmail.com
    >Subject: Re: Nifty Trick...
    >Date: Sun, 28 Sep 2003 14:23:16 +0200
    >
    >Your blog's reply box only allows 400 characters :-/
    >So I respond by email.
    >
    >
    >
    >----------
    >
    >
    >It seems to me that when you use your code to replay the 'tape' the
    >actions get added to the tape once more.
    >
    >Is this the intended behavior or do you switch to a different object
    >(no recording) when playing back?
    >
    >
    >
    >Allow me to suggest a variation:
    >
    >remove the calls to #triggerCommandEvent and instead wrap the Agent
    >with a generc proxy, implement #doesNotUnderstand: on the proxy to
    >both record the message and resend it to the Agent.
    >
    >Advantages:
    >
    >1) no more stackwalking so more portable code
    >2) possibility to wrap multiple recorders around one Agent
    >3) more generic: you can now record messages to any object type
    >4) decoupling: the Agent does not take on the responsibility of
    >recording. (The developer does not need to remember to insert 'self
    >triggerCommandEvent' in the right places)
    >5) clearer code:
    >
    >Agent>>withRecorderOnTape: aWriteStream
    >
    > ^Recorder on: self tape: aWriteStream
    >
    >
    >
    >Recorder>>doesNotUnderstand: aMessage
    >
    > tape nextPut: aMessage.
    > ^subject
    > perform: aMessage selector
    > withArguments: aMessage arguments
    >
    >
    >
    >Disadvantage:
    >this breaks encapsulation, the calling code needs to know which
    >message sends need recording and which don't and send them to the
    >correct object (agent vs wrapped agent), see 4) above.
    >
    >
    >
    >Cheers!
    >
    >Reinout
    >-------
    >

    Saturday, September 27, 2003

    Nifty Trick...

    OK, in my MS Agent Remote Control program I needed to record the actions that one can do to the agent object. I have an agent object that wraps the COM object. Here's an example of a public method that does some action that I need to be able to "record" and playback:

      speak: aMessage
        self triggerCommandEvent.
        self control speak: aMessage

    Now, self control returns the COM object. The method: #triggerCommandEvent is where things get interesting, though. Every method that needs to be recorded and played back calls this method first thing. Now, here's the implementation of the #triggerCommandEvent:

      triggerCommandEvent
        | stackFrame |
        stackFrame := Processor activeProcess topFrame sender.
        self triggerCommand:
          (Message
            selector: stackFrame method selector
            arguments: stackFrame arguments)

    This method is very interesting in that I don't have to have a specific piece of code in every method that wraps their parameters and name. Now, I have one method that I simply call and it walks up the stack picks off the information for me and then, wraps it in a Message object that can be used to call this object again. Now, notice that I didn't specify "self" in the message. It's because the message might not be coming back to me. There's an object that records these "actions" and call it a tape. This tape can be "played" back on any object. So, when you're playing with the agent and press "play". It plays back the "tape" on the agent object. But, what happens when you want to output the script? Well, I created another object that has the same public protocol (interface if you will) as my agent object. Now, we simply play the tape back on this object and the "script" object writes out JavaScript code instead of triggering actions on the agent.

    The thing I like about this is that there are several ways to do this, but being able to walk the stack allows you to do some rather elegant things and some less typing...=) Now, the above code is different in every Smalltalk, but you can do it. You can even do this concept in most dynamic languages. I know this isn't the greatest show of Smalltalk's abilities, but it's one of those things that I thought was nifty.
    More interesting stuff to check out

    Another language I need to check out. Lots of documentation on their site and I think there is a Squeak version. I'll have to see where they are as well...=) So much cool stuff, such little time! E Language
    Lightweight Languages Conference

    It's that time of year again and it looks like I'm going to miss it because I'll be in Nebreska. The things one does to get back to Smalltalk...=) Last year was a blast! I'm sad that I'll miss it this year. Last year, Erlang opened my eyes. I haven't been able to really sit down with it yet. I've read a lot of the material and know it's something to play with. Also, Todd Probstring gave an excellent talk on usability and language design. I wonder what the eye openers will be for this year? Wish I could make it....=)
    Spotted in Squawks of the Parrot
    Great Quote

    "I have always wished that my computer would be as easy to use as my
    telephone. My wish has come true. I no longer know how to use my
    telephone." - Bjarne Stroustrup

    Taken from Dan Sugalski's blog. Thanks!
    IO Language

    Yet another language that I need to check out: IO. I would like to thank Jim Menard for pointing this one out to me! It looks very cool, like a mix of JavaScript and Smalltalk. Very intriguing. I will have to check this out ASAP! I can't wait to start on my prototypical language journey. I've already started really studying JavaScript. I've studied JavaScript before, but the prototype thing went over my head, but now, it seems to make a lot of sense and i need to spend sometime with it to get my head around it. It might be the next logical step....=) I guess we'll see. I'll keep everyone posted on my thoughts!
    Pot Meets Kettle Or Thoughts on VMs

    Alright, noticed some discussion on James Reobertson's blog about monocultures and the JVM. Read all the gory details here: Pot Meets Kettle. Now, I know the JVM is very unfriendly to dynamic languages. But, the Microsoft's .NET VM might be in the same boat. Now, they have gone to lengths to make it better for dynamic languages, but I'm taken by to the Lightweight Languages Conference in which I had a chance to talk with Dan Sugalski for a little bit. Now, we talked about the Zork VM and a host of other things. But, the discussion on the .NET VM was very intriguing as was his thoughts on Parrot. Now, what we talked about could fill a lot of entries in my blog, but the thing that stuck out in my mind is that he said that a VM couldn't be everything to everyone. He said that the Parrot VM was an effort to have a common VM for Perl, Python, and Ruby, but there were several challenges that were not apparent at first. While all 3 are dynamic scripting languages, they have feature differences and these differences add up. The thing about a VM is that its tailored to run fast for its languages. So, naturally, Parrot is made to be fastest for Perl with Python and Ruby coming in second. Likewise, the .NET VM will probably be tailored to run C# and VB.NET faster than any other language. I think this is the guideline that Sun takes with Java. It's nearly impossible to satisfy everyone because certain features can degrade performance for other languages. It's a give and take. And it comes down to a language design issue. I think this is where the IBM Universal VM failed. It wasn't fast enough for the Java folks and not flexible enough for others. A universal VM can not be at two places at one time if you know what I mean. Plus, the response for the IBM universal VM was also lackluster. Everyone was too busy finding out that the "hottest new language" at the time was not ready for prime time (of course, I'm talking about Java). Now, Java has come a long way, but I think people are seeing it's shortcomings and it never delivered on its promises (remember the hype that is was EASY?). MS is making the same claims with .NET and they too have missed the boat.

    All this talk of a universal VM also makes me think, why do we have VMs to begin with? It's to abstract ourselves away from knowing about the computer architecture we are running on. And why do we need to do this? One it makes write once, run everywhere a reality. But, it also makes certain abstractions possible because they are directly available in the machine code instruction set. I think a universal VM complicates things and there's too many design decisions that impact other factors. It seems like an impossible problem to satisfy everyone. But, I do think we could have VMs that are tailored to certain feature sets. Why not let the {} crowd have their .NET and Java VMs?! Let us Smalltalkers and dynamic languages have ours and let the functional language dudes (and dudettes) have theirs! So, then we would only be dealing with a handful of VMs, but the features targeted to perform best for what features you want.

    I'm going to have to do more thinking on this, because something is starting to sound like me like why can't we have VMs where can request and plug-in the features we want at run-time? Hmmmm.....Maybe the thoughts on a static instruction set VMs is the wrong answer for a universal VM, but a more pluggable VM. So, if you want static typing and it's benefits, then you use that instruction set...I wonder if this is possible? I'm thinking it is, but we need to change our thinking on VMs....Just a thought!
    SONAR 3

    New love is around the corner and I can't wait! It's being released this Monday and I pre-ordered my copy. I can't wait to get the Ultrafunk Sonitus:fx Suite because I've been using all of those effects in FruityLoops and love the hell out them! Now, I will finally have their kick ass phaser and compresser in SONAR!!! YIPPEE! Something else to play with on my vacation before the trek out to Nebreska. Check out the love here: Sonar 3 Details
    Seaside's Can Of Whoop Ass Opened On Java Struts

    It looks like Java Struts is all wet with this side by side comparison: Seaside's Can of Whoop Ass

    And Java developers wonder why I say Smalltalk kicks so much booty. It's nice to have a little proof....=) I'm simply amazed by the numbers. I would also expect the Smalltalk version to have way less bugs as well. Thanks for Chris Double's blog for this info!
    Talk Like A Pirate Day

    Did anyone else know that September 19 was talk like a pirate day? Me neither, MATEY! AARRGGHH, SHIVER ME TIMBERS! AY, YE YOUNG LITTLE LAD WE SHALL NOT FORGET THIS YEAR NEXT! AARRGGHH!!!
    Frustrations with Java

    This article from David Buck explains exactly my frustration with Java and why I'm going back to Smalltalk. Read it: Smalltalk Debugging and Productivity.

    Java is just now getting tools like we are used to Smalltalk, but they still have a long way to go. We recently switched up to Java 1.4 at work and I was excited because I had been hearing about it being able to "HotSwap" code. Well, I tried it out and it worked! Finally! But, over the course of the day, I found it could not handle "complicated" cases or would fail without reason. I finally boiled it down that it could only handle simply method changes. If you added a temporary variable, it failed; added an instance variable, it failed; or added a new method, you guess it, failed! So, my take was that it was better than I had before, but it still is pale compared to what I am used to in Smalltalk.

    Another funny thing is that I am amazed that most Java developers don't even want these features or see the benefit! I've sat with countless develoepers that when I showed them that they could inspect code from Eclipse while the program was running, their jaws hit the floor. Now, they love the features now, but the thought never occured to them to try. But, in Smalltalk, it's a fact of life and you miss it and groan about it not being there in other languages.

    The environment is the most powerful feature of Smalltalk and it's what makes it so cool. Without the environment, I guess we would call it Ruby or something...=)

    I love David's blog because he's been showing the cool things you can do in Smalltalk and not in other languages...=) I got a few tricks up my sleeve that I plan to show as well. One such trick is one I did for the MS Agent Remote Control.

    Friday, September 26, 2003

    October 21, 2003

    Will see the release of a bunch of Kingsley Moog CDs! I'm so excited! Four of my favorite synth albums of all time are the Perrey-Kingsley albums! And now, they are releasing the Kingsley solo albums! This is great news! I can't wait! But, I will have the new Alice Cooper to keep me company till then...=) Moogy madness coming soon...Why isn't electronic music like it was back in the 60's? Good electronic albums are too few and far between these recent years.
    Shocked

    Here's a news article on local Kansas City metal band, Thrust. I have one of their records and was waiting for the next one before I left Kansas. I saw these guys a couple of times live and they slayed. One of the best bands in the KC area! Anyway, I was shocked to read the following news:
    THRUST Singer Seriously Injured In Motorcyle Crash. My deepest condolances go to his family and band mates. I hope he recovers and is back on the stage soon. Rock on, brother...
    Grandmother Sued By RIAA

    It seems the RIAA and their lawsuits against fans of their musicians keeps getting better. Personnally, it makes me not to want to buy anything from a major label anymore. Support your independent artists and labels! But, if you want a good laugh, simply click away...=) You'd think they would have gotten their facts right, but it seems it's hard to pinpoint a person to an IP address...SHOCKER! Grandmother Sued By RIAA

    Thursday, September 25, 2003

    History Repeats Itself

    So, I read the book "Peopleware" on the plane flight to my interview for my new job. It was a quick and easy read. I can not recommend it highly enough. Anyway, I'm amazed at how much knowledge and tidbits there are about how to make our life as programmers easier and more enjoyable. There's lots of talk about managing, environments, and motivation. It's assembled as a bunch of short essays. It's a short book, but man, did it's morsels ring true. So, what's my point now that I've gushed about this book? I'm simply amazed how much of it has been forgotten! I work in a cube less than 30 square feet right now as we speak and they talk about optimal environments where they recommend 100 square feet! Plus, there's a bunch more! I think it should be required reading for any computer programmer or manager. Now, I think if we were all aware of the information in this book and in others, maybe our industry wouldn't be in the mess that it's in now! I'm currently reading, "The Psychology of Computer Programming" and my jaw is always on the floor. Again, it has lots of great advice and knowledge that I think is lost or is being rediscovered. I was shocked to read about "Egoless Programming" which sounds a lot like agile/XP methodologies and this was written in 1971!!!!! WHOA! My point with this entry is simple: How do these books get forgotten? It amazes me. But, I for one, will not let them be and will use their knowledge in my current activities. I hope you do too. You can buy Peopleware here and Psychology of Programming here. Happy reading and let's make our industry stronger and not forget where we've been! If anyone knows of any other books like these from the past, let me know! So far, I would rank these as high as the mythical man month!
    Love is in the air...

    WOW! This is too cool...Check it out! Smalltalk Reports from 1991-1996. Get those flashbacks ready! Smalltalk Report Back Issues

    Wednesday, September 24, 2003

    Fun Music

    OK, Am I the only nut that *loves* the Spy Kids soundtracks? The mix of styles from rock to synth madness to lounge to to latin to surf to everything in between is a lot of fun. Reminds me of a less experimental Mr. Bungle. I can't stop listening to them. Even the little pop songs on the new 3-D soundtrack are good! And I generally don't like a lot of the new pop...=) Now, they were written by Robert Rodriegues who also directed and wrote them. WOW! He's also responsible for "Once Upon a Time" and "Desperado". I need to hunt down those soundtracks too...=) I think I got a new soundtrack composer that I like...=)

    Tuesday, September 23, 2003

    Excellent Article On Software and The Construction Metaphor

    A friend of mine sent this link to me and it's a great read! It points out why using the construction metaphor to do fixed planning is just flat out wrong for software. And he explains its wrong because it fails in construction as well. He gives several examples from construction where they are taking a more agile approach and being successful. Maybe this agile thing goes beyond software and can be used for any project where interaction and cooperation is necessary. Go read it now!
    Construction
    Smalltalk Catch Phrases

    Ok, I've been thinking how cool it would be to have t-shirts with catchy little slogans for Smalltalk. Here's a few I thought of:
    Point, Click, Been There, Done That. (this one makes me laugh, but I think it's too negative)
    Felt The Hate? Feel The Love Of Smalltalk (one of my faves!)
    self become: Brilliant (hehehehe)
    Tired Of Typing? Try Smalltalk! (This works on two levels: typing as in into the keyboard and typing system)

    That's it for now...=) ENJOY!
    Jean Michel Jarre

    If you have never heard this great artist, then what's wrong with you? Hehehehe, just kidding. My wife turned me on to this guy when she rented one of his live DVDs....It was incredible. I've been in love with the music ever since. So, I've been trying to buy anything I can get my hands on. All of his early material simply flat out rules. No one touches him. His later stuff is a little hit and miss, but still much better than a lot that is out there. So, who is Jarre? He's a french musician that writes electronic music. Now, by electronic, I don't mean techno or some lame new age crap (even though that's where you find his material). He writes music from the heart with a lot of cool sounds. I can say enough good things about this man. So, go buy "Oxygene" or "Equinoxe" and feel the love!
    Jarre's Website
    Seaside and Javascript

    Another future project thought, these guys are starting to pile up! But, I thought I'd write down what I'm thinking so if I EVER have a lack of projects, I can simply look through my blog history, right? Anyway, I'm currently working on a Java project and one of the biggest issues is validation. And I've been thinking, wouldn't it be cool to be your business rules in one location where both Java and Javascript could understand them? I'm thinking something like Jess, but have it also run in Javascript. Now, you might ask, "Why have it run in Javascript?" Well, you could send your validation rules for that page down and have your Javascript interpret them. This way you could do client side validation without duplicating code on the server because they would be looking at the same code base! I would love to try this out as an addition to Seaside. I'm thinking if I get my prolog implementation (or shall I say prolog-based) or even a CLIPS engine working in Squeak, then have Javascript generated for the web pages, I would be golden! Is this another BIG project? YOU BET! I've been accussed of thinking "TOO BIG" before, but man, I think this would be so cool....I'm thinking it might possibly be the "killer" developer app for SMALLTALK! We're the best...LET'S PROVE IT! (well, we've already done that, but we can always use more feathers in our caps...right?)

    Friday, September 19, 2003

    More Prototypical Objects

    Sam Griffth sent me this kick ass explanation. ENJOY!

    First off, it is possible to use a class based OO system to implement a
    prototypical OO system and vice versa. One of the very first Smalltalk
    programs created at PARC was a prototypical OO system. ThingLab used
    prototypical objects in it's domain space to do it's work, but it itself was
    implemented with classes and prototypical objects at the same time. Part of
    the SELF research idea to use prototypical objects was derived from the SELF
    team having seen the ThingLab work. Link to ThingLab papers and version
    ported to Squeak, including the original PARC paper:

    http://www.2share.com/thinglab/ThingLab%20-%20index.html
    http://www.cosc.canterbury.ac.nz/~wolfgang/NewHome/cosc414/projects/thinglabFolder/html/thinglab.html
    http://minnow.cc.gatech.edu/squeak/607
    http://portal.acm.org/citation.cfm?id=357147&jmp=references&dl=GUIDE&dl=ACM&CFID=11111111&CFTOKEN=2222222

    As for what a prototypical OO language gives you that you don't get in a
    class based one is conceptual purity and all messaging is based on
    delegation. Classes are really about type definition and organization of
    the instances of that type. With prototypes, you don't have a class. You
    just create one instance that you clone over and over again. And all the
    instances made from it know it. Your parent is whomever you cloned from.
    Your parent has methods that you may not have, so instead of looking to a
    class as something different or special, you end up with just the object you
    cloned from. No differentiation is made.

    In a prototypical world, you start with one bootstrap object that knows how
    to add/remove/run methods on itself and how to delegate to it's parent if it
    has one. From that, you can clone it (call it c1), add new attributes to
    the new cloned object, add methods to that new cloned object, clone c1 to
    make c2, etc. Now when you do cloned to get c1, c1's parent was the
    bootstrapObject, when you cloned c2 it's parent was c1. So when you send a
    message to c2, if it doesn't have it, it delegates the lookup to c1 which
    then will delegate it to bootstrapObject if needed, etc.

    There is no need for classes in this model. It is much more like nature.
    All mammals share traits that they inherited by being fertilized from an egg
    and sperm, but there really is no 'class' of mammals. That is a man made
    idea for our organization to show that we saw that the DNA is common and
    they have common traits, etc. From the outside it looks like that you are
    inheriting from the class of mammal that you are (human lets say), but what
    really happens in the reproduction process is that the DNA from the mother
    and father are cloned by the RNA bands and combined together in a process.
    This makes a new specific kind of instance much like if I had a multiple
    parents clone, which is possible in a prototypical OO system as well.

    I hope all this makes sense.... Let me summarize....

    Prototypical OO systems are based on cloning and delegation. A much simpler
    model based all in instances.
    Future Project

    OK, as soon as I finish my Java Serialization framework and JXTA port in Squeak. I think my next project will be to update the Prolog implementation in Squeak. The original version was written in Smalltalk/V and I remember trying to load it into a 3.4 Squeak image and getting all kinds of errors. It comes on the CD that comes with the Squeak Blue book by Mark Guzdial (the CD is worth the price of book alone, but the book is EXCELLENT). I like the idea of Prolog and it would be a fun port. I've been interested in learning prolog for a while and this would be a perfect excuse to learn the language along the way. I already have several Prolog books and I thought about starting to use the examples in those as the beginning tests. Now, if I can find the author and get their blessing....=)
    Java Serialization 0.2 Released

    Alright, I broke down last night and moved all of my java serialization code to the DVS system in Squeak. I must admit that it was really easy and it took me every bit of 5 minutes to get everything saved correctly. Why did I make such a fuss over this? Anyway, the mind boggles...So, the new release can read in Java class files now. The writing out of Java objects is still uhm, broken and is still be written. The tests are also still not there. The first thing I'm going to do when I go on vacation is to write all of the tests in a portable fashion. RIght now, all of my tests are in workspace (I know, I know, BAD PROGRAMMER!). I also know SUnit is a butt simple framework and I have no excuse not be using it. I've been using it on my reversi program. So, expect 0.3 to be released sometime in November at the latest with simply the tests written. I'm doing nothing more until some basic tests are in place.

    As always, if anyone has any suggestions, let me know!
    Four Covers!

    The new Alice Cooper will have 4 covers! Guess who's going to be buying all 4? Yep, you guessed it me! I'm a huge Alice Cooper (even met the man once!) and I can not wait for his new record to come out! The Coop is back. My only regret right now is that it looks like I'm going to miss him on this tour (which S-U-C-K-S). But, it's the difference between being happy in the long run or short run...=) I can miss Alice on one tour since I've seen him twice on every tour since "The Last Temptation". BTW, it's only 11 more days to wait!

    Thursday, September 18, 2003

    Excellent Article on Why Ant Leaves A Lot To Be Desired

    Just read this excellent article about Ant: The Sum of Ant

    I've always felt Ant was wrong and that a scripting language would be better for what it does. It's nice to see people on the same wave length. Thanks to Sam Griffith for pointing this one out (we're thinking on the same wave length again!).
    Amen, brother

    I could not have said this better myself. An explanation of what people are doing wrong with XML and why there is false hope in the promises:
    XML Abuse

    Wednesday, September 17, 2003

    Yummy Musical Madness

    Can you hear the brewing of madness?
    Automatic Music Audio Analysis
    Brain Teaser

    Aoccdrnig to a rscheearch at an Elingsh

    uinervtisy, it deosn't mttaer in

    waht oredr the ltteers in a wrod are, the olny

    iprmoetnt tihng is taht frist

    and lsat ltteer is at the rghit pclae. The rset

    can be a toatl mses and you

    can sitll raed it wouthit porbelm. Tihs is

    bcuseae we do not raed ervey

    lteter by it slef but the wrod as a wlohe.
    Prototype-based Languages

    OK, There's been discussion on the Squeak list about this and I thought I'd start doing some research. I came across this page for the Self language. Now, does anyone know of any implementations of Self that run on Windows?
    Excellent Article On Dysfunctional Companies

    Read it now! It's a good read. How does your organization compare? 3 signs of a dysfunctional company
    Why HotMail Sucks #239

    I get the following error message in a simple html document: "This server is too busy. ". The URL is even funny: http://by8fd.bay8.hotmail.msn.com/toobusy.html. I would have figured they would have made it look nicer. Anyway, I thought MS had lots of money and thus, enough money for servers? I find it amazing that .NET is getting so much publicity and yet, their own stuff doesn't work. I get at least 3-5 error pages back from hotmail everyday. Usually, they are erronous (ie. there wasn't an error really, but it decided to send me one). Once I have some time, I'm setting up my web server to serve up my email...This is just absymal.
    Java Serialization

    I finally registered Java Serialization on Squeak Map this morning! Check it out: Java Serialization. I looked at the dates for what I have right now and it says "May 2002". I have had a new version in the works for about 6 months that read Java class files and writes java object back out. I refactored a bunch of stuff as well. It's the first thing to get done during my vacation starting on Oct. 11! I might try to get a release out before that (but, it will probably be VERY BUGGY!).

    I would like to thank everyone for their encouragement on me getting up on Squeak Map! I'm offical now!
    More Science

    Study: Sleeping position and Personality

    It says I'm in the minority in that I sleep in the "freefall" position. Only 6.5% sleep this way....It also says I'm brash and gregarious. I can see the gregarious, but I've never seen myself as brash...Fun read anyway. It's amazing the stuff that they can correlate to our personality....=)
    Nuclear Reactor Out Of Spare Parts

    Check this out: Freshman Makes Nuclear Reactor Out Of Spare Parts! COOL!

    Tuesday, September 16, 2003

    Mod Smalltalk

    Rejoice, ye fellow sinners! Now, we can run Squeak as a mod in Apache! Chalk this up as something else I need to look at when I get some time! Go to Mod.Smalltalk.org Main Page now!
    Get Thrashed

    Apparently, they are making a documentary on the thrash scene in the 80's. I can't wait to see this since I was a part of it. Now, it was hard to be in the heart of it because I was in Alabama. But, I remember following all of the fanzines and buying records like a madman. Thrash still has a special place in my heart. I still think it's the best form of metal next to NOLA sludge. It's being done by an MTV producer so let's hope he doesn't mess it up by saying "Metallica were the first thrash metal band..." Grrrrr....It was EXODUS people...EXODUS....=) Man, I'm going to have to put on some of those albums from back when Exodus, Metallica, Megadeth, Slayer, Anthrax, Death Angel, heathen, etc R-U-L-E-D. Oh, and did I mention that I'm getting new albums from Death Angel, Heathen, and Exodus this year? Those guys were some of my faves (I even want to call a project of mine: Heathen in reference to that band, we'll see). THRASH!
    BottomFeeder

    OK, every morning that I get into work, BottomFeeder is the first application I start up now. I'm totally into this blogging thing now. I love reading a lot of different people's blogs. Each have their different ways of expressing ideas. Some are formal, some are informal (like mine), but all are informative and fun to read. So, just wanted to write a note to say thanks to the BottomFeeder guys. Oh, do you not have Bottom Feeder? Go here now and get addicted!

    Monday, September 15, 2003

    Synth madness

    I need to check out Audio Mulch when I get some time too. Looks very cool!

    Also, I found PortMusic which is a bunch of cross-platform music APIs for sound, midi, and files. VERY COOL! I might not have to learn DirectX after all...=)

    I need time...=) I want to hook these MIDI APIs up to my FS1R and let the madness begin!


    Smalltalk to Java

    Someone else on the same wavelength except for where I'm trying to mimic Java without the VM. He puts Smalltalk on top of the VM. I'm thinking there might be sinergy here and I can't want to play with it! Anyway, it's written for Dolphin Smalltalk, check it out here. Add this to the list of things to play with on my "in-between jobs" vacation. I'm thinking we're going about the same problem in two different ways. I'm trying to fool a Java VM into thinking it's talking to another. But, his approach is to connect to Java like you would a COM model. I think they are complimentary methods! In fact, it might be nice to use this when I'm debugging the Java test harness code in my stuff. Man, I need time for Java Serialization so I can take the next logical step: FULL RMI SUPPORT!

    Also, I loved his comment "Continue to use your legacy Java code as you migrate to a more grown-up language… ". Preach on brother! Preach on!

    And yes, I'm still at W-O-R-K!
    Weight Watchers Update

    OK, a while back I mentioned that I had joined Weight Watchers and that I had lost some weight. Well, I'm happy to report that I'm still going to Weight Watchers (I'm actually addicted to it, not a bad thing to be if you ask) and I've lost a whopping total of 45 pounds! YEAH! The only problem is that pants keep falling off and it's been pissing me off. So, it's off to the mall to buy a belt to support my new waist line...I'm only 8 pounds away from my first big goal: to be under 200 pounds! And then, the next stop is G-O-A-L (for you non-WW folks, that means I'll be at my goal weight).

    Sunday, September 14, 2003

    Wish Item For Nebreska

    I was thinking it sure would be fun to be find someone who wouldn't mind a keyboardist in their thrash metal band. I love metal, but I must be the only keyboardist who doesn't worship at the altar of the Orbital. I mean, I think they are very cool, but what happened to the cool synth music from the early 60's (Perrey and Kingsley...the best), early 70's (Jarre, Synergy, and Wendy Carlos rule), and hell even some of the 80's were alright. But, what do we have today? I mean I can only think of a handleful of synth bands I like like Eat Static, Amon Tobin, Hallucingen, Celldweller, and Assemblege 23. I want to do thrash metal with dancy synth blurps all in it. I don't want it to be industrial. I'm thinking funky music with real musicians with heavy as hell guitars and spacey keyboards. Think Ozric Tentacles meets Bay Area Thrash (think old Metallica Cliff Burton era, Slayer (pre-Divine Intervention), Heathen, etc) mixed with a little good ole funk (think Parliament and Bernie Worrell)...

    I know it's a long shot...But, damn it sure would be fun to be in a band again....On second thought, maybe I'll create it myself....=)

    THRASH!
    Getter/Setter Issue

    So, I've been following the discussion on the PragProg list and the discussions always make me think. It's one of the last forums left where everything doesn't turn into madness. But, I digress. So, recently this discussion has come up and over the years I've waffled from the use getters/setters when you need them to all of the time. I like using getters/setters all of the time now because it helps when you want to refactor code and you might want to throw away an instance variable. Now, usually, I simply use the getter/setter methods to do something else (forward calls) or at the very least be able to look for references to those methods. I think using getters/setters sets you up nicely for the future. On the other hand, how pragmatic are they? Are they the simplest thing to do? Well, I don't think they complicate matters too much and are not that much more code to write. I also believe you should only expose the getters/setters that need to be. I generally like to have my objects be behavior rich and try at all costs not to expose the getters/setters, but sometimes you just have to. But, now, I'm starting to think that if you have a simple enough object why bother with getters/setters. If you need the added flexibility in the future or if you change the instance variable, then you can simply just change it internally and no one else changes.

    I can see the pluses and minuses of each side, but I think I still fall on the use them all of the time side. Just because I like being consistent. And I think being consistent always makes code cleaner and more maintainable. People know when they look at my code that there will always be a getter/setter (and that the setter might do extra things like broadcast change events, check rules, etc) for each instance variable. This makes my code predictable from a maintainability point of view. I also think getters/setters make your code more readable no matter whether the language is Java, Smalltalk, Ruby, etc...

    Before I close this entry, I will mention Squeak has a really cool property that will automatically create getters/setters when they are called if they don't already exist. This means while you are writing code, you can define your instance variables and then assume that the first time they are accessed via a getter or setter that the method will be called. Now, if you're being a "good do bee" and writing your tests, then these methods will be automically generated for you the first time you run a test that exercises code that hits that getter or setter. Pretty cool huh? You don't have to explicitly write the code for it! Now, I think that's pragmatic....They even cooler thing is that it should be easy to write code that does this in any Smalltalk! You can attempt the same in Ruby (just insert a method at run-time) or any dynamic language for that matter...Very cool!

    Feel free to comment!
    New PragProg Reply, but this is on getters/setters, etc...

    >From: "andrew cooke"
    >Aryeh M. Friedman said:
    >
    > >> Setters/getters are in my "evil stuff list", because they focus on the
    > >> data
    > >> part of objects, not on the behavior part.
    > >
    > > Exspecially when people go to an extreme like using getters/setters
    > > for all queries/assignments (even "private ones") for example I saw
    > > someone
    > > do a ctor that literally was this:
    > >
    > > Foo::Foo(int x, int y)
    > > {
    > > setX(x);
    > > setY(y);
    > > }
    >
    >this can be useful when you need to maintain some kind of additional
    >condition in the class - changing x also implies something else changes.
    >
    >of course, it's better to avoid this by making sure the fields are
    >orthogonal, but that's not always possible.

    I don't know if anyone else has read "Streamlined Object Modeling" book, but nonetheless, it's an excellent book on object modeling that I find myself accessing a lot. Anyway, they use accessors for each of their variables, but state whether the getter/setter is public outside of the class or not (in Java, this means defining as protected, package private, private, or public...In Smalltalk, it's a matter of putting a comment in that says that this method is private or public). I think making accessors all public to outside classes is a bad idea. I think you should only make public what you need to. Now, there are some cool things you can do wtih setters like run business rules to verify that the object can be set into myself. I also have special setters for collections like addToxxx and removeFromxxx so that 1) I can use reflection like on a JavaBean and 2) run business rules to make sure the object can be added. I mentioned "Streamlined Object Modeling" because they have a very nice write up about how to use getters/setters and collection setter methods and how to deal with business rules and verification in your objects.
    Siren
    Oh my, this sounds like too much fun! I guess I'm going to have to finish my install of VW sooner than I thought! I've been wanted to play around with MIDI in Smalltalk for a long time, but have been stopped by the DirectX API. I haven't had a lot of time to look into it though. But, I go this route instead: Siren. Now, I've tried playing with MIDI in Squeak with some success and I was even looking in the route. But, I never got Siren to work in Squeak on Windows. Oh well, I can't wait till this comes out. It sounds exactly like what I've been looking for! A Smalltalk way to make MUSIC! It would be so cool to do a whole Alto Dorado song in Smalltalk since that's what the name is inspired from! Too much fun....Now, I have to wait to October until I have time! Of course, I still want to learn the DirectX APIs and really do MIDI in Squeak as well...=) But, sometimes, you just need instant gratification. I wonder how this is going to sound with the FS1R (greatest synth ever MADE PERIOD!) or Nova or Sid? Hmmm, the possibilities!!!!!!

    It seems the article lists some alternative implementations for Siren like Ruby and Erlang (which I find very interesting, since I find Erlang intriguing to say the least). I would be very interested in see what transpires. I've only skimmed the article, but I have read a lot about Siren in the past. I hope to see their comments on why they would move it away from Smalltalk. I can see audio generation a problem, but dealing with MIDI in Smalltalk should pose no problems whatsoever. It'll be interested! I'll post my thoughts when I'm done (the article is short).

    Saturday, September 13, 2003

    Underdogs

    We went to go Seabiscuit last night and I must say that it is the ultimate "underdog" store where substance triumphs over style. It made me think of a song that I play everytime I go to anything where I'm competing (whether it be for a job, a contest, etc). It helps me not get intimidated by the folks who are all style (look perfect, smell perfect, act perfect) and no substance. "When ability is highly overcast, I'll make sure you'll never last". Just click here for the lyrics of the song I'm thinking of. Who said heavy metal wasn't uplifting....=)

    Friday, September 12, 2003

    New Job

    It's official. I accepted a new position this morning. I will be starting my new job on October 20. I will be leaving the fine state of Connecticut and traveling all the way to the wild, wild west of Nebreska. So, you might be asking why would I travel all the way to Nebraska for a job? Simply put: the most amazing team I've ever had the experience of witnessing. I was floored during my entire interview. Now, you might be asking, what's so great about this team?! Well, they are a true XP team, they manage themselves, and there are no titles. What you have is a well-oiled team that kicks a lot of booty and I'm proud to become a member on October 20. They even use a little language that I talk about a lot here. I'll give you a hint, it begins with an S. Still guessing? OK, I'll spell it out S-M-A-L-L-T-A-L-K!!!!! Yes, I will be returning to the Smalltalk fold after 4 years! I never left, but it will be nice to do it for my day job again. They also do Java, but I will be doing very little. I would like to thank: Bart Weller and Stve Wessels for being my cheerleaders and great friends. You guys are the best! I would also like to thank my wife for being incredibly supportive during this time. I did a lot of soul searching in Connecticut and I knew this was the team that I was destined to be a part of. I can't wait to start! Of course, I will miss the team I'm on right now in Connecticut. They have been a lot of fun and the reason for my leaving is not due to them, but to a certain consulting firm that shall remain nameless in these pages because of their ethics, inexperience, and inability to work with anyone else except themselves. I'm leaving behind great friends and long hours. I look forward to having time to work on music and posting JavaSerialization project on Squeak Map!
    Static Typing And Racism

    I gleaned this from the comp.lang.smalltalk.advocacy newsgroup. I find this a great way to explain the benefits of dynamic typing/late binding systems. I know this might be a little going overboard or inappropriate, but I think it hits right on the head!


    The opposite is static typing, which makes me think
    of a segregationist, racist society, vs. an "open
    society".

    Variables in a program are like *rooms* through
    which objects pass. In a racist society some
    waiting rooms were reserved for the *white objects*
    only. No matter how capable a black object you were,
    you were not allowed to enter rooms or areas which
    had the type-declaration "for whites only" attached
    to them.

    In an open society you can enter rooms and places
    based on your abilities and credentials, on what
    you are capable of, not on how you look or are
    "labeled" in your passport.

    Similarly in a dynamically typed language you
    can choose and reuse a class/object which *does
    the job* - regardless of what its class is called!
    Such a society, and such a program therefore would
    seem to be more efficient in their use of resources.

    So isn't it time we liberated programming from
    the racism of manifest typing! Shouldn't we
    assess objects based on what they can do, instead
    of judging them based on their /declared/ type?

    ~:-)
    -Panu Viljamaa

    Thursday, September 11, 2003

    The Final Debate Rages!

    The latest entry:
    >From: "kups28"
    >Certainly if you're seeing code or hearing people say
    >they're using final because they're code is perfect,
    >that's the wrong reason.

    I wasn't claiming it to be a reason, but an implication. I think by using final, you're implying that your code is perfect. I think I would look at anyone funny who came right out and said their code was perfect...=)

    >Anti-object think? Subclasses should have access to all methods
    >in its suprclasses? I couldn't disagree more. One should always
    >have the option to have private methods to manage the private
    >details of an object. That's part of encapsulation, supports the
    >open-closed principle and so on... Many times I've used private
    >methods to do work with instance variables that you clearly want
    >to be private.

    I tend to think of encapsulation from a different point of view. I look at encapsulation from outside of the object. I view a subclass of another object to be from the inside. Now, since I think a subclass is inside the object, then yes, I do believe it should have access to all of the methods of the super class, but not its instance variables. The reason I don't believe in giving direct access to instance variables of the super class is because it's too easy to change the super class. With methods, you can deprecate them if need be.

    I think we just have different opinions on where subclasses lie in regards to encapsulation. I see subclasses as having the inside track and you're opposed to that. I think that's too conservative and you probably think my definition is too liberal. I think if someone is subclassing your class, they should have all of the inside knowledge they need. My point is that you never know how someone might extend your class and they might want to do something before/after a private method that you have implemented. Now, the developer could 1) either beg you to make it not private or 2) copy the private method verbatum and then make their changes.

    The anti-object thinki comment might have been a little bit overboard....=)

    >One example that comes to mind is an object that has an internal
    >hashtable that it needs to manage. Perhaps for performance, it
    >needs to change the number of buckets in the hashtable once it grows
    >to a certain size. If the class doesn't/shouldn't/etc. expose the
    >hashtable to its subclasses, I sure as heck wouldn't want to make a
    >the hashtable management method protected.

    Alright, in this example, I would refer to the "hashtable" by an interface and if I needed to change implementations of the hashtable for performance I could. I would simply change the object that is internal to my class. I tend to use interfaces in my instance variable declarations where *I think* there might be issues like this one. That way my object that uses the hashtable calls the interface and the implementation of the hashtable can change. I usually provide a method to initialize the instance variable so subclasses could change the implementation if they like. I would make all of the hashtable management in the hashtable implementation and my containing class would simply switch out implementations (the logical for when to switch would not be in the containing class at all, I would ask the implementation if it was getting to big and if so, would the next implementation be). This makes the hashtable a strategy pattern that knows what its next strategy is possibly.

    >That may not be a typical example. Perhaps a better one would be
    >an object that manages i/o details to from a database, file, etc.
    >I can think of compelling reasons never to expose some of those
    >details.

    Again, I would have an object that exposes what I needed from the file, database, etc and then simply have implementations that went to the database or file. The containing class wouldn't care. Now, would I subclass those implementations? No.

    I guess the bottom line is that I don't like to limit people when they are using my code. I never want someone to go "if I could only change this one aspect of my superclass". People can be very inventive and copy/paste gets around a lot. Then, we have code duplication complicating matters. Don't laugh, at my work, this is how someone got around a lot of private code that another developer had written. I kid you not.

    I just think we have different experiences. I've had several bad experiences with both private and final. It sounds like you have the opposite experience. I think it's hard to come to a conclusion or have a clear winner. I think it's whatever works for the both of us.

    >Your comment about never knowing what people will do with your
    >class is a valid point. But I still think there's room for
    >having well thought out private, protected, and public methods
    >(Java terms here, but I'm really thinking of whatever the
    >equivalents are in other languages).
    >

    I think everyone tries to have their designs well-thought out. I just think circumstances change and code needs to be as flexible as possible. I just think adding private/final makes things too rigid.

    Wednesday, September 10, 2003

    The Final Saga

    Jeremy Dunck had the following to say on the pragrammatic programmers list:
    >From: "Jeremy Dunck"
    >Reply-To: pragprog@yahoogroups.com
    >To: pragprog@yahoogroups.com
    >Subject: Re: [pragprog] Whose word is final?
    >Date: Mon, 08 Sep 2003 21:24:52 +0000
    >
    > >From: "Blaine Buxton"
    > > >From: Ged Byrne
    > > >In 'Effective Java' Bloch goes to the other extreme.
    >
    > > >
    > > >His argument is that inheritance provides an
    > > >additional interface to your objects. If you allow
    > > >somebody to extend your objects in a way that you
    > > >never imagined, then you are forced to either always
    > > >support that unintended use for the entire life of the
    > > >object or upset users of your interface when things
    > > >change.
    > >
    > >I think making your objects all final is going way to far.
    >
    > >I have not found the changing
    > >super class to a problem on any system that I've worked on. Good design
    > >always makes things easier.
    > >
    >
    >This conversation has been more enlightened than most I've seen on the
    >topic, but here's an article that might help:
    >
    >http://www.joelonsoftware.com/articles/FiveWorlds.html
    >
    >Different strokes...
    >
    >I personally, as an in-house developer, -hate- banging my head on sealed
    >classes. Significant project risk comes from this kind of surprise.
    >
    >Also... Regarding using mostly interfaces instead of actual class types in
    >Java-- sounds like you want a dynamically-typed language.
    >
    > -Jeremy

    Hmmm....You bet I want a dynamic language! I wonder which one I'm thinking of....=) I would have posted my reply, but someone beat me to it.

    Tuesday, September 09, 2003

    Overtime

    Johanna Robinson has some thoughts on overtime. It's schocking to know 40% percent work over 50 hours a week. How depressing. My job has been in crunch mode since I got here. I have averaged over 50 hours per week! I included vacation time in the average number which did not drive it down by much. I'm not proud of that number and I'm quite ashamed of it. The number means less time with my wife, less time with my pets, less time for music, and less time for Smalltalking. In fact, I'm writing this blog from work right now at 12:40am in the morning while I wait for something to finish processing. I love the thoughts of Mr. Robinson and just found his blog. More managers should follow his lead! Oh, how I dream of working on a real XP team!
    More thoughts on debug vs. optimize

    I actually thought of a legimate reason not to leave the debug option on during runtime: security. But, I thought if your server is behind a firewall, then this isn't that big of deal. Only if your server is exposed to the outside world. It's a shame they didn't add security to the debug server of Java. But, it's still a good idea to leave debug turned on always for your compiles. Your code is still ready to be debugged when you go want to turn on the debug options on the JVM. There are no security flaws in this, only if you turn debug mode on your server.
    javac -debug vs. -optimize

    Alright, another Java whine is up today. This entry is about a discussion I've been having at work about using the debug and optimize flags at compile time for Java programs. My take is that the debug option should ALWAYS be turned ON and optimize should be turned OFF. Now, when I mean ALWAYS I mean ALWAYS! So, I get the "But, Blaine surely not meaning a system in production, right?" and my reply is "you bet your ass I am". It's at this point that I get the puzzled expression that would make you think I have 6 heads. And then, I get a little chuckle about navitity. Next, comes the "But, Blaine the program will run MUCH slower and our infrastructure would never stand for that!" I then counter with "Yes, debug does slow down the program, but not by much...And the gains that you get from being able to see a program running and watch it as it fails are ENORMOUS!" I continue by asking if the production support staff would like this. I always get a "WELL HELL YEAH WE WANT THAT!" from the production support folks. Can you blame them? We as developers always have the luxury of debugging our program and watching things as they happen. It allows us to fix our programs quicker and see the state of the application at run-time. Why wouldn't we want this level of flexiblity for a production system? In production, you want a quick turn around time for bug fixes and it's easier to see the problem if you can watch it the state of the application as it's happening! The time saved in fixing production critical bugs more than makes up for the cost of a few missed milliseconds I think. The production/maintenance support staff should have the same or better tools than we as developers do. Logging, etc are for being able to see what a program is doing when it fails. Surely, writing a log entry is more expensive than leaving debugging on. The argument for speed is starting to make sense isn't it? I like to work on live programs and not dead ones. Working on an application while it's running is way more powerful than looking at logs and finding that the piece of state that you need has not been logged! Grrrrrr....Oh well, some food for thought for the day!

    Monday, September 08, 2003

    More on final

    More from the PragProg list:
    >From: Ged Byrne
    >In 'Effective Java' Bloch goes to the other extreme.
    >
    >Item 15 is "Design and document for inheritance or
    >else prohibit it." Basically, every class should be
    >Final unless you have specifically designed for
    >inheritance.
    >
    >http://java.sun.com/docs/books/effective/toc.html
    >
    >His argument is that inheritance provides an
    >additional interface to your objects. If you allow
    >somebody to extend your objects in a way that you
    >never imagined, then you are forced to either always
    >support that unintended use for the entire life of the
    >object or upset users of your interface when things
    >change.

    I think making your objects all final is going way to far. I generally make
    my internal data local to my class, but expose the methods for accessing to
    be protected. I think people should write lots of little methods and
    override where you need to in subclassing. I generally take a more
    responsiblity driven approach to my design. I tend to think of the interface
    before the internal data implementation. If you provide accessors for your
    internal structure and make sure that only subclasses have access. I think
    you should only make things public that you must. But, subclasses should
    have access to all of its superclasses' methods and not their instance
    variables. This forces subclasses to use the accessors. If you change this
    aspect, generally you can deprecate the accessors and put in an
    implementation in the method that wraps the internals if that makes sense.
    Generally, I use a lot of interfaces whenever I can and avoid primitive
    types. I also find that staying true to the law of demeter also reduces the
    exposure of internals changing on the subclasses.

    >One of the promises of OO is that behind the interface
    >you can change all of the internal workings. I might
    >start off by writing an object that keeps some data in
    >a persisted array. As the objects grows the array is
    >too small and become a problem, so it is replaced by a
    >database table.

    You see I would make the persisted array an object in of itself and expose
    it via an interface. If I needed to change the implementation, then I would
    be changing the persisted array and not the class that's holding on to it.

    >If you OO has a tight interface, then you make the
    >change to just this one object and your done.

    Exactly!

    >If, on the other hand, your object exposed the
    >internal array to subclasses and these subclasses use
    >the array directly then when you update the object you
    >either have to write a pseudo proxy that will behave
    >just like the array to subclasses or rewrite all the
    >subclasses.

    Yes. My point would be to make sure that the persisted array has its on
    interface. I use interfaces a lot in Java because I only care if an object
    implements a protocol and not what it is per se. I just care that I get
    something that implements that interface and I don't care how it does it
    behind the scenes. I find interfaces and keeping with the law of demeter
    helps my designs to be more flexible in this regard.

    If truth be told, My inheritence heirarchies are generally very shallow.
    They rarely get deeper than 3. I find polymorphism to be a much more useful
    abstraction in terms of making my objects less coupled. Also, my super
    classes generally tend to be more of the template pattern where the
    subclasses are just providing different functionality at different points
    and interacts very little with the super class.

    >So, by this argument (don't know if I entirely agree)
    >if you expose your objects internals then you are
    >saying 'the internal implementation is perfect. I
    >will never have to change it, so do whatever you want
    >with it.'

    I don't view subclassing as "exposing your internals", but I can see where
    you're going with it. I think a subclass is still behind the lines. I think
    subclass takes on the responsibility of if the superclass changes, then I
    must change as well. I do not think it's up to the super class owner to make
    sure his code works with all possible subclasses. I think it's nice for the
    super class owner to provide upgrade paths via deprecating methods and
    putting in workarounds, but not necessary. I have not found the changing
    super class to a problem on any system that I've worked on. Good design
    always makes things easier.
    The final keyword

    Here's a post I made recently on the Pragmatic Programmer's list:
    The final keyword is a personal pet peeve of mine in Java. First off, it's
    meaning is overloaded. If you use final in talking about variables, then it
    means that once you assign a value to the variable that it will not change.
    I have no qualms about using it for this purpose. The other usage of final
    is on class and methods and it's meaning there means to "seal" the class or
    method from being subclassed or overridden. Now, originally, this was done
    for the "sake of speed and security". The VM can make a lot of shortcuts if
    it knows a class is final and thus get speed improvement. This is also true
    for final on methods. Basically, the VM does not have to do a method lookup
    for finals. The security part comes into play in that some one can not
    override your method or class and provide their own implementation. I think
    either way is EVIL! Why would I say such a statement? Basically, I think by
    using final you are effectively saying, "I have produced the most perfect
    code ever known to man. No one will ever ever want to change or enhance this
    code since it is SO PERFECT!" Now, I don't know about you, but I don't write
    perfect and wouldn't ever claim to either. I have ran into too many
    situations where I needed to override a final method or class. It's
    anti-object think. You never know what people are going to do with your code
    and what they might want to do with it. I hate the private keyword on
    methods for this exact same reason.
    Maintenance

    Why is maintenance considered such a dirty word in our industry? On a lot of projects that I've been on, the finished product is thrown over a wire to a maintenance team. Now, this team has usually not been a part of any discussions or designs of the system that we are giving them. They have also been less experienced developers in the technology used in the making of the system. Why is this the norm in our industry? It blows my mind! I heard a comment from a developer the other morning in which they thought maintenance was even below them. I get this attitude a lot from developers on projects. Clearly, I don't think maintenance is below me and I don't think maintenance is something that should have the stigma that it has. Maintenance should be looked as an activity that is more important that the original development. In fact, I think the developers that wrote the original system should maintain it. Why? Well, if you write a piece of code and know that you are going to have to maintain it, I can bet you'll write the code differently. In fact, I bet you refactor and try to make things simpler. I even bet you'll write more tests so that you know you haven't broken anything from refactoring. I think it is the only true path to quality software. I've always wanted to ask this question in an interview, "Would you feel comfortable doing maintenance?" or this one, "Should you refactor code that is in maintenance?" I think a lot of people would be suprised by the answers that they would get. I know I would never hire a developer that thought maintenance was below them. I think the throwing the elephant over the fence that is the norm in our industry is wrong. Let's start the revolution and take over our code. I think developers that can maintain their own code is worth a million. But, that's just my opinion....=) Anyway, I was thinking about this morningand thought I'd post on it. If you want to read further, check out the book, "Software Craftmanship". The author relays the same message in a much more elegant way...=)

    Sunday, September 07, 2003

    Sheep

    Here's a song I've been listening to a lot lately. It's a reminder that I must blaze my own path and not follow just because that's what everyone else is doing. I should never that to do to begin with and I hardly go with the crowd...But, it's great to have others in on the fight so to speak....=) Do what you love and buck the trends! No matter who's it's not right! So, here's the lyrics for your reading pleasure:

    "Sheep" by Jimi Hazel
    Intro:
    What are you gonna do with your life?
    Step! Step! Step! Step!...Follow!
    Step! Step! Step! Step!...Follow!
    Step! Step! Step! Step!...Follow!
    Step! Step! Step! Step!...Follow!

    Verse 1:
    Follow the leader is what you do,
    Jump off the bridge if they tell ya to,
    Be one of the millions and not the few,
    Stand alone....
    You'd rather lay down than die to fight,
    Don't matter whether it's wrong or right,
    Got you believin' that day is night,
    Your mind is gone...

    Chorus:
    We don't care about your fuckin' rules,
    We don't care about your chain of fools,
    Up tight left right! Get in line,
    Cos in the end you're sure to find,
    That if you give away control,
    Of all your art, your mind, your soul,
    The ground you stand upon is sinking deep,
    There's one too many sheep.

    Verse 2:
    The grass is greener on the other side,
    That's what they say so you take the ride,
    Before you feed you must leave your pride,
    And now, it's gone....
    The grass you chew on is bitter sweet,
    You suck it down like you did defeat,
    It leaves you hallow and incomplete,
    And you belong...

    Repeat Chorus

    Bridge:
    Why do you follow the leader?
    Why can't you find your own way?
    Ya know, free your mind and your ass will follow!
    It's not free your mind and follow the ass...Think about it!

    Chorus 2:
    We don't care! STEP!
    We don't care! STEP!
    Follow the leader! We don't care!
    We don't care! STEP!
    We don't care! STEP!
    Follow the leader! We don't care!

    One too many sheep...
    THE SPYZ ARE BACK!

    So, I was searching on the net for Jimi Hazel and guess what I found? News that 24-7 Spyz are back. So, basically, it looks like he got the bass player back from the last spyz album and a drummer! BAD ASS! And to top it off, they are mixing their new album. Man, I can't wait. Jimi's solo album is very dear and has helped through many hard times as of late. It's giving me a lot of inspiration. I can't wait! Read it: 24-7 Spyz NEWS

    YEAH!
    The S word

    Ok, one more thing I noticed as I read through my blogs, the S word. I use it and talk about it a lot. I find very strongly about the S word and it's almost a religious word with me. But, I realized that some people reading my blog might think that I'm single-minded and do not look at other ways of doing things. This is not true. I'm constantly looking for a language and environment that is better than the S word. I think Lisp could have such an environment and language, but the environments I have at my disposal (Corman Lisp, GNU CLISP) are not what I have been accostumed to. But, it's still fun to play with. I also have a lot of fun with Ruby (which I think is simply Smalltalk with less foreign interface), but again while it has an environment that provides immediate feedback. There is something lacking in any environment I have played with (namely FreeRide). I think the environment is very important and I think Eclipse has made my Java programming a hell of a lot more enjoyable. But, there's nothing like changing code while debugging, inspecting object graphically, running code snippets from anywhere, etc. I have heard Dylan has a cool environment, but I haven't had time to really dig down into it. The purpose of this message is I don't anyone to get the wrong impression that I'm single minded. I'm just in love with the S word and I want to spread the word. Currently, I'm going to learn Prolog is the next language I want to learn badly. It's a different way of thinking and that's always good. I know LISP has forever changed the way I think about code as has the S word. I hope Prolog does the same. So, don't expect me to use less of the S word (which by the way is SMALLTALK), but don't be surprised when I start talking about other things as well. I want to make the perfect language eventually. It will obviously be heavily influenced by Smalltalk of course. Hell, with the meta-class model, there might be no reason to make a new language, but just enhance an old favorite...=) We'll have to see on this wonderful journey....Now, if I can find some time....=) I also want to do my JXTA port! I'm a man with too many projects....=)
    Crunch time again...

    Well, it's crunch time AGAIN at work. It's a time where the good ole negative thoughts come in and I get very upset. I go through a lot of emotions during this period. I don't know how my wife puts up with me during these times. The stress level is extremely high and the pressure is incredible. My wife thinks this is one of the areas that I excel at, but I'm simply trying to keep my head above water. Living is better than drowning. Anyway, I went looking through my blog history because I found out that Sam Griffith had left me loads of comments! WOW! Anyway, I saw dates of May of when was the last time I did anything with my Java Serialization and June for anything music related. Everything has been work since then. I haven't written any music and the code I've written on my own have been simple things like a Reversi game and the Agent Remote Control. Both of these programs were small and didn't take a lot for me to get into. The Java Serialization is at the point where I need to spend at least a couple of hours on it at a stretch which is time I don't have. When I see these things, it angers me and I feel like life is passing me by (I wouldn't even get into all of the time that I am missing with my wife...Let's just say we talk every chance we get...I still need more time though!). Oh well, Jimi Hazel, Oingo Boingo, Celldweller, Judas Priest, Alice Cooper, Pantera, and some other bands help keep my sanity as they whisper their madness in my ear to keep my head up, be positive, and this is not forever. If it wasn't for my wife and music, I think I would simply go mad during these times. But, let's hope these are coming to end shortly.

    Saturday, September 06, 2003

    I am blessed

    Sometimes it takes something out of the ordinary to slap you in your face and make you stand up and take notice. This morning as I was preparing, I found a note from my wife that she had hidden in my luggage. She typically does this to let me know how much she loves me. But, this morning's note really hit me hard. I don't often cry, but this just really made me think how blessed I am. I'm blessed to not only have the love and admiration of a great woman, but I have the same in my friends. In the note, my wife wrote words of encouragement and strength when I was feeling most vunerable. She is truly the wind in my sails. It was that extra gust that made me blow the doors off the challenges of the day. But, as I went through the day, I realized that I have great number of friends that have the same feelings for me. In fact, they prove it by going way beyond the calls of duty and friendship. It makes a man sit back and realize how good life is to have such people in their lives. There's so many people that I respect and would do anything for. I hope they feel that I am in the wind in their sails as well. It's nice to realize that your loved and thought highly of. I will end this blog entry by saying that everyday I try to be a positive force in this world and it gives me great pride to know that I have many friends. YOU GUYS (AND MY WIFE OF COURSE) RULE! I LOVE YOU ALL MORE THAN YOU WILL EVER KNOW!!!!!!
    "It takes an army of mother fuckers to stop my rock. Straight out of the boogie down. My eyes on the prize"

    Ah, Mr. Jimi Hazel, we are on the same wavelength. Of course, he's talking about playing rock music and I'm talking about programming Smalltalk. His message is simply about doing what you love no matter how unpopular it might be. I find his music refreshingly positive and is always a good listen to make me feel better. I finally realize that this is what I need to do. Do what I truly love! I'll let everyone guess what that is....

    "I hope this bullshit stop in this century...Now, I'm not trying to knock any one's hussle, you better lift some bricks before you flex that muscle"

    Amen...=) I sure do hope it does....=) Oh, go to Jimi's place on the web or better yet head over to half.com and buy "Heavy Metal Soul ByThe Pound" by 24-7 spyz or cdbaby.com and buy his solo album.

    While you're a cd baby and buying good INDIE music, pick up Celldweller as well...=) Heavy music with passion!

    Wednesday, September 03, 2003

    JavaSer interest grows

    I got an email this morning inquiring why this wasn't up on SqueakMap. Good question! I have added the ability to read in Java classes and I'm about 95% writing out Java serialized streams. Now, you might ask why load in Java class files? Well, to serialize a Java file in 100%, you must account for custom serialization read/write methods. Fun, eh? So, my serialization works until you get to a Java object with custom serialization methods. So, I was going to write a Java byte code interpreter in Squeak and then later to Java-to-Squeak byte code translator. I think the later will be most difficult. But, the former will be easier to implement, but dog slow. I've learned a lot about Java from the process. The eventual goal is to have a JavaRMI server run inside of Squeak. This would lead to an eventual EJB container in Squeak as well. Now, you might ask why would I want such a thing? Well, it sure would be nice to have Smalltalk be able to plug nicely into the java world. That way, we could possibly sneak Smalltalk into a few shops without the java guys knowing because we would look like and smell like they do, but we would get our work done a lot quicker. So, what's my goal now? This morning's email has given me a kick in the booty to finish write portion and put it up on SqueakMap. Now, I need to find the time....Maybe this weekend would be perfect...=)
    BottomFeeder

    If you don't read your rss feeds from a tool, then you must! Just go here and download BottomFeeder! What a great tool. I especially love the sync with FTP. Nice feature! What can I say? GO SMALLTALK! I'm now totally addicted to blogging. Right now, I'm up to 18 feeds (mostly Smalltalk, dynamic languages, and architecture).
    I've been referred!

    Alright, a friend of mine from the past who I haven't heard from in awhile now has a blog and he referred to me! Go check out Sam Griffith's Blog right now! I worked with Sam at Sprint (suing Smalltalk) and on a side project that used Java and Jess. A very smart guy and I'm sure his blog will be a great source of entertainment and intellectual discussion. Another feed to add to BottomFeeder!!!!! MOHAHAHAHA!

    Monday, September 01, 2003

    New Version of The Agent Remote Control

    Ok, I couldn't help my self...Download the latest version from here. You can now record his movements. Just click on him with the mouse and move him around. There's also a stop animation button since some of his animations go on forever. I also made the animation buttons, real buttons and a whole bunch of other little bugs. The JavaScript playback is a little bit better too....=) HAVE FUN!
    Cool Things About Smalltalk

    Alright, Avi Bryant is now blogging! Now, if that's not cool enough, he starts it off with a bang talking about exception handling in the Smalltalk world and how great it is. I have to agree with him! But, I thought I'd mention another cool thing about Smalltalk that I have been dearly missing in the Java world and that is to get ahold of the stack of any process. You see, all dialects of Smalltalk let you interregate the stack of any running process. In fact, this feature is what enabled Smalltalk to put in Continuations in most dialects so quickly. We know continuations are one good side effect of having access to the process stack, but what are others? How about these:
    1) Serialize out the state of the stack at the time of an excpetion (this not mearly a stack dump, but the STATE of temporary variables, etc). I was on a project that Steve Wessells wrote a post-mortem utility that did just this. Let's just say it saved a LOT of time in debugging!!!!
    2) Walking back up the stack to see who called you. Why might this be useful? Well, it means you can enforce a contract that only a certain object can call the method. You can also fire events based on methods on the stack. I did this recently for the record/playback functionality of the Agent Remote Control.
    3) USE YOUR IMAGINATION!

    I also wanted to add to the exception handling thread finally by saying that there's a lot to learn in Smalltalk's exception handling. Most Smalltalks also have what I call "last chance" handlers which are invoked when there are no primary handlers or they have all passed on the exception. Generally, most Smalltalks invoke the debugger when these second chance handlers are hit. I think this is very cool! I've tried to use them in Java, but they are generally linked to ThreadGroups and sometimes, you can't change a ThreadGroup's exception handler (or you wouldn't want to because you don't "own" it). But in these "last chance" handlers I've done some cool stuff including resuming the exception from them! Think about it this way: You could do something in your last chance handler like collect garbage or write a log entry and then resume the signal. You can go crazy!

    But, alas, I generally don't go too nuts with either of these cool things in Smalltalk. Exceptions are cool, but I generally try not to use too many and use them only when needed. I also don't spend a lot of time feddling with the stack even though its fun. My general rule is when you need it, you know it....There's been several times where I wish Java had the same facilities that Smalltalk does (especially for reporting on the state of a production system that has just blown itself out of the water). I can't tell you how many times, I'm looking at a dead Java stack trace and wondering: this gives me not enough information to figure out why it died. Telling me what methods were called tells me little to nothing about the state of the application at time of death. It's those darn little objects and temporary variables that generally tell the story of an object gone bad...=)

    Well, I'm off to bed to fight my terrible cold.....=)

    Amazon