The Wayback Machine - https://web.archive.org/web/20091219063901/http://planet.apache.org:80/committers/

Planet Apache

Justin MasonLinks for 2009-12-18

Ben HydeManufacturing Cost

I love charts like this.

costWeightVSVolume

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?

Bryan Pendletonp4 shelve

Perforce version 2009.2 is now out in beta, and it contains a very interesting new feature: shelving.

Laura Wingerd gave a fairly high-level introduction to shelving in her blog post:

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.


The new commands are p4 shelve and p4 unshelve, and the blog post explains a bit of the workflow involved in using these commands to accomplish the various new scenarios.

I think it's going to take a bit of time to become comfortable with the new commands and how to use them, but I'm looking forward to getting this feature installed and available so I can start to learn more about it!

Jacopo CappellatoNew post about OFBiz Widget Programming on HWM Blog

Here is the link of a new post about OFBiz Custom Components setup I wrote for my company's blog:
"OFBiz Tutorial – Building A Simple Product List Screen"

Bryan PendletonScam victims and software security

When both DailyDave and Bruce Schneier point to a paper, you can bet it's going to be very interesting. So if you are at all interested in software security, run don't walk to this paper by Stajano and Wilson: Understanding scam victims: seven principles for systems security.

The seven principles are psychological aspects of human behavior which provide vulnerabilities that scammers and other bad guys exploit:

  • Distraction: While you are distracted by what retains your interest, hustlers can do anything to you and you won't notice.

  • Social Compliance: Society trains people not to question authority. Hustlers exploit this "suspension of suspiciousness" to make you do what they want.

  • Herd: Even suspicious marks will let their guard down when everyone next to them appears to share the same risks. Safety in numbers? Not if they're all conspiring against you.

  • Dishonesty: Anything illegal that you do will be used against you by the fraudster, making it harder for you to seek help once you realize you've been had.

  • Deception: Things and people are not what they seem. Hustlers know how to manipulate you to make you believe that they are.

  • Need and Greed: Your needs and desires make you vulnerable. Once hustlers know what you really want, they can easily manipulate you.

  • Time: When you are under time pressure to make an important choice, you use a different decision strategy. Hustlers steer you towards a strategy involving less reasoning.



It would be great if the BBC would release the TV show episodes on DVD; I'd really enjoy watching them I think.

Ross GardlerApache Wookie (Incubating) and the W3C Standards

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).

Apache Wookie passes W3C Widgets conformance

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:

Berin LoritschNaked Objects, Point - Counterpoint

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:
  • Create the representations of the objects as they see fit
  • Create the rules of how to select the correct view from the different possibilities.

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.

Emmanuel LecharnyApache Directory WebSite statistics

Here are some stats we gathered yesterday on http://directory.apache.org site. I just checked the OS of our visitors (thanks to Google analytics), and the browsers.













































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%


W$ is losing some ground every year. It's even more obvious on the Browser category. Last month, the stats are :

  • FF (all versions) : 59,19%

  • IE (all versions) : 21,31%

  • Chrome : 7,92%

  • Safari : 6,14%

  • Opera : 2,58%





















IE stats
2007 36,42%
2008 30,15%
2009 23.99%
Last month 21,31%



Of course, it's a bit biased, because we are addressing very technical people, who are most certainly on the bleeding hedge. My mom does not browse Directory.a.o, that's for sure ! However, this is relevant, considering that they are the ones who create tomorrow's IT !

Chris PepperHP Converged Infrastructure Roadshow

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).

DIMMs

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.

Blades

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.

Matrix & Insight Dynamics

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...

Miscellany

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.

Chris PepperGoogle Chrome UI Priorities

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.

Edward J. YoonIntroducing Korea 1. Hong-Yureung (UNESCO World Heritage)


Sometimes, I'll introduce Korea (food, culture, tour,.., etc) to you. The first story is about the Hong-Yreung.

Introduction
Hongyureung (홍유릉) refers to the two royal tombs, Hongneung and Yureung, which are both located in the same area. Hongneung is the mausoleum of the 26th ruler of the Joseon Dynasty, Emperor Gojong (1852-1919, reign 1863-1907), and his wife Empress Myeongseong (1851-1895).

