browser.tabs.loadDivertedInBackground = True and Firefox 3 no longer steals focus when I open link from external application.
PS: This seems to be most interesting post in my blog, at least when counting email feedback - looks like there was lot of people annoyed by this behaviour and too lazy to search for solution :-).
Now, if there was an equivalent for pressing enter in google reader...First terrorists, then trash cans:
More than half of town halls admit using anti-terror laws to spy on families suspected of putting their rubbish out on the wrong day.Their tactics include putting secret cameras in tin cans, on lamp posts and even in the homes of 'friendly' residents.
The local authorities admitted that one of their main aims was to catch householders who put their bins out early.
I'm still digesting this piece which ran on CBS this Sunday, but I am only getting around to today. This is deeply upsetting.It was gloomy and wet when we came back to town the next morning. Lamy had arranged to meet a man who would be able to introduce us to some workers. We drove our small car to an appointed corner, he jumped into the back seat, and we drove off. The worker liaison was a small, wiry fellow in a tan rain slicker. He had scarred, dark skin with handsome features and a wary smile. As we rounded a corner and parked against the edge of a building, he told us that the town authorities had recently warned workers that they would spend 30 days in jail if they spoke with foreign reporters. Lamy explained to me that the workers are migrants from other parts of China. Since they’re not official citizens of this province, they have no right to health care or other protections. "I keep thinking that they are totally vulnerable" she said.
Who Was Following Whom? [CBSNews.com]
Bash is probably the most common command-line shell in the GNU/Linux world. Although a lot of people use alternate shells (such as Zsh), Bash is still shipped with most mainstream distros as the default. Once you have a lot of different remote machines, all running Bash as the shell, it becomes increasingly difficult to pay attention to the prompt, and typing reboot in a machine different from the one you wanted becomes more likely. I deal with that problem by changing Bash prompts…
First of all, the basics: Bash prompts are just environment variables with special characters you can set and export. Bash has four of these variables: PS1 to PS4, but usually only the first two matters (actually, just PS1 – for a reference on the others, check the manpage). The most common PS1 string is:
spectra@home:~$ echo $PS1 \u@\h:\w\$ spectra@home:~$This has 4 special characters, escaped with a backslash: \u informing us the username; \h informing us the hostname; \w, informing us the working directory; and \$, which gives us the $ in the end of the prompt (more on this later).
So, essentially, one can change that string to anything else…
spectra@home:~$ PS1="my_shell_prompt\$ " my_shell_prompt$Pretty easy. You can check a complete reference of the special characters at the section PROMPTING of bash manpage, but the most useful IMHO are the following:
Also, as part of the prompt string, one can use ANSI Colors enclosed as non-printing characters (that is between \[ and \]). ANSI sequences always begin with an “ESC[” and end with an “m”. (Yes… Really arbitrary… but that’s the way it is…). ESC can be represented as \e… Here is a list of the most common colors in ANSI sequences:
Now, notice that there are two numbers separated by a semi-colon… the first is always 0 (zero) in the colors I pointed above, but it actually refers to an ANSI attribute called Select Graphic Rendition… You can use 0 (zero) to normal colors, 1 for bold, 2 to faint, etc. So \e[0;30m refers to BLACK, \e[1;30m refers to DARK GREY. The Wikipedia has a good article on these escape sequences.
Once you’re satisfied with something printed in a color, to go back to the default (to reset), you issue the \e[0m escape sequence.
So, back to my problem… Each different machine gets a different color for the hostname. On “hospital” machine, for instance, my PS1 looks like:
spectra@hospital:~$ PS1="\[\e[1;33m\]\u\[\e[0m\]@\[\e[0;35m\]\h\[\e[0m\]:\[\e[0;32m\]\w\[\e[0m\]\$ " spectra@hospital:~$With \e[0;35m (Purple) for the hostname. On “home” machine, it may be \e[0;34m (Blue)... On “server”, it may be \e[0;36m (Cyan), and so on… After a while, you get used to the color and end up linking the color to the machine… so that typing “reboot” on a machine with the wrong color gets harder than before.
To make the changes permanent, put export PS1 in one of the config script of bash (.bashrc, .bash_profile, etc). On some systems, /etc/environment holds lots of environment variables definitions.
I just scratched the surface… That’s just what works for me… The Bash-Prompt-HOWTO has some interesting examples, and I actually have a friend who uses more esoterical stuff, such as fancybash or bashish, but I’ll leave this up to you…
I like teh colour trickRob Landley writes:
A common trick years ago was to set up your routing tables and then have PID 1 exit so the kernel paniced, because the paniced kernel would continue to route packets with _no_userspace_running_. Darn hard to hack a system like that.This is such a ridiculously stupid idea I think it has wrapped all the way around to the point where it just grazes "genius"!
I got this nice message (and some others) in my log today:
smartd: Device: /dev/sdd, 2 Currently unreadable (pending) sectors
After running a smartctl -t long /dev/sdd smartctl now reports:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0 9 Power_On_Hours 0x0032 089 089 000 Old_age Always - 8719 196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0 197 Current_Pending_Sector 0x0012 200 200 000 Old_age Always - 2 198 Offline_Uncorrectable 0x0010 200 200 000 Old_age Offline - 0 [...] SMART Error Log Version: 1 ATA Error Count: 10 (device log contains only the most recent five errors) [...] Error 10 occurred at disk power-on lifetime: 8692 hours (362 days + 4 hours) When the command that caused the error occurred, the device was active or idle. After command completion occurred, registers were: ER ST SC SN CL CH DH -- -- -- -- -- -- -- 40 51 08 78 e5 89 e0 Error: UNC 8 sectors at LBA = 0x0089e578 = 9037176 Commands leading to the command that caused the error were: CR FR SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name -- -- -- -- -- -- -- -- ---------------- -------------------- 25 00 08 78 e5 89 2f 00 45d+06:36:27.880 READ DMA EXT 25 00 08 70 e5 89 2f 00 45d+06:36:27.798 READ DMA EXT 25 00 08 68 e5 89 2f 00 45d+06:36:27.308 READ DMA EXT 25 00 08 e0 77 e5 35 00 45d+06:36:27.295 READ DMA EXT 25 00 08 60 e5 89 2f 00 45d+06:36:26.653 READ DMA EXT [...] Error 9 occurred at disk power-on lifetime: 8692 hours (362 days + 4 hours) When the command that caused the error occurred, the device was active or idle. After command completion occurred, registers were: ER ST SC SN CL CH DH -- -- -- -- -- -- -- 40 51 08 60 e5 89 e0 Error: UNC 8 sectors at LBA = 0x0089e560 = 9037152 SMART Self-test log structure revision number 1 Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error # 1 Extended offline Completed: read failure 90% 8715 797566305 # 2 Extended offline Completed without error 00% 8198 -Notice that 197 Current_Pending_Sector indicates that there are 2 sectors with a problem.
Note that the SMART error log shows LBA sectors 9037176 (0x89e578) and 9037152 (0x89e560) but it's limited to 0xffffff. The self test logs shows us the proper LBA error at 797566305 (0x2f89e561) which has a 0x2f in front, and also shows us that it's the second sector in the block of 8 we tried to read.
The kernel log also shows:
ata4.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0 ata4.00: (BMDMA2 stat 0xc0009) ata4.00: cmd 25/00:08:60:e5:89/00:00:2f:00:00/e0 tag 0 cdb 0x0 data 4096 in res 51/40:00:61:e5:89/00:00:2f:00:00/f0 Emask 0x9 (media error)So I've tried to reproduce the error with:
# dd if=/dev/sdd of=797566305 skip=797566305 bs=512 count=1 iflag=direct 1+0 records in 1+0 records out 512 bytes (512 B) copied, 1.27727 s, 0.4 kB/sNotice that it can actually read that block, it just seems to take a while.
And the error log now contains:
After command completion occurred, registers were: ER ST SC SN CL CH DH -- -- -- -- -- -- -- 40 51 01 61 e5 89 e0 Error: UNC 1 sectors at LBA = 0x0089e561 = 9037153Because it's part of a RAID device I could just let the whole disk resync, but I was a little curious which files were in it. So I found this document that explains on how to find which files has the problem. But it only has examples covering ext2/ext3 on a partition and LVM and nothing about RAID device. So it looks like someone using RAID 0 will have a hard time finding the file that's having a problem.
So following the document we start with:
# fdisk -lu /dev/sdd Disk /dev/sdd: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors Units = sectors of 1 * 512 = 512 bytes Disk identifier: 0x000578f9 Device Boot Start End Blocks Id System /dev/sdd1 * 63 385559 192748+ fd Linux raid autodetect /dev/sdd2 972864270 976768064 1951897+ fd Linux raid autodetect /dev/sdd3 385560 972864269 486239355 fd Linux raid autodetect Partition table entries are not in disk orderIn /proc/mdstat we see:
md1 : active raid5 sda3[0] sdd3[3] sdc3[2] sdb3[1] 1458717696 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]So sdd3 is part of md1 and I have an ext3 filesytsem on that. Tune2fs -l |grep Block gives:
Block count: 364679424 Block size: 4096 Blocks per group: 32768mdadm tells me:
# mdadm -QE /dev/sdd3 /dev/sdd3: Magic : a92b4efc Version : 00.90.00 UUID : 747b071a:a70f723b:c3a9ed44:15845cbf Creation Time : Mon Nov 12 20:13:51 2007 Raid Level : raid5 Used Dev Size : 486239232 (463.71 GiB 497.91 GB) Array Size : 1458717696 (1391.14 GiB 1493.73 GB) Raid Devices : 4 Total Devices : 4 Preferred Minor : 1 Update Time : Mon Nov 10 10:57:28 2008 State : clean Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Checksum : 4b3147f4 - correct Events : 78 Layout : left-symmetric Chunk Size : 64K Number Major Minor RaidDevice State this 3 8 51 3 active sync /dev/sdd3 0 0 8 3 0 active sync /dev/sda3 1 1 8 19 1 active sync /dev/sdb3 2 2 8 35 2 active sync /dev/sdc3 3 3 8 51 3 active sync /dev/sdd3I've been told that 0.90 stores the superblock at the end of the device, so that makes it a little easier. And this seems to agree:
# cat /sys/block/md1/md/dev-sdd3/offset 0We have a left-symmetric layout, so in raid5_compute_sector() we see
stripe = chunk_number / data_disks; *dd_idx = chunk_number % data_disks; [...] case ALGORITHM_LEFT_SYMMETRIC: *pd_idx = data_disks - stripe % raid_disks; *dd_idx = (*pd_idx + 1 + *dd_idx) % raid_disks;So it looks like the chunks are located on the disk like:
stripesdasdbsdcsdd0D 0D 1D 2P 0-21D 4D 5P 3-5D 32D 8P 6-8D 6D 73P 9-11D 9D 10D 114D 12D 13D 14P 12-14With each of those 64K.
The problem is at 797566305 and the partition started at 385560. So that's at sector 797180745 inside partition sdd3. Each sector is 512 bytes and a chunk is 65536 bytes which gets us 128 sectors per chunk. If we want to know which the stride the sector is on we do: 797180745/128=6227974.5703125
This means that the stripe is number 6227974 and that it's sector 0.5703125*128=73 on sdd3 within that chunk.
The parity is on disk: pd_idx = 3 - 6227974 % 4 = 1, being sdb.
To get the chunk we need to multiply with the number of data disks (3) and since it's the forth disk and the parity is on the second disk we need to add 1 and get: 6227974*3+1=18683923
So calculating that back to sectors we multiply it with the number of sectors per chunk again and add our offset in the chunk: 18683923*128+73=2391542217
To test that our math is any good we try:
# dd if=/dev/md1 of=797566305.2 skip=2391542217 bs=512 count=1 iflag=direct 1+0 records in 1+0 records out 512 bytes (512 B) copied, 5.99103 s, 0.1 kB/sWe see an error message in the kernel log, there are 2 new errors in the error log, so it seems that everything is calculated correctly. The files are also identical.
The file system is in blocks of 4096 bytes, so for the file system this is block 2391542217*512/4096=298942777.125
Then we use debugfs:
# debugfs debugfs 1.41.2 (02-Oct-2008) debugfs: open /dev/md1 debugfs: icheck 298942777 Block Inode number 298942777 <block not found>Which isn't making any sense to me, since I get that error about every 2 hour when a certain cronjob runs. 298942777 / 32768 (Blocks per group) = 9123.00955. So I wonder if ext3 is keeping some meta data there and debugfs doesn't tell that?
Anyway, at some point I was running a smartctl -t long /dev/sdd again because I couldn't reproduce the error anymore, the cronjob started, and I then found alot of errors in my log again and now it included:
raid5:md1: read error corrected (8 sectors at 797180744 on sdd3)It's so much fun that disks always behaves the same trying to read the same sector.
Smartctl now reports:
5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0 196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0 197 Current_Pending_Sector 0x0012 200 200 000 Old_age Always - 0 198 Offline_Uncorrectable 0x0010 200 200 000 Old_age Offline - 0I assume the kernel removed the pending sector by writing to it. The other pending error was already gone for some time, I assume new data got written to that one.
Aspidistra was a World War II man-in-the-middle attack. The vulnerability that made it possible was that German broadcast stations were mostly broadcasting the same content from a central source; but during air raids, transmitters in the target area were switched off to prevent them being used for radio direction-finding of the target.
The exploit involved the very powerful (500KW) Aspidistra transmitter, coupled to a directional antenna farm. With that power, they could make it sound like a local station in the target area.
With a staff of fake announcers, a fake German band, and recordings of recent speeches from high-ranking Nazis, they would smoothly switch from merely relaying the German network to emulating it with their own staff. They could then make modifications to news broadcasts, occasionally creating panic and confusion.
German transmitters were switched off during air raids, to prevent them from being used as navigational aids for bombers. But many were connected into a network and broadcast the same content. When a targeted transmitter switched off, Aspidistra began transmitting on their original frequency, initially retransmitting the German network broadcast as received from a still-active station. As a deception, false content and pro-Allied propaganda would be inserted into the broadcast. The first such "intrusion" was carried out on March 25, 1945, as shown in the operations order at the right.On March 30, 1945, "Aspidistra" intruded into the Berlin and Hamburg frequencies warning that the Allies were trying to spread confusion by sending false telephone messages from occupied towns to unoccupied towns. On April 8, 1945, "Aspidistra" intruded into the Hamburg and Leipzig channels to warn of forged banknotes in circulation. On April 9, 1945, there were announcements encouraging people to evacuate to seven bomb-free zones in central and southern Germany. All these announcements were false.
The German radio network tried announcing "The enemy is broadcasting counterfeit instructions on our frequencies. Do not be misled by them. Here is an official announcement of the Reich authority." The Aspidistra station made similar announcements, to cause confusion and make the official messages ineffective.
While thinking about the discussion that my recent series of posts about the career benefits of contributing to the open source community, I started wondering about whether this could actually have some effect on how software gets designed. We’ve all heard of “Not Invented Here Syndrome,” where developers decide to reimplement something, even when the technically better way to go would be to reuse some existing code.
I think there is also a small but growing tendency towards a “Free Software Syndrome,” where developers push management to release something as open source, not necessarily to get the benefits of community testing and review, more developers, or anything like that, but simply so that the developers can be open source developers.
I saw several interesting responses to my last post. I liked Val’s succint way of putting the career impact of free software work:
If you are even moderately successful in open source, you will probably end up “employed for life.”
I’m not sure I would go that far, since someone early in their career now might be working for 30, 40 or 50 more years, and it’s hard to say how much the artilects will care about open source after they’ve converted the entire mass of the solar system into computronium. But certainly as long as the software industry looks the way it does now, developers who are able, both technically and socially, to work in the open source community are going to be in high demand. (By the way, Val: two ‘e’s in “Dreier”
— the native English-speaking brain seems hard-wired to misspell my last name)
There were also a few comments to my blog post from people who would like to do more in the open source community, but who are prevented by their current employer. I understand that no job is ideal, and that people often can’t or won’t change jobs for many reasons — having a great commute, a gazillion dollars in stock still to vest, gambling debts to pay or any of a million other things might be reasons to stay in a particular position.
However, I think it’s important for people in those less than ideal positions to view this for what it is — these employers are taking money out of your pockets and limiting your future earnings just as surely as if they forbid you from other professional development such as learning a new programming language. I’ve also found that many (although surely not all) software developers are too passive about accepting issues like this.
You need to keep in mind that you are responsible for getting the best for yourself — your interests are not your employers interests, and your employer is surely not going to put your interests first, so you better put your own interests first! Of course this means that when negotiating things (and you are negotiating from your first job interview to the end of your exit interview), you need to explain why what you want is really in your employer’s interest.
There are many ways you can explain why contribution to open source is in an employer’s interest too, from the direct benefits: “This code has no real relevance to our business, but if we release it and get it upstream, other people will help us maintain it, which saves us money and time in the long term,” to slightly less concrete: “Contributing to free software is good marketing, and it’s going to help us sell as well as recruit and retain good developers,” to the personal: “I know we were told bonuses will be down this year, but something that you can do for me that doesn’t cost anything in your budget is let me contribute this code, which we already agreed the company has no interest in.”
Some of the comments on my last post on the economic unwinding of 2008 suggested that people think we are witnessing the end of capitalism and the beginning of a new socialist era.
I certainly hope not.
I think a world without regulated capitalism would be a bleak one indeed. I had the great privilege to spend a year living in Russia in 2001/2002, and the visible evidence of the destruction wrought by central planning was still very much present. We are all ultimately human, with human failings, whether we work for a state planning agency or a private company, and those failings have consequences either way. To think that moving all private enterprise into state hands will somehow create a panacea of efficiency and sustainability is to ignore the stark lessons of the 20th century.
The leaders and decision makers in a centrally-planned economy are just as fallible as those in a capitalist one - they would probably be the same people! But state enterprises lack the forces of evolution that apply in a capitalist economy - state enterprises are rarely if ever allowed to fail. And hence bad ideas are perpetuated indefinitely, and an economy becomes dysfunctional to the point of systemic collapse. It is the fact that private enterprises fail which keeps industries vibrant. The tension between the imperative to innovate and the consequences of failure drives capitalist economies to evolve quickly. Despite all of the nasty consequences that we have seen, and those we have yet to see, of capitalism gone wrong, I am still firmly of the view that society must tap into its capitalist strengths if it wants to move forward.
But I chose my words carefully when I said “regulated capitalism”. I used to be a fan of Adam Smith’s invisible hand, and great admirer of Ayn Rand’s vision. Now, I feel differently. Left to it’s own devices, the market will tend to reinforce the position of those who were successful in the past, at the exclusion of those who might create future successes. We see evidence of this all the time. The heavyweights that define an industry tend to do everything in their power to prevent innovation from changing the rules that enrich them.
A classic example of that is the RIAA’s behaviour - in the name of “saving the music industry” they have spent the past ten years desperately trying to keep it in the analog era to save their members, with DRM and morally unjustifiable special-interest lobbying around copyright rules that affect the whole of society.
Similarly, patent rules tend to evolve to suit the companies that hold many patents, rather than the people who might generate the NEXT set of innovative ideas. Of course, the lobbying is dressed up in language that describes it as being “in the interests of innovation”, but at heart it is really aimed at preserving the privileged position of the incumbent.
In South Africa, the incumbent monopoly telco, which was a state enterprise until it was partially privatized in 1996, has systematically delayed, interfered, challenged and obstructed the natural process of deregulation and the creation of a healthy competitive sector. Private interests act in their own interest, by definition, so powerful private interests tend to drive the system in ways that make THEM healthier rather than ways that make society healthier.
Left to their own devices, private companies will tend to gobble one another up, and create monopolies. Those monopolies will then undermine every potential new entrant, using whatever tactics they can dream up, from FUD to lobbying to thuggery.
So, I’m a fan of regulated capitalism.
We need regulation to ensure that society’s broader needs, like environmental sustainability, are met while private companies pursue their profits. We also need regulation to ensure that those who manage national and international infrastructure, whether it’s railways or power stations or financial systems, don’t cook the books in a way that lets them declare fat profits and fatter bonuses while driving those systems into crisis.
But effective regulation is not the same as state management and supervision. I would much rather have private companies managing power stations competitively, than state agencies doing so as part of a complacent government monopoly.
Good regulation is very hard. Over the years I’ve interacted with a few different regulatory authorities, and I sympathise with the problems they encounter.
First, to be an effective regulator, you need superb talent. And for that you need to pay - talent follows the money and the lights, whether we like it or not, so to design a system on other assumptions is to design it for failure. My ideal regulator is an insightful genius working for the common good, but since I’m never likely to meet that person, a practical goal is to encourage regulators to be small but very well funded, with key salaries and performance measures that are just behind the industries they are supposed to regulate. Regulators must be able to be fired - no sense in offering someone a private sector salary and public sector accountability. Unfortunately, most regulators end up going the other way, hiring more and more people of average competence, that they become both expensive and ineffective.
Second, a great regulator needs to be independent. You’re the guy who tells people to stop doing what will hurt society; it’s very hard to do that to your friends. A regulatory job is a lonely job, which is why you hear so many stories of regulators being wined and dined by the industries they regulate only to make sure they don’t look too hard in the back room. A great regulator needs to know a lot about an industry, but be independent of that industry. Again, my ideal is someone who has made a good living in a sector, knows it backwards, can justify their high price, but wants to make a contribution to society.
Third, a great regulator needs to have teeth and muscle. It has been very frustrating for me to watch the South African telecomms regulator get tied up in court by Telkom, and stymied by government department inadequacy. Regulators need to be able to drive things forward, they need to be able to change the way companies behave, and they cannot rely on moral suasion to do so.
And fourth, a regulator has to make very tough decisions about innovation, which amount to venture capital decisions - to make them well, you have to be able to tell the future. For example, when an industry changes, as all industries change, how should the rules evolve? When a new need for society is identified, like the need to address climate change early and systemically, how should the rules evolve? Regulators need to move forward as fast as the industries they regulate, and they need to make decisions about things we don’t yet understand. And even when you regulate, you may not be able to stop an impending crisis. It’s very easy to criticize Greenspan for his light touch regulation on hedge funds and derivatives today, but it’s not at all clear to me that regulation would have made a difference, I think it would simply have moved the shadow global financial system offshore.
So regulation is extremely difficult, but also very much worth investing in if you are trying to run a healthy, vibrant, capitalist society.
Coming back to the original suggestion that sparked this blog - I’m sure we will see a lot of failed capitalists in the future. Hell, I might join their ranks, I wouldn’t be the first ;-). But that doesn’t spell the end of capitalism, only the opportunity to start again - smarter.
Some good arguments against pure unregulated capitalism

This fellow in Blaine WA spent 20 years making a bomb shelter under his house (which is now for sale...)
A common idea among the less educated people who call themselves “conservative” seems to be that they should oppose tax cuts for themselves and support tax cuts for the rich because they might become rich and they want to prepare for that possibility.
The US census data [1] shows that less than 1% of males aged 15+ earn $250K. For females it’s less than 0.2%.
On the Wikipedia page about homosexuality [2] it is claimed that 2%-7% of the population are gay (and 12% of Norwegians have at least tried it out). Apparently homosexuality can strike suddenly, you never know when a right-wing politician or preacher will suddenly and unexpectedly be compelled to hire gay whores (as Ted Haggard [3] did) or come out of the closet (as Jim Kolbe [4] did).
So it seems that based on percentages you are more likely to become gay than to become rich. So it would be prudent to prepare for that possibility and lobby for gay marriage in case your sexual preference ever changes.
But on a serious note, of the people who earn $250K or more (an income level that has been suggested for higher tax rates) there will be a great correlation between the amount of education and the early start to a career. Go to a good university and earn more than the median income in your first job, and you will be well on track to earning $250K. A common misconception is that someone who has not had a great education can still be successful by starting their own company. While there are a few people who have done that, the vast majority of small companies fail in the first few years. Working hard doesn’t guarantee success, for a company to succeed you need to have the right product at the right time - this often depends on factors that you can’t predict (such as the general state of the economy and any new products released by larger companies).
Congratulations to select AT&T broadband consumers in Reno, Nevada. They're about to be enrolled in a little "usage tier" experiment whether they like it or not.
“As for what this all means, I'm still trying to figure that out. I abandoned seven long-held principles about business and software engineering, and nothing terrible happened.”
From my latest Inc column: The Unproven Path
Not loving your job? Visit the Joel on Software Job Board: Great software jobs, great people.
A suitably self-deprecating post, if obviously promoting his site.
Inventor Mitch Altman explains why he open-sourced his TV-B-Gone kit - MAKE volume 12.
Was that the best move?
TV-B-Gone remote controls are key chains with one button that make it fun to turn off almost any TV in public places. Oddly enough, within weeks of the first day of sales, the TV-B-Gone story appeared in major and minor newspaper, magazine, radio, and even TV outlets throughout the planet. It was a hit!
With this vast popularity, what might have happened if my packaging had not displayed the words: “Patent Pending”? Maybe it stopped some large companies from copying TV-B-Gone remotes, since selling copies would open them up for being sued once my patent was granted.
Would it be different if my product were open source?
I knew about open source, of course, but never considered it viable for hardware until going to my first hacker convention. There I met people who are very critical of patents and other forms of intellectual property law. They see these laws as obsolete and obnoxious. Individuals who want to hack cool ideas to improve upon them and share their results are often preyed upon and silenced by corporate lawyers protecting their clients’ patents. Paradoxically, this stifles the creativity that patents were supposed to encourage. This point of view was an eye-opener for me.
I decided to go for it. Together with Limor Fried (who makes lots of great kits), we’re making open source kits available so anyone can build and hack TV-B-Gone remote controls (look for an upcoming MAKE article about this). The firmware source code will be available online, as well as the board layout, lots of TV power codes, and all documentation.
Even though my project was not open source, I benefited from the open source community. People hacked TV-B-Gone remote controls in wonderfully creative ways. (Search online for “TV-B-Gone hacks” and you’ll get the idea.) These hacks increased the product’s popularity, resulting in more sales and more people around the world experiencing the satisfaction of turning off TVs. Also, since there was an army of TV-B-Goners who emailed me with ideas on how to improve upon my initial design, the next versions of TV-B-Gone remotes were considerably better than the original. Everything added up for me to look seriously at Creative Commons, a form of open source licensing.
The added buzz will likely also help sales of ready-made TV-B-Gone key chains, since not everyone wants to build their own. Everybody wins. In the words of my brother the patent lawyer, “The old way of patent law is to think: ‘This is mine and I’m going to keep it.’ This may have some advantages, but with open source you can share and bring more creative minds to the process. What’s really nice is that you don’t have to give up all your rights. With open source you can have the best of all worlds.”
Mitch Altman’s next products, based on the “Brain Machine” article he wrote for MAKE, Volume 10, are also open source.

Dealing with plastic blister packaging and an endless stream of twistie ties can get tiring pretty quickly. Amazon now says that it's trying to reduce "wrap rage" by launching a new packaging initiative that makes things simple to open and reduces waste in the process.
![]()
Amol Sarva, maker of Peek, an e-mail only cellular handset, is elatedly pointing to its position as the runaway leader of Time's ongoing "Gadget of the Year" poll.
This will be a good way to separate one sort of gadget fan from another—I hesitate to reduce it to Nerds vs. Geeks. The former will be affronted by Time's selection of something aimed at stupids instead of at them, while the latter will think "Cool, has anyone hacked the Peek yet?"
Gadget of the Year Poll Results [Time]