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

Go Rocks - How Can We Avoid Something This Bad In The Future?

From: andrew cooke <andrew@...>

Date: Sat, 9 Jul 2011 20:30:15 -0400

Go (the programming language) is no longer new.  But I don't know of a good
explanation for the ambivalent reactions to the language.  So here's my take.



Go is very much the child of its parents (the people who brought you C).  And
it's clear why some people (who typically have programmed in C, Java and
Python) will love it, while others (from a more academic background, who know
Haskell and Scala) will feel it's an ignorant failure.

Both groups have their points - it's a pity that the language couldn't have
combined the practical experience and good, simple taste of the designers with
some more "theoretical" ideas.  Instead it's hard to avoid the idea that it's
a language "proud of its ignorance", and that it suffers as a result.  On the
other hand, what's the alternative (clue: FS)?


OK, so first I'll describe what Go is, and WHY IT'S SO GOOD.


Duck Typing

Go "makes duck typing static" - anything that contains the required set of
methods implements the interface (even if the person writing that code had no
idea the interface existed).  So it combines (much of) the flexibility of
Python with better checking of types.

It also has a simple form of local type inference, so that you don't need to
specify types where they are "obvious" - only on the arguments and return
types of your functions.  This helps make the duck typing more efficient -
method resolution is "pushed back" to when the interface first appears, and
does not need to be repeated on every use.

Given all that, you might think that Go is "object oriented".  And it is, in a
sense, but you don't have "proper" inheritance.  Personally, I don't think
that's a problem.


Memory Management

Memory management frees you from worrying about who "owns" a reference.  And
in a C-like language that's a huge deal - it opens up a whole world of
possibilities: first class functions, closures, continuations...  Java should
have exploited this, but if you compare Go with Java, it clearly comes out on
top: first class, anonymous functions, with closures (coming in Java 8,
honest).

If you have experience with functional programming, but need to write the kind
of low-level code that has traditionally been C's domain, this is awesome
news.  And if writing "low level" code with managed memory seems like a
contradiction, you may be underestimating Go - it still has "new" and
pointers, so you don't lose too much control, but you gain a pile of
flexibility.  This is a big, big win over C (and Java).


Lightweight Threads

Go also supports lightweight threads (these seem to be real threads, not
coroutines).  It also has a channel abstraction (think CSP) that, when you
first see it, might have you thinking "oh, cool, Erlang" - but it's not;
everything is inside a single process.  So this is a nice interface to local
threads, but nothing more.


So Go is C with memory management (Java really did help the world), a cool
take on Python's types, and local threads.  A modern C.  Everything that Java
and C++ failed to be.  Small, elegant, powerful.  And that's great.  Really.
It rocks.  It's not a hugely ambitious language, but if this is the next
mainstream programming language then we have progress.  More impressively - it
can be the next systems language too (for some definition of "system").  And
it's *way* easier to use than C++.

In a world that knows about Java, C, Python, C++, this is one more step in the
right direction.  Excellent.


Second: so, WHY DOES IT SUCK?


To understand that, you need to understand the academics.  There's a lot of
research done on language design these days.  It's big (university) business
and it's making real advances.  Largely because it's found a "scientific" way
to approach the subject.

Imagine when physics was just starting to get off the ground.  Back when
people were discovering electricity, for example.  Everyone was like "hey,
there's this cool trick I can do with the skin from a dead cat and a glass
rod!"  "A dead cat?"  "Yeah!"  Which was fun.  But then maths got involved and
we began to see the underlying connections - the patterns, the regularities,
the way that light and electricity and magnetism and radio waves are all
interconnected.  A systematic, mathematical approach connected a wide range of
different ideas.  And we gained from that.  Radio, TV, microwave dinners.
Computers, even.

The same thing is happening with programming languages.  Mathematical ideas
unite different parts of languages.  When you spot those ideas you can join
together "different bits" to give something more uniform, and more powerful.

Go ignores all that.


You don't need to understand the maths to see this in action.  You can see
that things are not well thought out just by looking at the language.

Take functions.  Functions are cool.  Read an intro to functional programming.
First chapter, you're going to be recursing.  Sure, when you start, it's a
little confusing.  But then it "clicks" and you see how it can help you make
programs cleaner.  And it feels good.  Boy, does it feel good.

