Wednesday, March 30, 2005

Frak or F***

We started watching the new and improved Battlestar Galatica last night (via Tivo of course). First off, I like it a lot. Good story and a cool take on the old show.I however noticed the frequent use of the word, "frak" instead of another famous f word. What a clever way around the censors, I thought! The intention and meaning is the same as the often censored version. Yet, no one would bat an eye at work if I used, "frak". Seems silly to me to get upset over one word and not the other if the meaning and intent is the same, don't you think? I know, what a weird thing to pick up on, but is foul language really obscene? It's just a certain configuration of syllables. The meaning and intent should be more important and that is what should be offensive. We should ban talking mean and shouting, instead of picking on just certain words. So, FRAK OFF! (just kidding of course)

Words to live by

I've been on a funk kick as of late. It's amazing how just letting the "vibes flow through" can make you feel so much better. The messages are positive and fun. My favorite funk bands have to be PFunk (Parliament, Funkadelic, Bootsy, George Clinton, etc), Earth, Wind, & Fire, and Graham Central Station. All of them are spiritual without being preachy and 100% fun. The lyrics are filled with nuggets of wisdom like this one:
"You are as beautiful as your thoughts"-Earth,Wind,& Fire
Something I think we can forget from time to time. It's a great one to remember. So, the next time you want to be ugly and lose your temper, remember this quote. Let's make this world a funky place. Dig?

Remember: Entice not insult

I got following quote from comp.lang.ruby in the weekly updates, discussing the hype of Ruby On Rails:
CD Baby:
"The constant hype is what kept me AWAY from Rails for so long! I just couldn't stomach the constant self-congratulations to it all.
Now I can't stomach the constant other-technology-bashing. (Java, PHP, etc)
Nobody wants their current beliefs insulted."
Just a simple remainder to all of us evangelists. It's easy to slip into bashing mode, but sometimes it's better to be the soldiers making rock soup. We should be getting the villagers excited in our soup so that they join us and make the collaboration that much richer!

Saturday, March 26, 2005

Less Time

David Gorisek, author of the awesome STS system for Dolphin and OmniBase, answers why he uses Smalltalk in a comp.lang.smalltalk.dolphin:
    If there
    is something missing I can usually write it in Smalltalk in less time
    than it would take me just studying the documentation for some Java/EJB
    app server. Also, frameworks are a very little part of any big
    application and writing web frameworks isn't really a rocket science.
    The frameworks usually just grow along with the app in the direction you
    need them to grow.

Right on!

Rant

