Archives for: 2006

Dec 19, 2006 : Re-search

Google indexes about 10 billion webpages. Maybe. It's hard to find a number. But it doesn't matter, because whether they index 10 billion or 2 million pages, I can't comprehend that number. I can read the number, but I don't really understand what it means.

But I'm starting to. I've been researching distributed trust networks on and off for a few years. Lately I've been doing more research in the area and finding tons of stuff that I hadn't seen before. Just by following links around and searching with slightly different phrases is revealing more and more stuff. My reading backlog is growing far too quickly :)

The most exciting things I've found are a mailing list for applied computational trust, and the T3 group which has lots of papers and event information available. I've been compiling most of my findings that are relevant to Konfidi (my distributed trust network project) at the Konfidi Research page.

Another way to try to comprehend it: if you looked at one page per second nonstop, it would take you 317 years to view 10 billion pages.

Dec 11, 2006 : Good news

Often media news coverage doesn't give much time to good things happening in the world. In the most recent issue of science, it covers the top 100 stories of the year. One of them was the creation of the Northwestern Hawaiian Islands Marine National Monument by President Bush in June. It spans 140,000 square miles. That's larger than the Great Barrier Reef Marine Park, and bigger than all U.S. national parks combined. It will eventually ban all commercial and recreational fishing within its borders.

Dec 02, 2006 : Google shows interest in social trust networks

The Google Code blog announces the Net Trust project from Indiana University. L. Jean Camp, who wrote the blog post and is leading the work on Net Trust, presented at the Models of Trust for the Web workshop. I was at that workshop, also, presenting the Konfidi trust system.

It's not entirely clear how Google is involved with the Net Trust project, but it is great to see places like Google showing an interest in social trust networks.

After trying the Net Trust demo, and reading Camp's paper on it, it seems like a good start. There's room for improvement in the system architecture, and the UI. It's only a demo, and Camp is a strong advocate of GOOD user interfaces to help users deal with trust appropriately, so I'm sure it will improve. (Konfidi has lots of room for improvement too...) It'll be interesting to see how Google helps their project.

Technorati tags:

Nov 28, 2006 : Tai Chi

Nigh upon a year ago, one of my friends encouraged me to take Tai Chi classes. He was taking one and loved it.

I was looking through the winter Grand Rapids Park & Rec brochure and saw they were offering Tai Chi classes, and at a pretty low cost. So I think I'm going to enroll. There also was a fencing offering (equipment supplied) which was tempting.

Mmm.. chai tea

Nov 25, 2006 : Javascript RDFParser from Tabulator

David Sheets introduces himself and the new RDF/XML parser he added to the Tabulator all-javascript RDF browser. I've been using the RDF parser from Jim Ley in a generic JavaScript RDF Editor (to work with any OWL/schema files; no public release yet, but let me know if you're interested, especially in helping out). So recently I worked on using Tabulator's rdf parser to see if it was better. It seems to be designed a bit better (separate data store from parser from XML loading) and David's post says it is more accurate and often faster.

I had been hoping to find some additional functionality to use in my JsRdfEditor. Namely, modelling the RDF document instead of just getting all the triples. For example, knowing where a nodeID was used, and the XML arrangement of the triples. That way the JsRdfEditor could parse a file, add some triples, and output a new document that is arranged much like the one that was loaded. But no luck there; sounds like I'll have to add that capability to the parser myself, if I want to have elegant RDF/XML output.

So here's how you can use Tabulator's RDF Parser in your own projects:


// depends on:
//  dig.csail.mit.edu/2005/ajar/ajaw/rdf/term.js
//  dig.csail.mit.edu/2005/ajar/ajaw/uri.js
//  dig.csail.mit.edu/2005/ajar/ajaw/rdf/rdfparser.js

// TestStore implementation from dig.csail.mit.edu/2005/ajar/ajaw/test/rdf/rdfparser.test.html
// see also RDFIndexedFormula from dig.csail.mit.edu/2005/ajar/ajaw/rdf/identity.js
//  (extends RDFFormula from dig.csail.mit.edu/2005/ajar/ajaw/rdf/term.js no indexing and smushing)
// for the real implementation used by Tabulator which uses indexing and smushing
var store = new TestStore()
var parser = new RDFParser(store);
parser.reify = parser.forceRDF = true;
// forceRDF isn't used??


var url = 'http://something.or/other';

// get the XML
var xhr = XMLHTTPFactory(); // returns a new XMLHttpRequest, or ActiveX XMLHTTP object
if (xhr.overrideMimeType) {
    xhr.overrideMimeType("text/xml");
}
// the "data/" path and encoding is just how I store files locally
xhr.open("GET", "data/" + encodeURIComponent(encodeURIComponent(url)), false);
xhr.send("");
var nodeTree = xhr.responseXML;
if (nodeTree === null && xhr.responseText !== null) {
    // Only if the server fails to set Content-Type: text/xml AND xmlhttprequest doesn't have the overrideMimeType method
    console.debug("no responseXML, parsing responseText");
    nodeTree = (new DOMParser()).parseFromString(xhr.responseText, 'text/xml');
}
// must be an XML document node tree
parser.parse(nodeTree,url);

