How to Make a Perforated Monolith

Sunday, November 12, 2023

My first encounter face-to-face with distributed applications was at a company processing large amounts of data. The company's core product was a distributed application, and my initial, naive inclination was to run the the application locally so that I could understand it better. I didn't want to scale it on my laptop. I didn't want to test a heavy load on my laptop. I simply wanted to step through the process of a piece of data as it entered the system, was processed, and arrived at its final destination. It took a few days before the realization hit: running this distributed application locally was simply not possible.

Read More

Improving the Maven Bill of Materials (BOM) Pattern

Wednesday, June 14, 2023

Managing the versions of a project's dependencies is difficult, and Apache Maven was one of the early tools to bring some automation to the process. Its Project Object Model (POM) allows a developer to declaratively indicate versions of project dependencies, even before (and whether) they are used in submodules. The Bill of Materials (BOM) pattern facilitates version management even further, by allowing a project to effectively export a group of related dependency versions. But the approach Apache recommends to creating a BOM is verbose and a bit unweildy. I'll show you how to trim it down to produce a more manageable BOM for your project.

Read More

Using AWS ECS Service Connect and Service Discovery Together

Thursday, June 1, 2023

A major consideration when deploying services in AWS Elastic Container Service (ECS) is how to determine how to connect services to other services. Traditionally AWS provides ECS Service Discovery by leveraging AWS Cloud Map, a DNS-based service lookup. Because of well-known downsides to this general approach (primarily a latency in DNS updates), AWS now provides Service Connect, a simple-to-use service mesh using a sidecar which proxies requests. But Service Connect doesn't update the DNS, making it difficult to access your services by name from outside ECS (e.g. via the command prompt in Cloud9). It turns out that ECS Service Connect and ECS service discovery can both be used together if you make certain configuration adjustments.

Read More

Connecting Spring Boot to AWS DocumentDB with Secure Credentials

Monday, April 24, 2023

Most of the dozens of code snippets in Spring Boot books and articles showing how to connect Spring Boot to MongoDB aren't secure, embedding usernames and passwords directly into the configuration. Many times those explanations will indicate that "you shouldn't do it this way", and imply (hands waving) that it's easy to do it the correct way. But it's not straightforward to do it right, especially when using Amazon Web Services DocumentDB which supposedly is compatible with MongoDB (but is slightly incompatible, in tricky ways). I'll show you how to configure Spring Boot using ECS Fargate, connected to DocumentDB, with username and password securely stored in AWS Secrets Manager.

Read More

Embedded MongoDB Only in IDE using Spring Boot 3.x

Sunday, April 2, 2023

If you have a microservice using MongoDB, you may have a Docker Compose file set up to start your microservice and MongoDB at the same time, in separate Docker containers. But sometimes you'd like to quickly run the application within your IDE without the need to go spin up an instance of MongoDB manually. This is possible using Spring Boot and profiles, although as usual there are lots of gotchas (especially with Spring Boot 3.x) that you'll never find in the books.

Read More

First Steps with Docker Compose

Sunday, March 26, 2023

Docker Compose is the tool that allows you to start up a network of several Docker containers together for testing. It turns out that many of the latest books (even within the past couple of years) are either out of date or missing details. Sure, the examples will usually work, but there are now better ways to do things. Here are a few tips to answer questions likely to come up if you're just getting started.

Read More

No-Fuss React and JSX with Spring Boot

Tuesday, March 21, 2023

In almost every book, article, or general instructions for starting a new React application you'll find a dizzying array of recommendations for full-blown front-end development pipelines. One of the most common seems to be Create React App (“the last choice for a real-world production application” according to one blog), although you'll also see Vite, Next.js, Remix, Gatsby, and Webpack mentioned. But what if you already have a build workflow, such as a Maven/Gradle project with Spring Boot, and you just want to add React to some pages? You don't have to install a monstrous parallel build system; you can integrate React transparently into your build system with a little configuration.

Read More

Fixing Manning EPUB Code Spans

Wednesday, January 4, 2023

