WordPress – Some Lessons Learned

As you’ve read before in this blog, I’m working on some plugins to display genealogy data on a WordPress site. I have a plugin for Gramps (written in Python) that creates data files, and a plugin for WordPress (written in PHP) to present that data. This currently requires the webmaster to manually copy the resulting files to the server. The next step in the development process is to make the Gramps plugin communicate directly with the WordPress plugin to update the data.

This is one of the most ambitious projects I’ve embarked on as a hobby programmer. I spent the past few days getting up to speed on programming the WordPress REST API. The last hurdle to get past was interesting. The REST API requires creating a nonce, and passing it on all API calls to the server. Since my code needs to update data on the server, these API calls must be in the context of a logged-in session. The first step in the process must, however, be allowed for a not logged-in user since it logs the user into the server.

The problem is that the value of the nonce is determined based on the session cookie, and that cookie is different for a logged-in session and a not logged-in session. I struggled for a while to try to figure out how I could create a nonce for the logged-in session while performing a function in a not logged-in session.

After a few days of trying different things, searching on-line, and at times spinning my wheels, I finally found that one source on-line that explained the solution. Here’s my working signon function code with the necessary code in bold:

function my_update_cookie($logged_in_cookie) {
    $_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
}

function tangled_web_start(WP_REST_Request $request) {
    add_action('set_logged_in_cookie', 
               [$this, 'my_update_cookie']);

    $creds = ['user_login' => 
                   $request->get_param('id'),
              'user_password' => 
                   $request->get_param('pw'),
              'remember' => true];

    $user = wp_signon($creds, false);
    if (is_wp_error($user)) {
        return $user;
    }

    wp_set_current_user($user->ID);
    wp_set_auth_cookie($user->ID);
    return wp_create_nonce('wp_rest');
} 

The key is to add the 'set_logged_in_cookie' action. Once the signon takes place, that action is called and the LOGGED_IN_COOKIE is updated. Once that is done, the correct nonce is then created.

On the python side, the session issues are managed by an instance of the requests.Session() class. Here’s how the call to the above API is done:

# Logon to WordPress site
session = requests.Session()
parms = {'id': logon_creds['userid'],
         'pw': logon_creds['password']}
res = session.post(url=tgturl + 
                   wp-json/tangled_web/start',
                   data=parms);
if res.status_code != 200:
    return 'Login failed'
nonce = res.text
session.headers.update({'X-WP-Nonce': nonce})

Once the nonce is returned, it gets added to the headers for all subsequent API calls.

Now that I’ve got this working, the rest of the development process should be relatively straight-forward. I’ll have to program API’s for the following tasks:

  • Get a list of checksums for the JSON data files on the servers for a given Tangled Web instance
  • Upload a JSON file or image file to the server
  • Update the names index on the server
  • Update the global settings for the instance

Once this is done, my usual Gramps workflow will have one more step. At the end of a session adding and updating people in my Gramps database, I’ll be able to invoke the “Export to Tangled Web” function in Gramps to update the server immediately, instead of having to manually copy and unpack the files on the server and reload the data.

The Tangled Web Project

Genealogy research doesn’t (or shouldn’t) happen in a vacuum. We all want to share the results of our research with others. These days, that usually is done on the internet. I’ve regularly posted the results on my own web site. Ever since using Gramps, I’ve posted my data using the Gramps Narrated Web Site, but I was never been fully satisfied with it. The information wasn’t always the easiest to navigate, some pages were very large, and it wasn’t very mobile friendly.

Web technology steadily changes. For the past four years, I’ve been using WordPress. The genealogy data was the only section of my web site still using static html pages. I knew programming a new web publishing system would be a big project, but a few months ago I dove in. And so now, I’m able to publish my data using that new system. You can see my genealogy data at Boldts & Molls.

I call this project “Tangled Web”. The most common metaphor used in genealogy is the tree. However, that’s a flawed metaphor, useful only in narrow scopes. Relationships are complex, and form a vast web of interrelationships, often quite complicated.