// use FireBug extension to inspect console.debug'd objects
// Using TestStore you can access store.triples
console.debug('store',store);
Technorati tags:

Nov 02, 2006 : Great Lakes Software Excellence Conference; and not doing TDD


Last week I got to go to the Great Lakes Software Excellence Conference. It was a very good one-day conference (plus workshops the day before), especially since it was local. There was a developers track, a process track, and a testing track. All had good presentations; lots of them focused on agile methods and many emphasized the value in good people and good relationships. Thanks to the organizers: XP West Michigan and the American Society for Quality! It was fun to see fellow Calvin CS alumni at the conference :)

I'd like to use more agile methods and test-driven development at work, but our department is very very small so we each already wear many hats and we don't overlap much. That makes pair programming difficult. The presentation on pairing suggested that you could pair on other tasks too, like writing the requirements doc, or testing, which I think we could do effectively. For test driven development, this may be heresy, but I don't think it's worth doing for many of our projects. The processes & data for which we write software are not critical to our organization. Sure they're useful, but their not critical. (We used purchased software to do all our core business functionality). All the software that we develop are very useful but are not critical. In fact they are so far from critical that virtually all bugs in "production" are actually acceptable. The cost to do TDD does not offset the cost of not doing it.

Technorati tags:

Oct 19, 2006 : Wikipedia!

I can't be held responsible for any time wasting that may ensue.

Lunch talk today covered various topics stemming from Wikipedia articles. Here's some good ones:

  1. 1,000,000,000; the largest number in wikipedia
  2. List of wikipedia's numbers
  3. Transnistria a region of Moldova that has claimed independence from Moldova. It's independence is not recognized by the UN, but it is by Moldova. See also Unrecognized states with de facto control over their territory
  4. Lesser known Generic TLDs such as .cat (for Catalan language & culture sites) and .int (for international organizations)
Technorati tags:

Oct 08, 2006 : 3 years

Cherith & I have been dating for three years now. We've come a long way :)

Oct 06, 2006 : URI structure

Non-nerdy abstract: some folks like to do all sorts of crazy things with what you simply know as a URL or website address. We abstract them to be names with no content, or internationalize them, etc, etc and call them URIs, IRIs, XRIs, etc. This is about the semantic structure of a URI.

A while ago there was some discussion started by Norm Walsh on the use of URIs using schemes other than http: . One direction the discussion took was that specifications for other schemes provided a human-readable description of how the URI was to be constructed. For example, the URN:ISBN specification has a "Declaration of syntactic structure" explaining the four parts it contains. Using the http: scheme for all our URIs means (at best) we'd have non-normative descriptions of the URI structure.

Today, however, I came across Marc Hadley's URI Templating post, which includes a link to a draft specification for URI Templates. This would mean machine-readable URI structure declarations (better than human-readable spec documents, on many levels). I think it's a great start.

The trouble still lies in how to discover a URI Template, given a URI. For URIs used in web apps, a WADL document you already have could reference the template. And I bet WSDL 2.0 can do something with URI syntax, since it supports descriptions of REST APIs. But URIs can be used in so many other contexts (even offline) where discovery would be probably impossible. URI Templates may be provided by a 3rd party, so even having the template located at some special URL (e.g. robots.txt) or referenced in a URL document (e.g. favicon) would not necessarily be ideal.

Technorati tags:

Sep 15, 2006 : more?

Pam thinks I should blog more. What do you think?

Sep 10, 2006 : Password storage utilities mini-review

I read some KeePass coverage lately, and it does have ports to many operating systems, but a few weeks ago I started using PasswordSafe at work. So at home now I started looking into the PasswordSafe options for Linux.

MyPasswordSafe is a Qt app that only supports PasswordSafe v2 files, has very few fields for each "login" you save. It looks like there was a recent release, but the docs haven't been update for years.

Password Gorilla is a tcl/tk app that supports the latest features of PasswordSafe v3 files. It's a bit of work to set up (requires tclkit) but not too bad, and it runs on many operating systems. Doesn't have nice taskbar icon integration, though. This is what I started using on my Linux desktop.

pwsafe is a commandline utility that I haven't tried yet. Website shows that it hasn't been updated for about a year and only supports v2 files, unfortunately. This would be nice for ssh access to my linux passwordsafe file, if updated for v3.

Technorati tags:

Sep 07, 2006 : Open Development

Non-nerdy: version control systems are the tools that software developers use to share and track the source code used to build the software; open source licenses permit people to use others' source code in various ways; open development is a community concept about how the software project is managed

John Reynolds writes about Open software pragmatism - Free (as in beer) isn't the point which is along the lines of "Open Development" that has been talked about before. He should've shouted "free (as in speech) isn't the point, either" but whatever.