Hongneung(홍릉) was first the tomb of Empress Myeongseong, and it was located in Cheongnyangni, Seoul. When Emperor Gojong died, he was buried together with the previously deceased empress and the tomb was moved to its current place.

Emperor Gojong was the second son of the regent Heungseon Daewongun and ascended to the throne at the young age of twelve. In 1897, he declared Korea to be the “Daehan Empire” and established himself as the emperor. However, under unrelenting pressure from Japan, he signed the Eulsa Protectorate Treaty, and as a result, the Daehan Empire was deprived of its diplomatic rights. In 1919, Emperor Gojong died in Deoksugung Palace at the age of 67.

Empress Myeongseong became the empress in 1866. However, at that time, Korea was actually governed not by Emperor Gojong, but by his father, who was controlling things from behind the scenes. In 1873, when Emperor Gojong began to administer state affairs, Empress Myeongseong exercised considerable power and deeply participated in political affairs. Her diplomatic policy was in obvious favor of Russia. This angered Japan, and she was killed by Japanese assassins.

Yureung (유릉) is both the last royal tomb of the Joseon Dynasty and the tomb of the first Korean emperor. It is the tomb of Emperor Sunjong (1874-1926, reign 1907-1910), the 27th ruler of the Joseon Dynasty, his first wife Empress Sunmyeonghyo, and his second wife, Empress Sunjeonghyo. Emperor Sunjong was the second son of Emperor Gojong and Empress Myeongseong. He was the last ruler of the Joseon Dynasty, and he struggled to defend the dynasty during that era of turbulence.



Empress Sunmyeonghyo died when she was still the crown princess. She was originally buried at the foot of Mt. Yongmasan. After Emperor Sunjong died, the tomb was moved to its current location, and the emperor was buried alongside Empress Sunmyeonghyo. Empress Sunjeonghyo became the second wife of Emperor Sunjong at the age of twelve. It is known that she concealed the Imperial Seal when Japan put pressure on the Joseon Dynasty to sign the Korea (Joseon) -Japan Consolidation Treaty in 1910. However, the treaty was concluded, and the Daehan Empire came to an end after being deprived of its sovereignty. Empress Sunjeonghyo is said to have maintained her dignity right up until the moment she died. She was the last empress of the Daehan Empire.



Hongneung and Yureung look different from other royal tombs. When the name of the country changed from the Joseon Dynasty to the Daehan Empire, the rulers of Korea were called emperors. Therefore, the tombs of the two emperors were modeled after the tomb of the Ming Dynasty’s ruler, King Taizu (Zhu Yuanzhang). Surrounding Hongneung and Yureung are statues carved in the shape of animals such as giraffes, elephants, and lions, which can’t be seen at the other royal tombs of the Joseon Dynasty. The stonework of Hongneung tomb was made in a traditional way, while the stonework of Yureung tomb shows a more realistic and advanced technique.



Today was really cold and windy. I had a baked sweet potato with some squirrel. :)



Dave JohnsonApache Roller 4.0 Beginners Guide

Here it is:

Roller book cover

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.

Justin MasonSup Rocks

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:

  • ~/.sup/hooks/before-poll.rb: the above-mentioned offlineimap poll hook
  • ~/.sup/hooks/mime-decode.rb: ‘uses w3m to translate all HTML attachments that don’t have a text/html alternative.’ Well worth installing.
  • ~/.sup/hooks/before-add-message.rb: essential to filter out cron noise and the like so it doesn’t hit the inbox; unfortunately Sup doesn’t (yet) support GMail’s “filter messages like this” UI.

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.

Justin MasonLinks for 2009-12-17

Shalin Shekhar MangarMigrating from Blogger to Tumblr

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.

  1. Create a Feedburner account and import your blogger feed.
  2. Set your blogger feed to redirect to Feedburner.
  3. Edit your tumblr theme and replace the RSS link to point to feedburner
  4. Edit your feedburner to import from tumblr’s rss

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.