I've long been a fan and vocal advocate of Manning Publications. Manning books have high-quality content, on par with books from O'Reilly. Broadly speaking, a Manning book has the personal feel of a user manual, while a O'Reilly book gives the impression of an indispensible reference. When Manning first started offering DRM-free electronic versions of their books in PDF format back in 2004, I quickly sent an enthusiatic thank you over to Marjan Bace and the company. Later additions of EPUB and MOBI formats have been equally welcome. Unfortunately MOBI support has not kept up with later Kindle reading devices, and the last two years of produced EPUB files have a large (literally!) problem with inline code snippets which makes reading unbearable.

Read More

PostgreSQL Management on Windows

Sunday, March 9, 2014

PostgreSQL is one of the oldest, most powerful, and arguably one of the most complicated databases to administer. It is the power user's database. Paradoxically its installation on Windows, in trying to ease deployment, makes system configuration so "plug-and-play" that almost no one seems to know how to make even the tiniest deviances from the default installation configuration. I've went through the pain of researching and experimentation, and it turns out that a moderate power user can relatively easily create extremely flexible PostgreSQL configurations on Windows, if only someone were to write down how to do it.

Read More

Editing Loops with Audacity

Sunday, February 9, 2014

In any list of "must-have software", gushing editors invariably include Audacity (currently at version 2.0.5), an audio editor that supposedly is as good or better as the for-pay big-boys. Perhaps its audio engine is powerful and flexible. Unfortunately, like so many other free, open-source projects, it utterly fails when it comes to usability.

Read More

The Subtleties of Browser Devanagari Support

Saturday, June 29, 2013

Browser support for Devanagari (the script used to write Hindi) has come a long way in the last decade. When I started writing my Devanagari tutorial back in 1998, I had to edit images of each Devanagari character, as Unicode support in most operating systems was merely a fancy idea and browser display of Devanagari characters was only a pipe dream. In 2013, all the major operating systems support Unicode, and all the major browsers display Devanagari characters. Even Devanagari joining rules are followed, such as automatically joining व and ा to form वा. But there are still little wrinkles left to be worked out.

Read More

God's Comfort Women

Tuesday, May 14, 2013

I read today that a Japanese politician has declared it was "necessary" during World War II to force 200,000 or so women to become sex slaves for soldiers as so-called "comfort women". My first thought was, "Well, that's pretty much what God commanded in the Bible in Numbers 31", except that in God's case he also commanded everyone captured who was not going to become a sex slave be killed. God only wanted the virgins kept as war booty (no pun intended), and got sort of irritated when the other women weren't immediately slaughtered. This wasn't the first the first or last time God advocated (I mean "commanded", of course) genocide and other war crimes. Maybe former Guatemalan dictator Efrain Rios Montt, who was just found guilty of genocide, should just say that God told him to do it.

Read More

Restarting Projects

Saturday, October 20, 2012

This week I rediscovered and restarted several projects that have been on hold for ages. When I started on one of them, the continued development of the URF semantic data representation and storage framework, I discovered that Atlassian now offers on-demand hosting of JIRA on their site! The price is completely reasonable, and will help immensely managing my software projects—and why not my non-software projects as well?

Read More

The (Still) Sorry State of JavaScript XHTML Editors

Sunday, March 4, 2012

Over three years ago I surveyed the state of JavaScript-based HTML editors embedded in web pages, and found that overall they did a crappy job of basic functionality and standards-compliance. With the growing popularity of HTML5, I grew dissatisfied with my choice of TinyMCE, so I revisited the options. Unfortunately, I've found that, even though there have been a few changes, it still seems nobody cares to get the basics right. I did change my choice of editor for my Guise framework, though.

Read More

HTML5, Data Attributes, and Incompetence

Saturday, February 25, 2012

HTML5 is evolving to be a concise, semantic framework for marking up textual data. There has always been the need, however, to store custom information within a page, information for which there may not exist an HTML tag or attribute. HTML5 has now provided us with data attributes: one can now store custom data in a page by simply prefixing an attribute with data- (for example data-foo-bar). Isn't this wonderful? No, it's stupid, and only illustrates the level of incompetence in the world of web implementations.

Read More

The Mixx UI is Mixed Up

Saturday, January 28, 2012