Clicking on Boldts & Molls, you first see an introductory page. That “home” page includes a list of people born on today’s date in history. It also shows a list of the most common names in the genealogy, in the form of a name cloud, with the bigger names indicating the more common names. There’s also a “search” button, where you can search on last name, given name, location, or a range of years.

For individuals, the new system uses a tabbed layout. The “Family” tab shows parents, grand-parents, siblings, spouses, and children. The “Timeline” shows a history of the person, starting with the marriage of the parents. All events recorded in the Gramps database are listed, and birth, marriage, and death events include witnesses and informants. The “Pedigree” shows the pedigree for the person, with instances of pedigree collapse shown. And the “Sources” tab shows the sources and citations, including scans of the primary source records.

One aspect I wanted to emphasize was relationships between people. And so wherever a person is listed on someone’s page, their relationship is shown.

How was this implemented? First, there’s a Gramps plugin, which creates a set of data files. Like all Gramps plugins, this code is written in Python. Next, there’s a WordPress plugin, written in PHP, which processes that data, and maintains the search index. Finally, there’s a good chunk of code written in JavaScript that formats the data in a browser. The latter uses a technique called Ajax, which is becoming more and more popular. The idea is that the content of the web page is written dynamically, under the control of the JavaScript program. The browser doesn’t have to refresh the whole page whenever you click on a link, but just has to request the changed data from the server. This is how pages like Google Maps work. Altogether, it’s about 5000 lines of Python, PHP, JavaScript, and CSS code.

What’s next? My first priority is to write up some documentation, and upload the code to my GitHub page. The code will be available to anyone under a GPL license. For the next version of the code, my goal is to make it easier to update a Tangled Web instance on the server. That is, I want the Gramps plugin to have the capability to communicate directly with the WordPress plugin to update the data changed since the last update.

Finally, I invite other people to contribute to this project. WordPress isn’t the only content management system out there. Although it’s the most commonly used CMS, there are others like Drupal or Joomla!. If you’d like to have a Tangled Web instance running on your self-hosted web site running on a different CMS, feel free to rewrite the PHP code to suit your CMS.

Cheers! Hans

Some Reasons Why I Use Open Source Software

I’ve been using Linux now for some 23 years. My first reaction after loading RedHat 5.1 was “What the heck am I getting myself into?”. But the open source world gradually matured, and now there are very few reasons not to use free or open-source software (FOSS).

I won’t go into all of my reasons for using FOSS. I worked for several decades as a software developer. So I know full well what goes into developing, selling, maintaining, and supporting software. For companies that sell software, the unfortunate reality is that their number one priority is profit. Once a software product is developed, in the worst case, they will fix defects and enhance the product only if there is a business case for it. And of course, to maximize profit, they will hire the lowest cost developers they can.

I think most of us know of software defects that have gone unfixed for years. I myself have been burned buying shoddy software. That’s one reason I really appreciate the good quality, open-source software that I rely on daily.

To illustrate, let’s look at some of the programs in the “Favorites” category of the application menu on my Linux system:

First, there’s Google Chrome. This is clearly one of the biggest success stories in the FOSS world. And it’s very likely that you too already use Chrome. At one time, Microsoft Internet Explorer had a massive dominant position among web browsers. But now, even Microsoft has abandoned IE, and now uses the open-source Chromium engine to power its Edge browser.

Next, there’s LibreOffice Writer. While Microsoft has ceded the battle for browser supremacy, they still vigorously defend their office suite cash cow. However, here’s a case where the FOSS alternative to Microsoft Word is clearly superior. LibreOffice Writer isn’t just as good as Word, it has more functionality than Word. Writer is considered as desktop publishing application, while Word is not.

Then there’s the GIMP, the Gnu Image Manipulation Program. This is a program I use almost daily. It provides almost the same functionality as PhotoShop, but at a price hundreds of dollars cheaper. While a professional photographer or graphic designer can write off the cost of an application like PhotoShop, an amateur like me cannot. I simply can’t justify the high price of PhotoShop given the availability of a powerful program like GIMP that more than satisfies my image processing needs.