Shane CurcuruThe strange world of shipping

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.

  • Ordering new winter tires from TireRack this Tuesday, I proceeded to the shipping stage. I was offered three choices of shipping – UPS, FedEx, and FedEx guaranteed 2 day. Guess which had both the lowest cost and earliest delivery date of the three? UPS, buy one or two days!
  • Those same winter tires are already here. Working at home I heard some large thumps outside and went to investigate, and those magic UPS elves had already dropped the tires on my doorstep – barely 24 hours after UPS actually got the tires. It’s almost as if I had my own personal UPS delivery truck. (In this case, TireRack appeared to have a local regional supplier – makes sense for the northeast).
  • Likewise a small electronics purchase I made on Monday and assembled in (yes, I know!) China, is currently in a FedEx airplane somewhere over the middle of the US. It’s only one more short step before tracking numbers have a little “show live map” feature, kind of like flight trackers. You could watch your package overfly you to the nearest shipper’s airport hub!

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 Technorati Google Bookmarks LinkedIn del.icio.us Facebook co.mments Live Reddit Slashdot Identi.ca Yahoo! Buzz

Ben LaurieExtended Subsets

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.

Ceki GulcuEclipse template for creating new loggers

Here is the Eclipse template I use for creating new logger fields in my code.${:import(org.slf4j.Logger, org.slf4j.LoggerFactory)}Logger logger = LoggerFactory.getLogger(${enclosing_type}.class);${cursor}The import and the logger declaration are on the same line, i.e. without a separating new line character, whereas ${cursor} is placed on a new line.To insert the template in Eclipse, go to Window

Grant IngersollShalin Says…

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.

Jeroen ReijnContent mangement and the semantic web

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.
But over the last couple of months I've been doing some research on the currently available standards for providing semantic data on the web with a strong focus on RDFa.

Content management

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.


What's the idea behind the semantic web?

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.


What is RDFa?


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?

How to use RDFa in your (hippo) website?

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:

  • Title
  • Author
  • Body (rich-text field)
If you would create a document type with the Hippo CMS template editor, the resulting nodetype definition will end up looking like this:

<'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)

As you can see all three fields are available and can be used later on by any client that can read from the Java content repository. To be able to render this type of information as XHTML, we will be using the Hippo Site Toolkit. The Hippo Site Toolkit uses the concept of mapping  JCR nodes to simple Java beans, to be able to have an easier development cycle without having to learn the entire JCR API.

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");
}

}

As you can see the Java bean is quite straight forward and easy to read.
Now if we want to render the information on a webpage, we can use for instance JSP's with expression language to get the information from the Java bean. The JSP needed for outputting the RDFa enabled webpage can be as simple as this:

<%@ page language="java" %>
<%@ 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>
As you can see it's that easy to use RDFa inside your website if you have a template independent CMS like Hippo.

It gets even better

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:

Rich BowenWeekend Wordsmith

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. ...

Edward J. Yoon어느덧 오픈소스 생활 5년차


2009년 12월.. 오픈소스 쪽에 몸 담은지도 벌써 5년이 지나버렸습니다.

아마 오픈소스의 처음 시작은 2004년도 쯤, 검색엔진에 관심을 갖고 시작했던 Lucene 을 c#으로 포팅해서 Lucene .Net 을 오픈하면서인것 같습니다. 그 당시엔 MSSQL, Visual Studio 와 C#이 익숙했었지요.

(Lucene .Net은 지금도 Apache Incubator에서 저에 베이스 코드를 기반으로 계속 진행중입니다. 물론 활동은 안하기 때문에 제 코드가 다 갈아 엎혔는지 잘 모름.)

이후, Lucene sub-project인 Hadoop 에 참여했었습니다. 그때가 2006년도 3월쯤 된거 같네요. 영광스럽(?)게도 클라우데라 contributor 통계에 edward yoon이 상위권도 기록하고... 우여곡절끝에 지금은 개인적으로 하고 싶던 행렬/수학/그래프 쪽에의 프로젝트를 Apache Incubator에 등록하여 진행하고 있습니다.

이렇게 5년 간을 해왔습니다. 하지만 이제부터 시작입니다.