So I just downloaded Mixx, the open-source DJ software, to try it out. It (so far) doesn't seem to modify my files, so in this aspect it's better than Traktor, which wants to update my entire library rather than maintaining a separate database or creating metadata sidecar files.

Read More

IE9 HTML5 Doesn't Support WAV Files

Tuesday, January 17, 2012

HTML5 is turning out to be useful. Well, in theory. If it worked. See, HTML5 comes with all sorts of capabilities, like an <audio> element that plays sound. And this time around, the browsers are setting aside their instincts to be proprietary and, in the spirit of interoperability, they are implementing the same API! Microsoft even loves the <audio> element! So now can we write pages that work the same across browsers? Of course not! While they support the same API, the browsers decided they would only support certain audio codecs—meaning that there is no one audio format that will work on all browsers. As usual, Microsoft's actions here can only be considered malicious and in the spirit of preventing interoperability, not encouraging it.

Read More

IE9 is Worse Than IE6 at Ajax

Wednesday, January 11, 2012

What is it about Microsoft that, the more they claim their browser is standards-compliant, the harder it is to write code for it that support standards? What is it that makes code just work on all the other browsers, but makes developers jump through hoops to make things work on Internet Explorer? I think it's something of a culture. While other browser developers work towards the spirit of the standards, Microsoft must create an environment where standards-compliance is a forced nuisance rather a goal. Or is something more sinister afoot? Are they actively try to make it hard for developers to create maintainable, standards-compliant applications. Whatever the case, after all the years and years of pain with Internet Explorer 6, Internet Explorer 9 has come along and screwed everything up even more.

Read More

Suffix Trees in Java

Thursday, December 15, 2011

I confess that I consider myself more of a software application developer than a computer scientist. I prefer to understand algorithms at a conceptual, intuitive level—how they do what they do, and when they should be used in an application. When I read an algorithm book, my eyes glaze over when presented with page after page of mathematical symbols and proofs. But recently, when a potential client presented me with a string searching problem, I decided to do a little background research and came across a little-known programming data structure that has changed my outlook on playing tricks with algorithms.

Read More

Pat Robertson Embarrasses Christians

Tuesday, November 8, 2011

Yesterday another earthquake rattled Oklahoma in the Buckle of the Bible Belt. This has been a year of extremes in Oklahoma, including the coldest temperature recorded, the highest winds in history, and the biggest hailstone on record. When yesterday my sister reported that she experienced the latest earthquake during the middle of a tornado watch, my first thought was: where is Pat Robertson when you need him?

Read More

Getting 3G in Brazil on TIM

Saturday, June 25, 2011

In Brazil I'm generally too scared of getting my T-Mobile G2X stolen to take it out of the house. (Plus it gets in the way of dancing forró.) So I usually leave it at home and use the tiny Nokia C3-01. The C3-01 is a pretty good phone, with a touch-screen and 3G connectivity, which worked on Brazil's TIM network in Rio de Janeiro. But then the C3-01's screen stopped working; I sent it in to get it fixed and when it came back it worked for a day before stopping allowing input altogether. So I had no choice but to resort to using my G2X.

Read More

Guise™ and Marmox™ Get Facebook Like Button

Saturday, May 28, 2011

Today I integrated the Facebook Like button into the Guise™ web application framework and marmox.net, which is the site management application that runs all my sites, including the site hosting this very blog. This means that my site now automatically allows Facebook users to "like" my pages with no extra work on my part. Based upon the type of page viewed, the appropriate image will be provided for Facebook to index (e.g. a thumbnail for photographs). Furthermore, my personal Facebook ID and Facebook Application ID are automatically included, along with other metadata from the underyling resource being served. All this is done automatically through Marmox™ resource kits accessing resource metadata of my content stored in a Subversion repository.

Read More

I Missed the Rapture So I'm Writing This Blog Entry

Saturday, May 21, 2011

As I wake up here and sleepily stumble over my computer, the fact that I still have a computer in my room tells me I must have missed the rapture that was predicted on May 21, 2011. To be honest, most mainstream Christians have been laughing their heads off—or at least shaking their heads sadly. After all, they say, we can't know the day or the hour when Jesus will appear in the sky and all believers will float off into paradise. But with each new nutcase predicting the end of the world, religous people should laugh less and less, because each time it comes around it becomes a little more obvious: what's absurd about these predictions is not just the date that is set—deep down we all know that it's the idea of a rapture that is, well, just a little crazy.

