DadOverflow.com

Musings of a dad with too much time on his hands and not enough to do. Wait. Reverse that.

Tag: genealogy (page 1 of 4)

Scanning slides

My dad was a big fan of slides as a film medium back in the day.  I have boxes of these suckers that span at least the last four decades of the Twentieth Century.

A few years ago, I bought one of those slide scanner gizmos and started in on the overwhelming task.  One thing I immediately found frustrating was the timestamp: my scanner would affix a timestamp–June 1, 2013–to every slide.  I examined every nook and cranny of the menu to see where I could set the current time and date and found no way to set it.

To me, having an accurate timestamp on my scanned photos is important–it lets me know, and anyone else with whom I share my files, when I actually did the work.  It can help me group images together that may all be part of the same set.  It might even help me identify unknown individuals in the photos.   So, it’s important to get the date right on the files.

What can I do?  I know: PowerShell can solve this problem!  Here’s a short code snippet I now use to get the dates right on my scanned slides:


1
2
$dir = "C:\my_path\slides"  # set the filepath to my slides
gci $dir | where {$_.Extension.ToLower() -eq ".jpg"} | foreach{$_.CreationTime = (Get-Date); $_.LastWriteTime = (Get-Date)}

This will at least set the image timestamp to the current date and time.  Assuming you scanned the slides on the same day, you should be set.  If you want to set the timestamp to an earlier date, that can easily be done, as well, but I won’t go into it here.  Also know that there are a number of date properties with a file: create date, last modified date, etc.  I’m using a “hammer” approach to this problem by setting both the CreationTime and LastWriteTime properties.

My scanner also has a pre-set naming convention for the slides it scans.  In general, that’s fine with me, but you can also use PowerShell to easily rename your scanned images to your own convention.  Here, I want to indicate that all the slides in a given directory are part of the same group, so I basically add a “_grp001” suffix to the end of each file:


1
2
3
$dir = "C:\data_files\slides2"
$suffix = '_grp001.jpg'
gci $dir | where {$_.Extension.ToLower() -eq ".jpg"} | foreach{mv $_.FullName $_.FullName.ToLower().Replace('.jpg', $suffix)}

 

Ideas for a great family reunion

Recently, my family organized and held a family reunion. It went quite well and here are some ideas I plucked from the experience that, I think, helped make it so:

Pick a geographically convenient location

Fortunately, most of this side of my family is spread across only two states, predominantly in Indiana. So, our organizers picked a relatively convenient location there. Furthermore, they found an air-conditioned, indoor facility that made the whole affair much more comfortable.

Send occasional reminders leading up to the event

The organizers sent occasional, but not overly frequent, email reminders leading up to the event. They made sure to include all the essential information such as the start time, address, and special requests, such as bringing food dishes and so forth. RSVPs should be gathered, as well, in order to better estimate the food demands.

Serve food and snacks

Nothing brings a family together like food and we had plenty of it. Food, snacks, and drinks seem to be essential for a successful reunion.

Take pictures

Pictures are a critical takeaway from a reunion. To really maximize this opportunity, the organizers created a detailed list of the group pictures they wanted to collect. They designated one of our family members with a penchant for photography as the official photographer, identified an area of the facility as the “photo studio”, and began working through the list from nearly the start of the affair. All said, it worked out great!

Take video

I was designated the official videographer, so I wondered through the event taking video of family talking, playing games, and even posing for photos. One thing I may try for next year is to have each attendee say a few words about himself or his family on camera. That might make for a nice reunion video montage someday.

Set up props

Having photo albums and pictures on hand to look through helps family members connect with and appreciate their ancestors. They also make for great conversation starters: “Doesn’t baby Ava look a lot like that baby picture of Great-Grandmother Bernice?” As I have digitized hundreds of pictures over the years and collected hours of family video, I put together slideshows and videos that I ran off a Raspberry Pi. For multimedia props like these, plan ahead: I brought a project with the plan to project my presentations on a wall. Fortunately, though, the facility had several flatscreen TVs available and I was able to plug my Raspberry Pi into one of these and run my media directly on a nice TV.

