Scoble wants to blame his travel issues last week on an old DOS app. It's not always about the technology. What Scoble ran into was a simple people problem. I've seen this sort of thing (booking problems) happen with modern "whiz bang" systems as well. If you have bozos doing the data entry, you can get bozo results. Updating the software and keeping the bozos will simply result in prettier looking Snafus....
We should have the latest - VisualWorks 7.2.1 and ObjectStudio 6.9.1 non-commercial up on the site for download later today. I'm still awaiting one confirmation from engineering - once I get it, new downloads will be the latest stuff. I suppose I should point out that we have a new release :) What's new? Well, this release is mostly a maintenance/bug fix release. The next major release will be in the fall (late November, most likely). Have a look here for details
I'm still testing some changes to BottomFeeder, but expect to have an update out this week. This is where I'll be marking a break between the release (3.6) stream and the dev (towards 3.7) stream. I'll be adding the ability to have BottomFeeder run the update loop using a configurable number of threads (instead of the single threaded loop it now uses). There will be a limit - if you subscribe to as many feeds as I do, then having a thread per feed update would just torch your bandwidth and likely result in most of the attempted http queries timing out. I'll have a dev build for that up soon; I have to finish off some bug fixes to the NC download application first though. Stay tuned.
JIS asks "where's the beef"? in Smalltalk. It's a fair question - but I think we have answers. I left this as a comment on his blog, but I'll repost here:
Not to mention the other blogs here
Sample client App?
BottomFeeder. If you want to see code samples, look at the various Smalltalk blogs above - most of them get far deeper into that than I do on my blog. There are blogs devoted to GUI, Tools, Database, and general Smalltalk stuff. There's been a bunch of good content that way recently. All you have to do is look.
I've got a dev update (i.e., add dev/ to the end of the update path in settings to see it) that makes the HTTP updates that Bf does threaded. If you go to Settings, you'll see a new option under the 'Network' page - turn on threaded updates, and the system will spawn (lightweight) threads for each http query. Let me know how it works out; it's a lot faster on my system.
Ed Foster points to an interesting policy MS has on getting access to "premium" support:
"I needed to know how to solve a problem we were experiencing in Outlook, so I went to Microsoft for help," wrote the reader. "After drilling down I found what looked like a link to a solution for our problem. Upon clicking on the link a page appeared and said that since the machine I was using did NOT have Office 2003 installed, that content was not available to me. I should go out and buy a new Office suite and upgrade to it and then I could have access."
That's pretty nasty. Never mind whether or not you are current on your support - have you loaded the latest and greatest?
Every few months this complaint runs around the Blogosphere again:
(From Mark Fletcher) - Centralized services like Bloglines avoid this problem because we only fetch a feed once regardless of how many subscribers we have to it. Desktop aggregators can't do that, of course, and end up generating huge amounts of traffic to sites like Infoworld. There are various things that a desktop aggregator can do to mitigate the load, like using the HTTP last-modified header and supporting gzip compression. But the aggregator still has to query the server, so there will always be a load issue.
This is not a new problem. Popular website (like Yahoo, Google, etc) have had this problem (without RSS/Atom being involved) for eons. If you get popular, you need to add more bandwidth, plain and simple. On the client end, if you pay attention to:
- Feed meta-data about how often a site updates
- Use Conditional-Get
- Request and deal with mod-gzip
Then you are doing all the right things (BottomFeeder does all of these). The biggest issue now is that a lot of the sites serving RSS or Atom are serving feeds dynamically, and not offering server side support for any of these things. Fix that, and most of this chicken little stuff will fade away
The new (VW 7.2.1 and OST 6.9.1) Non-Commercial downloads are now available for download. If you have already registered, there's no need to do so again; just follow the link that was sent to you in email, and you'll be offered the up to date downloads. What's new in this release? - the current release is primarily a maintenance release. There will be a major release this fall.
VW 7.2.1 Fixes from 7.2
- Advanced Tools
- 46996 MetaNumerics classes #printOn: should send #asString to UserMessages
- Base Image
- 46729 UHE because of nil argument in BlockClosure>>uiEventNowFor:
- 46852 Memory Shrinking issue
- 46900 InflateStream is missing a couple of methods.
- 46933 menu pragma causes a compiler warning
- 46940 Move convenience methods such as trimBlanks from String to CharacterArray
- 46978 Issues with the Home Directory settings dialog.
- 46995 GenericException>>mustBeHandled raises ControlInterrupt prior to returning false
- 47079 MNU: #removeComponent: while starting the image saved with Parcels
- 47105 Change Set adds only one matching class/instance selector to an existing parcel
- 47131 Changes>>override list for a Parcel: DNU sending #name to a String
- 47156 change sets hang on to parcel instances.
- 47206 Update TimeZone comments for use of TimeZone null
- 47242 Browse versions walkback when parcel has no source file
- 47256 DebuggerService>>#scheduleMessage: should coerce potential user messages
- 47302 SmallInteger>>asDouble omits the primitive...
- 47313 In Debugger, textHasChanged value does not update properly
- 47338 Refactor #addEntiretyOfClass: to re-use existing methods
- 47541 Wrong documentation for sizesAtStartUp:
- 47441 New DotNETConnect version for integration
- 46824 DB exceptions hierarchy tweaking for backward compatibility.
- 47107 ConnectionDialog expects an exception to be a class, not an instance
- 47120 Unix EXDI Bug
- 46859 New Version of GHStoreEnhance (with reknown functionality) available
- 46861 Wiki which can co-exist with Web Toolkit made available
- 46997 Update ObjectExplorer overrides for 7.2
- 47168 update RBCodeHighlighting goodie to 1.18
- 47429 New version of GHSpeedUpUserMessages made available
- 47430 New version of GHSpeedUpXMLParser made available
- 47433 New Version of GHTools made available
- 47507 STAMP: MNU #addressString on letter view/creation
- 43875 B:Dialog damage holes
- 46355 flyByHelp inactive in new user-placed window
- 46367 FlyByHelp does not work on disabled views
- 46419 Enh: making >>defaultPrintConverter more consistent
- 46552 One click to a cell activates entry callbacks upon Dataset cell navigation
- 46623 non standard menu behavior on windows
- 46677 Windows unresponsive to keyboard or mouse if dialog host is closed
- 46810 Menu bar keyboard navigation interference by mouse cursor on Windows
- 46811 menu selection bug on long menus
- 46829 Group box border becomes blue when disabled in the Windows XP Look
- 46835 Exception on image startup - Message not understood: #sensor
- 46847 E:Possibly allow pattern paints with Motif L&F
- 46851 Can't select Dataset column in Mac UIPainter canvas
- 46885 UIPainter - Editing widgets in a group box rearranges tab order
- 46911 Menu bar open by hot key in Windows look should select first menu item (like VW 3.0)
- 46966 Fly-by help doesn't always reappear on some unix platforms.
- 46972 Probable race condition with multi-proc UI
- 46973 UHE when copying widget
- 46985 UHE: Mnu: #newExceptionFrom: when indexing unknown paint for a palette
- 46987 Icon of active window is not transparent where it should be
- 46989 In Windows L&F, pop-up menus opened near the right or bottom edge of the screen open in the wrong place
- 47006 Dialog TreeViews ignore text emphasis settings
- 47014 Selecting window from VisualLauncher->Window menu should always raise the window
- 47020 B:Startup image with DoubleBuffering does not open all windows
- 47026 B:DNU NullWindowManger processOutstandingEvents
- 47028 B:Bad setting of DevicePaint in MacOSXWidgetPolicy
- 47029 EnterEvent gets lost when exiting menu
- 47039 UI actions performed prematurely while attempting to update display
- 47043 Windows LookPolicy submenus open or close uncharacteristically with mouse action
- 47091 GeneralSelectionTableView methods should anticipate selectionStyle outside of #element, #row, or #column
- 47158 B:ResizingSplitterController>>exitEvent: calls enterEvent:
- 47163 Transcript>>show: garbles input from multiple processes at like priority
- 47165 Progress bar should use a system color
- 47182 Too many window updates after opening
- 47197 Introduce a bug into e.g. browsing queries and one looses the launcher...
- 47218 WindowManager class>>purgeDeadWindows modifies its registry while iterating over it
- 47223 OS X look facelift
- 47224 Use platform-faithful combo box buttons for Mac OS X
- 47230 TreeModel>>refreshRoot fails to update expansion icons for unexpanded nodes
- 47233 Pop-up Menu selector dispatching invokes editor callbacks whereas Blocks don't
- 47250 [OSX] Use Panther-like menu item separators
- 47252 B:JPEG Image Reader doesn't do Images correctly
- 47254 Use of pluggable adaptors along with aspect adaptors raises MNU #subject
- 47274 Event name typo in SelectionView<
- 47280 Implement MultiSelectionInTree>>selectionDo: for multiple selections
- 47282 [mar04.3]PNGImageReader and ArborGIFImageReader incorrectly access their argument
- 47283 Label mnemonics fail to move focus to a subcanvas
- 47290 Becomes Cursor normal during Cursor>>showWhile: if cursor enters another widget
- 47292 Combo Box behavior in Windows XP is not correct
- 47310 Pollock Preview for 7.2.1
- 47321 ApplicationModel>>wrapperAt: does not protect, when the builder isNil.
- 47332 closed launcher still hanging around
- 47367 Mouse wheel doesn't suspend fly-by-help
- 47385 MNU: #<< entering catalog symbol to label in GUIPainter
- 47394 MNU: #specClass to SelectionDragModeTracker during UIPainter drag
- 47427 Marking a Subcanvas "Initially Invisible/Initially Disable" doesn't work
- 47448 Remove unused instance variable from WindowManager
- 47457 Opening interface for UISpecification classes throws exception MNU: #openWithSpec:
- 47463 E: Add wait for keypress, mouse press to WindowManager
- 47488 Inconsistent use of 'converterClass'
- 47491 Dataset cell entry accepted w/o callbacks or focus change upon menu bar selection
- 47530 Mac OSX Dataset row selector buttons display with MNU:#container
- 47531 Add <Alt><Select> to toggle multiselection lists, trees, and datasets
- 47540 Alignment in InputFields and Home/End-keys (Pos1/Ende Tasten) position bad the input cursor in aligned input fields
- 46857 Unicode support on Windows broken since oct03.4
- 47200 Release does not contain newest version of Unicode for Windows parcels
- 47377 installer and packaging changes
- 47473 Fix installMac for limbo NC
- 46527 [Glorp] Faster replication
- Net Clients
- 46160 Change target FTP server for FTPTests
- 46815 Add flush for Net clients write socket streams
- 46905 FtpURL does not properly decode password
- 46909 UHE on Net.URI encode: 'hi%'
- 46945 FtpURL broken, #directoryContents and #construct:
- 47053 FTP URLs with characters encoded to %hex equivalents do not work
- 47333 HttpClient doesn't update the port number when url is moved
- 47471 Integrate some 7.3 AR's to 7.2.1
- ODBC Connect
- 45059 ODBCEXDI doesn't allow multiple result sets
- 47345 ODBC EXDI does not support PLSQL binding
- Oracle Connect
- 46579 Raising exception for stored procedure created successfully, but with compilation errors
- 46762 OracleError missing parseErrorOffset.
- 46871 Problem when binding arrays have different size in array binding.
- 47141 Oracle External Authentication does not work in VW.
- 47232 Speed up for Oracle 8 EXDI
- 47271 Crash because of allocation failure in OracleEXDI
- 47273 In OracleEXDI 'nullable' returns an integer, in ODBC it returns a BOOL
- 47378 [vw7.2] DNU in oracle exception handler
- 46862 Need more accurate error messages from the install script.
- 47428 visualworks.ini is outdated
- 47515 fix DotNETConnect file names
- 47542 fix build script for StreamWritingExtensions and remove parcelName property from PackingListTool
- Runtime Packager
- 46849 Emergency notifier doesn't open properly when dialog is in focus
- 47413 RuntimePackager should keep AbstractSystemEventInterest
- 47235 [Hashes] hashes itermittently generate wrong digests
- 46178 Walkback when comparing system version of PundleLoadedChange which isn't in current database
- 46287 compute leafItems just once in PackageDifferences>>loadFromDBWithin:
- 46803 Remove Browse packages and Browse Classes View launcher picks form Store
- 46832 #updates:fromParcel:relink: should send properties instead of pundle to #relink:
- 47072 File out of bundle from browser does not capture bundle structure.
- 47152 BundleModel>>#structure: should use #expandMacrosWith:with: instead #expandMacros
- 46895 UHE in RBSUnitExtensions when a test and non-test classes are selected
- 46896 UHE in class finder when clicking down arrow
- 46899 Tune #optimizedSelectors in RBParser
- 46936 No autocompletion in class creation/find dialogs
- 46946 No Class>New menu in a browser spawned on a package
- 46948 [RB] Misspelled method name ParseTreeSearcher>>recusivelySearchInContext
- 47022 [VW 7.2] Exception when selecting a shared var containg a window
- 47051 FormatterConfigurationTool should automatically enable applying the changes to all browsers
- 47085 Add page access method to SettingsManager
- 47145 Explainer doesn't always explain selector in browser
- 47146 Remove max size limit from the launcher
- 47147 Change window max size default
- 47159 Ctrl+E to call the explainer in Trippy conflicts with eval pane
- 47161 Make #markedAsSystemClass clearing a user setting
- 47174 [FB] FileBrowser loses text changes on directory selection
- 47183 Minimize RefactoringBrowser window updates on opening
- 47196 Cannot browse implementors of * because its interpreted only as a pettern
- 47202 typo in FormatterConfigurationTool>>#postOpenWith: dialog messages
- 47204 BrowserNavigator>>#pundleMenu has two items with missing catalogs
- 47212 Walkback while dropping methods into class without any protocols
- 47213 Auto-flush in Transcript
- 47239 RE: [VW7.2] [BUG] #abortDebuggingFor:
- 47249 [MiniChanges] Allow change set creation from change set list
- 47269 copyStack in PDP broken by I18N
- 47272 Package search auto-completes too much
- 47365 PDPMsgRcvdInstrumenter>>initializeBreakpointLeadString needs to send #asString
- 47387 PDP's CompiledMethod>>printNameOn:inClass: needs asString when printing unbound methods
- 47404 PDPInstrumenter>>initializeIvar needs to send #asString
- 47539 PC not set correctly when removing multiple CodeProbes at the end of a method
- Wave Developer
- 47036 Regression:Wave subcanvases not built if client is nil
- 47334 WaveUIPainterTools doesn't unload cleanly
- 47383 VisualWave looks up some menu items by label, not key
- Wave Server
- 46864 clarify server names in UI
- 46878 walkback in #receiveEntityOver:
- 46942 port: not understood from server console
- 47066 #shouldUseWebToolkitResolving is called, but not implemented in VisualWave
- 47076 CGI gateway Crashes under win 2003 and XP
- 47347 Server Memory policy does not properly use defaults
- 47402 Improve web server extreme low-memory handling.
- 47486 Tighten up exception handling in ISAPI DLL
- Web Services
- 47185 xsi:nil="true" should return a nil ( undeclared object) instance
- 47326 Building header marshaler from an element with complex contents
- 47379 Release notes 7.2.1: WS added support for nil attribute
- 47381 Changed default for XMLObjectMarshalingManager useInlineType caused a fault response
- 47396 Soap Header was not created for doc/lit style
- 47412 AR for case 362190, UTF-16LE encoding and more
- 47456 AR for case 362190 Error resetting superclass
- 47480 XMLTypesParser doesn't process attribute with restriction
- 47509 The inline type was not set for simple types
- 45638 smarter caching of missing servlet
- 45850 Make Session>>at:ifPresent: support zero or 1 arguments
- 45978 ifAbsent: forms for any*Value... methods in Request
- 46060 wave developer/server/web toolkit partitioning errors
- 46435 error handler in tag processing can mask user-level dNU:'s
- 46439 Mutual exclusion on session and application
- 46440 consistent accessing protocol for sesions and requests
- 46442 PageModel>>application should be eagerly initialized
- 46491 comments for new settings classes in wave/wtk
- 46515 validate to avoid recursive logical names
- 46765 Semantics changes for attributeAt:, beanNamed:ifPresent:
- 46833 Move SimpleFileUploadServlet into the base wtk
- 46886 Server console session display doesn't work for wtk requests
- 46988 [WTK] Body tag body evaluation issues
- 46990 [VWAS] Server Console seems broken on MacOS
- 47095 don't set cache control headers for static content
- 47100 Internationalize tutorial URLs
- 47198 Request>>attributes doesn't include parent attributes
- 47287 WTK adds #encoding method to internal streams, breaks XML
- 47319 add convenience protocol to servlets for accessing application, webSite
- 47331 Fix Response expiry header semantics
- 47368 Remove "Built with Cincom Smalltalk" trailer
Those are the VW fixes. I'll post a list of the OST changes shortly
Here's the list of fixes included in ObjectStudio 6.9.1:
Enhancements For 6.9.1
- Ensure that #canReceiveFocus answers false for FormItems with the #NoSelect option on
- Autoskip goes backwards when the shift key is down. Item traveral using the tab key was redesigned to put the behavior in Smalltalk. The method ControllerItem>>tabTraverseStep: is now invoked by the VM after the user presses the
key to handle switching focus to the next item in the traversal list.
- The ItemTraversal in InterfaceComponents does not work
- 'fieldsArray' and 'formatDict' of a table are not initialized if you try to access tables with another user than the one who created them
- 77430 Event Handling of empty TreeViewList and double triggering entered events for ListCtrl. The #entered event was being sent twice if you pressed the
key for an item in a list box.
- An error setting TreeView fonts introduced in 6.8 was fixed.
- OperatingSystemMessageBox>>setParentTo: and related messages should take a Form argument
- memory access violation when Sybase database is stopped. The error block is now handled correctly in SybaseDatabase>>privateExecSql:onError:
- Symbol cannot begin with a digit In previous versions of ObjectStudio, the code #2 would compile into the number 2, i.e. the # was just ignored. It will now trigger the compiler error 'An unquoted Symbol cannot start with a digit'. To create a symbol, use #'2'
- Remove the duplicate ControllerItem check in Form>>checkDuplicateCItems: This method was commented out, see the comment in the method for more info.
- SafeSharedQueue>>waitForEntry calls fetchSemaphore method, which is not implemented. An accessor method for the instance variable fetchSemaphore was added to the class SafeSharedQueue and all references to the inst var were changed to use the accessor instead.
- The Designer now sends the message #minExtent to get the minimum height and width of a FormItem
- Fixed a display problem with number entry fields (The first digit of the filled numeric entry fields were not displayed when
- the field is filled,
- it gets the focus first time and
- The place for the field is not big enough
- Renamed MessageBox>>privateTitle:text:icon:buttons:action:controller: to MessageBox>>createTitle:text:icon:buttons:action:controller: for protocol compliance with ModalMessageBox
- ItemTraversal does not work properly for buttons with the "Help available" option enabled
- ModelingTool method ICDFontAttributes>>getFont was changed to not pass nil as an argument to Font>>setBoldTo:
- It is now possible to logoff from one instance of OracleDatabase using the method OracleDatabase>>logOff
- Fixed a problem with ObjectStudio Sybase interface and large text columns
- Problem with ByteArray>>decodeUsingDescriptor: when encoded data was an Array
- Problem with infinite loops on notebook update. Page>>updateItems was modified to update items only if page is visible
- ListViewCtrl>>privateUpdateSelection was changed to update only if the ListView is open.
- New Class Browser no longer gives syntax error on saving despite no apparent syntax error in method due to obsolete method reference syntax.
- PrintStream problem fixed. PrintStreamClass>>file:onError: (the sole instance creation method) was not initializing inst vars properly, as StreamClass>>new does. PrintStreamClass>>file:onError: was rewritten in Smalltalk to call (super new), and the primitive behavior of connecting to the printer was put in the instance method PrintStream>>device:onError:.
- When log on with username but no password ObjectStudio ignores username and uses Windows authentication instead. This will now cause an error. The proper behavior is when loggin on to SQLServer without inputting user name and password, ObjectStudio will use your domain logon automatically.
- String>>matchRegularExpression: is now Thread safe and an error in Thread Initialization was corrected.
- ODBC truncates milliseconds from SQLServer times
- FileStream>>findPattern: method used to sporadically fail.
- Object>>isMTError is not implemented.
- Make FormListView/FormTreeView methods use 1 based indexing. The following methods in FormListView and FormTreeView are called from the VM: getTextForItem:getTextForItem:subItem:imageIndexForItem:onBeginEditAt:onLabelChangedAt:to: The VM used to pass the C-style (zero-based) index of the row in question into Smalltalk. It will now pass the Smalltalk-style (one-based) index. For instance, the first row used to be indicated by row index 0; now row index 1 indicates the first row.
- After open a cursor on a database and get some values, it is not possible to select data from another table in another database using execSql:
- Subclasses of FixedItemsController were not getting their mainForm properly set when saved from the Designer.
- ByteArray>>asString, ByteArray>>stringFrom:to: did not respect current character set.
- The method Number>>printRounded: gives wrong results. This method would sometimes round down instead of up, so a statement like 1.995 printRounded: 2 would answer '1.99' instead of '2.00' Depending on your version of Windows and the math libs installed, it was even possible to see behavior like (1.95 printRounded: 1) = '2.1' This has been resolved with this release.
- Remove hard coded help file name from ThreadBrowser
- #selectAll does not always work for MaskFields FormMaskField>>update was only informing the Windows API of the proper selection for a mask field if that field had focus when it performed the update.
I'll have a post up shortly with a summary of what's new from a functionality standpoint in both products
There isn't a lot of "new" stuff in this release. It's a maintenance release over the last one. There were a lot of changes in 7.2 and 6.9, and a number of those things have been enhanced in this release. Here's a short list:
- Web Services
- Tools for generating Smalltalk classes from WSDL and for generating WSDL from Smalltalk classes. These tools are "command line" (i.e., Workspace) driven in this release, but will have Wizard style interfaces in the next release.
- Web Toolkit/Wave Server
- The server has been updated to use the Opentalk framework, making it more stable and more scalable. We have added an Opentalk based Load Balancer framework, which replaces the CORBA based one from earlier releases. This framework will be generalized over the next few releases
- Many bug fixes to the event handling and painting of widgets, especially the TreeView and DataSet (grid) widgets. Most work is focusing on Pollock at this point; the existing UI will not be updated (other than critical bugs) until Pollock replaces it.
- All English language strings in the product have been replaced by UserMessages - which means that developers can more easily internationalize their applications. Reuse of existing Dialogs (for example) no longer requires code changes - instead, simply create a parallel catalog
- Unicode support
- On Windows, we now have a fully Unicode aware Image and VM. This means that VisualWorks will display the correct font - assuming that said font is installed on the machine in question (without regard to the current Locale). This support will be extended to the Macintosh platform in the fall, and beyond that to Linux/Unix over the next few releases
- Windows CE support remains in preview (beta) for this release. We intend to move this to a fully supported state for the fall release. Developers can target Win CE 4.x devices that use either the x86 or StrongARM architecture.
- We have included a port of the XML Parser from VisualWorks into ObjectStudio. This enables better interaction with XML based services from ObjectStudio
- VW Interoperation
- We have included a port of Opentalk (the Smalltalk to Smalltalk protocol) in ObjectStudio. This is in preview (beta) until the fall release. What this allows is full messaging interoperation between VisualWorks and ObjectStudio - developers with ObjectStudio applications that need access to services supported only in VisualWorks (Web Services, etc) may now do so much more easily
There's money in Smalltalk - see The Register's story on the acquisition of OOVM:
Swiss embedded software company Esmertec has acquired the start-up founded by VM pioneer and former technical lead of Sun's HotSpot project, Lars Bak. OOVM was founded in Denmark in 2002 and privately-held Esmertec acquired the company for an undisclosed sum.
"If you have say, a small router or a dishwasher you can upgrade the code while it's running, no reboot is required," Bak told us today. "If you have a device, and you have more than one component it doesn't make sense to shut down the system."
Consumer electronics manufacturers have experimented with the technology, attracted not only by the serviceability by its small size: as low as 128kb, which includes a TCP/IP stack. For example as a research project, Bang and Olufsen built the VM into digital speakers, which could then be modified over FireWire.
How does it achieve this magic? OOVM's technology comes in two parts, a VM and a development environment, and it uses Smalltalk, rather than modern-day kludges such as Java, which resembles a modern object-orientated environment in the way that a pub ashtray resembles a cigar store.
So much for the notion that Smalltalk is "big and bloated" - For more details, see my article on Lars' talk at StS 2004
We just became a reseller of SmallCOM/X (an add on from Joops that allows you to embed Active/X controls into VW Windows). There's a demonstration version in the goodies - it shows you how to embed the IE HTML control into a VW window. I just got a note from Josef Springer at Joops - he has some information for users of VW 7.2.1:
SmallCOM/X Version 2.1.0 for VisualWorks 7.2.1 is available now. Some modifications ecspecially for VisualWorks 7.2.1 have been made. You can load an evaluation copy from http://www.joops.com/SmallCOMX.zip. SmallCOM/X 2.1.0 is useable with VisuaslWorks 5i or higher.
One of the things that JIS asked for was examples - examples of how to do various things in Smalltalk. Well, we've been talking about this at Cincom, and some of us are going to start posting examples from parts of the product that we are familiar with. I've done a fair bit of work in HTTP for BottomFeeder, so I figured I'd go through the basics on that. In general, when I post examples, I'll be using the examples category
How to do an HTTP Query in VisualWorks
If all you need is a quick result (when dinking in a workspace, for instance), you can just do the following:
HttpClient new get: 'http://www.yahoo.com'
Now, that will work - and it will even do the right thing in the face of a redirect (either 301 or 302). However, it's not terribly robust - it won't handle any of a variety of of hiccups you might get from a web request (server errors, timeouts, etc). Sure, you can wrap that message send in an exception handler (handling an ExceptionSet of issues) - but you still won't get all the things you want. You will likely want to be able to do things like:
- Specify the content-type
- Specify what kinds of responses you'll handle (mod-gzip, etc)
- Specify the User-Agent and/or the Referer string
For that, you need to dig into the ancillary classes surrounding the basic HttpClient (and HttpsClient) class and construct a custom request. Here's how you would create a basic HttpRequest object:
setUpRequestFor: url request := HttpRequest new. (request getFieldAt: 'User-Agent') value: 'My Agent String Here'. request contentType: 'text/html'. request accept: '*/*'. request method: 'GET' url: url.
Now, that's hardly an exhaustive list of data that you can attach to a request. You can specify things like cookies, and conditional-get information - but you get the idea. The (request getFieldAt: 'blah') value: 'value' pattern can be used to specify arbitrary headers.
So we have a request object. What do we do with it? We execute the request and we get a response. Here's how you execute the request:
httpExceptions | set | set := ExceptionSet new. set add: HttpRedirectionError. set add: HttpObjectNotFound. set add: Smalltalk.OSErrorHolder notReadySignal. set add: OS.OSErrorHolder notReadySignal. set add: OS.OSErrorHolder peerFaultSignal. set add: OS.OSErrorHolder inaccessibleSignal. set add: OS.OsTransferFaultError. set add: HttpServerError. set add: HttpTimeout. set add: HttpStatusLineError. set add: SSLBadCertificate. ^set
executeRequest: request | response | exceptions := self httpExceptions. client := HttpClient new. client keepAlive: true. ^[client executeRequest: request] on: exceptions do: [:ex | nil].
Now, even that's not the full range of what you might need to do. In BottomFeeder, I trap a few specific exceptions for handling. With that out of the way, what do I do with the response? For things like redirects, I have to check the response:
httpGetFor: someUrl request := self setUpRequestFor: someUrl. response := self executeRequest: request. (response notNil and: [response isMoved]) ifTrue: [self handleMovedObjectFrom: response]. ifFalse: [response notNil and: [response inUnauthorized] ifTrue: [self handleAuthorizationRequestFor: response]]
Now, bear in mind that handleMovedObject: and handleAuthorizationRequestFor: are not part of the standard API. As it happens, the standard Http libraries handle basic authorization and redirects - but not necessarily in a way that is sufficient for applications (i.e., BottomFeeder wanted to silently re-label feed urls, and it wanted to handle Digest Auth - and the standard libraries do not do Digest Auth yet). Beyond those two, this is all boilerplate VW code. So let's put the "high level" API we've just defined in one piece:
responseOrNil := self httpGetFor: someUrl
Now we have a response (or nil). We can send the contents message to that and get the results. Then you can do whatever is appropriate - parse it, store it, display it, whatever. The basics of this are in two packages in the public store - Http-Access, which is used in BottomFeeder now, and a much cleaner implementation in NetResources, which is what Bf will be moving to shortly. I'll go through how to construct a POST next time I give an example.
Julia Lerman is excited about the inspector in a Whidbey preview - it apparently lets her drill all the way down into an object. Nice to see Microsoft is powering forward into the 80's. Wake me when they reach the 90's....
Ted Neward shows us this simple truism: If developers can misuse a feature, then developers will misuse that feature
Interesting photo from the Cassini probe - from Nasa. Anyone seen the Lord of the Sith recently :)
Apparently, Drinkable Donuts aren't working out for Krispy Kreme. Scroll down and look at the pictures of the reviewer as he takes his first sip :)
Sean McGrath makes a comment on the wisdom of using static languages in middleware:
My position on this is simple. Anyone coding middleware in a statically compiled language, working in a commercial environment where time is money, has rocks in their head.
Clearly, I agree with that. How do Java folks update their servers without taking them down and up? How do C# developers? In Smalltalk, I do this all the time, and as a result, my servers tend to run 24x7x365. Yes, I test things out locally before I upload them :)
This post got a lot of attention from the curly brace crowd. When I asked "So how do you run a 24x7x365 Java/C# application server?", I got a bunch of responses. They all involved having multiple application servers (load balanced), and updating each in sequence while doing server configuration tricks to ensure that the app server being updated didn't get accessed. So I have a simpler question. Say - like this server - you have one app server you want to update without downtime. Let's say that said update involves shape changes to various objects that may or may not be in memory. So how do you keep that up while updating it? Sure, I get the notion of sequential updates.... but say the server (like most of them out there, to be honest) isn't a suite of load balanced systems. What then?
Jim Hugunin, the creator of Jython, starts work with Microsoft Monday chartered to work towards a production-ready IronPython, and more broadly to improve the state-of-the-art of dynamic languages on the CLR.
That means that Microsoft is genuinely interested in making things better for dynamic languages. Meanwhile, Sun continues to let the JVM stagnate - because gosh, they did everything that ever needed doing back in the mid 90's. Tip of the hat to Microsoft here
In a post about databases, Roy Osherove slips in this funny bit:
"Question: If the DBMS knew you were approaching the end of your rope, why didn't it say something? My working hypothesis is that it's kind of like when your wife wants you to take out the trash, but all she says is, "The trash can is almost full." Not, "Honey, will you please take out the trash?" Her objective is not to get you to take out the trash; rather, it is to improve you, the husband, morally and spiritually -- while at the same time getting you to take out the trash. You're supposed to infer, based on the facts she's provided, that you need to do it. I say, this is more like training than housekeeping. My wife insists that she must therefore be a very poor trainer. But trust me, she's keeping score."
Heh. Very true, that...
Aeronautics giant Lockheed Martin plans a 10,000 seat migration away from Solaris over to Linux and Intel, a confidential source told us yesterday. There's no word yet on how much the new Linux deal could be worth or who the lucky vendor might be, although our source did throw out the name Dell once.
Maybe he's got some great railroad track line to cover this situation :)
Longhorn is going to be later - I guess that gives developers more time to be confused between WinForms and Avalon :)
It's nice to be placed in the same category with Paul Graham, but I think I'm being a little misunderstood. Here's what I mean:
There are some software development pundits from the world of obscure languages who have lots of really smart stuff to say, like Paul Graham and James Robertson, whose hatred of popular languages just has to be glossed over if you expect to be able to read them. I think that they're so offended that their language of choice (Lisp, Smalltalk, or whatever) never hit the big time that they just can't see other, more popular languages all that rationally. I know they'd tell me that they hate Java or C# or whatever because they handcuff your productivity when compared to the obscure language that they favor, and they may even be right.
It's not a matter of hating C# or Java - I recognize them as rather large scale improvements over C++, the programming language from hell. What I'd like to see is less auto-decision making going on. Instead of "well of course we'll use Java", I'd like to see people actually think. I've seen people using EJB and three tier set ups for problems that could best be solved by Access, for instance. What I mostly object to the sheer volume of hammer/nail thinking in the IT industry.
ComputerWorld has an interesting piece on one of the aspects of outsourcing that doesn't get talked up enough - communication:
"Business owners still aren't happy with the fact that application design meetings need to be held at 7 a.m," he said, jabbing his chopsticks into the pickled ginger. "Projects are taking three and four times longer because overseas workers don't understand our business the same way my old employees did. It's not that one group of developers is smarter than the other; it's that my old group had more experience on the existing applications than the new one does. In a couple more years, it will probably be OK, but for now, it's a disaster."
Forget the cultural issues (which themselves are non-trivial) - just look at the communications issues in the simplest way - there's a 12 hour timezone problem. You can't have business calls during normal business hours for everyone. That's going to have a productivity impact. Heck, I see this even in a non-outsourced relationship. We have staff and partners in Australia, which is 14 hours off-cut from the east coast of the US. That makes real time communication difficult, unless someone is willing to work during non-business hours. It often means that any communications are going to be delayed by a full day - which makes misunderstandings difficult to fix.
In most of the talk about offshoring, I only see cost as a factor in the decision. Communication ought to be front and center.
Scoble talks about LongHorn - this part made me sit up and take notice:
For another, it's the largest software project I've ever heard of. Thousands of people working on it. Tens of millions of lines of code. Heck, it takes a bank of computers several hours to compile it (and the code size will probably grow quite a bit between now and release).
Any project of that scale is problematic to my mind. For one thing, if it takes that long to compile agility is right out the window. For another, anything that big has too many people involved in it - realistic collaboration is simply impossible. Makes me wonder just how much completely unknown duplication is taking place, for instance. I'm sure LongHorn will ship (in one form or another). I'm also sure that the end results won't be entirely predictable.
SAN FRANCISCO -- A former San Francisco Giants outfielder and three others told a federal investigator they obtained performance-enhancing drugs from two men charged in a doping scandal involving a San Francisco Bay area laboratory, a newspaper reported Saturday.
Armando Rios, now in the minor leagues, told the agent he purchased a human growth hormone and testosterone from Greg Anderson, trainer for Giants slugger Barry Bonds
It's well past time for the players and owners to stop treating this problem as a negotiating issue and start treating it as the scandal it is. How many of the records (especially in the home run area) broken in the last decade are going to end up with large asterisks next to them? How many people have to wonder about the odd improvement of Bonds' homerun output as he approaches 40? It's time for Selig and Fehr to get serious about this.
You may have some periodic issues getting to the blogs (and other Cincom sites as well) today - we are having another round of ISP trouble. They tell me that it will be an on again, off again problem until they get it resolved.
I went to see The Village last night with the wife. It was an entertaining couple of hours in a popcorn movie sort of way. I can't really talk too much about it without revealing the gist of the movie. I will say that I thought that "The Sixth Sense" was done a lot better though. Not a bad film - just don't try to over-think the implications at the end. Have popcorn and enjoy the escapism :)
I've talked quite a bit about Dynamic Updating (one of the niftier features of BottomFeeder). Bf implements updates on a package (parcel) basis - you can download updates I make available on the server, and they ca be loaded on the fly (or at startup). I've been asked a few times about making the package that does this available; it's always been available - the package PatchFileDelivery is in the public store. However, it's been fairly tightly tied to BottomFeeder. I've refactored the package this morning - it should be possible to make use of it outside Bf now - you'll need the latest version, which should have its pre-reqs properly set.
Jonathan Schwartz is a wonder. Here he is, one of the head honchos at "Red Ink 'r Us", and he's telling us that IBM is in trouble. Hmm. From IBM's latest earnings report:
ARMONK, N.Y., July 15, 2004 . . . IBM today announced second-quarter 2004 diluted earnings per common share of $1.16 from continuing operations compared with diluted earnings of $.98 per share in the same period of 2003, an increase of 18 percent. Second-quarter income from continuing operations was $2.0 billion compared with $1.7 billion a year ago, an increase of 15 percent. Revenues from continuing operations for the second quarter were $23.2 billion, up 7 percent compared with the second quarter of 2003 revenues of $21.6 billion.
And Sun's latest report?
Sun Microsystems this week reported a profit of $US795 million or $US0.24 per share in the fourth quarter, compared with a loss of $US1.039 billion or $US0.32 per share in the same quarter of last year. Total revenue for the quarter, which ended June 30, was $US3.11 billion, up 4.3 percent from the year-earlier quarter, Sun said in a statement. Sun's profits were buoyed by the nearly $US2 billion it received as part of its legal settlement with Microsoft earlier in the quarter. Discounting the Microsoft money, Sun reported a net loss of $169 million or $0.05 per share.
That's right - had MS decided not to create another charity case, Sun would have had yet another consecutive red quarter. With that as a premise, let's see what brilliance Schwartz is brimming with today:
A few years back, IBM and HP both hopped onto the social movement called linux. It's a wonderful movement. But the bad news for IBM is that the vast majority of enterprise datacenter deployments are now occurring on Red Hat's linux. 100 to 1, depending up on where you look. And with Red Hat increasing price, while adding in an application server that competes with WebSphere, IBM's finding itself in the uncomfortable position of having lost control of the social movement they were hoping to monetize. They're beginning to look like the IBM of Mr. Akers's era - having missed the forest for a tree, and finding themselves without an operating system.
IBM has been among the most aggressive (and ironic) in positioning itself against the world of "proprietary" technology - in stark contrast to its history as the world's most pernicious patent litigator. It's against that backdrop that IBM brags about its "thousands of programmers working on linux." But ISV's can't build their business on a social movement - they have to pick a base software distribution and web service stack. And with most enterprises having picked Red Hat on IBM's recommendation, IBM now clumsily realizes it's invited the fox into the hen house. With Red Hat running on the majority of IBM's proprietary hardware, Red Hat can now direct those customers to HP and Dell. Even Sun.
It's amazing to me that he gets paid for this level of obtuseness. Sun pretty much created the shovel operation that plows money to IBM - Java. IBM has nearly half the application server market (to Sun's just about nil) - and Schwartz wants us to believe that IBM is in deep trouble, while Sun is all set to cruise forward on the commodity rails they've set up. Dream on. Here's the gist of the delusion that Schwartz has set himself:
IBM is in a real pickle. Red Hat's dominance leaves IBM almost entirely dependent upon SuSe/Novell. Whoever owns Novell controls the OS on which IBM's future depends. Now that's an interesting thought, isn't it?
Yeah, right. Last time I looked, IBM was happy to sell you Websphere (for huge gobs of cash) on just about any platform you wanted it on. Sun is the company that desperately needs you to have a Sparc box running Solaris; IBM just doesn't care. We (the Cincom Smalltalk team) are in the same position (so far as concern, that is) - VisualWorks runs everywhere, we don't care what hardware you buy. Ditto IBM (on a much larger scale, obviously). Ironically, what's the main reason that IBM can not care about the hardware - Java. Who created the commodity space that shovels money at IBM and away from Sun? Oh, that would be... Sun.
Keep whistling past that graveyad Jonathan. At least you're entertaining the rest of us while you do it.
Aaron Brady is impressed by Squeak Smalltalk, but asks: "Apart from legacy, why do people still use Smalltalk"? Well, that clearly gets into advocacy - have a look at dynamic updating updating in BottomFeeder - end users can load updates without having to restart. I do the same thing for this blog server. Dynamic typing makes the language much easier to develop in (similar to Python in this regard). The Smalltalk image is implemented in itself, which makes it much, much easier to develop tools in Smalltalk - developers commonly extend their own environments. Why use Smalltalk? Probably the best answers can be gleaned by reading the blogs here and see what the community itself has to say.
Here's the real risk that Linux faces - patent law. Companies like IBM, Sun, and Microsoft have been filing software patents pretty aggressively for years - it's not inconceivable to consider the possibility of MS deciding to make a patent claim (of course, who they would make such a claim against is an interesting problem all by itself). Take a look at this:
'Linux potentially infringes 283 patents, including 27 held by Microsoft but none that have been validated by court judgments, according to a group that sells insurance to protect those using or selling Linux against intellectual-property litigation.' Dan Ravicher, founder and executive director of the Public Patent Foundation, conducted the analysis for Open Source Risk Management. OSRM is like an insurance company, selling legal protection against Linux copyright-infringement claims. It plans to expand the program to patent protections."
Patent use as a business weapon is nothing new - I wouldn't be surprised to see this sort of thing at all.