christopher.lord.ac

christopher.lord.ac

Christopher Lord  //  I work on compilers for a major corporation, specialized in computer languages and the parsing and optimization thereof. In my spare cycles I hack on Haskell, Ruby, and Objective C. Outside of programming, I am an outdoorsman, a skilled photographer, a student of typography and design, and a patient, better driver. buzz.

Mar 26 / 2:07pm

Wanna Simulate the Universe?

Alright, a bit grand. This is not even anything like the real universe. A little while ago I came across a post discussing negative mass and decided to write a simulator that does the same thing.  My 8 core Mac Pro could surely do a more intensive simulation in combination with grand central dispatch
 
A few hours later I was generating tiny universes and creating mov files of their evolution. This little proggy creates some masses of various sizes, and then crunches the (modified) Newtonian gravitation between all particles. I fix all the constants of this universe to 1. It outputs a raw mov. You need a mac with devtools to build right now, although the core mathematics could be done anywhere with minimal effort.
 
 
Check out these two sample runs:

The next step for this project is to output a list of points and times, and an OpenGL renderer that presents the data. 

Also, I'd like to simulate mass aggregation to see if I can get black holes and the like.

Filed under  //  GCD   physics   simulator   source-code   video  

Comments (0)

Mar 1 / 3:35pm

Mongo DB

I've successfully ported freshslowcooking.com from Rails on an SQL backend to Sinatra running on a MongoDB backend. Everything is going through rack-cache, but even without the caching, things are running much faster in my benchmarks. The official site is still running on rails (no deploy yet) because zibi wants to do a quick redesign to commemorate the faster backend and the change of season. 

On this blog, I will be posting some of the things I learned going through this process, including what the heck all of these tools are, why I wanted to use them, and how I managed to pull them together to make a successful blog engine. 

Today, I want to talk about why I wanted to use them.

MongoDB is part of the "NoSQL" movement. It's a document-centric system that stores stuff in nested associative arrays. I think of it as a big JSON-keeper (actually BSON). I've written my own such tools in the past, but Mongo has dynamic queries, indices, and in-place updates, blowing my home-made crap out of the water. Putting everything in associative arrays is in vogue — and not without reason. The technique allows one to craft meaningful (duck-typed) schema over a document. The concept of a weak schema is powerful. It means we can roll out major new features without taking anything down, and on a per-post basis. I suspect I'll be using tools like mongo for a long time.

Moving on to rack-cache. This is a reverse proxy that forces you to think about the cache strategy for every one of your pages. In the past I almost never took the time to properly mark my pages with the correct cache-control and last-modified headers. This tool is finally motivating me to do so. And leaving it on during development is helping me understand the issues with caching more deeply.

Finally, Sinatra is brilliant. It stays out of the way, but makes things easy. Having developed and run a few sites under rails, I am confident in my position that rails does too much magic. The stack traces are too deep. Sure it's always possible to get something done, but it seems like I'm working against the framework more often than not. Sinatra stays out of the way, and lets me write HTML, Javascript, and Ruby without having to deal with pseudo-interpreters and leaky abstractions.  With Sinatra, I can pick-and-choose my magic, so that I can understand all the bits and pieces. 

Next time, I'll talk about how the new version of Fresh Slowcooking is put together.  
Filed under  //  json   mongodb   mongomapper   rails   sinatra  

Comments (0)

Feb 10 / 7:29am

Google Street View Car on Google Street View

If you've never seen a street view car, and want to, check this out. How delightfully meta: 



View Larger Map

Click "View Larger"

Comments (0)

Dec 2 / 4:09pm

Fractions in Ruby

For a cooking website I recently worked on, I needed to display decimal floating point numbers as fractions. I needed to come up with the fraction closest to what the user typed. For example, 0.33 should resolve to ⅓. When I googled for a solution, most of the code I found was slow, buggy, and too precise (returning 33/100 for the above example.)

I decided to widen my search to C, and found a piece of code on Stack Overflow written by David Eppstein in 1993. It uses the theory of continued fractions to approach the correct value, but stops when the denominator reaches some value. 
The limitation of such an algorithm is that we can't choose to leave out unnatural denominators (that's a topic for some future post: why don't people like to use 7 as a denominator?). 
Anyway, I ended up wrapping up Eppstein's code in a Ruby gem entitled "fraction" and throwing it up on Gemcutter in case anyone needs similar functionality. Using this gem is easy:
require 'fraction'
num, den = 0.33.fraction   # num==1, den==3

# You can also get the error
num,den,err = 0.33.fraction   #=> [1, 3, -0.0033333333333333]

# you can choose a different maximum denominator than the default value of 10:
num, den = 0.51.fraction(100) #[51, 100, 0.0]

You can get fraction from gemcutter

 

 

Here is a quick test of this code:

require 'rubygems'
require 'fraction'

# Google for "ruby fraction" and you find this code

class Float
  def number_decimal_places
    self.to_s.length-2
  end
  def to_fraction
    higher = 10**self.number_decimal_places
    lower = self*higher
    gcden = greatest_common_divisor(higher, lower)
    return (lower/gcden).round, (higher/gcden).round
  end
private
  def greatest_common_divisor(a, b)
     while a%b != 0
       a,b = b.round,(a%b).round
     end 
     return b
  end
end

starttime = Time.now
1_000_000.times do 
  n,d=0.5.to_fraction
end
endtime = Time.now
feeling_lucky=endtime-starttime
puts "I'm Feeling Lucky: " + feeling_lucky.to_s + "s"


starttime = Time.now
1_000_000.times do 
  n,d=0.5.fraction