At past reunions, I’ve created fact sheets and even quizzes about the family. For the really industrious, create a quiz, tally up the scores, and give the top two or three some sort of prize.

Have an emcee

At every reunion I’ve attended, there have been attendees there I didn’t recognize. One way to mitigate such a problem is to have an emcee officiate some part of the reunion. Typically, this would be one of the more boisterous members of your family, particularly if you have no microphone handy. Say during meal time, the emcee could get everyone’s attention and then walk from table to table having everyone introduce themselves. Even better, have the emcee share stories and encourage others to share humorous or motivational family stories.

Play games

We had plenty of cards and board games on hand, although Euchre seemed to be the game of choice. For the really inventive, consider creating a “Family Jeopardy” type game to test one’s knowledge of the family.

Show your talent

Do you have family members that play an instrument, juggle, tell jokes, or have some other sort of talent? If so, consider organizing a family talent show at your reunion.

Think of the children

We had plenty of little ones running around and they grew bored pretty quickly. Fortunately, their parents and other willing relatives did well keeping them entertained. Having a safe area with toys and whatnot to keep the children entertained and give mom and dad a break will help make your reunion more pleasant.

If you must do genealogy

Most of my family doesn’t share the same passion for genealogy as I do and that’s perfectly OK–I just seem to forget this from time to time. I printed out several family group sheets of family from generations past thinking others might find that interesting. Most did not. I also printed out family group sheets of the families present hoping that they would help fill in some of the blanks I had. Unfortunately, I still have those blanks. As a note to myself, for next time, I need to spend some time gathering up what questions I might have–missing names, dates, locations, etc.–and get those answers directly from the individuals in question. In the past, though, I’ve printed up “amateur genealogist” business cards with my contact information and handed them out to family just in case the genealogy bug bites a family member later on.

What next?

How do you build upon a successful reunion event and prepare for the next one? For starters, think about how you might share photos and videos of the event with the attendees. Facebook? Google Drive? You might consider gathering feedback from the attendees through email or even a survey like SurveyMonkey.com. How was the location and time? Do you have a food suggestion for next year? Can you suggest at least one new activity we should do for next year? The organizers should reconvene and discuss things that went well and what did not. And since nothing is free, money should be discussed–should attendees pitch in a few dollars for next year?

So, these are just some of the ideas I took away from my family’s recent reunion. Here’s hoping your next one is great!

Roots Magic and Jupyter Notebook: like peas and carrots


via GIPHY

Roots Magic seems to be a popular tool among genealogists. At least, the Genealogy Guys certainly recommend it.

I’ve been using the tool for about a year now. My previous genealogy database tool seemed to lock away my data in its own proprietary database confining me to the queries and views exposed only in its user interface. Before I switched away, though, I wanted to make sure my next tool would give me a little more latitude with regard to accessing my data. At a genealogy conference in 2017, I actually had a short conversation with the head honcho himself, Bruce Buzbee, and voiced this concern. Bruce briefly mentioned Roots Magic’s connection with sqlite. Interest piqued, I bought his software and made the switch.

It seems like most of the work exploring the sqlite foundation of Roots Magic has been captured at the site SQLiteToolsForRootsMagic. [Side note: Wikispaces, the platform on which SQLiteToolsForRootsMagic is built is going away, so, by the time you read this, the SQLiteTools site might be no more. Fortunately, the site owners are developing migration plans, so stay tuned.] These folks tend to use clients like SQLiteSpy to run their queries. Nothing wrong with that, but since my favorite development canvas lately is Jupyter Notebook, I asked myself, “Self, could you query a Roots Magic database in Jupyter Notebook?” The answer is: absolutely!  Here are some of the steps I took to query a Roots Magic database in Jupyter Notebook.

Step 1: Import the necessary packages