전 세계를 상대하는 Global IT기업을 만들 작정이고, ..
한국에서 ApacheCon 개최를 주도하고 한국의 IT, 한국의 개발자 하면 떠오르는 사람이 되길 바래봅니다. ㅋ

Shalin Shekhar MangarAOL’s new logos, which one do you like?











AOL’s new logos, which one do you like?

Shalin Shekhar MangarAOL lists on NYSE

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!

Edward J. YoonMircosoft's Bing (Korea) provides search engine with the Daum, corp.


Today, I just noticed that the http://bing.com is automatically redirected to
http://bing.search.daum.net/search?q=bing.

BTW, Daum and Bing's search results are exactly the same. It looks like a bing-skinned version of Daum search engine. LOL

- daum search result
- bing search result

See also,
- Microsoft’s Bing fails to crack Korea

Justin MasonLinks for 2009-12-16

Bruce SnyderJeOS, Oracle XE and VMWare on MacOS X

Last week I installed JeOS (Just Enough Operating System) on VMWare Fusion. JeOS is a slimmed-down version of Ubuntu specifically made for installation in a virtual machine so that it has a much smaller footprint than the normal Ubuntu distribution. Anyway, I did this so that I'd have a VM with a smaller footprint that I can use on my MacBook Pro for development and testing.

After setting up JeOS, I installed Oracle XE on it. Oracle XE is a slimmed down version of Oracle that is free for development and distribution. I used these instructions for installing Oracle XE on Ubuntu but there were some catches, namely that by default the web application for Oracle XE was bound to the localhost, i.e., I couldn't see the web app from Firefox in MacOS X. This was easily remedied via this comment on a blog post about this very topic:

Set up the environment on JeOS to use sqlplus:


export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export PATH=${PATH}:${ORACLE_HOME}/bin


Now use sqlplus to alter a setting that disables local-only access to Apex:


$ sqlplus system@xe
Enter password: SYSTEM_password

SQL> EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);


Using the Apex webapp (http://:8080/apex) I was able to a user for myself. After this, I could access Oracle XE from MacOS X.

This setup has been working very well for me until today. For no apparent reason, the networking in JeOS went flaky and I could not access the outside world at all. I switched between NAT and host-only networking in VMWare multiple times, rebooting the VM each time - no dice. I upgraded to the latest VMWare Fusion - no dice. I could SSH into the VM from MacOS but that was it. No commands from JeOS would reach the outside world. So on a whim, I reran the vmware-install.pl script again and after that the networking seems to work again. I still have no idea why this happened which is a bit troubling. I don't want to just blindly keep running the install script again with no idea why it's fixing this networking issue.

Update

I guess the networking issue is common enough that Fusion provides a script to restart everything underneath of Fusion, e.g.:


/Library/Application\ Support/VMware\ Fusion/boot.sh --restart


Also, there's a good document available for Understanding Networking in VMware Fusion if you're interested. It's brief and to the point.

Sam RubyWebSockets

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:

  • comet
  • long-poll
  • AJAX
  • keep-alive sockets

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.

Bryan PendletonCoders at Work: Fran Allen, Bernie Cosell

I'm almost done with Peter Seibel's fascinating Coders at Work. Chapters 13 and 14 contain his interviews with Frances Allen and Bernie Cosell.

I didn't know much about Fran Allen, although I've certainly benefited from her work, as has anyone who has ever programmed a computer using a language other than assembler. The interview discusses much of her early work on developing the theory and practice of compilers, and, particular, of compiler optimization. The goal of her work is simple to state:

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.


Allen's recollections were interesting because they go a long ways back:

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.


Anyone who can speak about their work in the days of the 701 and the ENIAC certainly is worth listening to!

The interview with Bernie Cosell is interesting because he's a networking guy, and I've always been fascinated with networking software and how it is developed. Cosell gets credit, along with Dave Walden and Will Crowther, for the early programming of the IMP, the Interface Message Processor, that was the key mechanism in the building of the first computer networks.

As Cosell tells the story, his arrival in the networking field was somewhat accidental, for he started doing other work:

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.


Cosell's interview contains a number of great passages. I liked this description of a debugging session that he remembered "fondly":

... 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.

Nowadays, we programmers are spoiled with our powerful high-level programming languages. With Java's various features, such as the absence of a memory pointer type, bounds-checked arrays, immutable strings, automatic memory management, and so forth, we rarely experience such debugging scenarios. But Cosell's recollection brought back a fair number of memories from my own early days in programming, and it was certainly entertaining to read.

I also thought Cosell's description of the role of the design review was very good, and I wish more people had had his experience in order to be able to comprehend the value of that process:

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."


This is a wonderful description of a process which, if handled correctly, can be incredibly effective. I've personally seen it work that way, from both the giving and receiving end. I've also seen it, far too often, fail, to the extent that it seems that more and more often people don't even attempt design reviews anymore.

It's a shame that people haven't learned how to do a design review effectively, and it's a shame that software managers rarely seem to understand what a powerful tool it is that they aren't using. Perhaps more people will read the Cosell interview and will realize that they have a powerful process improvement available to them.

Fran Allen is the only female programmer interviewed in the book, which is a shame. It would be nice to have had more. Women have been involved in computing since the beginning (think Ada Lovelace, Grace Hopper, etc.). How about, say, Val Henson, or Pat Selinger, or Barbara Liskov?

One last chapter to go...

Rich BowenYouTube Debut



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.

Rich BowenDaily Shoot

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.

James StrachanUpdate: using Time Machine on a network drive with Snow Leopard or Leopard

I now have much simpler instructions thanks to Jon who commented on my previous blog post. Forget all those icky complex command lines! Here's the simple way...
  • download the CreateBackupVolume application from Jon's excellent backmyfruitup project
  • run it - tell it how big to make the sparse bundle thingy
  • a sparse bundle file then gets created on your desktop (the name of the file starts with your machine name)
  • mount your network drive if its not already
  • drag the sparse bundle onto your network drive (you can delete the local one)
  • set TimeMachine to use your network drive
  • wait :)