Eliot Miranda has a great rant on comp.lang.smalltalk.dolphin about the history of Smalltalk and how to capture the hearts of future developers:
    First VS was killed by ObjectShare, not by Cincom; Cincom has done their
    best to make VS available, including maintennance releases, e.g. for
    WinXP; i.e. the VW team puts effort into keeping VS alive, even if in a
    coma. Further, note that some of those behind the "killing" of VS at
    ObjectShare were senior figures at Digitalk. VisualWorks did not kill
    VS, people in control of PPD/ObjectShare who were interested in making
    money killed it, and they ended up loosing the company a lot of money,
    and a lot of engineering talent in the process.


    One major mistake ParcPlace and Digitalk management made was assuming
    they were each other's competition and hence a merger eliminated each
    other's major competitor. Java was just a few months away...


    Second, Dolphin is not VW's competition, it is our ally. .Net and Java
    are our competition (and to a lesser extent python, perl et al). It is
    to compete against MS, IBM, Sun et al that we've provided a lower
    entry-point for the single programmer, not to steal market share away
    from Dolphin.


    In fact the situation is quite the reverse. VW wants Dolphin to succeed
    and we're worried whenever any dialect seems to be suffering. If one
    looks at Smalltalk from an MIS perspective it can be perceived to be a
    tiny niche with very few stable players. Market analysts denigrate
    Smalltalk as a dead language that is going away and one that management
    should leave in favour of typically Java and .Net. [But these analysts
    are playing to the choir, not providing objective advice].


    The more healthy vendors and active open source dialects there are in
    the Smalltalk community the more the above misperception can be
    countered and the more confident MIS types can be in choosing Smalltalk.


    If one looks at market share as available dollars to be spent on
    development and deployment technology then the choice is obvious. One
    can wear blinkers and go after 100% of the few millions of dollars being
    spent on SMalltalk development projects, attempt to eliminate the very
    people that help bolster your own sales, and have a larger slice of a
    rapidly shrinking pie. Alternatively, one can look at the total market
    and attempt to gain a share of billions of dollars being spent on
    development and deployment technology across the industry, and gain a
    growing share of a growing pie. For the Smalltalk sector to to do the
    latter it helps if it attempts to be a community and recognizes its
    members can be of enormous help to each other. Being fearful of each
    other is not the answer.


    One important aspect of this is the evolution of Smalltalk. When
    Smalltalk was developed it was funded by the most rapidly growing
    technology company the world had seen and it was developed by a
    relatively small team. Certainly the number of people working on Java
    at IBM and Sun dwarf the amount of people working on hardware and
    software at PARC in the 70's. i.e. it was relatively cheap for Xerox to
    fund in the 70's, but funding a successor now would be much more costly
    if Java and .Net are at all representative (which they may not be).


    Now, if Smalltalk is to evolve, or a successor invented to obsolete it,
    I think it extremely unlikely that this will happen in the context of a
    corporate funder. i.e. I doubt that Alan Kay will be able to get HP to
    provide sufficient commitment to do this.


    Where else might it happen? The two obvious candidates are in
    universities and in the "open source community". But since it is
    universities that populate the open source community anyway we should
    concentrate on universities. That is a place where people get exposed
    to new ideas, fall in love with them, and often come up with good new
    ideas. Companies like MS recognize this, which is why they are
    targeting universities with technologies like Rotor (the open source
    .Net platform) and funding for research. They are fighting for hearts
    and minds.


    Over the past two decades the university sector has become more
    vocational in its teaching. Alan Kay lambastes no less than Stanford
    university in his Croquet presentation for using Java for teaching.
    When I was teaching in London University in the early 90's much debate
    was between those that wanted to teach concepts and those that wanted to
    "provide marketable skills". Government, with pressure from industry
    (almost always short-sighted), sided with the vocationalists and good
    computer science teaching suffered.


    So if universities are to be places where people get exposed to the good
    stuff like Smalltalk, Lisp and Prolog, one thing that will definitely
    help is if the commercial members of these communities can demonstrate
    that in fact their technology is not dead, is not esoteric, but in fact
    in widespread and extremely demanding use in industry. [side note:
    VisualWorks and VW/GemStone combinations are used in sectors such as cpu
    manufacture, container shipping and derivatives trading on a world scale
    (i.e. they handle a substantial fraction of the world's activities in
    these sectors). But for nearly two decades the corporations who have
    built these applications have viewed their use of Smalltalk as a
    strategic advantage, and hence prevented the vendors from using the
    applications in marketing material.]


    The more the Smalltalk community can demonstrate commercial viability
    and relevance the more widely it will be adopted by the universities
    and the more minds will follow the arc of falling in love with
    smalltalk, finding its limitations and dreaming of something better.

Amen!

Monday, March 14, 2005

Another Reason Squeak/Smalltalk Is Cool

I was reading the Squeak Swiki tonight and ran across this entry for running headless. Here is the interesting bit:
    Another option is:
    Smalltalk snapshot: true andQuit: true.
    "All your restore stuff goes here"
    PWS serveOnPort: 80 loggingTo: 'log.txt'

    Select all of this and DoIt. Your image will save-and-quit...IN THE
    MIDDLE OF THE DOIT. When this image starts up, it continues the
    DoIt, which is the restore and the PWS startup.