The practicality is that you can't force open development communities, even a community can't always force itself to do so when it wants to. So what can be done to help? For the matter of maintaining and merging your own set of patches and enhancements all the time, distributed version control seems like a good solution. PlanetApache readers know that Sam Ruby and Elias Torrez have been hacking on PlanetPlanet aka Venus, using bzr. But most projects use SVN or CVS which are centralized version control systems. Has anyone tried svk to maintain a personal SVN repo in sync with the central repo? I really should try that myself. Why don't major projects, like the Apache ones, use a distributed version control system? The only major project I know of using distributed version control is the Linux kernel, which uses git.

Technorati tags:

Aug 24, 2006 : XMP in Windows Vista!

Non-nerdy overview: some programs will let you store photos' descriptions, tags, ratings, etc in the file itself. That way no matter where that photo gets sent, the additional information can be displayed

At BarCampGrandRapids I presented briefly on Organizing Digital Photos, explaining how XMP will let you embed all sorts of RDF metadata into JPEGs and many other file formats. Now it's been announced that Windows Vista will use XMP! Adobe's support of XMP is obviously pretty good. Now where are all the open source tools? I see lacking in particular: a Java XMP library, a XMP plugin for gallery2, and a general-purpose XMP-based photo library manager. Any pointers?

via Danny Ayers on planetrdf

Technorati tags:

Aug 21, 2006 : BarCampGrandRapids


BarCampGrandRapids was a great success! (follow the link to find out what it's all about). We had about 17 people show up friday night and about 14 on saturday. Not everyone spoke, but that was fine. We had plenty of sessions to fill the whole time, especially since we only split into two rooms for one session.

Starting Friday dinner worked quite well, I think. It gave an opportunity for the curious to show up, catch the intro and several sessions, and easily leave if it wasn't their thing. Only 5 of us stayed overnight, but it was good for those of us who did. Extra socializing, convenience, etc. Except that Campus Safety wasn't too clear on keeping the doors unlocked for us. Oh well.

The sessions given were all pretty good. I was particularly interested in Andrew's talk about Geo. I like that stuff, plus you can make lots of cool mashups. He had at least 4 :) I spoke briefly on Organizing Digital Photos, RSI, and Konfidi. I don't know how well I presented them, since they all were somewhat rushed because we were behind schedule. And I have a hard time getting an outside perspective on my own communicative flow. Jeff DeMaagd video recorded most (all?) sessions, so we'll probably make those available when we can.

Thanks to GFS for lots of food, Calvin for the facility, and Envoi Solutions for a fun friday night out.

See photos, bookmarks, and other blog entries that came out of BarCampGrandRapids.

Perhaps we'll see you all next year, to learn more, meet more new people, and get together with more friends!

Technorati tags:

Aug 04, 2006 : Portlet 2.0 - Early Draft Review

The Portlet 2.0 JSR has released an Early Draft Review. Here are my thoughts. Read the document yourself for all the details, and remember this is only an Early Draft.

Resource Serving There's a new interface that a Portlet can implement, which allows it to serve resources. Now you don't have to also set up a servlet to serve resources. But you can delegate to a servlet if you want. Looks like this means in addition to action URLs and render URLs there are now resource URLs.
Portlet Filter Great news! A standard implementation of this is needed for things like a Hibernate "Open Session in View" pattern, or handling File Uploads in JSF. Instead of different implementations in many projects, a standard filter will be very good.
Events Portlets can publish and consume events for interportlet communication and portal communication. There's an interface that your portlet would implement; and GenericPortlet's implementation of this interface has a nice helper method so that you can write one method per event name and simply annotate that method to indicate which event it is supposed to handle. I would like to see the specification list a few standard events (e.g. "javax.portlet.portal.logout"), perhaps in an appendix.
Sharing Sharing session attributes and sharing render parameters are new features, although session attributes may be dropped since events can be used for the same purpose. I haven't found a need for any sharing yet. Nothing that can't be done with typical sharing via real messaging systems or shared data (database).
Portlet Window IDs It sounds like these will let there be better support for a portlet knowning which window(s) it is in.
AJAX Better support for AJAXy stuff will be in the next draft, they say.

Besides a list of some standard events, and the AJAX support, I'd like to see better interaction with the portal, for example:

  • Insert JS/CSS references into the head
  • Link to another portlet, or a certain page in the portal. This may be difficult to spec generically for all portals, but it would be very useful.

Jul 05, 2006 : new measures to filter my blog spam

I added a simple text-based CAPTCHA / turing test for this my blog. I also disabled trackbacks since there's no effective way to filter those.

I had been keeping up to date with a centralized blacklist and adding my own keywords as needed. It worked well enough until I started getting spam of entirely unique entirely random characters. For example www.dsfjelsdf.com Absolutely no way to block them en masse. Extremely annoying.

The CAPTCHA is working well, and the beauty of it (over an image-based on) is that as soon as a spammer modifies their bot for my current question/answer, I simply change it. No way for them to beat that long term :-)

Non-nerdy version: You now have to answer silly easy questions like "Type 'alberta'." when you post a comment. Don't listen to the movies... there is no computer AI that can answer challenges like that

Jun 15, 2006 : Microsoft has reached it's limits

