Saturday, March 15, 2008

software to generate genealogy web pages

Our family organization is looking at ways to put our genealogy records and histories online for public view, so I'm looking at our options. Our genealogy records are stored in GEDCOM, so we need to be able to upload that; we want everyone to be able to browse the data without signing up or other complications; we have our own website, so we can generate the content from software and publish it ourselves if necessary; we don't mind spending some money if it'll give us good features for sharing.

Here are my comparisons. I looked at these main features; I'll only mention below if they do NOT have these features.

- access: Does it allow public access without signups or paying?
- reports: Does it have multiple kinds of output?
- map: Does it show a map? (This isn't critical, but it's an indicator of advanced reports.)
- search: Does it allow people to search online?
- history: Does it allow for publishing stories and pictures?

All of these import the Gedcom format, which is critical for us.

Desktop Software

There are many desktop applications that generate reports, so we could use them to take our info and output our web site. They do much the same thing, and they do well in all areas except: they don't have online maps (except GedHTree), and they don't set up great web searches, though they generate many links for things like surname searches to find the person you want.

Personal Ancestral File (look for download link) is the original program, it'll always be around (and free) and we currently use it to maintain our genealogy, but we're not impressed by the pages it generates.

These 3 seem to be at the top because they're comprehensive... so they do more than we need, but they'll import GedCom and generate what we want:

Here's a page that reviews these first three (and a few others).

Master Genealogist - $34-70
... and for the online work add Second Site - $30
I didn't find a comprehensive list of features, but supposedly this is the best; there are companion products offered for things like maps and mobile devices.

Roots Magic - $30
Feature list

Legacy - $35-60
Feature list, and their own comparison with other programs

These 3 were also recommended simply for generating web content:

GedHTree - $20
This one does do maps (and "map sequences" which look interesting). We downloaded and used this successfully; the pedigree charts are nice. It only handles up to about 30,000 names.

GedPage - $10
"Uses Family Group Sheet format." The pedigree chart is simplistic and text-based. You can try it for free (and it processed 120,000-person GEDCOM), but it doesn't generate the pedigree charts.

GED2WEB - $21
Has pedigree charts. Free download trial.

Ged-Gen - $15
Does not create pedigree (or map); reportedly doesn't include photos so those must be done separately. Allows lots of look and feel customization. Free download trial.

No pedigree charts.

Internet Services

Tribal pages - $0

This does well in all areas except: there are no histories; it seems to only do the relationships. For a good example of reports and maps, see this record:

Roots Web - $0
This does well except that there aren't many reports and it doesn't do the histories. - $13-30/month
This appears to do great in all areas except: it doesn't allow full access unless you sign up. It claims to allow access to existing information for free, so I even attempted to sign up to see someone's historical info, but the page just offered the paid memberships (with 14-day trial). I definitely don't want to use this to try and share with people!

As a side note: I've heard from sources in the LDS Church that their new version of will have more options for attaching notes to individuals, and it should be available worldwide by 2009 (maybe even sometime this year).

Friday, March 14, 2008

maven 2 deploy-file command

I can never remember the vagaries of the deployment URL, etc!

Here is an example for activation.jar in our "soa" repository. Make sure to have the username/password for "soa-repo" in settings.xml, and probably the distributionManagement.repository in the pom.xml.

mvn deploy:deploy-file -DgroupId=javax.activation -DartifactId=activation -Dversion=1.0.2 \
-Dpackaging=jar -Dfile=/home/trent/dl/jaf-1.0.2/activation.jar \
-DrepositoryId=soa-repo \

Oracle and JDBC test from different timezones

I predicted that Java would send the right thing to Oracle and we'd see the same thing in the database. I was wrong and Vijay was right: Oracle ends up with a different value, even though we send the exact same java.util.Date value.

Following is our test where we point Java programs running in different timezones to the same Oracle database.

Here are our two runs of the program below, from UT and then LA timezones:

$ java -cp .:ojdbc-14_g.jar DateTest UT
UT Pi Time Los_Angeles: 1205533140000 = Fri Mar 14 16:19:00 MDT 2008
UT SQL Pi Time Los_Angeles: 1205533140000 = 2008-03-14 16:19:00.0

$ java -cp .:ojdbc-14_g.jar DateTest LA
LA Pi Time Los_Angeles: 1205533140000 = Fri Mar 14 15:19:00 PDT 2008
LA SQL Pi Time Los_Angeles: 1205533140000 = 2008-03-14 15:19:00.0

Here are the results we find in the database when the dust settles:

UT piTimeLos_Angeles 2008-03-14 16:19:00.0
LA piTimeLos_Angeles 2008-03-14 15:19:00.0

import java.util.*;
import java.sql.*;
import java.text.*;


create table time_test (
name varchar2(100),
time date

public class DateTest {
public static void main(String[] args) {
String outPrefix = "";
if (args.length > 0) {
outPrefix = args[0];

Connection conn = null;
PreparedStatement pstat = null;
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm");
TimeZone timezone = TimeZone.getTimeZone("America/Los_Angeles");
java.util.Date piTimeLos_Angeles = formatter.parse("2008/03/14 15:19");
System.out.println(outPrefix + " Pi Time Los_Angeles: " + piTimeLos_Angeles.getTime() + " = " + piTimeLos_Angeles);

String DRIVER = "oracle.jdbc.driver.OracleDriver";
String URL = "...";
String USERNAME = "...";
String PASSWORD = "...";

conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
pstat = conn.prepareStatement("insert into time_test (name, time) values (?, ?)");

//java.sql.Date piTimeLos_AngelesSql = new java.sql.Date(piTimeLos_Angeles.getTime());
java.sql.Timestamp piTimeLos_AngelesSql = new java.sql.Timestamp(piTimeLos_Angeles.getTime());
System.out.println(outPrefix + " SQL Pi Time Los_Angeles: " + piTimeLos_AngelesSql.getTime() + " = " + piTimeLos_AngelesSql);

pstat.setString(1, outPrefix + " piTimeLos_Angeles");
//pstat.setDate(2, piTimeLos_AngelesSql);
pstat.setTimestamp(2, piTimeLos_AngelesSql);


} catch (Exception e) {