RegExr: Online Regular Expression Testing Tool : a very nice interactive editor in Flash, supporting lots of the usual perlish stuff. via Joe
(tags: via:jdrumgoole regexps regular-expressions spamassassin rule-dev flash regex flex utilities)
RegExr: Online Regular Expression Testing Tool
: a very nice interactive editor in Flash, supporting lots of the usual perlish stuff. via Joe
(tags: via:jdrumgoole regexps regular-expressions spamassassin rule-dev flash regex flex utilities)
I love charts like this.
This chart implies that if you want to know what it costs to make something all you need to know is how much it weighs and how many are produced. Note also that this is my favorite grid: log-log. So, you get quite a large factor in the variance around that line. And then, you don’t often see that curve on log-log graphs. The chart is taken from Dan Nocera’s Pop!Tech talk on “Personal Energy” which makes an interesting arguement about the shape of the industry we will need to solve the energy crisis; i.e. a few very big producers should produce the capital equipment which is then run locally by billions of households; i.e. down in the lower right of that chart. He’s the guy who’s lab at MIT found a new catalyst that they claim is a game changer when it comes to splitting water to get hydrogen.
A quick search didn’t turn up the original source, presumably by Schmidt and Slocum, of that chart. Anybody happens to have a pointer, or better yet the paper?
You can cache your modified files on the server, without having to check them in as a versioned change. For teams, shelving makes code reviews and code handoffs possible. Individuals can use shelving for multi-tasking, code shunting, incremental snapshots, and safety nets.
OSS Watch are working with Scott Wilson and his colleagues at the University of Bolton on the Apache Wookie (Incubating) project. Since I’ve been busy on other Wookie things today I’ve not had time to write a blog post, so I’m just going to steal one of Scotts (well, I say “steal” but it’s under creative commons on Scott’s blog so it’s not really stealing).
After a marathon code sprint [well done Scott - RG] Apache Wookie (Incubating) now passes all 166 W3C Widgets conformance tests, the third application to reach a 100% pass rate.
Two other applications - the Aplix Web Runtime engine and the BONDI reference implementation for Windows Mobile - have also been able to successfully pass all the conformance tests. Several others are also approaching a full pass rate, as can be seen on the W3C implementation report.
Not only is this good news for Wookie its also good news for W3C, as more successful implementation helps the progress of the specification. Also, open source implementations can also help other developers build interoperable applications by reusing code. I hope in future we’ll be able to make the widget parser in Wookie distributable as a standalone library as well as part of the Wookie widget engine, to help with this process.
Useful links:
The Pragmatic Programmer folks have a new book out called Domain-Driven Design Using Naked Objects which caught my attention. The title caught my attention, and I figured the author was using Naked Objects in the same vein as Jamie Oliver as “The Naked Chef” (old series on Food Network). Essentially, the ingredients are used to their full potential, complimenting each other without the heavy use of spice. So I decided to do some research on where this came from. My suspicions were confirmed, and made even more sense when I found the original thesis came from someone at Trinity College, Dublin.
I found the original thesis by Richard Pawson entitled Naked objects where he details the principles behind the concept. The thesis is very readable, as theses go. It is broken up into an introduction, a case study, guiding principles, etc. What I found more interesting was the forward written by the pioneer of the MVC pattern, Trygve Reenskaug. The concept of Naked Objects isn’t exactly new, and it should be lauded for its intent of getting back to the proper intent of object oriented design and programming. Of course, as a technology, and as some of the design constraints of naked objects, the thesis is not without detractors. For example a short paper by Larry Constantine called The Emperor Has No Clothes: Naked Objects Meet the Interface .
The true value in something like Naked Objects is to get you to adjust the way you are thinking. The main concept is to build the complete logic of the system using a finite set of domain objects. The framework is designed to take care of database persistence and user interface. According to the forward in the thesis, the spirit behind MVC is that each view is mapped to only one object, although each object might be mapped to many views. The controller is responsible for mapping the events of the view (inputs, etc.) to the domain model. Essentially the domain model (or model) uses views for output and controllers for input. This is different from the way it was originally described to me and I originally understood the pattern. Pawson argues that the framework can generate the user interface views and controllers automatically. Further advances in the concept also automatically maps the domain model to a relational database using Hibernate .
The software developer side of me likes this concept. It’s less plumbing to worry about. I don’t have to know how to code a user interface. I can get my work done quicker. However, the user interface design side of me loathes the concept because the user interface (admittedly by Pawson) is not easily grasped without training, nor is it particularly accessible. The architect in me is thinking about how I can have my cake and eat it too. Ignoring the problem of database mapping for a moment, the real challenge is in the view/controller (VC) layer. Pawson sites arguments from advocates of Object Oriented User Interface (OOUI) design that there is only one true correct way of representing an object. Yet turns around and presents two: an icon to represent the object and a dialog box to represent the content in the object. In my own project I am working on now, there are at least two representations of every object: the view in a list, and the view of the full content of the object. Nevertheless, there still remains concepts I can leverage.
In some respects Wicket would be an ideal candidate for dynamic generation of VC code. Or at the very least, due to its attempt to treat the view layer in an object oriented manner, some extensions to the application can dynamically generate the controller side. I have some reservations about pursuing that too far at the moment. The real conundrum is in the presentation layer. Managing information and behavior is something that object oriented languages are designed to handle. It is right and good to take advantage of the features of your language to properly model the business domain. However, representing that same information to the user in a way that makes sense to the user is a completely different discipline. I can argue against the principles in OOUI till I’m blue in the face, but that doesn’t solve the fundamental problem.
What we need is a way for the programmers to create the functionally complete object oriented domain model, while your user interface specialists concentrate on their responsibility. While frameworks such as Wicket have tried to address that very problem, it is my personal opinion that they fall a little short. I don’t think the fault lies with Wicket. The fault lies within the current set of W3C standards and differing levels of browser compliance. The W3C is still stuck on a model that prefers static information. If the W3C were to truly pursue a model where the user interface layer is bound to certain objects and the browser makes calls to the server to render these objects we might have a better solution. We’ve already started down this path with AJAX and the myriad of Javascript frameworks to make this work. Needless to say that there is a lot of future work that has to be done in order to truly see a synergy from functionally complete domain models and an object oriented user interfaces.
The goal of such an endeavor should be to allow user interface designers these freedoms:The controller logic should be built into the browser already, in terms of invoking the domain model (or representations of a remote object).
While I’m on the subject of Naked Objects and domain models, I’d like to make a minor rant on Object/Relational Mapping tools. One of the problems is that ORM tools tend to require accessor and mutator methods (getters and setters) for every field that is going to be persisted to the database. While you are technically encapsulating the internal state of the object, in 99.44% of the cases there is no difference in using the accessor and mutator methods and directly accessing the underlying attributes of the class. In a properly designed object, you only need to expose information via accessors that the user is allowed to see, and you only provide mutator methods for what the user is allowed to change. ORM tools require you to violate those principles if you want to persist the information down to the database. Some ORM tools (ActiveRecord) generates these accessors and mutators dynamically for you. That’s great for convenience, but terrible for a properly designed domain model. For the time being, there really is no alternative unless you write the ORM layer yourself. Not recommended if you can help it.
| OS | ||||
|---|---|---|---|---|
| 2007 | 2008 | 2009 | Last month | |
| Windows | 79,45% | 76,10% | 72,16% | 68,92% |
| Linux | 13,61% | 15,11% | 16,89% | 18,74% |
| Mac OS | 6,27% | 8,13% | 10,21% | 11,61% |
| SunOS | 0,23% | 0,28% | 0,35% | 0,33% |
| iPhone | 0,01% | 0,07% | 0,09% | 0,10% |
| IE stats | |
|---|---|
| 2007 | 36,42% |
| 2008 | 30,15% |
| 2009 | 23.99% |
| Last month | 21,31% |
HP is touring a 2-day show on convergence. I attended the second day, mostly to get an update on ProLiant blades. I was impatient with all the HP boosterism, but perhaps that material was appreciated by the HP employees and vendors present. There were a lot of dense slides on blades & VMware, but unfortunately they aren't yet cleared for publication so we didn't get copies. Hopefully the presentations will be available on the roadshow site next month.
The most interesting parts for me were an update on HP BladeSystem, and a competitive comparison (mostly trash-talking) about HP BladeSystem C-Class vs. Dell, Cisco, & IBM blades -- particularly as VMware hosts. There was really no mention of Itanium, except as a bullet point: HP offers Itanium blades (no mention of Cell).
Intel Nehalem (the Xeon 5500 series) still only supports 2-socket configurations ("2P"), so HP continues to recommend AMD Istanbul (6 cores per socket) for 4P and larger systems. Interestingly, there was only a single mention of boxes larger than 4P. IBM presentations I have attended, by contrast, tended to focus on their Hurricane & X3 chipsets, which are only available in 4P and larger systems. I wonder how much of this is because IBM is proud of Hurricane, and how much to HP's focus on blades (which don't make much sense beyond 4P).
Each Nehalem CPU has its own 3-channel memory controller, and each channel supports up to 3 DIMMs. In a 2-way box, this maxes out at 2 (CPUs) * 3 (channels/CPU) * 3 (slots/channel) = 18 DIMM slots. Unfortunately, Nehalem cannot use all DIMM slots at full speed. The highest speed is 1333MHz, which requires a single 1333MHz DIMM per channel (DPC) and a 95W CPU. Utilizing the second DIMM slot reduces memory access speed to 1066MHz (although HP apparently has a trick to retain the 1333MHz speed at 2DPC); a 3rd DIMM reduces speed to 800MHz. DIMM mismatches within or across channels can also reduce speed.
4gb DIMMs are common, but 8gb is uncommon and still often prohibitively expensive. This means normally the fastest possible configuration is 2 95W 5500s with 6 4gb 1333MHz DIMMs: 24gb (or 6gb or 12gb with smaller DIMMs). HP's 2DPC trick offers the same speed up to 48gb with 12 DIMMs. Maximum Nehalem RAM capacity is 18 8gb DIMMs: 144gb at 800MHz.
HP's bread & butter blade is the BL460c (they claim it's the most popular server in the world, eclipsing the 2U DL380). The BL460c offers 2 (dual or quad core) Xeon 5500s, 12 DIMM slots, 2 hot-swap 2.5" SAS/SATA drives (with embedded RAID controller), and 2 Flex-10 ports.
The BL490c only accepts quad-core Nehalems (no dual-core) and gets 6 more DIMM slots, suiting it better to large VM loads. But it also gives up the BL460c's pair of hot-swap RAID SAS/SATA bays for a couple non-hot-swap non-RAID SATA SSD bays. Presumably The 490 doesn't have enough cooling for spinning disks, and they expect you to put it on some kind of SAN anyway.
Flex-10 sounds very slick. Physically they're 10GE ports, but when uplinked to an HP Flex-10 Virtual Connect switch module, each Flex-10 connection appears to the host as 4 independent 10GE interfaces. The administrator can carve up the 10gbps of real bandwidth between the virtual interfaces -- something like NIC trunking/bonding/teaming and OS-based virtual interfaces, but implemented below the OS level. This should be extremely useful for clustering and VMware hosts, where the vendor requires (Microsoft) or runs faster with (VMware) more network devices, or as a simple way of implementing QoS. It's now easy to get a 2P 12-core system with up to 192gb of RAM, which can host a lot of VMs. In an iSCSI or NAS environment, the BL490c may not even need mezzanine cards to handle their IO. The HP Virtual Connect Flex-10 Ethernet Module is really a 24-port 10GE switch with 16 internal ports (for blades) and 8 external ports (for uplink & inter-chassis crosslink). This means maximum uplink bandwidth is 80gbps/switch, while total internal bandwidth to blades is 160bps/switch. If you have several blades which sustain >10gbps bandwidth, they'll need to be scattered across chassis to avoid competing for uplink bandwidth -- or perhaps migrated to standalone DL rack servers instead.
They also talked about the BL2x220c high-density blades: 2 2P motherboards in one half-height blade module. Each independent motherboard has 2 (dual or quad core) 5500s, 6 DIMM slots (48gb max), 2 1GE interfaces, and a single non-hot-swap 2.5" SATA drive. To use all the interfaces you need 4 switch modules -- each blade has 4 GE interfaces total, so 2 use the mezzanine connectors. Since you have to remove the whole unit to service either side (including disks), you need to figure out how to handle failures. They look good for HPC clusters, where the job scheduler can work around missing nodes.
Apparently iSCSI boot and acceleration (CPU offload to NICs) are expected in the G7 Flex-10 NICs, which should be very useful for HPC clusters.
Since this was HP boosterism, there was plenty of poking fun at IBM's less-well-endowed motherboards, with less or asymmetrical DIMM slots. And no mention of when 6-core Nehalems will be available in HP blades.
HP sells bundles under the BladeSystem Matrix name. This is good, as HP quoting is painfully arcane. Building a specification is a painful process of tracking down many different subcomponents, some of which have unintelligible names, and getting pricing from a rep. I have quoted IBM BladeCenter and HP BladeSystem gear, and IBM was complicated, but I eventually built up a spreadsheet and could calculate complete configurations with part numbers for entire or multiple chassis, fiddling with processor speeds or RAM configuration and getting real pricing for review by a reseller.
With HP, I have to give something much vaguer to a rep, who adds lots of unintelligible line items (without which the things won't work), and sends back pricing. When I complained to an HP rep years ago about how complicated the process was, he explained that HP had once lost a bid (to IBM?) by 25c, and decided to unbundle everything they possibly could so base price would be as low as possible. Once you get the low bid from HP, you get to add all the things (like access to the KVM features of the included ILO hardware), and get a higher real price. But the unbundling means only professionals can quote medium complex HP systems, so hopefully Matrix will help. I don't yet know if purchasing Matrix bundles would require us to purchase management software we don't want and won't use.
They also talked quite a bit about Insight Dynamics, a management system for BladeCenter. ID apparently makes it easily to download a template for a medium-complicated constellation of systems (like a multi-server Exchange installation) and have ID come up with where to deploy the components (to a combination of physical blades and VMs). I believe someone claimed ID can migrate physical machines to VMs (P2V) and vice-versa (V2P). This competes directly agains VMware VirtualCenter.
The idea is that HP Blades and specifically ID get you partway to cloud computing. Amazon & Google do basically effortless provisioning, so HP needed to improve the process of setting up new blades & VMs. Insight Dynamics can provision blades & VMs, although I'm not sure how many people trust it to yet...
They also talked about FCoE (Fibre Channel over Ethernet, which Cisco promotes). Fibre Channel protocols are intended to run over lossless SANs, while one of the main purposes of TCP is to compensate for the lossy nature of Ethernet. Apparently CEE (Converged Enhanced Ethernet) provide lossless layers which enable FCoE to work over longer ranges and more hops. It sounds like CEE will be available in 2010/2011. In the meantime, iSCSI looks interesting, especially if you can provide QoS controls (Flex-10?) to keep it from swamping everything else.
They also talked about LeftHand Networks, which HP bought last year. The LeftHand Virtual SAN Appliance is a VMware image, which presents any locally accessible storage as iSCSI devices.
Gruber's note on the Chromium Bug Report: Close Tab Button on the Wrong Side feels misguided to me. I suspect he's missing the point. To Google, Chrome is the important piece. The Mac hardware and Mac OS X running the browser are just support infrastructure.
When you run a browser on a Dell, you don't expect it to have a Dell-compatible UI (I always hated those customized IE flavors with ISP logos & advertising). The fact that it's Dell hardware isn't important at the browser level. Google is trying to get us all to a point where Mac OS X / Windows / Linux are similarly irrelevant -- just APIs they compile to, while everything important happens inside Chrome.
The Chrome OS demo makes this very clear -- they are throwing out as much of the classic OS as they can, so we can live entirely inside the Chrome browser. But that means Google has to replace some of those capabilities, because a browser itself isn't enough to boot a computer (even a netbook). This might also help explain why the OS and browser are both named Chrome ("Chrome OS" isn't much of a name). Now it's confusing, because one is a netbook-optimized operating system while the other is a browser, but it seems clear that Google's objective is that we should decide to run Chrome, and that should be enough. This way Chrome gives us access to Google and the Internet -- who cares about how it works? I turn on my computer, and I'm online. That's a logical vision for Google, casual users, netbook users, people who have grown up using Google, etc.
From that perspective, it's much more important that Chrome's tabs always be consistent with Chrome, whether you happen to be using a Mac Pro or a Dell Mini 10. It doesn't much matter whether Chrome looks the same as other (Mac) apps.





