LiveJournal for Bill Moorier.

View:User Info.
View:Website (abstractnonsense).
You're looking at the latest 20 entries. Missed some entries? Then simply jump back 20 entries.

Saturday, September 25th, 2010

Subject:New blog
Time:1:42 pm.
I don't post anything to this blog any more. My new blog, essentially a journal of progress on side-projects ("pre-hacks" you could say), is at
Comments: Read 1 or Add Your Own.

Thursday, December 17th, 2009

Subject:Six months at a startup
Time:11:30 am.
This time of year always makes me a little nostalgic so it's of no great surprise that this morning, sitting on the couch eating breakfast, I started digging through gmail to look at some of the first emails I sent while working at in September of 2007.

I guess I got a little carried away, and decided to write down everything significant that I worked on in the first six months, just to see what it would look like. Those six months don't seem like a long time now, but I was amazed by how much we got done during them. Here's what I found:


I wrote the jtv chat server. This is still in production, and has scaled to more than half a million concurrent chatters. This was the first piece of Python code I ever wrote. Before joining jtv my day-job was writing Java, but I really considered myself a Lisp guy. I think Python is ok now, but back then I complained about it a lot!

I also set up the first basic uptime monitoring system for jtv. This was a bunch of bash scripts on a cron job, doing things like trying to wget important pages on our site every few minutes and sending us emails when things broke. It was eventually replaced with better solutions like Nagios, but did the job well enough at the time.


Looks like I spent a lot of October securing the chat server against various script-kiddie attacks. If you ever run an IRC server, expect it to get hammered by people trying to break it!

I wrote the jtv realtime search engine. This is still in production. Kenny and Eric have both worked on it, but the overall structure is the same as when I originally wrote it. At one point Emmett mentioned our search engine is one of the N biggest in the world, where N was some surprisingly low number that I can't remember now.

I also wrote the "Schedule". This was a TV-Guide-style interface that pulled together the most popular channels from jtv and displayed all of their upcomming broadcasts in a grid format like the ones in TV magazines. We ditched it eventually, when jtv got into the thousands of broadcasts per day and it didn't really make sense anymore, but for a while it was my favorite way of finding good stuff to watch.


I started "HackerTV" - a series of live tech talks that we broadcasted from our office with well-known guest speakers. This was reasonably successful until I got too busy to schedule talks - doing that well takes a surprising amount of effort!

I also implemented MRSS feeds for all of our clip content. This allowed us to integrate with a bunch of video search engine sites. Getting the MRSS feeds to work was surprisingly hard. The MRSS standard was pretty loosely specified, and it seemed like everyone we wanted to integrate with had a different idea about how MRSS should work! In the end I think we had integrations with half a dozen or so big sites. I don't think we ultimately got very much traffic from them though, so the MRSS feeds died eventually.


I helped to implement the jtv "social network" - i.e. the ability to add friends and favorites, and maintain a profile page, etc. This was the first time I'd really worked in tandem with a designer (Jacob), and the first time I had written any Ruby/Rails code. I think it worked out pretty well, although I didn't like Ruby very much in comparison to Python.

I wrote the "I'm Watching" widget. This was something you could put on your own website (blog, myspace, etc) that would tell people what you were watching on jtv right now. I think it drove a fair amount of traffic, but not enough for us to bother scaling it when we really started to grow, so we killed it in the end.

I tracked down some bad network problems to a pair of very cheap Dell switches that were sitting in front of the whole website! At this point they were dropping packets all over the place and couldn't handle the load, so Kyle and I replaced them with something bigger and better.

I got an OLPC delivered to me on Christmas day, and spent that evening playing with it. It turned out to be able to view jtv, including live streams without any problems!


I spent a lot of January iterating on things that were already released - for example adding notifications to the chat system so people would get an instant message when one of their favorite channels went live. We were also just starting to see some faint glimmers of growth, so I spent some time scaling chat and search when they started getting too slow.

The big new feature I found time to write was a youtube importer and video playlist system. This allows users to grab videos from youtube and put them into a playlist that gets played on their jtv channel any time they're not broadcasting live. The front-end part of this was the first piece of Flash code I had ever written (using Adobe CS3, an IDE that I quickly learned to hate!). The whole thing was quite successful, and is still in use today - mostly unchanged.


