Monday, December 21, 2009

strongtalk Smalltalk: a new release

There is a new release of the strongtalk variant of Smalltalk at code.google

The story behind the Strongtalk team, Sun, Self, Netscape and Javascript is somewhat painful.

But thanks to the work of David Griswold we have a new Windows executable, a Mac OSX executable and easy builds on linux with gcc.

If you know anything about Smalltalk (or even the Tcl IDE bult in XOTcl) you will want to see the visionary strongtalk browser (especially if you have seen live code edits in Seaside web pages.)

Work also progresses on Self, the Sun LivelyKernel and Clean Slate Smalltalk.  Likely we are just plain lucky that Self and strongtalk escaped into open-source before Oracle acquired Sun.

Other recent Smalltalk notables: Cincom Web Velocity, Squeak Pharo, Iliad, Aida.
Notable Smalltalk-and-Actor inspired innovation: Io, the language.

Saturday, December 19, 2009

while ( write( read(resource) ) ) # no ;
#pragmatic programming

while(write(read())) may not be as succinct as the equivalent expression in Rebol, but this Icon expression - which composes correctly in ObjectIcon, UNICON, Converge and ICON itself - has an important property: it can fail and its failure is neither an exception nor an error.  And until it fails, it succeeds.

Yet for all the pragmatic programmer interest in languages such as Erlang and Clojure, Icon seems to attract no interest at all (judging from activity at the code.google pages for ObjectIcon.)

Indeed, the apparent disappearance of goto as a reserved word in JavaScript-family languages (except DMDScript, where goto is implemented) would seem to indicate that the Algol-like syntax of the replacement for SNOBOL may never get the attention it deserved.  GOTO is now masked as throw and try/catch and break-to-tag and the "resume-elsewhere-as-resume-next" of Icon failure may remain unknown to another generation of programmers.

When I last looked, goto remained an unused reserved word of Java, just as it was of JavaScript. For programmers who never worked with Prolog back-tracking, the idea that boolean expressions evaluate to TRUE or FALSE may seem a truism.  But it remains the case that a great deal of the internet, for one striking example, depends on all manner of objects deemed "empty" to default in boolean expressions to an evaluation as FALSE.

Just as it was false that SNOBOL would never be performant (SPITBOL put that to rest but too late), so it was false that GOTO is always dangerous (and useful long jumps in C are still with us.)

There is a useful word in German, Aufhebung, which does not always translate cleanly into English: but it might be the one word to capture the response of Icon to the challenges laid before SNOBOL by Algol, Fortran, Pascal and C.

You need only consider that recent languages as advanced as Java, C#, Curl, ECMAScript, Python and Scala continue to use Regular Expressions as if there had never been a programmers' tool which was an alternative to Perl.  PCRE is now an acronym if not also a shibboleth.

Icon was intended for non-computer scientists to use just as was SNOBOL before it, but even an MIT language intended for visual artists, Processing of proceessing.org, continues to advise its users to learn regexp.

Perhaps the release of ICON 9.5 (under the guidance of an award-winning CS teacher and mentor) will attract some attention. Or the future release of pythonic Converge 2.0

But I have my doubts.  Perhaps it will come when an HP innovator looks at available languages for new help center software for help desks in Africa.  Perhaps the interest will come from Latvia or western China.  In any other area of applied science, the likes of regexp would have been gone.  But we have yet to fall under the spell of some great offering us the dictum "RegExp considered harmful".

while ( write( read( responseStream ) ) ) 
# idiom, semi-colon terminator optional

PS
Icon: generators, iterators, practical co-routines, goal-directed evaluation, expression-based language (Carl Sturtivant, G. Townsend with others)
ObjectIcon: UNICODE Icon with classes (Robert Parlett)
Converge: pythonic Icon (Laurie Tratt)
Rebol: www.rebol.net, www.rebol.org, www.rebol.com (from Carl Sassenrath and team; now in alpha for REBOL 3 with closures and modules)
Curl: Clojure-like homiconic web content language with macros, closures, optional types and permiting scoped tags within iteration macros to facilitate expressions such as the macro {for tag=outer permitting {break tag=outer}

Thursday, December 17, 2009

PHP nanoweb on Ubuntu

I was restarting the latest Ubuntu PHP nanoweb on my netbook when I saw a shell script error message.  A run through the file nanoctl in my /usr/sbin revealed a few issues - particular if trying to use the simple status option.  To make matters worse, the script is hard-coded with "lynx" as the browser name -  while my Ubuntu defaults to Galeon (but I prefer Epiphany.)

If you care to look over an alternative, I have a version with extension .sh over at aule-browser.com

The edited version is set for the Gnome Epiphany browser for linux - you may wish to edit  the BROWSER var. Note that the /usr/sbin/nanoweb file is what is commonly referred to as nanoweb.php

Like PHP programming, unix shell scripting sometimes can be a somewhat arcane art.

Thursday, December 3, 2009

Curl Open source at sourceforge.net

Over at developers.curl.com I have posted the links to Curl open source projects which are from curlap.com in Japan which are found at code.google.com

The project home page at Google with the links is The Curl ORB home page at code.google.com/p/curl-orb

These projects are typically shy of being 1.0 releases.

At the moment they are as follows:
  • Curl ORB 0.7
  • Curl Advanced UI 0.6
  • Curl Sonntag MVC 0.7
  • Curl Non-visual Libs 0.7
To quote from their sourceforge.net home pages:

Curl Non-visual Libs
Extended components for Curl language, such as String utility, collection utility, UI utility, logging, log-rotate, data caching, encrypt/decrypt and such.

Curl Sonntag MVC Framework
Curl Sonntag is a simple MVC framework for Curl.

Curl Advanced UI
Advanced User Interface libraries provide components necessary for creating rich user interface applications easily. (for details see this blog post at developers.curl.com)

Curl ORB
Curl ORB is to communicate between Curl and server side Java. It can generate Curl source code from POJO (Plain Old Java Objects), and invoke the Java methods on the server-side from Curl client-side applications.

There is also a new External Libraries project from curl.com in Cambridge, MA, and I will post a note on that open source package when it is out of alpha.

Wednesday, November 18, 2009

Learning Curl: {value expr} and Curl as an expression-based language

One thing that I have noticed in C# and Java programmers learning Curl is that if they rely on one of the available books (and even to some extent if they use the on-line Curl resources) there is a puzzle about {value some-expression} code blocks.

Here is an example from a book on Curl:
{value 2fortnights + 1day}
This an example of a Curl expression in which quantities are added (note the optional use of the plural for the user-defined quantity.)

{curl 7.0 applet}
{let public constant fortnight:Type = {type-of 14days}}
time in seconds is {value 2fortnights + 1day}
 
In keeping with the Gentle Slope approach to reduce the steepness of the Curl learning-curve, the text
time in seconds is
appears in the browser as text.
We say that this bit of text is at the top-level.
What follows, however, is an expression within curly braces and what we want to display is the result of that addition of the two Time quantities. We could have written this expression using optional parentheses as
{value (2fortnights + 1day) }
The {value } macro has been used to return a value: that is all.
To show that this is so, consider this alternative:
{String (2fortnights + 1day) }
The default constructor for the String class also returns a value (an instance of a String.)
Here is another alternative using assignment to a variable named tos:

{let tos:Time = 2fortnights + 1day}
The Time value held in the variable is {String tos}

And finally a complete alternative applet:

{curl 7.0 applet}
{let public constant fortnight:Type = {type-of 14days}}
{let tos:Time = 2fortnights + 1day}

The time in seconds equals {value 2fortnights + 1day}

Time quantity in the variable is {String tos}

Number of days: {format "%.0f", (tos / 1day)}

which displays in the browser as follows:

The time in seconds equals 2.5056e+006s

Time quantity in the variable is 2.5056e+006s

Number of days: 29

A more compact version of the applet using explicit {br} line formatting rather than relying on Curl to display the extra new lines might have been:

{curl 7.0 applet}
{let public constant fortnight:Type = {type-of 14days}}
{let tos:Time = 2fortnights + 1day}
The time in seconds equals {value 2fortnights + 1day} {br}
Time quantity in the variable is {String tos} {br}
Number of days: {format "%.0f", (tos / 1day)}

And so we proceed to wend our way up the 'Gentle Slope' of Curl.

Wednesday, November 4, 2009

What's new in what was once Borland Turbo Prolog?

PDC Visual Prolog has a page on what's new in 7.2

What stood out for me was anonymous predicates or "nameless clauses" as the Prolog response to "anonymous functions".

If you are interested in Tokyo Cabinet, you might want to glance back at PDC over the years and their features offering internal and external databases.  While I have been more excited about XSB and Logtalk in recent years, I have always enjoyed working in PDC.

There is something of an equivalent PROLOG in the Mercury project: both are distinctive in having a type system and in how they track determinism.  Both PDC and Mercury would like to appeal to programmers with a hankering for a functional style.

There are many active Prolog projects: the SWI-Prolog project is likely the most active in opensource and offers RDF parsing - somewhat different from that offered by XSB.

It is odd that with all the interest in Joe Armstrong and Erlang that there seems to be no up-tick in interest in Prolog and Constraint Logic Programming: the acquisition of ILog by IBM and the move of Drools into JBoss seem not to float any other boats.

Like Prologia (Prolog IV) in France, PDC now focuses on their software application offerings and not the language - but you wonder what would have happened if Apple or Microsoft had offered a Prolog to compete with Borland back in the late 80's ... but you could say the same of Smalltalk (in fairness, Apple's Objective-C is like Smalltalk and for some time Apple was home to some Smalltalk researchers.)  At least PROLOG never suffered the fate of Self and Strongtalk at the hands of SUN.

