2019-02-01 20:45:50 +01:00
<!DOCTYPE html>
2019-10-11 10:19:42 +02:00
< html lang = "en" >
2019-02-01 20:45:50 +01:00
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1, shrink-to-fit=no" >
2020-12-06 15:53:29 +01:00
2019-02-01 20:45:50 +01:00
< meta property = "og:title" content = "CGSpace Notes" / >
< meta property = "og:description" content = "Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." / >
< meta property = "og:type" content = "website" / >
< meta property = "og:url" content = "https://alanorth.github.io/cgspace-notes/" / >
2021-11-27 13:37:33 +01:00
< meta property = "og:updated_time" content = "2021-11-27T12:18:52+02:00" / >
2020-12-06 15:53:29 +01:00
2019-02-01 20:45:50 +01:00
< meta name = "twitter:card" content = "summary" / >
< meta name = "twitter:title" content = "CGSpace Notes" / >
< meta name = "twitter:description" content = "Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." / >
2021-11-22 15:47:50 +01:00
< meta name = "generator" content = "Hugo 0.89.4" / >
2019-02-01 20:45:50 +01:00
< script type = "application/ld+json" >
{
"@context": "http://schema.org",
"@type": "Blog",
"headline": "CGSpace Notes",
2020-04-02 09:55:42 +02:00
"url" : "https://alanorth.github.io/cgspace-notes/",
2019-02-01 20:45:50 +01:00
"author": {
"@type": "Person",
"name": "Alan Orth"
},
2021-11-03 14:56:15 +01:00
"dateModified": "2021-11-02T22:27:07+02:00",
2020-11-16 09:54:00 +01:00
"keywords": "notes, migration, notes",
2020-04-02 09:55:42 +02:00
"description":"Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository."
2019-02-01 20:45:50 +01:00
}
< / script >
< link rel = "canonical" href = "https://alanorth.github.io/cgspace-notes/" >
< title > CGSpace Notes< / title >
2019-10-11 10:19:42 +02:00
2019-02-01 20:45:50 +01:00
<!-- combined, minified CSS -->
2020-01-23 19:19:38 +01:00
2021-01-24 08:46:27 +01:00
< link href = "https://alanorth.github.io/cgspace-notes/css/style.beb8012edc08ba10be012f079d618dc243812267efe62e11f22fe49618f976a4.css" rel = "stylesheet" integrity = "sha256-vrgBLtwIuhC+AS8HnWGNwkOBImfv5i4R8i/klhj5dqQ=" crossorigin = "anonymous" >
2019-10-11 10:19:42 +02:00
2019-02-01 20:45:50 +01:00
2020-01-28 11:01:42 +01:00
<!-- minified Font Awesome for SVG icons -->
2021-09-28 09:32:32 +02:00
< script defer src = "https://alanorth.github.io/cgspace-notes/js/fontawesome.min.f5072c55a0721857184db93a50561d7dc13975b4de2e19db7f81eb5f3fa57270.js" integrity = "sha256-9QcsVaByGFcYTbk6UFYdfcE5dbTeLhnbf4HrXz+lcnA=" crossorigin = "anonymous" > < / script >
2020-01-28 11:01:42 +01:00
2019-02-01 20:45:50 +01:00
<!-- RSS 2.0 feed -->
2019-04-14 15:59:47 +02:00
< link rel = "alternate" type = "application/rss+xml" href = "https://alanorth.github.io/cgspace-notes/index.xml" title = "CGSpace Notes" / >
2019-02-01 20:45:50 +01:00
< / head >
< body >
< div class = "blog-masthead" >
< div class = "container" >
< nav class = "nav blog-nav" >
< a class = "nav-link active" href = "https://alanorth.github.io/cgspace-notes/" > Home< / a >
< / nav >
< / div >
< / div >
< header class = "blog-header" >
< div class = "container" >
2019-10-11 10:19:42 +02:00
< h1 class = "blog-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/" rel = "home" > CGSpace Notes< / a > < / h1 >
< p class = "lead blog-description" dir = "auto" > Documenting day-to-day work on the < a href = "https://cgspace.cgiar.org" > CGSpace< / a > repository.< / p >
2019-02-01 20:45:50 +01:00
< / div >
< / header >
< div class = "container" >
< div class = "row" >
< div class = "col-sm-8 blog-main" >
2021-11-01 09:49:21 +01:00
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2018-09/" > September, 2018< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2018-09-02T09:55:54+03:00" > Sun Sep 02, 2018< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2018-09-02" > 2018-09-02< / h2 >
< ul >
< li > New < a href = "https://jdbc.postgresql.org/documentation/changelog.html#version_42.2.5" > PostgreSQL JDBC driver version 42.2.5< / a > < / li >
< li > I’ ll update the DSpace role in our < a href = "https://github.com/ilri/rmg-ansible-public" > Ansible infrastructure playbooks< / a > and run the updated playbooks on CGSpace and DSpace Test< / li >
< li > Also, I’ ll re-run the < code > postgresql< / code > tasks because the custom PostgreSQL variables are dynamic according to the system’ s RAM, and we never re-ran them after migrating to larger Linodes last month< / li >
< li > I’ m testing the new DSpace 5.8 branch in my Ubuntu 18.04 environment and I’ m getting those autowire errors in Tomcat 8.5.30 again:< / li >
< / ul >
< a href = 'https://alanorth.github.io/cgspace-notes/2018-09/' > Read more →< / a >
< / article >
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2018-08/" > August, 2018< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2018-08-01T11:52:54+03:00" > Wed Aug 01, 2018< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2018-08-01" > 2018-08-01< / h2 >
< ul >
< li > DSpace Test had crashed at some point yesterday morning and I see the following in < code > dmesg< / code > :< / li >
< / ul >
< pre tabindex = "0" > < code > [Tue Jul 31 00:00:41 2018] Out of memory: Kill process 1394 (java) score 668 or sacrifice child
[Tue Jul 31 00:00:41 2018] Killed process 1394 (java) total-vm:15601860kB, anon-rss:5355528kB, file-rss:0kB, shmem-rss:0kB
[Tue Jul 31 00:00:41 2018] oom_reaper: reaped process 1394 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
< / code > < / pre > < ul >
< li > Judging from the time of the crash it was probably related to the Discovery indexing that starts at midnight< / li >
< li > From the DSpace log I see that eventually Solr stopped responding, so I guess the < code > java< / code > process that was OOM killed above was Tomcat’ s< / li >
< li > I’ m not sure why Tomcat didn’ t crash with an OutOfMemoryError… < / li >
< li > Anyways, perhaps I should increase the JVM heap from 5120m to 6144m like we did a few months ago when we tried to run the whole CGSpace Solr core< / li >
< li > The server only has 8GB of RAM so we’ ll eventually need to upgrade to a larger one because we’ ll start starving the OS, PostgreSQL, and command line batch processes< / li >
< li > I ran all system updates on DSpace Test and rebooted it< / li >
< / ul >
< a href = 'https://alanorth.github.io/cgspace-notes/2018-08/' > Read more →< / a >
< / article >
2021-09-02 16:21:48 +02:00
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2018-07/" > July, 2018< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2018-07-01T12:56:54+03:00" > Sun Jul 01, 2018< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2018-07-01" > 2018-07-01< / h2 >
< ul >
< li > I want to upgrade DSpace Test to DSpace 5.8 so I took a backup of its current database just in case:< / li >
< / ul >
2021-09-13 15:21:16 +02:00
< pre tabindex = "0" > < code > $ pg_dump -b -v -o --format=custom -U dspace -f dspace-2018-07-01.backup dspace
2021-09-02 16:21:48 +02:00
< / code > < / pre > < ul >
< li > During the < code > mvn package< / code > stage on the 5.8 branch I kept getting issues with java running out of memory:< / li >
< / ul >
2021-09-13 15:21:16 +02:00
< pre tabindex = "0" > < code > There is insufficient memory for the Java Runtime Environment to continue.
2021-09-02 16:21:48 +02:00
< / code > < / pre >
< a href = 'https://alanorth.github.io/cgspace-notes/2018-07/' > Read more →< / a >
< / article >
2021-08-01 15:19:05 +02:00
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2018-06/" > June, 2018< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2018-06-04T19:49:54-07:00" > Mon Jun 04, 2018< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2018-06-04" > 2018-06-04< / h2 >
< ul >
< li > Test the < a href = "https://tracker.atmire.com/tickets-cgiar-ilri/view-ticket?id=560" > DSpace 5.8 module upgrades from Atmire< / a > (< a href = "https://github.com/ilri/DSpace/pull/378" > #378< / a > )
< ul >
< li > There seems to be a problem with the CUA and L& R versions in < code > pom.xml< / code > because they are using SNAPSHOT and it doesn’ t build< / li >
< / ul >
< / li >
< li > I added the new CCAFS Phase II Project Tag < code > PII-FP1_PACCA2< / code > and merged it into the < code > 5_x-prod< / code > branch (< a href = "https://github.com/ilri/DSpace/pull/379" > #379< / a > )< / li >
< li > I proofed and tested the ILRI author corrections that Peter sent back to me this week:< / li >
< / ul >
2021-09-13 15:21:16 +02:00
< pre tabindex = "0" > < code > $ ./fix-metadata-values.py -i /tmp/2018-05-30-Correct-660-authors.csv -db dspace -u dspace -p 'fuuu' -f dc.contributor.author -t correct -m 3 -n
2021-08-01 15:19:05 +02:00
< / code > < / pre > < ul >
< li > I think a sane proofing workflow in OpenRefine is to apply the custom text facets for check/delete/remove and illegal characters that I developed in < a href = "/cgspace-notes/2018-03/" > March, 2018< / a > < / li >
< li > Time to index ~70,000 items on CGSpace:< / li >
< / ul >
2021-09-13 15:21:16 +02:00
< pre tabindex = "0" > < code > $ time schedtool -D -e ionice -c2 -n7 nice -n19 [dspace]/bin/dspace index-discovery -b
2021-08-01 15:19:05 +02:00
real 74m42.646s
user 8m5.056s
sys 2m7.289s
< / code > < / pre >
< a href = 'https://alanorth.github.io/cgspace-notes/2018-06/' > Read more →< / a >
< / article >
2021-07-07 15:30:06 +02:00
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2018-05/" > May, 2018< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2018-05-01T16:43:54+03:00" > Tue May 01, 2018< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2018-05-01" > 2018-05-01< / h2 >
< ul >
< li > I cleared the Solr statistics core on DSpace Test by issuing two commands directly to the Solr admin interface:
< ul >
< li > http://localhost:3000/solr/statistics/update?stream.body=%3Cdelete%3E%3Cquery%3E*:*%3C/query%3E%3C/delete%3E< / li >
< li > http://localhost:3000/solr/statistics/update?stream.body=%3Ccommit/%3E< / li >
< / ul >
< / li >
< li > Then I reduced the JVM heap size from 6144 back to 5120m< / li >
< li > Also, I switched it to use OpenJDK instead of Oracle Java, as well as re-worked the < a href = "https://github.com/ilri/rmg-ansible-public" > Ansible infrastructure scripts< / a > to support hosts choosing which distribution they want to use< / li >
< / ul >
< a href = 'https://alanorth.github.io/cgspace-notes/2018-05/' > Read more →< / a >
< / article >
2021-06-03 20:54:49 +02:00
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2018-04/" > April, 2018< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2018-04-01T16:13:54+02:00" > Sun Apr 01, 2018< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2018-04-01" > 2018-04-01< / h2 >
< ul >
< li > I tried to test something on DSpace Test but noticed that it’ s down since god knows when< / li >
< li > Catalina logs at least show some memory errors yesterday:< / li >
< / ul >
< a href = 'https://alanorth.github.io/cgspace-notes/2018-04/' > Read more →< / a >
< / article >
2021-05-02 18:55:06 +02:00
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2018-03/" > March, 2018< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2018-03-02T16:07:54+02:00" > Fri Mar 02, 2018< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2018-03-02" > 2018-03-02< / h2 >
< ul >
< li > Export a CSV of the IITA community metadata for Martin Mueller< / li >
< / ul >
< a href = 'https://alanorth.github.io/cgspace-notes/2018-03/' > Read more →< / a >
< / article >
2021-04-05 18:36:44 +02:00
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2018-02/" > February, 2018< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2018-02-01T16:28:54+02:00" > Thu Feb 01, 2018< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2018-02-01" > 2018-02-01< / h2 >
< ul >
< li > Peter gave feedback on the < code > dc.rights< / code > proof of concept that I had sent him last week< / li >
< li > We don’ t need to distinguish between internal and external works, so that makes it just a simple list< / li >
< li > Yesterday I figured out how to monitor DSpace sessions using JMX< / li >
< li > I copied the logic in the < code > jmx_tomcat_dbpools< / code > provided by Ubuntu’ s < code > munin-plugins-java< / code > package and used the stuff I discovered about JMX < a href = "/cgspace-notes/2018-01/" > in 2018-01< / a > < / li >
< / ul >
< a href = 'https://alanorth.github.io/cgspace-notes/2018-02/' > Read more →< / a >
< / article >
2021-03-04 21:46:05 +01:00
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2018-01/" > January, 2018< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2018-01-02T08:35:54-08:00" > Tue Jan 02, 2018< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2018-01-02" > 2018-01-02< / h2 >
< ul >
< li > Uptime Robot noticed that CGSpace went down and up a few times last night, for a few minutes each time< / li >
< li > I didn’ t get any load alerts from Linode and the REST and XMLUI logs don’ t show anything out of the ordinary< / li >
< li > The nginx logs show HTTP 200s until < code > 02/Jan/2018:11:27:17 +0000< / code > when Uptime Robot got an HTTP 500< / li >
< li > In dspace.log around that time I see many errors like “ Client closed the connection before file download was complete” < / li >
< li > And just before that I see this:< / li >
< / ul >
2021-09-13 15:21:16 +02:00
< pre tabindex = "0" > < code > Caused by: org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-bio-127.0.0.1-8443-exec-980] Timeout: Pool empty. Unable to fetch a connection in 5 seconds, none available[size:50; busy:50; idle:0; lastwait:5000].
2021-03-04 21:46:05 +01:00
< / code > < / pre > < ul >
< li > Ah hah! So the pool was actually empty!< / li >
< li > I need to increase that, let’ s try to bump it up from 50 to 75< / li >
< li > After that one client got an HTTP 499 but then the rest were HTTP 200, so I don’ t know what the hell Uptime Robot saw< / li >
< li > I notice this error quite a few times in dspace.log:< / li >
< / ul >
2021-09-13 15:21:16 +02:00
< pre tabindex = "0" > < code > 2018-01-02 01:21:19,137 ERROR org.dspace.app.xmlui.aspect.discovery.SidebarFacetsTransformer @ Error while searching for sidebar facets
2021-03-04 21:46:05 +01:00
org.dspace.discovery.SearchServiceException: org.apache.solr.search.SyntaxError: Cannot parse 'dateIssued_keyword:[1976+TO+1979]': Encountered " " ]" " ] " " at line 1, column 32.
< / code > < / pre > < ul >
< li > And there are many of these errors every day for the past month:< / li >
< / ul >
2021-09-13 15:21:16 +02:00
< pre tabindex = "0" > < code > $ grep -c " Error while searching for sidebar facets" dspace.log.*
2021-03-04 21:46:05 +01:00
dspace.log.2017-11-21:4
dspace.log.2017-11-22:1
dspace.log.2017-11-23:4
dspace.log.2017-11-24:11
dspace.log.2017-11-25:0
dspace.log.2017-11-26:1
dspace.log.2017-11-27:7
dspace.log.2017-11-28:21
dspace.log.2017-11-29:31
dspace.log.2017-11-30:15
dspace.log.2017-12-01:15
dspace.log.2017-12-02:20
dspace.log.2017-12-03:38
dspace.log.2017-12-04:65
dspace.log.2017-12-05:43
dspace.log.2017-12-06:72
dspace.log.2017-12-07:27
dspace.log.2017-12-08:15
dspace.log.2017-12-09:29
dspace.log.2017-12-10:35
dspace.log.2017-12-11:20
dspace.log.2017-12-12:44
dspace.log.2017-12-13:36
dspace.log.2017-12-14:59
dspace.log.2017-12-15:104
dspace.log.2017-12-16:53
dspace.log.2017-12-17:66
dspace.log.2017-12-18:83
dspace.log.2017-12-19:101
dspace.log.2017-12-20:74
dspace.log.2017-12-21:55
dspace.log.2017-12-22:66
dspace.log.2017-12-23:50
dspace.log.2017-12-24:85
dspace.log.2017-12-25:62
dspace.log.2017-12-26:49
dspace.log.2017-12-27:30
dspace.log.2017-12-28:54
dspace.log.2017-12-29:68
dspace.log.2017-12-30:89
dspace.log.2017-12-31:53
dspace.log.2018-01-01:45
dspace.log.2018-01-02:34
< / code > < / pre > < ul >
< li > Danny wrote to ask for help renewing the wildcard ilri.org certificate and I advised that we should probably use Let’ s Encrypt if it’ s just a handful of domains< / li >
< / ul >
< a href = 'https://alanorth.github.io/cgspace-notes/2018-01/' > Read more →< / a >
< / article >
2021-02-01 11:28:54 +01:00
< article class = "blog-post" >
< header >
< h2 class = "blog-post-title" dir = "auto" > < a href = "https://alanorth.github.io/cgspace-notes/2017-12/" > December, 2017< / a > < / h2 >
< p class = "blog-post-meta" > < time datetime = "2017-12-01T13:53:54+03:00" > Fri Dec 01, 2017< / time > by Alan Orth in
< span class = "fas fa-folder" aria-hidden = "true" > < / span > < a href = "/cgspace-notes/categories/notes/" rel = "category tag" > Notes< / a >
< / p >
< / header >
< h2 id = "2017-12-01" > 2017-12-01< / h2 >
< ul >
< li > Uptime Robot noticed that CGSpace went down< / li >
< li > The logs say “ Timeout waiting for idle object” < / li >
< li > PostgreSQL activity says there are 115 connections currently< / li >
< li > The list of connections to XMLUI and REST API for today:< / li >
< / ul >
< a href = 'https://alanorth.github.io/cgspace-notes/2017-12/' > Read more →< / a >
< / article >
2019-02-01 20:45:50 +01:00
< nav class = "blog-pagination" >
< a class = "btn btn-outline-primary" href = "/cgspace-notes/page/4/" rel = "prev" role = " button " > Previous page< / a >
2019-11-04 15:41:19 +01:00
< a class = "btn btn-outline-primary" href = "/cgspace-notes/page/6/" rel = "next" role = "button" > Next page< / a >
2019-02-01 20:45:50 +01:00
< / nav >
< / div > <!-- /.blog - main -->
< aside class = "col-sm-3 ml-auto blog-sidebar" >
< section class = "sidebar-module" >
< h4 > Recent Posts< / h4 >
< ol class = "list-unstyled" >
2021-11-01 09:49:21 +01:00
< li > < a href = "/cgspace-notes/2021-11/" > November, 2021< / a > < / li >
< li > < a href = "/cgspace-notes/2021-10/" > October, 2021< / a > < / li >
2021-09-02 16:21:48 +02:00
< li > < a href = "/cgspace-notes/2021-09/" > September, 2021< / a > < / li >
2021-08-01 15:19:05 +02:00
< li > < a href = "/cgspace-notes/2021-08/" > August, 2021< / a > < / li >
2021-07-20 10:05:03 +02:00
< li > < a href = "/cgspace-notes/2021-07/" > July, 2021< / a > < / li >
2021-06-03 20:54:49 +02:00
2019-02-01 20:45:50 +01:00
< / ol >
< / section >
< section class = "sidebar-module" >
< h4 > Links< / h4 >
< ol class = "list-unstyled" >
< li > < a href = "https://cgspace.cgiar.org" > CGSpace< / a > < / li >
< li > < a href = "https://dspacetest.cgiar.org" > DSpace Test< / a > < / li >
< li > < a href = "https://github.com/ilri/DSpace" > CGSpace @ GitHub< / a > < / li >
< / ol >
< / section >
< / aside >
< / div > <!-- /.row -->
< / div > <!-- /.container -->
< footer class = "blog-footer" >
2019-10-11 10:19:42 +02:00
< p dir = "auto" >
2019-02-01 20:45:50 +01:00
Blog template created by < a href = "https://twitter.com/mdo" > @mdo< / a > , ported to Hugo by < a href = 'https://twitter.com/mralanorth' > @mralanorth< / a > .
< / p >
< p >
< a href = "#" > Back to top< / a >
< / p >
< / footer >
< / body >
< / html >