I've repeated the above now on 3 different macs including one old G4 and it worked like a charm each time. It seemed kinda faster than my previous Time Capsule too :)

Many thanks Jon! Using Time Machine with a network drive just got loads simpler!

Update: these instructions should work on any Mac with Time Machine, so it works just fine on Leopard too

Robert Burrell DonkinGoogle Wave: MIME recognition

I'm deep in the final () mini-project for . Not much spare time but so far, things seem to be on track. We're collaborating on . 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 better recognition. So, when I upload a text document, Wave should guess it's type and allow an appropriate online presentation. There are plenty of libraries out there so hopefully this wouldn't be a big job...

(Yes, Yes, I know. Think About Security Blah Blah Blah...)

Edward J. YoonTech news of this week


- IBM n.Fluent translates text in 11 languages
I hope to see a global agora space w/o linguistic barriers. :)
- Displaying the best display ad with Teracent
Google Bought Display Ad Startup Teracent.

James DuncanThe Loop Escapes

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.

splash.jpg

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.

Rich BowenChristmas Trains

Christmas Train

Yay, the christmas trains are set up again.

Ben HydeAnonymous Giving

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?

  1. Help a neighbor, coworker, friend, … in need
  2. Help your club without revealing how rich you are
  3. Say thanks to the person who did all that work for the recent event
  4. Avoid the embarrassment of a public thank you when donating to the event
  5. Use it create a hard to fake signal
  6. Use it to demonstrate it to another, a potential donor
  7. Give money to things one might not have expected.

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:

  1. a credit card or a bank account,
  2. the snail mail address for your recipient, and then
  3. either an email address or a phone number.

Try it!

Sam RubyRelaxed Inc.

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.

Bryan Pendletongit-add --patch

I just recently found Ryan Tomayko's essay about using git-add --patch.

I love the essay; it's quite well written.

He makes two interesting and inter-related points in the essay:

  • git-add --patch allows you to solve a problem in a (fairly) easy way which is extremely hard to solve using other source code control tools and methodologies.

  • The flexibility and power of Git is integral to its philosophy, and you won't understand Git until you understand this philosophy.



From the essay:

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.


