~ane/web

8ed0733588753671ba1f8170e3575453f15868b7 — Antoine Kalmbach 1 year, 10 months ago 94f642b master
Small redesign
52 files changed, 287 insertions(+), 334 deletions(-)

M Gemfile.lock
M _config.yml
M _includes/header.html
M _layouts/default.html
M _layouts/post.html
D _micro/01.md
D _micro/02.md
D _micro/03.md
D _micro/04.md
D _micro/05.md
D _micro/06.md
D _micro/07.md
D _micro/08.md
D _micro/09.md
D _micro/10.md
D _micro/11.md
D _micro/12.md
M _posts/2016-01-01-before-we-begin.md
M _posts/2016-01-08-the-expression-problem-as-a-litmus-test.md
M _posts/2016-01-26-are-my-services-talking-to-each-other.md
M _posts/2016-03-17-imprecision-and-abstraction.md
M _posts/2016-03-25-focus.md
M _posts/2016-10-26-web-development-has-become-weird.md
M _posts/2016-11-02-half-stack-web-frameworks.md
M _posts/2017-03-08-camel-abstractions.md
M _posts/2017-03-15-implicit-power.md
M _posts/2017-03-23-useless-interfaces.md
M _posts/2018-02-10-envisioning-a-new-tracing-system.adoc
M _posts/2018-03-22-the-joy-of-asciidoc.adoc
M _posts/2018-04-26-software-customization.asciidoc
M _posts/2018-09-16-the-runtime-configuration-problem.adoc
M _posts/2019-03-09-configuration.adoc
M _posts/2019-11-20-embedded-rust-wifi.md
M _posts/2020-03-07-winding-down.md
M _posts/2020-09-02-inside-the-machine.md
M _posts/2020-09-09-rmail.md
M _posts/2020-10-01-between-two-lisps.md
M _posts/2020-10-06-no-more-microblog.md
M _posts/2020-10-10-this-site.md
M _posts/2020-10-11-divergence.md
M _posts/2020-10-19-patches.md
M _posts/2020-10-30-guile-test-driver.md
M _posts/2020-12-06-goops-virtual-slots-and-ffi.md
M _posts/2020-12-08-five-years-of-blogging.md
M _posts/2021-07-28-this-website-is-now-on-sourcehut.md
M _posts/2022-06-20-beenthere-donethat.md
M about.md
M assets/override.scss
M assets/pygments.css
A index.html
D index.md
D micro.md
M Gemfile.lock => Gemfile.lock +40 -42
@@ 1,15 1,15 @@
GEM
  remote: http://rubygems.org/
  specs:
    activesupport (6.0.3.4)
    activesupport (6.1.6.1)
      concurrent-ruby (~> 1.0, >= 1.0.2)
      i18n (>= 0.7, < 2)
      minitest (~> 5.1)
      tzinfo (~> 1.1)
      zeitwerk (~> 2.2, >= 2.2.2)
    addressable (2.7.0)
      i18n (>= 1.6, < 2)
      minitest (>= 5.1)
      tzinfo (~> 2.0)
      zeitwerk (~> 2.3)
    addressable (2.8.0)
      public_suffix (>= 2.0.2, < 5.0)
    asciidoctor (2.0.10)
    asciidoctor (2.0.17)
    asciidoctor-bibliography (0.10.3)
      asciidoctor (>= 1.5.6)
      bibtex-ruby (~> 4.4.4)


@@ 23,42 23,43 @@ GEM
      latex-decode (~> 0.0)
    citeproc (1.0.10)
      namae (~> 1.0)
    citeproc-ruby (1.1.12)
    citeproc-ruby (1.1.14)
      citeproc (~> 1.0, >= 1.0.9)
      csl (~> 1.5)
      csl (~> 1.6)
    colorator (1.1.0)
    concurrent-ruby (1.1.7)
    csl (1.5.1)
    concurrent-ruby (1.1.10)
    csl (1.6.0)
      namae (~> 1.0)
    csl-styles (1.0.1.10)
      rexml
    csl-styles (1.0.1.11)
      csl (~> 1.0)
    em-websocket (0.5.2)
    em-websocket (0.5.3)
      eventmachine (>= 0.12.9)
      http_parser.rb (~> 0.6.0)
      http_parser.rb (~> 0)
    eventmachine (1.2.7)
    ffi (1.13.1)
    ffi (1.15.5)
    forwardable-extended (2.6.0)
    html-pipeline (2.14.0)
    html-pipeline (2.14.2)
      activesupport (>= 2)
      nokogiri (>= 1.4)
    http_parser.rb (0.6.0)
    i18n (1.8.5)
    http_parser.rb (0.8.0)
    i18n (1.12.0)
      concurrent-ruby (~> 1.0)
    jekyll (4.1.1)
    jekyll (4.2.2)
      addressable (~> 2.4)
      colorator (~> 1.0)
      em-websocket (~> 0.5)
      i18n (~> 1.0)
      jekyll-sass-converter (~> 2.0)
      jekyll-watch (~> 2.0)
      kramdown (~> 2.1)
      kramdown (~> 2.3)
      kramdown-parser-gfm (~> 1.0)
      liquid (~> 4.0)
      mercenary (~> 0.4.0)
      pathutil (~> 0.9)
      rouge (~> 3.0)
      safe_yaml (~> 1.0)
      terminal-table (~> 1.8)
      terminal-table (~> 2.0)
    jekyll-asciidoc (3.0.0)
      asciidoctor (>= 1.5.0)
      jekyll (>= 3.0.0)