Read More

Ubuntu's Unity is Buggy

Wednesday, May 4, 2011

I've only been using Ubuntu for less than a year, so I haven't become married to any particular look-and-feel. I think the standard fonts are a little garish, and I have no problem with trying a new interface. When Ubuntu 11.04 came out, I had no particular objection to its new Unity front-end. But I want it to work, at least.

Read More

Eclipse 3.7M7 is Broken

Saturday, April 30, 2011

Is there any software that works? No. It's all crap. It's all broken. Why do people both releasing this stuff, if you can't even do basic work with it?

Read More

String and Character Array Alternative in Java

Sunday, April 24, 2011

A String in Java is a quasi-primitive type made for passing around sequences of Unicode characters such as are found in spoken languages, and the class does a good job at this. But if you want to indicate certain characters, without regard to order—such as indicating the characters allowed in a username, for instance? Most programmers will use a String for this task as well, while others will resort to an arrays of char. Both approaches have their drawbacks, and I've come up with a solution superior to both, an approach the usefulness of which even I have been surprised.

Read More

Nokia and Google Suck at VCard

Tuesday, April 19, 2011

Ever wonder why your computer, even if it sports the latest technology, doesn't seem to be able to perform the simple things you ask it? It may not be you. Despite glittery marketing and millions of dollars spent, big companies like Nokia and Google can't even take the time to do simple things right. A case in point: transferring a list of contacts between a Nokia phone and GMail will only happen without snags if you have the simplest of data, and this is because of lazy developers didn't implement the VCard specification correctly.

Read More

VPN Approaches: IPSec and SSL

Thursday, March 31, 2011

Here and there on the web one can find discussions of Cisco's licensing policies and the abandonment of the Cisco VPN Client in favor of the Cisco AnyConnect client. But there seems to be a dearth of information on how the different technologies work, and what it means for a user. I'm no VPN expert, but perhaps a few points here can make the picture a bit clearer.

Read More

Free LAME MP3 Conversion in MediaMonkey

Tuesday, February 8, 2011

I've spent years searching for a good music player on Windows. Years ago J. River's Media Jukebox, which later became Media Center, "just worked". Then came the day a version started modifying my music files. Even though I had been a very early paying customer, my complaints were met with "updrade to the new version". So I switched to Mozilla Songbird—multiple times. The early versions were incomplete and buggy. The later versions were incomplete and buggy. Songbird as well started changing my file modification date and no one would respond. Then I found MediaMonkey.

Read More

The GlobalMentor Ebook Reader is Back

Sunday, September 27, 2009

Almost exactly a decade ago, I and my company, GlobalMentor, Inc., were part of a group of organizations that defined the modern ebook industry. As part of the Open eBook Forum, now the International Digital Publishing Forum (IDPF), we created a specification that have recently become popular on the newest reading devices from companies like Sony. I was development co-chair of the OEBPS 1.2, before it became known as EPUB, and I developed and released the first publicly available native OEB reading software.

Read More

Phillip Garrido Talks to God, Like You Do

Tuesday, September 1, 2009

Some days I feel like giving faith-based God-believers the benefit of the doubt (no pun intended), that their approach to reality is somehow reasonable. On other days, such as today reading about about how Phillip Garrido hears voices from God, the whole thing makes me sick. Reason will say that the Bible is full of myths. Abandoning reason and relying on personal communication with God puts you on the same shaky ground as Phillip Garrido, ready to believe that it's OK to let your own daughters be raped if you think God wants it so.

Read More

Ultimate Java Logging

Sunday, August 16, 2009

Several logging systems exist for Java. There is the Java logging built-in to the latest libraries, which doesn't allow very flexible configuration and doesn't even allow source code line-numbers in the log. There is also the tried-and-true Apache Log4j package, which offers great flexibility but isn't built-in to Java. These two systems have a lot in common, and oftentimes a project is forced to choose one or the other based mostly on the personal preferences of the team members. Once a project commits to a particular logging framework, it's not so easy to switch, as logging is pervasive in the code. Furthermore, logging framework choice is global, even if the framework chosen has flexible configuration. I've created a new logging framework that provides a simple, generalized interface that can be configured to delegate to your favorite logging system, or to rely on its own easy-to-use default implementation.

