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

MVC via Beans/Reflection/Spring with Java

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

Date: Sat, 25 Feb 2006 23:04:26 -0300 (CLST)

I've been reworking the form handling in the ol' Secret Project.  Below is
the handler for a page with two states ("simple" and "editing").  In the
"editing" state you can alter various fields.  The form fields are a
values in a bean (the Model), the JSP page contains the necessary to logic
to display the fields appropriately (the View), and below is the
Controller.

Obviously a lot of work is handled by sub-classes.  What's nice is that
it's generic.  Only the logic below is specific to this form:
 - reading / saving to the database
 - restricting editing to the "editing" state

The switching between states is via submit buttons, with names of the form
"action:xxx:path".  The xxx results in a call to setXxx(model) in the
action bean, where "path" is available in the action bean's scope and
identifies the appropriate information in the model.

So, for example, "action:delete:user.name" would call setDelete(model)
which would delete the user's name from the underlying model (via Java
Bean conventions / reflection).

public class IndexController extends BaseController {

  /**
   * Available bean modes
   */
  private static final String SIMPLE = "simple";
  private static final String EDITING = "editing";
  private static final SetEnum modes = new SetEnum().
  register(SIMPLE).
  register(EDITING);

  private InfoDao infoDao;

  public void setInfoDao(InfoDao infoDao) {
    this.infoDao = infoDao;
  }

  public InfoDao getInfoDao() {
    return infoDao;
  }

  @Override
  protected FormDisplayable newFormBean(HttpServletRequest req) {
    Info info = getInfoDao().getInfo(getViewer(), getOwner(req));
    info._setMembers(modes);
    info._setMode(SIMPLE);
    info.getDescription()._setMode(
        info.isMutable() ?
            FieldDisplayMode.EDITABLE
            : FieldDisplayMode.READONLY);
    logger.debug("new form bean: " + info);
    return info;
  }

  @Override
  protected Object newActionBean(HttpServletRequest req) {
    return new ActionBean(req);
  }

  public class ActionBean extends BaseActionBean {

    public ActionBean(HttpServletRequest req) {super(req);}

    @Override
    public void setEdit(FormDisplayable bean)
    throws Exception {
      super.setEdit(bean);
      bean._setMode(EDITING);
    }

    public void setSave(FormDisplayable bean)
    throws Exception {
      check(bean.isMode(EDITING),
          "can only save edited beans");
      getInfoDao().save((Info)bean);
      setInit(bean);
    }

  }

}

Andrew

A More Complex Example

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

Date: Mon, 27 Feb 2006 22:24:03 -0300 (CLST)

Here's a more complex example - a page with three different states, and a
variety of paths with slightly different business logic.

public class ContactsController extends BaseController {

  // define the different states for the page
  private static final String SIMPLE = "simple";
  private static final String EDITING = "editing";
  private static final String ALL = "showing-all";
  private static final SetEnum modes = new SetEnum()
  .register(SIMPLE)
  .register(EDITING)
  .register(ALL);

  // and associate the different bean paths with different buisness
  // rules (by tagging with string)
  private static final String MAX_ONE = "max-one";
  private static final String MIN_ONE = "min-one";
  private static final PathIndex paths = new PathIndex()
  .register("names", Name.class, MAX_ONE)
  .register("emails", Email.class, MIN_ONE)
  .register("addresses", Address.class)
  .register("nicks", Nick.class);

  private static String COUNTRIES = "countries";

  // the standard spring stuff for binding values to complex
  // data; in this case the country is selected from a list so
  // we need to convert from string to database key
  @Override
  protected void initBinder(HttpServletRequest req,
      ServletRequestDataBinder binder) {
    CountryPropertyEditor editor = new CountryPropertyEditor();
    editor.setContactsDao(getContactsDao());
    binder.registerCustomEditor(Country.class, "addresses.country", editor);
  }

  // add the list of countries to the model so we can generate
  // the list to select from
  @Override
  protected Map buildModel(HttpServletRequest req,
      FormDisplayable formBean) {
    addExtra(COUNTRIES, getContactsDao().getCountries());
    return super.buildModel(req, formBean);
  }

  // generate and initialise the model bean
  @Override
  protected FormDisplayable newFormBean(HttpServletRequest req) {
    Contacts contacts = getContactsDao().getContacts(getViewer(),
        getOwner(req));
    initialNameState(contacts.getNames());
    initialState(contacts.getAddresses());
    initialState(contacts.getEmails());
    initialState(contacts.getNicks());
    contacts._setMembers(modes);
    contacts._setMode(SIMPLE);
    return contacts;
  }

  // set view information based on model values
  private void initialNameState(List<Name> names) {
    for (Name name : names) {
      switch (name.getState()) {
      case CLOSED:
        name._setMode(FieldDisplayMode.EXPIRED);
        break;
      case OPEN:
        name._setMode(FieldDisplayMode.REPLACEABLE);
        break;
      case READONLY:
        name._setMode(FieldDisplayMode.READONLY);
        break;
      default:
        // error!
        name._setMode(FieldDisplayMode.READONLY);
      }
      logger.debug(name + ": " + name.getMode());
    }
  }

  private void initialState(List<? extends LifetimeAccessControl> items) {
    for (LifetimeAccessControl item : items) {
      switch (item.getState()) {
      case CLOSED:
        item._setMode(FieldDisplayMode.EXPIRED);
        break;
      case OPEN:
        item._setMode(FieldDisplayMode.DELETEABLE);
        break;
      case READONLY:
        item._setMode(FieldDisplayMode.READONLY);
        break;
      default:
        // error!
        item._setMode(FieldDisplayMode.READONLY);
      }
      logger.debug(item + ": " + item.getMode());
    }
  }

  // the action bean, defined below, is used to modify the model
  @Override
  protected Object newActionBean(HttpServletRequest req) {
    return new ActionBean(req);
  }

  public class ActionBean extends LifetimeActionBean {

    public ActionBean(HttpServletRequest req) {
      super(req);
    }

    // save modified data
    public void setSave(FormDisplayable bean) throws Exception {
      logger.debug("saving");
      Contacts contacts = (Contacts) bean;
      check(contacts.isMode(EDITING), "can only save mutable beans");
      Path parent = Bk.parse(path).dropChild();
      Contacts prev = getContactsDao().getContacts(contacts);
      for (Object child : Bk.getChanged(prev, contacts, parent)) {
        getContactsDao().save(contacts, (LifetimeAccessControl) child);
      }
      setInit(bean);
      return;
    }