Now, read through it. Does anything catch you off guard? Well, I for one think it's very clever! It takes into account that Smalltalk is a live system. You can quit in the middle of executing code and have it resume it where you left off when you quit! WOW! Name one modern IDE that can do that! It caught me off guard for its simplicity and cleverness. It again shows the absolute power that Smalltalk has. You can execute the code to save and quit the environment (because it's written in Smalltalk) and have it resume where you left off in your code if it was running! I had never thought of doing this! It makes me slap myself! I've saved images with running threads before (and have them jump back to life when the image restarts, this is how my background changer for Squeak works), and I don't know why I didn't think of it before. It's simply "a DUH! moment" TM.Anyway, I wanted to blog this because I thought it was another testament to the simplicity and power of Smalltalk. By the way, I think you can do this in any Smalltalk and it will work (the messages will vary by vendor of course).

Sunday, March 13, 2005

Deep Philosophy

Vincent Foley has an excellent quote for quipping back to people who want to rain on your parade. I love it! Go read it here.
    “Billions of flies eat shit; doesn’t mean it’s good”
And yes, it's going on the quotes page! I'll have to remember it next time someone quips about my love for Smalltalk, Lisp, Ruby, Heavy Metal, or 60's Synth Music...=)

Fun Script Project

OK,
I decided to take a little break this weekend and do something that I've been wanting for a little while. What is it you might ask? Well, it seems rather dumb, but I like for my wallpaper to change. Now, when I was back in X Windows land, this was simple. Perl, crontab, and voila changing wallpapers. It seems to be more a challenge on windows. So, I dusted off google and found the solution. I implemented it in a quick and dirty little ruby script. All I did was put all of my images (already converted to bmp) into one directory and it cycles between them all. Nothing sexy really. I've just been curious on how to do this on windows. I have Squeak that changes my wallpaper of my current project. So, I wanted it all of the time. I'm a happy boy now. Here it is (like I said, it is ROUGH)
    require 'win32/registry'

    #show bmp in file_name stretched
    def show_wallpaper(file_name)
    Win32::Registry::HKEY_CURRENT_USER.open('Control Panel\Desktop', Win32::Registry::KEY_ALL_ACCESS) do |reg|
    reg['Wallpaper', Win32::Registry::REG_SZ] = file_name;
    reg['WallpaperStyle', Win32::Registry::REG_SZ] = 2;
    reg['TileWallpaper', Win32::Registry::REG_SZ] = 0;
    end
    `RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters`
    puts "Showing: #{file_name}"
    end

    #Obtain the next file to use as wallpaper. Basically, cycle through the directory

    def next_file_name(current_file_name)
    found = false
    first_file_name = nil
    Dir['C:/wallpaper/*.bmp'].each do | any |
    first_file_name = any unless first_file_name
    return any if found
    found = true if any == current_file_name
    end
    first_file_name
    end

    #Get the current wallpaper file
    current_file_name=nil
    Win32::Registry::HKEY_CURRENT_USER.open('Control Panel\Desktop') do |reg|
    current_file_name=reg['Wallpaper', Win32::Registry::REG_SZ]
    end

    #get the next and then show

    image_file_name = next_file_name(current_file_name.gsub(/[\\]/, '/'));
    show_wallpaper(image_file_name) if image_file_name

That's it! It's amazing how little information there is. I found changing the registry only by chance. And then, it will not update. Calling the rundll32 command by pure chance. It was a good learning experience and it makes me a little bit of a happier boy. One more note, I converted all of my jpg and gifs to bmp via Squeak. I couldn't find any conversion image stuff for Ruby. If anyone knows of any, let me know. Now, back to Fox/Ruby land for work on my Trail Blazer inspired tool...=)

Saturday, March 12, 2005

Amen brother

Sam Griffith wrote an article named Ruby tools vs. Java tools... that is simply on the money. Never discount a technology because all of the bell and whistle tools are not there yet. I've been keeping my eye on Ruby for years because it is a great language. Hell, I've been secretly writing a tool for it that I use all of the time in Smalltalk. Why you might ask? Because I would like to see great tools in Ruby. A great language needs great tools. It helps in the amplification.

SmallHttpUnitTest is broken in VW 7.3