It's a very interesting essay, both the concrete parts about how to use the low-level Git tools to accomplish some very specific tests, as well as the more abstract sections about why the author feels that this tool supports his own personal software development process more effectively.

I think that there isn't enough discussion about the role of tools in the development process, and about how tools influence and guide the success or failure of a particular process. One of my favorite articles in this respect is Martin Fowler's essay on Continuous Integration. I'm pleased whenever I find articles discussing the interaction of tools and process, since more discussion can only help improve the situation with respect to software development processes and tools.

Ben HydeLoad of …

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.

Shane CurcuruDisappointing Spam

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 Technorati Google Bookmarks LinkedIn del.icio.us Facebook co.mments Live Reddit Slashdot Identi.ca Yahoo! Buzz

James William DumayNo Clean Feed – Australia says NO!

Shane CurcuruBasic home/car electronics questions

Dear #Lazyweb – it’s the holiday season, and there are a few simple electronics questions I have for you.

  • Are Ethernet -> WiFi-G adapters really that expensive? I need a simple G wireless adapter for a DVD player that only has an Ethernet port. Isn’t there some option besides all the overpriced “wireless gaming adapters”? (And yes, if I am going to play FPS’s online, you can be sure I’m using a wire, just in case). Prefer Netgear, since that’s the router.
  • Can anyone tell me what the exact ports on the back of a Sony XR-430 car radio are? I’d love to connect my iPod to my car stereo, and I know there are some RCA jacks on the back (from a fuzzy picture online), but I don’t want to actually pull the stereo out to plug in a 3.5mm plug -> RCA adapter to find out that they’re only outputs, not inputs. My CD changer is slowly dying, so I really need a better way to play iPod music in the car.
  • Is there really that much difference in HDMI cables? I’m looking to upgrade to a medium size flatscreen – possibly a 37in at 1080 (that’s as big as will fit, I think), and I’m wondering if I really need one of the $50+ HDMI cables to stream videos, or if one of the cheaper ones (or one of the insanely cheap Amazon.com ones!) will work well enough.
  • Home furnace electrical backup. We have a gas boiler for steam heat, and an older timed setback thermometer. When the power goes out, the gas stays on, as does the thermostat (and the water and water heater, nicely enough). But the boiler itself has a 120v circuit, so… no heat in the winter. Isn’t there some fairly simple way to hookup a battery backup for the boiler? It’s got a permanent pilot light, so what the heck does it need much power for other than sending the thermostat’s “yes” or “no” signal? If we could solve this, we could comfortably ride out any winter storm even without electricity. (Well, at least until all the laptop batteries die, that is!)

Thanks again #Lazyweb, and I hope you’re having a wonderful winter holiday season!

Share Shane's Sayings Technorati Google Bookmarks LinkedIn del.icio.us Facebook co.mments Live Reddit Slashdot Identi.ca Yahoo! Buzz

Sam RubyRecertified

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:

  • /etc/apache2/sites-available/ssl
  • /etc/dovecot/dovecot-postfix.conf
  • /etc/postfix/main.cf
  • /etc/ejabberd/ejabberd.cfg

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.

Nick KewJoke or in-joke?


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.

Assaf ArkinVanity 1.2: Database metrics

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.

Nick KewConvergence?


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?

Howard M. Lewis ShipUpcoming Public Training: London and Paris

SkillsMatter Logo 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!

Dave JohnsonIBM at last month's Enterprise 2.0 OpenSocial panel

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.

David N. WeltonFile Selector for Java ME

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.

FeatherCastEpisode 67: Pivot graduates from the Apache Incubator

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:

  1. Pivot website (old address, new address)

Christian GrobmeierApache Log4PHP 2.0.0 released

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

Paul QuernaI have a plan…

for snickerdoodles:

now its just down to execution.

Yoav ShapiraWe got a new RAV4 last Friday

Our lease on our previous car, a 2007 Toyota RAV4, ended a couple of weeks ago. We did a bunch of research and decided to get a new one ;) So it's a 2010 Toyota RAV4, which is 99% the same car.


Note: picture from NewCars.com, and it's just a stock photo, not our actual car.