We started seeing some real growth in Febuary. So much in fact that I had to scramble to get chat scaled from one server to a cluster of N servers. I did most of that work in a single weekend, and it worked well enough - but of course I then spent the rest of the month chasing down the inevitable bugs that come from scaling something so quickly! By the end of the month though, chat was rock-solid.

So that's it - my first six months of startup work at jtv. Good times!
Comments: Add Your Own.

Tuesday, October 20th, 2009

Subject:The worst thing (for me) about living in America, and working at a startup.
Time:10:08 am.
This summer I developed a bunch of symptoms that were really quite scary: Short-term memory loss, deja-vu, a frequent feeling of having just regained consciousness, and a general fog of confusion. I even developed a stutter - something I've never had until now, at 33 years old. I didn't feel too good, and of course went to a doctor.

So the doctor listens to everything, and wants to rule out two rather nasty potential causes: tumors and seizures. Referrals are made, and we get a bunch of tests - an MRI, an EEG, lots of blood-work, etc. In time, everything comes back ok. At the end of it all the doctors tell me they're confident this is stress-related. My mind is rebelling and playing tricks on me. I need to learn to relax. Fine - I start learning to meditate, we get a Wii and play it lots, long walks are taken in the evenings. Fun is had, and the symptoms start easing-off a little.

And then the bills start to arrive. Well, that's ok - things are tight but even though I work at a startup we do have health insurance. Once we hit our $3000 deductible, the insurance will kick-in and save us from financial ruin. Right? No, of course not.

What actually happens is that we pay our $3000 deductible quite quickly, and then start getting letters from the insurance company helpfully explaining that many of the costs I just incurred aren't "medical" expenses, they're "cognitive" expenses. An interesting distinction that they say means they're only going to pay 40%, and we'll need to come up with the other 60% ourselves.