Read More

Serializing Configuration Information in Java

Wednesday, August 12, 2009

Serialization of objects has many uses in Java, including persistence of a particular state; communication with other applications; and storing of an application's configuration when the program is not running. The latter use case, storage of configuration information, has its own set of constraints that require special attention when serializing. Simply handing off a configuration object to some serialization service is not enough. Diligent planning of serialization is required to produce configuration files that are accessible to editing and flexible enough not to break as your application evolves.

Read More

Context-Specific Configuration in Java

Sunday, August 9, 2009

A conundrum that repeatedly appears across all areas of software architecture is how to provide configuration information to those parts of the program that need it. Ideally the root module that loads or otherwise creates the configuration information would pass the information to the needed area. For example, MyApplication may load MyApplicationConfiguration and pass that to MyDialog via its constructor, allowing the dialog to tailor its information based upon the application's current settings.

Read More

Back Up Files on Linux

Sunday, August 2, 2009

How hard is it to back up files on Linux? It's not very hard—but it's not very straightforward, either, and for every way that works, there are several that don't. Windows is the operating system that doesn't work well at the low-level nuts-and-bolts. Because Linux is the workhorse OS of the web and is known for its stability and ability to manipulate files, you'd think that there would be an easy way just to archive a bunch of files. But there isn't.

Read More

Declarative Markup and Code Syntax in XAML

Wednesday, July 15, 2009

"XAML doesn't do math", our instructor said yesterday. I'm taking part in a three-day training in Windows Presentation Foundation (WPF), a new user interface framework from Microsoft; and the Extensible Application markup Language (XAML) declarative markup preferred by WPF. The instructor was trying to point out that XAML separates a declarative representation of user interface setup (using XML) from the business logic of the application (in C# partial classes). But how often is that likely to last?

Read More

Firefox 3.5 Screws Up Color Management

Tuesday, June 30, 2009

Earlier I noted how Firefox 3 has support for color management and can show your photos like you meant them to be seen on a profiled monitor. I was also excited that Firefox 3.5 would turn on this color management by default. I just upgraded to Firefox 3.5 this morning, and color management is indeed on, but Firefox has screwed up color rendition. Colors now look horrible because of a bug that wasn't fixed in the final release, and unlike in Firefox 3, there is no setting available to make things look right. The best you can do is set gfx.color_management.mode to 0 in about:config to turn off color management altogether.

Read More

Alternatives to Outrageous SSL Certificate Prices

Friday, June 5, 2009

Having a web site that supports secure connections (HTTPS) using SSL requires that your web site has a special security certificate. The obvious way to get an official one of these (ignoring the self-signing option) is to go through a company like Thawte or use Comodo's InstantSSL product. That will set you back about USD$99 per year, per certificate! But there are more reasonable options.

Read More

Hidden Secrets of Color Profiles

Wednesday, June 3, 2009

If you're even half-way serious about taking pictures, editing them, and then showing them on the web or printing them out, you need to know about color management. It seems to be pretty difficult stuff, in part because hardly anybody does it right. Once you think you know what's going on, nothing looks right because the software you're using screws up your best intentions. Here's an overview of what you need to know, and why it may not be you that's doing something wrong.

Read More

Representing Null in CSV

Thursday, April 23, 2009

The comma-separated value (CSV) format is ubiquitous. Even though there exists a multitude of implementation variations, the basic idea remains: each line of the format contains values separated by commas (or tabs in a parallel format, TSV). The first line may be a header "row" describing the values in the "column" beneath it. Any value that contains the delimiter must be surrounded by double quotes, and if the double quote itself appears, it must be escaped by repeating it. These core rules were recently codified in RFC 4180, but neither the specification nor most implementations know how to handle the absence of any value in a field.

Read More

Sending Mail Offline in Thunderbird

Sunday, March 29, 2009