Same engine, transmission, color, powertrain, etc. There are a few small improvements and upgrades: backup camera, Bluetooth, heated mirrors, smart keyless entry, push-button start, etc. Nothing earth-shattering, but collectively fun.

We didn't set out to get the same car. In fact, although we were very happy with the previous RAV4, we wanted to try something different. But neither our requirements nor the market offerings had changed much during this 3-year lease.

We still want a 4-wheel-drive vehicle to help with Boston's winter snow. We need room for 4 people and their ski / snowboarding gear, for those winter ski trips. That rules out most sedans.

We wanted the dealership nearby, near our house, so it's convenient for service when needed. Ideally, we also wanted the dealership located on some public transportation axis, for the same reason.

We really like bold, fun colors, like our previous Barcelona metallic red. We like the native iPod hookup. And we didn't want to spend much more than we had spent previously.

These requirements rule out a whole bunch of otherwise good cars, both SUVs and smaller. But they are what they are ;)

We had a very good experience at Herb Chambers Toyota, on Commonwealth Avenue in Boston. Specifically, our sales guy, Michael Lydon, was nice. He was patient, friendly, not pushy, and easy to work with. And the business director / finance manager who handled all the paperwork and such, Nathan Piasta, was also great.

Both of them provided excellent professional service. I highly recommend them as well as the dealership in general.

Toyota should also be commended for taking back our previous car without asking any questions or charging for anything. None of the nickel-and-diming that often goes on at the end of leases, with wear and tear. Very nicely done. And you even get a lease loyalty bonus worth several hundred dollars on your next lease.

Thanks to the good interest rates at the moment, and to Alli's negotiation training at Harvard, we were able to negotiate a great deal.

We used TrueCar.com extensively for research, and we practiced negotiating at another area dealership. We also used my previous company, CarGurus, for reading car reviews and opinions via their blog. Thanks, guys ;)

Colm MacCárthaighRole Models

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.

Richard P. Feynman

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.

Robert M. Pirsig

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

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

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 Parton

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

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

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.

Matt RaibleMy Hunting Season Adventure at The Cabin

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.

Dad gets a 4 point buck! First deer in 20 years.

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!

Hiranya JayathilakaWSO2 ESB Tips & Tricks 03: Transport Switching

Back to WSO2 ESB Tips and Tricks!
Today we are going to see how to implement a transport switching scenario with WSO2 ESB. WSO2 ESB supports receiving and sending messages over following transport and application layer protocols.
  • HTTP/HTTPS
  • Mail protocols (POP3, IMAP, SMTP)
  • JMS / AMQP
  • VFS (Virtual File System)
  • FIX (Financial Information eXchange)
  • TCP
  • UDP
With WSO2 ESB having support for such a wide range of transports, it is easy to implement a scenario which involves receiving messages over one protocol and forwarding them over another. As an example I’m going to explain how to receive messages over HTTP and forward them over JMS, using Apache Active MQ as the JMS provider. Looking at how most system integrators use WSO2 ESB it seems this is one of the most common use cases for ESB products.
The first thing we have to do is enable the JMS transport sender in the ESB. By default only the HTTP and HTTPS transports are enabled in the ESB configuration. But configuring and enabling other transports is a trivial task. Transports can be enabled by uncommenting the corresponding entries in the axis2.xml file or by using the ESB management console.
First, shutdown the ESB if it is already running. Then we need to deploy the Active MQ JMS client libraries into the ESB runtime. Download and extract an Apache Active MQ binary distribution (I prefer v5.2). Copy the following jar files from the Active MQ lib directory to the ESB_HOME/repository/components/lib directory.
  • geronimo-j2ee_management.jar
  • activemq-core.jar
Also this would be a good time to start the Active MQ broker.
Now start the ESB. The underlying Carbon platform will detect the newly deployed jar files and automagically convert them into OSGi bundles on the fly. Once the server has started go to the ESB_HOME/repository/components/dropins directory and do a file listing. You will see a set of OSGi bundles created out of the jar files you deployed.
Now that the server is up and running login to the management console as an admin. Click on ‘Transports’ under ‘Manage’ on the left navigation bar. A list of available transport receivers and senders will be displayed.