Load all my go-to packages including pandas and matplotlib as well as sqlite3 and Pivotal’s SQL Magic (SQL Magic isn’t necessary, but it makes writing SQL queries a little nicer):


1
2
3
4
5
6
7
8
9
10
import sqlite3
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.style as style

%load_ext sql_magic
%matplotlib inline
plt.style.use('fivethirtyeight')

Step 2: Connect to my Roots Magic file

For demonstration purposes, I grabbed a copy of George Washington’s family tree and saved it off in Roots Magic.  Connecting to the file is pretty darn easy:


1
2
3
4
# Note that sqlite seems to require a full path to the file you wish to load
conn = sqlite3.connect("C:\\data_files\\qsync_laptop\\jupyter_notebooks\\query_gen_dbs\\GeorgeWashingtonFamilyBig.rmgc")
%config SQL.conn_name='conn'  # useful when using sql_magic
cur = conn.cursor()

Step 3: Go to town!

At this point, the only real challenge is dealing with the COLLATE NOCASE issue, but that’s just a minor inconvenience.  After that, it’s just spending time understanding the Roots Magic database schema and the relationships between tables.  SQLiteToolsForRootsMagic has really blazed the trail here, so I encourage you to spend some time on the site looking over the hundreds of posted queries to get a better understanding of the database schema.

With direct access to the database, you can print out facts about your data that may not be exposed in the Roots Magic user interface:


1
2
3
4
5
6
7
8
9
10
11
12
cur.execute("SELECT OwnerID FROM NameTable")
nbr_of_people = len(cur.fetchall())
cur.execute("SELECT FamilyID FROM FamilyTable")
nbr_of_families = len(cur.fetchall())
cur.execute("SELECT FamilyID FROM FamilyTable")
nbr_of_families = len(cur.fetchall())
cur.execute("SELECT FamilyID FROM EventTable")
nbr_of_events = len(cur.fetchall())

print('This database contains {0} individuals.'.format(nbr_of_people))
print('It includes {0} families.'.format(nbr_of_families))
print('It includes {0} events.'.format(nbr_of_events))

Output:

This database contains 529 individuals.
It includes 114 families.
It includes 2679 events.

Or this:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%%read_sql df_ages -d
SELECT OwnerID
    ,Surname COLLATE NOCASE AS Surname
    ,Given COLLATE NOCASE AS Given
    ,BirthYear AS BirthYear
    ,DeathYear AS DeathYear
    ,(DeathYear - BirthYear) AS age
FROM NameTable n
WHERE COALESCE(BirthYear, 0) > 0 AND COALESCE(DeathYear, 0) > 0
    AND (age BETWEEN 0 AND 110) --remove anyone over 110 years of age or under 0 as that's a likely error

oldest = df_ages.sort_values('
age', ascending=False).head(1)
youngest = df_ages.sort_values('
age').head(1)
print('
This family tree contains {0} individuals with recorded birth and death dates.'.format(df_ages.shape[0]))
print('
The oldest person in the tree is {0} {1} at age {2}.'.format(oldest.Given.values[0], oldest.Surname.values[0],
                                                                   oldest.age.values[0]))
print('
The youngest person in the tree is {0} {1} at age {2}.'.format(youngest.Given.values[0], youngest.Surname.values[0],
                                                                      youngest.age.values[0]))
print('
The average age for family members in this tree is {0:.1f} years.'.format(df_ages.age.mean()))
print('
The median age for family members in this tree is {0:.1f} years.'.format(df_ages.age.median()))

Output:

This family tree contains 192 individuals with recorded birth and death dates.
The oldest person in the tree is John WASHINGTON at age 99.
The youngest person in the tree is Mildred WASHINGTON at age 1.
The average age for family members in this tree is 52.9 years.
The median age for family members in this tree is 52.0 years.

How about some charts?

You can find this work and more on my Github page.

« Older posts

© 2019 DadOverflow.com

Theme by Anders NorenUp ↑