Thunderbird 2 is a really great IMAP client, but today while I was on a three-hour flight, I decided to work offline to clean out my inbox. Many of the emails I transferred to other folders required a reply, so I wrote replies and queued them up for sending once I returned to terra firma. That's when the trouble began.

Read More

Windows Vista Has Error Copying to WebDAV

Wednesday, November 12, 2008

How can huge companies with millions of dollars at their disposal screw up simple protocols like HTTP and WebDAV? I already wrote about how Adobe kept screwing up HTTP file uploads (and once they got most of the problems fixed, decided to break it purposely). I also mentioned how Microsoft's Windows Vista WebDAV support at first looked promising, but had serious limitations in its extra features. Now it appears that Windows Vista can't even perform simple copying to a WebDAV-mounted drive without running into problems.

Read More

Google Gears File Upload Incorporated into Guise™, Replacing Broken Flash 10

Monday, November 10, 2008

Two days ago I explained the ridiculous decision of Adobe to break Flash 10 file uploads. As file uploads are an essential part of the Guise™ Framework and the Marmox™ Network, on which this blog is running, I had to have a replacement, and Java is still way too bulky. Luckily Google Gears has just added file upload capabilities, and I've spent the last couple of days integrating into Guise. Google Gears does the job, and even in beta isn't plagued by all the bugs Flash has had over the past few years.

Read More

Flash 10 Breaks Local File Browsing

Saturday, November 8, 2008

People, people, people! Just when I fix other people's bugs enough that I can start innovating again, people start screwing with their code so that I have to start from base 1 again. Adobe's Flash 10 is a case in point. With the latest release, Flash 10, Adobe purposely breaks functionality that has been around for years, motivated by some amorphous hypothetical "security issue." This breaks the innovating Guise™ upload capabilities, which means I'll have to abandon Flash.

Read More

Windows Vista WebDAV support

Saturday, November 8, 2008

In the middle of upgrading HTTP chunked stream support to Marmot, I switched to Windows Vista. I edited some photos from my US Election 2008 party and uploaded them to WebDAV using Vista. Once finished with the HTTP support improvement, I used MarmotMirror to back up up my data to WebDAV, and realized that Vista WebDAV support is different and cool, but its extensions are sadly ill-thought-out.

Read More

MarmotMirror Utility Demostrates Marmot Cloud Storage API

Sunday, October 26, 2008

In the past few years so-called cloud storage services such as Amazon Simple Storage Service (S3) and Nirvanix promise to turn data storage into a limitless utility expandable on an as-need basis. The use of cloud storage up until now has required lock-in to a particular vendor: if you choose one service, it may not be straightforward to port your data to another service, and your existing software may not work with the new service's API. GlobalMentor has created a unifying cloud storage API named the Marmot™ API that removes the need for your application to write vendor-specific code. Marmot adds extensive metadata capabilities build on GlobalMentor's Uniform Resource Framework (URF) that work across all underlying implementations. GlobalMentor's Marmox™ Network (including this site) is built on Marmot technology; the Marmox site provides more information on how it uses Marmot.

Read More

The Java URI That Isn't

Saturday, October 25, 2008

The fundamental identifier used to communicate on the Internet is the Uniform Resource Locator (URI), specified most recently by RFC 3896. Because Java 6 conveniently includes a URI class (and because Java is ostensibly the Internet programming language), one would think that identifying Internet resources in Java is as simple as using the Java URI class. If you make this assumption, your software will probably break. First and foremost, the information stored by the Java URI class is not even a URI.

Read More

Wise Words for an Election Year

Wednesday, October 22, 2008

Today my mom received an email entitled, "Wise words for an election year". It encouraged the reader, "During this election year let's be reminded of these words" and contained several aphorisms, attributing them to Abraham Lincoln. The email ended with an ominous, "Very, very wise words, written years ago and we still don't get it....." But what at first glance is an innocent list of common-sense guidelines turns out to be cereal-box marketing trying to get my mom to vote Republican in the upcoming presidential election.

Read More

Java's Poor Support for MIME Content Types

Sunday, October 19, 2008

Java is the language in which I program the most, and there's a lot to be said for it. But over the years it has wandered away from its roots as a simple language for Internet applications. Those in charge of Java have bloated the libraries with redundancies, all the while ignoring some of the most funamental concepts needed for a modern Internet programming language. A case in point is Java's poor support of MIME content type, one of the fundamental types used by all platforms to communcate on the Internet.