PDC was an early advocate of DSL's (Domain Specific Languages) but I do not know if these feature prominently in their own commercial packages.

Meanwhile, over at Strawberry Prolog a Windows prolog has been in a Beta for version 3.0 for almost a year: it was to contain a major innovation in the design of Prolog compilers, but I am still back at 2.9.2

If you like Eclipse, you might like AMZI Prolog 8 which comes as an Eclipse environment.  Amzi! is a pleasure to use and has great documentation if you have been away from logic programming for awhile.  But there are other options for Prologs which interface with Java and many "small" prolog interpreters about. 

One way to glimpse which Prolog implementations are active is to see which are supported by Logtalk - but that would exclude some of those which come with their own OOP frameworks .. such as PDC.

For other recent changes in PROLOG, see xsb.com and XSB at sourceforge.

If you are tracking any other PROLOG innovations, please add a comment and a link.  I have a note on Distributed Oz 1.4.0 elsewhere ...

Friday, October 23, 2009

ObjectIcon 2.0 UNICODE ICON programming language

The latest release of ObjectIcon is now at code.google which brings oit and oix up to 2.0

This release built without incident on my Ubuntu box and is running behind some scripts on my shared host site.

I have posted a request to Robert Parlett to comment on what features distinguish 2.0 from 1.4

The ICON language itself remains at 9.4.3

Other ICON variants include OOP UNICON and the more-pythonic Converge with its meta-programming features (Converge implements a complete Compile-Time Meta-Programming facility.)

Ralph Griswold and other ICON originators brought us iterators, generators, associative arrays and an alterntive logic-programming facility (Erlang is another language with a restricted or limited logic programming feature set.)  ICON language features are now common in Python and Ruby but its style of logic as success-or-failure rather than true and false goes far beyond non-zero evaluating to a Boolean value as found in many other programming languages.  ICON is an expression-based language (other such languages include Curl and REBOL) which leads to idioms unlike those typical of procedural languages working with a command/statement paradigm in which expression evaluation is secondary.  ICON is nonetheless procedural: each program begins with
   procedure main()

ICON and its follow-on variants are arguably the most neglected languages which were ever aimed to interest non-programmers.  

Saturday, October 17, 2009

4 Windows Browsers

I use Opera 10, Safari or Chrome or IE8 or Prism when I am not in a browser from those I am working on at aule-browsers.com

Opera has the smallest footprint at startup on my XP box ( I use Epiphany on linux) and I stopped using Firefox when it began to choke and bloat on my large set of bookmarks.  Opera behaves well on a few sites where IE8 misbehaves and vice-versa.  When all else fails I turn to Chrome or Safari (Opera is also the only one that passes w3c Acid3 on this box - but Safari does warm the room with its updates.)

Here are 4 other Windows browsers that you might want to consider:

Avant at http://www.avantbrowser.com/

TheWorld at http://www.ioage.com/en/index.htm

Wyzo 3 at http://www.wyzo.com/

SlimBrowser at http://www.flashpeak.com/sbrowser/

The latter offers to build your site-specific browser, so I will be happy to submit a competitive bid if that is your need!

Concept Application Server

While looking at alternatives to Jetty and Geronimo with Jetty, I chanced upon the Concept Application Server.  I will make an effort not to take the wrong tone.

A few tips: they offer the server and the client.  Take the server. It comes with the client and you want them co-installed or no end of test scripts break (expect paths to be hard-coded and they will be the physical paths.)

The web site is in English but is in need of work.  If you find the help CHM file, you will find that it even more in need of help.

The server and client are said to be RC (release candidates) but their own simplest examples crash the client on my XP desktop.  Those examples were a mix of broken English and garish odd dialogs with senseless layout or radiobuttons which are not etc. etc.  They say their current focus of effort is on their IDE, which I have not seen (it will not run.)

The choice of the name 'Concept' is so regrettable.  It is the name of their alternative programming language. The architecture is something like client server for the web: applications reside on the server but execute in a client.  So how to see this in action?

The server bin has options to install as an NT service.  Once that is done, you can try
     concept://localhost/Samples/test.con
in your browser.

You may do better than I did in Opera and IE 8 on XP if you are running Vista or Seven.

What was sad to see was the immense install: the server arrives with an immense pile of DLL's.  The download was very slow in my case (they may be serving the file themselves) and I had already waited for the Client (my mistake, I guess.)

It remains unclear why anyone would adopt the Concept programming language unless they believe that programmers are what is needed: this looks like life without the web designers.  But they also appear to be without UI designers.  Perhaps they have an alternative to HTTP, but I cannot see it after a few hours.

Their blog has seen no addition in the past year (last entry Oct 2008) but it is tell-tale, quote
The Linux distribution is now up-to-date (or almost up-to-date).

The worst is the commendation from a Romanian academic: the author of Concept is working to write the demo chat program in less that 1 minute - indeed, he will soon be able to write those few lines of code in less than 30 sec's.  This feat may impress some CIO somewhere.  And the team is brilliant and the team is dedicated.  But a former president's wife was an all-but illiterate peasant who was awarded a PhD and headed chemical research.  This is Romania.  Not Montenegro, but still, caveat emptor.  I follow a promising project in Sofia, Bulgaria.  But things are not always what they seem in countries where for years saying made it so.  Even in academic life.

If this server and client are 'release candidates' then I might also be the pope.