MuseScore is an amazing application that every musician or songwriter should know about. This isn’t just a music score editor. While you’re composing your musical creation, you can hear what the piece sounds like. You can have as many instruments as you want, you can change instruments, transpose keys, and once you’re done, you can record the composition. The user interface isn’t the easiest, but I think that probably goes with the territory. Music composition isn’t easy to begin with, and there is definitely a learning curve to get past.

In the realm of genealogy, it’s (unfortunately) especially important to consider the reputation and integrity of any vendor. That’s why open-source is very important in this realm. Gramps is a full-function genealogy application that supports pretty much the whole GEDCOM data model. In addition, it includes a framework for supporting user-written extensions. You can find some of my own Gramps extensions at my GitHub page.

The latter application illustrates an important point about FOSS. It’s not just one company supporting a piece of software. In the open-source realm, it’s a whole community. Frankly, as a programmer, I have no inclination whatsoever to improve the quality of a program if it just adds to the profits of some company. On the other hand, the open-source community is full of people willing to contribute to the benefit of other users. Everyone is free to use the software without obligation, but also, everyone is invited to contribute in any way that they are able to.

I could go on describing other FOSS applications I use either regularly or occasionally. Such as Audacity for audio editing, Kdenlive for video editing, or Komodo edit for developing software. But I think this list should provide enough justification for considering open-source software instead of buying commercial software.

JavaScript – Some Lessons Learned

If you’re not a programmer, move along, there’s nothing to see here. Only programmers will understand what I’m writing about here.

As you might already be aware, I post the results of my genealogy research on this website. So far, I’ve been using the “Narrated Web Site” feature of Gramps. But since I’ve never been totally satisfied with it, I’ve always toyed with the idea of coming up with a better way to present my data. So finally, about a month ago, I started work on a new project, a different way to present my genealogy data.

This is turning out to be a rather ambitious project, with elements coded in Python, PHP, and JavaScript, as well as CSS and HTML. Sometimes it’s hard keeping all the different languages straight. Since I’m using dynamically-generated HTML, most of the challenges are in the JavaScript code, an area that I’m certainly not expert in. In this missive, I discuss some of the lessons I’ve learned while coding, some after much flailing about. I won’t dive too deeply into specific details. You can learn more with the right Google search.

When to register click handlers

First, since I make heavy use of dynamic HTML, I make good use of click handlers. But while coding, I noticed that in some situations, the click handlers weren’t working as expected. It took a bit of digging, and I found a solution I wasn’t totally happy with. Digging further, I then realized something important about registering click handlers when using dynamic HTML: You need to register the click handler after adding the HTML to the DOM. In the cases where they weren’t firing as expected, the handlers were registered first.

Handling history

When using static HTML page, you don’t have to worry about history. The browser does it all automatically. However, with dynamic HTML, you need to manually keep track of the history if you want meaningful navigation through your content. This is achieved by coding an “onpopstate” event handler, as well as calls to functions “pushState()” and “replaceState()”.

After some flailing about, I stepped back and studied the issue in a bit more detail. And I realized it really wasn’t so bad. I just needed to keep track of three specific situations when displaying page content.

First, when moving to a new page, you need to call “pushState” while outputting the new content. That registers the new page in the history stack.

Second, when navigating to a page previously displayed using an “onpopstate” handler (invoked when the user presses the “back” or “forward” button), you just have to output the page content. No further action is needed.

Finally, there’s “replaceState()”. That’s used in situations where you want to update the content currently on the screen, but you don’t want to advance further in the history. For example, you may just want to switch to a different tab in your content. Or perhaps you want to present a table of search results ordered by name instead of date. These are cases where, when pressing the “back” button, you don’t want to go back through these different views. In this type of situations, you call “replaceState()”.

Querying attributes of HTML elements

The final lesson regards querying certain attributes of HTML elements. I’m now getting into an interesting piece of JavaScript programming where I need to know the real sizes of some HTML elements. There are some functions in jQuery to get the size of an element: “outerHeight()” and “outerWidth()”. I tried calling them, and was surprised to get zeroes as the result.

Again, a bit of digging on-line, and I found the answer. Immediately after adding dynamic elements to the DOM, the attributes might not be set yet. Processing the elements must wait until they are ready. So you’ll need to code something like:

jQuery('#mysection').ready( function() {
process_section();
});

I tried this, and I did get non-zero values for the height and width. However, the values returned did not take into account the size of an embedded image. Taking this approach further requires waiting until all embedded images are loaded. Grrr!

I ended up deciding that this avenue was just too strewn with potential problems. I stepped back and decided to take a different approach to what I wanted to do, an approach with a lot fewer complications.

In addition, further research turn up another issue: This usage of the “ready()” function is deprecated by jQuery.

Conclusion

There’s a lot to JavaScript coding. It’s an incredibly complicated and potentially intimidating environment. I’m constantly looking things up on-line: in manuals, on-line courses, or other blogs. However, on-line information, while usually correct, is sometimes missing some important detail that a novice JavaScript programmer might not be aware of that’s needed to make full sense of the information.

Cheers! Hans

Another Two Ancestors!

Yesterday, I blogged about finding six previously undiscovered ancestors. I should have waited a few hours. Then, I would have titled the post “Eight Newly Discovered Ancestors”. Rather than update that post, I decided to write a new post about this particular family.

A week ago, all I knew about my 4th great grandmother Weimptje Dirks was her name. I didn’t go any further back since FamilySearch doesn’t have the scans for the church records of Ede, where she was born. But GeldersArchief does have those scans. I was back in business, and quickly found her baptism and the names of her parents. With a bit of digging and some lucky guesswork, I found the baptism records for their parents, the last one shortly after I wrote yesterday’s blog post.

I also found 10 siblings for Weimptje, shown here:

Once I recorded the names of Weimptje’s maternal grandparents, I noticed something interesting. It is not uncommon for children to be named after relatives, especially grandparents. And this family is a great demonstration of this.

Note four children named “Annetje”. Three of them died in infancy, and it appeared that their parents really wanted a child with that name. Sure enough, they were named after their paternal grandmother, Anna Gijsbertz. Likewise, my 4th great grandmother Weimptje was named after her maternal grandmother, Wijmptje Ariens. Going further, it looks like all of the children were named after a grandparent, or great grandparent: Jurrij and Jurrien after their paternal grandfather Jurjien Janssen, Evert and Evertje after their maternal grandfather Evert Eliszen, and Jan and Jantje after their paternal great grandfather.

As far as I’m concerned, namesake naming isn’t really useful as a research tool since it can’t always be counted on. But when you do see it, it can give you a little bit more confidence that you’ve reached the right conclusion.

One more aspect of this family: Apart from the last child Jantjen, all the children were born in the village of Veldhuizen, which is situated just to the west of Ede. I’ve found a number of burial records dated between 1759 and 1774. Two of them I can assign to two Annetje’s because of their names. The situation for the rest of the children is interesting. Of the 10 children born before Jantjen, I have 6 without an established death or burial date, and 7(!) burial records for an unnamed child of Dirk Jurrijsze. (I can narrow down the dates somewhat for most of the kids, but at least for Evertje and Evert, any one of those 7 burial records could apply.)

At this point I can only speculate. If I assume I’ve found all the baptisms and burials for that family in that given time span, why the discrepancy? Note the pattern of births through the 1760’s. Elizabeth Everts gave birth yearly during that time, except for 1765. Coincidentally, there is a burial record that fits nicely within that gap. Is that the burial record for an unbaptized stillborn child? If so, I could assign burial dates for two more of the children, leaving four with four possible burial dates between 1771 and 1774.

At this point, I’m not sure I’m willing to jump to that conclusion.

Cheers! Hans

Six Newly Discovered Ancestors!

When I started doing genealogy 30 years ago, I started recording my pedigree on an “IBM Programming and Charting Worksheet”, a sheet of paper 11″ x 15½” in size, lined with half-inch squares. Back in the dinosaur days of programming, sheets like these were used to document programs using flowcharts. By 1990, that was already long considered an obsolete programming technique. But I still had a pad of these worksheets. And for the past 30 years, I’ve steadily maintained this chart.