We've known this for years.  Functional programming languages have hammered
out all the tiny details.  It's easy to get this right.  It's easy to
implement.  Yet Go fucked it up.  Not in a big way, sure, but it's the details
that count.  It turns out that, in Go, you can't write a self-recursive
anonymous function - there's no way to make it refer to itself.  Well, you can
do a dirty hack that's the "official work-around" (I'll let you google for the
bug report).  But how could anyone, in this day and age, get that wrong?  What
were they thinking?

It doesn't stop there.  You can't use recursion much anyway, because Go
doesn't guarantee efficient tail calls.  Which, again, is just dumb.  There
would have been no great implementation cost - so simple ignorance means that
you can't use Go to write code in a certain style.  I'm not saying that style
is always good, but I'd like the choice.  It's like being in a workshop that
only has hammers...


Another example.  The "academic" approach looks for patterns.  It tries to
reduce the language to a few simple, elegant ideas.  An important result of
this is that you, as a programmer, become as powerful as the language
designer.  What do I mean by that?  I mean that by exposing the "deep" ideas
there is less "magic" that only the language implementation can do.

A good example of this is continuations.  Continuations let *you*, the
programmer, implement exceptions.  Or functionality like Python's "yield".  So
someone can build a language that contains continuations (whatever they are -
the details don't matter here) and then "for free" the programmer can "extend
the language" with features that other languages have built in.

Now, continuations are, arguably, hard-core.  No-one is criticising Go for not
having continuations (well... now that I ask, why doesn't it?).  But that's an
example that illustrates the related "design smell": if the language is doing
things that you, as a programmer, can't do, then it's likely not a
well-designed language.

And Go does things that you can't do.  There's this little command called
"make" that does some weird magic.  It's like "new" but does extra stuff.  And
you can't extend it.  What?

Or: you can only use certain types as hash keys.  The same bad smell: some
types (known to the system) behave differently from the ones you, as a
programmer, make.  Why?


By now you're starting to get suspicious.  So you start asking yourself: what
else have they ignored?  And you look at the type system.  And it's kind of
flakey.  A decent modern type system guarantees no run time errors.  Not Go.
And the "comma OK" pattern?  Isn't that a broken version of the maybe type?
Oh, I guess Go doesn't use that because it doesn't have pattern matching.  Well
why not?  The list goes on...




Now some of the above objections can probably be explained by efficiency.  And
that's a good excuse.  It's important to make a better C.  Believe me - I've
been programming in C for the last month.

There's another big reason: Style.  Go is a stylish language.  It's not
necessarily elegant, but it feels right.  Despite all the above, it's simple
and understandable.  You know you can use it to get the job done.

But wait!  Surely an academic, elegant language should be simpler still?
Those "deep" patterns should make things easier!  Yeah.  You'd think so,
wouldn't you?  But go look at Fucking Scala.  Yup.  Need to wash your eyes out
with bleach?  Thought so.  Fucking Scala (that's the official language name, I
believe) is the best argument I have that Go's creators know more than the
academics.

So is that it?  Is there really no better compromise?  Do we have to choose
between Go and Fucking Scala?  You would hope not.  But network effects are
more important than technical chops.  I can live with Go.  I couldn't live
with Fucking Scala.  Sure, I'd prefer Haskell, ML, or even a decently typed
Scheme, but they've already lost.


All we can ask, then, is how to avoid this in the future.  Next time someone
with style and clout sits down to write a language, how do we make sure that
they're aware of the last forty years of language theory?


------------


One final idea I didn't manage to fit in above: duck typing relies on
conventions.  To exploit the language to the full you need to know these.  Now
they're documented in API docs, of course, but I get the feeling that there
should be something more.  To program well with duck types you need, more than
in other languages, to "get" the "culture" of the language.  I feel like Go
should have added something here, but I don't know what (it has quite a rich
set of tools for an independent language).  Maybe I'm talking rubbish.  It's
just something I wanted to get out there....

And here's a thread that gives some pointers to earlier work that might have
informed Go (see comments) -
http://research.swtch.com/2009/12/go-data-structures-interfaces.html

Andrew

Re: Micro Languages

From: andrew cooke <andrew@...>

Date: Sun, 10 Jul 2011 09:59:36 -0400

That's a really interesting viewpoint.  You may well be right.  I wonder if
the same argument applies to type systems?  Should they also be monolithic?

I need to think some more, but thank-you very much for the comment.

Andrew

Some Links, Clarifications and Corrections

From: andrew cooke <andrew@...>

Date: Sun, 10 Jul 2011 15:07:39 -0400

This post was surprisingly popular, yet many people seemed to miss my point.

To see the the discussion, check out
  http://news.ycombinator.com/item?id=2746698
  http://www.reddit.com/r/golang/comments/ilfny/go_rocks_how_can_we_avoid_something_this_bad_in/

When I wrote the post I hoped to do two things:
 - Explain to people who like Go why it's been criticised and "looked down on"
   by some people.
 - Explain to people who have criticised Go why it's such a good, useful 
   language.
And, in my wildest dreams, as a result of that, help somehow fuse the "best
bits" of both.

Of course, my starting points may be wrong.  I don't think I have
misunderstood why Go is so good, because I am a programmer that has used C
quite a bit; it's more likely that I have either mis-characterised or
mis-understood the criticism of the language.

So I was most worried (because I would look dumb; on the other hand I would at
least learn something) that people would explain why Go's design *had* to be
that way (for example: perhaps the "duck typing" approach is so radical that
there is simply no research in that area).

And there were some comments in this direction.  Thanks for those - I will
check out the various points made.

But mostly, it seems, my audience was more on the "Go is good" side.  And
there I seem to have failed miserably in explaining why not everyone feels the
same.  I don't think I saw one comment that suggested that I had helped
someone see "the other side".  Instead there were dismissals,
mis-characterisations, and arguments aimed at my specific examples rather than
the more general points I was trying to make.

Anyway, I need to get back to coding.  I am trying to use Go's impressive
support for image generation and have just spotted a cool way to use the type
system (I think I can extend the image package from "outside" to use HSV
values as well as RGB).

Cheers,
Andrew

Re: Go Rocks - How Can We Avoid Something This Bad In The Future?

From: Jonathan Wright <quaggy@...>

Date: Sun, 10 Jul 2011 20:22:30 +1200

Hi Andrew,

Is the following a fair summary of your views?

Thesis: "Next time someone with style and clout sits down to write a
language, how do we make sure that they're aware of the last forty
years of language theory?"

Examples of how Go ignored language theory:
 - have to use work around to create a self-recursive anonymous function
 - no tail call optimisation
 - "Continuations let *you*, the programmer, implement exceptions."
(and coroutines and so on)
 - "'Extend the language' with features that other languages have built in."
 - Go has builtins that you can't replicate
 - Go has primitive types that are special

My take is that rather than Go ignoring years of language research,
that the complaints stem from Go being a monolithic language rather
than a microlanguage. I've stolen the monolithic/micro distinction
from the kernel space, but the idea seems to apply here too.

Micro languages are wonderful. They're the near-minimum amount of
features required to build all features. Ideally they are massively
flexible and allow changing:

 - semantics
 - syntax (DSLs, addition of new features, ...)
 - flow control (if, for, while, coroutines, exceptions, resumable
exceptions, ...)
 - data storage
 - ...

Nothing is really special. Everything can be replaced or changed at
compile or runtime. It is up to the library and application
programmers to create the language they need for the task at hand.

Micro languages have a long history: forth, lisp, scheme and friends.
I personally was attracted to the Io language and spent a number of
years coding in and on Io. The sky is the limit. They can be a lot of
fun to craft in.

In my experience micro languages have a flaw. They tend to attract
people who love, embrace and thrive with complexity. Almost anything
can change, and does. Idioms are critical, but it is hard to really
know how anything will behave from inspecting one fragment of the
code. The programs end up with millions of concepts rather than a
small set.

As in the kernel space, the monolithic tends to come out on top.
Monolithic languages have rigid semantics and syntax. The behavior is
obvious; what you see is what it does. There are simple semantics that
hold everywhere. The monolithic languages are not flexible. They have
a particular model and set of operations and that's that. If you want
to play with an interesting new style, you've either got to change the
compiler or use a new language.

To to back to the complaints, in the micro vs monolithic light they
boil down to:

 1. no tail calls
 2. no continuations
 3. privileged builtin types and functions

To me, tail calls are a design decision for each language. The great
Python tail-call debate of 2009 nicely showed that with tail calls
certain things are easy, and without tail calls other things are easy.
Tail calls have a significant influence on other features in the
language around function calls, scoping and error handling. There does
not appear to be a clear consensus that the trade off should be one
way or the other. For now it seems prudent to explore both sides until
a clear winner emerges.

As for continuations and privileged builtins these are classic areas
of conflict between micro and monolithic languages. With continuations
all manner of wonderful flow control constructs can be implemented,
from if statements, for/while loops up to coroutines and retryable
exceptions. Very powerful. Rather confusing. If you want a tiny
language that can be extended indefinitely, then continuations are a
must have. If you want a language to sit down and use, with everything
being simple and obvious, then continuations mask actual behavior.

In a micro language, there will be few, if any, builtins and special
types. Anything can be changed except for a few atoms the entire world
is built on. In a monolithic language, there tend to be builtins types
or functions to provide stability and certainty. In micro languages
the builtins may well be hidden below libraries and low level, where
in monolithic languages, the builtins are higher level and visible.

Given the history, it seems unlikely that a mainstream language will
be a micro language.

Convinced? Not even a wee bit? :-)

