Saturday, April 29, 2006

Blog reset

Hello, faithful readers. First of all, I'm duly impressed if you're still subscribed, but if you are, please do go straight to, and also, replace your subscription to this blog with this new feed. I'm also setting up a cached copy of this blog's content on the new server. Hope to see you soon!


(P.S. Seems like there still in 2006 is not a straightforward way to redirect feeds if you don't host your own blog.)

12:04:08 AM      comment []  trackback []

  Saturday, November 26, 2005

Maven-proxy in ruby

Lothar Märkle has a neat little perl CGI substitute for Maven proxy. I started to use it to build up a Maven 2 repository at work for our Maven 2 builds. Only when it wasn't quite behaving as I expected, I really didn't want to brush up my perl skills to debug it. Why do that when you can spend an afternoon polishing up a ruby version?

So here's maven-proxy.rb, version 1.0 (download zip). Check it out, I think I baked in a couple extra neat features, including the ability to transparently navigate remote, uncached directories from your local repository. I also gave an example Apache configuration to let Apache serve the cached content while deferring to the CGI for the remote, uncached resources. It's licensed under an MIT-style license, so I only ask that you give me credit (or blame) for the original code :)

If you ask me, this is better than running the original maven-proxy under Tomcat...

Happy Holidays!

4:57:05 PM      comment []  trackback []

  Wednesday, September 14, 2005

Customer Service Done Wrong

Both Dave and Doc have posted on this subject recently, so I thought I'd share a couple of the horrible customer experiences my wife and I have had lately.

I walked into Surdyk's over the weekend rolling into the beginning of August. My bank card number had recently fallen prey to the Card Systems breach but I had forgotten about it. I walked up to the counter with $120 worth of beverages and when I went to pay I found out they don't accept checks anymore. I didn't have cash, so I reluctantly handed the cashier my bank card after asking her if they take debit cards (PIN-entry style). She said yes, and proceeded to run it as a credit card. Well guess what, it came up as lost, and she called the manager over, who promptly confiscated the card. I explained the situation, how I knew the card was lost, didn't mean to have it run as a credit card, showed my ID, and yet they still refused to listen. I asked for the card back so I could walk across the store and use it in their in-store ATM but they refused. After one last pleading session with the manager I stormed out on him, vowing to not go into their store again. Well almost. After talking to my wife, I had to get the card back to make it through the weekend, so I went back into the store again, found the manager, explained that I needed the card and would he please call the customer service number on the back and they'll tell you it's ok to give it back to me. He grumbled something about "having a floor to watch" and went over to the phone. Finally after a painful 5 more minutes of back and forth with the CS agent on the phone did he give the card back, accompanied with a snooty, half-hearted "sorry". So Surdyk's sucks rocks. If you're in the Twin Cities area, don't patronize them -- there are better deals on liquor anyway.

Our health care clinic recently switched to a paperless, electronic system. Except going paperless apparently means that they didn't have the budget to hire someone to key in all the paper records. So we're starting virtually from scratch, have no history in their system, and my wife wasted an extra couple of hours during one visit just getting re-registered. After the hassle, she told our doctor that were it not for him, she would have walked out and gone somewhere else. He replied that she was not the first person to tell him that that day.

We don't often patronize national pizza chains, but one night we were desparate so my wife called Pizza Hut. She was confronted by an automated IVR system that prompted her to place her order. Can you imagine?!?! An IVR menu system to order pizza!! It took her at least 5 more minutes to figure out how to navigate the menus and place an order. Needless to say I don't think we'll be doing that again, and our stomachs will be thankful.

11:25:33 PM      comment []  trackback []

  Tuesday, September 13, 2005

Microsoft, Competition and the Right Fork

So, it turned out to be a well-timed Gillmor Gang this week for me, as I started listening to it on the same day as the PDC keynotes were webcast.

It seems that Microsoft is fast approaching a fork-in-the-road. The left fork represents the illusion of continued desktop dominance fueled by Wall Street hunger for sky-high profit margins in the Windows and Office businesses, and is very much grounded in the 20th-century Microsoft. The right fork represents the future of the company, battling for market share in a Web 2.0 world, innovating both in the rich client and web application arenas, playing fair by creating and building open standards, and doing all of this in such a way that the end user comes out the winner.

So which way will they go? Where's the new revenue model in the open world of the web when your sacrifice your existing business to get there? That's the big white elephant in the room at PDC.

Microsoft, stop charging for the tools. If Avalon, Indigo, Atlas, LINQ, Max and all the other goodies being dangled in front of developers this week are to ever gain any widespread adoption, they need to be accessible to the hobbyists out there. Give away IIS. If Apache is already free, what incentive is there to run IIS? Give away SQL Server, to at least level the playing field with MySQL. Give away Visual Studio, allow companies to develop and deploy ASP.NET and Indigo applications to their heart's content. Make it possible for the hacker in the basement (i.e., me) who's taken up Ruby on Rails to try your way of building web apps.