So Microsoft Chairman Bill Gates is stepping down over two years, to spend more time at the Bill & Melinda Gates Foundation, working on global health, etc. Why, you might ask? Because Microsoft has reached the limits of humanity. Gates needs to focus on keeping more people alive longer, so he can sell them his software.

: KLOCs

That's thousands of lines of code.

An MSDN blog claims the current US developer averages 6200 LOCs/year. I counted what I wrote in the past 9 months, here at Cornerstone Univ, with the help of a student worker: 29,197 lines of Java code. Granted, a lot of that is boilerplate getters/setters, etc. But it also doesn't even count .xml configurations or .xhtml JSF/Facelet view definitions (think templates).

Non-nerdy: A LOC (line of code) metric is a bad way to measure software developer productivity, because anyone can produce more bad lines of code if they want. And decreasing lines of code sometimes makes the software better! But people use LOCs anyway because there's not much else (easily countable) to go by.

: xargs delimiters

If you have spaces in your input to xargs, you might want to split on spaces. For example (javafiles.txt is a list of files, some of which have spaces in their paths):
cat javafiles.txt | xargs -d \\n wc
Don't forget to double-escape the newline!

Non-nerdy: ignore this post!

Jun 12, 2006 : It's a small world

One of the spam comments on this blog had this as the url: http://csx.calvin.edu/dw/lib/exe/fetch.php?media=http://------.com/-.html The URL 404s, I have no idea how they got it. The media parameter is a real spam site. The funny thing is that csx.calvin.edu is the student organization I led for two years at Calvin.

For the non-nerdy: spammers automatically add spam comments to weblogs, to increase the number of links to their site. This gives them higher search result rankings. I regularly filter and delete these. Above, I ---ed out the real spam website they were targetting. "404" is the error code for "page not found". The reason the spam site is in the same website address as csx.calvin.edu is because spammers often exploit bugs in websites to sort of "hide" their site by using somebody else's site. In this case, csx.calvin.edu had no such bugs and so I don't know what the spammer was thinking.

Jun 10, 2006 : pictures!

All my 2005-2006 pictures are now posted, including Scotland and Spain.

Jun 07, 2006 : Konfidi 1.0.0 releases

Non-nerdy overview: this is an announcement about the Konfidi project that I'm working on. It uses social networks of trust to help you filter email. And I'm using this post as one way to get the word out about the new releases (which hopefully will attract other developers). It's not usable by the general public yet.

The first major releases of the Konfidi software are now available. Version 1.0.0 of the following packages are now available at http://www.konfidi.org/

  • FOAFserver
  • Trustserver
  • Trustserver Frontend
  • Client: cli-filter
  • Client: simple

Konfidi is a system that uses PGP signatures to determine authenticity, and distributed topical trust values to compute an inferred trust value of the author. The first (and motivating) application is to filter email. You'll be able to set your client to accept all email from senders with a high computed trust value and rigorously filter anything else.

If you know what a .procmailrc file is, you can start using Konfidi now with the cli-filter.

The project could make use of skills in: Java, Python, C/C++, from data synchronization to UI design, psychology/sociology research, and more. Join our mailing list if you are interested.

: explanations for non-nerds

So the youth leader at my home church back in Midland told me this weekend that I should have a blog about my blog, explaining the technical stuff to non-nerds. I've been trying to post more non-nerdy stuff to my blog, but explaining the technical stuff would be a good idea too. So I'm going to try to do that from now on, using a preface paragraph to the technical posts.

Jun 01, 2006 : Target gift registries suck

A friend is getting married soon and is registered at Target. I went to Target tonight and 2 of the 3 registry printing machines were out of service, and the one that did work only did so when it felt like it. Seems like you had to wait a few minutes between each use. And Customer Service can't print any on their own computers. Then when I find a product and go to buy it, it isn't recognized as being on the list. I say "whatever" and buy it anyway, because it is on the list. I just compared model numbers online and it turns out the only difference is I bought a black item and they registered for gray. It's cookware, it doesn't matter! Grr...

So the moral of the story: register at Bed Bath and Beyond, even though that's what everyone does. At least they can print registries for you, do free gift wrapping, and ask a million times if you need any help.

: Java "copy constructor"

Well, of course you can just Foo myFoo = (Foo) theirFoo.clone(); to copy an object.

But I want to create an ExtendedFoo out of a Foo. I can't cast the foo (or cloned foo) into an ExtendedFoo because it's not one. I need to create a new ExtendedFoo and copy all of the important stuff from the "foo" object into the "extendedFoo" object. Here's how I did it:

import org.apache.commons.beanutils.BeanUtils;

public class ExtendedFoo extends Foo {

	public ExtendedFoo(Foo source) throws IllegalAccessException, InvocationTargetException {
		BeanUtils.copyProperties(this, source);
	}
	...
}

Isn't that easy?

May 25, 2006 : Tomcat JULI logging properties

Tomcat 5.5 provides the "JULI" implementation of the Java Logging API and extends it with things like per-classloader configuration. http://tomcat.apache.org/tomcat-5.5-doc/logging.html is decent documentation, but nowhere do they list all the properties for configuration.

