| Andrew Cooke | Contents | Latest | RSS | Twitter | Previous | Next


Welcome to my blog, which was once a mailing list of the same name and is still generated by mail. Please reply via the "comment" links.

Always interested in offers/projects/new ideas. Eclectic experience in fields like: numerical computing; Python web; Java enterprise; functional languages; GPGPU; SQL databases; etc. Based in Santiago, Chile; telecommute worldwide. CV; email.

Personal Projects

Lepl parser for Python.

Colorless Green.

Photography around Santiago.

SVG experiment.

Professional Portfolio

Calibration of seismometers.

Data access via web services.

Cache rewrite.

Extending OpenSSH.

Last 100 entries

Chinese Govt Intercepts External Web To DDOS github; Numbering Permutations; Teenage Engineering - Low Price Synths; GCHQ Can Do Whatever It Wants; Dublinesque; A Cryptographic SAT Solver; Security Challenges; Word Lists for Crosswords; 3D Printing and Speaker Design; Searchable Snowden Archive; XCode Backdoored; Derived Apps Have Malware (CIA); Rowhammer - Hacking Software Via Hardware (DRAM) Bugs; Immutable SQL Database (Kinda); Tor GPS Tracker; That PyCon Dongle Mess...; ASCII Fluid Dynamics; Brandalism; Table of Shifter, Cassette and Derailleur Compatability; Lenovo Demonstrates How Bad HTTPS Is; Telegraph Owned by HSBC; Smaptop - Sunrise (Music); Equation Group (NSA); UK Torture in NI; And - A Natural Extension To Regexps; This Is The Future Of Religion; The Shazam (Music Matching) Algorithm; Tributes To Lesbian Community From AIDS Survivors; Nice Rust Summary; List of Good Fiction Books; Constructing JSON From Postgres (Part 2); Constructing JSON From Postgres (Part 1); Postgres in Docker; Why Poor Places Are More Diverse; Smart Writing on Graceland; Satire in France; Free Speech in France; MTB Cornering - Where Should We Point Our Thrusters?; Secure Secure Shell; Java Generics over Primitives; 2014 (Charlie Brooker); How I am 7; Neural Nets Applied to Go; Programming, Business, Social Contracts; Distributed Systems for Fun and Profit; XML and Scheme; Internet Radio Stations (Curated List); Solid Data About Placebos; Half of Americans Think Climate Change Is a Sign of the Apocalypse; Saturday Surf Sessions With Juvenile Delinquents; Ssh, tty, stdout and stderr; Feathers falling in a vacuum; Santiago 30m Bike Route; Mapa de Ciclovias en Santiago; How Unreliable is UDP?; SE Santiago 20m Bike Route; Cameron's Rap; Configuring libxml with Eclipse; Reducing Combinatorial Complexity With Occam - AI; Sentidos Comunes (Chilean Online Magazine); Hilary Mantel: The Assassination of Margaret Thatcher - August 6th 1983; NSA Interceptng Gmail During Delivery; General IIR Filters; What's happening with Scala?; Interesting (But Largely Illegible) Typeface; Retiring Essentialism; Poorest in UK, Poorest in N Europe; I Want To Be A Redneck!; Reverse Racism; The Lost Art Of Nomography; IBM Data Center (Photo); Interesting Account Of Gamma Hack; The Most Interesting Audiophile In The World; How did the first world war actually end?; Ky - Restaurant Santiago; The Black Dork Lives!; The UN Requires Unaninmous Decisions; LPIR - Steganography in Practice; How I Am 6; Clear Explanation of Verizon / Level 3 / Netflix; Teenage Girls; Formalising NSA Attacks; Switching Brakes (Tektro Hydraulic); Naim NAP 100 (Power Amp); AKG 550 First Impressions; Facebook manipulates emotions (no really); Map Reduce "No Longer Used" At Google; Removing RAID metadata; New Bike (Good Bike Shop, Santiago Chile); Removing APE Tags in Linux; Compiling Python 3.0 With GCC 4.8; Maven is Amazing; Generating Docs from a GitHub Wiki; Modular Shelves; Bash Best Practices; Good Emergency Gasfiter (Santiago, Chile); Readings in Recent Architecture; Roger Casement; Integrated Information Theory (Or Not); Possibly undefined macro AC_ENABLE_SHARED; Update on Charges; Sunburst Visualisation

© 2006-2013 Andrew Cooke (site) / post authors (content).

Those that can't, teach (Java) (or: combinators in Java)

From: "andrew cooke" <andrew@...>

Date: Fri, 22 Dec 2006 19:31:24 -0300 (CLST)

