Archive for March, 2005

neighborhood stereo system

Monday, March 21st, 2005

This post doesn’t exist.

Changes to default Ubuntu “Hoary Hedgehog” preview release on a Sharp MP30

Sunday, March 20th, 2005

Recently, I bought a Sharp Actius MP30 laptop and installed Linux on it. I installed the default Ubuntu “Hoary Hedgehog” preview release. As far as I can tell, everything except the wireless card works out of the box, though I did have to add i8042.nomux as a kernel option in grub to get the trackpad to work, as suggested by some guy named Carl at Cameltail. He’s managed to get the wireless working under Slackware, but I haven’t yet.

There’s a good burrito at Rengstorff and Middlefield

Sunday, March 20th, 2005

La Costena
Los Altos Taqueria
La Bamba

These three burrito shops all do business at the same intersection in Mountain View, CA. Los Altos Taqueria is my default choice– an excellent burrito and horchata for cheap, plus free chips and decent seating. La Costena has the best carne asada burrito I’ve ever eaten, but they’re slightly more expensive, and your seating choices are either inside a convenience store or on a narrow walkway next to Rengstorff. On a warm day, you can sit on the grass at the dental plaza across the street. La Bamba is not a favorite of mine– it’s generally cold, the seats all face the wall, and the burritos are both slightly pricy and slightly spicy for my tastes.

Ramon’s El Burrito Real Rengstorff Avenue, Mountain View, CA

Employing some of the same fine burrito makers as La Costena (e.g. “Catarino”), Burrito Real is somehow not as tasty as La Costena. They do have a lot of seating though, so it’s a good place on a rainy day with friends. It’s too bad it doesn’t rain very often in California, and I have so few friends.

Mariachi’s Valencia between 16th and 17th in San Francisco, CA

An excellent burrito. After they wrap up the good stuff in the tortilla, they put the burrito back on the grill.

Gordo’s

A series of 7 outstanding taquerias around San Francisco and the East Bay.

Andale Taqueria University Avenue, Palo Alto, CA

Expensive but crowded.

The Treehouse Stanford University, next to Palo Alto, CA

Vile–do not visit. A Stanford tradition since 2000.

Senor Taco El Camino Real, Palo Alto, CA

On the way to Fry’s Electronics, but not that great. Not too pricey and yet not that crowded.

High Tech Burrito Solano Avenue, Berkeley, CA

A decent burrito, if you don’t mind feeling like a cog in a robot’s intestinal system.

Anna’s Taqueria Somerville Avenue, Cambridge, MA

Anna’s is a decent taqueria, even by California standards. I read in the MIT newspaper that Anna’s is run by a relative of the family that runs Gordo’s in the San Francisco area.

Boca Grande

My favorite taqueria in the greater Boston metropolitan area. Their carne asada is not particularly good, but the guacamole is outstanding. $5.51 for a great super burrito. I heard a rumor that Boca Grande was run by an estranged relative of the people who run Anna’s.

Tacos Lupita

El Salvadorean burritos. Like Boca Grande, the carne asada is not that good, but the guacamole is great. Generally, I don’t think the people at the counter understand my order, but they usually bring me something tasty anyway.

Karlita’s Redwood City, CA

A great burrito, but not open late. Karlita is the daughter of the family that runs the restaurant. I met her once.

Del Taco S. Euclid Avenue, Ontario, CA

Strangely, this franchise is where my burrito addiction began.

A network of anonymous remailers

Saturday, March 19th, 2005

This post has not been written yet.

Nike Considered

Saturday, March 19th, 2005

Nike has a new line of shoes called “Considered.”

Muzak at Via Lago

Thursday, March 17th, 2005

03-17-05_1232.jpg
I noticed these knobs on the wall at Via Lago, an expensive sandwich shop in downtown Lexington. When I turned the knob on the right, the background music near the backdoor got louder. I didn’t realize that you could buy an integrated Muzak system– I thought you just got CDs in the mail or a secret radio broadcast or something.

UsefulProg 0.1

Monday, March 14th, 2005

As a documentation enthusiast, I find myself needing to change documents from one silly format to another on regular basis. Usually, I end up writing stupid Perl scripts to convert from one format to another, but I can never remember Perl syntax between efforts. I swear I’ve written the same text parsing code 4 times, and it hasn’t gotten easier.