@@ 71,53 72,50 @@ GEM
    jekyll-paginate (1.1.0)
    jekyll-redirect-from (0.16.0)
      jekyll (>= 3.3, < 5.0)
    jekyll-sass-converter (2.1.0)
    jekyll-sass-converter (2.2.0)
      sassc (> 2.0.1, < 3.0)
    jekyll-seo-tag (2.6.1)
      jekyll (>= 3.3, < 5.0)
    jekyll-seo-tag (2.8.0)
      jekyll (>= 3.8, < 5.0)
    jekyll-sitemap (1.4.0)
      jekyll (>= 3.7, < 5.0)
    jekyll-watch (2.2.1)
      listen (~> 3.0)
    kramdown (2.3.0)
    kramdown (2.4.0)
      rexml
    kramdown-parser-gfm (1.1.0)
      kramdown (~> 2.0)
    latex-decode (0.2.2)
      unicode (~> 0.4)
    liquid (4.0.3)
    listen (3.2.1)
    listen (3.7.1)
      rb-fsevent (~> 0.10, >= 0.10.3)
      rb-inotify (~> 0.9, >= 0.9.10)
    mercenary (0.4.0)
    mini_portile2 (2.3.0)
    minitest (5.14.2)
    multi_json (1.15.0)
    namae (1.0.1)
    minitest (5.16.2)
    namae (1.1.1)
    nokogiri (1.8.5)
      mini_portile2 (~> 2.3.0)
    pathutil (0.16.2)
      forwardable-extended (~> 2.6)
    posix-spawn (0.3.15)
    public_suffix (4.0.6)
    pygments.rb (1.2.1)
      multi_json (>= 1.0.0)
    rb-fsevent (0.10.4)
    public_suffix (4.0.7)
    pygments.rb (2.3.0)
    rb-fsevent (0.11.1)
    rb-inotify (0.10.1)
      ffi (~> 1.0)
    rexml (3.2.4)
    rouge (3.23.0)
    rexml (3.2.5)
    rouge (3.29.0)
    safe_yaml (1.0.5)
    sassc (2.4.0)
      ffi (~> 1.9)
    terminal-table (1.8.0)
    terminal-table (2.0.0)
      unicode-display_width (~> 1.1, >= 1.1.1)
    thread_safe (0.3.6)
    tzinfo (1.2.7)
      thread_safe (~> 0.1)
    tzinfo (2.0.5)
      concurrent-ruby (~> 1.0)
    unicode (0.4.4.4)
    unicode-display_width (1.7.0)
    zeitwerk (2.4.0)
    unicode-display_width (1.8.0)
    zeitwerk (2.6.0)

PLATFORMS
  ruby


@@ 136,4 134,4 @@ DEPENDENCIES
  pygments.rb

BUNDLED WITH
   2.1.4
   2.3.15

M _config.yml => _config.yml +1 -5
@@ 9,7 9,6 @@ paginate: 5
exclude: ["vendor"]
baseurl: ""
domain_name: 'http://ane.iki.fi'
highlighter: rouge

# Details for the RSS feed generator
url:            'http://ane.iki.fi'


@@ 26,10 25,7 @@ plugins:
  - jekyll-last-modified-at


collections:
  micro:
    output: true
    permalink: /:collection/:year:month:day:hour:minute
collections: []
  
twitter:
  username: anewtf

M _includes/header.html => _includes/header.html +18 -23
@@ 1,26 1,21 @@
<h1>
  Antoine Kalmbach
</h1>
<nav class="navbar">
  <ul>
    <li class="nav-item {% if page.title == 'Home' %} active {% endif %}">
      <a class="nav-link" href="/" itemprop="url"><span itemprop="name">Home</span></a>
    </li>
    <li class="nav-item {% if page.title == 'Archive' or page.layout == 'post' %} active{% endif %}">
      <a class="nav-link" href="/archive.html" itemprop="url"><span itemprop="name">Blog</span></a>
    </li>
    <li class="nav-item {% if page.title == 'About' %}active{% endif %}">
      <a class="nav-link" href="/about/" itemprop="url"><span itemprop="name">About</span></a>
    </li>
    <li class="nav-item {% if page.title == 'Index' %}active{% endif %}">
      <a class="nav-link" href="{% link tags.html %}" itemprop="url"><span itemprop="name">Index</span></a>
    </li>

    <li class="nav-item mr-n2">
      <a class="nav-link" href="/feed.xml"><i class="fa fa-rss" aria-hidden="true"></i> RSS</a>
    </li>
  </ul>
