--- http_interactions: - request: method: get uri: https://blog.front-matter.io/posts/eating-your-own-dog-food body: encoding: UTF-8 string: '' headers: Connection: - close Host: - blog.front-matter.io User-Agent: - http.rb/5.1.1 response: status: code: 301 message: Moved Permanently headers: Connection: - close Content-Length: - '0' Server: - openresty Status: - 301 Moved Permanently X-Request-Id: - c3be1a0a-105c-4e24-ae5a-7dfd98d9cd9d - c3be1a0a-105c-4e24-ae5a-7dfd98d9cd9d Location: - "/posts/eating-your-own-dog-food/" Ghost-Cache: - MISS Cache-Control: - public, max-age=31536000 Ghost-Age: - '0' Accept-Ranges: - bytes Date: - Sun, 18 Jun 2023 15:22:36 GMT Via: - 1.1 varnish Age: - '32' X-Served-By: - cache-ams21039-AMS X-Cache: - HIT X-Cache-Hits: - '1' X-Timer: - S1687101757.844277,VS0,VE3 Vary: - Cookie Ghost-Fastly: - 'true' Alt-Svc: - clear body: encoding: ASCII-8BIT string: '' recorded_at: Sun, 18 Jun 2023 15:22:36 GMT - request: method: get uri: https://blog.front-matter.io/posts/eating-your-own-dog-food/ body: encoding: UTF-8 string: '' headers: Connection: - close User-Agent: - http.rb/5.1.1 Host: - blog.front-matter.io response: status: code: 200 message: OK headers: Connection: - close Content-Length: - '35313' Server: - openresty Content-Type: - text/html; charset=utf-8 Status: - 200 OK X-Request-Id: - 1a97b75d-1352-4f4c-b83a-3dd3c890943a - 1a97b75d-1352-4f4c-b83a-3dd3c890943a Etag: - W/"89f1-oEW5acXDcdQnN+2n8cbS4LTHno8" Ghost-Cache: - MISS Cache-Control: - public, max-age=0 Ghost-Age: - '0' Accept-Ranges: - bytes Date: - Sun, 18 Jun 2023 15:22:36 GMT Via: - 1.1 varnish Age: - '32' X-Served-By: - cache-ams21050-AMS X-Cache: - HIT X-Cache-Hits: - '1' X-Timer: - S1687101757.977183,VS0,VE4 Vary: - Cookie, Accept-Encoding Ghost-Fastly: - 'true' Alt-Svc: - clear body: encoding: UTF-8 string: "\n\n\n\n \n \ \n \ Eating your own Dog Food\n \n\n \ \n \ \n \ \n \n \n \ \n \n \n\n\n \ \n \ \n \n \n \n \n \n \n \n \n \n \n\n \n \n \ \n \n \ \n \n \n \n \n \n \ \n \ \n \ \n \ \n \n \n \n \n \ \n \ \n \ \n \n \n \n \n \n \n \n\n \n \n \ \n \ \n \ \n \n \n \ \n \ \n \ \n\n\n\n\n
\n\n
\n
\n
\n
\n \ \n \n \ \"Front\n \n \n
\n \ \n \n
\n\n \n\n
\n \ \n
\n Sign in\n Subscribe\n \
\n
\n
\n
\n\n \ \n
\n
\n\n \
\n \n\n \

Eating your own Dog Food

\n\n \ \n\n\n
\n \ \n
Photo by Bill Emrich. CC Zero.
\n
\n
\n\n
\n

Eating your own dog food is a slang term to describe that an organization should itself use the products and services it provides. For DataCite this means that we should use DOIs with appropriate metadata and strategies for long-term preservation for the scholarly outputs we produce. For the most part this is not research data, but rather technical documents such as the DataCite Schema and its documentation (2016).

These outputs also include the posts on this blog, where we discuss topics relevant for the DataCite community, but also of broader interest to anyone who cares about research data, persistent identifiers, and scholarly infrastructure. And starting today all blog posts on this blog will have a DOI, metadata and use a persistent storage mechanism.

Technical Implementation

This blog is powered by the static site generator Middleman, with blog posts written in Markdown and converted to HTML using Pandoc and the Travis CI continuous integration service. Static site generator means that there is no database or application server powering the site, making website adminstration simpler, cheaper and safer. In addition to the blog, the DataCite homepage and Metadata Schema subsite are also generated using Middleman.