Jon Udell tells a good story in the Gang podcast of the difference between TerraServer and Google Maps. TerraServer has been out for years, has a public API, and yet has not inspired innovation or remixing in the way that Google Maps has. The conclusion was that Microsoft has too long focused on the developer as a professional ISV. In this scenario, the ISV is just a middleman preventing and stifling user innovation because the cycle is too lengthy. By the time developers have gotten around to building and distributing apps and getting some level of user adoption, there's no where left and no reason for the user to innovate -- it's too late. Of course, user customization and innovation is what the new 21st century web is all about.

So, Microsoft, take that leap of faith, get your stuff out there, gain adoption through cool, fun, programmer-friendly, easy-to-use tools and an open platform. Compete based on speed of innovation and the ability to retain a user base through that innovation without locking them in. Choice is what builds trust.

Take the Right Fork.

8:43:21 PM      comment []  trackback []

  Friday, September 2, 2005

Using Drools, If It Weren't For All That Bloody XML

Rule engines, at the outset, appear to be a nifty concept for making Java applications more late-bound, dynamic and configurable. Drools in particular even seems to be getting some traction as I've seen in mentioned several times over the past few weeks. But why, oh why do they insist on the angly-bracket, ugly XML syntax?

Maybe I'm just a Ruby-as-platform-for-building-DSLs convert, but doesn't this seem a whole lot more readable than that mess of XML that Drools uses?

require 'drools'
require 'daofactory'
require 'stockoffer'

class StockOffer
  def print
    p "Name: #{@name} Price: #{@price} BUY: #{@recommend_purchase}"

class BusinessRulesSample < Drools::RuleSet
  application_data DaoFactory

  rule "XYZCorp" do |rule|
    rule.accepts StockOffer
    rule.salience = "-1"
    rule.condition {|stock| == "XYZ" }
    rule.condition {|stock| stock.recommend_purchase.nil? }
    rule.condition {|stock| stock.price > 10 }
    rule.consequence do |stock|
      stock.recommend_purchase = :no

  rule "Stock Price Not Negative" do |rule|
    rule.accepts StockOffer
    rule.condition {|stock| stock.price < 0 }
    rule.consequence do |stock|
      stock.recommend_purchase = :no

  rule "Stock Price Low Enough" do |rule|
    rule.accepts StockOffer
    rule.condition {|stock| @dao_factory.stock_dao.on_stock_list? }
    rule.condition {|stock| stock.recommend_purchase.nil? }
    rule.condition {|stock| stock.price < 100 }
    rule.consequence do |stock|
      stock.recommend_purchase = :yes

10:23:31 PM      comment []  trackback []
Crescent City State of Mind

Today was one of those days with too much going on in my head. Tops above all, of course was the Gulf Coast Hurricane aftermath.

Everything just seems so inconsequential compared to it. It feels like such a chore just to keep up with all the technology blogs that I usually am so interested in.

My soul is just aching for a sense of peace, but every thought races down south and manufactures a connection to some human entity that I don't even have consciousness of. It's not a real person, but an embodiment of a relationship I desire to have with a real person in the thick of the suffering just so I can experience a little of the same. All the tragedy that is going on has a way of making the minute, hum-drum aspects of life seem incredibly trite.

Rest well, ye souls of New Orleans past and present.

9:33:12 PM      comment []  trackback []

  Saturday, August 6, 2005


I've already posted how I had an awesome week in Portland at OSCON, but I just have to post separately about a particular event that capped the trip off.

I don't fly that frequently, but it's been getting more frequent in recent months -- I've been on a plane each month for the last four months and five times so far this year. Usually the plane ride is a dreadfully boring experience that you wish would just end as quickly as possible. When I flew out to Portland, it was on a Sunday night, the plane was delayed almost three hours and I arrived in Portland at 2:30 AM Monday morning. That's the kind of flight that makes me wish flying was more enjoyable.

Well, what a gift I received on the way home yesterday. When was the last time you spent an entire 3-hour flight in an engaging conversation with your neighbor? If you're a connector, a maven or a salesman (in Malcolm Gladwell's terms) and you travel often, then probably it has. But for me, a quiet, introverted, introspective person who generally has difficulties making good connections with complete strangers, this is extremely rare -- in fact it has never happened to me. Until yesterday.

I was sitting in my window seat, emailing frantically on my blackberry before the closing of the doors would force me to turn it off. A slender, pretty brunette woman came and sat down next to me. This is nice, I thought. Usually I'm stuck sitting next to some sweaty, bad-breath-having man who is put off by my asking to get up during the flight. At least she smiled and seemed friendly as she sat down. I mumbled something about closing the shades to avoid the hot sun beating in, and she asked if I minded if she put down the armrest between us. Ok, time to settle in for the flight. I reach for my ipod, and then notice she's taken out a book to read, The Da Vinci Code. At this point, I would usually think, Oh, that's a coincidence, I've read that too (but not really a big one since the book was such a hot seller) and simply sit back, put my ipod on and relax. And if I had done that, maybe the entire flight would have been completely different. But for some reason I made mention of the book to her, and we began chatting about the book. And chatting about other things. And getting to know each other. Pretty soon, I'm thinking, wow, this is unusual, I really feel comfortable talking to this person. I hardly ever feel comfortable talking to anyone for a lengthy period of time.