Here’s the Dutch side of my pedigree. Over the past few years, I haven’t had much chance to update it. Generally, I had thought I had reached the limit of records available on-line for each ancestral line. However, over the past week, I’ve been able to add six previously undiscovered ancestors to my pedigree. Four are indicated in green on that picture. (There’s no room on that page for the other two.)

Lena van Hagen

So about a week ago, I thought I’d have another go at pushing back my ancestry, starting with my 4th great grandmother Lena van Hagen. I knew she lived in Nijkerk in the mid to late 1700’s. But I couldn’t find her baptism record. Using the usual arsenal of on-line tools (WieWasWie.nl, FamilySearch.org, and GeldersArchief.nl), I now decided on a different tack. I looked for marriage records in the early 1700’s for people named “van Hagen”. I came up with two marriages. The first, dated 1740, didn’t match. After marrying, that couple moved to Harderwijk and had a number of children, none of whom were named “Lena”.

The second turned out more successful. Early in 1744, Arent van Hagen married Anna Maas in Nijkerk. I then found a baptism record dated 4 months later for Lena, daughter of Arent Cornelissen and Annetjen Maas. All together, I found 5 baptisms for children of Arent and Anna. Although the marriage listed Arent by his surname “van Hagen”, every other record refers to him by his patronymic “Cornelissen”.

This evidence isn’t the greatest. I’ve seen cases before of people referred to by either surname or patronymic in different records. In some cases, I have found records that included both, which added confidence to my conclusions. I wish the evidence here was better. But I’m still adding Arent van Hagen and Anna Maas as two 5th great grandparents, and will look for more evidence to support that conclusion.

Heintje Wouters

The next brick wall I looked at was my 4th great grandmother Heintje Wouters (also known as Hendrikje Wouters). Unfortunately, there’s no progress to report on that front. She lived in the village of Hoevelaken, and I haven’t found any church records covering when she was born. Maybe she was baptized in neighboring Nijkerk? If so, I would run into another problem since there was another Hendrikje Wouters alive at roughly the same time, living in Nijkerk. At some point, I will make another attempt to attack this roadblock.

Weimptje Dirks

Which brings me to my 4th great grandmother Weimptje Dirks. Before, I couldn’t go further back with her since FamilySearch did not have the church records for the town of Ede, where she was born. Well, FamilySearch isn’t the only game in town. With a bit of digging, I found the Ede church books on the GeldersArchief web site, and quickly found her baptism, dated 1760. Her parents were Dirk Jurrijsze and Lijsbeth Evertsze, my 5th great grandparents. Plodding through the baptism records, I found another 10 children in the family. Of the 11 kids, only two reached adulthood.

Could I go back further? I couldn’t find a marriage record in Ede for Dirk and Lijsbeth (also known as Elizabeth). I had a hunch I’d find it in the neighboring village of Lunteren. At first I resisted looking there since as far as I could tell I had no good reason to. But I still did, and there I found their marriage record dated 1758. That record indicated that Dirk, or Derck, was born in Renkum. Then, in the Renkum church books, I found a matching baptism record. Derck was baptized in 1726 with parents Jurjie Janssen and Anna Gijsberts, my 6th great grandparents.

In conclusion, I’ll make a couple of points. First, it never hurts to go back and revisit those brick walls. The indexes are always improving and more and more historical records are being added to the various web sites.

Second, trying to come up with definitive conclusions when going through the pre-1811 Dutch church records is rarely easy. In all of these cases listed here, I wish the evidence was better. But as far as I’m concerned, it’s at least good enough to record and use as a base for further research.

When I was learning genealogy 30 years ago, the recommended practice was to record a fact first in pencil. Once you had three corroborating pieces of evidence, you could then go back and retrace the fact in pen. It’s just bloody hard to reach that level of confidence reading those old Dutch church books.

Cheers! Hans

 

Introduction to Gramps

About a decade ago I resumed my genealogy research. I started using the program Gramps since there were not a lot of options available for Linux users. Gramps is a powerful, full-featured program, available for Windows and Mac, in addition to Linux. But it can take some getting used to. In this essay, I’ll offer some hints and walk you through the process of adding some information to your Gramps database.