Here it is:
Isn't that cool? An actual book on Apache Roller and I did not have to write it. I did review the drafts and it looks good, especially for beginners. It's filled with helpful step-by-step instructions and screenshots. I also submitted a forward, but I don't have a copy of the final book yet so I'm not sure my text made it in (I'd love a hard copy... hint hint). Anyhow... big congratulations to Roller user and author Alfonso Romero.
For the past 2 years or so, I’ve been using GMail to handle my main mail feed for jmason.org. I’m an absolute convert to its “river of threads”/search-based workflow.
Since starting at Amazon, I’ve had to start dealing with a heavy volume of work mail. Previously jobs have either had low mail volumes, or used Google Apps hosting for their mail, but Amazon’s volumes are high and — obviously — they’re not using Google. ;) For a while, I tried using Thunderbird, but it just didn’t really cut it; I could never keep track of mails I wanted archived, or remember which folder they were in, etc. — the same old problems that GMail solved.
Enter Sup. It’s a console-based *nix email client, with a Mutt-like curses interface, which offers something closely approximating the GMail experience:

Sup is a console-based email client for people with a lot of email. It supports tagging, very fast full-text search, automatic contact-list management, custom code insertion via a hook system, and more. If you’re the type of person who treats email as an extension of your long-term memory, Sup is for you.
Inbox Zero is a daily occurrence for my work email now; I can simply archive pretty much everything, and reliably know the excellent full-text search support will allow me to find it again in an instant when I need it. The new-user guide is well worth a read to get an idea of its featureset and UI.
Setting it up
The process of getting it set up is quite hairy; here are some instructions for Ubuntu, which thoroughly failed to work for me on 9.04. I had a similarly tricky time using some Ruby packages on the Red Hat work desktop, but eventually avoided it by just building vanilla Ruby from source, then using that to install “gem” and from that, “sudo gem install sup”. Much easier…
Next step is to get the mail. From some reading, it appears the most reliable way to deal with a MS Exchange 2007 server is to use offlineimap to sync it to a local set of maildirs, then add those as Sup “sources” using sup-add, one by one. This is very well supported in Sup, and works well. Offlineimap is very easy to install on Ubuntu, and can easily be built from source if that’s not an option. My config is pretty much a vanilla copy of the minimal config.
There’s a good Sup hook to run “offlineimap” every poll interval, and rescan synced sources that contain new mail. It works well.
Sup has an interesting approach to mail storage — it doesn’t. Instead, it stores pointers to the messages’ locations in their source storage. This is a great idea, since bugs in Sup therefore cannot lose your mail — just your metadata about your mail. However, it means that if the source changes in a way which moves or removes messages, you need to tell Sup to rescan (using “sup-sync”), but that’s no big deal in practice; in the more usual case, if new mail arrives, it’s automatically rescanned.
I have just under 7000 mail messages in my Sup index, and rescans are speedy and searches super-fast. It’s very nicely done.
Outbound mail is delivered using /usr/sbin/sendmail by default, which should be working on any decent *nix desktop anyway ;)
Recommended Hooks
The Hooks wiki page has a few good hooks that you should install:
Bad Points
Long URIs: unfortunately, very long URIs are broken by Sup’s renderer, and it doesn’t offer a native way to “activate” URIs and have them displayed in the browser; instead one has to cut and paste them. This is pretty lame. I’ve hacked up a perl script that will reconstruct the full URLs from the broken rendering, when the text is piped to it, but that’s a horrible hack.
Index Corruption: I’ve had the misfortune (once, in the month since I started) of corrupting my search index, causing Ruby exception stack traces when I attempted to run “sup-sync” to scan new mail. The only fix appeared to be to restore my index from a “sup-dump” backup. Thankfully all seems fine now, but it was a definite reminder of the product’s beta status.
Calendaring: still as painful as it’s ever been with UNIX command line email.
HTML: A good-quality, email-oriented, native HTML renderer would be awesome.
MIME: Sup again takes the traditional approach from UNIX command line clients of delegating to the mailcap file and its rules; unfortunately my RHEL5 desktop is too crappy to have a good mailcap setup. So I’ve had to write this from scratch to deal with the usual .docs and .xls’s etc., flying about.
Inconsistent Key Mapping: Given that it shares so much UI with GMail in other respects, it’s a little annoying that Sup doesn’t have the same key mapping. Not a big deal, as it took only a couple of hours to get the hang of Sup’s, though.
Overall
If you’re happy enough to spend a day or two getting the damn thing installed, and aren’t afraid of a little dalliance with the bleeding edge, I strongly recommend it. It’s definitely the best *NIX mail reader at the moment.
Deployment is just a part of dev/ops cooperation, not the whole thing
: metrics, monitoring, instrumentation, fault tolerance, load mitigation called out as other factors by Allspaw
(tags: ops deployment operations engineering metrics devops monitoring fault-tolerance load)
Build Web Apps for iPhone using Dashcode
: hmm, not too tricky
(tags: iphone html css js dev coding dashcode)
I had been thinking about moving away from Blogger to my own domain. Finally, I decided to give in and I was fortunate enough to buy this domain. Blogger has been a simple service but I wanted to try the new kids Tumblr or Posterous. After spending some time fiddling with both of them, I decided to go with Tumblr.
It took me some time to figure out the right way to move from Blogger. I used the import script written by Jonathan Tron to import my old posts. Sadly, there is no way to import comments from blogger. The least I could do was to import them into disqus and link the same disqus account into tumblr; which actually does not help much.
The bigger issue was to migrate without leaving RSS subscribers in the lurch. The slightly lesser issue was to preserve my earlier blog’s Google page rank.
The first issue was solved easily. You can do the same with the following sequence of steps.
The second was slightly more tricky. The right way to move a website to a different domain is to use permanent redirects from the old page to the new page. However, Blogger (obviously) does not allow you to do that. Thankfully, Google recently announced support for specifying canonical links which can point to the preferred version of a URL. So, I hacked up a script to match pages of blogger’s RSS with tumblr’s RSS and generate conditional blogger template snippets which let me specify the canonical (tumblr) URL for each page on my Blogger account.
I couldn’t redirect so I had to fall back on meta-refresh to redirect anyone visiting an old page to the new page. I hate to break the back button like this but that was the only possible way in this case. This is what it looked like:
I used to think that blogging is a solved problem. After doing all this and trying out many service, I don’t believe that anymore.
A few somewhat odd things happened in the world of shipping this week here in Shaneville. It’s mind-boggling to think how many goods travel around the world every second with modern shipping companies. Sometimes, it doesn’t seem to make common sense.
The two put together are also quite amusing, given that the tires – quite bulky – arrived far faster, even accounting for proportional distance – than the electronics will. So much for common sense.
Tip: several reliable friends have confirmed that ordering cheap HDMI cables is fine – no need to spend more than a couple of bucks for the vast majority of HDMI applications. I’ll be needing some of those in the after-Christmas shopping season at home, methinks.
Share Shane's Sayings
When dealing with the recent SSL fun, I met Marsh Ray, who found the problem in the first place. Marsh has a website, extendedsubset.com. I went looking for what an extended subset was one day and was a bit surprised to discover there was no such thing. So, after consulting with Marsh, I figured I should fix that and write down with some measure of rigour what an extended subset is.
I’m liking the looks of Apache Solr committer Shalin’s new website (right down to the cool domain name that lines up w/ his name!): check out Shalin Says….
Lot’s of good stuff on the Lucene ecosystem on his page. I especially like his post on Why You Should Contribute to Open Source.
I came across the term 'semantic web' a couple of years ago, when one of the original creators of Apache Cocoon went of to work on the SIMILE Project at MIT. I didn't pay much attention to the concept of 'semantic web' back then, because I just started learning Apache Cocoon and still had a lot to learn.Working at Hippo, a CMS vendor based in the Netherlands & USA, makes me think in content and publishing strategies. Publishing information to the web is one of our core businesses, but I've learned over the last couple of month we can enrich our publishing platform even more by providing semantic data. I started my journey by looking around if other CMS vendors are paying attention to semantic web standards. I noticed that only a few of the enormous amount of content management vendors actually put effort in providing semantic web functionalities for their end-users. I think that's a shame, because enrich your pages a lot.
This post should give you an insight on how you could create a website with embedded meta data (with Hippo), but let's first start with some basics.
The current web is very well suited for being read by people like you and me. Computers however can only analyze the words on a page, but can not see the semantics of a piece of information on that specific page, that we as people do see.
If you would allow the information on you page to be machine-readable, the computer would be able to analyze your page and extract much more information from it then just being a piece of text. That's where semantic web standards can help out.
Standards for providing semantic data on the web are not new and some of them have already been available for quite some time. Probably the two most well known are: RDF and Microformats. However recently RDFa has been getting a lot of attention by Google, Yahoo and now also the UK government.
RDFa is short for “Resource Description Framework in attributes”. This sounds a bit descriptive, but it means that RDFa provides a set of XHTML attributes, which in their turn provide a way of translating visual data on a page into machine-readable hints. So let's take a look at an example of how a simple web page is currently structured.
<html>
<body>
<h1>Content management and the semantic web</h1>
<h2>Jeroen Reijn</h2>
<p>some information</p>
</body>
</html>
As you can see in the above XHTML fragment, we have a page with a title, a subtitle and a small snippet of text inside the body of the page. By rendering this HTML fragment in the browser the visitor of this page will recognize this piece of text as being the title and author of the current article on the page. A machine however would need a bit more information to be sure the content can be identified as a title and author. That's where RDFa can help out. By using vocabularies, you can give meaning to specific pieces of content on a page.
Let's see what the above XHTML fragment would look like if we would use RDFa.
<html>
<body xmlns:dc="http://purl.org/dc/elements/1.1/">
<h1 property="dc:title">Content management and the semantic web</h1>
<h2 property="dc:creator">Jeroen Reijn</h2>
<p>some information</p>
</body>
</html>
As shown in the example, the Dublin Core vocabulary is added to the page first. This is important to be able to use the properties inside the vocabulary later on. Once the vocabulary is in place, we can give meaning to fragments on the page. In the HTML fragment above the h1 is marked as the Dublin Core title attribute and the h2 as the Dublin Core creator attribute. With these properties in place a machine, like a search engine crawler, can now also store this as additional meta data of the page.
One of the main advantages of RDFa is that your content can processed in a more efficient way, which in turn can make your page rank higher then it might have been before.
Big search engines like Google and Yahoo already scan your website for RDFa embedded information, so why not use it?
Hippo CMS is a content (centered) management system and it differs from other CMS's in such a way that the information inside the Hippo CMS content repository is not stored or identified as pages, but rather as content. In most cases even reusable content. To be more precise: information stored inside the content repository is stored as JCR nodes and/or properties.
Since the data is just content and not bound to any front-end technology, you can either publish it as XML, (X)HTML with some help from the Hippo Site Toolkit (HST) or any other format you might like.
Now let's take the above HTML fragment as an example and let's see what this would look like on a content level. One of the most important things to mention here is that a JCR repository has the concept of nodetype definitions in which you can configure what your data model looks like. You could compare it with for instance a XML Schema or DTD for a piece of XML, but then for the nodes and properties available in a JCR repository.
Let's first start with our content definition or in content management terms the document type. We will need three fields:
<'myproject'='http://www.myproject.org/nt/myproject/1.0'>
<'hippostd'='http://www.onehippo.org/jcr/hippostd/nt/2.0'>
<'hippo'='http://www.onehippo.org/jcr/hippo/nt/2.0'>
[myproject:text] > hippostd:publishable, hippostd:publishableSummary, hippo:document
- myproject:title (string)
- myproject:author (string)
+ myproject:body (hippostd:html)
A Java bean representation of the JCR 'myproject:text' nodetype will look like this:
import org.hippoecm.hst.content.beans.Node;
import org.hippoecm.hst.content.beans.standard.HippoDocument;
import org.hippoecm.hst.content.beans.standard.HippoHtml;
@Node(jcrType="myproject:text")
public class TextBean extends HippoDocument{
public String getTitle() {
return getProperty("myproject:title");
}
public String getAuthor() {
return getProperty("myproject:author");
}
public HippoHtml getBody(){
return getHippoHtml("myproject:body");
}
}
<%@ page language="java" %>As you can see it's that easy to use RDFa inside your website if you have a template independent CMS like Hippo.
<%@ taglib uri="http://www.hippoecm.org/jsp/hst/core" prefix='hst'%>
<html>
<body xmlns:dc="http://purl.org/dc/elements/1.1/">
<h1 property="dc:title">${document.title}</h1>
<h2 property="dc:creator">${document.author}</h2>
<hst:html hippohtml="${document.body}"/>
</body>
</html>
Using RDFa for simple text can already be a great improvement for you website, but support for other RDFa vocabularies is added on a regular basis. Google recently announced support for RDFa enabled pages with videos (or media) on them. You can provide extra information for your media files to the Google crawler, like the url to the thumbnail that belongs to your video, which can be presented when your video is found as one of the results in a search performed at Google. The possibilities are enormous, so I can see a lot of good things coming from using RDFa in the near future.
I think the role that content management systems can have for RDFa should not be underestimated, since most website these days are backed by some sort of content management system.
For more information on RDFa see:
Every week for the last year or so, I've posted a word or phrase, and a photo, on the Weekend Wordsmith website. People read the prompt, and hopefully, directly or indirectly inspired by it, write something - a sentence, a poem, a short story - or maybe paint or draw something.
The last 4 or 5 weeks have been pretty awful, with only one or maybe two people responding, and in a few cases, nobody. I'd like to think it's because he last few months of the year are just busier for people, and they don't have time. But maybe it's that I've just gotten more and more boring.
There are lots of sites like that - sites that offer inspiration to get you writing, or drawing, or creating. Some of them are more effective than others. The difficulty is keeping them interesting after months or years, but also, on the creative side, remembering to create something every day, even when it's not fun or easy.
Which reminds me, I haven't written anything for weeks now. ...