The flight went by so quickly, and we talked the whole time. After landing, It was time to de-plane, and we said a brief goodbye, and I was thinking, Well, that was nice, too bad I'll probably never see her again. But once I got off the plane out into the gate area, she was there so we ended up walking back toward the main concourse and talking a little more. I offered to go get a beer while I wait for my ride (she had a layover), and she accepted.

So when was the last time you had a beer with the person you sat next to on the airplane? :)

Hey Kelly, if you're reading this drop me a note. It would be fun to connect again.


4:08:04 PM      comment []  trackback []
Goodbye OSCON

What a whirlwind week at OSCON! I'm still spinning and trying to catch up on sleep the day after getting back home from my first O'Reilly conference experience.

For me, the main themes this week were Java, Ruby, Ajax/Remote scripting and Subversion. I have some skeleton outline notes from several more talks that I'll put online shortly at my OPML blog. I'm still too overwhelmed to form these into fully coherent thoughts, and each could easily generate multiple blog postings.

Off the top of my head, here are a few random thoughts that were floating through my head this week:

  • If you want to meet the best hackers in the world, come to OSCON. Open source programmers are the most passionate of their kind, and where there's passion there's intelligence, community and great ideas.
  • If you want to hire the best hackers in the world, come to OSCON. The networking opportunities are absolutely incredible -- I was blown away. Now actually convincing a hacker to come work for you is a different story. It would help if your business had some kind of open source strategy, so that the hacker can continue to participate in the community and give back what he or she works on at your company. Non-open-sourcers will find it unreal, but it is possible to contribute to an open source community and still receive a lot of business ROI from the exchange. Paul Graham is quite possibly the most articulate speaker you could find on this subject. I was at his What Business Can Learn From Open Source keynote and it immediately struck me as great fodder for discussion at the cube farms back at work.
  • Damian Conway is an evil genius. And his arch nemesis may be Danny O'Brien.
  • As I mentioned it was my first time at OSCON, and I was really surprised to find the whole OSCON community extremely friendly and receptive. I never sensed any elitist attitudes (not that there probably aren't any here or there) and never felt like an outsider. To me, it's important that the community retain this sense of welcoming and open-ness so that we can further the cause and be better positioned to promote change for good in the world.
  • Ruby is a super cool language, but it's not a panacea. There is still lots of room for growth in the language. During Matz's talk he mentioned that he wants to implement a sealing feature of some kind so that some Ruby code could be locked down or scoped to a single file only (unlike the current implementation where you can change any class, anywhere, on the fly). Ruby still seems a year or two away from fuller adoption in the enterprise, although that's not going to stop me from trying to use it.
  • Likewise, Java's not dead either. The same players in the Java open source community are around and are still committed to the language. However, the politics can tend to get a bit more ugly.
  • Subversion is ready for primetime and I can't wait to roll it out at work.

Like I said, my head is still reeling and my blood still pumping after a high-octane week. I'm looking forward to stepping up my involvment in the open source community and I hope to maintain contact with all the folks I had the pleasure of meeting during the conference. Cheers!

3:27:27 PM      comment []  trackback []

  Monday, August 1, 2005

OSCON OPML tutorial notes

My raw outline notes from today's ruby sessions are here.

11:18:28 PM      comment []  trackback []
Me too OSCON

I'm here in Portland this week too for OSCON 2005. The first day was great but rather exhausting as the lack of sleep is catching up with me -- flight got in super late Sunday night/Monday morning.

The first day for me consisted of the Ruby track of tutorials. Dave Thomas was up first. He's got the conference speaking act down pat. Highlight: during a quick rant on static vs. dynamic typing, he said something along the lines of "anyone using java generics as an argument for static typing should be shot" which was tongue-in-cheek if not dead on right :).

Next up was DHH. David needs a little more work on his pacing -- he ended up at the finish line with a lot of material uncovered. It was basically a big coding session with David upping the standard for the "hello world" app of the new web development millenium by coding up a fully-featured blogging application in the course of a few hours. I had no problems following David; I've been toying with Ruby for a few weeks now, but there were several quiet moments where no one in the audience of over 100 caught the fact that he was adding a new action method to the wrong controller. You had to squint a little bit to see and appreciate the wizard at work; apparently not everyone appreciated David's style. If the Rails video didn't captivate you, then this talk wouldn't have as it was basically the extended remix :)

Looking forward to the Learning AJAX and Creating Passionate Users tutorials tomorrow...

10:08:52 PM      comment []  trackback []