</nav>
<header class="main">
  <h1>
    Antoine Kalmbach's blog
  </h1>
  <nav>
    <ul>
      <li class="nav-item {% if page.title == 'Home' or page.layout == 'post' %} active{% endif %}">
        <a class="nav-link" href="/" itemprop="url"><span itemprop="name">Blog</span></a>
      </li>
      <li class="nav-item {% if page.title == 'About' %}active{% endif %}">
        <a class="nav-link" href="/about/" itemprop="url"><span itemprop="name">About</span></a>
      </li>
      <li class="nav-item mr-n2">
        <a class="nav-link" href="/feed.xml"><i class="fa fa-rss" aria-hidden="true"></i> RSS</a>
      </li>
    </ul>
  </nav>
</div>

<div class="h-card d-none" style="display: none">
  <img class="u-photo" src="/images/me.png" />

M _layouts/default.html => _layouts/default.html +1 -1
@@ 46,7 46,7 @@
      <footer>
        <hr>
        <address>
          {% assign changelog = site.pages | where: 'name', 'index.md' | first %}
          {% assign changelog = site.pages | where: 'name', 'index.html' | first %}
          {% if changelog  %}
            {% assign changed_date = changelog.last_modified_at | date: '%B %d, %Y' %}
          {% endif %}

M _layouts/post.html => _layouts/post.html +9 -0
@@ 4,14 4,23 @@ archive: false
post_class: post-template
---


<article class="h-entry">
  <header>
    {% include post-title.html post=page bip=page.title %}
    <link itemprop="mainEntityOfPage" itemscope itemtype="http://schema.org/BlogPosting" href="{{ post.url }}" />
  </header>

  {% if post.collection != "posts" %}
    {% assign coll = site.collections | where: "label", post.collection | first %}
    <em>This post is part of a series called {{ coll.title }}. {% if page.previous %} The previous entry in this series is <a href="{{ page.previous.url }}">{{ page.previous.title }}</a>. {% endif %} {% if page.next %} The next entry in this series is <a href="{{ page.next.url }}">{{ page.next.title }}</a>. {% endif %}</em>
  {% endif %}


  <div class="e-content">
    {{content}}
  </div>

  <small style="display: flex; justify-content: space-between;">
    {% if page.previous %}
      <em>

D _micro/01.md => _micro/01.md +0 -9
@@ 1,9 0,0 @@
---
layout: micro
date: 2020-06-13T00:00:00
title: ""
category: micro
---