Read More

BBC Interview with Profressor Mark Gertler

Friday, October 17, 2008

The BBC just had an excellent interview with an economics Professor Mark Gertler that got down to the basics of the "current economic crisis" as everyone is calling it, asking some direct questions and actually coming to some conclusions. It's well worth a listen.

Read More

Inadequate Java Generics

Thursday, September 18, 2008

Generics are so nice to have. It's a shame that Java, in hands-waving reference to backwards-compatibility, made generics so slipshod as to be almost useless for anything more complicated that List<String>. Let me walk you through an example; after just a few levels, the whole thing falls apart. You tell me where I've gone wrong, because I can't make out the solution.

Read More

Angel Island Hike

Sunday, August 31, 2008

Today on a whim I grabbed a half-hour ferry and went to Angel Island. I hiked the five mile or so trail, almost to the top of Mount Livermore. It has a great view of downtown San Francisco, and it's a shame I've been here for years without taking advantage of the great natural scenery so close to the city.

Read More

Devanagari Transliteration Resources

Saturday, August 23, 2008

It's been over 10 years since I started my Devanagari tutorial. Every so often I get a note of thanks, along with encouragement to complete the tutorial to include the entire Devanagari alphabet. I've slowly started gathering the resources to do so, including coming back up to speed in the Hindi script and getting up to date on the latest standards in Devanagari transliteration.

Read More

Dynamically Embedding Flash in Firefox 3

Sunday, August 17, 2008

Why is it that, at each new turn, you hardly add new features before somebody breaks one of your old features? Today I noticed that Guise™ file upload and sound was not working on Firefox 3. Guise has for a long time been adding a small Flash plugin in the background using the <object> element, intelligently using the Flash MIME type of application/x-shockwave-flash for Firefox or its class ID of clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 on IE. This had been working smoothly until Firefox 3 came along.

Read More

Marmox User Comment Support Added

Monday, August 11, 2008

Yesterday I released Marmox 0.3.0 with one big new feature: the ability for users to add comments to resources. Marmox allows you to define whether or not users can add comments to resources by configuring the "annotation" permission. By implementing comment support at the system level, comments are now available across the board; you can see that this blog entry (running on Marmox) provides the ability to add comments below if you are logged in.

Read More

Firefox 3 Caches window.location.reload() on localhost

Sunday, August 10, 2008

This just cost me hours of grief this morning. The standard way to reload a page in JavaScript is to call window.location.reload(). It turns out that there is a boolean parameter to this method that indicates whether a new HTTP GET request should always be issued; if not, the browser may use a cached version of the page. On Guise this shouldn't matter, because Guise always issues a Pragma: no-cache header, which Firefox has always honored before. But it appears that Firefox 3.0.1 ignores the no-cache command and uses the cached version when reloading the page instead of issuing a new HTTP GET. This only seems to happen when the content is being served from localhost.

Read More

The Sorry State of JavaScript XHTML Editors

Sunday, July 27, 2008

From reading online reviews, you're likely to think, "wow, standards-compliant WYSIWYG XHTML editing using JavaScript in a web page has finally come of age—there are so many options to choose from!" Well, I've tried them all (all that might even come close to being usable), and they are pitiful, with all sorts of "gotchas" that don't come out in most reviews. The closest to usable is TinyMCE, and that's what I'm using in the latest version of Marmox™ (which is running this site; TinyMCE is the editor I'm using as I write this), but even TinyMCE is incomplete, erroneous, and not quite robust enough.

Read More

Marmox Released as Open Source

Sunday, June 22, 2008

The Marmox™ Network, an extensible platform that encompasses resource management, social networking, and wiki-like content production, is now available as open source under the Apache License Version 2.0. You can now download the Marmox source code. The documentation at the main Marmox sub-site has been started, and will continue to be expanded as Marmox development continues.

Read More

Guise Framework Goes Open Source

Friday, May 9, 2008