So at this point, as far as I'm concerned, this health insurance business is some kind of a nasty scam. But, as far as I can tell, this is just par for the course in the US. Health insurance seems ok until you have to actually use it. My wife and I now frequently debate whether it's bad enough that we will have to move back to Europe soon (we're planning a family - will our pregnancy and childbirth expenses be "medical"?).

I have very fond memories of the NHS, and my wife says the French system is even better. I wish America would just steal some good ideas from any other first-world country. Apparently that's very unlikely though. I don't think I'll ever understand why, even if I live in this country for the rest of my life. The people are certainly decent enough, but the politics are insane.
Comments: Read 2 or Add Your Own.

Monday, September 21st, 2009

Subject:I had my head examined
Time:11:23 am.
My doctor recently recommended an MRI to rule-out a couple of potential conditions. The scan came back completely normal, which was a great relief! As a kind of cathartic exercise, and inspired by Dustin Curtis's brain tour, I decided to do something with the images. I spent most of a fun weekend writing this MRI explorer.
Comments: Read 2 or Add Your Own.

Wednesday, September 2nd, 2009

Time:6:33 am.
Clojure is a lot of fun so far. I got SLIME to talk to it pretty easily just by following these instructions (skipping the Ubuntu-specific stuff, which is not much at all - just about everything worked the same on OS X).

This video is a great intro for people who already know lisp.

I think it might be time for a clutu rewrite!
Comments: Add Your Own.

Sunday, May 3rd, 2009

Subject:Finished grinding and tuning the xylophone bars.
Time:11:52 am.
I used my Dremel to get all the ends nice and smooth, and fine-tuned each note (by ear, using GarageBand's virtual keyboard). They sound great!

Comments: Add Your Own.

Saturday, May 2nd, 2009

Subject:The bells!
Time:6:47 pm.
I finally got back into working on the xylophone today. Finished cutting the last of the bars - I now have everything from G3 to D6. Tomorrow I'll grind the ends smooth and fine-tune each one.
Comments: Add Your Own.

Sunday, March 1st, 2009

Time:5:56 pm.
We are hiring (talented, highly motivated) programmers again. Take a look at our jobs page, and email if you're interested.

Comments: Add Your Own.

Thursday, February 26th, 2009

Subject:Stunningly beautiful
Time:2:59 pm.
It's very rare that I like a Beatles cover more than the original. Here's one.

The whole movie is fantastic all round.
Comments: Add Your Own.

Thursday, February 5th, 2009

Subject:Unit testing is not (generally) useful
Time:7:29 am.
There was an interesting thread on Hacker News recently, about whether unit testing is a useful thing to do. Paul Buchheit weighed in:

"I'll make a somewhat heretical claim even: Unit test are 20% useful engineering, and 80% fad. They are great for tricky code with well defined behavior (like a parser), but wasteful for most code."

Actually I don't think that's heretical any more, at least not among the programmers I know well.

The metric I, and others I know, have used to judge unit testing is: does it find bugs? The answer has been no. For the majority of the code I write, it certainly doesn't find enough bugs to make it worth the investment of time.

Here are some things that find bugs for me (I should mention I'm the VP of Software Development at Justin.TV - I have lots of code in production, in daily use by millions of people. Importantly, the code doesn't have a formal specification and never could have one, otherwise we would never make any progress!):
  • User reports
  • Automated monitoring systems
  • Logging
  • Testing with simulated high load, and/or randomized inputs
I don't do any unit testing at all. Compared to these things, it's just not effective at finding bugs.

Here's an analogy that explains why I think unit testing hasn't been widely successful outside of a few niches like parsers and very well specified libraries. Like all analogies it isn't perfect, but it may be useful anyway. Suppose instead of computer programs, we are interested in the health of people. Our practitioners are now medical doctors, rather than programmers.
  • User reports correspond to a patient going to the doctor and telling him something doesn't seem right
  • An automated monitoring system would be something like a portable ECG machine that's hooked up to your doctor's pager (how long before we're all wearing one?)
  • Logging is like your medical history. Except the doctor can specify an arbitrary level of detail, and change the stuff that gets logged whenever he wants... that seems very useful!
  • I don't think any doctor tests peoples' limits, or feeds them random stuff to see what will happen. People crashing is much more expensive than programs crashing
  • Unit testing is something like your doctor checking that you have exactly one head (must not violate the singleton property!)
Of course I'm being facetious with the last one. In this analogy, unit testing is something more like genetic testing of an embryo before the patient is born. I think that holds up pretty well, and explains why unit testing isn't as useful as the other things at figuring out what's wrong with programs. It just doesn't cover a large enough class of potential problems to be generally useful.
Comments: Read 48 or Add Your Own.

Thursday, January 22nd, 2009

Subject:Lispdoc and Clutu
Time:2:43 pm.
Apparently people use lispdoc and clutu quite a bit (according to the access logs), despite me not having worked on them for a long while - startups have a habit of soaking up spare time!

So this is just a note to let people know that I'm moving (from Mountain View to San Francisco) and those sites will go down for a bit this Saturday because they're hosted on a server that lives in my house ;-)
Comments: Read 1 or Add Your Own.

Tuesday, January 20th, 2009

Subject:Definition of a startup
Time:10:44 am.
I've been working recently on a new video ads system for Justin.TV, and I've put quite a bit of effort into the code that decides what ads to show on each video stream. So I was pleased to see this ad on officecam, a webcam that's in the Justin.TV office.

"Surviving the Long Emergency" could almost be the definition of life in a startup!

Comments: Add Your Own.

Sunday, December 28th, 2008

Subject:First bars cut
Time:5:54 pm.
Tatiana bought me some awesome tools for Christmas, so I was able to cut the first bars for my robot xylophone today.

The first vice (a Stanley) broke while I was tightening it - one of the bolts sheared off. I was surprised - I've always associated Stanley with high-quality. Anyway, I picked up a random no-brand vice from Home Depot that was much heavier duty, and finished off the job with that. The saw (made by Skil, who I've never heard of before) is awesome. It cuts through the .25in aluminium bars very easily.

I cut 18 bars before the light got too dim to work by. I think I should be able to finish the rest in one more day. The ends are pretty rough, so I'll have to grind them, which I'll do at the same time as fine-tuning each note.

The power saw will also be able to cut the 2x4 piece of pine I have for the frame. I haven't decided how I'm going to arrange the bars and motors yet - that will be a fun piece of geometric planning!
Comments: Read 8 or Add Your Own.

Monday, December 1st, 2008

Time:9:12 am.
This is the latest in a series of posts about a robot xylophone I'm building. Start here.

Here's the basic plan of the robot xylophone I'm working on: The brain will be the Arduino I built this weekend. It has 32 outputs, which will control 32 motors, each connected to some kind of hammer for hitting 32 aluminium bars.

I asked Kyle and Eric to help me figure out power supply details, as the motors I'm buying run on 3VDC and the Arduino runs on 6-24VDC. Kyle suggested I use a 7-9v DC power supply (110VAC input), and a 3V voltage regulator, in a TO220 package or larger so it can dissipate all the heat. Eric added that I should put a diode and a capacitor in parallel with the output of the regulator, to protect it (and the Arduino) from back-emf generated by the motors.

Great! Next step is to get the bars cut. I'm not sure when I'll be able to do that, as I don't have the tools myself, so I'll need to go to OSH or somewhere like that and ask them to do it. Maybe next weekend.
Comments: Add Your Own.

Saturday, November 29th, 2008

Subject:Equal temperament
Time:4:27 pm.
This is the latest in a series of posts about a robot xylophone I'm building. Start here.

I've figured out where the numbers in the scale_frequencies table come from. I'm really glad I decided to do this from scratch, as there are some large errors in the original. One frequency is off by 100Hz!

The scale we use for most modern western music is called "Equal temperament" (sometimes twelve tone equal temperament, as other numbers are possible). I remembered this much, and the wikipedia page told me everything else I needed to know.

You start by defining an octave to be a doubling in frequency, and pinning down one reference frequency. We decided on A4 ('middle A'), as exactly 440Hz. So A5 is twice that, 880Hz, and A3 is half of it, or 220Hz.

From there, you further divide each octave into twelve equal pieces. But, because of the way our ears work, you don't divide equally by adding a step to the previous frequency to get the next, you need to multiply by something instead.

If we have twelve pieces in one octave, the multiplier has to be 12√2 (multiply that number together twelve times, and you'll get 2, which is an octave).

So to get the frequency of any note from the reference note, we need to multiply or divide by 12√2 a number of times depending on how far our note is from the reference note.

Here's a program I just wrote for generating the table:
western_notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
reference_index = (4 * 12) + western_notes.index("A") # A4
reference_frequency = 440
scale_frequencies = []

for i in range(120):
    f = 440 * pow(2, (i - reference_index) / 12.0)
I still don't know why we chose the note names we did (why we sometimes follow N with N#, and other times with M). If I understand correctly, the choice of 12 in our scale was made because groups of notes that are thirds, or fourths sound good to us, and dividing the scale into 12 this way allows us to approximate perfect thirds and fourths well. You could have an instrument that would play really perfect thirds and fourths, but it would only be able to do it in a single fixed key. The ET system with 12 divisions means we can play any key we want. I think I have that right, but I haven't finished reading the article yet!
Comments: Read 1 or Add Your Own.

Friday, November 28th, 2008

Subject:Notes, waves and lengths.
Time:2:46 pm.
Here's a program I just wrote to compute the lengths of bars needed to make my xylophone. I don't understand everything yet, but it's a good start!

I figured most of this out by reading a section of the "Making Wind Chimes" guide, named "Tuning the Other Chimes". The method is given with no explanation, so I've just implemented it for now, and will figure out why it works soon.

Other things I don't understand yet:
  • Why are the notes in the western scale named the way they are? Why do we sometimes go from note N to N#, but other times we go from N to M?
  • How do we generate the scale_frequencies table from scratch?
Here's the program:
from math import sqrt

western_notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
scale_frequencies = [16, 17, 18, 19, 21, 22, 23, 24, 26, 28, 29, 31,
                     33, 35, 37, 39, 41, 44, 46, 49, 52, 53, 58, 62,
                     65, 69, 73, 78, 82, 87, 92, 98, 104, 110, 117, 123,
                     131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247,
                     262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494,
                     523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988,
                     1047, 1109, 1174, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1965, 1976,
                     2093, 2217, 2344, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951,
                     4186, 4435, 4699, 4978, 5274, 5588, 5920, 6271, 6645, 7040, 7459, 7902,
                     8372, 8870, 9397, 9956, 10548, 11175, 11840, 12542, 13290, 14080, 14917, 15804]

reference_length = float(input("Length of reference bar, in mm: "))
reference_note =  raw_input("Note played by reference bar (C ... B): ").upper()
reference_octave =  input("Octave played by reference bar (0 ... 9, 'middle C' is in octave #4): ")
reference_frequency = 1.0 * scale_frequencies[western_notes.index(reference_note)
                      + reference_octave * 12]

print "Your reference bar has a frequency of %sHz." % int(reference_frequency)

for i in range(len(scale_frequencies)):
    octave, note = divmod(i, 12)
    frequency = scale_frequencies[i]
    length = reference_length * sqrt(reference_frequency / frequency)
    print "%s%s = %sHz = %.1fmm" % (western_notes[note], octave, frequency, length)
One of my pieces of aluminium bar is 13mm diameter, 189mm long, and generates a nice pure G4 (I figured out what it was just by using the virtual keyboard that's in Garage Band). Soon I want to be able to derive these numbers from things like the speed of sound in aluminium, but for now I'll just plug them into the program:

bills-home-laptop:~ wjb$ python
Length of reference bar, in mm: 189
Note played by reference bar (C ... B): g
Octave played by reference bar (0 ... 9, 'middle C' is in octave #4): 4
Your reference bar has a frequency of 392Hz.
C0 = 16Hz = 935.5mm
C#0 = 17Hz = 907.6mm
D0 = 18Hz = 882.0mm
D#0 = 19Hz = 858.5mm
E0 = 21Hz = 816.6mm
F0 = 22Hz = 797.8mm
F#0 = 23Hz = 780.3mm
G0 = 24Hz = 763.8mm
G#0 = 26Hz = 733.9mm
A0 = 28Hz = 707.2mm
A#0 = 29Hz = 694.9mm
B0 = 31Hz = 672.1mm
C1 = 33Hz = 651.4mm
C#1 = 35Hz = 632.5mm
D1 = 37Hz = 615.2mm
D#1 = 39Hz = 599.2mm
E1 = 41Hz = 584.4mm
F1 = 44Hz = 564.1mm
F#1 = 46Hz = 551.7mm
G1 = 49Hz = 534.6mm
G#1 = 52Hz = 518.9mm
A1 = 53Hz = 514.0mm
A#1 = 58Hz = 491.3mm
B1 = 62Hz = 475.2mm
C2 = 65Hz = 464.1mm
C#2 = 69Hz = 450.5mm
D2 = 73Hz = 438.0mm
D#2 = 78Hz = 423.7mm
E2 = 82Hz = 413.2mm
F2 = 87Hz = 401.2mm
F#2 = 92Hz = 390.1mm
G2 = 98Hz = 378.0mm
G#2 = 104Hz = 366.9mm
A2 = 110Hz = 356.8mm
A#2 = 117Hz = 345.9mm
B2 = 123Hz = 337.4mm
C3 = 131Hz = 326.9mm
C#3 = 139Hz = 317.4mm
D3 = 147Hz = 308.6mm
D#3 = 156Hz = 299.6mm
E3 = 165Hz = 291.3mm
F3 = 175Hz = 282.9mm
F#3 = 185Hz = 275.1mm
G3 = 196Hz = 267.3mm
G#3 = 208Hz = 259.5mm
A3 = 220Hz = 252.3mm
A#3 = 233Hz = 245.1mm
B3 = 247Hz = 238.1mm
C4 = 262Hz = 231.2mm
C#4 = 277Hz = 224.8mm
D4 = 294Hz = 218.2mm
D#4 = 311Hz = 212.2mm
E4 = 330Hz = 206.0mm
F4 = 349Hz = 200.3mm
F#4 = 370Hz = 194.5mm
G4 = 392Hz = 189.0mm
G#4 = 415Hz = 183.7mm
A4 = 440Hz = 178.4mm
A#4 = 466Hz = 173.3mm
B4 = 494Hz = 168.4mm
C5 = 523Hz = 163.6mm
C#5 = 554Hz = 159.0mm
D5 = 587Hz = 154.4mm
D#5 = 622Hz = 150.0mm
E5 = 659Hz = 145.8mm
F5 = 698Hz = 141.6mm
F#5 = 740Hz = 137.6mm
G5 = 784Hz = 133.6mm
G#5 = 831Hz = 129.8mm
A5 = 880Hz = 126.1mm
A#5 = 932Hz = 122.6mm
B5 = 988Hz = 119.0mm
C6 = 1047Hz = 115.6mm
C#6 = 1109Hz = 112.4mm
D6 = 1174Hz = 109.2mm
D#6 = 1245Hz = 106.1mm
E6 = 1319Hz = 103.0mm
F6 = 1397Hz = 100.1mm
F#6 = 1480Hz = 97.3mm
G6 = 1568Hz = 94.5mm
G#6 = 1661Hz = 91.8mm
A6 = 1760Hz = 89.2mm
A#6 = 1965Hz = 84.4mm
B6 = 1976Hz = 84.2mm
C7 = 2093Hz = 81.8mm
C#7 = 2217Hz = 79.5mm
D7 = 2344Hz = 77.3mm
D#7 = 2489Hz = 75.0mm
E7 = 2637Hz = 72.9mm
F7 = 2794Hz = 70.8mm
F#7 = 2960Hz = 68.8mm
G7 = 3136Hz = 66.8mm
G#7 = 3322Hz = 64.9mm
A7 = 3520Hz = 63.1mm
A#7 = 3729Hz = 61.3mm
B7 = 3951Hz = 59.5mm
C8 = 4186Hz = 57.8mm
C#8 = 4435Hz = 56.2mm
D8 = 4699Hz = 54.6mm
D#8 = 4978Hz = 53.0mm
E8 = 5274Hz = 51.5mm
F8 = 5588Hz = 50.1mm
F#8 = 5920Hz = 48.6mm
G8 = 6271Hz = 47.3mm
G#8 = 6645Hz = 45.9mm
A8 = 7040Hz = 44.6mm
A#8 = 7459Hz = 43.3mm
B8 = 7902Hz = 42.1mm
C9 = 8372Hz = 40.9mm
C#9 = 8870Hz = 39.7mm
D9 = 9397Hz = 38.6mm
D#9 = 9956Hz = 37.5mm
E9 = 10548Hz = 36.4mm
F9 = 11175Hz = 35.4mm
F#9 = 11840Hz = 34.4mm
G9 = 12542Hz = 33.4mm
G#9 = 13290Hz = 32.5mm
A9 = 14080Hz = 31.5mm
A#9 = 14917Hz = 30.6mm
B9 = 15804Hz = 29.8mm

Nice. Obviously I don't want bars as long as 900mm, or as short as 29mm (and the Arduino I'm using has only 32 outputs anyway) so I'll have to figure out a sensible subset of these to use.
Comments: Read 2 or Add Your Own.

Subject:The robot has a brain
Time:12:42 pm.
Just finished building the Arduino (it's actually a Sanguino - it has 32 in/out pins). It was insanely easy and gratifying. I'd thoroughly recommend it for anyone who wants to get into hardware hacking.

The only tools I needed were things I already had: A soldering iron, some solder, wire-cutters, and a clamp with two handy clips for holding things in place. Here are some photos:

If you don't already know how to solder, don't be intimidated - it's really quite easy, and there are many good guides online.

The software part of this was very easy too - I just followed the instructions. One point to note is that the Sanguino has its debug LED on pin 0, so you need to edit the "does it work?" example program before uploading it.
Comments: Read 2 or Add Your Own.

Subject:Robot xylophone ftw
Time:10:03 am.
I am building a xylophone.

As an engineer, you might understand this has certain consequences that are going to make this a rather large project.

The first one is, of course, it has to be a robot xylophone. Anything less would be a disappointment.

The second one is that I have to really understand how the whole thing works.

So today I am:
  • Building an Arduino, to control the "robot" bits
  • Writing a program to compute the lengths of pipe I'll need for each note
A note for the purists: Yes, I know full well it's actually called a glockenspiel when you're building it from metal, and I don't care. Xylophone just sounds better ;-)

I'll try to remember to tag these posts xylophone, if you want to follow them.
Comments: Add Your Own.

Saturday, November 15th, 2008

Subject:Justin.TV as a country
Time:11:58 am.
Justin.TV signed up its 2.5 millionth user today.

Because 2.5 million isn't a number that's very easy to imagine, I went in search of things to compare it to. I found this list of countries by population.

It turns out JTV is bigger than a lot of countries. In fact, if JTV was a country, it would be the 140th most populous in the world, out of 222 countries. Slightly bigger than Latvia, and a little smaller than Oman.

At our current growth rate, the next few weeks will see JTV get bigger than Mongolia (2,629,000), Jamaica (2,714,000) and then Kuwait (2,851,000).
Comments: Read 1 or Add Your Own.

Tuesday, October 7th, 2008 live player
Time:5:42 pm.
I'm making good progress on the live player rewrite. The new player is a lot more robust, and has a ton of nice bug-fixes and polish. Of course, being a complete rewrite, it's bound to have a bunch of new bugs.

Overall I'm still happy with haxe. Its frankly retarded type system does slow me down from time to time, but I guess you can't have everything.

Comments: Read 3 or Add Your Own.

LiveJournal for Bill Moorier.

View:User Info.
View:Website (abstractnonsense).
You're looking at the latest 20 entries. Missed some entries? Then simply jump back 20 entries.