One of the first things to do after installing Gramps is to set the base path for your media files. Gramps does not save image files in its own database. Instead, it saves the filenames to the image files on your computer. By default, Gramps will save the filename to an image as a full path. However, it’s better to save the file name as a relative path. But first, you’ll need to set the base path in the Gramps Preferences. On the main toolbar, click on “Edit”, then “Preferences…”. Then set the path in the entry field “Base path for relative media paths”. In my case, it’s “/home/hans/family/gramps-media”.

The first thing I always do when starting up Gramps is to open the clipboard window. This is where you can drag and drop any item, such as a person, source, citation, or place.

My screen then looks like this:

In this picture, the clipboard is already populated with a couple of places, a source, and a citation. The relationship view is where you do most of your work. And at the left is a gramplet pane showing a gramplet that I’m currently programming. A gramplet is an extension to the program adding some functionality. (Programming gramplets is a topic better left to brave souls with experience in programming.)

Let’s look at the relationship view in more detail. The buttons can be a bit confusing, but moving the mouse over an icon shows what it does. If in doubt, check that help text before continuing.

The icons are consistent throughout the program. The plus-sign always indicates creating a new item. The pencil icon indicates editing an item. And the finger-pointing icon always indicates adding some existing item to some other item. (I’ll let you figure out what the minus-sign icon is for.)

To illustrate my usual workflow, let’s update an event for an existing person, in this case, Hendrik Krasenberg. Click on the edit icon for the person, and we get this:

In the events, double click on the birth record. Or alternatively, right-click, then click on “Edit”.

Note that we already know that Hendrik Krasenberg was born around 1848. Using WieWasWie, we look up the birth record in the Dutch civil registration. In FamilySearch.org, we find this document, which I’ve edited and saved on my computer as “1848 Hendrij Krasenberg birth.jpg” in folder “family/gramps-media/records13”:

So in the Event Reference Editor, I enter the new date of “1848-03-13”, which I immediately select and copy (ctrl-A, ctrl-C). I’ll need to paste that date a few times during the next few steps. We then drag and drop the place name, Rheden in this case, from the Clipboard to the Place.

The next step is to create a new citation for this birth record. We already have a source in the clipboard.  Click on the “Source Citations” tab, and then drag and drop the “Netherlands, Gelderland Civil Registration” item from the Clipboard to the Source Citations window. We then get the “New Citation” window with the Source already filled in. Note that a citation always requires a source.

Click on the date field and press ctrl-V to paste in the date. For Volume/Page, enter “Rheden 1848 #34”. It can be whatever you want, but best to adopt a consistent standard throughout your work. Then click on the “Gallery” tab, then on the plus icon to create a new media record: You’ll then get this dialog:

One important hint on this dialog. Make sure the “Convert to a relative path” box is checked. Otherwise, the full path will be saved. (Remember, the first thing we did after installing Gramps was to set the base path.) After selecting the right file, press OK to continue. In my case, I view the files in reversed modified order, and so the file I normally want is usually the one at the top of the list. You then get the Media Reference Editor dialog. Expand the “Shared Information” and we see:

Note that the title is automatically filled in from the filename. I usually paste in the date before pressing OK. I then press OK on the New Citation dialog, and the citation gets added to the event. Then, I drag and drop the newly created citation to the clipboard since I’ll need it for adding additional information to other people. Press OK, and we’re then back to the Person dialog for Hendrik Krasenberg, and we see the updated birth record.

Where do we go from here? Before we press OK on this person, we check the birth record again. If we want to add this event to another person’s events, we can drag and drop the event to the clipboard. For example, perhaps a witness to the event is already in our database. We can drag and drop the Birth event into that person’s events, and give them a role of “witness” to the event. The Dutch birth records usually include the age and occupation of the witnesses, and so we can add those facts as well, using the citation we just created and saved in the clipboard. Actually, the information we started off with for Hendrik Krasenberg was based on the fact that he was a witness to the wedding of his sister.

Normally, Dutch birth records in the civil registration include some additional facts about the father and mother. In this case, we know that the father, “Jan Derk Krasenberg” had occupation Timmerman, or carpenter, and that he was 44 years old at the time of his son’s birth. In addition, the mother, Everdina Hermina Hupkes, was 30 years old. We can update the records for both of those people, again, using the citation we just created.

