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

This is my blog. It used to be a mailing list called C[omp]ute. It is still generated by email. You can reply to comments via the appropriate link. Edit the mail address to remove the anti-spam measure. However, given the very low volume of replies, and the high rate of spam, it can be months before I moderate a post. Sorry. © 2006-2009 Andrew Cooke (site) / post authors (content).

I am always interested in offers/projects/new ideas. Eclectic experience in fields like: numerical computing; Java web/enterprise; functional languages; Python client GUI/web/database; etc. Based in Santiago, Chile; telecommute worldwide. CV; email.

Last 1000 entries: 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; Article on Robert Preston; China Intercepts and Stores Skype Messages; World of Goo - Interesting Looking Puzzle Game; Another Article on Models and Finance; Simplified Caching; Problem with iBatis, Spring and OSCache; Totally Worth It; More iBatis Comments; iBatis ORM and Caching Strategy - a Use Case; Liberal Intellectuals, Foreigners and Fascism; Good Article on (Current) Economics; Update; Same Results; Perfect Hash; Core Routine; Matching DNA Update - Faster Java Code; Carpark North (Videos); Medeski, Martin and Wood - LIve in Santiago; The Revolution Will Not Be Televised; Good Clear Analysis of AIG, HBOS; Band of Heathens (Blues); Choco (Constraint Programming in Java); Choco?; GecodeJ Not for "Real Use"; Not to be popular...; Commented GecodeJ Example; Programming Constraint Services; Installing Gecode/J (Opensuse); Trentemoller - Electronica; Spelling Errors; Mesed Up KDE4.1 Libraries w OpenSuse 11; Panasonic's Page; First Micro 4/3 Camera; And Sun Too; New Info on Nixon, Kissinger, Chile etc; Confirmation - Type Erasure, not Recursion; SequenceL (Auto-Parallelisation); Scrubbing RAID; Using a New Scope to Avoid Type Capture with Java Generics; Probably due to Erasure; Bombed; Fast Updatable Median; MySQL and Graphs; More Efficient Search Parameters: 30min; Updated Timing; Identifying Related DNA Sequences; Re: Tom Cruise, Holoprosencephaly; Relatively,,,; Loma Largo Quinteto - Fruity, Light and Chilean!; Try VirtualBox; Trivially Easy!; Sun's VirtualBox v2; Good Summary of Recent Spring Config Options; Launchpad - Open Source Projects Support/Hosting; Secure Remote Password Protocol (+ Python TLS); Good Analysis of Georgia Issues; iBatis Error with Recursive Generics; Google's Web Browser - Chrome; With Separator; Plotting Data from Postgres; Emotionally Vague; YouTube - rannndom improv jams - some hip hop & some funk/techno; Amazing Toy; Lua on LLVM; Mujava / Township Funk; Overclocking Again; Concha y Toro; Stream to Tree; Latest BIOS - No Memroy Remap for P5LD2 SE; New Version (+ Book) of Qi; Updated Photography Gallery; Good Walkthrough on WEP Cracking; Free Science, Computing, Maths books; Open JDK Works; Interesting Review of Maths; Spring's Command Controller; Java Annotations to Construct POJOs from HTTP Requests; REST Summary; JavaScript / ActionScript Politics; Olympus Interview Translation; Related Discussion; Themable (Tileable) Tk; Good Post on Micro 4/3 (Four Thirds); I Have to Agree; BulliEpu has Moved; Recursive Generators and Backtracking Search (Python); Not the Best Solution in General; Another, Simpler Python Meta-Programming Example; Breaking News - God Continues to Not Exist; Evidence of God?; Image Processing with CUDA / Python (Dynamic Pipelines); Cookies; Listening to BBC Radio over Internet with Linux; Re: How about post-install; How about post-install; Cookies; Better Code + Numbers; Some Initial Results for Overlapping Tiles with CUDA; Python Closures with Lambda; Java plugin for Firefox 3 on OpenSuse 11 (64 bit); Large Systems Need to Detect and Correct Internal Corruption of Data; Wine Labels; Headphone Socket Failed; Wine Prices and Quality; List of Good Recent Books; Details of the DNS Attack; Panasonic LX3; Re-using CUDA's Makefile; Resume/CV Designs; Newspapers Quoting Internet - How?; Good Paper Against Heuristics; Hueristics and Ethics; Non-CPU Cooling Helps; Diff and Patched CUDA SDK for OpenSuse 11, 64 bit; Have You Nothing Better To Do?; More Evidence; Traffic Shaping by VTR; Maybe too Negative?; Using gcc-4.3; GPGPU / NVidia Cuda / OpenSuse 11; Semantic Version Control; Xen and Solaris on OpenSuse 11; Assorted Links Now Free...; Updating Wikipedia (Mediawiki) to use Postgres 8.3; And a Test Reply; C[omp]ute is back!; Python CGI to Display Flickr Images; Good Papers for Dyanmic Interpreter Implementation; Python ABCs; Handling Version Changes that Break APIs; Sweet Security Hack; New Music - TheSixtyOne; It's Parabolic; Interesting (Science-ish) Mailing Lists / Blogs; Bug in Moody's Credit Rating Models; Numerical Computation w Python - Sage; Conclusion; Correction; Clarification; Yet More (Entropy?!); Extra Thoughts; Undo, Redo, Transactions, ORM, Monads, Python; Undo Example; Monads in Python; Algebrization: A New Barrier in Complexity Theory; Details of (Iranian) Enrichment Tech; Cool Physics Blog; Cool Result on Birds; Python Context Management; DataFlow in Python; Internationalization for Python; Logging in Python; Useful Responses to Python Metaprogramming; Python Metaprogramming; Robot Weapons Withdrawn; Synergy - Cross Platform Software KVM; Google App Engine; Easier Online Procedure; Python Parsing Framework; Wittgenstein - On Certainty; Ernst Haas - Photographer; Physics, Computing, Maths; Scientific libs etc for Python; Replacement Battery APC Smart-UPS 420; Tamaya Merlot 2005 (Reserve); New Photography Site; Rubik's Cube solved by Lego; Pedro de Valdivia 2257, Providencia, Santiago; Argh. XSLT not XPath; Comparison of XPath and XQuery; More on Gravity Anomaly; Algorithms for programmers; New Job; New ISP Location; Wiki; Shove Module (Python); Bolano Stories; Do Use Raw; Critica.cl, Bolano, Arriaga, Animita Cartonera; Ernst Bettler, Disruptive Design (or not); Late Victorian Holocausts; Book of Memorials, Photos, Chile; Sweet Fucking Christ; Depth of Field; QM is Statistics with a 2 Norm; Panasonic LX2; Expert Data Reduction; Font Rendering; Encrypted Email Not So Safe; Test - New Server; Excellent Review of the Current State of High Energy Physics; Fascinating Background on Pakistan, Atomic Weapons, etc; In Retrospect; Good Food in Valparaiso, but Social Art Crisis; Licence Plate Recognition; Interesting Work on Data Provenance; More on French War; Roberto =?iso-8859-1?Q?Bola=F1o_-_At_Last=2C_a_Great_Chilean_Writer?=; OLPC (XO) in the Developing World; Termite v Erlang; Little Steven's Underground Garage; Chilean Food (Pebre); Amazon Improved Reccomendations?; Explanation of Picture; Rigid Rod Dynamics in 2D; Subtle, but Correct (I Hope); Axiom of Choice; Efficient Collision Detection with Pessimistic Measures; Beautiful Description of Forth Implementation; Interesting Poll - Worldwide Muslim Attitudes; American Schools Banned From Calling 911; OCaml on the JVM; Computing in (Haskell) Types; And Another on the NSA; Article on Bolano (Chilean Writer) in LRB; Collision Detection Working; First napito Results; Within 10min 2 People Had Marked As Favourite; Safe, IDE-Friendly, Extensible, XML Schema; Funny Foreigners; Credit Card Security; ...history, and laughing; No Officers Guilty - Abu Ghraib; Yellow; Cheap....; Significantly Faster; Not Efficient!; Hygienic Macros Failing in Gambit?; More Specific Operations; Basic 2D Geometry Routines; [Fwd: Andrew On Libertarianism]; In Defense of Purple Prose; Libertarianism; National Identity; Improved Permutation Function (Start of List Library); Good Article on SQL, Graphs, Trees; Permute Fucntion (Scheme); Initial Scheme code for Napito; 1 in a Million; Getting Started with Gambit and Snow (or any other Scheme); Running Gambit (Scheme) From Emacs; Space Travel and Astronomy; Amazon Does On Demand; Neat Idea - Extra Steam Stroke; Error in Regex; Good Paper on Migration, Social Costs, etc; Makin' Money!; Dropping Less Spam at ISP; Brother HL-2070N on Linux; High Windows as Limerick; Power 101; Alas...; LEDs in GUIs; To Be Completely Clear - I Agree With Loquax; Compiling Suse 10.2 Kernel with Nvidia; Full review in IEEE Spectrum; Long Rant on Physics, Free Energy, Steorn, etc; Too Easy; It's all about the Me; jjjuste V 1.0 Released; jjjuste V 1.0 Released; Woot - Jack to Airport; More of a Wobble; I Am A Foooool..; On Aging; The Worst of Metafilter; Protecting Traditional Knowlegde; Chilean Frustrations; Sine!; Slower, but doing the distance; It's Official - I Rock; Post-Hoc Wine Tasting and General Good Day; Albert Schweitzer; Using IntelliJ Idea v 7 (Selena) with mvn idea Plugin; Awesome Article on Reiser; Review of Cockburn's "Agile Software Development"; Streaming Audio and Jack; How Many Spammers? A Statistical Approach; Jack to Airport; Alsa, but no Flash, Jack; Amarok with Jack; Getting Jack Working; AES Weak?; Related LRB Article; Backtracking; Lessons from Icon; Iteration 2; And Another; More Politics, I'm Afraid; Need for Immigrants; De Soto Report; Happy to be fined!; Update; Post on Reddit; Culture Jam; One More Step; I just bailed on Parrot; Parallel Sudoku solver in Stage; Lessons Learned with Erlang; Timing Data; More Jabberings on Syntax; More on OO/FP/Asynch; Unifying OO, FP, Asynch Messages; Neat Noise Based Crypto; Convergence with Greediness 0.95; Greediness 0.75; Core 2 Duo Never 100% Both Cores?; Aborted Output with Greediness=0.5; Taste Test: Coke Light (Diet) v Zero; Hot Damn Fuck Me Backwards Woot!; Typical Report; Reduced Range Sudoku Solver; Still doesn't work...; The Vietnam of Computer Science - ORM / RDMS / OO; Interesting intro to Coq w Haskell; More Thoughts on Chapter 1; Notes on Agile Software Development; Gravity Probe B; Not Even Wrong; The Fabric of the Cosmos - Brian Greene; Yet More Discussion; More Discussion; Computational Economics; Machine Dreams - Economics Becomes a Cyborg Science; No Emergence; Community Sudoku - A Cooperative Algorithm; Coming Soon - Community Sudoku; New Version; Bug!; Can't Sleep; Latest Before Bed...; I Don't Even Know How To Play Sudoku...; Markets and Individuals

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