AOL’s new logos, which one do you like?
AOL listed on the New York Stock Exchange on 10th December 2009. This has been in the works for a long time and I’m glad we’re finally here. Things are changing around the company and I’m happy to be a part of this change.
AOL has a new logo (and yes, it is still to be written as AOL). I loved the new brand videos, watch them on youtube - http://www.youtube.com/watch?v=YlSL7svbooY
Seed.com was also launched a few days back. It is a new spin on crowd sourcing content which, I believe, is a great idea.
We’re just getting started!
Fill and span DVD archives with Discspan
: filed under “about time I did another DVD backup”
(tags: backup dvd spanning via:donncha linux storage offline recovery)
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export PATH=${PATH}:${ORACLE_HOME}/bin
/Library/Application\ Support/VMware\ Fusion/boot.sh --restart
Joe Armstrong: After a small amount of experimentation I was able to make Erlang talk to a web page using pure asynchronous message passing. I think this means the death of the following technologies:
I see the appeal for a single node Erlang or Eventmachine or node.js server. (Can sockets be passed between servers?)
I’m less clear about how this could work with request/response servers like PHP or Rails. Event loops on the server are not typically application patterns for applications using such frameworks — shared nothing is more of the norm.
The user writes a sequential code in the language in a way that's natural for the application and then have the compiler do the optimization and mapping it to the machine and taking advantage of concurrency.
I'm not sure if this is accurate, but I used to believe that the first early work of symbolics for names of variables came from a man named Nat Rochester, on a very early IBM machine, the 701 around 1951. He was in charge of testing it and they wrote programs to test the machine. In the process of doing that, they introduced symbolic variables. Now, I've seen some other things since that make me believe that there were earlier ways of representing information symbolically. It emerged in the early 50's, I think, or maybe even in the 40's. One would have to go back and see exactly how things were expressed in the ENIAC, for one thing.
BBN was working on a project with Massachusetts General Hospital to experiment with automating hospitals and I got brought onto that project. I started out as an application programmer because that was all I was good for. I think I spent about three weeks as an application programmer. I quickly became a systems programmer, working on the libraries that they were using.
...
When my projects ran out, Frank [Heart] would figure out what I should work on next. ... Somehow, Frank had decided that I was to be the third guy on the IMP project.
... thousands and thousands of machine cycles later, the program crashed because some data structure was corrupt. But it turns out the data structure was used all the time, so we couldn't put in code that says, "Stop when it changes." So I thought about it for a while and eventually I put in this two- or three-stage patch that when the this first thing happened, it enabled another patch that went through a different part of the code. When that happened, it enabled another patch to put in another thing. And then when it noticed something bad happening, it froze the system. I managed to figure how to delay it until the right time by doing a dynamic patching hack where one path through the code was patched dynamically to another piece of the code.
Another thing that Frank did, on other projects, was design reviews. He had the most scary design reviews and I actually carried that idea forward. People would quake in their boots at his design reviews.
...
The parts that you did absolutely fine hardly got a mention. We all said, "Oh." But the part that you were most uncomfortable with, we would focus in on. I know some people were terrified of it. The trouble is if you were an insecure programmer you assumed that this was an attack and that you have now been shown up as being incompetent, and life sucks for you.
The reality -- I got to be one the good side of the table occasionally -- was it wasn't. The design review was to help you get your program right. There's nothing we can do to help you for the parts thta you got right and now what you've got is four of the brightest people at BBN helping you fix this part that you hadn't thought through. Tell us why you didn't think it through. Tell us what you were thinking. What did you get wrong? We have 15 minutes and we can help you.
That takes enough confidence in your skill as an engineer, to say, "Well that's wonderful. Here's my problem. I couldn't figure out how to do this and I was hoping you guys wouldn't notice so you'd give me an OK on the design review." The implicit answer was, "Of course you're going to get an OK on the design review because it looks OK. Let's fix that problem while we've got all the good guys here so you don't flounder with it for another week or two."
Everything about this post is amazing, and would be science fiction a few decades ago. Not only can we look inside my wife and see my baby, months before it will be born, but I was able to record that on a device that I can put into my shirt pocket. And, within 20 minutes of making that recording, I was able to show the recording to my sister, thousands of miles away in Haiti, and various other friends and family around the world.
Of course, there's also the incredibly amazing fact that this little person is in there, and I can listen to the heartbeat and watch the little hands move about. Amazing, and exciting, and terrifying all at the same time. And this kid will grow up surrounded by technology that was barely imagined when I was born.
So, welcome to YouTube, little person. Here's your debut.
For those of you who haven't seen it yet, you should check out JDD's new website, DailyShoot.com. He posts a prompt every day, and has inspired some great photos. In the spirit of Pablo Neruda, who wrote poetry about finding the beauty in common things, these photos find beauty in the things that surround us every day, but which we don't notice.
I'm deep in the final (group) mini-project for Future Multi-Core Computing. Not much spare time but so far, things seem to be on track. We're collaborating on Google Wave. Being a beta, it's a bit flaky still (I have a few invites - first to comment 'Wave Me!' can have one) but useful (in the right case).
Today's feature request: is: please Google better MIME recognition. So, when I upload a text document, Wave should guess it's type and allow an appropriate online presentation. There are plenty of MIME typing libraries out there so hopefully this wouldn't be a big job...
(Yes, Yes, I know. Think About Security Blah Blah Blah...)
The last week has gone by in a blur. Eight days ago, Greg and I were talking about what we needed to do to finish up our soft launch and get Luma Labs out into the public. Those discussions were in vain as we’d already planted the seeds of what was to come. You see, we’d taken off the password to the website so that friends and family could let their friends order and we could continue our ramp up to a full launch.
I really should have known better. It was like leaving a drum of gasoline sitting in the middle of the street without a top and a box of matches sitting next to it. As friend told friend, word spread. We saw the order volume ramp up a bit over a day or so. Then, midday Monday, hits on our site and our order volume exploded.
John Gruber had linked to us on Daring Fireball.
I’m insanely happy it happened. John’s kind words about the Loop are high praise indeed. They set things into motion. We got follow-on links from Gizmodo, MacWorld, Laughing Squid, and Hivelogic. As much as it meant that we were going to be in scramble mode for the next few weeks, I can’t have asked for a better way to launch. Well, more accurately, to be launched.
Really, I shouldn’t use the word launch. It wasn’t a launch. It was an out-and-out escape of the product. That’s what it was. Plain and simple.
So, there we were. Standing there at Barista looking at our iPhones. For a moment, we just babbled incoherently and made guesses as to the amount of traffic that was inbound. Then we did what had to be done. We threw out the game book we thought we were using. We called up our suppliers and manufacturing partners and shifted our supply chain into high gear.
Luckily, we have greate partners. Greg did a great job finding some of the best shops anywhere. The company that cuts the parts for our shoulder pad does custom production runs for the aerospace industry. Our sew shop works with the locally based sporting apparel companies. They’ve got our backs and we’re really happy to have them on board.
Now, a bit over a week later, we’re closing the gap on our orders and will be on top of things very soon. We’ve put together a quick and dirty video showing the Luma Loop in action. And, we’ve already re-started our plans to produce much more polished video that shows the Loop and how it works. There’s also some exciting movement on some of the other things we’re working on.
Exciting times. I can’t wait to see what comes next.
Giving donations is fraught with frictions of all kinds. For example my wife and I once gave some money to a nonprofit only to suffer a year of verysolicitations for more money.
I think this is just amazingly and delightful. Giving Anonymously is a small nonprofit in Washington state that facilitates giving money to others anonymously. They clear about $75 thousand dollars a month at this point. This lets you avoid the social frictions of donations. It avoids any suggestion that your dontation is a form of status seeking. It avoids any suggestion that the donation is just another market transaction.
So what could you use this for?
I really like #2. If you are trying to fund some club’s operations it is brilliant. It is very likely your club’s community of members has some very very wealthy people in it. But they have little desire for that fact to be known. By offering all your members the opportunity to make anonymous donations you create a way for the rich members to help without insisting that they break cover.
For gifts of less then $500 they charge nothing, though you can give a bit to help them along. That’s pretty amazing when you block out what their credit card charges, mailing costs, check processing fees, etc. are so say nothing of the labor. Well actually, they are apparently entirely run by volunteer labor. It must be strange working there! Apparently they listen to every phoned in thank you message before forwarding them back to donors. Listening to a few on their site makes it clear that would be emotional work!
To give money you’ll need:
Damien Katz: I, Jan, and Chris are building a startup around Apache CouchDB
CouchDB crossed my radar just over two years ago, a few months later, Damien was at IBM, it entered incubation at the ASF a little over a month later. It has been an exciting project to watch.
My role was simply as a catalyst at a few junctures.
The thing about Git is that it's oddly liberal with how and when you use it. Version control systems have traditionally required a lot of up-front planning followed by constant interaction to get changes to the right place at the right time and in the right order.
...
Git is quite different in this regard.
...
When I'm coding, I'm coding. Period. Version control -- out of my head. When I feel the need to organize code into logical pieces and write about it, I switch into version control mode and go at it.
There must be a term of art for the scenario where a corporate sponsor uses a charitable activity in such a noxious manner that the charity becomes entirely a vile facade for marketing. It can obviously be quite quantitative. If the firm spends N units of cash on marketing their affiliation with the charity for every one unit they actually donate to the charity the entire exercise is a fraud. But we need a label for this bogosity. ”Pink tides of hope,” or something. Then a list. It’s so offensive.
Amused this morning when two adjacent spam emails were 1) a phishing spam for a bank, and 2) a purported anti-phishing security report. Imagine my disappointment when I opened the second and realized the Subject: line was bogus, and it was really some religious spam. Not as funny.
Share Shane's Sayings
Dear #Lazyweb – it’s the holiday season, and there are a few simple electronics questions I have for you.
Thanks again #Lazyweb, and I hope you’re having a wonderful winter holiday season!
Share Shane's Sayings
My preference for email is to have a local, and essentially unlimited, archive. To date, that has meant pop3 access supplemented by GMail for much of my access to mailing lists. Backing up and migrating my entire archive from machine to machine is a simple matter of rsync, and I’ve hosted it on Windows, Ubuntu, and Mac OS/X machines alike.
Lately I’ve been moving around more between my netbook, laptop, and desktops, so having any single machine being designated as my mail portal at the moment often means that I often don’t have convenient access to my email.
I figured it was time to investigate running my own mail server. In the past, this always seemed like there was a bewildering options of various packages, many of which were alternatives to one another with no clear way for me to decide which to pick, and all of which can be assembled and recombined in a number of different ways.
With the latest Ubuntu, some of this has become simpler with the introduction of the dovecot-postfix package. This selects and integrates two of the key components.
Installation was a snap. I selected the option to configure my machine as Internet with smarthost: Mail is received directly using SMTP or by running a utility such as fetchmail. Outgoing mail is sent using a smarthost.
This meant that I only had to answer two questions. System mail name? intertwingly.net. SMTP relay host? smtp-server.nc.rr.com.
I then pointed Thunderbird at this server, and it didn’t like what it saw. It seems that installation had generated a certificate with an CN=ubuntu, which didn’t happen to match my host’s name, so it cried foul.
As this point, this made three self-signed certificates I was hosting: one for EJabberD, one for Apache, and now one shared by Dovecot and Postfix. And all were causing me grief for one reason or another.
I hadn’t realized it, but my EJabberD certificate had expired. The version of Pidgin that came with Ubuntu 9.04 was OK with that, but the version of Pidgin that comes with Ubuntu 9.10 complains every time I log on.
And Chrome flat out didn’t like my self signed certificate at all.
This lead me to http://forums.vpslink.com/9292-post3.html, which I have lightly adapted below:
As superuser, and in the /etc/ssl/private directory:
openssl genrsa -des3 -out $HOSTNAME.key 2048
Any password will do, as it will be removed in a minute.
openssl req -new -key ./$HOSTNAME.key -out $HOSTNAME.csr
Be sure to specify $HOSTNAME for the Common Name when asked.
mv $HOSTNAME.key $HOSTNAME.key.withpassword openssl rsa -in $HOSTNAME.key.withpassword -out $HOSTNAME.key
Enter password one last time.
openssl x509 -req -days 3650 -in $HOSTNAME.csr -signkey $HOSTNAME.key -out $HOSTNAME.crt cat $HOSTNAME.key $HOSTNAME.crt > $HOSTNAME.pem cp $HOSTNAME.key ../certs/$HOSTNAME.pem chmod 0400 $HOSTNAME.*
Update the following files:
The formats for each are different, but identifying what to change is straightforward in each. Each can use the same (private) certificate, though in the ejabberd case, copying the file to /etc/ejabberd and chown ejabberd:ejabberd is in order.
Restart the servers:
/etc/init.d/apache2 restart /etc/init.d/dovecot restart /etc/init.d/postfix restart /etc/init.d/ejabberd restart
Thunderbird is now happy. Pidgin and Firefox each asked me once if I wanted to accept the new certificate. This took care of everybody except Chrome, which involved copying my public key (a.k.a. “pem” file) to the client machine(s) and following the following instructions:
http://code.google.com/p/chromium/wiki/LinuxCertManagement
Two add-ons, each with one problem each.
First, fetchmail, while it worked, complained:
fetchmail: connection to localhost:smtp [::1/25] failed: Connection refused.
The problem is that localhost is listed twice in /etc/hosts, and apparently by default fetchmail picked the ipv6 route but the postfix that is packaged with Ubuntu is only configured for ipv4. Specifying --smtphost addressed this problem.
Squirrelmail seemed to basically just work out of the box until I copy and pasted large portions of my archive into the IMap server, at which point it bailed with:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 4097 bytes)
Once again, the Internet to the rescue:
http://squirrelmail.org/wiki/LowMemoryProblem
All in all, I still have the feeling that hosting an EMail server is still a “some assembly required” proposition.
My littlebig[1] brother has just blogged about christmas.
Well, not exactly about christmas. Rather about explaining christmas to his missus, who grew up in a culture that doesn’t have it. And what he explained wasn’t christmas in general, but christmas day in our family. Even more particular than that, the circumstances as he describes them can’t've existed in full for more than a couple of years, though much of what he describes is perennial.
As ever, his narrative is superb, and in this instance it’s also very funny: I can’t recollect when I last laughed that much! But a moment’s reflection leads me to wonder: is it objectively that funny, or is it also (or even just) because what he describes is, like an in-joke, something he and I know all about, but the outside world can only infer?
[1] He’s the youngest of the family, but also the tallest.

