by Paul Ramsey (noreply@blogger.com) at July 27, 2010 04:31 PM
by Paul Ramsey (noreply@blogger.com) at July 27, 2010 04:31 PM
by Paul Ramsey (noreply@blogger.com) at July 22, 2010 04:38 PM
CREATE TABLE network ( segment geometry, id integer primary key );
INSERT INTO network VALUES ('LINESTRING(1 1, 0 0)', 1);
INSERT INTO network VALUES ('LINESTRING(2 1, 1 1)', 2);
INSERT INTO network VALUES ('LINESTRING(1 2, 1 1)', 3);
INSERT INTO network VALUES ('LINESTRING(3 1, 2 1)', 4);
INSERT INTO network VALUES ('LINESTRING(3 2, 2 1)', 5);
INSERT INTO network VALUES ('LINESTRING(2 3, 1 2)', 6);
INSERT INTO network VALUES ('LINESTRING(1 3, 1 2)', 7);
INSERT INTO network VALUES ('LINESTRING(4 2, 3 2)', 8);
INSERT INTO network VALUES ('LINESTRING(3 4, 2 3)', 9);
INSERT INTO network VALUES ('LINESTRING(2 4, 2 3)', 10);
INSERT INTO network VALUES ('LINESTRING(1 4, 1 3)', 11);
INSERT INTO network VALUES ('LINESTRING(4 3, 4 2)', 12);
INSERT INTO network VALUES ('LINESTRING(4 4, 3 4)', 13);
CREATE INDEX network_gix ON network USING GIST (segment);

WITH RECURSIVE walk_network(id, segment) AS (
SELECT id, segment FROM network WHERE id = 6
UNION ALL
SELECT n.id, n.segment
FROM network n, walk_network w
WHERE ST_DWithin(ST_EndPoint(w.segment),ST_StartPoint(n.segment),0.01)
)
SELECT id
FROM walk_network
id
----
6
3
1
(3 rows)
CREATE OR REPLACE FUNCTION downstream(integer)
RETURNS geometry
LANGUAGE sql
AS '
WITH RECURSIVE walk_network(id, segment) AS (
SELECT id, segment FROM network WHERE id = $1
UNION ALL
SELECT n.id, n.segment
FROM network n, walk_network w
WHERE ST_DWithin(ST_EndPoint(w.segment),ST_StartPoint(n.segment),0.01)
)
SELECT ST_MakeLine(ST_EndPoint(segment))
FROM walk_network
' IMMUTABLE;
=# SELECT ST_AsText(Downstream(12));
st_astext
---------------------------------
LINESTRING(4 2,3 2,2 1,1 1,0 0)
(1 row)

