I am afraid you'll have to endure the ugly page breadcrumb. It's supposed to be in the same area as the search box and CSS is not appearing the same as it was on my desktop. Just plain ugly and an eye sore but I don't feel like fixing it till another day.
Month: October 2006
Daily: Built-in Multi-User/Blog Support
I might have neglected to mention this but, unlike WordPress (not sure about Movable Type), Daily has built-in support for multi-blogs and multi-users so it can be used to host thousands of blogs each of which any number of users can post to with appropriate permissions. Speaking for myself, I think this feature is rather hot. Of course, it's not yet ready for production use yet…
Visual Studio 2005 Backspace/Delete Bug
When I fired up Visual Studio 2005 this morning, code editor appeared to have hung in midst of typing. After trying different keys, apparently the problem was strangely limited to a few special keys and commands (backspace, delete, return, ctrl-X, etc.). Even more strange, I could delete text using Edit > Cut menu command via either the menubar or context menu.
After freaking out for good 10 minutes restarting VS2005 and uninstalling recent additions like Orcas, I came to my senses and searched to find fellow victims of crappy engineering workmanship. Aha. Apparently the problem was wide spread when VS2005 was in beta so I had to dart past that cloud of noise before finding Peter Bromberg's post, Loss of Keyboard functionality in Visual Studio 2005 — and a FIX!, and John Pollard's Delete and return keys not working in Visual Studio 2005, the source of the fix.
As instructed, I blasted the content of "C:\Documents and Settings{username}\Application Data\Microsoft\VisualStudio\8.0" folder then reset VS2005 settings via:
Tools > Import and Export Settings > Reset all settings…
menu command and now the all keys are firing again. Whew. Apparently, VS2005 settings get screwed up sometimes which in turn confuses VS2005's keyboard event handler. What a piece of crap.
Thanks to both Peter and John for saving my morning from turning ugly.
Writing a Live Writer Plugin
Taking a short break from Daily, I've started writing a Live Writer plugin. It's not as simple as plugins currently available and needs fairly extensive server-side support so I probably won't be able to show it over the weekend. Anyway, the primary goal for this project is…fun, in this case .NET fun.
Re all the hoopla over Google buying YouTube, I officially don't give a hoot cuz I am having too much fun.
Daily: i18n comment bug fixed
Just fixed an i18n comment bug. Thanks to extra sweat I put in to make Daily highly configurable, no code update was necessary, just addition of a couple of jars plus config patch then restart. One of these days, I'll add hot-config for convenience. In practice, however, configuration changes without bringing systems down is rare. Even large banks use the good old shutdown-patch/reconfig-restart. Of course, they do load-balancing and rollout waves to minimize the inconvenience surface but I've never seen hot-config on their must-have list.
Anyway, do me a favor and post comments in your favorite foreign language to test the fix. Thanks.
Daily Details
Daily webapp is written in Java. I could have used .NET/C# combo but a) I am more comfortable with java, b) Eclipse beats Visual Studio hands down (except for writing web services), and c) java currently offers more choices when it comes to third-party libraries.
Libraries:
Spring Framework 2.0 – for ease of ad-hoc configuration. It lacks support for distributed dynamic configuration so I'll have to cross that bridge later. Optional Spring MVC (equivalent of Struts) is also used but I might switch later. Spring Web Flow was not used but I might do so when need for screen complex flow arises.
iBATIS 2.2 – I prefer close-to-the-metal DAO works so I chose iBATIS over Hibernate. I used only Data Mapper layer so far although I'll probably use Data Access layer as well when I add fine-grained caching.
Lucene 2.0 – freaking great for search flexibility and tagging support.
TagSoup – I chose John Cowan's TagSoup over JTidy for parsing HTML because it's faster and code looks easier to tweak later to handle brain-damaged RSS feeds. TagSoup is currently being used to sanitize HTML content, extract embedded data like microformats and tags, and to strip tags prior to submitting content to Lucene.
JBoss Rules (formerly called Drools) – Although current version of Daily doesn't require much dynamic intelligence to support basic blogging engine needs, I've got a lot of features that calls for fast rule-based blackboards which is what this library is really good for. I've used Drools with good result before but I think mixing it with something like ServiceMix opens up some interesting possibilities. For now, it's handling some minor HTTP request analysis and link analysis, results of which is unfortunately not being used yet. Hah.
TestNG – for next generation unit testing, TestNG beats JUnit 4 easy.
Apache XML-RPC – for Blogger, MetaWeblog, and Movable Type APIs. I am using version 2.0 instead of 3.0 because the later version closed off some key integration points which makes it more difficult to use.
Akismet Java API – for comment spam checking with Akismet.
North Korea Tested Its Nuke
According to AP, North Korea went ahead with its nuke test. And according to Korean newspapers, North Korea confirmed it with an official announcement saying the test, performed on 9th, was successful and no radiation leaks were found. A South Korean geological research agency reported that an earthquake measuring 3.6 on the Richter scale originating from the test site in North Korea was detected on 9th at 10:30AM.
The show finally begins. Oy.
Update: Reuters reports that China was notified just 20 minutes before North Korea pressed the button.
Switch Complete
It took me awhile but now the blog is running on my blog engine. I had some difficulty with URL rewriting to keep old links working but was able to fix it in the morning.
With new blog engine, I'll be using mainly Live Writer to post because it has some cool features like image effects (color pop and picture frame used on the sexy picture of a Korean starlet on the right) and tags I added below.
I've turned on Akismet to filter comment spams but haven't tried it yet. There are many old pre-switch comments still but I'll have to add a comment search feature before I can remove them efficiently (i.e. search
comments with 'poker' in content or other fields then delete them altogether after checking off rare honest posts.)
PS: The banner image was taken last week looking west from my boat dock which can be seen in this satellite map inserted via Live Writer
(deleted due to javascript error it was generating). Hmm. I just noticed that there is no way to center things in Live Writer. Weird.
Adding S3 Backup
This blog has no automated backup so, after looking at Jeremy Zawodny's math (via Dave) on S3 cost effectiveness, I've decided to add S3 backup feature to my new blog engine. Some links I am looking at from java-perspective (blog engine was written in java):
- S3 docs
- S3 docs as Eclipse cheatsheets
- S3 browser-based playground
- S3 release note archive
- S3 articles
- S3 solutions (incomplete IMHO)
I think jets3t is what java developers should be looking at for S3 integration. I'll use it as is first then maybe upgrade it's SOAP support from Axis 1.4 to Axis 2 if the need arises.
Quickest way to do this is to just write an ant script file that just ships out a package of MySQL database dump plus some directories. But this quick-n-dirty solution is likely to require taking the database offline if I want to avoid getting MySQL grease all over myself.
When I have more time, I'll add a smarter backup service that does blog-specific automated/on-demand backup using compressed RSS files (with comments and extraneous info embedded using an extension namespace) and binary files (for images, etc) tied together using OPML.
Cruising
If I had to pick the best moment in any engineering project, it is when I am building on top of an engine I've spent time and energy to pour a powerful basket of functionalities into it. After climbing over that severe slope, suddenly everything is a breeze to do and you are at cruising speed, a brief moment of pure joy before smacking face first into a wall of production chores.
Yesterday was such a day. I've implemented Live Writer tagging support by simply writing and plugging a HtmlTagProcessor into a HtmlFilter which is plugged into a PostFilter which is used to process new or updated posts flowing in. Tags are collected and processed all together neatly and available to pages in the blog-specific tag space which has link to site-wide tag space which has links to popular public tag spaces. All that in a couple of hours and a series of sweet satisfying smiles. Akismet? Wham, done in minutes and awaiting to be tested.
The joy is not as great as it used to be though. When I was young, I could just sit and crank out code for days like a drunk might puke after drinking all night without a single compile nor test then when I run it, it used to compile and run dreamily like a corvette cruising at 150mph on highway 5 at 3am heading down south. And everytime, I used to get that huge smile all to myself. Now that I am older and less of a juggler, it's hourly cycle of test-driven fits. Oh, well. I've gotta do what I gotta do to feel that juice again and it sure beats having to babysit junior engineers and making empty promises to executives.
If Joi ever wondered why I've suddenly quit We Know, it was because I've missed this kind of joy (now that's a lot of joi/y. LOL). In a way, it's like grinding every weekend for months with the guild to get Rag except it's just me and miles of code.