Note that when adding events to a person, the events are not sorted by default. If you want the events in order, you’ll have to manually move the event to its proper place. You can either use the up and down arrow buttons, or you can drag the event to another location in the list.

There’s a lot more to Gramps than this. I’ve already written a thousand words on the subject, and I could easily write a thousand more and still only scratch the surface. But hopefully, this will help you get started on the right path with Gramps.

Cheers! Hans

 

 

 

A Case of Quadruple In-law Marriage

Out of my 28 first cousins, I have two cousins, sisters, who married two brothers. Double in-law marriage is not very common these days since we all now have a large pool of potential spouses to choose from. But in the case of my two cousins, the tradition in that family was to marry within their church, a conservative Protestant denomination. That’s an example of endogamy, the practice of marrying within a specific social group, caste, or ethnic group.

In the past, however, choice of potential spouses was much more limited, especially in small isolated communities. In my genealogy database, I have numerous examples of double in-law marriage, as well as at least one case of triple in-law marriage. However, up until now, I hadn’t come across a case of quadruple in-law marriage.

As usual, blue indicates distant cousins. Consider some of the children of Aris van Manen (1779-1863) and some of the children of Johann Heinrich Ostermann. We have four van Manen siblings married to four Ostermann siblings. That is, a case of quadruple in-law marriage.

This raises a lot of questions. The van Manen’s were born in the village of Velp, and most stayed there. Although Velp is a small village, it is not isolated, being very close to the city of Arnhem. On the other hand, the Ostermann’s were from a small village about 60km to the south-east, in the neighboring Kingdom of Prussia. The parents, Johann Heinrich Ostermann and Wilhelmina Kamps remained in the village of Ringenberg, while four of their children moved, most to Velp, one to Arnhem, to live with their van Manen spouse.

European railways in 1861

Perhaps Johann Ostermann had reason to visit Arnhem in his position as an official in the post office. (In one record, he is listed as a Postdirecteur.) By the mid 19th Century, a railroad line had already been built connecting a major industrial heartland of Prussia with the commercial centers and seaports of the Netherlands. By rail, the trip between Wesel (the closest large town to Ringenberg) and Arnhem would have taken about an hour. Since the post office was a major customer of the railways, and since Arnhem is the first major city across the border, it’s not unreasonable to expect that Johann would have to do business in Arnhem. However, we may never know the details of how four of Johann’s children connected with the van Manen siblings.

This drop chart has a few more interesting features. First, consider the marriage between Aris van Manen (1858-1901) and Wilhelmina van Manen (1866-1946). This is just the second instance of double first cousin marriage in my database. The first, between Peter van Beem and Elizabeth van Beem, I found almost a year ago.

There are also two cases of regular (not double) first cousin marriage, between Willem van Manen (1827-1899) and Hermina Aleida de Bruin (1826-1902), and between Jacobus Petrus Felix (1861-1938) and Wilhelmina Henriette van Manen (1861-1928). Also, Hendrik van Manen (1854-1909) and Johanna Harmina Schut (1853-1921) were fifth cousins once removed, although their full ancestries are not shown in the chart.

One more unusual situation in this drop chart. Consider the Arnhem winkelier Jacobus Petrus Felix (1801-1875). He married twice, first in 1826 to Petronella de Bruin (1789-1854), and second in 1855 to Hermina van Manen (1825-1899). Hermina was Petronella’s niece.

That’s quite the handful of tangled interrelationships!

Wentink’s and Geerlings’ and the Tangled Web

It’s a fact that we’re all related to each other. However, some people are more closely related than others. This post describes another case of complex interrelationships between two people. In particular, let’s look at how Hendrik Bernard Wentink (1904-1957) and Johanna Geerlings (1906-1991) were related to each other.

(As in previous posts, you might find it useful to open the chart in another browser window. People marked in red are ancestors of mine, those in blue are distant cousins.)

Hendrik Bernard and Johanna were married 1930 in Rheden. Likewise, most of the people in this chart lived in the area around Rheden, east of Arnhem, in the Dutch province of Gelderland.