The killer new feature of Vanity 1.2 are database metrics. You’ve already got the data, so let’s show it in the dashboard.
Here’s a metric for signups (activation), based on the number of Account records created on each day:
metric "Signup (Activation)" do description "Measures how many people signed up for our awesome service." model Account end
No need to call track! on this metric, and it comes with historical data (assuming you already have accounts in your database).

Some metrics measure values, not occurrences. This example measures user satisfaction by calculating average rating:
metric "Satisfaction Survey" do description "Measures how many people signed up for our awesome service." model Survey, :average=>:rating end
Other aggregates you can use are :minimum, :maximum and :sum.
If you’re only measuring some metrics, use conditions:
metric "Signups to Unlimited" do
description "Signups to our All You Can Eat and Burp Unlimited plan."
model Account, :conditions=>{ :plan_type=>'unlimited' }
end
Even better, named scopes:
metric "Signups to Unlimited" do description "Signups to our All You Can Eat and Burp Unlimited plan." model Account.unlimited end
Or just roll your own:
metric "Signups (Unlimited)" do
description "Signups to our All You Can Eat and Burp Unlimited plan (including upgrades)."
Account.after_save do |account|
track! if account.plan_type_changed? && account.plan_type == 'unlimited'
end
end
Get it now, and get measuring.
Convergence between the ‘puter and the mobile ‘phone is coming. My existing phone (E71) is a step along the way, and arguably skype on the laptop is approaching from the other direction.
Now Nokia have released the N900, and I’m thinking this looks interesting. Have they bridged the gap to the point of being worth buying as a converged device, or is this still no more than an interesting device that nearly makes it?
On the plus side, it’s a Linux box, with builtin display but also the capability of plugging in to a monitor, keyboard and mouse when at a desk, all in a unit that’ll fit in a pocket, and can be used in a smaller space than a conventional laptop/netbook. And with a SIM card it offers builtin connectivity.
As against that, it’s on the bulky side for a mobile ‘phone, and lacks the battery life of the E71 or a simpler device. One wouldn’t want it to replace the phone.
And the crux of the matter: is Maemo really Linux as we know it, or am I going to find it a waste of time to attach that keyboard and monitor and try to use it as a porta-’puter?
I guess a good proxy for that question is, does it run X11 natively / without fuss? If it does, I think enough follows from that to make it a real ‘puter. If not, what I want may still be vaporware.
Anyone using the device as I envisage? Or tried but found it problematic?