And if the documentation were not a big enough concern, I cannot find a test framework.  A search in the CHM reveals an assert but no hint of Test, UnitTest, Builder, Factory.

The one large coding effort, GyroGears, is included in compiled form as is the PDFViewer.  And this is open-source of some sort.  The SOAP code that I looked at had no header for copyright or copy-left.  A submarine patent nightmare, I assume.

The author's one PDF tells us that Concept is faster than Python.  Which Python?  Faster than PHP.  Bare-bones open-source PHP?  And why with Scala available, would we choose this form of DLL-hell on a Windows platform?  And if so much like PHP in practice, why not opt for haXe?

Concept most often means "abstraction", an important CS notion.  But today that means such things as the use of interfaces in the implementation of inversion of control.  Patterns.  Web containers.  Geronimo.  But what I find here is very unclear:  the two documents offered are unencumbered by references.

At first I thought that Concept was like client-side Curl (http://www.curl.com/ and not haxx.se cURL) but shifted to the server-side with a focus on the delegate pattern.  There is talk of an interface builder, but I see no sign of it yet in the code.  I may dig a bit more, but the game appears not to be worth the candle.

For developers most at home with GTk, this may be of interest for a project in Romania with funding for 'made in Romania' systems.  Perhaps someone at LtU would take a look at the merits of Concept as a programming language and the use of delegates in the CAS framework.  Maybe someone can see more clearly which architectural challenges are being addressed and how to judge how effectively.  Maybe this is a place for a cyclic dependency metric to be applied.  Perhaps there is some research published in Romania or some tangible data on the one HR system which has been implemented (gone into production?) in CAS or using their GyroGears.

Someone may be unkind enough to notice the file extension; perhaps another unfortuate choice.  What I suspect, is that CAS is a project solving a non-problem or another problem: the focus is on keeping the software on the server to prevent piracy and preclude updates while being performant to reduce server load.  But the trips to the database are the usual issue, and I see nothing to address that in what I can tease out of the code and the limited docs.

Thursday, October 15, 2009

curlgen with Groovy BuilderSupport: CurlBuilder for Curl web content markup

Because the Groovy MarkupBuilder has a private method which hardcodes the markup delimiters, a CurlBuilder must extend BuilderSupport just as does MarkupBuilder itself.

What follows looks to be roughly a builder candidate for Curl web content markup using "{" and "}" as the delimiters.  As with XHTML, the Curl content may require a 'prolog' and a few non-hierarchical items comparable to the !DOCTYPE of XML.  Web markup is often more than simply a hierarchy of nested nodes.
/**
* A helper class for creating Curl markup
* borrowed from http://docs.codehaus.org/display/GROOVY/Make+a+builder
* original MarkupBuilder by James Strathan
* mods by RS
*/
public class CurlBuilder extends BuilderSupport {

private IndentPrinter out;
private boolean nospace;
private int state;
private boolean nodeIsEmpty = true;

public CurlBuilder() {
  this(new IndentPrinter());
}

public CurlBuilder(PrintWriter writer) {
  this(new IndentPrinter(writer));
}

public CurlBuilder(Writer writer) {
  this(new IndentPrinter(new PrintWriter(writer)));
}

public CurlBuilder(IndentPrinter out) {
  this.out = out;
}

protected void setParent(Object parent, Object child) {
}

protected Object createNode(Object name) {
  toState(1, name);
  return name;
}

protected Object createNode(Object name, Object value) {
  toState(2, name);
// out.print(">");
  out.print(value.toString());
  return name;
}

protected Object createNode(Object name, Map attributes, Object value) {
  toState(1, name);
  for (Iterator iter = attributes.entrySet().iterator(); iter.hasNext();) {
    Map.Entry entry = (Map.Entry) iter.next();
    out.print(" ");
    print(transformName(entry.getKey().toString()));
    out.print("='");
    print(transformValue(entry.getValue().toString()));
    out.print("'");
  }
  if (value != null)
  {
    nodeIsEmpty = false;
    out.print(" " + value + "}");
  }
  return name;
}

protected Object createNode(Object name, Map attributes) {
  return createNode(name, attributes, null);
}

protected void nodeCompleted(Object parent, Object node) {
  toState(3, node);
  out.flush();
}

protected void print(Object node) {
  out.print(node == null ? "null" : node.toString());
}

protected Object getName(String methodName) {
  return super.getName(transformName(methodName));
}

protected String transformName(String name) {
  if (name.startsWith("_")) name = name.substring(1);
    return name.replace('_', '-');
}

protected String transformValue(String value) {
  return value.replaceAll("\\'", """); }

protected void toState(int next, Object name) {
  switch (state) {
    case 0:
      switch (next) {
        case 1:
        case 2:
          out.print("{");
          print(name);
          break;
        case 3:
         throw new Error();
      }
      break;
    case 1:
      switch (next) {
        case 1:
        case 2:
          out.print(" ");
          if (nospace) {
            nospace = false;
          } else {
            out.println();
            out.incrementIndent();
            out.printIndent();
          }
          out.print("{");
          print(name);
          break;
        case 3:
          if (nodeIsEmpty) {
            out.print(" }");
          }
          break;
        }
        break;
      case 2:
        switch (next) {
          case 1:
          case 2:
            throw new Error();
          case 3:
            out.print(" }");
            break;
        }
        break;
      case 3:
        switch (next) {
          case 1:
          case 2:
            if (nospace) {
              nospace = false;
            } else {
              out.println();
              out.printIndent();
            }
            out.print("{");
            print(name);
            break;
          case 3:
            if (nospace) {
              nospace = false;
            } else {
              out.println();
              out.decrementIndent();
              out.printIndent();
            }
            out.print(" }");
            break;
        }
        break;
     }
     state = next;
   }
}
That could have been so elegant if the MarkupBuilder class had understood markup itself as a pattern rather than hard-coding the SGML-style tag delimiters and assuming the tagging style (close before content, reopen after content.)

The ability to inject a markup builder for non-SGML markup for an entire site is lost: we still have to look into such things as 404 and 500 errors because we have only covered where we explicitly instantiate a builder.  DI should have solved that web container-wide.

As I never tire of saying, when we get beyond HTML5 and the mere browser, this SGML-bias will look like an unquestioned assumption as curious as any other in the history of data format oddities and over-sights.

To get from   <br/>  to {br} should not be a coding intervention task of this magnitude or this nature.

Wednesday, October 14, 2009

curlgen with Ruby Rails: Mime::Type.register and response.rb

I took some time today to try to see what is happening with default MIME content_type over at lighthouseapp.com

But I am still at sea ...

In the meantime, the Rails code states that we must not use the Response class itself. So what to do if you want to change a default MIME type across a site. For example, the default in the Mailer is 'text/plain'. And in the Response class there is a method

   def assign_default_content_type_and_charset!
      self.content_type ||= Mime::HTML

which is immediately called by

  def prepare!
    assign_default_content_type_and_charset!
    handle_conditional_get!
    set_content_length!

The first thing was to track down the Mime module in action_controller where you can see that your type may be missing (mine was.)

So now I might start the effort to convert to non-HTML web content as site output with

    Mime::Type.register "text/vnd.curl", :curl

The Mime module has a class Type (yes, I know, but so it is) and that has a static
   @@html_types = Set.new [:html, :all]
Note that it is not
  @@markup_types

Of course, it might be easier just to go into the Response class and have it set its default to the Mime::Type class static default.

But should it really be necessary to repair and modify these classes to achieve something so obvious as the default MIME Content-Type for an HTTP web framework?

That's where the hope lies with Rails 3.  But Rails 3 will be a marriage with merb and there will have to be compromises. But we should be able to hope that hard-coding the MIME defaults will be a thing of the past.

Of course for individual controllers you can go piecemeal with

  class MyApplicationController < ActionController::Base



    before_filter :set_content_type
    def set_content_type
     @headers["Content-Type"] = "text/vnd.curl; charset=utf-8"
    end
  end
 
but then you are faced with tracking down just how much of ApplicationController you must override. For example,
 
  def record_not_found
    render :text => "404 Not Found", :status => 404
  end
 
must become something like
 
  def record_not_found
    render :text => myApp.msg_404, :content_type => 'text/vnd.curl' :status => 404
  end

If you are aware of how Rails on ruby 1.8.6 can globally alter the Response content_type, please add a comment.  I don't see the answer over in the Rack module where you will find hard-coded

      @header = Utils::HeaderHash.new({"Content-Type" => "text/html"}.merge(header))

Oops.

Tuesday, October 13, 2009

curlgen using Scala Lift. Not. Or: XML considered harmful

The other day I was looking at a modest web framework's HtmlTag class and saw that it had a parent class: ComponentTag.  Fine; I'll subclass CurlTag from that parent. Not. The parent of ComponentTag was none other than XmlTag.  What made this almost funny is that this framework claims to spare you XML configuration pain.

Imagine if the authors of the first unix shell had required that scripts be written in COBOL.  COBOL was ubiquitous in business systems at that time.  And then just imagine some key, patented component, say, suid, somehow required that a hidden .conf  file parse correctly as COBOL ...

So here I find myself today re-visiting Lift, the web framework stalwartly bearing the Scala standard onto the field of software slaughter.

The author of the Scala 2.7.6 compatible Lift 1.0.1 web framework has admitted that to set a non-XML MIME Content-Type for a Lift app that you must manually re-code Boot.scala in your app.

Imagine.  Here is a framework where convention has triumphed over configuration.  Run a few maven tasks and all is installed and one more maven task and you are up and running.  So long as anything you output as web content has an HTTP response payload starting with

    ?xml version=
and then
   !DOCTYPE html

Even with the content type manually flipped in Boot.scala ( and that is not as obvious as the web posts and sanguine responses might lead you to believe) the XmlParser is invoked.  Oh vey. LiftRules.determineContentType must be called after this and before that ...

Perhaps when Martin Odersky wisely included Traits (from the Swiss Smalltalk team up the road from Laussane in Berne) it became debatable whether IoC containers would require implementaion using Dependency Injection.  But here I am, reaching into the bowels of Scala Lift, just to flip a MIME type and free myself of an enforced XML parse.  All this just to output a page of non-XML, non-HTML, non-XHTML and yet not mere text/plain web content.  When did all internet markup become trapped in angle brackets?

The GOF warned that the Hollywood Principle can make for software which is dificult to understand.  Imagine the starving actor.  Even in Kafka's world the anti-hero could petition to change, if not improve, his lot.  But we who might serve must now sit and wait in the hope that we might be called.  It has been said that IoC prevents spaghetti code at the price of macaroni code.  We were promised a platter with a few of these and a little of those.  All at the openly shared feast freely offered in the marketplace.  But not without risk of something indigestible in the stuffing.

There must be room for some measure of configuration in this mad rush to impress the CIO's with the trivial app that hints at a killer app.  RAILS is not a killer app.  Emulating RAILS is folly.  Software - and with no effort at all. Imagine.  Less effort than learning to unicycle.  But you won't touch that page without a Ruby programmer at your elbow.  Call it "peer-web-dev".  The Rubyist will be peering over your shoulder.

There are supposedly highly-principled reasons to prefer Lift to RAILS (though perhaps not to GRAILS) and, in fairness, perhaps Lift version 1.1.x will break this fond coupling with XML and XHTML.  But if Lift was to be an indication of the advantages of the Scala IT shop over the Java-only shop and C#-only shop then Scala has surely not found its "killer framework" in Lift.

My Kafka-esque nightmare: a revival of Hermes, from IBM, in the Aufhebung above and beyond the split of OS from application process - the messenge has almost arrived! - only we find that PlanK only installs in our wristwatch ant-gravity gadget if Maven was first installed ... POM-da-da-POM.

Monday, October 12, 2009

curlgen using Rebol QuarterMaster

Over at aule-browser.com I have the 3.11 version of Rebol QuarterMaster generating some Curl web content.

Two minor changes were required to tweak the qm.r source for the Content-Type to be "text/vnd.curl" and to share Apache with other web frameworks.  As with Django, you will need the final forward slash on the URL paths such as /qm/ or /macros/.

The QuarterMaster file structure is quite plain by the time you are 2 levels deep and it lies outside my web container. The lower level is the expected ./controllers and ./models and ./views that you would expect with a web-style MVC framework.  Compared to Django on the same host, there was minimal configuration required.

The Curl code that you see at aule-browser.com/qm/ resides in an RSP file within the views/pages folder which reflects this QM install being configured to use a pages controller.  That code resides in ./controllers/pages.r and is simply:
REBOL [   title: "Pages Controller"
  type: 'controller
  default: "index"
]
action "index" does [
    render %welcome.rsp]
If you are not familiar with Rebol, it is (among other uses) the scripting language of the Syllable operating system and is currently in alpha-88 and moving towards a beta for version 3.0 at http://www.rebol.net/

Like ICON and Curl, Rebol is a reflective expression-based object language but without ICON's keywords.
While recently ObjectIcon has brought a ICON dialect up to UNICODE, Rebol will be UNICODE with version 3.0 and will have modular facilities suited to PITL.  Curl, of course, has had both since its inception almost a decade ago.

Rebol3 will see various extensions to parse which is how Rebol scans a string or series datatype.  And like ICON, Rebol has many data types: I count 58 at this point of the Rebol3 alpha.  In Rebol, the values have the data types and an effort has been made to provide useful types for web development, such as tag! and url!

When Rebol3 goes to beta, the author of QuarterMaster can be expected to release a new version.

When all was said and done, less effort was required to get QuarterMaster generating Curl than was required to get the same result from Django at www.aule-browser/macros/ (which is intended eventually to showcase Curl macros).

If you would like to try QuarterMaster on a localhost, I would sugggest either Jetty or the Cheyenne Rebol server. I should note that Syllable Server's documentation states that it includes the "QuarterMaster web application framework, configured to run on Cheyenne." and, at a glance, I would guess that http://www.syllable.org/ is itself running on QuarterMaster.

Monday, September 28, 2009

Nemerle in Visual Studio 2008 Shell

A couple of years ago I was quite impressed with the ease of adding Haskell to one of the Visual Studio IDE's.  Then I learned that the free 2008 Shell could be used for F#.  Today I have learned that Nemerle will pop itself into that shell by just running its MSI.

Only two things went wrong: the Shell defaults to creating projects up in "Documents and Settings" but kept failing when initiating a Windows desktop project.  So I stopped using the default and created a VS_Projects directory over on a dev drive under a Nemerle folder.  That popped up a simpler error where that folder was a bad path, in my case

    'r:\Nemerle\'\VS_Projects

So I hopped into ENV vars and sure enough there it was: the value for Nemerle was set to a quoted

  'r:\Nemerle\'

I stripped-off the quotes and the backslash and away things ran hummingly.

This quirk may only be for an install of Nemerle on XP.

Regardless, I am looking forward to some experiments with .Net libraries and a break from Eclipse.

Monday, September 21, 2009

Python + Tkinter and Python + Gtk

Remembering that Python was intended as a scripting language, compare these two HelloWorld from Python.

First, Tkinter for Tk as in Tcl/Tk

from Tkinter import *
root = Tk()

class HelloWorld:

def __init__(self):
  widget = Button(root, text = 'Hello World', command = self.quit)
  widget.pack()

def quit(self):
  print "Hello World"
  import sys
  sys.exit()

HelloWorld()
root.mainloop()

Now to compare the same minimal HelloWorld with Gtk.  First, install Gtk+  ( and on Windows XP  that means get all of the dependencies - the DLL's - on the path.)

import pygtk
pygtk.require('2.0')
import gtk

class HelloWorld:
def hello(self, widget, data=None):
print "Hello World"

def delete_event(self, widget, event, data=None):
print "delete event occurred"
return False

def destroy(self, widget, data=None):
   gtk.main_quit()

def __init__(self):
   self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   self.window.connect("delete_event", self.delete_event)
   self.window.connect("destroy", self.destroy)
   self.window.set_border_width(10)
   self.button = gtk.Button("Hello World")
   self.button.connect("clicked", self.hello, None)
   self.button.connect_object("clicked", gtk.Widget.destroy, self.window)
   self.window.add(self.button)
   self.button.show()
   self.window.show()

def main(self):
   gtk.main()

if __name__ == "__main__":
    hello = HelloWorld()
    hello.main()

Whatever the merits of Gtk+ as a cross-platform C GUI framework for general purpose languages, something looks to have gone wrong with the Python library PyGtk.

Even with Tk itself, something comparable occurs when using Tk from Haskell versus using Tk from OCaml.  Probably  expect was the Tcl "killer app" but Tk is what most developers know of Tcl today.  Tk was also an early mainstay of Ruby.  Here is the HelloWorld demo using Gtk+ from the Ruby-Gnome team:

# Copyright (c) 2002,2003 Ruby-GNOME2 Project Team
require 'gtk2'

button = Gtk::Button.new("Hello World")
button.signal_connect("clicked") {
    puts "Hello World"
}

window = Gtk::Window.new
window.signal_connect("delete_event") {
    puts "delete event occurred"
#true
   false
}

window.signal_connect("destroy") {
   puts "destroy event occurred"
   Gtk.main_quit
}

window.border_width = 10
window.add(button)
window.show_all

Gtk.main

Now this is a little better, but compared to Ruby + Tk we are at almost double the lines of code.

To see a really elegant use of Tk, see the QTk framework for Oz, the language.  I'm fiddling with a QCurl variant for Oz just now.  I added some notes on OCaml and labltk over at wikia.com

Monday, September 14, 2009

From Oz QTk to QHTML to QCurl

The QTk framework for the Oz programming language provides a mixed declarative and procedural approach to generating a GUI using Tk. Since the appearance of QTk, the QHTML framework appeared first as a research report and then in the SCM for Oz.

In going through the QHTML Oz code it became apparent almost immediately that transitioning QHTML to QCurl would be even less problematic than my current efforts with Smalltalk Seaside for Curl.

A QCurl framework should address one or two challenges that faced QHTML and move closer to a framework involving the fewest number of disjoint languages: in this case, only Oz and Curl. With Oz on the server-side and Curl on the client-side we have a mixed declarative-functional-procedural language on each end, plus the advantage of Curl macros. With the Curl JIT compiler producing native code and consuming declarative Curl as a data format, Oz can expect excellent performance with an alternative to HTML+JavaScript+CSS while also not being restricted to the web browser as the GUI container.

Thursday, September 10, 2009

Converge programming language 1.1 "alpha" binaries available

Laurie Tratt's Converge, an ICON for pythonistas has gone to 1.1 over at convergepl.org

This comes just as Robert Parlett's ObjectIcon has popped up to 1.4 at code.google.com

I am still waiting for news to clarify the status of ICON 9.5 ... which Carl Sturtivant of UMN, for one, has been working on over the past year or more.

I have started a sketch for a Converge docs site-specific browser at converge.aule-browser.com

At the moment it's only note-taking link is to cl1p.net/convergepl

A converge DSL on the server-side would be excellent for scripting a dynamic GUI in Curl code.

Wednesday, September 9, 2009

Tcl browser plugin v3 (from ActiveState)

There are some discrepancies in info about embedding Tcl/Tk since the change to plugin v3.

I tested against up-to-date Chrome, Opera, Safari, IE8, FireFox 3.5 and Amaya

My result is that given some script XYZ.tcl ONLY the following worked across all:

<OBJECT
ID="PluginHostCtrl"
CLASSID="CLSID:14E78123-A693-4F27-B6EE-DDDE18F93D3A"
WIDTH="400"
HEIGHT="220"
>
<PARAM name="type" value="application/x-tcl"/>
<PARAM name="pluginspage" value="http://www.tcl.tk/software/plugin/"/>
<PARAM name="src" value="XYZ.tcl"/>
</OBJECT>

Getting the plugin recognized by each browser was slightly problematic: IE 8 appeared to just ignore the XPI.

Generating Curl 7.0 web content from Seaside 3.0 on Pharo 1.0 beta

Yesterday I used a 3.0 install on the Pharo 1.0 beta to generate non-HTML (in my case that is Curl markup )

I would not say that is any easier that before 2009 Camp Smalltalk ( I started from scratch - it still took me hours to track down everything )

Anyone trying this must remember both gotchas:

WASystemConfiguration clearAllDescriptions.

WARenderer resetDefault.

But since WARenderer is an HTML subclass which always resets the default renderer class to itself, that >>default method had to change.

The main nuisance is that methods >>textHtml or >>textPlain are in many critical places instead of a default rendering type ... and of course many key methods for error and redirect still output raw HTML.

Now to see what headaches appear as Pharo and Seaside evolve - given the wide-spread changes still required to accommodate a default rendering MIME type other than plain text or html.

Curl and GemStone are such a natural match that the game still looks to be worth the candles.

Friday, September 4, 2009

Ruby 1.9.1 on Windows after 1.8.6

I came back to Ruby on Windows the other day after working on a linux box and did not want not be in Cygwin. So I hopped out to ruby-lang.org and pulled in the Windows 1.9.1 binaries. Then I flipped my ruby env variable to point to the new directory so that my path - which uses %ruby%\bin - would update. Then I called gem to install Treetop for PEG and ... Segmentation fault. Oh joy.

I saw that 1.8.6 has a one-click installer for Windows, so I used that, flipped the ruby var and presto all was well.

So why not with the 1.9.1 zip install? Well, ruby for windows XP is not really Ruby for windows so much as it is Ruby for Gnu on Windows. What was missing in the path were Win32 versions of linux DLL's - specifically:
gdbm.dll
libeay32.dll
pdcurses.dll
readline.dll
zlib.dll

The quickest fix was to copy them from the 1.8.6 \bin into the 1.9.1 \bin

So if you start ruby or irb or gem on Windows and hit a Segmentation fault error, this may be the only issue.

You may avoid this issue if you build ruby from source .. but the point of running Ruby on a Windows box outside of Cygwin or Msys is usually to either try something out or get something done - not to do development work. And after all, Ruby is supposed to be at least one notch above its file-based and cmd-line cousin, Gnu Smalltalk, right? Or why else is Ruby seeing so much use on the server-side? Of course if Ruby were to displace that other Smalltalk-descendant, Objective-C, on the iPhone we would be running RIGS for GnuStep anyway ...

Btw, there is Cocotron for that other pseudo-Smalltalk on Windows ...

PS
The DLL's can also be found here.

Wednesday, August 26, 2009

Curl web content generated by Seaside 2.9

Today I tackled getting Seaside 2.9 alpha 4 sufficiently decoupled from HTML/XHTML to generate web content of MIME type 'text/vnd.curl'.

The Seaside alpha was installed in a Squeak 3.10 Smalltak image using a MonticelloCeonfigurations map from the folks at seaside.st

It was really satisfying to see a Curl application open in my browser with Seaside running as my localhost.

Now to get a "headless" version that can run as a server-side process to be maintained remotely ... that will start at seasidehosting.st

Squeak MonticelloConfigurations mcm for Seaside 2.9

If you are like me and have not used an Monticello configuration file such as the mcm file to install Seaside 2.9 in Squeak, what you need to do is download the mcm file and place it in the package-cache directory of the Squeak you are going to run.

I tried using Monticello to create a package and then edit the script but PackageInfo is broken even in the LevelPlayingField (LPF) image that I built by running
HTTPSocket httpFileIn: 'ftp.squeak.org/3.11/scripts/LPF.st'
in a workspace.

Once the file is where a monticello tool can see it, even the Monticello Browser can be used to load it by doing Open on the package-cache which should appear at top of the panel on the right of the browser.

Wednesday, August 12, 2009

Semantic Web group at developers.curl.com

There is now a Semantic Web group at developers.curl.com

The Curl programming language is a web content language with macros which can load code packages dynamically so there are lots of good things for keeping semantic markup orthogonal to presentation markup. Curl has multiple inheritance so we may have a mix-in class for those containers which carry semantic tags. Strings in Curl are treated as Visual objects for purposes of presentation but they are often held in wrappers such as {text some string content} and {paragraph some-variety-of-objects}. All that is required is that curly braces are balanced - note the lack of closing tags.

Now to see if we lean towards RDF or Topic Maps or can get our arms around both ... it's time to triple-down on all bets!

Monday, July 27, 2009

Tagging content with Curl macros (Part 2)

Today I added a page on Curl markup at semanticweb.org

It seems long-overdue that some attention be paid to Curl's natural fit for SemWeb - if only in the enterprise.

Saturday, July 18, 2009

Tagging content with Curl macros

Curl was thought of as a web content language before getting some attention as an RIA platform, but Curl macros are of interest for markup because Curl files are Curl data and macros are expanded based on the package reading that file. So in different contexts, the same markup can be used to obtain different results with no conversion.
Here is an example from an outline of mine on microformats:

{topic "microformats",

{wp "http://en.wikipedia.org/wiki/Microformats", Lang.en},

{home "http://microformats.org/"},

{intro "http://www.digital-web.com/articles/microformats_primer/"},

{blog "http://garrettdimon.com/", BlogType.personal },

{cf "http://microformatique.com/optimus/"}
}

The commas are an option that I chose for the {topic} macro, but the Curl macro format is very open and the punctuation is wholly arbitrary on my part.
Curl also offers a more extensive {define-syntax} option which is even more suited to treating Curl as data than the friendly {define-macro} with its many template or pattern options.
In the elements {wp} and {blog} the final attributes are themselves optional and in some contexts might be ignored altogether. Here they are simply my enums Lang and BlogType.

Wednesday, July 1, 2009

CINCOM Web Velocity available

An epistle from James Robertson, CINCOM's Smalltalk evangelist, informs me that Web Velocity is now available.

James is the author of a great many quality Smalltalk podcasts available on iTunes, so learning Web Velocity should be a pleasure.

Forget Rails. Web Velocity is built on Seaside from Ruby-guy Avi Bryant ( and returns to Ruby as the "Borges" web framework) and allows editing your live server-side code in the web page in your browser. The live page.

The only thing that comes close to this in my experience is the "live code" {example}macro in the Curl Documentation Viewer in the Curl IDE.

Congrats to Alan Knight and his team at CINCOM and to the Squeak folks who helped carry Seaside forward!

Monday, June 29, 2009

A new home for Aule Browser ...

Aule Browser is now residing at www.aule-browser.com

There are still come kinks for Mac and Linux users ...

And I must find time to get Self 4.4 on my linux box from http://selflanguage.org/ ...

Friday, June 26, 2009

The Aule Browser: a simple web browser

Over at our LogiqueWerks pages we have a demo to run or to download of our Aule Browser. No, not "eule" as in OWL, but "aule" as in hall or entry-way ( an name I once suggested for the Io programming language.)

This is a Curl 7.0 browser using the EmbeddedBrowserGraphic class from Curl 6.0

On my Windows with IE8 as my default browser, it loads the Microsoft Trident HTML rendering engine. On linux it may load a Mozilla engine if you have Firefox installed.

It only adds about 1.2 to 1.6 MB to the Curl runtime environment unlike our massive big-brother browsers.

And it will be highly configurable because Curl is also a declarative language like HTML and since version 6.0 has had a stylesheet mechanism.

But Curl also has macros and first-class anonymous functions and traits and multiple-ionheritance and JIT compiles dynamically to machine code and has about a decade as a trusted and secure enterprise environment.

In the Aule Browser, each command button is declared, much as you would in HTML or another declarative language.

Because Curl is able to load packages dynamically, comes with async call built-in and with sub-appelts for background processes, my 5MB of research bookmarks will not choke the browser as they do Maxthon and not make the browser crawl as they do IE8. And that grinding sound on my hardrive while FireFox is loading?

And anything Chrome can do, we can do. So there.

Expect the Aule Browser to evolve as our other LogiqueWerks site-specific browsers evolve: with simple to do templating and configuration for task: research, hobby, eBay, ning, twine ...

To view the demo online or runtime desktop demo, you must first install the Curl Runtime Engine for Windows, Mac or linux. The same Aule Browser curl code will run on all 3 platforms.

Monday, June 22, 2009

ObjectIcon is UNICODE ICON

There are recent updates to code and wiki by Robert Parlett over at the google code ObjectIcon project including UNICODE in ICON.
ucs (standing for Unicode character string) is a new builtin type, whose behaviour closely mirrors that of the conventional Icon string. It operates by providing a wrapper around a conventional [...] Icon string, which must be in utf-8 format

For SVN, you might want to use
svn checkout http://objecticon.googlecode.com/svn/trunk/ objecticon-read-only

The lack of UNICODE in UNICON has been a worry: now there is an ICON + OOP alternative. UNICODE arrived recently in swi-prolog and is now in the alpha of REBOL3.

Languages which parse strings but are not UNICODE by 2010 cannot be of much interest in their intended niche in China, India, Malaysia, Indonesia ...

Saturday, June 20, 2009

Site-specific Browsers in Curl for sensitive content

Over at the Logiquewerks home page there are new links and pages for the topic of SSB's (site-specific browsers) implemented in Curl.

One type of browser that we are exploring is a Rich Internet Client for viewing confidential, "eyes-only", content which we call our "Eyes-Only Web Content Viewer"

At the moment there is a bare-bones demo for an Evernote SSB and a more complete prototype for an "Eyes-Only" browser with a "controller" which prevents copying or screen-snapshots unlike the "privacy" modes now in some browsers. Unlike Mozilla Prism, these Curl SSB's can be declared at the time of request of the content from the server to have whatever widgets are useful for task, such as annotating bids or signalling rejection. One use we are exploring is using the "eye-only browser" for code-reviews of proprietary code in software development - such as code developed off-shore where the ISP does not have in-house expertise to assess the vendor code.

All are intended for enterprise use in Internet Explorer only. The only requirement is the Curl RTE: no JavaScript or other plugins.

Sunday, June 14, 2009

Curl and string-scanning

Over at the Curl Developer Center I added a comment to a post on string-scanning. I keep meaning to post on my efforts with RDF in REBOL and in Curl. But I have a few other TODO's on my GTD paths blocking my way ... now off to the first wedding of one of my own children's school friends ... tempus fugit.

Thursday, June 11, 2009

CommonTag Press Release

The partners in CommonTag have a press release to the effect that their tag format has been standardized on URL-oriented RDFa.

Partners include Zemanta, Zigtag, Yahoo, Freebase and Faviki.

At one partner site I could not find CommonTag as a suggested tag ...

Curl code available

If you install even a trial version of the Curl language IDE you will find a folder full of Curl code which runs under the IDE, namely the Visual Layout Editor code.

An example directory might be Surge\8\ide\vle\editor in your Program Files\curl folder on Windows XP.

Monday, May 25, 2009

Surge, the RIA platform; Curl, the language

As an enterprise RIA vendor, Curl, Inc. might well opens its platform even further than its recent embrace of SQLite, JSON and AMF.

At that point the Curl language would be just one aspect of their RIA offering.

When a Java developer is learning Curl, I often have occasion to make the reminder that a procedure or a method return is an expression, that is, we use {return} or {return result} or {return asset, valuation}. But I also remind developers to select a word and tap the F1 key in order to take advantage of the Curl Documentation Viewer to take advantage of its live code examples.

If you use Help to open a search in the docs viewer for return you may miss what you would have seen with a simple F1 on a return word in your code. The return word is a macro.

The return macro is defined in the package CURL.LANGUAGE.COMPILER

It may well be that the time is coming when ordinary Curl developers will be able to look at that macro implementation code in that package.

With the new Curl 7.0 library access modifier, it should be possible to expose much more of the implementation of the Curl language to interested Curl developers.

In the long-term, the Curl language should move into the public domain. The return could be macro.

Sunday, May 24, 2009

The Squeak Smalltalk FOTB: Sophie embraces Java?

The Sophie project site reports that Sophie 2.0 will be in java in order to be browser based.
Was Strongtalk considered? To think what could have been accomplished if Curl, the language, had been an option! Next I suppose I will hear that Croquet or Cobalt has left Squeak for Scala. It must be a typo. The must have mean Gears and JavaScript V8.

You can get Sophie 1.0.4 here and learn about the Future-of-the-book here.

Over the years I have seen 2 expert systems running in PROLOG rewritten by teams looking to use their FoxBase or their java skills so this should not surprise me. After all, the book will no longer contain text or the text will not be in UNICODE strings so why use a text-focused language with graphics. Or were ICON, UNICON or REBOL deemed more obscure than Squeak? Here's my tip: prototype Sophie 3.0 in Curl using the any type with all preprocessing directives turned at the lowest levels. Then implement it in your most effective language based on your project's developer pool.

Perhaps what they were choosing was not the language but the VM, and in that case the JVM would not be a bad choice if the CINCOM Smalltalk VM was not available for the terms of their license. But by the time 2.0 is released, they could well have made a major contribution to Clean Slate Smalltalk, or Strongtalk, or Self, or Io. And in a project such as this, Scala with traits would look to be a natural given the prospects of major refactoring in the future of the project (traits are to refactoring as were classes to OOP components.) Ok. Not a word about Rebol. Well, maybe one word: a project such as this needs to have the types on the side of the values, not the slots. What has been termed "cash instead of personal checks". Chapter the last.

Using gedit with the Tcl/Tk IDE for SNOBOL4

Over at my Curl blog I've added on note on using gedit as the external editor with a nice simple IDE for SNOBOL, the original pattern-matching language intended for computer users. That blog entry also has a link to an object extension to ICON which permits UNICODE strings.

Thursday, May 21, 2009

Xmarks and Curl on Eee PC with EeeBuntu linux

Rather than wait for the LXDE version of eeeBuntu's "base" ubuntu linux for my Asus 900A netbook, I opted to add Xmarks (formerly Foxmarks) to my FireFox browser and then built a new OS instance on an 8GB SSD HD chip in my netbook's external SSD slot. The install went fine and Curl 7.0 installed without any problem ( I then added the Curl 6.0.5 debian Surge RTE for good measure). Now the sweet part: I added Xmarks into the EeeBuntu FireFox with the passwords option and here I am - a fresh OS and all my bookmarks and passwords in place. Even Twine is up on the toolbar.

There could have been an easier way: an OS that can update itself, which could be Rebol-friendly Syllable.

But now I won't hesitate to go for the LXDE build because what will I lose? A few minutes on Synaptic to reinstall Mozart Oz and ICON 9.4.3 And even then the Oz will be out-of-date from that repository (and the repository has neither Io nor UNICON.) There has to be a better way to move up a linux version using a new SSD flash card and not lose my linux app's ...

Tuesday, May 12, 2009

Must-see iTunes programming video

Andy Bower of Object-Arts has a video that simply must be seen: creating an interface to iTunes.

I've been very impressed by many Smalltalk podcasts, but this tops them all. Of course to misquote Oscar Peterson, the best improvisations are the best prepared; Andy makes this look so easy. But having seen this done once, it's hard to imagine not being able to make a very few notes and then be able to do much the same for any ActiveX COM object of interest with this AX Interface Wizard.

It has been a pleasure to build software in Dolphin Smalltalk, so I was glad to learn that there will be a Next Generation version of the Object Arts Smalltalk for Windows.

There is a non-commercial, public version of Dolphin available, so if Windows is your target OS and you want a high-productivity programming environment, you could not go too far wrong trying Dolphin 6.0

Sunday, May 10, 2009

Curl RIA news

Work on a Curl refactoring project has kept me from having any time to blog, but the May 7 release of Curl 7.0 prompted me to get a bit long-winded over at www.eclectic-pencil.com
I had recently been to a Smalltalk presentation of Seaside where I thought we needed to show serious app's and not the typical "toy" applets (even if they illustrate important technical points.)

Recently I have begun to wonder how much working with developers who reject evolution as a biological fact and perhaps as a cosmological construct has also meant that I have been working with developers who reject evolution in software.

The other day we watched a large river otter crossing our path in a nature refuge: it moved rather like a sea lion. And sure enough, scientists think they have found the link between an otter ancestor and today's marine mammals. Evolution of species is not a theory. Our planet is not 5000 years old. These are the facts, but they are facts not accepted by a great many software developers here in America. I would say that if you want to hear some absurd views, spend some time in a room with a random selection of software developers ( I mean corporate employees, not independent-minded consultants.) The percentage of extremist views to be heard on any team is not representative of American society. Nor the percentage of Americans of color or of female gender. And why so few openly homosexual software developers? In testing and QA, yes. Documentation, yes. But not development. Straight and, in my experience, oddly skewed to the political and religious right. The sad truth is that corporate employment in software development, for all its "professional" trappings, is better understood as a curious form of servitude. Historically, did not the servants become the clerks and then, once again, servants? Servitude is the corporate norm. Deferential servitude and most often in the service of office politicians with little science or technology under their belts. Let alone engineering or business savvy. It is just social evolution. If you work in software development in an American corporation, these appear to be the facts. ( The first effective managing and reporting bureaucrat may have been Samuel Pepys, whose London diary remains a very revealing document. He may have been the first secretary of the British Navy to know the multiplication tables (need I remind that computing owes a great deal to the needs of naval gunnery.) The first corporations were viewed as something on the order of conspiracies to defraud the Crown, if memory serves ... gifts were the norm in doing business with government officials; Pepys borrowed large sums from his boss. I could go on ...)

But what could evolution mean in software development as an engineering practice? In aviation we have seen significant change with Cockpit Resource Management and "fly-by-wire". If you look back at Fred Brooks on teams and software, you may know that surgical teams have also evolved to where we sometimes have two or three teams in procedures that may exceed 24 hours. And we also have sobering data on surgical outcomes and post-op complications. Choose your surgeon well. But also hope that he or she operates with the assistance of a surgical specialist (thoracic, abdominal, orthopedic) and with some of the lessons learned from cockpit voice recorders on how to communicate when things start to go wrong or the unexpected happens. What is the software equivalent of a trauma team bent on stabilizing without repairing? Has software development seen a comparable revolution in securing a desired outcome?

I recently mentioned to a software development manager that one of our finest musical teams, a famous touring string quartet, is composed of individual professional musicians who avoid even staying in the same hotel. But what does the typical corporate software manager mean by "team player"? Surely they can't mean the game of candor and statistics, baseball. What do they mean? Get on board? Never second guess? And is the typical co-located software team really conducive to evolution in the design and implementation of a software product? How much of the time spent in meetings is time spent thinking about the product? And what explains the high turn-over in staff?

Over the past months I have had some contact with a very dynamic team working in an expression-based language other than Curl and I have been very impressed by their openness and their lack of "group-think". And that in a little over a year I believe their application has gone through 3 versions of a UI. And the developers are not co-located or even on the same continents.

Suppose you have a small Curl team. It should be possible to produce quickly 2 or 3 prototypes for any new web software proposal. One of those prototypes may then evolve. By which I mean that we will take the maleable "proto-product" into a few dead-ends before we find a viable implementation with a suitable memory footprint and adequate performance. And maybe in version 1.x we are still parsing XML and we have no business rules and no customizable UI templates. Version 1.x may itself be a dead-end. Better to own up to it before it is your version 2.x or even worse, your version 3.x

Taking evolution seriously may mean that the product is ready only when it is ready and not when someone in marketing said it would be ready. It may mean taking a different view of "failures" and of time over-runs. It may mean taking the long-view and not the quarterly review. And a little more candor.

If it now may make sense to talk about galactic evolution or of evolution on a cosmic scale, might it not be useful to take seriously how a rather simple prototype can evolve into a multi-faceted software suite? And more often not?

Software projects do not set out to fail, but so very many do. Perhaps one way to thrive is to be able to accept failures, but failures in shorter cycles. I think that in the case of web applications, Curl can offer something unusual in this regard. Rather like a multi-paradigm language such as Oz, Curl permits starting in a declarative mode ( and with very few type restrictions ) and then trying to tighten things up by adding restrictive directives while also decoupling classes into components and into layers. And getting it wrong, stepping back, re-assessing, and making another pass. And then seeing unexpected, unanticipated possibilities. And then flourishing as a product within your market niche or corporate division.

Curl only aims to be a secure enterprise platform. But it has worried me that its many practitioners in Japan and Korea have not insisted on obtaining a refactoring browser for the Curl IDE. It seems to me to be an essential tool for working on software that is permitted to evolve ( a great deal of Smalltalk product was not permitted to evolve: group-think dictated Java. I even once watched a PROLOG expert system for underwriters replaced by the work of DBase "Clipper" developers in need of a project. Nothing is too irrational to occur in software engineering/software management. We have Scott Adams. We need a Samuel Clemens.)

It seems time now for the Curl IDE to move into open-source. And even then it may not evolve in viable directions. But it deserves a chance at a refactoring browser and closer integration with a testing framework.

It should be clear that Smalltalk is evolving whether with traits in Squeak or with Seaside in VisualWorks as "Web Velocity" or the other directions taken in Slate and Io. Curl, on the other hand, only has one dialect and aside from emacs, has only its own IDE or an Eclipse plugin. Even if Curl the language does not evolve in the ways in which SNOBOL evolved into ICON and UNICON or in which Tcl evolved into XOTcl, Curl remains an environment in which there is an almost unique capacity to produce software which evolves: from prototype to product or from web applet to the desktop or to a unique browser variant. Most recently we see the addition of SQL on the client side. I am hopeful that we will see soon a "main-memory DB" package for Curl applets on the desktop.

More importantly it needs to emerge from the "unknown" rather as Smalltalk is emerging from the "once known".

PS
If you do not think programming languages evolve, take the time to explore the emergence of PROLOG III and PROLOG IV or the return of SNOBOL-style string processing as an option for ICON or look at what became of Smalltalk as Self and then as JavaScript and now again as Slate or IO, or Ruby or ActionScript. Examples abound.
Some languages not only seem to evolve, they transform as corporate and community assets: the two major Prolog sites almost ceased to even mention the language by name. The corporate marketing proposals to replace the name of Smalltalk or the name of Curl must recur annually if not more often. Smalltalk is a set of dialects saved from extinction by a happy mutation called Seaside. Curl is becoming a platform. Did I say the other post grew long-winded?

PPS over at James Robertson's Smalltalk blog I see his comments on time spent in the debugger and think, Ah-Hah! Time spent in the debugger in exploratory mode could be seen as accepting that software evolves ... what emerges is not always from some documents or designs but from doing the task. Murray Gell-Mann has said something similar about those who believe design certainly came first. It ain't necessarily so. So I may be wrong about the lack of attention in Curl to XUnit and an RB. Develope. Emege. Evolve. In the battle of TLA's that would be DEE versus TDD. ( I was also looking at some Frank Gehry sketches for the Waisman Museum and the ensuing maquettes, blueprint details while standing in that building.)

Friday, May 8, 2009

Rails, Grails and Curl

After looking at the embedded comments used by RIFE it seemed time to revisit Ruby on Rails. While looking at an example in the PragProg 2nd Ed. I was struck that what I was looking at would be easier in Curl.

Curl has both anonymous procedures and macros so stands as a strong functional language in any comparison to JavaScript, JRuby or Groovy. Smalltalk has blocks.

But instead of getting this blog note written, I have been messing about with CLISP and the question of just what macros offer. Well, in Smalltalk they would offer operators with more than 2 characters so we could have <=> instead of just <= or => and such. Or ;-)

But I only wanted to show how a few macros can make a Curl web page so nice and clean and readable compared to the latest thing on rails. A sort of pirouette of Curl. But things got macro out of control ...

And Controllers? Well, in Curl they help with animation or represent devices that have rotations, such as joysticks. Oh - Curl comes with a Quaternion class for rotations in 3D.

So when is a web content language out of control? When its comments are used to control its content? (those aren't comments; those are annotations - this a concordance, not a document ...)

Everything we were taught about separation of presentation from X is wrong when it comes to a rich web GUI. And an object is not a row in a relational database (there, I dared to say it ..)

In the early days of television they did not know what to call those who were watching the action as it happened on those funny tubes in restautants and bars. They became 'viewers' but we talk of 'watching TV'. The View in MVC is a bit like that: we pull back the 'model' a ways and achieve some degree of decoupling from any data store. But a 'personalized and dynamic view' is not the 'view' of early MVC. It likely required something like viewer-specific persistent data. Make that a 'personalized and dynamic view of a collaborative process or activity with published tasks' and the closest thing that I know today is Croquet.