I should add at the start of this that I find Lisp way cool, especially
the macros (although I would prefer a (static) typed system).

However, comments like this -
http://www.lambdassociates.org/studies/study06.htm - really bug me.  They
give me the strong impression that the author has only ever learnt to
program well - or has only seen good programmers working - in one
particular language.  And so they conclude that the language, whatever it
happened to be, is somehow special.  From there it's just a couple of
small steps - some random piece of folk psychology, the always reliable
appeal to the audience's sense of being better than their peers - to a
'cult' article.

In my experience, life's not like that.  I've seen good programmers
working in C.  And I've written bad programs in Lisp.

Here's an example from my work.  It's Java code, which means it should be
sucky sucky stupid boring, but, personally, I think it's pretty neat. 
It's moderately declarative, and makes what was a rather tricky problem
(not "hard", but fiddly) easy.

private ContentFilter getHandler(SqlLoader loader) {

 // these store values; they are read/reset by ProposalHandler
 Text firstName = new Text();
 Text lastName = new Text();
 Text email = new Text();
 Text affiliation = new Text();
 Period period = new Period();

 Test periodTest = new Test() {
  public boolean test(String uri, String lName, String qName, Attributes
atts) {
   return null != qName && qName.equals("parameter") &&
   null != atts && "proprietaryPeriod".equals(atts.getValue("noao:type"));

 // this is reset by ProposalHandler for each new proposal
 First firstInvestigator =
  new First(
    new Parallel(
      new QName(Match.ALL, "first", firstName)
      new QName(Match.ALL, "last", lastName)
      new QName(Match.ALL, "email", email)
      new QName(Match.ALL, "affiliation", affiliation)

 return new QName(Match.ALL, Forward.ALL, "proposal",
   new ProposalHandler(salt, loader, firstInvestigator, period,
     firstName, lastName, email, affiliation,
     new Parallel(
       new QName(Match.ALL, Forward.ALL, "investigator",
       new Element(Match.ALL, Forward.ALL, periodTest, period)

If you know some XML, and some Java, and some Haskell, you may have
guessed that this code is using something rather like a combinator library
for processing XML.

Before I explain the code in more detail, I'll give some background.  We
needed to populate a database from some information in an XML file. 
There's no real constraint on how large the file may be.  It's
hand-rolled, unvalidated XML, with no DTD or Schema, contains way more
data than we need, and is very over-constrained (you can may decisions
locally within the file on what a particular element is).

The XML file is structured so that information for each "proposal" is in a
distinct subtree; I already had a set of classes that loaded data for a
proposal into the SQL database.  The problem, then, becomes one of (a)
selecting values from appropriate XML elements/attributes, and (b) calling
SQL loader for each proposal.

I chose to solve this using SAX - a library that converts an XML file to a
sequence of events - effectively an in-order traversal of the DOM tree,
but handled sequentially so that the whole XML document does not have to
be in memory at once.

This suggested that a library that allows the user to define filters that
select particular sub-trees within the XML document.  These filters could
then be nested to isolate particular paths in the document, without having
to specify the full path - only the relative position with the tree need
be used.  This approach is resilient to changes/errors in the
(unvalidated) document format, and allows test data to be written in a
more compact form.

To take a concrete example, the fragment of code...

  new First(
    new Parallel(
      new QName(Match.ALL, "first", firstName)
      new QName(Match.ALL, "last", lastName)

...selects nodes relative to some parent node such that (i) only the first
(First) child node of the parent is considered and (ii) under that first
child node, at any depth (Match.ALL) an element with the name "first" or
(Parallel) the name "last" would trigger the appropriate action (firstName
is a Text instance and stores the text value of the element).

Clearly this is stateful.  ProposalHandler subclasses the library class
OnEntryExit and has methods that clear state on entry and load values to
the database on exit.  The ProposalHandler instance is embedded in a
filter that tests for the "proposal" element.

This is not the world's greates code, I admit.  But for a project with
busy programmers and tight deadlines, I think it's pretty neat: the
description of how the XML data are accessed is collected in a single
method, with no duplicated literal values, in a form that shows the logic

Of course the code above is strongly influenced by combinator libraries. 
But the implementation is idiomatic Java - classes, not higher order
functions, are used.  The point being: an educated programmer can do the
job well in any language.  Ideas for how to approach a problem can be
separated from the language used for an initial implementation; they can
be implemented elsewhere if you are fluent in the target language.

Which explains my title: my suspicion is that people who write screeds
about how wonderful a certain language is are fluent only in that one
language.  In particular, there seem to be a lot of whiny academics
complaining (LtU) about Java rather than putting in the hours to become
adept at using it.  It's just a tool.


Comment on this post