Thanks,
Jonathan.

Re: Goroutines

From: John Beshir <john@...>

Date: Mon, 11 Jul 2011 13:25:23 +0100

Just a small correction; goroutines are not "real threads", nor are
they traditional "coroutines", but they're much closer to the latter.
They are basically coroutines scheduled across an arbitrary number of
real threads, with code to yield regularly added to operations like
memory allocation, channel send/receive, and system calls.

They are MUCH cheaper than regular threads, their primary cost being
4KB of RAM for the initial segmented stack, and you can easily spawn
hundreds of thousands on a single system, more if you have the RAM for
it.

Extra real threads are created as necessary when they make blocking
system calls, so they behave like real threads, most of the time.
Network I/O uses a single thread with non-blocking I/O, which wakes up
goroutines when their operation is done, all of which is handled for
the programmer, who has a simple blocking I/O interface provided. This
means a goroutine per connection makes network code both fast and pretty
to write.

This is nothing other languages haven't done in some form, but is
significantly cooler than your description suggested, letting you
write concurrent code easily and with good performance.

(I should note the GCC implementation currently has a crippled
implementation of goroutines which requires an OS thread per goroutine,
but this is not the general or intended normal case)

From the Haskell Perspective

From: andrew cooke <andrew@...>

Date: Mon, 17 Oct 2011 20:54:48 -0300