I had to look into the source of org/apache/juli/FileHandler.java which was pretty hard to find too.

Anyway, here are all the properties:

  • org.apache.juli.FileHandler.directory
  • org.apache.juli.FileHandler.prefix
  • org.apache.juli.FileHandler.suffix
  • org.apache.juli.FileHandler.level
  • org.apache.juli.FileHandler.filter
  • org.apache.juli.FileHandler.formatter

There is no pattern to control the formatting of the filename, so you're stuck with one that always has the date, I guess.

May 15, 2006 : Wikitravel.org

I've been using Wikitravel to plan my upcoming trip to Edinburgh (to present at the MTW'06 workshop, part of the WWW2006 conference).

Wikitravel is in the spirit of wikipedia, wikinews, wiktionary, etc (but is not actually part of the wikimedia foundation). I've found it to be a very valuable resource, letting you gather lots of critical information quickly.

May 03, 2006 : Idea: feed feeds?

It would be nice to have feeds of feeds. Two good examples: a comment feed branching off of each item in a blog feed. Or a feed of your assigned issues/bugs with a feed of status changes branching off of each issue. (let's not start thinking about "threaded" feeds)

I'm not too familiar with OPML, but you could probably have a dynamic OPML of all the comment feeds of a blog. But you'd need a feedreader that would watch for changes to the OPML file. I'm not too familiar with OPML, but I don't think there's any way for it to changes over time well, like an rss/atom feed. Moreover, with OPML you wouldn't have a direct relationship between an item in the parent feed and the item's own child feed.

Is this possible at all, or would it require the next generation of specs & clients?

Apr 27, 2006 : Surprise! the .int top-level domain

I never heard about .int domains. But I stumbled across itu.int today.

Another non-country-code TLD besides the popular (.com, .org, etc) and silly sponsered ones (.aero, .museum, etc) is .cat (for Catalan language/culture).

Apr 26, 2006 : Portal comparison: Liferay v. uPortal

For Cornerstone University's portal we decided to switch from our planned uPortal 2.5.1 implementation to use Liferay 3.6.1 instead. Several people have wondered why. Here's a few comparisons:

Feature Liferay uPortal
Customization AJAX drag & drop much more difficult, but slightly more options
User/group data integration Must use its own SQL tables (we wrote scripts to insert into those) Can map to remote SQL, LDAP, etc
Community big, but often unanswered questions in forum Smaller, seems more helpful, focused on higher-ed
Bundled portlets/channels A lot (78). We use several (RSS, menu navigation, portlet aggregrator, Wiki display, weather) Few, none of which provided much value to us
Themeing easy hard (~3 layers of abstraction)
Pretty URLs yes no
Layouts each group you are a part of has a layout (page) hierarchy; this works very well for us. We did have to write a Java utility to insert similar layouts into similar groups Don't think there is a way for heirachy of pages; each user's layout can appear different based on what groups they are in
Portlet hotdeploy yes no (?)
CAS for authentication yes yes
Installation into app server Messy; requires putting lots of jars into common Clean; the portal is just one webapp

A very good comparison of these and more portals: http://epubs.cclrc.ac.uk/bitstream/785/406.pdf

Apr 25, 2006 : Setting a portlet title in a JSF webapp

Here's how you can set a portlet title in a JSF webapp. This uses the "title" preference to define what the portlet title is, but you could easily code it to get the title in other ways.

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC
  "-Sun Microsystems, Inc.DTD JavaServer Faces Config 1.1//EN"
  "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>
	...
	<lifecycle>
		<phase-listener>edu.cornerstone.jsf.util.PortletTitlePhaseListener</phase-listener>
	</lifecycle>
	...
package edu.cornerstone.jsf.util;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.portlet.PortletRequest;
import javax.portlet.RenderResponse;

public class PortletTitlePhaseListener implements PhaseListener {

	public void afterPhase(PhaseEvent event) {

	}

	public void beforePhase(PhaseEvent event) {
		RenderResponse response = (RenderResponse) event.getFacesContext()
				.getExternalContext().getResponse();
		PortletRequest request = (PortletRequest) event.getFacesContext()
				.getExternalContext().getRequest();
		String title = request.getPreferences().getValue("title", null);
		if (title != null) {
			response.setTitle(title);
		}
	}

	public PhaseId getPhaseId() {
		return PhaseId.RENDER_RESPONSE;
	}

}

Apr 23, 2006 : Fruits, vegetables not as nutritious as 50 years ago

Apr 21, 2006 : Comma-Separated Value files

me: any experience w/ Java CSV libraries?
kyle: csv, eh?
kyle: Not really
me: ok
me: I'll just pick one and run with it then :-)
kyle: The only csv file I've ever had to worry about really didn't have any c's in it
kyle: Since it was just one column
me: lol
kyle: Then I justed used FileUtils.readLines()
kyle: Which was beautiful

: Idea

The RSS/atom feed analysis power of feedburner.com in open source software like awstats that already analzyes general website usage.

Apr 19, 2006 : No, I'm not engaged!

At Easter, I got asked several times if Cherith & I were engaged yet; and Cherith was asked once at her church. And another friend asked recently, too. So for the record, no.

But we're still dating, and Cherith is an absolutely wonderful girl that I love being with.

Apr 17, 2006 : Enterprisey

Steve Loughran says:

On the topic of the word "Enterprisey", I note you can use it products like "Java Enterprisey Edition" and "Enterprisey Java Beans". When you do this, you can use the abbreviations "Java EE" and "EJB" without people knowing you are making fun of the whole idea.

: photo scriptlet

Prints the camera model for each file:

find . -name '*.jpg' | while read file; do jhead "$file" | awk -F\: '/^Camera model : / {printf substr($2,2)}'; echo -ne "\t\t"; echo $file; done

Recommended usage, to filter out your primary camera (and thus see what other people's photos you have):

find ... done | grep -v "Your Camera Model"

Still need to have it skip files with no camera model set.

I'm working towards the goal of setting the "Owner Name" field (or some other appropriate EXIF or IPTC field) based on the Camera Model and a mapping file.

Apr 15, 2006 : php bugtracking systems

So there are a lot of bugtracking systems out there, although it took me a while to start finding them. Wikipidia and del.icio.us are good places to start.

So I want to throw up a real bugtracking system for konfidi. JIRA, of course, would be excellent, but it's not yet worth it to request a license and figure out where we would host it. I want a php bugtracker that I can throw up on the berlios.de site (a SourceForge clone).

Here's my quick evaluation of the top 5 contenders features that I would like to have. ?=questionable, -=not a feature, no entry=couldn't find evidence for or against

B: http://bugs-bug-genie.sourceforge.net/
E: http://eventum.mysql.org/
F: http://flyspray.rocks.cc/
P: http://phpbt.sourceforge.net/
Immature; not even self-hosting; demo is empty
M: http://www.mantisbt.org/
Somewhat unintuitive UI

emails to dev list : ?B F
schedule issues for milestones : B F ?M
account creation /w email verification : B -E F P M
attachments : B F P M
guest access : ?B F M

SVN integration: -B (patch)E -F -P M
personal bug subscriptions : B F M
reports : B F P M
build changelog file: M

Now I probably should set up BUGS, flyspray, and/or Mantis to do a real evaluation.

Anyone have recommendations?

Apr 11, 2006 : Break/strech reminder software

Workrave is the only free break/stretch reminder software that runs on Windows and Linux. It works real well, with configurable timers for mini-breaks, breaks, and maximum daily usage. You can even set it to forcibly lock you out of your own computer for the break period if you want.

I've used it at work quite a while and highly recommend it. I'm starting it use it at home now, too.

Stretching and moving around often during my computer work has helped my reduce wrist/forearm pain and overall stiffness.

Apr 10, 2006 : Eagle's Nest, the Cornerstone University portal

Ever since I started at Cornerstone University, I've been working on recreating the university's portal. It was in Lotus Notes and now it's a regular web portal, backed by the almost-latest versions of Tomcat, Liferay, CAS, portlets, JSF, Spring, Hibernate, etc. And a bit of iframes, portletbridge (proxied content), and php just to keep things interesting.

You can't see much as a guest, but here's Eagle's Nest anyway.

It feels good to have it up and running (relatively smoothly), but I still have my work cut out for me so we can get off Lotus altogether within the next months.

: nice out

It's getting really nice out. My thermometer says 90° in the sun. I'm sure it's broken, but it is really nice. Maybe I'll get my bike out. And ride it.

: Linux on the airlines

So I went to Spain, and on the flights to & fro they had in head-rest (ahead of you) screens to listen to music, watch movies on demand, play games, etc. Turns out they sometimes freeze. And then crash. And then you see a linux boot screen. It went by real fast, but I recognized it easily. The only line of text that I recall was:

No ext2 filesystem found on /dev/loop

Apr 06, 2006 : Lazy blogging

Blogging is easy when somebody else writes the stories for you (from a coworker).

Now if only somebody would post their pictures of Campus Services taking down the 'big red button' ...

Mar 24, 2006 : Spain!

Today I leave for Spain for a week. Our family is visiting my sister who is studying in Denia, Spain for a semester.

Mar 21, 2006 : Konfidi paper accepted at a WWW2006 workshop: MTW'06

Earlier this week I found out that the paper Andy & I wrote for our senior project, Konfidi, at Calvin College got accepted at the Models of Trust for the Web workshop. That workshop is on May 22, and is part of the WWW2006 conference in Edinburgh, Scotland.

This is pretty exciting! I will be attending to present the paper, but Andy will not be able to, unfortunately. I'm a little nervous about it all, too, of course.

My friend Andrey has a friend in London, so we're working on coordinating flying out there together. I'll probably then take a train from London to Edinburgh which could be pretty nice.

Mar 07, 2006 : Wikis: tagging releases and building distributable docs

I want to create project documentation on a wiki, and be able to build well-versioned, distributable releases. I've yet to find a wiki that can do this.

First, you have to be able to generate stand-alone documents (preferably HTML or PDF) that are still navigable and usable (i.e. not just a big dump of the wiki). Some wikis do this.

Second, you have need to store the documents in a versioned repository. One like subversion, that will support tags. You should be able to tag the whole wiki as "release-0.3" and then be able to browse the whole wiki as it was at that release and be able to rebuild that release's PDF/HTML docs. Subwiki seems to be dead; Kwiki has a SVK (distributed SVN) plugin, but I haven't tested it yet and I doubt you can browse "at" a tagged release.

Feb 25, 2006 : del.icio.us

finally created a del.icio.us account

http://del.icio.us/brondsem

: Gmail chat thoughts

I haven't heard much buzz about gmail's web interface to chat. Only a few people complaining about a extra icons on the sidebar.

First, IM on the web means no software to install. Very nice. But in the big picture, I see this as only one small step towards making all networked applications be web-based. The internet is pervasive and browsers are everywhere, but software apps are not. For maximum accessibility, nearly everything will go to the web. SMTP and POP3/IMAP have been accessible by webmail for a long time; IM is moving there (applets have been around, but plugins don't count); FTP is fading in favor of web CMSs; telnet for hardware device configuration has been replaced with web interfaces; SSH will become AJAX consoles on secured sites; networked PIMs will be web based; CVS has been pushed aside by Subversion; SMB/CIFS (windows file shares) will move to HTTP DAV filestores; . The only networked apps that will not move to HTTPS are specialized client/server configurations like rsync, gaming and probably VNC.

And Gmail is removing the diffences between IM and Email:

  1. Email address are used for screennames
  2. Same website for both
  3. History is saved for both
  4. When replying in either, previous messages are available directly above your composition
  5. One-click to reply to an email; zero for chat
  6. By default, email replies show an input field only for new body content. No subject, recipients, or previous body content
  7. You can email a reply to a chat log

Feb 20, 2006 : "planet" sites are bad

First, they're not all bad. I love using planetapache.org as a way to read a wide variety of (growing) blogs on interesting topics. And I get to use it to widen my blog exposure too.

But planet sites are closed. There's no way to join the community or post a single message to the group. The best you get is a contact link to the maintainer, sometimes nothing at all.

For planetapache.org and like-planets, that's probably okay. It's one face of an existing community. After you join the community through published methods, you can communicate on the planet site's forum. However, many planets to a large degree are communities unto themselves, like http://planetrdf.com/. They have their own unique nature and in that blogosphere only a select few may participate.

Feb 18, 2006 : RE & FW icons

In MUAs in locales that read right-to-left, do the icons (and overlays on each message's icon) that represent replies and forwards face the other way?
Forward Reply

Googling for localization of icons indicates this isn't a popular concept in general.

Feb 07, 2006 : Timezones in Tomcat

Update Feb 8, 2005: Java system property user.timezone works. Java 1.5 before update 7 has a bug so default timezone is per-thread instead of per VM, which complicated things. And worse, I was using another webapp that set user.timezone to GMT all the time.


As far as I can tell, there is no guaranteed way to change the timezone of Java at runtime (except by code that executes TimeZone.setDefault()). Property -Duser.timezone=?? and env var TZ=?? may or may not work. And for me, at least, a standard Tomcat 5.5 installation in Windows has a default timezone of GMT, despite any OS settings.

So I wrote a servlet to help. Changes seem to persist through Tomcat restarts. Make sure you put some security on it.

TimeZoneServlet.java

package com.splike.timezoneservlet;

import java.io.IOException;
import java.util.Date;
import java.util.TimeZone;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TimeZoneServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletOutputStream out = response.getOutputStream();
		
		response.setContentType("text/html");
		
		out.println("<a href=\"?\">refresh view w/o changing settings</a><br/>");
		out.println();
		
		String tzParam = request.getParameter("tz");
		if (tzParam != null) {
			if (tzParam.equals("")) {
				TimeZone.setDefault(null);
				out.println("Action taken: Reset default TZ");
			} else {
				TimeZone.setDefault(TimeZone.getTimeZone(tzParam));
				out.println("Action taken: Set default TZ to " + tzParam);
			}
		}
		
		out.println("<pre>");
		out.println("Current Date: " + new Date());
		out.println("Default TZ: " + TimeZone.getDefault().getID() + " (" + TimeZone.getDefault().getDisplayName() + ")");
		out.println();
		out.println();
		out.println("Set the default TZ:");
		out.println("<a href=\"?tz=\">reset</a>");
		int last_offset = -1;
		for (String tzId : TimeZone.getAvailableIDs()) {
			TimeZone tz = TimeZone.getTimeZone(tzId);
			if (last_offset != tz.getRawOffset()) {
				out.println();
				out.println("<b>Offset " + (float)tz.getRawOffset()/(1000*60*60) + ":</b>");
			}
			out.println("<a href=\"?tz=" + tzId + "\">" + tzId + "</a> (" + tz.getDisplayName() + ")");
			last_offset = tz.getRawOffset();
		}
		out.println("</pre>");
	}

}

web.xml


<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
	version="2.4">
	<display-name>Time Zone Servlet</display-name>
	<description>Time Zone Servlet</description>


	<servlet>
		<servlet-name>TimeZoneServlet</servlet-name>
		<servlet-class>com.splike.TimeZoneServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>TimeZoneServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>

Copyright 2006 Dave Brondsema, Cornerstone University

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Feb 03, 2006 : a good idea : use Java/.NET code to define your ORM query

Native Queries would have you implement a match(Object o) method in Java that is then used to create a SQL select statement. Byte-code analysis of your method is used to convert the method's logic into a query usable your favorite ORM library. What's great about this is that you don't have to learn a new query language, and that it's all checked at compile-time and you can even do IDE refactoring.

As an example, HQL (the hibernate query language) is parsed, etc at runtime so syntax or variables are not checked until runtime. Hibernate has "criteria queries" that avoid the issue of syntax by having classes/methods that represent all the different possible operators. But you still have to pass in properties as strings (e.g. Expression.like("firstName", nameQuery)).

Implementing native queries could be difficult, but even a simple implementation that permits only very basic operations could cover a vast majority of cases. For example, permit basic operators and the use of methods and variables in the model class, but don't permit execution of any other code. If your query logic was complex you wouldn't want to use this approach anyway but would directly use the ORM query language or SQL.

It looks like the POJQ library has an implementation for JDO and could be extended for other ORM libraries. There is also a db4o project which has a much broader scope and seems somewhat "closed" although under an open license. The API requires a login to find, so if you're curious you can find it here.

Via Dr. Dobb's Journal. Covered on TSS a while ago too.

Jan 30, 2006 : currently...

Listening to: Broadcast : Tender Buttons

Reading: A Short History of the World by John M. Roberts

Watching: How I Met Your Mother

Revising: A paper on Konfidi for submission to a conference and a workshop.

Typing: symbols

Jan 26, 2006 : code reuse, meta-indexes

Ugo Cei's recent posts about using Java from Ruby have made me start thinking about such code re-use. Code re-use is obviously a good thing. Very often there are tools out there that do what you need. If it works with the language you are using, and you can find said tool, things are great.

Part 1: the tool must work with your language Cross-over utilities (aka language bindings) will help bring compatibility from one tool into another language. The most common form of this is wrappers around a C library to make it available in PHP, Python, Java, whatever. I don't know how good these tools are and how much they are used. It'd be good to look into. Another option is languages that run on the same interpreter or virtual machine. Think of .NET and the Common Language Runtime. Parrot is the VM that Perl 6 will run on. There is already work to get Python, Lua, Perl 5, and others to run on it. The Java VM could be used to run other languages, but I don't know that it is. I am surprised there is not more momentum on Parrot and other common-language VMs.

Part 2: you must be able to find the tool How do you find new tools? Googling doesn't cut it; there are too many different terms you could use and too many results to search through. Freshmeat used to be my nearly-definitive source of finding tools. But there are so many tool packages that are not in Freshmeat, but are indexed elsewhere. I think of the Apache Software Foundation and the very-much-in-development projects.apache.org. We need a meta-index of software tools. Basically of the top of my head I can list off a dozen. And when I google for them all together, I get nothing. There is no meta-index of software tools. For starters, I'll list some here now:

And I bet there are a lot more language-specific ones that I don't know of. And then what do you do with smaller sites like the following?

Jan 25, 2006 : A factory bean within Spring

Spring is great at providing instances of a class to an object that depends on using one. You can also use one bean to provide multiple instances of the class to other beans:


    <bean id="list" class="java.util.ArrayList" singleton="false"/>
    <bean id="foo" class="my.FooImpl" />
        <property name="people" ref="list" />
        <property name="computers" ref="list" />
    </bean>
    <bean id="bar" class="my.BarImpl" />
        <property name="baz" ref="list" />
    </bean>

You can also have a "factory" so that a class Baz can create many Yaps (e.g. to populate a List<Yap>).


    <bean id="yap" class="my.YapImpl" singleton="false"/>
    <bean id="bar" class="my.BazImpl" />
        <lookup-method name="createNewYap" bean="yap" />
    </bean>

with Java code:


    public interface Yap { ... }
    public class YapImpl implements Yap { ... }
    public interface Baz { ... }
    public class BazImpl implements Baz {
        public getSomeYaps() {
            // I don't think Spring can provide a parameterized type implementation (e.g. the ArrayList<Yap>)
            List<Yap> yaps = new ArrayList<Yap>();
            for (int i = 0; i < 5; i++) {
                Yap yap = createNewYap();
                yap.setSomething(i*2);
                yaps.add(yap);
            }
            return yaps;
        }
        // overridden by Spring
        protected Yap createNewYap()
            return null;
        }
    }

Jan 09, 2006 : Web 2.0 2.0

Next Page >>

Next Page >>

<<  2006  >>
Jan Feb Mar Apr
May Jun Jul Aug
Sep Oct Nov Dec

Categories


Archives

Misc

Syndicate this blog XML

powered by
b2evolution