Select the ‘Enable’ option for the JMS sender. Click on ‘Enable’ to start the JMS transport sender. Once started, you can further configure the transport by specifying various parameters. But for this demonstration we can go ahead with the default settings (ie no parameters).

If you prefer to enable the JMS sender the old school way open up the axis2.xml file in the conf directory and uncomment the following entry before starting the ESB.
<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/>
Having enabled the JMS sender, we should now create a proxy service which will accept messages over HTTP and send them to a JMS endpoint. Click on ‘Add’ under ‘Proxy Services’ to start the proxy service creation wizard. On the first step simply specify a suitable name for the service (eg: JMSBridge) and click on ‘Next’.

On the second step of the wizard, create an anonymous in-sequence consisting of a property mediator. Configure the property mediator to set the ‘OUT_ONLY’ property to the value ‘true’. Save the in-sequence and create an anonymous endpoint for the proxy service. Specify the following JMS EPR as the target address. This EPR points to a dynamic queue named ‘SimpleStockQuoteService’ in Apache Active MQ broker.
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
In this scenario we will be doing a one-way invocation using the sample client application. In other words, the client sends a message to the ESB but does not expect a response in return. So the ESB should not expect a response from the backend JMS service either. We indicate this to the ESB by setting the OUT_ONLY property in the in-sequence of the proxy service. ESB will not register any call backs for messages containing the OUT_ONLY property thus no response would be expected.
Having specified the in-sequence and the target endpoint click on ‘Next’ to proceed to the third step of the wizard. Leave the out-sequence and the fault-sequence settings unchanged and simply click on ‘Finish’ to save and exit the wizard. A new proxy service will be deployed on the ESB at this point.
If you prefer to create the above proxy using the ESB configuration language you can use the XML snippet given below.
<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>
On the management console, click on the ‘Synapse’ link under ‘Configure’ and add the above XML as a child of the top level ‘definitions’ element. Click ‘Update’ to apply the changes.
Now we are all set to run the scenario. Deploy the SimpleStockQuoteService into the sample Axis2 server. Open up the axis2.xml file for the sample Axis2 server and enable the JMS transport receiver in it. This file can be found at samples/axis2Server/repository/conf directory. To enable the JMS listener uncomment the following XML fragment.
<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
......
</transportReceiver>
Finally start the sample Axis2 server. Since we have enabled the JMS receiver for the sample server, the SimpleStockQuote service will be exposed over JMS and the server will start listening on a JMS queue named ‘SimpleStockQuoteService’. When you haven’t specified a queue name in the service configuration, the Axis2 JMS transport will by default listen on a queue with the same name as the service. To explicitly specify the queue name for a service one must set the transport.jms.Destination parameter as a service parameter (ie in the services.xml file).
Finally go to samples/axisClient and run the following command to send a one-way message to the ESB proxy service over HTTP. (Here we invoke the in-only placeOrder operation on the backend service)
ant stockquote –Daddurl=http://localhost:8280/services/JMSBridge –Dmode=placeorder
The ESB will take the message and forward it over JMS to the queue named ‘SimpleStockQuoteService’. The sample Axis2 server which is currently listening on this queue will pick up the message and process it. Note the following log entry in the Axis2 server log when it takes the message from the JMS queue.
Sun Dec 13 16:15:39 IST 2009 samples.services.SimpleStockQuoteService  :: Accepted order for : 5789 stocks of IBM at $ 89.61765128551305
So there you have it. The proxy service abstraction in WSO2 ESB makes it extremely simple to perform protocol conversions and route messages back and forth. I suggest you also have a look at the set of transport switching samples that come with WSO2 ESB distribution. We got samples covering all the major protocols and even some of the domain specific transports like FIX and AMQP.
In my next post, I will focus on common problems that most developers encounter while implementing transport switching scenarios involving JMS and possible solutions to such pitfalls.

David N. WeltonMysql, Oracle and the European Commission

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.

Nick KewHow to stifle an economy


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.

Chris PepperTeaneck Armory

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.

Footnotes