    // delete a particular path
    // note how we check whether a path is associated with a
    // particular rule (minimum of one value in the collection)
    @Override
    public void setDelete(FormDisplayable bean) throws Exception {
      Path parent = new PathParser(path).getPath().dropChild();
      int children = Bk.getChildren(bean, parent).size();
      logger.debug("deleting at " + path + " (" + children + " children)");
      if (children < 2)
        paths.checkNot(parent.toString(), MIN_ONE);
      check(((ViewedResource) bean).isMutable(),
          "can only delete items from a mutable bean");
      check(bean.isMode(SIMPLE), "can only delete in simple mode");
      super.setDelete(bean);
      bean._setMode(EDITING);
    }

    // replace an exising value with a new one
    @Override
    public void setReplace(FormDisplayable bean) throws Exception {
      logger.debug("replacing at " + path);
      check(bean.isMode(SIMPLE), "can only replace in simple mode");
      super.setReplace(bean);
      bean._setMode(EDITING);
    }

    public void setAll(FormDisplayable bean) {
      logger.debug("showing all");
      check(bean.isMode(SIMPLE), "can only show all in simple mode");
      bean._setMode(ALL);
      return;
    }

    // add a new value.  again, check for path/rule
    @SuppressWarnings("unchecked")
    public void setAdd(FormDisplayable bean) throws Exception {
      int children =
        Bk.getChildren(bean, new PathParser(path).getPath()).size();
      logger.debug("adding at " + path + " (" + children + " children)");
      if (children > 0)
        paths.checkNot(path, MAX_ONE);
      check(((ViewedResource) bean).isMutable(),
          "can only add items to mutable bean");
      check(bean.isMode(SIMPLE), "can only add in simple mode");
      FieldDisplayable item = (FieldDisplayable) Bk.newInstance(paths
          .getClass(path));
      ((List) Bk.getProperty(bean, path)).add(item);
      bean._setMode(EDITING);
      return;
    }

  }

}

Modes as Enums

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

Date: Wed, 1 Mar 2006 09:48:53 -0300 (CLST)

Looking at the code above, the use of Strings as mode names is ugly -
they're an obvious candidate for enums.  However, the relevant methods are
added to data transport classes with AspectJ Mixins, which don't support
generics.  So it wasn't clear how to do this in a type-safe way.

Anyway, yesterday I found the EnumSet class, which lets me write simple
dynamic code that is pretty type-safe.  Here's the mixin:

public aspect FormDisplayableMixin {

  declare parents : ViewedResource
  implements FormDisplayable;

  private FormDisplayMode FormDisplayable.mode =
    new FormDisplayMode();

  public void FormDisplayable._setMode(Enum mode) {
    this.mode._setMode(mode);
  }

  public void FormDisplayable._setMembers(Class mode) {
    this.mode._setMembers(mode);
  }

  public boolean FormDisplayable.isMode(Enum mode) {
    return this.mode.isMode(mode);
  }

  public int FormDisplayable.modeHashCode() {
    return this.mode.hashCode();
  }

  public String FormDisplayable.getMode() {
    return this.mode.toString();
  }

}

And here's the underlying utility class that manages the mode:

public class FormDisplayMode {

  private EnumSet members;
  private Enum mode;

  @SuppressWarnings("unchecked")
  public void _setMembers(Class mode) {
    this.members = EnumSet.allOf(mode);
    mode = null;
  }

  public void _setMode(Enum mode) {
    check(mode);
    this.mode = mode;
  }

  public void check(Enum mode) {
    if (! members.contains(mode))
      throw new IllegalArgumentException("bad mode");
  }

  public boolean isMode(Enum mode) {
    check(mode);
    return mode.equals(this.mode);
  }

  public String toString() {
    return mode.toString();
  }

  public int hashCode() {
    return Tk.hashCode(mode);
  }

}

See how the "check" method checks that the type is correct?  In
retrospect, I could also have saved the class directly and done an
"instanceof", but I prefer this approach because I can add an extra
setMembers method that takes a set explicitly and which allows a model to
be used with only a subset of states (which is going to be useful for
models shared across several views, I think).

Rules as Enums

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

Date: Wed, 1 Mar 2006 10:34:29 -0300 (CLST)

And here's the same thing for the rules.  In this case I can use generics,
and it all works out quite nicely:

/**
 * Utility class that associates paths to bean members with classes and
 * rule sets.  The two uses (classes and rule sets) are unconnected and
 * should perhaps be separated.
 */
public class PathIndex<E extends Enum<E>> {

  private Log logger = LogFactory.getLog(getClass());

  private Map<String, Class> classes = new HashMap<String, Class>();
  private Map<Enum<E>, Set<String>> rules =
    new HashMap<Enum<E>, Set<String>>();

  public PathIndex<E>     register(String path, Class clazz) {
    // cannot work out how to use EnumSet.noneOf with generics
    // EnumSet.noneOf(E) fails to compile
    return register(path, clazz, EnumSet.copyOf(new HashSet<E>()));
  }

  public PathIndex<E>     register(String path, Class clazz, E rule) {
    return register(path, clazz, EnumSet.of(rule));
  }

  public PathIndex<E> register(String path, Class clazz, EnumSet<E> all) {
    if (classes.containsKey(path))
      throw new
      IllegalArgumentException("duplicate path: " + path);
    classes.put(path, clazz);
    for (Enum<E> rule: all) {
      if (! rules.containsKey(rule))
        rules.put(rule, new HashSet<String>());
      rules.get(rule).add(path);
      logger.debug("registered path " + path + " as " + rule);
    }
    return this;
  }

  public String check(String path) {
    if (! classes.containsKey(path))
      throw new AccessControlException("bad path: " + path);
    return path;
  }

  public String check(String path, Enum<E> rule) {
    check(path);
    if (! rules.get(rule).contains(path))
      throw new AccessControlException("bad rule: " + rule);
    return path;
  }

  public String checkNot(String path, Enum<E> rule) {
    check(path);
    if (rules.get(rule).contains(path))
      throw new AccessControlException("bad rule: " + rule);
    return path;
  }

  public Class getClass(String path) {
    return classes.get(path);
  }

}

Empty EnumSet

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

Date: Wed, 1 Mar 2006 10:41:26 -0300 (CLST)

The code above (generating EnumSet<E> from an empty collection) gives a
runtime error.  I guess it's because of type erasure, but then how does
noneOf work?

I've replaced it with null and an test in the main register method.

Anyway, here's the cleaned-up controller:

public class ContactsController extends BaseController {