Let's see if this thing can actually sync the post contents 
to [micro.blog](http://micro.blog). Interesting.

D _micro/02.md => _micro/02.md +0 -7
@@ 1,7 0,0 @@
---
layout: micro
title: ""
date: 2020-06-14T06:00:00
---

Well, here goes another. Let's see how this thing goes!

D _micro/03.md => _micro/03.md +0 -7
@@ 1,7 0,0 @@
---
layout: micro
title: ""
date: 2020-06-14T08:00:00
---

Ok, think I should be able to get multiple posts on the same day.

D _micro/04.md => _micro/04.md +0 -8
@@ 1,8 0,0 @@
---
layout: micro
title: ""
date: 2020-06-15T13:00:00Z
---

Cool. Now the microblogging feature is ready. Cross-posting should work 
and the individual µblog entry should work here as well!

D _micro/05.md => _micro/05.md +0 -11
@@ 1,11 0,0 @@
---
layout: micro
title: ""
date: 2020-06-16T10:23:33+03:00
---

Getting PCB designs ready for a prototype project done in KiCad.
Works now on a breadboard, soldered stripboard is next. What is it?
A white noise generator to help a baby fall asleep. It's digital,
I could've built an analog version but a µc solution costs less
and takes up less space. 

D _micro/06.md => _micro/06.md +0 -12
@@ 1,12 0,0 @@
---
layout: micro
title: ""
date: 2020-06-30T12:50:54+03:00
---

Built the white noise generator. Turns out the baby doesn't need white noise to
fall asleep anymore. Next: UV index detector. I'll use a regular [405 nm ultraviolet
LED](https://www.mouser.fi/ProductDetail/593-VAOL5EUV0T4) as a *sensor*!
LEDs [can act as light
detectors](http://www.thebox.myzen.co.uk/Workshop/LED_Sensing.html), they won't
be as precise as real photodiodes, but it'll be close enough. 

D _micro/07.md => _micro/07.md +0 -11
@@ 1,11 0,0 @@
---
layout: micro
title: ""
date: 2020-07-22T09:43:12+03:00
---

Having fun with analog electronics. Turns out it's much more fun (and
challenging) to eschew microcontrollers. Lots of things can be done with
op-amps, comparators, 555 timers and some of the intermediate-complex stuff 
can be done using CMOS4000 series digital ICs. All of this is dirt cheap! Even
those 4000 series ICs cost a third of the cheapest 8-bit AVR micros.

D _micro/08.md => _micro/08.md +0 -10
@@ 1,10 0,0 @@
---
layout: micro
title: ""
date: 2020-07-22T11:08:33+03:00
---

Testing Twitter cross-posting with [IFTT](https://ifttt.com/)! Found the method
in [this
article](https://ictsolved.github.io/auto-post-articles-from-jekyll-blog-to-social-sites/),
if it doesn't work I'll probably pay for micro.blog to do this for me.

D _micro/09.md => _micro/09.md +0 -11
@@ 1,11 0,0 @@
---
layout: micro
title: ""
date: 2020-07-22T11:38:11+03:00
---

Nice, [IFTTT cross-posting to Twitter](http://ane.github.io/micro/202007220808)
works. It'll sync stuff on my own site to Twitter, but replies won't be
visible, doesn't matter. I was after [POSSE](https://indieweb.org/POSSE) anyway.
Webmention replies *should* work but Twitter doesn't support that - I won't see
Twitter replies.

D _micro/10.md => _micro/10.md +0 -9
@@ 1,9 0,0 @@
---
layout: micro
title: ""
date: 2020-09-02T12:48:20+03:00
---

Did some style changes on the site. Narrowed down the body width and changed
fonts to serif. I'll probably change it again in a year, but that's the fun
part. It's never finished!

D _micro/11.md => _micro/11.md +0 -9
@@ 1,9 0,0 @@
---
layout: micro
title: ""
date: 2020-09-04T15:42:24+03:00
---

Configured Emacs and [mu4e](https://www.djcbsoftware.nl/code/mu/mu4e.html) for
reading mail, [offlineimap](http://www.offlineimap.org/) for retrieval and
[msmtp](https://marlam.de/msmtp/) for sending it. That was surprisingly easy.

D _micro/12.md => _micro/12.md +0 -9
@@ 1,9 0,0 @@
---
layout: micro
title: ""
date: 2020-09-24T12:25:25+03:00
---

Some frontpage updates. Created a single stream of updates, probably easier to
follow the order of things. Also disabled IFTTT for now. I don’t really care
who reads what I do on Twitter!

M _posts/2016-01-01-before-we-begin.md => _posts/2016-01-01-before-we-begin.md +1 -0
@@ 4,6 4,7 @@ date: 2016-01-01
tags: meta
layout: post
disqus: true
summary: Taking a step back by going two steps forward
---

Now that the design of the site is finished, I can finally focus on the essentials.

M _posts/2016-01-08-the-expression-problem-as-a-litmus-test.md => _posts/2016-01-08-the-expression-problem-as-a-litmus-test.md +1 -0
@@ 6,6 6,7 @@ tags:
- programming
- ocaml
title: The expression problem as a litmus test 
summary: Measuring programming language power of expression
---

The [expression problem](https://en.wikipedia.org/wiki/Expression_problem) is a famous problem in

M _posts/2016-01-26-are-my-services-talking-to-each-other.md => _posts/2016-01-26-are-my-services-talking-to-each-other.md +1 -0
@@ 6,6 6,7 @@ date: 2016-01-26
tags: 
  - architecture
  - distributed
summary: Can you be sure of the obvious?
---

I am faced with an interesting thought experiment, which asks:

M _posts/2016-03-17-imprecision-and-abstraction.md => _posts/2016-03-17-imprecision-and-abstraction.md +1 -0
@@ 6,6 6,7 @@ date: 2016-03-17
tags: 
  - programming
  - math
summary: Generalization always loses information
---

What is the point of abstractions? 

M _posts/2016-03-25-focus.md => _posts/2016-03-25-focus.md +1 -0
@@ 8,6 8,7 @@ tags:
  - scala
  - haskell
  - clojure
summary: Programming languages should have a mission and a vision
---

Focus is a design element in programming languages that I think deserves more attention than it

M _posts/2016-10-26-web-development-has-become-weird.md => _posts/2016-10-26-web-development-has-become-weird.md +1 -0
@@ 4,6 4,7 @@ date: 2016-10-25
layout: post
tags:
  - web
summary: Single-page applications will kill the web
---

Call me old-fashioned, call me a curmudgeon, but I think web development has become stupid and

M _posts/2016-11-02-half-stack-web-frameworks.md => _posts/2016-11-02-half-stack-web-frameworks.md +1 -0
@@ 8,6 8,7 @@ tags:
  - ruby
  - react
  - javascript
summary: A modern alternative to single-page apps
---

In my previous post, I discussed [how web development had become weird]({% post_url

M _posts/2017-03-08-camel-abstractions.md => _posts/2017-03-08-camel-abstractions.md +1 -0
@@ 7,6 7,7 @@ tags:
  - java
  - clojure
  - camel
summary: In the world of complex systems, nothing is free
---

[Apache Camel](http://camel.apache.org/) is a routing and mediation engine. If that doesn't say

M _posts/2017-03-15-implicit-power.md => _posts/2017-03-15-implicit-power.md +1 -0
@@ 4,6 4,7 @@ title: Implicit power
date: 2017-03-15T00:00:00
tags:
  - scala
summary: The many faces of Scala implicits
---

Scala gets lots of flak for implicits. Some of the feedback is justified: implicits in Scala can be

M _posts/2017-03-23-useless-interfaces.md => _posts/2017-03-23-useless-interfaces.md +1 -0
@@ 6,6 6,7 @@ disqus: true
tags:
  - programming
  - scala
summary: Sometimes abstractions add just noise
---

A feature that often frustrates me in object-oriented code is the prevalence of useless

M _posts/2018-02-10-envisioning-a-new-tracing-system.adoc => _posts/2018-02-10-envisioning-a-new-tracing-system.adoc +1 -0
@@ 3,6 3,7 @@
:page-liquid:
:page-tags: [distributed, tracing]
:page-description: We can tell where we are by knowing the time and looking at stars. Can we do the same with distributed software systems?
:page-summary: Can you do magic without instrumentation?

I've begun designing a new kind of tracing system for distributed
systems. With tracing system I mean something like Zipkin or Prometheus:

M _posts/2018-03-22-the-joy-of-asciidoc.adoc => _posts/2018-03-22-the-joy-of-asciidoc.adoc +1 -0
@@ 3,6 3,7 @@
:page-liquid:
:page-tags: [meta]
:page-description: Markdown has many limitations, AsciiDoc has few. Converting this site to AsciiDoc was not as easy as I thought, as I had to ditch the standard Github Jekyll integration, and build my own.
:page-summary: When plain Markdown isn't enough

I have always used https://jekyllrb.com/[Jekyll] on
https://pages.github.com/[Github Pages] to host this site. It's always been very

M _posts/2018-04-26-software-customization.asciidoc => _posts/2018-04-26-software-customization.asciidoc +1 -0
@@ 3,6 3,7 @@
:xrefstyle: short
:sectanchors:
:page-description: I have been thinking long and hard about how to do software customization properly at a software architecture level.  I don't want to claim that I have figured things out, but I offer what I think is a reasonably abstract solution, if that makes sense.
:page-summary: You can't please everyone, but you may try

[[two-versions]]
[role="float-sm-right half ml-sm-3"]

M _posts/2018-09-16-the-runtime-configuration-problem.adoc => _posts/2018-09-16-the-runtime-configuration-problem.adoc +1 -0
@@ 4,6 4,7 @@
:page-tag: architecture
:page-description: Configuring continuously running applications is a tricky problem. Effecting a new configuration alters application behavior, but this doesn't always happen instantly. I explore various ways for ensuring these transitions happen smoothly.
:xrefstyle: short
:page-summary: Tweaking the brain of a live system

Here's an interesting problem: suppose you have an event-driven system that
needs to respond to events in while the system is running, as they happen, and

M _posts/2019-03-09-configuration.adoc => _posts/2019-03-09-configuration.adoc +1 -0
@@ 4,6 4,7 @@
:page-liquid:
:page-description: Customizing software products can be done by creating derivate products by altering what is known as the baseline product. This results in effectively new products, and managing them involves complicated logistics. What if we brought all the custom features _inside_ the baseline, and used configuration to choose from the baseline what goes into the custom versions?
:figure-caption!:
:page-summary: Configuring complicated software is complicated

This post is a part of series on link:{% post_url
2018-04-26-software-customization %}[software product customization]. Here, I

M _posts/2019-11-20-embedded-rust-wifi.md => _posts/2019-11-20-embedded-rust-wifi.md +1 -0
@@ 2,6 2,7 @@
layout: post
title: Embedded Rust and WiFi
date: 2019-11-20T00:00:00
summary: Exploration of various WiFi chips with Rust support
---

Earlier this year, in May or so, I started having fun with hobby electronics,

M _posts/2020-03-07-winding-down.md => _posts/2020-03-07-winding-down.md +1 -0
@@ 2,6 2,7 @@
title: Winding down
layout: post
date: 2020-03-07T00:00:00
summary: Typing code for fun and profit is both fun and profitable?
---

I find it curious I can get paid for programming and still practise programming

M _posts/2020-09-02-inside-the-machine.md => _posts/2020-09-02-inside-the-machine.md +1 -0
@@ 2,6 2,7 @@
title: Inside the machine
layout: post
date: 2020-09-03T09:34:03+03:00
summary: Why live introspection of programs is awesome
---

One of the most interesting aspects of programming is the ability to inspect *and

M _posts/2020-09-09-rmail.md => _posts/2020-09-09-rmail.md +7 -4
@@ 4,12 4,15 @@ title: Back to Rmail
date: 2020-09-09T13:55:56+03:00
tags: 
  - emacs
summary: Switching back to Rmail, the standard Emacs email reader
---

While I initially [wrote about switching to mu4e]({% link _micro/11.md %}), I was initially
pleased by it, but then I found out about [Rmail](https://www.gnu.org/software/emacs/manual/html_node/emacs/Rmail.html#Rmail). <!--break-->Rmail is
kind of like the standard Emacs email reader. [Gnus](https://www.gnu.org/software/emacs/manual/html_node/gnus/index.html#Top) is pretty
comprehensive in terms of features but I was kind of put off by its
While I initially began using mu4e, I was initially pleased by it, but then I
found out about
[Rmail](https://www.gnu.org/software/emacs/manual/html_node/emacs/Rmail.html#Rmail). <!--break-->Rmail
is kind of like the standard Emacs email
reader. [Gnus](https://www.gnu.org/software/emacs/manual/html_node/gnus/index.html#Top)
is pretty comprehensive in terms of features but I was kind of put off by its
complexity.

So, eventually, my setup became the following:

M _posts/2020-10-01-between-two-lisps.md => _posts/2020-10-01-between-two-lisps.md +1 -0
@@ 2,6 2,7 @@
layout: post
title: Between two Lisps
date: 2020-10-05T17:03:41+03:00
summary: My experiences of Guile and Common Lisp
---

Out of all Lisps the ones I’ve come to appreciate the most are [Scheme](https://en.wikipedia.org/wiki/Scheme_(programming_language)) and [Common

M _posts/2020-10-06-no-more-microblog.md => _posts/2020-10-06-no-more-microblog.md +8 -10
@@ 2,21 2,19 @@
layout: post
title: No more microblog
date: 2020-10-06T16:56:28+03:00
summary: It was fun while it lasted
---

The [microblog]({% link micro.md %}) is no more. I got this idea due to a sudden
realization: there is no minimum length to a blog post. Any microblog post was
just a short blog post. Perhaps the idea with it was to participate in the 
The microblog is no more. I got this idea due to a sudden realization: there is
no minimum length to a blog post. Any microblog post was just a short blog
post. Perhaps the idea with it was to participate in the
[IndieWeb](https://indieweb.org/) zeitgeist, but in the end I realized I’m not
interested in posting that much short-form content. Twitter is just noise, why
would any federated version of it be less noise?

So, the microblog is gone. I’ll keep the [page]({% link micro.md %}) around but
this page will be the only place linking to it. 

Perhaps this will affect my blogging frequency, perhaps not. One thing that will
be different is the blog will focus on informal writings, perhaps even to just
say *I ate a nice pizza today*, and I’ll start working on having a content
vs. journal style separation between the blog.
So, the microblog is gone. Perhaps this will affect my blogging frequency,
perhaps not. One thing that will be different is the blog will focus on informal
writings, perhaps even to just say *I ate a nice pizza today*, and I’ll start
working on having a content vs. journal style separation between the blog.

Maybe.

M _posts/2020-10-10-this-site.md => _posts/2020-10-10-this-site.md +7 -5
@@ 2,6 2,7 @@
layout: post
date: 2020-10-03
title: How I built this website
summary: Documenting the origin of this website
---

Sometimes people ask me (well, one person did) how I actually author content on


@@ 39,10 40,11 @@ often it needs to be an informal journal, otherwise I will set the posting
standard too high and not post.
 
Fast forward to 2020 I ended up revitalizing my interest on this site, and this
happened almost by accident. I created a [created a microblog]({% link _micro/01.md %}) and then [ended it]({% post_url 2020-10-06-no-more-microblog %}),
because I realized it made no sense to have a blog with an arbitrary minimum
post length. Then I realized I need to actually have more than just blog posts,
many of the blog posts I have are actually quite [gargantuan in size]({% post_url 2018-04-26-software-customization %}). 
happened almost by accident. I created a microblog and then [ended it]({%
post_url 2020-10-06-no-more-microblog %}), because I realized it made no sense
to have a blog with an arbitrary minimum post length. Then I realized I need to
actually have more than just blog posts, many of the blog posts I have are
actually quite [gargantuan in size]({% post_url 2018-04-26-software-customization %}).

So I started to transition the site towards the blog being, well, just an online
journal of sorts. More structured content is grouped and assembled into the


@@ 55,7 57,7 @@ readers.
### Infrastructure ###

This site is a fairly standard [Jekyll](http://jekyllrb.com) static website. The site is divided into
two principal sections: content and [blog]({% link archive.html %}). Posts are written primarily in
two principal sections: content and [blog]({% link index.html %}). Posts are written primarily in
Markdown. The site is versioned using Git and hosted at
[sourcehut](https://git.sr.ht/~ane/web), a [builds.sr.ht job](https://git.sr.ht/~ane/web/tree/master/item/.build.yml)
builds the site after every commit and then pushes the contents to [pages.sr.ht](srht.site).

M _posts/2020-10-11-divergence.md => _posts/2020-10-11-divergence.md +2 -0
@@ 3,6 3,8 @@ layout: post
title: |-
  Divergence: A website is born
date: 2020-10-11T13:32:21+03:00
summary: |-
  The blog becomes its own section on this site (update: this is no longer true)
---

Some readers might have noticed a new section appearing on the [front page]({{ site.url }}). It's

M _posts/2020-10-19-patches.md => _posts/2020-10-19-patches.md +1 -0
@@ 9,6 9,7 @@ tags:
  - emacs
  - git
  - lisp
summary: How to send Git patches from Emacs
---

Git was initially designed around emails.  Modern [Git forges](https://en.wikipedia.org/wiki/Forge_(software)) have co-opted the

M _posts/2020-10-30-guile-test-driver.md => _posts/2020-10-30-guile-test-driver.md +1 -0
@@ 11,6 11,7 @@ tags:
  - guile
  - meson
  - autoconf
summary: A [Meson](http://mesonbuild.com) compatible test runner for [GNU Guile](http://www.gnu.org/software/guile)
---

The other day I was playing around with the [Meson](https://mesonbuild.com/)

M _posts/2020-12-06-goops-virtual-slots-and-ffi.md => _posts/2020-12-06-goops-virtual-slots-and-ffi.md +1 -0
@@ 11,6 11,7 @@ tags:
  - scheme
  - guile
  - recutils
summary: "Interfacing with C code using object-oriented programming in Scheme"
---

For the past month or so I've been contributing to [GNU Recutils](https://www.gnu.org/software/recutils/), a set of tools

M _posts/2020-12-08-five-years-of-blogging.md => _posts/2020-12-08-five-years-of-blogging.md +1 -0
@@ 3,6 3,7 @@ date: 2020-12-08T15:36:12+02:00
title: Guile fun times, and blog update
tags: [guile, meta]
layout: post
summary: Celebrating five years of blogging
---

Holy crap, [it's been five years]({% post_url 2015-12-07-start-once-software %})! Time passes so quickly. What can happen in five

M _posts/2021-07-28-this-website-is-now-on-sourcehut.md => _posts/2021-07-28-this-website-is-now-on-sourcehut.md +1 -0
@@ 3,6 3,7 @@ date: 2021-07-28T14:17:14+03:00
title: This website is now hosted on sourcehut
tags: [meta, sourcehut]
layout: post
summary: I'm moving away from Github Pages
---

I've been meaning to move away from [Github Pages](https://pages.github.com/) to

M _posts/2022-06-20-beenthere-donethat.md => _posts/2022-06-20-beenthere-donethat.md +1 -0
@@ 3,6 3,7 @@ layout: post
title: Been there, done that
date: 2022-06-21T00:00:00Z
tags: [bash]
summary: "Bookmarks for your shell history"
---

Shell history and browser history, I could do without one but not the other! I

M about.md => about.md +1 -1
@@ 6,7 6,7 @@ permalink: /about/

## About me

<img title="I, in picture form" class="me-pic" src="/images/me.png" width="125" />
<img title="I, in picture form" class="me-pic" src="/images/me.png" width="150" />

I work as a software architect at [Qvantel](http://www.qvantel.com), where I
build software for the telecom industry. I live in Jyväskylä, Finland with my

M assets/override.scss => assets/override.scss +66 -0
@@ 33,6 33,71 @@ a {
    }
}

ul.posts {
    padding-left: 0;

    .grey {
        color: #888;
    }
    
    li.unstyled {
        list-style-type: none;
        margin-bottom: 1rem;

        p {
            margin-top: 0;
        }
    }    
}

aside.intro {
    @media screen and (max-width: 1024px) {
        display: none;
    }
    @media screen and (min-width: 1024px) {
        float: right;
        width: 175px;
    }
}

header.main {
    @media screen and (min-width: 1024px) {
        display: flex;
        justify-content: space-between;
        align-items: baseline;
    }
    
    border-bottom: 1px solid #333;
    margin-bottom: 2rem;

    h1 {
        margin-bottom: 0;
        @media screen and (max-width: 1024px) {
            font-size: 150%;
        }
    }

    nav {
        ul {
            padding-left: 0;
            margin-bottom: 0;
            list-style-type: none;
            display: flex;
            flex-direction: row;
            li {
                padding-left: 1em;
                &:first-child {
                    padding-left: 0;
                }
                &.active {
                    font-weight: bold;
                }
            }
        }
    }
}


ul {
    li a.active {
        font-weight: bold;


@@ 88,6 153,7 @@ pre.highlight {
    padding: 0.5rem 1rem;
    border-radius: 4px;
    color: #303030;
    background-color: #f8f8f8;
    font-size: 85%;
}


M assets/pygments.css => assets/pygments.css +54 -64
@@ 1,69 1,59 @@
.highlight .hll { background-color: #ffffcc }
.highlight  { background: #f8f8f8; }
.highlight .c { color: #408080; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .c { color: #999988; font-style: italic } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { font-weight: bold } /* Keyword */
.highlight .o { font-weight: bold } /* Operator */
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #999999 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #7D9029 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
.highlight .no { color: #880000 } /* Name.Constant */
.highlight .nd { color: #AA22FF } /* Name.Decorator */
.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0000FF } /* Name.Function */
.highlight .nl { color: #A0A000 } /* Name.Label */
.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { font-weight: bold } /* Keyword.Constant */
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
.highlight .kn { font-weight: bold } /* Keyword.Namespace */
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #009999 } /* Literal.Number */
.highlight .s { color: #bb8844 } /* Literal.String */
.highlight .na { color: #008080 } /* Name.Attribute */
.highlight .nb { color: #999999 } /* Name.Builtin */
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
.highlight .no { color: #008080 } /* Name.Constant */
.highlight .ni { color: #800080 } /* Name.Entity */
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
.highlight .nn { color: #555555 } /* Name.Namespace */
.highlight .nt { color: #000080 } /* Name.Tag */
.highlight .nv { color: #008080 } /* Name.Variable */
.highlight .ow { font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #666666 } /* Literal.Number.Bin */
.highlight .mf { color: #666666 } /* Literal.Number.Float */
.highlight .mh { color: #666666 } /* Literal.Number.Hex */
.highlight .mi { color: #666666 } /* Literal.Number.Integer */
.highlight .mo { color: #666666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0000FF } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */
.highlight .mf { color: #009999 } /* Literal.Number.Float */
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
.highlight .sb { color: #bb8844 } /* Literal.String.Backtick */
.highlight .sc { color: #bb8844 } /* Literal.String.Char */
.highlight .sd { color: #bb8844 } /* Literal.String.Doc */
.highlight .s2 { color: #bb8844 } /* Literal.String.Double */
.highlight .se { color: #bb8844 } /* Literal.String.Escape */
.highlight .sh { color: #bb8844 } /* Literal.String.Heredoc */
.highlight .si { color: #bb8844 } /* Literal.String.Interpol */
.highlight .sx { color: #bb8844 } /* Literal.String.Other */
.highlight .sr { color: #808000 } /* Literal.String.Regex */
.highlight .s1 { color: #bb8844 } /* Literal.String.Single */
.highlight .ss { color: #bb8844 } /* Literal.String.Symbol */
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #008080 } /* Name.Variable.Class */
.highlight .vg { color: #008080 } /* Name.Variable.Global */
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */

A index.html => index.html +48 -0
@@ 0,0 1,48 @@
---
layout: default
title: Home
cover: false
about: 'about.html'
---

<aside class="intro">
  <img title="I, in picture form" class="me-pic" src="/images/me.png" width="175" />

  <p>
    <b>Hello! I'm Antoine.</b> 
  </p>
  <p>
    Welcome to my website. I am computer programmer from Finland, working at <a href="http://www.qvantel.com">Qvantel</a>,
    building software for the telecom sector.
  </p>

  <p>
    Send any comments or suggestions to my <a href="https://lists.sr.ht/~ane/public-inbox">public inbox</a>
    or my <a href="mailto:ane@iki.fi">personal mail address</a>.
  </p>

  <p>
    Find me on <a href="http://sr.ht/~ane">SourceHut</a> and <a href="http://github.com/ane">GitHub</a>.
</aside>

<ul class="posts">
  {% assign all = site.documents | sort: "date" | reverse %}
  {% for p in all %}
    <li class="unstyled">

      <div>
        <a href="{{ p.url }}">{{ p.title }}</a>
        {% if p.collection and p.collection != "posts" %}
          {% assign coll = site.collections | where: "label", p.collection | first %}
          {% assign page = site.pages | where: "title", coll.title | first %}

          ({% if page %}<a href="{{ page.url }}">{{ coll.title }}</a>{% else %}{{ coll.title }}{% endif %}, Part {{ p.order }})
        {% endif %}
        <time class="post-meta">{{ p.date | date: '%B %d, %Y' }}</time>
      </div>
      {% if p.summary %}
        <div>{{ p.summary | markdownify }}</div>
      {% endif %}
    </li>
  {% endfor %}
</ul>

D index.md => index.md +0 -41
@@ 1,41 0,0 @@
---
layout: default
title: Home
cover: false
about: 'about.html'
---

![./images/me.png](./images/me.png){: .me-pic width="150px"}

**Hello! I'm Antoine**. Welcome to my website. I am computer programmer and
electronics enthusiast from Finland. I work at [Qvantel](http://www.qvantel.com)
a software architect for the telecom sector. Before that, I used to work in
logistics optimization, before that I did research at a university, and way
before that I got my start in web design.

On this site you can find various content related to computers, electronics and
all sorts of fun nonsense. There’s a [blog](/archive.html), in which I post
rather infrequently.

If you have any comments or suggestions you can send them to my [public
inbox](https://lists.sr.ht/~ane/public-inbox) which is a mailing list serving
as a discussion forum for my projects, including this website. Preferably, use
the mailing list unless your message for one reason or the other is private, in
which case you can use my [personal mail address](mailto:ane@iki.fi). 

### Latest blog posts

<ul>
  {% assign all = site.posts | sort: "date" | reverse %}
  {% for p in all limit:10 %}
    <li>
      <div style="float: right; margin-left: 1rem;">
        <em>{{ p.date | date: '%B %d, %Y' }}</em>
      </div>

      <a href="{{ p.url }}">{{ p.title }}</a>
    </li>
  {% endfor %}
</ul>

For more, have a look at the <a href="/archive.html">blog archive</a>.

D micro.md => micro.md +0 -25
@@ 1,25 0,0 @@
---
layout: page
permalink: /micro
title: Microblog
---

{:.text-muted}
This is my microblog. This is cross posted to
[micro.blog/ane](http://micro.blog/ane). There is a [RSS feed](/feed-micro.xml) available.

{% assign micro = site.micro | sort: 'date' | reverse %}

{% for post in micro %}
<div class="micro micro-lg" id="{{ post.date | date: "%Y%m%d%H%M" }}">
  <h6 class="text-uppercase">
    <a style="color: #bbb;" href="{{ site.url }}{{ post.url }}">{{ post.date | date: "%A, %B %d, %Y at %H:%M" }}</a>
  </h6>
  
  {{ post.content }}
  
  {% unless forloop.last %}
    <hr class="my-4"/>
  {% endunless %}
</div>
{% endfor %}