In an effort to end this depressing cycle, I spent some time this afternoon learning a little wxPython to make what I call UsefulProg. UsefulProg reads in a text file. You enter some regular expressions, and then it filters the file with those expressions. When you screw up (like I always do), you hit the reset button, and it erases your mistakes. When you get the filters working the way you want, you cut and paste the result into wherever you need it.

Here’s the code under a GPL license. It’s based on an example from the wxPython documentation.

from wxPython.wx import *
import os
import re

class Form1(wxPanel):
    def __init__(self, parent, id):
        wxPanel.__init__(self, parent, id)

        self.logger = wxTextCtrl(self,5, \"\",wxPoint(250,20), wxSize(250,100),wxTE_MULTILINE | wxTE_READONLY)

        #The input file display
        self.inputlbl = wxStaticText(self,-1, \"Input file\",wxPoint(20,5))
        f = open(\"/home/brandon/Python Experiments/dd_tpb.txt\", \"rb\")
        self.inputfield = wxTextCtrl(self,6,f.read(),wxPoint(20,20), wxSize(200,700),wxTE_MULTILINE | wxTE_READONLY)

        #The output file display
        self.outputlbl = wxStaticText(self,-1, \"Output file\",wxPoint(550,5))
        self.outputfield = wxTextCtrl(self,6,\"\",wxPoint(550,20), wxSize(500,700),wxTE_MULTILINE | wxTE_READONLY)
        self.outputfield.write(self.inputfield.GetValue())

        # The filter button
        self.button =wxButton(self, 11, \"Filter\", wxPoint(300, 200))
        EVT_BUTTON(self, 11, self.EvtFilterButton)

        # The reset button
        self.button =wxButton(self, 12, \"Reset\", wxPoint(300, 240))
        EVT_BUTTON(self, 12, self.EvtResetButton)

        # the edit control - one line version.
        self.regexsample = wxStaticText(self,-1, \"Useful: [D|d]*? is non greedy match anything\",wxPoint(250,320))
        self.lblname1 = wxStaticText(self, -1, \"Removal string 1 :\",wxPoint(250,380))
        self.filter1 = wxTextCtrl(self, 20, \"(Rate[D|d]*?mments:n\", wxPoint(400, 380), wxSize(140,-1))

        self.lblname2 = wxStaticText(self, -1, \"Removal string 2 :\",wxPoint(250,480))
        self.filter2 = wxTextCtrl(self, 20, \" *pixel\", wxPoint(400, 480), wxSize(140,-1))

        self.lblname3 = wxStaticText(self, -1, \"Removal string 3 :\",wxPoint(250,580))
        self.filter3 = wxTextCtrl(self, 20, \"d+?. 	nt\", wxPoint(400, 580), wxSize(140,-1))

        self.filtlblA = wxStaticText(self, -1, \"Removal string 4 :\",wxPoint(250,680))
        self.filterA = wxTextCtrl(self, 20, \"nDare\", wxPoint(400, 680), wxSize(140,-1))
        self.replblA = wxStaticText(self, -1, \"Replacement string 4 :\",wxPoint(250,730))
        self.newtextA = wxTextCtrl(self, 20, \"nnDare\", wxPoint(400, 730), wxSize(140,-1))

    def OnClick(self,event):
        self.logger.AppendText(\" Click on object with Id %dn\" %event.GetId())
    def EvtText(self, event):
       self.logger.AppendText(\"\") #('EvtText: %sn' % event.GetString())
    def EvtChar(self, event):
        self.logger.AppendText(\"\")
        event.Skip()
    def EvtFilterButton(self, event):
        text = self.outputfield.GetValue()

        filter = self.filter1.GetValue()
        text, reps = re.subn(filter,\"\",text)
        self.outputfield.Clear()
        self.outputfield.write(text)
        self.logger.AppendText(\"%d removals made with filter 1n\" % reps)

        filter = self.filter2.GetValue()
        text, reps = re.subn(filter,\"\",text)
        self.outputfield.Clear()
        self.outputfield.write(text)
        self.logger.AppendText(\"%d removals made with filter 2n\" % reps)

        filter = self.filter3.GetValue()
        text, reps = re.subn(filter,\"\",text)
        self.outputfield.Clear()
        self.outputfield.write(text)
        self.logger.AppendText(\"%d removals made with filter 3n\" % reps)

        filter = self.filterA.GetValue()
        newtext = self.newtextA.GetValue()
        text, reps = re.subn(filter,newtext,text)
        self.outputfield.Clear()
        self.outputfield.write(text)
        self.logger.AppendText(\"%d replacements made with filter An\" % reps)        

    def EvtResetButton(self, event):
        self.outputfield.Clear()
        self.outputfield.write(self.inputfield.GetValue())

app = wxPySimpleApp()
frame = wxFrame(None, -1,\" UsefulProgPRO\",(100,100),(1100,800))
Form1(frame,-1)
frame.Show(1)
app.MainLoop()

Daredevil

Sunday, March 13th, 2005

h3. Volume 1

*Daredevil Visionaries: Frank Miller, Vol. 1* by Frank Miller, issues 158-161, 163-167, originally published in 1979-1980.

*Daredevil Visionaries - Frank Miller, Vol. 2* by Frank Miller, issues 168-182, originally published in
1981-1982. Story and art by Frank Miller.

*Daredevil Visionaries - Frank Miller, Vol. 3* by Frank Miller, issues 183-191, originally published in 1982-1983, Bizarre Adventures #28 and| |two What If? stories. Story and art by Frank Miller.

table{border:1px solid black}.
|*Daredevil: Loves Labor Lost* by Dennis O’Neil, et al, issues 215-217, 219-222, 225-226, originally published in 1985-1986.|

*Daredevil Legends Vol. 1: Yellow* by Jeph Loeb and Tim Sale (not actually from DD Vol. 1)

*Daredevil Legends Vol. 2: Born Again* by Frank Miller, issues 227-233, originally published in 1986.

*Daredevil Legends Vol. 3: The Man Without Fear* by Frank Miller, John Romita (not actually from DD Vol. 1)

table{border:1px solid black}.
|*Daredevil Legends Vol. 4: Typhoid Mary* by Ann Nocenti, John Romita, issues 254-257,259-263, originally published in
1988-1989.|

table{border:1px solid black}.
|*Daredevil: The Fall of the Kingpin* by D.G. Chichester, issues 297-300, originally published in
1991-1992.|

table{border:1px solid black}.
|*Daredevil: Fall from Grace* by Dan Chichester, issues 319-325, originally published in
1993-1994.|

h3. Volume 2 (mostly Bendis)

*Daredevil Visionaries - Kevin Smith, Vol. 1: Guardian Devil* by Kevin Smith, issues 1-8, originally published in 1998-1999.

*Daredevil - The Man Without Fear, Volume 2 (Marvel Knights)* by David Mack, issues 9-15, originally published in 1999-2001.

table{border:1px solid black}.
|*Daredevil Vol. 3: Wake Up* by Brian Michael Bendis, David Mack,|
|issues 16-19, originally published in 2001.|

*Daredevil Vol. 4: Underboss* by Brian Michael Bendis, Alex Maleev, issues 26-31, originally published in 2001-2002.

*Daredevil Vol. 5: Out* by Brian Michael Bendis, issues 32-40, originally published in 2002-2003. Two story arcs: “Out” and “Trial of the Century”.

*Daredevil Vol. 6: Lowlife* by Brian Michael Bendis, issues 41-45, originally published in 2003.

*Daredevil Vol. 7: Hardcore* by Brian Michael Bendis, Alex Maleev, issues 46-50, originally published in 2003.

*Daredevil Vol. 8: Echo - Vision Quest* by David Mack , issues 51-55, originally published in 2003-2004.

*Daredevil Vol. 9: King of Hell’s Kitchen* by Brian Michael Bendis, issues 56-60, originally published in 2004.

*Daredevil Vol. 10: The Widow* by Brian Michael Bendis, Alex Maleev, issues 61-66, originally published in 2004, plus Daredevil #81 from 1971.

table{border:1px solid black}.
|*Daredevil Vol. 11: Golden Age* by Brian Michael Bendis, Alex Maleev|
|issues 67 +, originally published in 2004-2005. Projected release date: April 20, 2005.|

h3. Random series

table{border:1px solid black}.
|*Daredevil: Father* by Joe Quesada, January 2005|

h3. Older stuff / duplicates I don’t care about

*Essential Daredevil Volume 1* by Stan Lee, issues 1-25 of Vol. 1. Black & white.

*Essential Daredevil Volume 2* by Stan Lee, Jeff Youngquist, issues 26-48 of Vol. 1, Daredevil Annual #1 and #73 of
Fantastic Four Vol. 1. Black & white.

*Essential Daredevil Volume 3* , issues 49+ of Vol. 1. Black & white.

*Daredevil Vs. Bullseye Volume 1* by Marv Wolfman, issues 131-132, 146, 169, 181, 191 of Vol. 1, originally
published in 1976, 1977, 1981. 1982, 1983.

*Daredevil: Marked For Death* by Frank Miller, Roger McKenzie, and Klaus Janson, Vol. 1issues 159-161, 163, 164 (contained in Daredevil Visionaries: Frank Miller, Vol. 1)

*Daredevil: Gang War* by Frank Miller and Klaus Janson, Vol. 1, issues 169-172, 180 (contained in Daredevil Visionaries - Frank Miller, Vol. 2)

*Marvel’s Finest: Daredevil* by Kevin Smith, Joe Quesada and Jimmy Palmiotti, Vol. 2, issues 1-3 (contained in Daredevil Visionaries - Kevin Smith, Vol. 1: Guardian Devil)

Batman

Sunday, March 13th, 2005

Based on a list from Brian Cruz

OOP = out-of-print
HC = hardcover
SC = softcover

Batman collections (pre-crisis):

* The Greatest Batman Stories Ever Told (HC & SC)
* The Greatest Joker Stories Ever Told (HC & SC)
* The Greatest Batman Stories Ever Told, Volume 2 OOP
* Featuring Two-Face and The Riddler
* Batman in the Forties
* Batman in the Fifites
* Batman in the Sixties
* Batman in the Seventies
* Batman Illustrated by Neal Adams, Volume 1 HC
* Tales of the Demon (Batman #232,235,240,242-244, Detective #411,485,489-490, DC Special Series Vol. 2 #15)
* Strange Apparitions (Detective Comics #469-479)
* The Sunday Classics (HC & SC) (November 7, 1943 to October 7, 1946) OOP * The Dailies, Volume 1 1943-1944 SC (October 25, 1943 to October 28, 1944)
* The Dailies, Volume 2 1944-1945 SC (October 30, 1944 to November 24, 1945) OOP
* The Dailies, Volume 3 1945-1946 SC (November 26, 1945 to November 2, 1946) OOP
* The Dailies 1943-1946 HC OOP

Batman storyline collections (post-crisis):

* Year One (Batman #404-407)
* Year Two: Fear the Reaper (Detective #575-578, Batman: Full Circle #1)
* Ten Nights of the Beast (Batman #417-420) OOP
* A Death in the Family (Batman #426-429)
* Blind Justice (Detective #598-600) OOP
* The Many Deaths of the Batman (Batman #433-435) OOP
* A Lonely Place of Dying (Batman #440-442, New Titans #60-61)
* The Last Arkham (Shadow of the Bat #1-4) OOP
* Knightfall, Part 1: The Broken Bat (Batman #491-497 and Detective #659-663)
* Knightfall, Part 2: Who Rules the Night (Detective #664-666, Showcase ‘93 #7-8, SOTB #16-18, Batman #498-500)
* Knightfall, Part 3: Knightsend (Batman #509-510, SOTB #29-30, Detective #676-677, LOTDK #62-63, Catwoman #12, Robin #8,9)
* Prodigal (Batman #512-514, SOTB #32-34, Detective #679-681, Robin #11-13) OOP
* Contagion (Azrael #15-16, Batman #529, SOTB #48-49, Chronicles #4, Catwoman #31-32, Detective #695-696, Robin #27-28)
* Legacy (SOTB #53, Batman #533-534, Detective #700-701, Catwoman #36, Robin #32-33) OOP
* Cataclysm (SOTB #73-74, Nightwing #19-20, Batman #553-554, Detective #720-721, Catwoman 56, Blackgate: Isle of Men 1, Huntress/Spoiler: Blunt Trauma #1, Robin #52, Chronicles #12)
* No Man’s Land, Volume 1 (No Man’s Land #1, SOTB #83-84, Bat #563-564, TEC #730-731, LOTDK #116)
* No Man’s Land, Volume 2 (LOTDK #117,119, SOTB #85-87, Batman #565, tec #732-733, Chronicles #16)
* No Man’s Land, Volume 3 (Batman #566-569, LOTDK #120-121, SOTB #88 and Tec #734-735)
* No Man’s Land, Volume 4 (Batman #571-572, Chronicles #18, LOTDK #125, SOTB #92-93, Detective #736,738-739)
* No Man’s Land, Volume 5 (Batman #573-574, LOTDK #126, SOTB #94, Detective #740-741, No Man’s land #0)
* Evolution (Detective #743-750)
* Officer Down (Batman #587, Robin #86, Birds of Prey #27, Catwoman #90, Nightwing #53, Detective #754, B:GK #13)
* Bruce Wayne: Murderer? (10-Cent Adv. #1, Detective #766-767, Batgirl #24, B:GK #25-26, Batman #599-600 plus portions of Nightwing #65-66, Birds of Prey #39-40, Robin #98-99)
* Bruce Wayne: Fugitive, Volume 1 (Batman #601,603, B:GK #27-28, Batgirl#27,29, Birds of Prey #41,43, Nightwing #68-69)
* Bruce Wayne: Fugitive, Volume 2 (Detective #768-772, B:GK #31, Batman #605)
* Bruce Wayne: Fugitive, Volume 3 (Detective #773-775, Batman #606-607, Batgirl #33)
* Hush, Volume One HC (Batman #608-612)
* Hush, Volume Two HC (Batman #613-619, Wizard #0)

“Legends of the Dark Knight” collections:

* Shaman (#1-5) OOP
* Gothic (#6-10)
* Prey (#11-15) OOP
* Venom (#16-20)
* Faces (#28-30)
* Collected Legends of the Dark Knight (#32-34, 38, 42-43) OOP
* Dark Legends (#39-40, 50, 52-54) OOP
* Other Realms (#35-36, 76-78)
* The Arrow, The Ring, and The Bat (LOTDCU #7-9, LOTDK #127-131)
* Terror (#137-141)
* Haunted Knight (LOTDK Halloween Specials: 1993, 1994, 1995)

Batman mini-series/miscellaneous collections:

* The Dark Knight Returns (#1-4) HC & SC
* The Cult (#1-4)
* Superman/Batman: World’s Finest (#1-3)
* Sword of Azrael (#1-4) OOP
* Legends of the World’s Finest (#1-3) [ELSEWORLDS] OOP
* Superman/Batman: Alternate Histories (Detective Ann #7, Action Ann #6, Steel Ann #1, LOTDK Ann #4) [ELSEWORLDS] OOP
* Four of a Kind (Batman Annual #19, LOTDK Annual #5, SOTB Annual #3, Detective Annual #8)
* Manbat (#1-3) [ELSEWORLDS] OOP
* Black & White (#1-4) HC & SC
* The Long Halloween (#1-13) HC & SC
* Thrillkiller (#1-3, Thrillkiller ‘62 #1) [ELSEWORLDS] OOP
* Anarky (Detective #608-609, Batman Chronicles #1, SOTB #40-41, Anarky #1-4)
* The Movies (Batman, Batman Returns, Batman Forever, and Batman & Robin movie adaptations)
* Superman & Batman: Generations (#1-4) [ELSEWORLDS]
* Batman & Superman: World’s Finest (#1-10)
* Dark Victory (#1-13) HC & SC
* Batman/Huntress: Cry for Blood (#1-6)
* Superman & Batman: Generations II (#1-4) [ELSEWORLDS]
* Black & White, Volume Two HC (anthology) HC & SC
* The Dark Knight Strikes Again (#1-3) HC & SC
* Arkham Asylum: Living Hell (#1-6)

Batman crossover mini-series collections:

* Batman vs. Predator: The Collected Edition (#1-3)
* Batman vs. Predator II: Bloodmatch (#1-3)
* Batman/Aliens (#1-2, Dark Horse Presents #102-103)
* Batman vs. Predator III: Blood Ties (#1-4)
* Batman/Tarzan: Claws of the Cat-Woman (#1-4)
* Joker/Mask (#1-4)
* Ghost/Batgirl: The Resurrection Machine (#1-4)
* Batman/Deathblow: After the Fire (#1-3)
* Batman/Aliens II (#1-3)

Batman original graphic novels:

* Son of the Demon (1987) HC & SC
* Arkham Asylum (1989) HC & SC
* Digital Justice (1990) HC OOP
* Batman 3-D (1990) SC OOP
* Bride of the Demon (1990) HC & SC OOP
* Batman & Dracula: Red Rain (1991) HC & SC [ELSEWORLDS]
* Night Cries (1992) HC & SC
* Birth of the Demon (1992) HC & SC OOP
* Dark Joker: The Wild (1993) HC & SC [ELSEWORLDS] OOP
* Last Angel (1994) SC OOP
* Bloodstorm (1994) HC & SC [ELSEWORLDS]
* The Joker: Devil’s Advocate (1995) HC & SC OOP
* Batman/Deadman: Death & Glory (1996) HC & SC
* Dark Knight Dynasty (1997) HC & SC [ELSEWORLDS]
* Crimson Mist (1998) HC & SC [ELSEWORLDS]
* Fortunate Son (1999) HC & SC
* War on Crime (1999) SC
* The Chalice (1999) HC & SC
* Harvest Breed (2000) HC & SC
* Child of Dreams (2002) HC & SC
* Nine Lives (2002) HC & SC [ELSEWORLDS]
* Absolution (2002) HC & SC
* Hong Kong (2003) HC & SC
* Detective 27 (2003) HC

Batgirl:

* Silent Running (#1-6)
* A Knight Alone (#7-11, 13-14)
* Death Wish (#17-20, 22-23, 25)
* Fists of Fury (#15-16, 21, 26-28)
* Year One (Mini-Series #1-9)

Birds of Prey:

* Birds of Prey (Black Canary/Oracle #1, BOP: Manhunt #1-4, BOP: Revolution #1, Showcase ‘96 #3)
* Old Friends, New Enemies (BOP: Wolves #1, BOP: Batgirl #1, Birds of Prey #1-6)
* Of Like Minds (#56-61)

Catwoman:

* Her Sister’s Keeper (Mini-Series #1-4) OOP
* The Catfile (1st series #15-19)
* Selina’s Big Score HC & SC (2002 OGN)
* Dark End of the Street (Detective Comics #759-762, 2nd series #1-4)
* Crooked Little Town (2nd series #5-10, Secret Files #1)

Gotham Central:

* Batman: Gotham Central (#1-5)

Nightwing:

* Ties That Bind (Alfred’s Return #1, Mini-Series #1-4) OOP
* A Knight in Bludhaven (#1-8)
* Rough Justice (#9-18) OOP
* Love and Bullets (#�, 19, 21-22, 24-29)
* A Darker Shade of Justice (#30-39, SF #1)
* The Hunt for Oracle (#41-46, Birds of Prey #20-21)
* Big Guns (#46-50, 80-Page Giant #1, SF #1)
* Nightwing/Huntress (mini-series #1-4)

Robin:

* A Hero Reborn (Batman #455-457, Robin Mini-Series #1-5)
* Tragedy & Triumph (Detective Comics #618-621, Robin II #1-4) OOP
* Flying Solo (Robin #1-6, Showcase ‘94 #5-6)
* Year One (mini-series #1-4)

The caring problem

Monday, March 7th, 2005

Ethan Zuckerman has an interesting post that suggests an explanation for the lack of news coverage of Africa in the Western press. His theory (recycled from Joi Ito) is that people care about news from nations to which they have some personal connection.

I spent two weeks at the University of Dar es Salaam in Tanzania a few years ago, teaching a workshop on embedded systems for the International Atomic Energy Agency. While I don’t think that the workshop was particularly effective, it made me care about Africa, and East Africa in particular.

Last week, Kilinux released the first Swahili word processor ever. To me, this is big news, which is why I wrote most of the article for Wikinews. There are at least 1 million people who speak Swahili as a first language. The language is spoken by 55 million people worldwide. The well-educated people I met at the University of Dar es Salaam spoke Swahili, a local dialect, and English. When in groups, Swahili was the language they used. Access to a free common platform for creating text documents with commands in a language that’s easy for them to use is a huge step forward.

The Swahili word processor story has been up on Wikinews for a week or so. Ethan Zuckerman posted it to WorldChanging.org. Other than that, I haven’t been able to find coverage in any other media outlet. There are a couple of stories (ZDNet UK and the BBC) that covered a pre-release version before the translation was finished, back in December. Microsoft has said that they are working on a Swahili version of Windows, but the release date reported by the BBC (six months from June 2004) has passed without any news. I guess there aren’t so many shareholders in Dar es Salaam.

You heard it here first, folks.