  private static enum Mode {SIMPLE, EDITING, SHOWING_ALL};

  private static enum Rule {MAX_ONE, MIN_ONE};
  private static final PathIndex<Rule> paths = new PathIndex<Rule>()
  .register("names", Name.class, Rule.MAX_ONE)
  .register("emails", Email.class, Rule.MIN_ONE)
  .register("addresses", Address.class)
  .register("nicks", Nick.class);

  private static String COUNTRIES = "countries";

  @Override
  protected void initBinder(HttpServletRequest req,
      ServletRequestDataBinder binder) {
    CountryPropertyEditor editor = new CountryPropertyEditor();
    editor.setContactsDao(getContactsDao());
    binder.registerCustomEditor(Country.class, "addresses.country", editor);
  }

  @Override
  protected Map buildModel(HttpServletRequest req, FormDisplayable
formBean) {
    addExtra(COUNTRIES, getContactsDao().getCountries());
    return super.buildModel(req, formBean);
  }

  @Override
  protected FormDisplayable newFormBean(HttpServletRequest req) {
    Contacts contacts = getContactsDao().getContacts(getViewer(),
        getOwner(req));
    initialState(contacts.getNames());
    initialState(contacts.getAddresses());
    initialState(contacts.getEmails());
    initialState(contacts.getNicks());
    contacts._setMembers(Mode.class);
    contacts._setMode(Mode.SIMPLE);
    return contacts;
  }

  private void initialState(List<? extends LifetimeAccessControl> items) {
    for (LifetimeAccessControl item : items) {
      switch (item.getState()) {
      case CLOSED:
        item._setMode(FieldDisplayMode.EXPIRED);
        break;
      case OPEN:
        item._setMode(FieldDisplayMode.DELETEABLE);
        break;
      case READONLY:
        item._setMode(FieldDisplayMode.READONLY);
        break;
      default:
        // error!
        item._setMode(FieldDisplayMode.READONLY);
      }
      logger.debug(item + ": " + item.getMode());
    }
  }

  @Override
  protected Object newActionBean(HttpServletRequest req) {
    return new ActionBean(req);
  }

  public class ActionBean extends LifetimeActionBean {

    public ActionBean(HttpServletRequest req) {
      super(req);
    }

    public void setSave(FormDisplayable bean) throws Exception {
      logger.debug("saving");
      Contacts contacts = (Contacts) bean;
      check(contacts.isMode(Mode.EDITING), "can only save mutable beans");
      Path parent = Bk.parse(path).dropChild();
      Contacts prev = getContactsDao().getContacts(contacts);
      for (Object child : Bk.getChanged(prev, contacts, parent)) {
        getContactsDao().save(contacts, (LifetimeAccessControl) child);
      }
      setInit(bean);
      return;
    }

    @Override
    public void setDelete(FormDisplayable bean) throws Exception {
      Path parent = new PathParser(path).getPath().dropChild();
      int children = Bk.getChildren(bean, parent).size();
      logger.debug("deleting at " + path + " (" + children + " children)");
      if (children < 2) paths.checkNot(parent.toString(), Rule.MIN_ONE);
      check(bean.isMode(Mode.SIMPLE), "can only delete in simple mode");
      super.setDelete(bean);
      bean._setMode(Mode.EDITING);
    }

    @Override
    public void setReplace(FormDisplayable bean) throws Exception {
      Path parent = new PathParser(path).getPath().dropChild();
      int children = Bk.getChildren(bean, parent).size();
      logger.debug("replacing at " + path + " (" + children + " children)");
      if (children > 1) paths.checkNot(parent.toString(), Rule.MAX_ONE);
      check(bean.isMode(Mode.SIMPLE), "can only replace in simple mode");
      super.setReplace(bean);
      bean._setMode(Mode.EDITING);
    }

    public void setAll(FormDisplayable bean) {
      logger.debug("showing all");
      check(bean.isMode(Mode.SIMPLE), "can only show all in simple mode");
      bean._setMode(Mode.SHOWING_ALL);
      return;
    }

    @SuppressWarnings("unchecked")
    public void setAdd(FormDisplayable bean) throws Exception {
      int children =
        Bk.getChildren(bean, new PathParser(path).getPath()).size();
      logger.debug("adding at " + path + " (" + children + " children)");
      if (children > 0) paths.checkNot(path, Rule.MAX_ONE);
      check(((ViewedResource) bean).isMutable(),
          "can only add items to mutable bean");
      check(bean.isMode(Mode.SIMPLE), "can only add in simple mode");
      FieldDisplayable item = (FieldDisplayable) Bk.newInstance(paths
          .getClass(path));
      ((List)Bk.getProperty(bean, path)).add(item);
      bean._setMode(Mode.EDITING);
      return;
    }

  }

}

Comment on this post

C[omp]ute

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.

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