The simplicity is particularly important here, as registering the DOIs and metadata can be accomplished using a command line utility written by DataCite staff that doesn't need to know much about the internals of Middleman, and thus can be easily adapted to other static site generators such as Jekyll, Hugo or Hexo. The command line utility is Cirneco, generating the metadata XML according to the DataCite Metadata Schema, and registering DOI and metadata with the DataCite MDS. Like all tools mentioned in this post Cirneco is open source software, please reach out to us if you are interested in implementing similar functionality for your blog.

Generating DOIs

The DOIs for this blog are generated automatically, using a modified base32 encoding algorithm that is provided by Cirneco, as discussed last week (Fenner, 2016). The DOI is generated and minted when a new post is pushed to https://blog.datacite.org. This avoids two problems: a) DOI-like strings in the wild before publication and b) the randomly generated DOI exists already (we can simply generate a new one). All DOIs are short, without semantic infomation that might change over time, and with a checksum to minimize transcription errors, for example https://doi.org/10.5438/XCBJ-G7ZY. Going forward we encourage users to link to the DataCite Blog using the DOI, as these links will continue to work even if we ever move the blog to a different location.

Generating Metadata

For the generation of metadata, we need to strike a balance between simple author provided metadata, but rich enough to aid discovery. We are doing this via three mechanisms:

  • metadata provided by the author
  • default metadata for the blog
  • metadata automatically extracted from content

The metadata provided by the author are the typical metadata for blog posts, provided via YAML front matter at the beginning of each post:

---\nlayout: post\ntitle: Eating
        your own Dog Food\nauthor: mfenner\ndate: 2016-12-19\ntags:\n- datacite\n-
        doi\n- metadata\n---

We can reuse all these metadata when generating DataCite metadata, using the tags as subjects.

The default metadata are metadata that always stay the same for the blog, such as publisher, HostingInstitution and rights. We can store them in a site-wide configuration file. We can also assume reasonable defaults that can be overridden in the YAML front matter, e.g. resourceType (we use BlogPosting with resourceTypeGeneral Text) and version. We store more information about authors outside the blog post, including givenName, familyName and nameIdentifier (we now show the ORCID ID of every blog author at the bottom of the post).

Finally, there are metadata that we can automatically extract from the blog post, and we are currently doing this for the description and relatedIdentifier. This blog uses Pandoc and BibTex to generate the references section at the end, and we can fetch this information and convert it into the format needed for relatedIdentifier.

Taken together we can provide all metadata that are required or recommended in the Metadata Schema documentation (2016), and we can do this without any extra effort for the author. The full XML is avalailable here.

Not all blog posts need to be cited formally with metadata in a references list formatted according to a specific citation style. But these metadata greatly help with discovery, a search in DataCite Search for eating dog food will for example bring up this blog post as the first hit.

Persistent storage

Using DOIs means that readers not only expect rich metadata that help with citation and discovery, but also that DataCite takes extra care to preserve the blog posts, thinking beyond the particular technical implementation or even the contiuing existence of this blog. This is an area where we do need to do more work, starting with a decision about the best archival format for a blog post (HTML, PDF, JATS?). For now blog posts are hosted in multiple Git repositories (one of them on Github), and in two independent Amazon S3 buckets that each use versioning. Multiple locations with versioning are a good start, but more work is clearly needed.

This blog post was originally published on the DataCite Blog.

References

DataCite Metadata Working Group. (2016). DataCite metadata schema for the publication and citation of research data v4.0. DataCite. https://doi.org/10.5438/0012

Fenner, M. (2016). Cool doi’s. DataCite. https://doi.org/10.5438/55E5-T5C0

\n \
\n Copyright © 2016 Martin Fenner. Distributed under the terms of the\n \n Creative Commons Attribution 4.0 License.\n \n
\n \
\n \n\n
\n\n \ \n\n
\n
\n

Comments (\n)

\n \
\n \n \n \n \
\n
\n\n \n\n
\n\n \
\n \
\n\n
\n \
\n
\n \
\n
\n \
\n\n
\n
\n
\n\n \ \n \n \n \n\n
\n
\n \
\n
\n
\n \
\n
\n
\n\n \ \n\n \ \n \n\n
\n \
\n
\n \
\n
\n
\n\n\n\n\n\n\n\n" recorded_at: Sun, 18 Jun 2023 15:22:36 GMT recorded_with: VCR 6.1.0