Well, it's broken for a little while. I looked at the problem and it seems to be around the cookies. I'm still looking into it. I've been rather busy with work as of late and haven't been able to spend a lot of time looking into it. But, I hope to have a solution soon. If you're hard pressed, it works great still in 7.2.

Danny Joe Brown of Molly Hatchet dies

Anyone that knows me, knows I love southern rock just as much as I love my metal. The news of Danny Joe Brown saddened me. I love the first three Molly Hatchet records. Danny's singing on the first two is just plain soulful and great. Great musicians simply rocking out on bad ass tunes. I don't even mind the quip about Alabama. Another great has fallen. A sad day indeed...

Friday, March 11, 2005

Tipping My Toe In Ruby Again

I've been playing around with Ruby again. It's nice to get a different perspective on things and the Ruby community shares a lot in common with us Smalltalkers. But, they are also different. Sure, we all love dynamic languages and know we're more productive. But, is there anything to learn from them? You bet! For one, they have an infatuation with blocks that leads to some cool designs and succint solutions! They also have philosophy that is pragmatic and to keep things simple. There's a lot of youth and excitement there as well. I'm having fun just playing around. One of the things that caught me off guard is not to have config files consist of data, but make them living code as well. So instead of some boring XML (or YAML) file, why not just use Ruby? The distinction of runtime and compile time is not there, so why have a data file? Make it executable and alive! It's one of those, "Gosh, well, YEAH! Why not?!!" It made me think of all the places we use static information when we can have objects that are alive. Anyway, I'll report more as I continue playing. I've known Ruby for awhile, but haven't really played with it in awhile. I think a lot of Rubyists would love Smalltalk if they gave it a chance.

Sunday, March 06, 2005

Encapsulation, Performance, and "DUH!"

I've been teaching a fellow programmer of the ways of the square bracket knights (I am but a mere squire, I know, please bear with me!) and he showed me some code that looked like the following:
    | sorted |
    sorted := SortedCollection sortBlock: [:a :b | a greatAttribute <= b greatAttribute].
    someHugeFile linesDo: [:each | sorted add: (CoolObject from: line)].
    sorted inspect

Nothing wrong with that code, right? Well, my gut instinct was to rewrite the code thusly:
    | toBeSorted |
    toBeSorted := OrderedCollection new: someHugeCollection size.
    someHugeFile linesDo: [:each | toBeSorted add: (CoolObject from: line)].
    (toBeSorted asSortedCollection: [:a :b | a greatAttribute <= b greatAttribute]) inspect

The only real difference here is that I used an OrderedCollection and then sorted. As I started to mention this to my friend, I heard the quote, "Premature optimization is the root of all evil!" I stopped myself cold. I knew the only change I was going to make was because of performance reasons. The next thought I had was, "Why does SortedCollection keep itself sorted all of the time?" I mean it is an object. Why not only sort when it is needed (when you send do:, collect:, reject:, etc)? Then, I could use a SortedCollection without having to worry about performance of sorting a large collection piece meal. It turns out to be a trivial change (simply override do:, add a flag to mark when sorting is needed, and that's it!) We get the performance improvement and the code above stays like it was originally. The way it should be. The user of the object doesn't need to worry about performance, the object does that work for them.

Thursday, March 03, 2005

Omaha Smalltalk User's Group Meeting

It's getting near that time of the month again! So, instead of staying at home, why don't you come on down and see what all of the fuss is about? Come see the inspiration for countless languages, Smalltalk.

This month, Alan Wostenberg will be giving an updated and in-depth presentation on running FIT in VisualWorks. Hopefully this time the weather will behave. Here's all of the details:

When: March 8, 2005, 7pm - 9pm
Where: Offices of Northern Natural Gas
1111 S 103rd Street
Omaha Nebraska 68154


Office is at 103rd & Pacific. Guests can park in the Northern visitors parking area back of building, or across the street at the mall. Enter in front door, we'll greet you at the door at 7:00pm. If you arrive a bit later, just tell the guard at the reception desk you're here for the Smalltalk user meeting in the 1st floor training room.