Last 1000 entries: Info on Anon P2P etc; Hardware Transactional Memory coming to Intel; Rome - 3 Dreams of Black; New Technologies; Reinstalling OSX via Linux; Shoddy Macs; Similar Profiler for C; Profiling Go Programs; Access to Bloomberg Data Feed; Automated JVM Leak Detection; Fashion (Men's); Left Drifts Centre; Right Becomes Vicious; Comparison of TeX Processors; Jolly Good Idea Chaps, Wot?; I Can Vote!; DHT, PEX and Magnet Files; ConTeXt - A Latex Replacement; for comparison; Reducing Energy Use; Scavenging 2.5" Disks; Running Caldera's Hadoop Demo in VirtualBox; Telecomix (Net Activism); Face Detection Algorithm; NFB 3.1 - Broken and Fixed; Category Theory for Java Programmers; piUML - A Language for UML; Distributed Hash Tables; Updating Mediawiki Database; The Coming War on General Computation; Hobby Shop in Apumanque; Overpaid Mediocrities Running Banks; Ghostbranders; Seeing red; evolution of color vision; Evolution of Colour; Accomodation in SF; An Idea a Day; In AGU's Defense (OpenSuse Kernel Bug); AGU 2011; Chile tops OECD Inequality; Glances - Curses System Monitor; Python libraries error on OpenSuse 12; Parrondo's Paradox; Notes on Installing OpenSuse; Quantum Mechanics - Explanation of PBR Result; And Politics?; Ideas for Projects; Return to Olivie; OpenSuse 12.1 Out; re: Command Line Sequencer; subjective maps; Brain's Division of Labour in Routefinding; StarTechConf; Audio-GD NFB 3.1 DAC; Deciphering DHL Status Reports; Imports to Chile with DHL (Hidden Charges + Tax); MVCC, Snapshot Isolation, Write Skew; Vote Against Alcala del Rio; Chilean Wine; The Most Awesome Music Video Ever; Re: too fast already; Second Guessing; too fast already; LMAX Architecture; Over 760 RSA Attack Victims; El Ancla - Seafood Restaurant in Santiago; Command Line Sequencer; Random Albums; Eurotel, Guardia Vieja; Nogales for the Win!; Guava - Useful Java Utilities; Average Angle; My Brain Makes Things Taste Funny; From the Haskell Perspective; Hotel Orly; Guria - Spanish Restaurant in Santiago; Mid-Price Hotels in Providencia; Richter Continues to be Awesome; C Sequence Points; Yeah I am getting to this feeling too; Swarm of Micro-Satellites (few dollars each); How to Lead Clever People; Software Foundations; Chilean Aircraft Crash from Lack of Fuel?; Quantum Graph Isomorphism; Radix Sorting; Efficient Entropy Estimates for Sequences of Large Values with OpenCL; Overtone: Clojure Music Synthesis (Synth, Sequencer, Higher Logic); Pisco tasting; Computer virus hits US Predator and Reaper drone fleet; Cow Clicking; Re: Banco popular; Banco popular; Access to Banco de Chile from Argentina; Trickier Alignment; Bytes in struct; Struct and packing; Using Array; Copying Bytes; Some simple pyopencl examples; Complexity, statistics; The First Law of Complexodynamics; Installing numpy and scipy in Python3.2 virtualenv; Is HN Being Overrun by Downvoting, Groupthinking Lemmings?; GUI Architectures (Fowler) - MVC etc.; Good Explanation of TLS 1.0 (CBC) Attack; Today in the USA...; Shorter variant, using Bash redirections...; Possibly Useful List of Books to Read; The Other September 11; Modern GPU - Articles on GPU Programming; Long Lambda Post on Multiple Topics; The Three Christs; 3QD Philosophy Prize Semi-Finalists; Qubes - Security by Isolation in VMs (Xen); DSLs in Python; Tottenham Riots; Baz Ratner - Howitzer Image; Getting Started with Pypy on OpenSuse; Gnuplot Tricks; Clojure Wrapper; More on (vector-of :double); Optimising Clojure; Using Constraint Programming to Identify Groups; lp_solve; Non-Comemrcial; Mixed Integer Programming in Python; Vegetative Patients Wakened by Sleeping Pill; Data-Driven Documents (D3) - svg library; Gravity is not Statistical; Free Computer Science Book Downloads (Drafts); Why Clojure doesn't need invokedynamic; The RSA Email; You Dumb Liberal Fuck; Lambdas (SAMbdas - Single Abstract Methods) in Java; Saving Stack Space with Generators; Compressed Sensing, Matching Pursuit, Radio Astronomy; Re: Have you tried Babel-17?; Example Clojure Code; Use vectors where they make sense; Have you tried Babel-17?; More from HN and Adrian Sinclair; Re: Why I tried clojure and then stopped; Why I tried clojure and then stopped; Initial Thoughts on Clojure; Correlated Random Variables; Re: Regarding Firefox Using Company Proxy Settings; Regarding Firefox Using Company Proxy Settings; The Site in Question; Small Correction and Script; Automating Access to AppEngine with Federated Logins; ASCII...; Unix tree Command; O(n) and O(n^2) in a Dynamic Programming Problem; Resuming scp With rsync Across an Unreliable Link; Improved Sharded Counter for Google AppEngine; FFT in scipy etc; Deadman timer for Google AppEngine; Lessons Learned from AppEngine's Data Store; Fixing KDE on OpenSuse; A Better, Fluid, CSS Grid; Tumbleweed Back Working Now; Madera y Carbon - Colombian Restaurant in Santiago; Broken OpenSuse Tumbleweed; Re: Avoiding For Loops; Avoiding For Loops; Uniformly Random, Correlated Numbers in Matlab/Octave; Designing no-SQL Schema; Using libxml (libxml2) with Namespaces; Salaam Bombay - Indian Restaurant in Santiago; Bit Depth?; Optimising PNG Generation in Python; libxml2: Creating XML and Validating with Schema; Bananina Split; No Go; SSA v CSP (Structuring Intermediate Languages); Playing with Go's Interfaces (images); Testing Go in Intellij Idea; Re: Goroutines; IntelliJ Doesn't Automate Licence Processing; Re: Go Rocks - How Can We Avoid Something This Bad In The Future?; Some Links, Clarifications and Corrections; Re: Micro Languages; Go Rocks - How Can We Avoid Something This Bad In The Future?; The Bug Count Also Rises; Article on Greece, Euro, etc; Quanterra Q330 Calibration - Control Conventions; Testing Python in PyCharm; Violet (Interactive Fiction); Yet More...; More on Lepl + RXPY; What is TCP hole punching?; Stability Issues; Listing Colours For Dark Backgrounds; ARM + AMD Sitting Up A Tree; Coding Guidelines for C; Linux USB Wifi With TP-Link TL-WN722N; Politics Behind Fukushima Mess; Block Network for a OpenSuse User; Or Below...; Secure ID Hack Confirmed; And Beyond...; Rain; PortalDisc.cl and Odisea Odiseo; Too Complicated!; ASCII Display of Trees; Designing Incentives for Crowdsourcing Workers; Next Step for RXPY/Lepl integration; RSA Attackers Got (and Used) SecureID Data; Intercepting Skype using Phonemes (without Decryption); enum from 1; Configuring PyCharm to use Per-Project Config Files; X11 Bitmapped Fonts in Java JDK 7?; SSH Connection using libexpect in C; Fred Goodwin (Mr Zam) now Suing own Family; How To Write Papers with Restructured Text; Pytyp - Extending Python Types for Declarative Code; Le Bistrot - a Santiago Restaurant; And Away...; Variable Names; More Readable "Types in Python"; Excellent Article on Human Aftermath in Japan; Dynamic Dispatch in Python; First Guess; The Justice of Assassination; Re: Pro Django Review; Pro Django Review; Pro-Django Review; Computer Model of Schizophrenia; Rai and Olivie - two Santiago Restaurants; Maybe not Multimethods; Updated Python Types Draft; I ROCK!; Multimethods for Python; Elderly Couple's Suicide Agreement; Algebraic ABCs - A DSL for Types in Python; Guantanamo Visualisation; Information Physics: The New Frontier; Leaked Guantanamo Files - Often Little Justifcation; DWIM cd; And Up...; Terrifying Detail Available from (Future) Phone Tracking; Giving Callbacks Control over Exceptions; (Dumb) Algoritmic Pricing of (3rd Party) Amazon Books; Reverse (Remote) SSH Tunnel With Free Amazon EC2; Levels of Infinity; Elif Batuman: Life after a bestseller; Call for the Release of Ai WeiWei; Video on Chernobyl Arch; New Approach to Python Typing; Brillian Generative Music Automaton; Japanese Govt Lied About Radiation Levels Because...; Example Python Code; em-dash and en-dash in Emacs; Systematic Harassment of Software Engineer; Speculative Contacts (Stable Collision Physics); A Little More Detail; Insomniac Typed Programming in Python; Garrison Keillor savages Berrnard-Henri Levy; Perlin and Simplex Noise; Stronger Types for Python; Fixing Strange Import Behaviour in Python; Details on the RSA Attack; Active Flattening; Better Config Support for Python (and More!); Pioneer Anomaly Sovled!; Flattening Graphs; More Info on Last.fm Tags; Using Last.fm tags to play my mp3s on SqueezeCenter; Being There by Andy Clark (Free Philosophy of Mind Book); Calling SqueezeCenter CLI from Python 3; Why doesn't Python have better config support?; SQL and noSQL are Duals of Each Other; Good Article on Explosions; Earthquake Magnitudes and Physical Damage; Good Article on Reactor Risk; Hydrogen Source; Re: your excellent blog; Some Points Related to the Fukushima No. 1 Reactor; Installing MusicBrainz Database; Improving Squeezebox (Duet) Sound with V-Dac; Green Mathematics; Final Code; Fix 2 - No need for explicit clip; Fix 1 - No need for NO_STATE; Evidence :o); Processing Large Volumes of Data in Lepl; Radio/mp3 on Freedom, Privcay etc; Hyperpublic's Challenge; HTSQL - Compact SQL as Rest; Scala still sucks?; Free Mix Tapes; Musica Chilena (y Sudamericana); GoogleSharing; More Renderscript Info; Non-Google Search + Updated Site; GoogleSharing - Anon search while logged-in to Google; Curious US Military Cargo in Argentina; Android Renderscript (CPU/GPU code); Compiling (translating) PyPy 1.4.1 on OpenSuse; Final Code; To check fonts on KDE; Clean bitmapped fonts on OpenSuse 11.3; Further Update to Link; What is TCP hole punching?; Email above was dropped!; EMail and URL Validation in Python; LCD Test Images; Spindromes; Oooops; Analytical Marxism; Against Capitalism; This will not change in Egypt now; Back!; Tesla C1060 with OpenSuse 11.3; Watching Wal-Mart at Midnight; Also, From The Book; New in Functional Data Structures; Testing Django with Selenium; Protovis - Javascript SVG Library; Django OpenID: Invalid openid.mode: u'i'; Good Intro to LVM; A Chilean Day; A Python Logging Service; Serving YUI 3 files locally (and incrementally); Firefox uses Proxy with Selenium; Fressia too; Windows etc; Selenium Tests of Multiple Browser and OS Combinations; Resizing Cryptmount File System; Selenium Web Testing; Auto-Scaling Date Axes in Python; Setting File Permissions in Subversion; Easy Slide-in Menus using YUI 3; More Benchmarks; Generating SVG in Python 2.4; Future Work; RXPY Benchmarks; RXPY Update - Beam Engine; Forensics Using Frequency Variation of Mains Supply; UK Torture; More on CAP; Cloud Computing; GPU in the Cloud; How To Choose NoSQL; Empty Loops in Regular Expressions; Theano Experience; Compiling Python Numerics to GPU wuth Theano; Anybots - Physical Presence for Telecommuting; Fame! (Bonneville Power); Efficient List Slices in Python; Useful Jazz Lists; Is Deepwater Failing?; Fuck Yeah; Closures and Anon Functions in Java 7; Supercomputing Superpowers; Debugging A Hung (Spinning) Python Process; Interpreter for Python Regexps; The Nature and Future of Philosophy; Plus Memoisation; LEPL Optimisation with URL Validation; Erik Moeller - Defamation; Free Map-Reduce Book; Blocking MAC addresses with OpenSuse Firewall; Random Matrix Theory; Small Town Romance; Gravity from Information; Forcing Visual Processing into Boolean Logic; SXSW Economics; Museo Allende; SSL MIM Paper; Avoiding SSL Man In The Middle Attacks; OpenCL Examples; Re: A Practical Introduction to OpenCL; Battery Life; Visiting Rancagua; Visiting Santiago; Fully Homomorphic Encryption; Essays Questioning Market-Based Solutions; Not Monads!; A Practical Introduction to OpenCL; Triple Canopy (Magazine); RequestPolicy URL; RequestPolicy; Undead Links; Un-greyed Text; Hiding HN Karma; C Object System; Spam Filtering Details; Efficient Spam Filtering With Mutt and SpamAssassin; Lepl 4 Preview - Simpler, Faster, Easier; Prolog, LEPL, Phone Numbers; Mutt Working Well; Leaving GMail...; Quora Challenge; Good Haskell Example; Do not go gentle into that good night; OProfile - An Alternative for Profiling Java (and C); The Movies of Clint Eastwood; Automate my Ire; Proud to be (Almost) Chilean; Pan Fresco en Providencia, Santiago, Chile; Earthquake in Chile; Why More Equal Societies Almost Always Do Better; More Names + Books (Economics); Stommel Diagrams - Time v Space log log plots; Fermi Dying?; Windows Don't Minimize in KDE 4.3, OpenSuse 11.2; Compressed Sensing; The Complexity Era in Economics; Extra Notes on Repeating Install; Fossil - DVCS + Wiki + Bug tracking; Kingston SD Cards, Economics, Hardware Hacking; Here we go...; HLVM - High Level VM on LLVM via OCaml; Information Retrieval, Transmission + Quantum Computing; Corralillo Winemaker's Blend; Matetic Vineyards; South Butt's Reply; Metacompilers; Critterding, Polyworld (Evolutionary AI Sims); Visiting Bariloche (Balcones al Nahuel); UYKFD Description; Formal AI (Solve all Problems); Updated instructions; tomcat default servlet patten matching -- thank you!; Google Social Search; Books On Suburbia; Generating Syntax Errors from Examples; Thought Crime - The Heretical Two; Video of Pro-Pinera/Pinochet Protesters; Pinera, Chile, Economist; NNMF - An Alternative to SVD; Unladen Swallow Is Dead Duck?; Norvig on Non-Parametric Analysis (+ Other AI Videos); Retrospective on the Guantanamo "Suicides"; Developing OpenCL Code with an Intel x86 CPU; Redmine Project Management; Enable PCIE Too; Logitech MX Anywhere Mouse with Linux (Review); Relationship between EM and MP?; M3U to PLA (PLP?) Playlist Format Conversion; iRiver E30 MP3 Player (A Review); Models of Human Sociality; More Notes on GPGPU Programming; Traditional Telephony is Dead; Persisting Knowledge Across A Changing Workforce; And He's In This Too (Cynical - So Correct? - State Of World); Excellent Doctorow Column; Confirmed?; Detailed x86 Profiling; Unladen Swallow to Merge with Python 3?; Further Optimisation with OpenCL; Blocks Villa San Luis; How To Be Happy; Matlab/OpenCL Cross Reference; Calling OpenCL Directly; Pinera's Campaign Graphics Have Improved; Perceptual and Fuzzy Hashing; Encyclopedia of Symbols; Create You Own Programming Language; Can It Get Any Worse?; Logically Laid-Out Musical Keyboard; Chilean Presidential Elections; Lessons Learned (Not Mine!) with Crowdsourcing at the Guardian; Couple More Network Links; The Future of Telephony; Codenode - Python Take on Mathematica Notebook; More On OpenCL and Matlab Here; Experience Optimising Matlab Code with OpenCL (NVidia GPGPU); Or Simply Don't Use The Libs; Workflows; VisTrails; Good Local Santiago Tours; More Details on Java Extensions; Tribute to Jim Gray - Free Book on Data Processing Future; Voynich Manuscript Decoded?; Mogile FS; Correct Exponents; Trafigura Now Attacking BBC; Detailed Example of Climate Change Sceptic Debunking; Lemonade Recipe; XTRMNTR; Regular Expression Matching: the Virtual Machine Approach; BSGP: Bulk-Synchronous GPU Programming; Cassandra; Analytics - Jobs for the Future; NoSQL Papers; Extern C; Calling OpenCL from Octave / Matlab; Notes on Array Layout; My Day With The Mental Health Professionals; How To Write Good Cron Jobs; Dark Matter Found?!; Reflections on Playlist Generation (UYKFD); Lazy Parsing; Bad Memory; Intel Drops Larrabee; Python Code to Compile Regexps; Heart Monitor Watch + Hackable Hardware; Live Map of Shipping; Synergy Updated; Good Ideas for Dates; Radioactive Boy Scout; UK's "Terrorism" Laws Used Against Innocent Schizophrenic; Generating Uniform, Correlated Random Numbers; Etherial Electronic Art; Fool Me Once; Squeezebox Duet Not Connecting to Server; WTF - Closures in Java 7 After All?; American Airlines fires AA.com designer for reaching out to customer; Visualizing Empires Decline; Electronic Fratricide; Another Go v Python Comparison; Wrong Attribution; Google's Go Slower than Stackless; Significant Objects; Offensive US "Cyber" Operations; Scala Style Guide; NVidia's own Demos; Simpler, but "Micro"; MITM Attack Against SSL; SimHashing - Detecting Similar objects with Hashes; Wire Music Lists; (Not So) Random Walks on Graphs; What We Actually Know About Software Development; The UK did it first!; UYKFD Progress - Playlist Generation from LastFM Tags; Diagrams Through Ascii Art - Coolest Software this Millennium?; Scala for Generic Programers; Carl Jung's Red Book; Interesting Comment (+ Pointers) on Architecture; Frei Campaign Posters; Free Will, Determinism, Compatibilism; Exotic Chocolates in Santiago, Chile; Matlab on NVidia GPUs; Installing OpenCL on OpenSuse 11.1; Where Would a Do-Gooder Do the Most Good?; TXR - Pattern Matching / Template Language; The Sirens of Titan by Kurt Vonnegut, Jr; Follow-up in Guardian; Larrabee Dirt + Background; Guardian Censored over Trafigura Questions; Good Background on OpenCL etc from Anandtech; Using Java Collections in Scala 2.8 (and 2.7); Software Quality Mythology; NVidia Just Released OpenCL Support; And If You Still Don't Get It; Outer Join and Sub-Select Example for Empire DB and Scala; Calling REST Web Services from Java (the Java WS Ecosystem); Auto-Delegation in Scala using Implicit Conversion; Using Scala with Empire DB; Why Does Democracy Need Education?; Setuptools for Python 3 (is called Distribute); Switched to Emacs; TxtSushi - SQL for ASCII Files; Something That Shows How Google Wave Might Be Cool; BitBucket Outage Details - Cloud v DDOS; Congratulations Mule - Europe-Wide Win!; Single Line; Lagged Cafe - Kashiwa Mystery Cafe; DSLs (implemented with Haskell) Help Build Microsoft's new Multicore OS; Implement Phonetic Name Searches with Double Metaphone etc; BOUML - A UML Tool with Reverse Engineering; Fixing IntelliJ Idea 9 EAP on 64 bit Linux (Could not find agent library); Empire DB Example with Scala; Free Scala Book (Programming Scala); Attack on MD5 Based Authentication for Popular Sites; Text of AP "Writethru" on Polanski; Revised Instructions for Adding Dependencies; Interview; More on Scala; Scala in More Detail; Trying Again (New Instructions); Scala Bug Report; Starting a Scala Project; Testing Pollsters - 538 v Strategic Vision; Measuring Complexity; Books to Read (Best of Decade, Millennium); GRRF - The Last Lecture; Java / Scala Bindings to OpenCL; John Abercrombie Organ Trio, Santiago, 24 September 2009; As Rigid as Possible Shape Interpolation; The Poor (well, Over-Extended) Middle Class; Quantum Computer Factors 15; Diesel Asynchronous Network Apps in Python (uses Coroutines); Django Template Tips; Starting a Linux Computer Remotely (WOL / PME); Causality - Inferring Causal Networks; Algorithmic Game Theory (Free Book); Running "find" in Parallel; Network Protocol Description Language; PyOpenCL - Python Layer to OpenCL GPU Programming; Would You Work With These People?; New Johnston Sans Typeface (the Underground); Delayed due to State; How Stupid is eBay?; String Theory is Just a Technique for Summing Terms in QCD; One More Reference; Iranian Gold and Cash (nearly $20bn) in Turkey?; Noop (no-op) - New JVM Language from Google; More Offside Documentation; Rethinking The Firm; Renault Told Piquet's Son to Crash; Hardware Hacking - Pictures from Space; Replies Work Too?; Moving to WebFaction; La Nana (Chilean Film); What's so Neat...; Offside Parsing Works in LEPL; How a Construction Crane is Made (Builds Itself); More Al-Qaida Details; And the X1; Leica M9 (Full Frame); Dark Stalking on Facebook - Tracking Invisible Identities; Al-Qaida Faces Recruitment Crisis; NSA Intercepted Emails used in UK Liquid Bomb Trial; A Review; Extended Bash Shell (Including ASCII Plots); RSS Cloud - Putting the Push in RSS?; Mercury Prize Nominees; Raphael - Javascript Library for Graphics; Domain Specific Language Conference (Papers etc); Rhonda 3D Drawing Program (+ Video); PyDev 1.5.0 now All-Free; Page Rank Gives Critical Nodes - Extinctions; Designing Crypto is Hard (Schneier - Don't Use AC); Yike Electric, Foldable Bike (Exists?!); Faster with Overvoltage; Negative Interest Rates in Sweden; Overclocking Q9550 with Asus P5Q; H1N1 Virus DNA and DIY BioTerrorism; GF1 Preview; Panasonic GF1 - Grown up LX3; Tweeting from the Linux Command Line; Cheap, Simple, Massive Storage; Thanks for this; Coders at Work (Book); Netflix Culture; More Indentation; Representing Indentations for Parsing; More Quads; Hidden Cost of Coroutines?; Interview with Amartya Sen; Article on Coroutines, Python, State Machines; Amazon, Clouds, etc; Pylint and Python 2.6; P / NP Summary; Depression's Evolutionary Roots; Economist Review; Intel Quad Core Prices; Scotland needs no lessons in matters of fairness from a country that has been routinely waterboarding suspects in Guantanamo Bay; Free Book on MetaHeuristics; Scheme to split in two; Hopelessly Naive; Stalin Had Similar Ideas; Sean Smith; Life is Good; Afghanistan - Reportage / Photos in Guardian; Pictures for Sad Children - Airshow; Also, Lombok; Mixins For Java; Rules For Use; Automatic Banknote Detection; Using Computers to Help Scheme Against Paying for Bhopal; Distributed Teams Build More Modular Products; Schumacher > Anonymous Pro; Anonymous Pro - Better than Schumacher?!; Amplifiers + Computing Theory Blog; Proven OS Kernel; Mail Based Blog + Gmail; Generating Pie Charts in SQL; More Analysis on the VMWare/Spring Deal; CPU/GPU Unification; VMWare buy SpringSource!; Hardware Entropy Source (USB!); Better Wave Analysis; Older, Happier, Wiser; Analysis (Negative) of Google's Wave; More Info On Concepts; Panasoni'c Micro 4/3 (MFT); Drug Company Ghost-Writes Papers; Linux Disk Config; Blue LEDs on PeeCee07A (PC2500e); Gregory Thielker; Language Workbenches?; Random Art + Cryptography; Initial Impressions - Via C7-D Barebones with Opensuse; Amitai Etzioni; Why are people with "tone-deafness" bad dancers?; DLink DUB-E100, Opensuse; Named Tuples in Python (and some Cairo contexts); Stroustrup's Take; C++ Concepts Dropped; Moved to GMail; Mail-based Blog; System Re-factoring; Enabling speaker beep as KDE notification; UK Police Arrange for Suspect (in UK) to be Tortured (Abroad); Extended to 3D; The Soft Heap: An Approximate Priority Queue with Optimal Error Rate; Godel Prize; Original paper; Facebook / MySpace Social Divide; Only Early Kernels; Cygwin SSH Server on Windows 7 RC; Using a Directory (Package) for Django's Model; Compiling pgplot on opensuse 11.1; Comparison of Dual Core E4700 and E6400; Erik Naggum Dead; Oracle on OpenSuse/Linux; Yup; Olympus Pen EP-1 (Micro 4/3) Details; More Iranian Analysis; Improving Nicotine's Response; Neo4j - a Graph Database; MISC - Lazy Lisp with Maps; Nortec Collective - New Album; The Sorry State of UK Politics; Two Contrary Views on Iran; Some Rape Stats Background; More Overvoltage Results; New Mobo; Caring About Programming Languages; Reflections on First Consultancy Gig; Google Squared; Windows 7 on VirtualBox; Smart File Visualisation; Boomerang - Lenses for Text; Datalog Jobs; RT61 Notes; Remote X for Single Programs; Sorting Morphisms; Computers and Intractability; Although Rather Drinkable; Bugger Carmen and their Grande Vidure; A Bomb Won't Go Off Here; 50 Ways to Change Minds; Sector/Sphere - Distributed Computing on Widespread, Heterogenous Networks; Linux-based Cracker Tools; Dear Esther (Half Life 2 Mod); MySQL Forks; Factor of 2 (Northbridge Explanation v2); A Beginners Guide to Forcing; Tiny STM; Erlang Influence?; CUDA Course; Protocol Support; Axum - New Concurrent Language from MS; Not Quite; 92% Faster; 92% Faster; Overclocking E6400 by 60%; Eight stories on Obama [...] censored from the Guardian, Observer, Telegraph and New Statesman; Trying to Explain why Mercurial is Good; Mandriva; With Eclipse; Add wwwrun to hg group; Writing to Mercurial; Renewing Chilean Visa; Interactive Mode in PEvolve; Using Mercurial on OpenSuse 11.1; Logitech Duet Love; Clarification from Anandtech; Initial Tokenizer Results for LEPL; Dead from beating?; New Edition of Parsing Techniques; The police: Unaccountable, secretive and out of control; Same Guy; 2.3 Released; Another Thought; Caveats; Compiling Recursive Descent to Regular Expressions; Compiling Recursive Descent to Regular Expressions; Much Better via Co-Routines; Much Better via Co-Routines; Much Better via Co-Routines; Much Better via Co-Routines; Peyton Jones - Implementation of Functional Programming Languages; Great Moments in Logic; The Quiet Coup; Logging Slow Queries in MySQL; Dabo - Desktop Application Framework (Python); Epsilon!; Original NFA; Initial DFA Results; Squeezenter on OpenSuse / Linux - Couldn't create command line for ogg playback; Legalising Polygamy in Utah. Ha ha ha.; Implementing a Regular Expression Engine; New Server Configuration; Converting NFA to DFA; Converting NFA to DFA; Converting NFA to DFA; And...; Browser Ball; Auto-layout of Graph Components; Good Article on Poverty in the UK; Does Make Sense; Possibly Complete; Incomplete; PyPy Getting Somewhere?; Corrected Test; I Just Wrote a Regular Exression Engine!; Freaking Awesome YouTube Mixes; Charles Freeman (National Intelligence Council nominee) Statement; 40-fold Speedup in LEPL Parsing; Cities of Bronze and Glass; Cities of Bronze and Glass; Modify Audio with Python; LEPL 2.0 Released; Protocol for copying updated files; Simple LLVM Example - Lisp; MCL - Relatively New Clustering Algorithm?; Fascism now back in Italy?; Declarative (Auckland) GUI Layout; Cybersyn; History of Twentieth-Century Philosophy of Science; Nice Short Summary of Ant v Maven; Yes but no; Sensible Statistics for LHC Risk (Bad News); Simpler Version of Above; Current Economy in Perspective; SSDs Suffer from Fragmentation Issues; LEPL Roadplan; Finally, Clean Main Loop; Simplified Code; Correction on Python Stack; Trampolining Code; Clearer; More on Co-Routines; Transparency Key; Handling Yield; Join The Discussion (Really!); Join the Discussion!; Avoiding the Python Stack; Positive Report on Venezuelan Economy; Papers on Handling Left Recursion in Top-Down Parsers; Works now; Transparent Python Proxy Object for Circular References; Python 3 Instance Attributes as Methods; Alternative Representation; Simple Tree Rewriting; Python Code for ASCII Trees; Natural Language Processing in Python; More Madoff; Recursive Descent Parser; Bria Di Novi; Update; Google Alerts (and LEPL, and setuptools for Python 3); Low Latency(?) Kernel for OpenSuse 11.1; Later; Strange Moderation at BB; Max Richter, Prefix, OpenSuse 11.1; Overview of Python Packaging Tools; Error Handling in Recursive Descent Parsers with Backtracking; A Thought On Obama's Inauguration; The Book; So, the King Of Thailand...; "in" as Operator; Happiness...; Python's Operators; Python 3 in OpenSuse 11.1 and Eclipse; Information on Universe's Event Horizon...; Re: OFF; OFF; TiddlyWiki on Tahoe; Tahoe Least Authority Filesystem / AllMyData.org; More wxPython and OGL; With Bactracking; Syntax; Parsing Credits; New Parser in Python; Food in San Francisco; Updated PPOE Script, Extra Tricks for WebMail; Some Notes on OGL with wxPython; Suspend Broken; Bomb, bomb, bomb...; OpenSuse 11.1 on Lenovo/IBM Thinkpad X60; More Ideas; Gaza; Slice Mechanics; Stupid; Since when did Last.fm start to suck so much?; Rethinking Parsing; Radio David Byrne; Pick of the picks (Guardian photographers) + Internet; Problems with OSX (Apple Mac); Script to convert WMA to MP3 on Linux; Command line player for listening to SqueezeCentre on Linux; Basic HTTP Authentication with XMLRPC in Python; Gaza; Tweaking Beagle and KDE; More on Marcela Moncada; Marcela Moncada at the CCU, Santiago; Schrodinger Book Review; Natanz, not Naratz; Snobol Like Matching in Python; Woman Living in Jeddah; Simple Physics Using Verlet Integration; Updated Raid Data Scrubbing Link; Predictably Irrational; Nuclear Enrichment Technology; Recent DnB; Script to Fix MP3 Directories; Young people and territoriality in British cities; Projections; Cube - Series of Images for Laser Printer; This project died soon after...; And even if you won, you lose :o); Madoff as a Jew; Beagle, Computing in Science and Engineering; Fundacion Rodelillo; Use Logitech Squeeze (Slim Devices); Separate DAC for Headphones; SqueezeCenter/SqueezeNetwork; SqueezeCenter gets better!; Logitech Squeezebox Boom on OpenSuse; Krugman - Absolutely Right; Early Investigation into Madoff; Script to Check for dsl0; Another Positive Assessment of Chile's Position; Slowly making more sense; PPOE on OpenSuse; Quantum Bees; EmpireDB - SQLAlchemy for Java?; Bowery Electric; Zimbra (Messaging and Collaboration); Bolano + Sebald; Santander Security; BCI Customer Service (Chilean Bank); Good Intro to PyParsing; Two Essays on Bolano; Financial Regulation; Chilean Liquidity Crisis, November 2008; Batter Control via SMAPI; Not So Fast; Font Size; Extending Battery Life on X60 (OpenSuse, powertop); Dario Urzua 1780, Providencia, Santiago; When Agile Projects go Bad; Practical Comments about DSLs; Books I Should Read; Monster Truck Video; MicroFinance in Chile; Chilean Companies to Avoid; On the Other Hand; Background on Hedge Funds; Paper in Compression; Quantitative Easing for Dummies; Balada del Elefante Azul; Mass and Renormalization; Why CitiGroup is About to Be Bailed Out and Not General Motors; Joost in Decline?; Excellent; Thinking About Databases, Efficiency and Technology; Decent Summary of Citibank; Looking Good, Chile; BNP Membership List; Etherpad; NOAO DPP Changes; Correlations; Fast Is Not Necesarily Bad; about the article; Triggerfish Cellphone Locating; Actually, no...; CDSs a Good Thing?; Chavez airs wiretaps of political rivals; iBATIS Caching; Are Chilean Bus Stations Safe?; Microsoft OSLO (DSL Framework); Decline + Fall of Agile; Plop / MOSES; Food; Declarative Validation of XMLRPC Responses in Python; More on Moodys etc; Social Terrorists; Declarative Mini-Languages in Python; Learn Prolog Now; How Palin was Picked; Newer Bus Info; More Bus Notes; Bus Travel from Santiago, Chile; Some decent Chilean (and Mexican) Music; More Info on IBatis-Based Project; Nice Plot from FT showing Spreads; SAX XMLFilter Example; Hitchens on McCain + Palin; Short Position on BBVA and Santander; Relatively Positive Article from Economist; It Works!; Not Even with Latest Version; Nope; Fixing Java Profiling in Eclipse (TPTP) on Linux (opensuse); Perhaps Not; New, Good Book by Le Carre?; Possible Future Financial Scenario; No Idea!; Session Limitation with Acegi blog post; Patriotic Taxes; Using Packrat Parsing for Ruby; Still Not Simple

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