by Paul Ramsey (noreply@blogger.com) at July 21, 2010 09:44 PM
OpenLayers is approaching the ‘Brave New World’ of a major API breakage for the first time since OpenLayers 2.0 in October of 2006.
Things that have changed in OpenLayers since then:
Overall, is it any shock that it’s time for a pretty major change?
In order to facilitate rapid development, we’ve shifted development of OpenLayers ‘3.0′ to github; you can follow along (or fork you own) on the OpenLayers github project. To be honest, git scares the crap out of me; every time I’ve used it, I have consistently lost data as a result of not understanding the tool and using the wrong command. However, I fully realize I am a fuddy duddy who needs to get over his problems at this point.
Looking forward to seeing the future of the world where OpenLayers is even more awesome than it already is!
We launched three new Stack Exchange sites this week!
We’ll have three more for you next week, too.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
“We decided that individually-branded sites felt more authentic and trustworthy. We thought that letting every Stack Exchange site have its own domain name, visual identity, logo, and brand would help the community feel more coherent. After all, nobody wants to say that they live in Housing Block 2938TC. They want to live in Colonial Manor. Never mind the connotation of, well, colonies.”
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
I needed to do something about the Mac minis that were accumulating on the table in my office. Digging around, I found this Rubbermaid organizer on Amazon.
It turns out to be nearly perfect. The unit is very sturdy, was easy to put together, and the shelf height is just right. There’s enough clearance for airflow but not so much that you feel space is being wasted.
I used self-stick cable tie anchors and cable ties to mount the power bricks and used double-stick mounting tape as stops to keep things in place. The old-style minis are heavy enough and are pretty non-slip, so I just put some tape at the front of the shelf to keep them from sliding off. The one new-style mini was pretty slippery so I used the tape to actually stick the base to the shelf.
The unit came with vertical rods that go in the back of each column of shelves to keep them from sliding out the back, but I decided to leave those out. That way I can slide each shelf forward to get DVDs into the mini, or back to get at the connectors.
The weak spot of the minis is the power cord (at least on the pre-2010 models) which comes out quite easily. I tied those down as well and am pretty sure they won’t jiggle their way out. I have four minis in the rack right now along with a Drobo with 10TB of disk. I’m going to be adding a 5th mini with a stackable disk drive, that’s why there’s double-high slot still open on the mini side of the rack.
Cable management is an issue, mostly because of the power bricks long cables. I may fiddle with how I fold the cables into the shelves a bit more.
The whole thing plus a UPS and monitor/keyboard/mouse sits nicely on some steel shelves in our A/V equipment room at the museum. I still need to time how long the UPS runs. I’m only going to have the public web site minis on it.
I moved this blog from one of the Mac minis in my basement to the other (I’m trying to put everything on the newer one to free the other one up) yesterday. Originally I had been blogging using Plone (from about 2005-2007) and then moved to Wordpress. Moving the Plone part seemed like it was more work than I wanted to put in, so it’s goodbye to those posts.
Want to know how to export mail from Gmail? Or delete your Facebook account? Or send giant files via email?
Well, the new Web Applications Stack Exchange is for you. It’s a part of the Stack Exchange network, so it has the clean, elegant design that made Stack Overflow a phenomenal success.
The newest member of the Stack Exchange Network is the first one to go through the community site-creation process called Area 51. There are more great sites in the pipeline, but they have to demonstrate that they can reach critical mass or we won’t create them.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
I think that, at least for us here [at SXSW] this week, Foursquare and Gowalla have been at the center of the universe for a little while.I'm over the hill and I'm not even 40. Now get the hell off my lawn!
And I think that [is because] it is something to do with the fact that it's been a problem we've been trying to solve forever. You know you've been thinking "wouldn't it be great if I knew where my friends are so I could find them and we could hang out more" for years and so now this is finally here.
So not only is it an easy way to do something, and solves a problem that we we've been trying to fix forever, it's the first time that location is kind of useful beyond maps. Everyone understands that you need location in maps, because you have to get from point A to point B … I want to know where I am so I can broadcast it, because it's cool that I go to cool conferences (um, isn't it?), and I want my friends to know where I am, and I want to be able to find where they are.
by Paul Ramsey (noreply@blogger.com) at July 07, 2010 06:33 PM
I had seen this tidbit that Sean Gillies writes about in the recent OGC newsletter. My thoughts were along the lines of Sean’s. I never understood the big deal behind URNs.
EDIT: Forget the semi-rant, see the comments, and then go read about URI…
But in re-reading Sean’s post and the OGC news coming out of the June 2010 meetings, I think the terminology is a bit imprecise. Too bad the source document, 10-124r1 isn’t available on the OGC web site (promised for mid-July, I see) to see if the issue is in the document or in the news page. Here’s the news page version:
OGC Identifiers – the case for http URIs’
The OGC Members approved release of ‘OGC Identifiers – the case for http URIs’ [OGC 10- 124r1] as an OGC Whitepaper. .According to the current OGC policy either URNs or http URIs may be used in OGC standards. However, the use of http URIs (a) resolves some deployment challenges and (b) provides an opportunity for easier engagement with broader communities. So OGC should now consider taking the next step, and mandate the use of http URIs for persistent identifiers in OGC specifications. This whitepaper canvasses a number of issues around this proposal.
http URI Policy
The OGC Members approved the following as official OGC policy to be included in the OGC Policies related to OGC standards [OGC 06- 135rN]:
- OGC TC directs the OGC-NA that all new OGC identifiers issued for persistent public OGC resources shall be http URIs, instead of URNs
- New standards and new major versions of existing standards shall use http URIs for persistent public OGC resources to replace OGC URN identifiers defined in previous standards and versions, unless OGC- NA approves an exception
Operational Implications: OGC should carefully manage (maintain for the long term) the http://www.opengis.net domain and identifiers in this domain
So what’s wrong? Refer to RFC3986 (or the html version). Section 1.1.3 talks about URI, URL, and URN:
A URI can be further classified as a locator, a name, or both. The term “Uniform Resource Locator” (URL) refers to the subset of URIs that, in addition to identifying a resource, provide a means of locating the resource by describing its primary access mechanism (e.g., its network “location”). The term “Uniform Resource Name” (URN) has been used historically to refer to both URIs under the “urn” scheme [RFC2141], which are required to remain globally unique and persistent even when the resource ceases to exist or becomes unavailable, and to any other URI with the properties of a name.
A URN is a kind of URI. What is called an “http URI” is really a “just” a URL in RFC3986. And, a URN need not (or I should say “need no longer”) be something with “urn:” in the scheme. A URL could be a URN based on the last part of the definition above, “any other URI with the properties of a name”
Therefore, an “http URI” (from the OGC wording) can be either a URL or a URN, based on section 1.1.3 of RFC3986. Of course, the URN is really a URL with the additional uniqueness and persistence properties. So let’s just call OGC’s newly mandated URIs URLs.
There are two primary motivations for using RFC2141 URNs. One is as a globally unique name managed by some authority. The other is as a persistent identifier, sometimes used to map onto a URL with a resolver. The trouble with the latter is that URLs really work better in the first place, and I’m guessing that’s what 10-124r1 says.
So here’s what I think they should have said in the TC:
URI Policy
The OGC Members approved the following as official OGC policy to be included in the OGC Policies related to OGC standards [OGC 06- 135rN]:
- OGC TC directs the OGC-NA that all new OGC identifiers issued for persistent public OGC resources shall be http URLs, instead of RFC2141 URNs
- New standards and new major versions of existing standards shall use http URLs for persistent public OGC resources to replace OGC RFC2141 URN identifiers defined in previous standards and versions, unless OGC- NA approves an exception
Sorry to be so pedantic. Back in the day, there would have been half a dozen people at any given TC who would have been able to argue the finer points of this for hours….
(And I just figured out what the OGC-NA is. I guess it’s the “Naming Authority”.)
| Foo Regulars | Foo Newbies |
| Extroverts | Introverts |
Note to Parents: Your early-to-bed-early-to-rise conditioning comes in handy sometimes. You can get up early, get a coffee, and join the other parents for a quiet, introvert friendly, discussion around the fire pit while all the 20-something future masters of the universe are sleeping off their hangovers.
Blowhards: There will be blowhards. Statistically speaking, the larger the session, the more likely there will be a blowhard in your session. Scott Berkun's 2009 post mentions them, and I like his idea of the "anonymous gong" to help the blowhard achieve self-awareness.
Invisible Celebrities: I actually talked to Chad Dickerson, but I never connected the dots until afterwards that he wrote the "CTO Corner" column in InfoWorld, back when it was a paper publication. That column was the only reason I kept receiving the magazine, it made me feel sane (I am not alone!) to be advocating open source, which was very much a minority position at the time. I would have liked to have told him that.
Surprising Social Norms: Either there is a Silicon Valley thing going on that I'm not acclimated to, or this behavior is a form of status advertisement for high status individuals, but a number of times I saw people pull out their smart phones and check messages while other people were talking to them. I had not encountered this before, though I suppose it is just a variation on the equally noxious answering-your-cell-phone-in-the-middle-of-a-conversation. (Both should be grounds for an immediate caning.)
People sometimes ask, "What can I do to be invited back?" and your best bet is to make a (positive) impression by engaging and presenting.In general, it's going to be hard to make a good impression if you have no psychological energy. And it's difficult to plan for a session or an Ignite talk when you have no idea what the audience is going to find interesting.
— Foo Camp Wiki
Shout-out: Thanks to the people who made me feel not like a stranger at Foo Camp, despite my acting like one. Selena Deckelmann, Cary Davis, Joe Hughes, Matt Cutts, Nat Torkington, Shel Kaphan, Toby Boudreaux, Andrew McLaughlin, Laurel Ruma, Emily Jacobi and many others.
by Paul Ramsey (noreply@blogger.com) at June 30, 2010 06:04 PM
Neil has posted a video of Don Norman (most famous for his book The Design of Everyday Things) speaking at the Business of Software conference last year in San Francisco.
“Imagine you’re on the first slide of your powerpoint presentation and want to move to the next slide. Your remote control has two buttons. They are unmarked, but one button points up and one button points down.
“Which button do you press?”
It turns out half the people press up, half the people press down, and everybody thinks their choice is obvious. It’s a great talk.
The early bird discount for the Business of Software 2010 (Boston, October 4-6) saves you $400, but it expires this week, so this is the right time to sign up for my favorite conference.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
Area 51 is now in beta. This is the promised place where the community comes together to invent new Stack Exchange sites.
Benofsky from Hacker News writes:
Seems overly complicated, I have no idea what's going on when I visit Area 51, I guess this is their strategy for turning away uncommitted users.
Also, how are they going to make money?
I’m glad you asked, benofsky! The answer is simple. Volume.
Well, I’m not one to take Internet chat board comments seriously. After all, the Anonymous Nostradamus’s over at Code Project reacted thus when Stack Overflow itself launched:
I think the UI sucks. I can't imagine this site being around in a year.
We all know how stunningly accurate that prediction was:
Benofsky is onto something, though. Area 51 is not for everyone. If you don’t know what it’s for, or why it’s going to work, or you can’t figure it out, it’s not, actually for you.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
by Paul Ramsey (noreply@blogger.com) at June 22, 2010 12:52 AM
by Paul Ramsey (noreply@blogger.com) at June 19, 2010 02:00 PM
Let's be clear here, physical I/O is at times *terrible*. :)
There's no way we could run this database on a single EBS volume.
We had to fail over to one of our spares twice in the last 1.5 years. Not fun. Both times were due to instance failure.Basically the assumptions of AWS architecture (virtual instances will be less reliable than real world computers, but that doesn't matter because getting a new one is really easy) don't map well with the requirements of running a classic production database.
by Paul Ramsey (noreply@blogger.com) at June 18, 2010 06:03 PM
My friend Noam at Harvard Business School does annual surveys of executive compensation in tech companies. The surveys are a great way to figure out how much to pay that VP of Sales you were thinking of hiring, or whether your equity grant as CTO is fair.
You can buy the studies for $999, or you can participate in the survey and get free access to the results when they’re published.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
When the MarineMap team started delving into the Google Earth plugin, it was apparent that it supported the display and rendering of KML files almost as well as the Google Earth desktop application. The missing piece of functionality was the nice tree-style legend that is provided with the desktop app. The plugin lets you add KML for display but gives you no HTML interface to work with it. For simple apps, you can just roll your own html/js form. But that quickly becomes unmanageable if you’re adding KML dynamically and need to create a tree-style legend for any arbitrary KML document.
Enter kmltree.
kmltree is a javascript tree widget that can be used in conjunction with the Google Earth API. It replicates the functionality of the Google Earth desktop client, and is fast, extensible, and stable for use in advanced web applications. It’s built utilizing the earth-api-utility-library and jQuery.
Any arbitrary KML can be parsed and represented in a tree-style legend right in the web browser. Try it out.
Kmltree is the brainchild of Chad Burt who developed it as part of the marinemap codebase but had the foresight to realize that this would be useful to a much wider audience and abstracted it into its own javascript library. If you’re building a web mapping application with the Google Earth API, give it a shot!
Paul Kenny is a regular speaker at the Business of Software. He’s an expert on sales, especially high tech sales, and both Red Gate and Fog Creek hire him all the time to train our sales teams and build our sales organization.
Here’s a video of his talk at last year’s conference:
The next Business of Software conference will be in Boston, October 4th-6th.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
I earned more on sales of The Elements for iPad in the first day than from the past 5 years of Google ads on periodictable.com.Quoth Jobs, "That's what I like to hear from you guys." Audience whoops.
by Paul Ramsey (noreply@blogger.com) at June 08, 2010 12:35 PM
by Paul Ramsey (noreply@blogger.com) at June 02, 2010 01:04 PM
For the last year or so, I’ve had the pleasure of working with the MarineMap Consortium. We just learned yesterday that the U.S. Institute for Environmental Conflict Resolution awarded MarineMap the “Innovation in Technology and Environmental Conflict Resolution”.
I joined the team after the launch of the South Coast of California site which was already widely recognized as a successful decision-support tool for marine spatial planning. We’ve since been working on version 2 of the MarineMap tool which is deployed currently for the North Coast of California in support of their Marine Life Protection Act (MLPA) process.
It’s been a tremendous challenge to bring a new version of the software to life and have it meet and exceed the standards set by its predecessor. It has also been tremendously rewarding and having our work recognized at this level is a great honor. It’s nice to know that the tools we’ve developed have been so helpful and instrumental in the marine planning process along the coast of California. Looking forward, I see MarineMap growing beyond a tool for a specific purpose (supporting the MLPA Initiative) to a robust framework for developing web-based spatial planning tools for all sorts of environmental applications, both marine and terrestrial. And this award confirms that we are already heading in the right direction. Very exciting news!
FogBugz 7.3 is a pretty huge release, despite the modest version number. It has a bunch of features that almost everyone will find useful on a daily basis.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
The mapbutcher thinks it's OK to get hooked on proprietary software:People are interested in the ‘express’ editions because on the surface of it the marketing works on them, they’re familiar with the brand and are attracted by the ‘free’ carrot dangling from the end of the stick. Open Source software starts from that position – it’s already free so open source projects need another carrot to get us hooked.To which I can only say "Simon! Look at yourself in the mirror, man! Do you want to end up whoring yourself down on Dalgety Street to pay for your ESRI habit?"
by Paul Ramsey (noreply@blogger.com) at May 18, 2010 03:53 AM
A favorite bon mot of open source critics is that open source software is "free like a free puppy". Tee hee! Open source advocates should remember to keep the rejoinder handy, that proprietary software is "free like a free hit of crack". Oracle "Express", SQL Server "Express", ESRI educational copies, yes I am looking at you.by Paul Ramsey (noreply@blogger.com) at May 17, 2010 05:14 PM
I was blessed (or cursed) to go through my undergraduate years from 1989 to 1993, and at that time, I'm sad to say, there wasn't a lot of nerd chic. I did my degree in Mathematics. The computer science student on my dorm floor ended up gainfully employed programming mainframes at Safeway. It was not, shall we say, a glamourous time for young nerds. On the other hand, the pressure wasn't exactly on.by Paul Ramsey (noreply@blogger.com) at May 14, 2010 01:56 AM
I’m a long-time Kathy Sierra fan. Her talk at the Business of Software 2009 was amazing, even though, in retrospect, I realize now that she had a slide making fun of Stack Overflow’s terrific new VC-backed business model. She even got the unicorn!
Watch the whole talk here. The next Business of Software conference will be in Boston, October 4th-6th.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
I don’t know how I let this gem slip past my radar for so long. It was only via a post by Dr. JTS himself (aka Martin Davis) that I saw a screenshot of JTS TestBuilder and decided to check it out.
I was actually just talking with someone about a tool that could provide simple visualization of WKT geometries; JTS Test Builder does that and much more.
You can input geometries (graphically or by well-known text) and compare two geometries based on spatial predicates:
Do overlay analyses with the two geometries. Note that you can see the result as WKT below.
And there are a host of other spatial operations to generate geometries using buffers…

This app provides a very nice and user-friendly way to quickly and simply explore and test geometric operations. To try it out, download JTS and unzip the contents somewhere. If you’re on windows, the .bat file is provided. If you’re running anything else, you have to cook up a shell script that will set up the environment and run JTS TestBuilder:
JTS_HOME=/usr/share/java/jts-1.11 CP=$CLASSPATH for i in $JTS_HOME/lib/*.jar; do CP=$i:$CP; done java -Xmx256m -cp $CP com.vividsolutions.jtstest.testbuilder.JTSTestBuilder $*
by Paul Ramsey (noreply@blogger.com) at May 05, 2010 04:55 PM
“And the best answer we could come up with was, let’s make the damn thing free, and get some VC somewhere to pay for it.”
Announcing the Stack Overflow Series A financing
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
by Paul Ramsey (noreply@blogger.com) at May 01, 2010 02:00 AM
Dear TechSmith,
Thank you very much for all the pictures of your pets:
Also thanks for the toys, which were great. I especially like the iPhone.
Yours,
Taco.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
by Paul Ramsey (noreply@blogger.com) at April 30, 2010 01:15 PM
by Paul Ramsey (noreply@blogger.com) at April 22, 2010 05:04 PM
by Paul Ramsey (noreply@blogger.com) at April 20, 2010 06:07 AM
Since announcing the new plans for Stack Exchange, there’s been a lot of discussion about what kind of new Q&A sites will work best on this platform.
S
o far there are 32 informal proposals on meta.stackexchange.com. We’re weeks away from opening a site where these proposals can become real.
From my answer to the Firearms proposal: “The power of the Stack Exchange platform is detailed, expert answers to extremely rare, ‘long-tail,’ highly technical questions. To get expert answers, you need experts. To attract experts, you need a site where people are asking very interesting and hard questions, not the basic questions, so that it’s clear that this is a PRO site, not a consumer/enthusiast site.... and remember, the pro sites WILL attract the enthusiasts, but not the other way around.”
From my answer to the Law proposal: “There are only 200 easy law questions, and they've all been asked 100 times on Mahalo and Yahoo!Answers. But there are 20,000,000 detailed, difficult, long-tail questions that only professionals can answer, and we'd be doing a REAL service to the Internet by creating a place where you can find answers to the 20,000,000 hard questions, not the 200 easy ones.”
Our core mission at Stack Overflow is:
Make the Internet a better place to get expert answers to your questions.
The “expert” part of that mission is important, otherwise we’re just building another place for the same questions that every other Q&A site has. We want the law Stack Exchange to attract lawyers, the movie Stack Exchange to attract filmmakers, and the aviation Stack Exchange to attract pilots. What makes a community great is great people... that is, real experts. And the experts want to hang out with other experts.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
(The following opinions are my own, and not representative of my employer or anyone else.)
A friend asked me via email:
I noticed you’ve had your N900 for a while. I am thinking about upgrading from my iPhone 3G (it’s really slow — lots of lagging on UI) to a Nexus One or a N900. Have you had a chance to compare the two at all? Where did you get your N900? Any “killer apps” or major problems with it?
I don’t know if ‘5 days’ is ‘a while’ yet.
As for how I got it… well, perhaps you missed my previous post…
I think that upgrading from an iPhone — if you generally like the way it works, and are just upset about the UI speed/performance — will be a disappointment. I have an iPod Touch and the n900, and when I want to run an app real quick, the iPhone will win, hands down. The N900 has far more functionality to be excited about, but in general, there are still aspects of the iPhone that win. Basically: If you didn’t jailbreak your iPhone, you’re not looking for the ‘right’ kind of thing for an N900 to be the solution. (I didn’t jailbreak my iPod, but it’s a media player, not a communications device.)
I don’t have experience with the Nexus One. The G1 users in the office have commented repeatedly on how ‘fast’ the N900 response is by comparison: my understanding is that the Nexus One is a significant hardware step up from the G1, so that experience may be irrelevant. (G1 users also have said “If they just came out with a ‘G2′ that just had double the CPU + double the memory, I’d buy it in a heartbeat.”)
Before the recent events, I was considering the N900 or the G1. After playing with a G1 for a while, I realized that it — sort of like the iPhone, though to a lesser extent — is also not a general purpose computer. It’s closer, because it’s more open, but in the end, it’s designed as a ‘platform’, and that’s obvious in many aspects of how it works. The Maemo OS was always developed for Internet Tablets, and that shows in many aspects of the design. (This is also why it makes a somewhat sub par phone; although the OS has grown well into many aspects of the device, the ‘phone’ app is recent enough that it hasn’t had time to mature into that role.)
Overall: If you’re the type of person who wants to run a shell script, and display the results of a shell script on your phone’s desktop, the N900 may well be for you. (Really.) If you want a platform, but for something that’s designed originally as a phone, and with a much broader ecosystem and community — but more limitations ‘out of the box’ — the Nexus One may be for you, though that’s mostly hearsay. (I would consult a G1/Nexus One user for anything resembling a serious opinion here.) And if you want something pretty that isn’t going to require you to pop open a terminal to fix it when something breaks — the Apple way may be the right way for you.
Some cool aspects of the N900: two-way video calling with Google talk (but only when initiated from a computer, sadly). Two way audio-chat over Jabber. Built-in always-on IM clients. Exchange mail push support built in. (Exchange support in general is excellent; this includes both ‘real’ exchange and clones like Zimbra.) ‘apt-get install openssh’. Doom on the phone. High res screen, great for video playback.
Some things it doesn’t do well: Making it trivial to open the actual ‘phone’ part (hardware button) would be great. The lack of Facebook app is disappointing; the iPhone one was so good that I was spoiled by it. (I’m not a huge Facebook user, so this isn’t a deal breaker by any stretch.) The fact that there was not, until recently, a well-supported way of distributing non-open applications, means that there isn’t a lot of non-open application development — so fewer professionally done games, free or pay, than on a platform like the iPhone (and I assume fewer than on Android as well). Ovi Maps, does not compare favorably to Google Maps in many cases, and running apps via the browser just doesn’t feel right. (This is a start, but not really ideal.) Battery life is poor, but that’s probably my own fault.
As a final point of comparison, the app community for the other devices doesn’t even compare to Apple’s in quantity. However, overall, the ‘decent, usable, free apps’ communities do seem somewhat larger on N900 than on Apple, in my experience. Finding something free on iTunes that’s worth downloading is hard — but the Maemo garage is full of fun, useful apps, and they’re all free.
I like the N900. It’s certainly not for everyone, but for me, I like having my communications device being a general purpose computer (so long as the phone part keeps working). There’s plenty of room to improve, but having a very open ecosystem reassures me that I may be able to contribute some of that, and overall, it fits the bill for being the most awesome thing to carry around in my pocket.
The presentation abstract deadline has passed for FOSS4G 2010 and there have been 354 abstracts submitted! I'm not sure the exact number of session slots in the planned program, but for comparison 2007 had 120 slots and subsequent events have been similar -- that's about how many 30 minute talks you can fit into two days in a five-track format. In 2007, the biggest FOSS4G so far, we had around 240 submissions for our 120 slots. So, with three submissions for every slot, 2010 is looking like it is going to be gangbusters! Everyone wants to go to Barcelona, I guess they heard about the escudella i carn d’olla.by Paul Ramsey (noreply@blogger.com) at April 16, 2010 11:51 PM
Like the small-town mayor who suddenly finds herself running an entire state, our ambitions for Stack Overflow keep growing. Our original idea of making the Internet a better place to get expert answers to your programming questions suddenly seemed too small. Programming questions? We asked. Why just programming questions? Why not every question under the sun? And who says we can’t run for Vice President of the United States of America?
We tried making our software available as a hosted white label product called Stack Exchange. We thought that other people would create awesome sites on every imaginable topic. Some people did (yay!), but it wasn’t the flood of high quality sites we were hoping for.
So we’re making a few changes. Briefly:
If you’ve already created a Stack Exchange site, be sure to read the announcement in more detail to hear about our transition plan. Don’t be alarmed; we’d never do anything to mess with Stack Exchange sites that are already working.
Read all the details on the StackExchange Blog.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
We’ve put our first QR Code up at the museum as an experiment. This seems like one way to deal with “nth level” information that might be interesting to some visitors but not to others. And it’s a way to make it easy for visitors to bookmark information for themselves.
Generating the QR Code isn’t hard. Google’s Chart api can do it. Basically, anything you put fullowing the “chl=” part of the URL here will generate a code: http://chart.apis.google.com/chart?cht=qr&chs=350×350&chl=http://think.random-stuff.org/
We’ve set aside a specific URL space for our codes to send people to. Each link will first take you to a short URL which will then redirect you to the actual URL relevant to the exhibit. The advantage of this is that we can also put up short, “human readable” links on the exhibits. That will let us track how often the links are getting used and what mobile devices people are using. We’ve also put an explanatory page at the top level of that space.
There was a little debate about how much we should try to explain QR Codes on the exhibit itself. You can see what we wound up with in the detail photo. Basically we’ve decided that visitors will either (a) recognize the code and know what to do with it, (b) not recognize it and skip over it, or (c) ask someone. The “c” people can be given a printout of the explanatory page.
We’ve decided to introduce the codes slowly and in a way that hopefully doesn’t get in the way of people who don’t know what they are or don’t choose to use them.
Another question was whether we should format the linked pages in a phone-friendly format. The easy answer (because it requires no additional resources…) was not to do that. Phones are getting pretty good at reading full-blown web pages.
For further reading, here’s a March 2009 article titled QR codes in the museum – problems and opportunities with extended object labels
What QR Code app am I using? Right now on my iPhone 3G, I’ve got Barcodes. It’s got a huge number of one-star, negative comments but it works for me. The critical thing you need to know is that it only works on QR Codes, not regular barcodes, and at least with the 3G, you have to take the photo from about 18″ away and then use the app to zoom it to the right size.
As of April 9th, MetaCarta has been acquired by Nokia, and I am now an employee of Nokia working on local search in the Ovi services. (Woohoo!)
Blog post on the Damascene (or otherwise) conversion from GPL-ish to BSD-ish please. In your own time.The reason I was even mentioning the license issue is because I was watching a panel discussion at Where 2.0, in which Steve Coast, in defending the GPL-ish license used for OpenStreetMap, said (paraphrase) that the rationale was keeping a third party from taking the open data, closing it, and working from there. And that rationale pretty closely mirrors how we were thinking when choosing the GPL license for PostGIS, back in 2001.
by Paul Ramsey (noreply@blogger.com) at April 07, 2010 03:21 PM
I’m always on the lookout for low-cost, easily maintained computers to drive displays or do other odd jobs around the museum. The Mac mini is still the gold standard for me. But even with the educational discount, a Mac mini can seem like overkill. We have an exhibit coming up where there’s going to be a projection of a single, still image. Some projectors can take an image from a flash drive, but none of the ones we have laying around can do that. So it was either spend money on a projector that can, or get a computer to drive it. (We could also use a DVD player with a single frame video loop, but that wouldn’t give me full 1024×768 resolution on the projector.) So last week I bought an Eee Box B202 preloaded with Linux.
Initially it was a bust. I hooked it up to a monitor, turned it on, and it booted to a text login prompt. No nice multi-media GUI, nothing. Just login:
Googling around was no help. I couldn’t figure out how to make it start X Windows or anything. The OS that’s on there is called Red Flag Linux. It seemed to have everything it needed, but I don’t have enough Xorg fu to understand how it was supposed to figure out how to configure itself for the monitor I had.
It turns out that was a blessing in disguise. After a little more Googling, I found myself making a bootable USB stick with Ubuntu 9.10 on it. I wound up using the “From Linux” instructions from another Ubuntu box. I debated whether or not to use the netbook distro or the full desktop one. I picked the full one. It turned out to be the right choice.
I did mess with the B202’s BIOS a bit to figure out how to make it boot from the USB stick. I’m not sure whether any of that was strictly necessary, but I had changed a few things to try to get the original software running.
After that it was smooth sailing. Ubuntu booted right up, running from the USB stick. It helpfully presented the option of installing from the stick. Once I made sure it would be able to work with the ethernet and WiFi, I used the installer to reformat the drive and install Ubuntu.
Things went so well, I’m ordering another one. The first one’s going to run our projector. The next one’s going to act as a WiFi to ethernet connection sharing router.
This was my first experience with a LiveCD/LiveUSB/etc. linux. It’s probably unremarkable these days, but I’m impressed with how easy it was to do.
Update: I just got my 2nd Eee Box. This one came with Windows XP pre-installed. Here are the steps needed to install Ubuntu:
Now it will boot from the USB stick. At this point you can either boot into Ubuntu w/o installing (i.e. run from the stick) or install Ubuntu. If you’re unsure whether you want to go through with this before you try, then choose the first option. Note that it takes a longish time to boot from the stick.
Once it boots, you’ll see an icon in the upper left corner labeled “Install Ubuntu 9.10″. Double-click that to do an installation.
There is a new book out by Fred Brooks (author of The Mythical Man Month)!
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
I’ve been playing around with some distributed version control systems (DVCS) to replace svn.
First, the why: I’ll leave the details up to Joel in his excellent HgInit tutorial. Its mercurial-specific but the general concepts apply to any DVCS. The takeaway message for any project with > 1 developer is this:
Mercurial [ed: DVCS] separates the act of committing new code from the act of inflicting it on everybody else.
Next, the implementation: I’m using git to work on another project (Golden Cheetah) and its been a tough learning curve. Git is no doubt the most powerful DVCS out there. You can do magical things with it like combine commits and mess with history trees. And you can also screw things up pretty badly if you misinterpret the esotric docs for some non-intuitive piece of the workflow.
I just tried mercurial this morning - hg seems to fit my mind well. There is less power but the workflow is very clear and intuitive. And there are docs written for people who don’t want to do an in-depth study of their version control software. It stays out of the way.
Long story short, I’m going to use mercurial/hg for my new projects. Ah what the heck my old/ongoing projects as well. My googlecode repository has been converted over to Mercurial. Svn will stick around but wont be updated.
The entire extended Stack Overflow team (including the Stack Exchange team) is meeting in New York in April to do some strategic planning. For example, we need to plan our Rock Band song lists, decide who gets to be on the drums and who is stuck with the USB cowbell, etc.
If you’re going to be in the city on Tuesday, April 6th, we’d like to invite you to join us for a party and a chance to meet the team. This is also a chance to see the new Fog Creek office if you haven’t visited yet.
If you want to come to the party, you must register. Please do not register if you’re not sure that you’re coming, as space is limited. Only people who are on the list will be admitted.
Need to hire a really great programmer? Want a job that doesn't drive you crazy? Visit the Joel on Software Job Board: Great software jobs, great people.
So, just to finish off what I’ve learned about newsyslog on Mac OS X…
In addition to figuring out how to deal with denyhosts, here’s how to set up Apache and Mailman log rotation.
I’m running standard Apache 2.2 that comes with Mac OS X 10.6. I like to keep all my virtual hosts in one place, so in this example they are all in /Users/web/. Each host gets a directory structure with it’s own name:
# ls -l www.example.org/ drwxrwxr-x 4 _unknown _unknown 136 Jan 27 16:47 htdocs drwxrwxr-x 80 _www _www 2720 Mar 29 00:33 logs -rw-r--r-- 1 adoyle web 1881 Feb 20 15:44 www.example.org.conf
The logs for each virtual host go into the logs directory for that host (access_log, error_log, rewrite_log). Ownership on the log files turns out to be important. I’ve found it works best for me if they are owned by the www user and group (or _www, they are essentially the same – something I need to understand the reason for someday).
In /etc/newsyslog.d/local.conf, the following lines deal with rotating logs for three virtual hosts. Using the ‘G’ flag lets you use ‘*’ and other shell wildcards in the file names. I think I could probably have collapsed these into a single line if I had used /Users/web/*/logs/*log instead. In this case, folding things up too much makes it less readable, I think.
The _www:_www takes care of preserving the file ownership after the logs are rotated. A count of 30 means keep around up to 30 old logs. $D0 means rotate daily at 0:00. The ‘B’ flag prevents the “Log file was rotated” message. Apache keeps a pidfile in /var/run/httpd.pid. If you send a kill -30 to the pid in that file, it will cause the equivalent of an ‘apachectl graceful’.
If you don’t provide the pidfile and proper signal number, the logs will rotate, new log files get created, but Apache won’t write to them because it’s still trying to write to the old ones.
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /Users/web/lists.example.org/logs/*log _www:_www 664 30 * $D0 GBJ /var/run/httpd.pid 30 /Users/web/foo.example.org/logs/*log _www:_www 664 30 * $D0 GBJ /var/run/httpd.pid 30 /Users/web/www.example.org/logs/*log _www:_www 664 30 * $D0 GBJ /var/run/httpd.pid 30 #
With Mailman I had a slight problem. Mailman doesn’t use nice .log or _log names. It just uses names like bounce, error, post, qrunner, etc. I could have made an entry in the local.conf file for each one, but that seemed error-prone. What if later there’s a new version of Mailman that generates different log files?
My initial assumption was that I could use …/logs/* and newsyslog wouldn’t try to rotate logs it had already rotated. Guess again. After two days, my disk had nearly filled up with files ending in .bz2, .bz2.bz2, .bz2.bz2.b2z…, you get the picture. Luckily I noticed it before the disk did fill up. I got suspicious when my backups on the third day were 15GB bigger than the ones on the first day. I have no idea how many files actually got created. ‘ls’ was unable to produce a listing in the amount of time I was willing to wait. Luckily rm -rf did work. It took several hours to delete all the files.
I’m assuming newsyslog had gotten into a recursive loop right away when it ran at midnight and never stopped churning out files until I killed it.
So anyway, the moral of the story is, if you’re going to use wildcards, make sure they don’t match the rotated logs.
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /Users/mailman/logs/*[a-z] mailman:_www 664 30 * $D0 GBJ /Users/mailman/data/master-qrunner.pid 1 #
Mailman wants to be hit with a kill -1, so that’s what I used.
Things have been noodling along for a few weeks with my setup, so I think I have the kinks ironed out.
Usually I'm 100% focused on open source software, but couldn't resist talking about this side project. A couple months ago Geoff pointed out the new Autodesk Butterfly project, allowing you to share and collaborate on drawings using only a web browser. They have some geospatial examples on there too. Here are couple notes about my tests on it lately.

I just spent some time figuring out how to set up denyhosts on Snow Leopard. I’ve used denyhosts before, but never felt like I had things set up properly for Mac OS. Now I think I have it figured out, so here it is. This is for 10.6, your mileage may vary on earlier versions.
I had three goals – get denyhosts working, get it to start automatically at boot time, and to deal with rotating the logs.
1. Installation
Easiest first – installing denyhosts. Note that you need to be root to do this. Pretty much just follow the directions. These are the three main settings to worry about.
SECURE_LOG = /private/var/log/secure.log LOCK_FILE = /var/run/denyhosts.pid DAEMON_LOG = /var/log/denyhosts
Note that you also may need to create the file /etc/hosts.deny:
touch /etc/hosts.deny
Using touch will create a zero-length file if it’s not there. It won’t affect the contents if it is there.
2. Log rotation
Mac OS 10.6 uses newsyslog to rotate some log files (I’m not sure why, but apache logs don’t seem to be dealt with by newsyslog). To add your own to the mix, just put a file into /etc/newsyslog.d/ following the format for newsyslog.conf(5). I called mine local.conf
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/denyhosts 640 5 * $D0 J #
The trouble is, this rotated the log just fine, but then denyhosts stopped logging because newsyslog essentially pulls the rug out from under denyhosts by moving the file.
One design difference between newsyslog and logrotate is the way they deal with notifying processes that logs have been rotated. Logrotate uses prerotate and postrotate scripts, which would be ideal for denyhosts. The way you start and stop it is with
daemon-control start daemon-control stop
daemon-control stop actually sends a SIGTERM to the denyhosts process, but that won’t do any good in the newsyslog config file since once stopped, you need a command line to start it up again. So I decided to tweak the daemon-control script to do this. I replaced the start() function with the one here:
def start(*args): cmd = "%s --daemon " % DENYHOSTS_BIN if args: cmd += ' '.join(args) print "starting DenyHosts: ", cmd while True: os.system(cmd) time.sleep(5) while True: pid = getpid() if pid >= 0: time.sleep(300) else: break
This just keeps daemon-control running rather than letting it exit after it starts denyhosts. The outer loop starts denyhosts running and later restarts it. The inner loop just waits until it sees the pid file go away. That’s a sure sign that denyhosts stopped running, most likely because of the SIGHUP it will get from newsyslog. Now all I needed to do was add the signal info to my /etc/denyhosts.d/local.conf /etc/newsyslog.d/local.conf file:
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/denyhosts 640 30 * $D0 BJ /var/run/denyhosts.pid 15 #
I’ve also changed it to keep 30 days of logs, and added the B flag to prevent newsyslog from adding a line to the file saying it’s rotated the logs. Note that I changed the name to daemon-control2 so if I update denyhosts later, my changes don’t get clobbered.
3. Start at boot time
It turns out that modifying daemon-control to never exit is also just the ticket for running it under launchd. Launchd doesn’t work well on scripts that launch daemonized processes. It watches the script and notices that it’s exited, then tries to start it again.
I made a file called /Library/LaunchDaemons/net.hosts.deny.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>net.denyhosts</string>
<key>ProgramArguments</key>
<array>
<string>/usr/share/denyhosts/daemon-control2</string>
<string>start</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ServiceDescription</key>
<string>Lauch denyhosts</string>
</dict>
</plist>
Get it started with launchctl:
launchctl load /Library/LaunchDaemons/net.hosts.deny.plist
My /etc/hosts.deny has about 8500 hosts in it right now. Many of those are probably from the denyhosts synchronization feature pulling in IP addresses from the central server.
Update 2010-03-26: Added some links and clarified some bits.
Update 2010-06-06: Note that /etc/hosts.deny must be present. denyhosts won’t create it.
The 2011 FOSS4G siting process has begun. After the 2010 process, where there were too many good proposals and not enough slots, we decided to do a couple things to lower the effort level required by bidders in aggregate.by Paul Ramsey (noreply@blogger.com) at March 23, 2010 11:30 PM