end
endtime = Time.now
fractionmod=endtime-starttime
puts "fraction: " + fractionmod.to_s + "s"

starttime = Time.now
1_000_000.times do 
  n,d=[1,2]
end
endtime = Time.now
max_speed=endtime-starttime
n,d=(fractionmod-max_speed).fraction
puts "algorithm itself requires only #{n}/#{d} of a second for 1,000,000 iterations"

Filed under  //  ruby  

Comments (1)

Oct 28 / 6:25am

Want 50Mbps Internet in your town? Threaten to roll out your own

ISPs may not act for years on local complaints about slow Internet—but when a town rolls out its own solution, it's amazing how fast the incumbents can deploy fiber, cut prices, and run to the legislature.

Fantastic! It looks like the "digital divide" is reversing itself in dramatic fashion. Small towns are getting exponentially better internet service than people in the big cities.

Internet should be a service with some baseline quality expectations, and that the only way to provide this (especially in the markets with few incumbent players, like Toronto) is to provide some baseline of competition that raises the game out of the mud of deep packet inspection and excessive overage charges.

Filed under  //  competition   government   internet  

Comments (0)

Oct 22 / 6:08pm

Our Campfire

One of our many fires this year, but one of my faves.

Filed under  //  camping   video  

Comments (0)

Oct 13 / 4:37am

U.K. Press not Permitted to Report on Activities of Government

The Guardian has been prevented from reporting parliamentary proceedings on legal grounds which appear to call into question privileges guaranteeing free speech established under the 1688 Bill of Rights.

Today's published Commons order papers contain a question to be answered by a minister later this week. The Guardian is prevented from identifying the MP who has asked the question, what the question is, which minister might answer it, or where the question is to be found.

So what's this all about? A British company is dumping toxic waste in Africa. Not just any company either, Trafigura. It's one of those commodity companies that is raping the world for profit.

A boat chartered by the company, the Probo Koala, was caught dumping 528,000 litres of extremely alkaline waste off the Ivory Coast. The Guardian obtained internal Trafigura emails which are claimed to show the company knew the crap was toxic, but was dumping anyway. Now the Trafigura is going sue-happy with the help of their retained legal firm Carter-Ruck. They're trying to prevent this news from breaking, but the Internet is aware, now.

Right now we don't know why the British Parliament is blocking the next part of this story from breaking.
Filed under  //  evil   government   oil  

Comments (0)

Oct 8 / 4:39am

MacRuby » MacRuby 0.5 beta 1

The new MacRuby 0.5 runtime is built upon LLVM, a compiler infrastructure also sponsored by Apple. Thanks to LLVM, MacRuby is able to transform the Ruby abstract syntax tree (AST) from the parser directly into highly optimized machine code. MacRuby supports both Just in Time (JIT) and Ahead of Time (AOT) compilation. The JIT mode will compile down the code at runtime, and the AOT mode will allow you to save on disk the compilation result. AOT compilation makes MacRuby a true Ruby compiler.

I'm excited about the prospect of building cocoa apps in Ruby, and compiling everything down to objects. What's better than that? Well, they've fixed the concurrent performance of Ruby by sharding the global interpreter lock, and they threw in GCD for good measure. I believe developments like this herald the end of C/C++ hegemony. At some point in the near future, this will be the default method of building apps on OS X.

Filed under  //  os x   ruby  

Comments (0)

Oct 7 / 6:51am

Are Humans Bad at Concurrency?

I hear it all the time. Humans are bad at parallelism and concurrency. "It's just hard," they say. I say that's crap.

In fact, those people have it all backwards. Humans are immensely good at concurrent thought, and really bad at sequential thought.


Consider driving. Your brain is processing millions of things in an out-of-order manner, and producing continuous motions in your hands and feet that guide the car so perfectly that few would be surprised to hear of someone who has driven for a lifetime without a major accident. Our brain can learn this task!

Same deal with many concurrent activities, like having a conversation, or playing sports, or listening to music, writing, thinking about the future, or fixing the fridge. In every case, we set our massively parallel architecture on many problems simultaneously, and then integrate a solution in real time without deadlocks or timeouts. Not only can we learn these things, but we can excel at them, once learned. 

But we humans have a corresponding weakness for sequential thought. We find it very hard to write a piece of sequential software that lasts more than a week without crashing hard or suffering from a major design flaw. We need to be taught for decades in the most advanced institutions to think sequentially and logically. Only the most elite of us ever manage to produce something that others would actually pay for, and even then we may solve a different problem for people than the one we set out to solve. Watch Evan Williams' talk at TED embedded below for an example of how we can invent technology that gets used in non-expected ways.


Then we try to make people trained in sequential thought solve parallel problems, and they come up with steamy piles of tangled mess, full of deadlocks, races, and side-effects.

Our default state is concurrent thought. We've all been trained to think otherwise, by our computers, languages, and education. We're hard on the poor folks who were carefully trained as sequentialists when they fail to make a parallel problem easy on sequential machines.

By day, I work on a compiler for sequential source-code, but my personal long-term goal is to create a compiler for a language that can form the kernel for a new school of thought separate from the sequentialist mode of thought. As hardware evolves, it will only become more like our own brains, and less like calculators and simple programmable machines.
Filed under  //  concurrency  

Comments (0)

Oct 6 / 5:19am

The Demise of the Dollar

In a graphic illustration of the new world order, Arab states have launched secret moves with China, Russia and France to stop using the US currency for oil trading

This looks like the first step towards a pan-asian economic bloc, much like the eurozone. This new denomination would be a formidable competitor for the Euro and the Dollar.

Filed under  //  economy  

Comments (0)