When looking at a marriage record, I often do a search on their parents and grand-parents to see if any of them are already in my database. Doing so, I quickly realized that Hendrik Bernard and Johanna were 2nd cousins once removed, with common ancestors Gerrit Brinkhorst (1766-1831) and Paulina Petronella Dieterink (1768-1831).

I also realized that they both had van Zadelhoff ancestors. Mapping out their ancestors took a bit of effort since their common ancestors were quite a few generations back, well into the 17th Century. Johanna had a single path back to Steven Berends van Sadelhof and Hendrina Willems. But Hendrik Bernard’s ancestry was much more complicated. His parents, Jan Hendrik Wentink (1873-1946) and Hendrika Wentink (1873-1934) were first cousins. Likewise, both sets of his grand-parents were also cousins, paternally 1st cousins once removed, maternally 3rd cousins.

So there were three distinct paths from Hendrik Bernard to Steven Berends van Sadelhof. So along that side of the chart, Hendrik Bernard and Johanna are 6th cousins twice removed in two ways and also 7th cousins.

We’re not done yet. Once I noticed that both had Kets ancestors, I had to investigate further. So it turned out that Hendrik Bernard and Johanna had another pair of common ancestors, Gerrit Kets and Jantje Geurts. As before, there are three distinct paths from Hendrik Bernard to Gerrit Kets, resulting in relationships of 4th cousins once removed and 4th cousins twice removed.

Finally, we come to another pair of common ancestors, Hendrik Brinkhorst and Catharina Turgels. From this pair, Hendrik Bernard and Johanna were 5th cousins.

If you’re keeping track, we have a total of eight different set of distinct paths from this married couple to their four pairs of common ancestors.

Cheers! Hans

COVID-19, SARS, and Model Train Shows

Back in 2003, model railroaders in southern Ontario were eagerly awaiting the upcoming National Model Railroader Association convention in Toronto. This was significant since this was to be the first time the NMRA held their annual convention outside the United States. But as luck would have it, Toronto was hit with the SARS virus. Enough people canceled their reservations that the NMRA had to cancel the convention. A train show was still held in Toronto that Summer, but it paled in comparison to what should have happened.

(For some reason, the NMRA website still lists Toronto as the site of the 2003 convention.)

SARS was a big deal. However, for most of us in Toronto, life went on with little disruption. The outbreaks were mainly limited to a couple of hospitals, and all area hospitals took severe measures to mitigate the spread. By the time the danger had passed, the SARS virus took the lives of 24 people in Ontario. However, the panic resulted in the cancellation of many more events in the Toronto area, not just the NMRA convention.

Compare that to today. As a result of COVID-19, another corona virus, few places are free from infection. Currently, the United States is experiencing one death every 53 seconds from COVID. And that’s just the official count. The actual number of deaths is almost certainly much higher.

And yet, look at the attitude of many people in the US. I wonder this: Of the people who canceled their trips to Toronto back in 2003, how many are now actively taking steps to prevent the spread of the virus? How many are wearing masks? How many are practicing social distancing? And how many are attending events where people don’t take the virus seriously enough?

The latest news from the US is disheartening. The United States Supreme Court ruled that, in the state of New York, social distancing rules do not apply to churches.  This is insane! The virus doesn’t differentiate between secular and sacred spaces. Once vaccines are available and people get vaccinated, there will still be people who will refuse the vaccine. Infection rates will drop of course, but with people refusing to get vaccinated and with people still congregating in places where mitigation measures are willfully ignored, it will still take some time before the virus outbreak is fully under control.

Currently, churches are already a major source of COVID infection, and now will continue to confound public health efforts to contain the virus. How will this affect religion long-term? Even before COVID, church attendance has been dropping. But now that we’re in a pandemic, interest in church has been falling even further. Although there are still people who don’t take COVID seriously enough, there are a lot of people who do, and many of them see how dangerously out of touch many conservative preachers are. This can only drive even more people into the “nones” category. If there’s a positive to COVID, I suppose this is it: As the churches become even more of a factor in the spread of COVID, the ineffectiveness and dangers of religious practices will become even more obvious.