When your pitching staff if giving up runs like a waterfall gives up water, the answer is not to hire another pitcher my age... Here's an idea - find some guys in their 20s!
Doc Searls reports that Time Magazine has made their archives available:
TIME Magazine exposes all their archive editorial, going back to 1923. For free. So, when Joe Klein writes an essay for the magazine, he doesn't have to worry that his writing goes down what writers at less enlightened publications call "the $2.50 hole", within which which all old "content" continues to be "monetized" until the end of time (no pun intended). Even if it never sells to a single reader.
This is an example other media ought to follow.
I recorded my roadmap session at Smalltalk Solutions on Tuesday, May 1st. I had to replace the audience questions with my own paraphrasing; the noise levels on those were just too high. It was a fun talk, with a lot of good audience interaction - I'm hoping that most of that came through.
The AACS control folks are just starting to figure out how much people hate copy-protection schemes:
Mr Ayers would not comment specifically on the AACS group’s plans, but said it would take “whatever action is appropriate. We hope the public respects our position and complies with applicable laws.”
He said that tracking down those who had published the key was a "resource-intensive exercise".
According to a Google search, almost 700,000 pages have published the key.
Jonathan Zittrain, a professor of internet law at Harvard Law School, said that assuming the key could break a DVD, it's distribution would infringe the provisions of the Digital Millenium Copyright Act (DCMA).
Good luck getting all 700,000+ sites to take down the key - especially those outside the US, where the DMCA isn't law. Sure, some of the people involved in this are pirating DVDs - but that's not really the issue. There are perfectly valid reasons to want to copy a DVD (what if I want to watch LOTR, but not carry my DVDs with me when I travel?). These schemes just piss off law abiding people, and they don't throw up so much as a speed bump to the pirates. Assuming that all of your customers are crooks is not a great CRM strategy.
I made a couple of corrections to the build script I posted the other day; I had some case sensitivity issues, and also two parcel paths that assumed my specific system setup. I've tested the script out on my Mac (works fine), so you should be able to use it without trouble now.
It was a good week for BottomFeeder downloads: 455/day. The details:
That's more Windows downloads than I normally get for a weekly total :) On to the HTML accesses:
|Tool||Percentage of Accesses|
And finally, the Syndication numbers:
|Tool||Percentage of Accesses|
|Google Feed Fetcher||4.9%|
|Net News Wire||4.3%|
|Strategic Board Bot||1.1%|
The overall numbers are up again, too.
Seems the NY Post got a little "out in front" of the MS/Yahoo merger story - and some people are pretty mad about it:
The New York Post owes everyone a good follow-up story.
You can't just drop a bombshell that jerks around 80,000 Microsoft and Yahoo! employees, rocks Wall Street and then fizzles before the day is over.
The Post should investigate -- and report -- whether its anonymous investment banker sources made any money off the huge run in YHOO caused by its story.
If the Post doesn't do this, the SEC might. We don't need any more reporter subpoenas.
Here's a thought: what if the SEC did less oversight in general? How long does supposed insider information stay inside before it leaks out to the market in general? Maybe a system where we just let the chips fall, and shame over looking stupid be the medicine would work better.
The AACS has a nasty problem on their hands - how to deal with the tidal wave of anger from their activist customers. Witness the bluster from the group over the AACS key thing on Digg:
Bloggers "crossed the line" when they posted a software key that could break the encryption on some HD-DVDs, the AACS copy protection body has said.
Thousands of websites published the key, which had been uncovered in a bid to circumvent digital rights management (DRM) technology on HD-DVD discs.
Many said they had done this as an exercise in free speech.
An AACS executive said it was looking at "legal and technical tools" to confront those who published the key.
Translation: "Whoa, we had no idea that thousands and thousands of sites would flash mob us. We're hoping that some angry sounding bluster will fix the problem".
I don't condone theft - I'm in the commercial software business, for gosh sakes. However, we don't lock our product up with idiot key mechanisms, and we manage to make money. If the movie and music business concentrated on making their customers happy instead of on torquing them off, they might get somewhere with that.
I've now got BottomFeeder into a state where you can do a simple build using VW 7.5. Here's the build script I'm using for my development image - the only change necessary will be in the name you use to access the public story repository - I've saved mine under the name "cincomsmalltalk". Anyway, here's the script. Use it with this command line:
visual visual.im -filein build-bf-dev.st
| profile | #( '$(VISUALWORKS)\database\OracleThapiEXDI.pcl' '$(VISUALWORKS)\contributed\PostgreSQL\StoreForPostgreSQL.pcl' '$(VISUALWORKS)\store\StoreForOracle.pcl' '$(VISUALWORKS)\parcels\RBSUnitExtensions.pcl' '$(VISUALWORKS)\net\NetClients.pcl' '$(VISUALWORKS)\contributed\Heeg\GHSpeedUpXMLParser.pcl' '$(VISUALWORKS)\parcels\Model-Observables.pcl' '$(VISUALWORKS)\parcels\CE.pcl' '$(VISUALWORKS)\preview\Unicode\AllEncodings.pcl' '$(VISUALWORKS)\preview\Unicode\UnicodeCharacterInput.pcl' '$(VISUALWORKS)\dllcc\DLLCC.pcl' '$(VISUALWORKS)\parcels\XSL.pcl' '$(VISUALWORKS)\parcels\UIPainter.pcl' '$(VISUALWORKS)\opentalk\Opentalk-STST.pcl' '$(VISUALWORKS)\webservices\UDDIInquire.pcl' '$(VISUALWORKS)\contributed\WindowsGoodies.pcl' '$(VISUALWORKS)\parcels\MacExtra.pcl' '$(VISUALWORKS)\packaging\RuntimePackager.pcl' '$(VISUALWORKS)\contributed\VRGoodies\VRFileReading.pcl' '$(VISUALWORKS)\contributed\CraftedMemoryPolicy\CraftedMemoryPolicy.pcl' '$(VISUALWORKS)\waveserver\Wave-Server-Base.pcl' '$(VISUALWORKS)\waveserver\Wave-Server.pcl' ) do: [:each | Parcel loadParcelFrom: each]. "set space sizes to a bigger client state" ObjectMemory sizesAtStartup: #(5.0 5.0 10.0 5.0 2.0 10.0 3.0). "read in VW Settings - the next two sections assume that you have saved your settings for Store, and that you have a connection named cincomsmalltalk" Store.RepositoryManager importRepositoriesFromXmlOn: 'repositories.xml' asFilename readStream. "load from Store - connect to public store first" profile := Store.RepositoryManager repositories detect: [:each | 'cincomsmalltalk' = each name] ifNone: [nil]. profile ifNil: [^self]. Store.DbRegistry connectTo: profile. "now load from store" (Store.Package newestVersionWithName: 'ImageConfig') loadSrc. (Store.Package newestVersionWithName: 'TransparentWindows') loadSrc. (Store.Bundle newestVersionWithName: 'SpellChecker') loadSrc. (Store.Package newestVersionWithName: 'WinGDIPlusInterface') loadSrc. (Store.Bundle newestVersionWithName: 'EpiWin32Folder') loadSrc. (Store.Package newestVersionWithName: 'GIFSupport') loadSrc. (Store.Package newestVersionWithName: 'Weaklings') loadSrc. (Store.Package newestVersionWithName: 'Emote-Support') loadSrc. (Store.Package newestVersionWithName: 'ExtraEmphases') loadSrc. (Store.Package newestVersionWithName: 'ExtraActivity') loadSrc. (Store.Package newestVersionWithName: 'VRCommonDialogs') loadSrc. (Store.Package newestVersionWithName: 'XmlRpcClient') loadSrc. (Store.Package newestVersionWithName: 'SubForkPreload') loadSrc. (Store.Package newestVersionWithName: 'SubFork') loadSrc. (Store.Package newestVersionWithName: 'Http-Overrides') loadSrc. (Store.Package newestVersionWithName: 'NetResources') loadSrc. (Store.Package newestVersionWithName: 'NetResourcesHTTP') loadSrc. (Store.Package newestVersionWithName: 'NetResourcesHTML') loadSrc. (Store.Package newestVersionWithName: 'LibTidy') loadSrc. (Store.Package newestVersionWithName: 'Browsing-Assist') loadSrc. (Store.Package newestVersionWithName: 'OSTimeZone') loadSrc. (Store.Package newestVersionWithName: 'XML Configuration Files') loadSrc. (Store.Package newestVersionWithName: 'PatchFileDelivery') loadSrc. (Store.Package newestVersionWithName: 'Twoflower') loadSrc. (Store.Package newestVersionWithName: 'TwoflowerHTMLParser') loadSrc. (Store.Package newestVersionWithName: 'Win32TaskbarSupport') loadSrc. (Store.Package newestVersionWithName: 'Windows TrayIcons') loadSrc. (Store.Bundle newestVersionWithName: 'WS-Pollock') loadSrc. (Store.Package newestVersionWithName: 'SandboxedSmalltalk') loadSrc. (Store.Package newestVersionWithName: 'ScalingScreenGraphicsContext') loadSrc. (Store.Package newestVersionWithName: 'RelativeURL') loadSrc. (Store.Package newestVersionWithName: 'File Repository') loadSrc. (Store.Bundle newestVersionWithName: 'WSBundle') loadSrc. (Store.Package newestVersionWithName: 'CommonTypeMappings') loadSrc. (Store.Package newestVersionWithName: 'BtfNamespace') loadSrc. "now load BottomFeeder" (Store.Package newestVersionWithName: 'BFSharedicons') loadSrc. (Store.Bundle newestVersionWithName: 'Blog-Tools') loadSrc. (Store.Bundle newestVersionWithName: 'BottomFeeder') loadSrc. "disconnect" Store.DbRegistry disconnect. "save image" ObjectMemory saveAs: 'btf-dev' thenQuit: false.
I've managed to get a version of WithStyle into the store repository, and now I can start working on Bf itself. Once I'm done with this, loading Bf from Store should be easily possible.
Forbes is reporting that MS wants to get back into talks with Yahoo:
Software maker Microsoft Corp. asked search engine operator Yahoo Inc. to re-enter formal negotiations for an acquisition that could be worth $50 billion, the New York Post reported on Friday.
I can almost see Google rubbing their hands, Brer Rabbit like, thinking "please, please don't throw us into that briar patch!". If MS does end up buying Yahoo, they'll end up paralyzed for the next few years as middle management on each side goes to war. Mergers of entities that large almost never go well.
Update: I love this phrasing from Matthew Ingram: "MSFT and Yahoo: two icebergs, roped together"
I'm just getting started on migrating BottomFeeder up to VW 7.5. There are some interesting issues, due to the open sourcing of With Style (and the fact that parts of it rely on a legacy rev of Pollock). I'm working through that though, and I should have a version that is fully loadable from Store at the end of it
Hey look at what those innovative guys in Redmond have done now - they claim to have invented sudo. There's just the small problem of prior art to deal with, but hey - it's not as if the US PTO seems to care about that...
In addition to failing "business model 101", the RIAA can't even manage to figure out who to sue for copyright infringement. That could be due to their "pick a name out of the phonebook" approach to the matter:
Lee Thao was sued in the Eastern District of Wisconsin by BMG Music and other record labels for allegedly sharing files over the Kazaa network. The RIAA based its case on information that the cable modem used to partake in file sharing was registered to Mr. Thao. However, both the ISP and the RIAA failed to recognize that Mr. Thao was not a subscriber to the ISP at the time of the alleged file-sharing, and therefore did not have possession of the suspect cable modem at that time. Daliah Saper of Saper Law Offices represented Mr. Thao and got the case dismissed after pointing out to the RIAA's attorneys that they had made another blunder in their investigations.
I'd call them morons, but I might be insulting an actual moron somewhere...
I just found out that my daughter's been posting some of her photos on the deviantart site (which I had never heard of before today). I was curious as to why she wasn't using flickr, but the only reaction that drew was "ewww". Anyway...
Here's one of the photos she snapped in our garden today:
She's got some nice looking shots over there in the gallery.
Technorati Tags: photography
As most of you know, due to the fantastic work of Chris Cunnington, Squeak was able to acquire a booth at Smalltalk Solutions this year. I was lucky enough to get the opportunity to volunteer to work the booth for the two days of the convention. We had a fabulous location and got a tremendous amount of traffic. The Smalltalk community, while small, is one of the most intelligent, kind, supportive, and fun communities I have ever been involved in. I would like to thank all Smalltalk Solution attendees for there kind words, Squeak cheerleading, and help with answering questions when the crowds got large.
Bert Freudenberg was kind enough to lend us a OLPC laptop. This was the major draw of non-Smalltalkers to our booth. Many of the people knew nothing of Smalltalk but had heard of the OPLC project. The etoys demo was beautiful and if gave us a real opportunity to explain a little about Squeak, Smalltalk, and etoys.
Michael recounts his latest travel problems - I'd call this worse than usual, actually...
LOL is exactly the right phrase for this. Hat tip to my friend Mike :)
I have another batch of pictures from StS 2007 - I only had my camera phone with me, and I couldn't send myself the pictures while we were in Canada. First, another shot of the OLPC, swiveled around - and then a picture of Dale Henrichs and James Foster, during their GLASS presentation:
Next, two from the Seaside BOF: Carl Gundel talking about the Run Basic site (implemented in Seaside on VW), and Boris Popov, speaking about their web app, also in Seaside on VW:
Technorati Tags: smalltalk
I have a few pictures from Smalltalk Solutions; I'll happily post anything else that gets sent to me. The one on the left is Thomas Gagne, from his OLTP Talk, the one on the right is Aik Siong Koh, with his 3D CAD talk:
I'll have more posted soon.
Technorati Tags: smalltalk
Apparently, I missed a huge kerfuffle yesterday over HDTV CSS codes and Digg; Mark Bernstein has all the details. I think the upshot of this is: it's virtually impossible to disappear things from the web today. Once it's out there, it's out there. There are both upsides and downsides to that; either way, it pays to be aware of that fact.
Last talk of the show: Arden Thomas is talking about Application Frameworks. He's been using a derivative of the old "Slam Dunk" stuff from way back in the day at PPS. Today, he's talking about that. He's also building a new rev of this for Widgetry (briefly discussed today).
Arden put the original framework to use at a Hedge Fund he worked for during the early 2000's. He adapted it over time, since his employer wanted regular, tangible results (i.e., no going "off into a cave" for months to create it). Arden sometimes discusses this stuff on his blog. The idea behind any good framework: make things simpler and easier to understand - and facilitate reuse.
Most importantly: A framework should not get in your way and put you in a box. Eventually, you'll need to go outside of the box, and that shouldn't be hard to do. The two frameworks that inspired Arden (for Wrapper):
- Tim Howard's DomainInterface (from his book)
- Steve Abell's ValueInterface (this was inspired by Roby's "SlamDunk")
The main idea: "one" domain, held in a value model. Both frameworks avoided littering ApplicationModel with instance variables (which are just copy of domain instance variables anyway). The main thing is this: it's a set of simple ideas, consistently applied. What ValueInterface did is to use the dependency mechanism to auto-hook a UI and a domain via ValueModels (typically, AspectAdaptors and/or BufferedValueHolders).
AspectAdaptors translate UI level messages into things the domain will understand (and you automate this via naming conventions). BufferedValueHolders are simply wrappers on an underlying ValueModel. All of this allows for a very simple set of messaging - sending #value and #value: gets everything done, and changes at the domain level are automatically signalled up.
Moving forward, Arden is building a Widgetry based version of this. The rest: a Demo. Both the Widgetry version and the older ValueInterface (for Wrapper) will be pushed to the public store repository by the end of next week - so check the RSS feed :)
Technorati Tags: smalltalk
This afternoon, Niall Ross is doing a talk on Extreme UI Testing. Heh: from 1999:
One of the great things about the web is that it's trained our users to not be so picky. They're now accustomed to seeing UIs that look like garbage and change without notice"
Niall is probably right in saying that Ajax (and Apollo, and Silverlight) are undermining this assumption. For UI testing, there are options: SilverMark's Test Mentor, Dave Buck's VWUnit. James Foster has extended WinRunner as well. Niall says that these tools are good for retrofitting an existing system. They don't really support "Test First" (i.e., you can't click an unpainted widget).
An approach: Method Wrappers. Easily possible in VW and Squeak, since you can subclass CompiledMethod and muck with the method dictionary. In VA, you have to do some additional work. Why use MethodWrappers? Niall's earliest attempts at getting at widgets as UI operations returned things made code unpredictable. Using MethodWrappers, you can:
- Wrap the #open method
- Have it not actually open, but instead just report "yes, I was about to open"
You can extend that approach to other actions the UI takes and install before/after handling/reporting. Wrappers are a way to achieve what other languages do with "policy" code.
The ideal test is like a use case test at the "top" of the model layer. Niall uses a strategy pattern to automatically wrap threads that get forked off by looking up the stack to see if the code is under test (and if it is, make sure to install a wrapper). He wraps processes, deferred messages, completion helpers, etc. In VW, there's some additional cleanup necessary to ensure that WindowManagers (for example) get "kicked". In VA, you have to drain the event queues.
- MethodWrappers are good for UI tests
- The same tests can drive the model layer and the UI layer
- You can still do this in multi-process UIs.
A lot of thanks to various people: John Brant, Don Roberts, Michael Lucas-Smith, and Reinout Heeck.
After lunch - Boris Popov is giving a Seaside Experience Report. Boris is using Seaside on VW, and is giving a shout out to Michel Bany, who maintains the Seaside port for VisualWorks. Boris works for DeepCove Labs - 4 Smalltalk developers (they are a part of a much larger company). I did a podcast on their applications with Joerg Beekman recently.
They build a payment processing platform (Raven) - multiple currencies/countries, multiple types of transactions. They do nearly everything in Smalltalk, they do use C libraries where they need to (external device connectivity, databases, etc). They are on VW 7.4.1, and are getting ready to move to VW 7.5. They have their own homebrew (simple) O/R mapping to their SQL Server database.
The Seaside app is a portion of their web portal - payment initiation and reporting. The project started a year ago, after the StS 2006 Seaside/Ajax presentation given by Avi Bryant. This was Boris' first real exposure to Seaside, and he built a simple prototype while he was flying back home - three hours of work.
Why did he care? They were using WebDAV before this, and it was kind of awkward. They wanted a web front end sooner rather than later. They wanted to avoid Servlets and SSP - looked harder than necessary, and they only had a few in-house resources. Boris showed his prototype off when he got back to the office - it was "cheesy" (his description :) ), but he got management buy-in to go forward. They had an actual mockup done in eight days.
Visual Design Matters: make it look slick as early as possible. A professional appearance helps out a lot. The layout affects functionality in that way. Key take away: don't let the developers do the designer's job. Find the right person and let them help you. When working with the designer, express what you want, not how it should be done. If you can agree on a working model, future updates are mostly a matter of CSS file updates.
They really wanted two factor authentication - they went with RSA. RSA has a strong presence in the financial sector. Verisign wouldn't even return their calls ("too small").
HTML Generation: It's not magic - you have to get down and do it. It's not templated - you send messages to objects - which is what makes it more like standard UI creation. You end up reusing and refactoring, not copy/pasting. Callbacks (blocks) make actions work a lot like they do in a UI framework.
They use some Ajax, but take a "don't use it unless you need it" approach". Using Seaside, you can go a long way in Smalltalk, as Lukas Renggli has wrapped the scrit.aculo.us library quite heavily. You can jump in and add custom Seaside if you care.
Boris' message: Don't worry, you won't get it right the first time - but you can iterate to the right answer quickly. What about Deployment? They started with Apache+SSL and a headful Seaside image. They allowed all static resources served from Seaside initially. They ended up shifting all static resources over to Apache. They then added load balancing across multiple images (session affinity).
They finally shifted the static resources out to S3 (Amazon), which lightened their load quite a bit. They pay Amazon about 24 cents a month right now.
Builds: They have an automated build process once all the tests pass.
- Upload all resources to S3
- Trim all sample/config apps
- Configure the app for deployment (set various Seaside/HTTP parameters)
- Save a headless image
The rest of the time was a short demo.
Gemstone has had the most interesting set of stories out of this year's conference - they announced a free (including commercial use) version of Gemstone/S on Monday night, and today they are introducing GLASS - which puts together Seaside with a persistence story. Ruby on Rails is a large part of the inspiration behind the nomenclature. Seaside does what it does better than Rails (in our opinion) - but it has had no persistence (database) story.
The nice thing about Seaside is that you write applications in a very natural fashion using Smalltalk - the development pattern is more like that for traditional "screen" apps than most web application frameworks. Seaside came out of some Ruby work Avi Bryant did, but then moved to Smalltalk due to the better set of libraries and tools.
Seaside is attractive because it makes it much easier to create stateful applications over HTTP. The way it does this is via continuations - served pages can be associated with continuations (the stack). James Foster is now going through the standard Counter example that comes with Seaside. To support Seaside, you need continuations. We now have that in VisualWorks, ObjectStudio 8, Dolphin, Squeak, and Gemstone. Gemstone has added support because they can jump in and add value immediately with persistence.
Gemstone can work with internal web servers (Swazoo, Hyper, and Kom), or external servers - Apache (via FastCGI), or Lightpd (also via FastCGI). The Gemstone port is pretty nifty - they built an interface to Monticello and support loading straight from there. Interesting side effect there - they now use _ as an assignment operator, since Squeak code uses that. They do require spaces before and after - and this is a change from earlier revs of Gemstone.
Looks like something you'll want to head on over to Gemstone's site to take a look at. Since you can run multiple Gemstone VMs (hitting the same back end data), you can scale pretty much linearly. From the tools level, you can use VisualWorks, VisualAge, or Squeak to browse/edit code. The VW and VA interfaces are richer and more feature-full. The link above is a public "sandbox" that you can set up an account in and try things out in.
Technorati Tags: smalltalk
The hype over Silverlight is already so far over the top as to be astonishing. Dare Obasanjo has declared Ajax to be an endangered species. Scoble says it's a complete game changer. There are more stories on Digg than I can shake a stick at.
I think it's time to step back, and Patrick Logan provides the tonic:
I want to *develop* on other platforms than Windows. Not just deliver. (Moot point for silverspoon -- it neither delivers nor develops on Linux, apparently.)
Microsoft is trying to create the kind of walled garden they stumbled into on the desktop out on the net. The problem is, a lot of us would rather develop/deploy on Linux (because it's easier to manage a Linux server remotely). At present, Silverlight is completely uninteresting if that's where you are, and they aren't likely to change that. That doesn't mean that MS won't be successful, mind you - I suspect that an awful lot of intranet applications are going to end up being Silverlight based. At the same time, I'll be surprised if Silverlight ends up displacing more than a trivial number of public facing Ajax apps - because Ajax doesn't limit you in the same ways. Adobe's Apollo, on the other hand - it's going to end up inside and outside. It's the game to watch, IMHO.
Update: Mark Pilgrim adds some thoughts to the "the hype is way overboard" side of the equation. Here's a thought: try Seaside :)
Bert Freudenberg is talking to us (and showing us) the OLPC device this morning. I've been skeptical of the machine, but it is an interesting device. They've done a number of interesting things to keep the price of the screen down, and yet still give you something that's visible in daylight (as opposed to this Thinkpad I'm typing on :) ).
The system is using Linux (somewhat stripped down RedHat), X11, GTK+, Cairo, and D-Bus (messaging framework for inter-application comms). The UI is "Sugar", written in Python. There's an AbiWord based editor, and a Firefox based browser. There are also two educational apps:
- TamTam (music)
- EToys (Squeak)
EToys is a media-rich authoring environment (I've used it in a software class I did for 4th and 5th graders a few years ago). EToys was influenced by the original Smalltalk-80 work at PARC, by LOGO, by Apple's HyperCard, and by Self (comes out in Morphic).
EToys is based on Morphic. You have Players, Costumes, and Uni-classes. Scripting is implemented by having classes created on the fly for you, and making the environment be instance based.
Technorati Tags: smalltalk
Here we are at 6 PM on Tuesday, and it's time for the STIC event. Bob Nemec has introduced Georg Heeg, the new executive director of the council - you can read Georg's thoughts on this over here, on his blog. Here's his evening summary:
The STIC board is made up members from Cincom, Gemstone, and Instantiations. So - what does STIC do now?
- Organizes Smalltalk Solutions
- Provides Websites
- STIC does some level of user group coordination
STIC has a slightly different mission from user groups: STIC tries to raise the awareness of Smalltalk beyond the Smalltalk community. What are Georg's goals?
Improve awareness and visibility of Smalltalk in the industry
Bear in mind: STIC is a volunteer organization. What you do for STIC you do for Smalltalk in general. So back to Bob Nemec, for what happened over the last year.
A year ago, we had some issues - finances were messy, websites were stagnant or non-existant. The finances are now documented, and there are websites:
We lost stic.org - there were issues with our domain registrar. The new STIC site can take payments for individual members. Upstairs, there's a Squeak booth (set up with the help of Chris Cunnington, a complete Smalltalk newbie). Which points the way to the future: STIC can help mostly by getting help from the Smalltalk community :)
Next, a few words from each board member - my thoughts are all over my blog all the time, so no need to repeat them here :) Ed Klimas (Instantiations) spoke about the actual cost (in terms of function points) of converting an application from Smalltalk to something else (and, as I've said here before, such conversions are rarely justified, regardless of which languages and directions are involved). Ed has data behind that point, that come from a variety of sources - Steve McConnell and Capers Jones being two of them.
So using that, given a 3000 function point system, Smalltalk will take 50-60 person months, while Java will take 300 person months. The dollar cost differential there is obvious. At a micro level, Java will give you numbers on the order of 20 function points per man month, even for high end developers. Smalltalk can crank you as high as 100. Ed has discussed these numbers directly with Capers Jones, and he wasn't surprised. Moreover, Java and .NET developers aren't cheaper than Smalltalkers anymore :)
Crunching Ed's numbers, for a new application, Smalltalk will be 2x to 3x cheaper in terms of $$. What about conversion? Bear in mind that testing now consumes half of the development schedule - and in a conversion, testing is going to be a very big piece. Now we get to errors per function point:
- Smalltalk: 0.14 per function point
- Java: 0.50 per function point
Note how much "static typing" helps :) Further, Eiffel on that list was at 0.21 per function point (Haskell was at 0.18). So much for that. So: an experienced developer injects 100+ defects per KLOC. Only half will be found by a compiler - so in a typical conversion - you end up with more code (and thus, more errors). Which gets back to something I've said: a conversion forces you to stand still (feature-wise) for the duration of your conversion, and it adds errors you don't have now. Bottom line: Converting from Smalltalk to X (whatever X is) makes no economic sense. The slides will be available on the Instantiations site shortly.
Technorati Tags: smalltalk
Last talk of the day (not counting the STIC event later), and it's Michael Lucas-Smith talking about Smalltalk and C interfacing. First question: Why do we bother with C? C is the "standard" level of access to operating systems, databases, libraries, etc. It's what you use if you want to reuse.
There are two main ways to interface: wrap an interface into the VM via primitives (relink/recompile the VM), or use a foreign interface (like DLLCC). There's a third way: Recompile the foreign library such that it can talk to you. This is the best way to get C++ apps (that don't have a C API) to have an interface. Python does this heavily, and has some partial automation in that direction.
- C Header Parser (has limitations, more or less dated to the K&R spec)
- You end up doing the interface "by hand"
- VW does have good error handling with calls out to C, and can handle threading C calls.
- C functions defined in a large pragma definition
- Structs are subclasses of OSObject or OSPtr
Squeak, Dolphin, and VW are similar in terms of how they talk to C - Squeak does have the interesting VMMaker thing.
- Limit description of the interface
- Modify the VM by including the definition and recompiling
- In your Smalltalk code you basically add a primitive
- Dynamically compiles C code inline in a Smalltalk method - you can write C code in your methods
So - how do other languages do this? Python uses BOOST - allows you to make calls at the Python level very easily. Perl is mostly similar - open the DLL and then call the C API you want to hit. Ruby is the second worst (Only Java is worse). You recompile the C library with additional macros, and then make calls. The Ruby folks don't seem to mind though - they do lots of C interfacing.
C# - no structure information from the header file at all. You import the DLL and specify the entry points (basically, a separate manifest file from the header file). Somewhat similar to the way VW works (at a high level).
Java - the hardest to integrate.
- Modify the DLL
- Write an interface library
- Java will fix up the arguments based on this "middle man"
Lisp - somewhat similar to the way Perl and Python does it. (Aside - varies by implementation?) Scheme is the same, but with different names.
Forth - they have a header file parser, like VW, but it works better. However, it looks like moth Forth programs statically link libraries rather than use dynamic linking. There are also a lot of Forth implementations.
What about COM, .NET (etc)? The VW COM interface subclasses of COMInterface (usually IUnknown) which does a DNU to do dynamic lookups. The calls are easy to make. The DotNetConnect - you subclass off DotNETObject, actual calls are done using the C interface (as with DLLCC). Some Lessons:
Don't Reinvent the Wheel - we interface to C because the libraries already exist. For instance: LibXSLT. VW has an XSL library, but is not standard compliant (created pre-standard) - and thus does not work with XSL "in the wild". Much of the open source code out there is cross platform, so you don't lose anything if that's true. Even if it's single platform, that may not matter for your project.
Sometimes, you need to Reinvent the Wheel - LibTidy only worked on win32 and Linux, and was unstable. The Mac and Unix versions were only command line, not DLL. The end result: time might have been better spent writing a Smalltalk version.
Don't use C interfaces - if you can use a command line stdin/stdout interface, you may be better off just doing that.
Don't use C - Sometimes you're better off just writing the application in Smalltalk. Used to use LibASpell for spell checking in the XML Editor (but it was slow). Redoing it in Smalltalk with a better algorithm was simpler and better.
Use C - When you come across a library that's worth it (Michael's example: BerkeleyDB). In the process of doing this, a few bugs cropped up - issues with fragmentation in FixedSpace, for example.
Most slowness in C interfacing (VW) is from garbage created as a side effect. Michael's suggestion? Allocate on the stack for C Calls, as C does. Another lesson: don't use ephemerons for C objects, as this just spikes the GC harder.
What ends up happening? People implement an interface to the little bit of a library that they need access to, and no more (because dealing with the header files is so hard). Many of the libs Michael has built are pieces of the Windows API. So why is this hard? C Parser grammar is kind of insane. C is a partially context bound grammar. The C pre-processor is powerful enough to play towers of hanoi! C++ is completely context bound grammar. C++ templates are virtually impossible to deal with, and C and C++ ABIs have deficiencies:
- size and alignment of data types
- layout of structured types
- calling conventions (cdecl, pascal, etc)
- register usage conventions
- interfaces for runtime arithmetic support
- object file formats
C++ has these, and adds more (name mangling!). Also exception handling, invoking constructors/destructors, layout, alignment and padding of classes, and layout and alignment of virtual tables. Interestingly, intel has fixed this in x86 64 :)
SWIG (Simplified Wrapper and Interface Generator). Has its own syntax for describing interfaces. Generates a compiled version for an existing language - need to create own for each language. Python BOOST is similar, done better for Python only (now). Works for C++, allows calling back and forth from Python and C++. GCC-XML outputs an XML manifest prior to compilation - complete reflection for C/C++. No need to parse header files with this. Pyste is a combination of BOOST and GCC-XML to build Python/C++ interfaces. There's also C++Filt - claims to be able to de-mangle names. If it works, you could automate interfaces to C++.
- Smalltalk modeling
- Stack allocation
- ANSI C compliant parsing
- All common and OS libs pre-parsed and delivered withVW
- C++ interfacing
- C++ reflection
- Automatic generation of classes based off C structures and functions that use those structures
Next up: Aik Siong Koh with a talk about 3D CAD and Motion Simulation. The motivation driving him is that UIs in general seem to be moving in this direction (virtual reality games, Croquet, Second Life). Why Smalltalk? CADSM is very complex - Smalltalk is time tested and simpler. VisualWorks gives him platform independence.
What is freeCAD?
- Basic 3D CAD with advanced motion simulation
- Imports DXF (AutoCAD) and STEP (ISO Standard format) files
You can grab this stuff at askoh.com. Cool - he tried running this stuff on the OLPC an hour ago, and freeCAD worked - meaning, VW works there :)
Looks like the rest is a demo, so your best bet is to download it and try it yourself. The math problems are gbeing solved using StMath, which is part of the overall package (you can get that in the public store). Future work?
- Improve GUI and Solid Modeling
- Port to Squeak and Croquet
- Port to OLPC
- Motion add-ons for other CADs
- Control robots and CNC machines
- Finite Element Analysis
- Computational Fluid Dynamics
- System simulation (Modelica)
He's looking for volunteers to help out :)
Technorati Tags: smalltalk
What's coming for VA? Windows Vista support and support for SuSe Linux look like the two main things. They'll have direct support for User Account Control (including registry access, file access, etc). VA Smalltalk makes use of the standard Vista manifest for this stuff. Setting up Envy servers still requires admin access rights.
They have support for Aero if you turn on the Vista theme support - that's done in the application manifest file. This support is in VA 7.5 and up only. The SuSe linux support is the same as RedHat - the new thing is formal support. They now have large address support (up to 3 GB in Windows). You need to link VA Smalltalk executables with specific switches.
They've added Oracle 10 support. That includes BLOB and CLOB support. There's also been a lot of bug repair in the Oracle and DB layer support.
They've upgraded the documentation for Web Services, including a Web Services Demo. This includes a set of tools to make the process of building WS* stuff easier. They've made loading the Refactoring browser and "Mastering Envy" extensions to it simpler (at the Envy load level). They are also including the SUnit Browser, and plan to integrate it into the RB.
Envy/QA is now part of the base, rather than an additional purchase. Interesting side note in a discussion of goodies/contributions - there's no free download available, so you need to contact Instantiations if you would like to contribute.
The browser has gotten an icon refresh, such that they look better on Windows and Linux. As to the future?
- Seaside - needs continuations which VA does not have. They are looking to either change VA contexts, or do some image level work that would emulate and get them "close"
- Web Services - XML Editor, Wizard tools, diagnostic tools
- IDE Enhancements - a lot of consolidation of formerly extra tools into the base. On Windows, move to Windows controls for tools.
- Installation - Consolidate the installers for client/server (Envy) into one. Work more seamlessly with Windows Vista UAC. Work on supported Unix/Linux w/o manual intervention
- Documentation - Update docs to PDF or Windows CHM. Investigate the future of F1 help.
Since version 7 (2004), they've had over 5000 downloads, about 2000 active users, over 200 active customers. Support is mostly moved from the old IBM forums to Instantiations own site. Pricing is still the same as it's been.
Technorati Tags: smalltalk
This morning's talk is with Thomas Gagne, who is the technical lead for InStream Services. Thomas is going to talk about how they use databases, and how they map objects into them. Thomas has an interesting take on this field: his assertion is that there is no Object/Relational impedance mismatch. You can read Thomas' take at his blog.
- The database is the biggest object in the system
- The database is the most important object in the system - everything else is cosmetic
- The database is not invisible
The database is a Semantic Persistence Store (SPS) - a self contained component for managing data. Other examples of an SPS: X.500 Directory Services, Domain Name Service (DNS).
Another concept: Message Oriented:
- Communicate between two loosely components
- Characterized as the message having its own identity
- Its own Object
- Believed by Alan Kay to be very important
So what is the O/R impedance mismatch? The attempt to map tables and columns to objects and methods. At the bottom, OO and RDB are similar but fundamentally different. In Thomas' shot, there is no separation between the OO and Relational people - the same staff handle the applications and the database.
So why are we here? Assertion: The impedance mismatch does not exist in OLTP systems. OLTP is loosely coupled and highly cohesive. Observations:
- Business came before the technology
- The technology is there to assist people
- Private Data
- Activation via message sending (late binding being important)
How is an SPS like a Smalltalk Object? It's a subclass of a more general database. It can dehydrate and rehydrate. It's a state object, it's a singleton. The database is reflective (you can ask the database questions about its structure). Reacts poorly to tight coupling - changes to internal data can be hidden behind an API.
How do they differ? A database does not enforce API only access (variables are public by default). So now Thomas is off to an example - a simple banking application with four methods: login, logout, add money, remove money. The idea is that by giving the database an API (stored procedures in this case), you isolate it from changes at the application level. They don't have application level SQL at all - they have "guarded" the database with a stored procedure API.
There are two interesting pieces of news out this week that could lead to different ideas of what the future of development is going to look like:
- The Microsoft announcement of cross platform support for the CLR, which includes improved dynamic language support. Add in the JRuby work (and the presumed JVM improvements for dynamic languages), and you start to think that it's all about two platforms
- Amazon just re-priced Elastic Computing - bandwidth charges dropped.
The first case leads you think that the VM platforms matter a lot - the second makes you wonder whether they matter at all. If you use S3 and ECL, no one knows (or cares) what you are running, so long as it scales sufficiently. And it will scale sufficiently either via work on your end, or the virtual throwing of more hardware (ECL VM instances) at it.
I don't know how it will come out, but I don't think it's as simple as "it's all about the platform".
Technorati Tags: management
We recorded today's podcast at Smalltalk Solutions, in the room where the Coding Contest was wrapping up - download the podcast to get the results. We had all of us - myself, Dave, Michael, and James Savidge together in one place for the first time ever, and we also had a pretty full audience to play off of. We discussed today's talks at the show, the Coding Contest, and some news from Gemstone. Check it out - it was a lot of fun to do this week!
Heh - Being late from lunch to the first part, I missed the opening, where Joseph ran a video of an unmanaged - but efficient - traffic intersection. No lights, no signs, seeming chaos - but no accidents, and continuous flow.
So on to Scrum Practices:
- Iterations of 1 to 4 weeks
- Team builds functionality that includes product backlog and meets Sprint goals
- Team self-organizes to achieve goals
- Team conforms to existing standards and conventions
- Abnormal termination of Sprint:
- Team can cancel Sprint if the goal of the Sprint is deemed to be unattainable
- Product owner can cancel based on external circumstances changing
An interesting heuristic for Sprint length: How long can management shut up and allow the team to work? Another interesting comment: "The purpose of meetings is to keep people from taking responsibility".
- Takes ownership of the backlog
- Can be influenced by committees, management, customers, sales (etc)
- Responsible for ensuring that the most important business functionality is delivered first
- Ensures that one (and only one) set of requirements drives the project
- Eliminates the confusion of multiple bosses, interference, etc
- Cross Functional
- Selects the iteration goal and specific work results
- responsible for committing to work
- Self organizing
- Authority to do whatever is required to meet goals
- Open, co-located space
- Demos work results to the Project Owner
Ideal team size: Seven +/-2. That's the largest size that can sit at a table and all engage in one conversation.
- Responsible for establishing Scrum practices and rules
- Representative to management
- Representative to team
- A coach
- Engineering and Development skills
- Agile version of IT project manager
The Lead developer really can't be in this role, due to conflict of interest issues. A Scrum Master can be defined as a "Servant Leader".
There are few roles and few practices - Scrum is low overhead. There's a Product Planning Meeting, where requirements emerge. From that, a product backlog gets put together - this consists of functional and non-functional requirements. Anyone can add to the backlog, but the Product Owner is the only one who prioritizes.
Estimates for work - like produce - have a "sell by" date, and that date is the end of a Sprint. At the end of a Sprint, the estimate will either be past (i.e., functionality delivered), or need revisiting. Joseph recommends this book: "Agile Estimation and Planning" by Mike Cohn, as a good source of information about how to do agile planning.
Scrum Planning Meetings:
- What's on the backlog
- What are the Team Capabilities (who can do this?)
- What are the Business Conditions?
- How stable is the technology? What's Changed?
- Executable Product Increment (what did we do last Sprint)
The goal is to plan the next sprint.
Daily Scrum Meeting:
- 15 minute status update - trick to get people there on-time: last in talks first
- Same place/time every day
- Meeting room
- "chicken and pigs"
- Three questions:
- What did you do yesterday
- What will you do today
- Do you have any impediments blocking your progress?
- Impediments and Decisions
Another thing here - Joseph recommends lightweight tools. Index Cards, Spreadsheets, web-based equivalents for distributed teams.
- What did we do?
- New priorities set
- Team devises solution to most vexing problems
Common complaints as to why "it won't work for us"
- We don't have the right people
- Requires business involvement
- Project is too big for Agile
- Project is too complex for Agile
In all these cases, there's a business problem. You know you're doing Scrum when "things come together" - you realize that you can start a project without all information, the team starts to work as a team of developers.
Technorati Tags: smalltalk
I walked into this one late - the pub we hit for lunch wasn't really ready for a sudden flood of 20 people :) So - I came in to hear Joseph talking about "retrospective coherence", which we discussed in this podcast awhile back.
Here's a good question: "How long from here to Ottawa?" - Answer: 4 hours. The problem: how many implicit assumptions are built into that answer (by car, with what kind of traffic, in what kind of weather, etc.).
What is Agility
- It's not just going faster with less process
- It's a discipline
We call it the art of the possible. In fixed price contracts, customers don't get to change their minds (except later, at an additional cost. In an agile contract, customer pays for every iteration, can change direction after every iteration, and gets a running (viable) system after each iteration. If you do this right, you can start delivering value in as little as 2 weeks.
Scrum is a system for managing work in a socially complex domain. One where there is uncertainty due to unfairness/emergence issues (technology change is an example of the latter). It's been around since 1990, and doesn't say anything at all about the engineering process itself. Interestingly enough, it can be used in a fully CMM level 5 fashion (making it Enterprisey ready :) ).
Interestingly enough, one of the first software product uses of Scrum was at Easel on the Enfin product (Enfin is the predecessor of Cincom's ObjectStudio). One of the biggest priorities of Scrum is keeping the product backlog open as a living document. It needs to be revisited at the end of each iteration and updated to reflect new information. So with that, we have the first break - we'll go through the Scrum practices after the break. So - stay tuned for the next post :)
Technorati Tags: smalltalk
So part 2 - Ruby on Rails. First - use the packager and install Rails. "What is Rails?" Rails is a wrapper around a bunch of other little frameworks. The core is made up of ActiveRecord and ActionPack. ActiveRecord is a simple O/R mapping pattern. ActionPack implements the web-facing piece, implementing an MVC pattern for the web. The big thing to remember about Rails is this:
Convention over Configuration
One of the results of this is that using Ruby, you don't end up arguing over things like "which db framework, which directory structure...", etc. etc. So the first step - create an ActiveRecord subclass for the first bit of the domain, and then use some Ruby code to create a table for it. The class Chad created has more fields, but you get the idea:
class CeateContacts < ActiveRecord::Migration def self.up create_table :contacts do | t | t.column :first_name, :string t.column :last_name, :string t.column :created_at, :datetime end end def self.down drop.table :contacts end end Class Contact < ActiveRecord::Base end
That last bit does the class to table mapping. That's it - by following this convention, we have the mapping. Note that we didn't worry about primary keys, SQL (etc, etc). You can name various columns in ways that will automatically map to the database in intelligent ways.
There's a nice log being kept for you that saves a record of your database interactions; this can be useful for figuring out what SQL is being created, and where you may need to tweak.
Some more code - a controller (the handler for actions on the back end). There would typically be a view here for rendering, but we are just being simple (like my web examples in my screencasts :) )
class ContactsController < ApplicationController def index @contacts = Contact.find(:all) render :text => @contacts.inspect end
Now a new View HTML Page (in its own directory structure spot) to handle the rendering. Like web toolkit (and other web frameworks), there's a way to embed Ruby code in pages
<html> <body> <h1>Contacts!</h1> <ul> <% @contacts.each do | contact | %> <li><%= contact.first_name %><%= contact.last_name %></li> <% end %> </ul> </body> </html>
Simply change the controller to eliminate the specific rendering using inspect. The framework also handles giving you basic forms for editing domain objects based on the Ruby and DB definitions. There are a number of built in things for pagination, number of items per page (etc, etc).
With respect to code generation, Chad finds it to be mostly useful for "getting started" and setting up the initial scaffolding.
Technorati Tags: smalltalk
Well - the network situation this year is marginally better. I can actually get to a hotspot, but I have to pay $13 (CDN) for a day pass. That gives me network access as I sit here in the "Ruby for Smalltalkers" tutorial with Chad Fowler.
So - to get started on that, Chad's pointing out that Ruby is a lot like Smalltalk, albeit without the image or tools. So for instance - in the interactive interpreter, you can list the methods for a Ruby class, similarly to what you could do in an inspector. Interesting side point here - Ruby is serving as a "gateway drug" for a lot of companies - so it may help get other niche languages - Smalltalk, Erlang, Lisp, etc.
On to Ruby: Variable types
- $variable - begins with a $, so it's global
- local variables (scoped to the area they are defined in - method, class, etc)
- Pop an @ sign at the front - you get an instance variable
- Class variables exist as well
- Constants exist as well - assignments that begin with a capital letter are Constant (and global)
Heh: "Java is written for Stupid People". Does not mean that all Java developers are stupid; rather, it means that Java attempts to protect you from yourself, such that intelligent developers get frustrated with the shackles.
One of the interesting shortcuts possible in Ruby is that "self" can be an implicit receiver of methods. So instead of:
you can do
Which would be the same as:
Another interesting thing: I can, within a method, invoke super (without the method name or arguments), and have all of the arguments sent to the current method implicitly sent up. That also means that you can't have super invoke a method other than the one of the same name as the one you're in (which, while it would be bad practice most of the time in Smalltalk, is possible).
So here's a class definition with some methods:
class SomeClass def make_one superclass.new end def a_method(a_parameter, another = 123) @local_here = "whatever" end end
So what about naming conventions for methods and/or parameters? There really aren't widespread conventions there. If you're looking at a class and set of methods, how do you tell what arguments the methods take? Documentation, source (etc).
The most interesting part of this session is how the audience is interacting with Chad - it's like twins that have never met, have some differences, but get along famously.
Back to Ruby - conditionals in Ruby are syntax. They have if-then-else and elseif. Some examples:
if a > b puts "yes" elsif b > c puts "asdf" else puts "no" unless 2 > 1 puts "abcd" end puts "it is" if 2 > 1 puts "hi" unless false while a > b puts "yes" end for i in (0..2) do puts i end
This is all different than Smalltalk, but then again, likely much more comfortable for people coming in from Java (etc). Another example:
1.upto(10) do | num | puts num*2 end Is like 1 to: 10 do: [:num | Transcript show: num*2]. to define a block (closure): the_block = lambda do | num | puts num * 2 end 1.upto(10, &the_block) or invoke the block: the_block.call(123)
Blocks cannot be serialized. At this point, there was a rather long trip down a rathole as to why Ruby blocks can be used the way they are, and I have to admit I zoned out on that - Why they are structured the way they are is less relevant than the simple fact that they are set up that way. So we're taking a break here, and we'll get on to Rails afterwards. I'll push that as a separate post.
Technorati Tags: smalltalk
Dave Buck is making his training material available on CD:
As an alternative to or in addition to instructor-led training, Simberon will be providing Smalltalk training on CD-ROM.
I made it to the (rather small) hotel last night, and now it's time to hunt up some breakfast.
I would have thought that Sony was full up on bad PR, but boy - was I ever wrong. They staged a promotion for "Gods of War II" that included a freshly slaughtered goat:
Electronics giant Sony has sparked a major row over animal cruelty and the ethics of the computer industry by using a freshly slaughtered goat to promote a violent video game.
The corpse of the decapitated animal was the centrepiece of a party to celebrate the launch of the God Of War II game for the company’s PlayStation 2 console.
I'd love to know which genius at Sony thought that would be a good idea...
Next Stop: Toronto. Signing off the BWI WiFi, and heading to Air Canada. See you there!
Here's a tip for those clever folks who use DRM to keep us law abiding people from legally using stuff we paid for on a variety of devices we own: If you send out a "take-down" letter to someone who's posted AACS keys for a DVD online, don't include those keys in the urls you send along with the take-down. You already look stupid; no need to make it even more obvious.
Technorati Tags: copyright
Reading my ongoing commentary about DRM, you might come to the conclusion that I'm against the whole idea of copyright. Not so much - and I think Dare Obasanjo just summarized the rationale behind copyright far better than I could - in a piece that does a take-down on TechDirt's "information wants to be free" take on the matter.
The arguments on TechDirt seem to boil down to this: "I like stealing music, so let me construct an argument that rationalizes my behavior". My anti-DRM stance is different; I think that the music industry is doing immense damage to itself by treating their entire customer base like criminals. That doesn't mean that I think we ought to live down to their theory.
Technorati Tags: DRM