The source code of the Guise™ user interface framework—the same UI framework that the Marmox™ Network uses—was today released as open source. (Marmox also hosts this site and the Guise site itself.) The Guise source code is licensed under the Apache License Version 2.0, and is available for download direct from its Subversion repository. Along with the Guise source code, the core GlobalMentor source code, on which Guise depends and which I have been developing for well over a decade, is also now available as open source under the same license and available for download from the same location.

Read More

Guise Site Now Hosted on Marmox

Friday, May 9, 2008

The reliability and flexibility of Marmox™ to serve as a web hosting platform is continuously being proven. Today I transitioned the entire site of the Guise™ user interface framework to the Marmox Network. Guise is the comprehensive user interface framework that transparently handles UI rendering, including Ajax on the web platform, without the need to write code in platform-specific languages such as HTML and JavaScript. In fact, Guise is the user interface framework used by Marmox—and now the Guise site is being hosted on Marmox.

Read More

Ridiculous SmugMug URLs

Monday, April 21, 2008

I now have virtually all my photos available on my personal site running on Marmox™. I had been on SmugMug for several years and had used it as my primary photo distribution site, so last Friday I disabled search engine indexing on SmugMug so that all my photos would be indexed on this site and the SmugMug-based links would be removed. From time to time over the past few days I've performed a Google search just to see if the new Marmox-based photos are being picked up and the SmugMug photos are being dropped. As I examine how Google indexes the old SmugMug-based site, I realize just how extremely ridiculous the SmugMug URL system is.

Read More

Shortcomings of Java Enums

Saturday, April 19, 2008

When Java was first introduced, it had a huge missing piece: enumerated types. Apparently Sun didn't appreciate the lowered project risk brought about by strongly-typed parameters—or care if the language made it just as easy to pass the direction integer argument SOUTH when the currency integer argument DOLLARS was expected. (I'm almost surprised Java didn't originally require FALSE=0 and TRUE=1 integers intead of an actual boolean type!) Now that Java has finally got around to add enums, there's plenty to like (ordinals, singletonality, use in case statements, to name a few things), but they still have some significant and needless shortcomings.

Read More

Marmox Improves Page Management

Sunday, April 13, 2008

Today, with the release of Marmox™ 0.2.4, Marmox gains significant XHTML page management capabilities. Marmox is nearing the point where it can be used for day-to-day management of XHTML pages and folders, all under revision control. The Marmox history page is part of the official Marmox documentation site, which is managed completely by Marmox itself and backed by Subversion. In addition, Marmox now adds easy management of useful XHTML page folders.

Read More

Subversion Property Namespaces

Tuesday, April 8, 2008

Today someone sent me an email to see if I had tracked down a problem I was having with Subversion changing WebDAV namespaces for custom properties , so I thought I'd write an entry about my experiences and explain a little more about Marmox in the process.

Read More

First Blog Entry

Sunday, April 6, 2008

Today I released Marmox™ 0.2.3, which is a major milestone in Marmox releases because it now supports blogging. Marmox has been powerful enough to host my photos for some time, but only with release 0.2.3 did Marmox become powerful enough to host my own blog. I have just used a Marmox to create a new blog entry and I'm editing my entry in-place with a WYSIWYG XHTML editor.

Read More

Tomcat deployOnStartup Setting

Sunday, June 25, 2006

When I deployed the main site for the Guise™ Internet application framework, I wanted to make the setup easy to upgrade. When a new version of the site was ready, I wanted to be able to simply copy the new .war file over the old one and restart Tomcat. But this Tomcat installation is sitting behind Apache and running several virtual hosts, so I had to create distinct Host sections in /usr/local/tomcat/conf/server.xml. In addition, I had to turn off the unpackWARS setting or I would need to delete the automatically-created directory every time I copied an updated .war file. Here was the first attempt (note that this configuration uses a connector to Apache sitting in front of Tomcat):

Read More

Importing Nodes in IE 6

Thursday, June 15, 2006

With the prevalence of AJAX, the need to make dynamic changes to an XHTML tree within a browser becomes paramount. One of the main tasks behind the scenes is taking XML data from an AJAX response and updating the browser's DOM based upon the new information. If you send back XML in an XMLHTTPRequest, that should be straightforward: just use the DOM importNode() method.

Read More