This is a big announcement ... something I've been working on pretty much since I left Formos. I've partnered up with SkillsMatter to provide my three-day, hands-on Tapestry training as a public enrollment course!
This is the exact same course I provide as on-site training, but we'll be doing it at the SkillsMatter offices in London on February 10th, and then in Paris on the 15th.
This is a big experiment for me and for SkillsMatter in terms of growing the size of the Tapestry community. In fact, SkillsMatter has really upped the ante here by offering 2-for-1 on the London training ... that's a great way to kick things off!
I can't emphasize enough what a great opportunity this is for people to get accelerated Tapestry training at a discount (even before factoring in the 2-for-1 offer). I'm really looking forward to bringing many new developers into the fold!
In addition, there will be a special, free evening event at each location. Details on that to follow. I look forward to meeting even more of you there!
It's been over a month since the Enterprise 2.0 OpenSocial panel and since we were never able to get a group blog post together, I've decided to publish a short summary of what I said about IBM on the panel. I'm paraphrasing myself from memory so this is not exactly what I said but it should be pretty close:
IBM has been successfully innovating in the area of browser-based components, also known as widgets or gadgets, and social APIs for years now. If you haven't seen the IBM Mashup Center you should visit the IBM booth and take a look at the demo. It allows you to create Web 2.0 style mashup applications by dragging-and-dropping widgets into place and wiring them together. You've probably heard of Lotus Connections. Connections is IBM's social software suite and it includes blogs, wikis, forums, social bookmarking and more. Each one of those components features a comprehensive AtomPub-based REST API.
We're working with the OpenSocial community to ensure that the specification meets the needs of our customers and is able to interoperate with our existing iWidget technology (and I think I mentioned the OpenAjax Hub here too). You can see most of the improvements that we're interested in the slides, so I won't go into detail now, but I will mention a couple of things for example: we would like to see better inter-gadget communication, specification modularity (coming in OpenSocial 1.0) and a stable and predictable specification change process.
I work for Rational, the part of IBM that creates tools for software development and delivery, something that is also social and collaborative in nature. We're enthusiastic about OpenSocial and we hope to enable use of OpenSocial Gadgets in Jazz-based product dashboards sometime in 2010. We may also support some of the OpenSocial Social APIs, but we are still learning and experimenting. Jazz products are developed in an open and transparent way so you can track our progress via our wiki and work-items at Jazz.net.
I won't try to paraphrase what the other panelists said, I'll let them do that, and I'll leave out my SocialSite pitch for now as most of my readers have already heard it. I'll put together an update on SocialSite during the next month and I think I'll have some good news to report.
I recently did some work to make Hecl read files, which also means that it can execute Hecl scripts from the phone's memory. This is especially important for environments like Blackberry, where we will be distributing a signed version of the Hecl application. To create your own Hecl applications, instead of simply replacing the script in the .jar file, you can point to a script on the device's file system. This is also available for normal Java ME phones, but unfortunately, for an open source project, the cost of a code signing certificate are prohibitive (on Blackberry, it's only $20, so I bought one with my own money).
In any case, as part of this effort, I developed a very simple 'file browser', which is used in Hecl to select a script to execute.
The results are, like all of Hecl, available under an Apache license, which means that you can use it pretty much wherever you want:
http://github.com/davidw/hecl/blob/master/files/org/hecl/files/FileFinder.java
http://github.com/davidw/hecl/blob/master/files/org/hecl/files/FileFinderCallback.java
Of course, if you spot any ways to improve it or fix problems with it, I'd appreciate it if you sent patches back.
Pivot was recently approved for graduation from the Apache Incubator. Here’s Greg Brown, one of the founding members of the project, speaking with us about what Pivot is.
You can listen to it HERE, or via iTunes.
Related links:
After long work, I sent out the announcement for the first Log4PHP release this morning. Let’s see how this one works out – first reports from DBpedia users were promising.
Here is the original statement:
The Log4PHP community is pleased to introduce the Apache Log4PHP 2.0.0 (Incubating) release [1]. It’s the first Log4PHP release since 2004 and tons of changes have been done. Finally Log4PHP has become a well tested framework made for PHP 5. Many thanks to all the contributors who made this release possible. Please download [2] Log4PHP and enjoy
The Log4PHP team
[1] http://incubator.apache.org/log4php/changes-report.html
[2] http://incubator.apache.org/log4php/download.html

Consciously, I’ve never been keen on the idea of role-models. Thinking it synonymous with hero-worship, it has always seemed a bit of an anti-pattern to me. Why try to emulate anyone? There are enough people in the world behaving the same as someone else, being different and original is definitely more useful, even if it makes you a bit crazy. When I did a dubious “leadership style” test I came up as “anti-follower”, so maybe it’s just another form of contrarianism on my part.

Over time, I’ve found that the best way to learn is by example, even if it’s a process of unconscious osmosis. And when I’ve spent time on what is sometimes called “personal development” I’ve found that there is real benefit in reading the biographies and the writings of truly awesome people. It certainly seems more productive than reading self-help books that are written in truisms and marketing crap.
I thought I’d share some of the people who I’ve really benefited from reading about, truly amazing people.
RPF is a legend; a nobel laureate physicist with an uncanny ability to explain complex ideas, an anti-authoritarian maverick who loved to screw with officialdom but most of all an incredibly generous, warm, loving guy (even if a womaniser at times). His writings on physics and his letters to his first, dying, wife are an inspiration.
Pirsig, someone genuinely crazy enough to have been institutionalised, still managed to write one of the best sellers of the 20th century and to invent a philosophical system that many consider to have merit. ZMM is amazingly well written, all the more so when you consider that every paragraph was planned out in advance on index cards. Worrying, his narrator in ZMM is the only literary character I’ve ever strongly identified with.
Grace Hopper signed up for the US navy during World War 2, and rose (primarily as a reservist) to the rank of commodore/rear-admiral back when this was incredibly unusual. But more than this, she was an excellent experimenter, and kept a rigourous lab-book, despite being mainly a computer scientist. She was a strong believer in getting things done, and coined the phrases “dare to do” and “It’s easier to ask forgiveness than it is to get permission”. Seriously awesome woman. Oh yeah, and she invented the compiler.
Doc Watson has been blind nearly his entire life, but that doesn’t stop him from being the truly most amazing guitar picker the world has ever seen, or doing crazy things like mending the tiles on his roof. His solo runs and accompaniment are incredibly good, and he’s somehow maintained humility in the face of multiple grammy awards and playing for the president on a regular basis. Another doer, he just kept going and became more productive after the tragic death of his duet partner and son Merle.
Dolly is a self-described mis-fit, but she is also a very very shrewd business woman as well as being a dedicated humanitarian and gifted songwriter. She is one of the really great singers, and is emotionally invested in every song she sings (even the ones that sound like bubblegum, listen to how sad she is in “Here you come again”).
CP Snow was basically a troll, but a very very good one. His arguments, lectures and writings weren’t always rigourous and balanced but they were always enlightening, thought-provoking and forward thinking. Most famously he identified the tension between literary and scientific cultures and made a great case for the unfair treatment of science. A scientist and a well-regarded author CP Snow is a great example that it is possible to straddle both worlds.
Peter Watson is a prolific researcher and writer, the volume of his output and the breadth of his knowledge is unfathomable. I’m constantly reading something of his. He has methodically and thoroughly condensed practically all of known intellectual history, writing about all of the inventions of the human mind. His writing is great, but it also brings home how relatively ordinary our time in history really is, yet serves as a great reminder that so many things we take for granted even had to be invented.
No doubt I’ll think of more now that I’ve put a list together. I’ve been fortunate enough to meet some of these people, but I’ve also been even more fortunate in that other people I’ve come across in my life have served as role models (starting naturally enough with my parents). I don’t intend this post as meme, but if you have role-models, I’d be interested in hearing about them. As I mentioned, it’s definitely a great benefit to read about such inspiring people.
Last year, I decided Hunting Season in Montana would be a yearly tradition for me. It all started a couple years ago when I was talking to my Dad about his yearly hunting trip. He hunted a lot when we lived in Montana (early 70s - 1990) and continued this tradition when he moved to Oregon. I figured it'd be a good opportunity for some father/son bonding and asked him if I could join him one year. We soon realized we had the perfect Hunting Oasis at The Cabin and should make it a yearly tradition.
My Dad lived in Oregon for 20 years, hunted every fall with his buddy Wayne, and retired earlier this year. Shortly after retiring, he moved to Montana to start building his "retirement cabin" (with running water and indoor plumbing). My Mom, kids and I joined him in July and made some good progress on finishing the foundation.
This weekend, shortly after working all night, missing a flight, and discovering the New Belgium Hub at DIA, I arrived in Missoula for this year's hunting season. Because I arrived at midnight, we decided to spend the night at a hotel near the airport. The next morning, we woke up and drove 2 hours to the Swan Valley. We arrived at The Cabin, started the heat stove and began unloading the truck. After being there 15 minutes and starting to settle in, my Dad started to talk about where the deer usually roamed. He pointing down by the garden and mumbled "They usually come out of there..." As he was talking, I looked out our kitchen window and say a huge buck. My heart leapt into my throat.
I shouted "GO!" and my Dad quickly responded with "NO! It's yours!" I said "It's been 20 years, YOU go!" and off he went to grab his rifle. Seconds later we were out on the porch and he was trying to find the beautiful 4-point Whitetail buck in his scope. The buck quickly disappeared behind the woodshed and outhouse and didn't appear again until he was almost on the front road.
When the target walked across the road, I whispered loudly "Go, GO - get him!!"
Shortly after a shot was fired that dropped him from our view.
My Dad scrambled off the porch, trying to reload at the same time and jamming his rifle. "Get the other gun!" he yelled (because a deer is rarely done after the first shot) and I ran into the house to grab some bullets and the other rifle. By the time I made it back out to the front yard, another shot was fired. My Dad turned to me and said, "He's gone."
I thought, "WTF?!" I thought for sure he'd got him on the first shot. Turns out, "He's gone" also means "He's dead". The picture below illustrates my Dad's impressive accomplishment.
After that, we both walked back to The Cabin to put our rifles away and got ready to haul it back.
As I was returning down the road to the deer, I spotted a good-size mountain lion on top of the hill. I didn't see its face, but saw enough of it to realize I should be carrying a rifle with me. A short sprint back to The Cabin and before I knew it, I was back by the deer, guarding it from any predators.
For the next couple hours, I learned how to gut a deer and enjoyed my Dad's overdue success. Congratulations Pappy - it seems you belong in Montana after all. 
P.S. Today is my parents' 37th Anniversary. Happy Anniversary Mom and Dad! You make marriage look both fun and easy. I hope you have fun cutting up all that meat!


<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/>

jms:/SimpleStockQuoteService?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616&transport.jms.DestinationType=queue
<syn:proxy name="JMSBridge" transports="https http" startOnLoad="true" trace="disable">
<syn:target>
<syn:endpoint>
<syn:address uri="jms:/SimpleStockQuoteService?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616&transport.jms.DestinationType=queue"/>
</syn:endpoint>
<syn:inSequence>
<syn:property name="OUT_ONLY" value="true" scope="default"/>
</syn:inSequence>
</syn:target>
</syn:proxy>
<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
......
</transportReceiver>
ant stockquote –Daddurl=http://localhost:8280/services/JMSBridge –Dmode=placeorder
Sun Dec 13 16:15:39 IST 2009 samples.services.SimpleStockQuoteService :: Accepted order for : 5789 stocks of IBM at $ 89.61765128551305
I am a bit of a cynic, and my cynic-sense definitely lit up when I read this:
http://monty-says.blogspot.com/2009/12/help-saving-mysql.html
He wants to have his cake and eat it too. Or as they say in Italian, he wants to have his wife drunk and the barrel full (really!).
He sold Mysql to Sun for a great deal of money - around one billion dollars. Even if his share is only 1% (which I doubt), that is still 10 million dollars, which is enough for anyone normal to live the rest of their life without ever having to work again. If he walked away with 10% of the deal, that's 100 million dollars.
Monty writes:
I have spent the last 27 years creating and working on MySQL and I hope, together with my team of MySQL core developers, to work on it for many more years.
Since it's under the GPL, he can do that himself for as long as he wants - he doesn't have to worry about making a living, after all. If he took away something closer to the 100 million number, he can also fund several of his friends to work on it for years and years, without worrying much about income. They could always do consulting if they wanted to make a few bucks, in any case.
Now, what he's worried about is that Oracle will no longer put money into Mysql. I agree that that's a real risk.
However, I also think that since it's Oracle's money that is being spent, they have the right to do as they see fit, within certain limits, and this case is well within those limits. My view is that there are plenty of cases when governments should intervene. For instance, if Mysql were the only competitor to Oracle in the database market, it might be quite unhealthy to let them buy it. But that's not the case - not at all. There are numerous competitors, both closed and open.
So the risk to 'the public' is relative: people bought into a product that may now stagnate, but if they really want, they have plenty of other places they can jump without too much pain (SQL is a standard, after all). It's like if FreeBSD disappeared tomorrow: you could switch to OpenBSD or Linux or something else. Perhaps not painlessly, but it wouldn't be the end of the world, either (let's hope FreeBSD has a long and happy future ahead of it, though).
We're back to wanting to both have and eat the cake: Monty seems to want the EC to force Oracle to divest itself of Mysql or impose various restrictions on its development. If he had imposed those conditions on Sun when that sale was made, they might not have done the deal, or placed a smaller value on it. He didn't, but now he is back and trying to impose them on a deal in which he is not a participant (although I suppose he may have some Sun shares). That doesn't strike me as being entirely fair: if he really wanted to ensure the future of Mysql, he would not have sold the company.
In terms of open source, keep in mind that Mysql was not released under the GPL until 2001:
http://www.mysql.com/news-and-events/generate-article.php?id=23
For many years it was under a "sort of open" license that was not proper open source.
Then there's the Richard Stallman angle: that somehow, Mysql "deserves" to have developers funded to work on it. I don't buy that, either. Mysql is a nice project, but I don't think that there's any moral imperative that the government should step in and fund some open source projects. Should the EC step in and say that Oracle should also fund Postgres development while they're at it? There are plenty of deserving projects that could use some cash to fund their development. For instance, my friend Salvatore is looking for donations for Redis development. It's not as big or "important" a project as Mysql, but it's good code and already being taken up by various companies. For that matter, I'd like to keep working on Hecl full time.
In short: I hope that the EC approves the sale "as-is". I also hope that Oracle continues to take good care of Mysql, but if they don't, that is ultimately their decision as long as there remain plenty of competitors in the market.
I think that our time as "the open source community" is better spent fighting for more important things: against bad software patents, for open standards in governments, and that sort of thing, that will benefit everyone, rather than trying to wrest control of Monty's code back from Oracle after he's already been paid handsomely for it.
Following my little rant on Wednesday, it’s clear vet gets it (albeit with more cynicism than I had intended), but it appears none of the powers-that-be (including the mainstream meeja) have noticed a problem.
So let’s try again. First, in the current world, with big tax breaks for empty properties:
Entrepreneur: I’d like to rent your business premises. Here’s my business plan: as you can see, it moves into the black in year 3. I’ll be bringing this great new service to the area, and I’ll employ 6 people there.
Landlord: Here’s our price list (it’s only 10% up on last year).
Entrepreneur: There’s no way I can afford that initially. How about a reasonable reduction for those critical first two years?
Landlord: That’s our price. Take it or leave it.
Entrepreneur: But you have a monopoly on business premises, and 30% of the high street is standing empty. Surely it’s in everyone’s interest for me to open shop?
Landlord: Goodbye.
Entrepreneur is unable to open new business. The area doesn’t get its new service. Jobs are not created. High street just falls further into dereliction, as only charity shops (who enjoy good tax breaks of their own) can afford it[1].
Contrast a world where there is no tax break for empty properties. Now the half-derelict high street is costing the owner real money, so it’s in his interest to come to a compromise with the entrepreneur:
Entrepreneur: I’d like to rent your business premises. Here’s my business plan: as you can see, it moves into the black in year 3. I’ll be bringing this great new service to the area, and I’ll employ 6 people there.
Landlord: Here’s our price list (it’s only 10% up on last year).
Entrepreneur: There’s no way I can afford that initially. How about a reasonable reduction for those critical first two years?
Landlord: We’re not a charity, and we have to consider our investment and overheads!
Entrepreneur: But you have a monopoly on business premises, and 30% of the high street is standing empty. Surely it’s in everyone’s interest for me to open shop?
Landlord: Well, we can’t meet your request in full, but maybe we can meet you halfway for the first two years. I’ll put it to my board and see what we can do.
Entrepreneur: Thank you.
A better outcome all round, except for landlord who fears lower rents more than empty properties!
p.s. glad to see the chattering classes have picked up on how damaging the employment tax is (maximum marginal tax rate on earned income now rises to 76%[2] from April 2011). Though it’s the fact that the increase also applies to middle-income people that’s mostly stirred things up: guess that’s where there are more votes.
[1] Nothing wrong with charity shops, but they tend to be remarkably similar to one another, and the demand for what they do is satisfied by one or two – not the ten or twenty we commonly see in a high street today.
[2] If you earn £100k, and get a rise to £101k, government will take £620 of that rise from your paycheck and another £140 employment tax from your employer, for a total of £760.

I took a bunch of photos at the Teaneck Armory, including some Cold War era tanks -- one with twin cannon barrels of some sort, and another with an engineering turret, perhaps for raising bridges or other constructions.