This post makes a similar point, in a way that might appeal more to people
that use Go:

http://neugierig.org/software/blog/2011/10/why-not-haskell.html

Andrew

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: blockaid.me - Free DNS; Magicd - Haskell based consistency-on-read for Riak; BBC Article; Long Working Hours in Chile; Martin Warp - Free Comic Book; Useful Thread on Clojure Data Vis; More on Gravity, Information; Clojure's Map Implementation; Microcredit and Microsavings; Compound of Five Tetrahedra; Example of Writing Indexed PNG Using PNGJ + Clojure; Achewood is Back; How Do You Get From Here To There?; How to Stop Spam from Quora?; Index on Censorship Anniversary Issue; Re: Taking Back Email (not); Re: Taking Back Email (not); Taking Back Email (not); Also, Numba; Gradle - Somewhere Between Ant and Maven; Two More Frameworks; Javascript Server/Client Frameworks; Clojurescript in Intellij Idea; Cute Piece of Clojure Code; Re: Cute Piece of Clojure Code; Cute Piece of Clojure Code; numexpr - Fast Evaluation in Python; What do People Want on StackOverflow?; Constraint / Optimization Resources; Finite Fields and Error Detection; Event Driven Programming in Clojure; Choco Update (and New Blog); Rocking Chair (Self-supporting lattice; Chilean); Using Choco; Cure for Cold (and Aids, and...); N-1 Dimensional Planes; Uniform Fences Don't Give Uniform Data; Gas Leaks and Smells; Re: Questions on OpenCL; MultiMap and MultiSet; Switching from Triangles to Indexed Vertices in WebGL; Maths for Computer Scientists; Re: StackOverflow and "Show your work"; Re: StackOverflow and "Show your work"; Fixing Chile Time on Linux (Daylight Saving); StackOverflow and "Show your work"; C Compound Literals; Small Corrections; Time-switching Procmailrc Recipe; Learning Modern 3D Graphics Programming; Python Borg (Monostate, Singletonish); Debugging webgl; Fast, Secure Google Search Replacement; Setjmp and SQL; The Best Feeling as a Programmer; Javascript Documentation; Another test; And Again; Testing Again (2); Testing Again; Final Javascript Example (including browser); Testing External Comment; Building for the Web; Julia Programming Language; Better Test Example; Javascript Development on the Command Line; Visualizing Process Execution (Performance Tuning); Ichiban - Japanese Restaurant in Santiago; Getting started with ClojureScript and Noir #1; Wrapping an Iterator in an Iterable; More D3 - Joins; D3 - Javascript Data Viz; Parasites Affect Our Behaviour; 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

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