Samme indhold, URL'er og udseende, bygget af en enkelt zola-binær og Tailwind standalone-CLI uden Node. Kanonisk domæne er asger.weirsoe.dk. Blogindlæg ligger som page bundles med frontmatter Zola forstår, så de gamle stempler er ugyldige, indtil scripts/omstempl.py er kørt med PUBLISH_KEY. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
143 lines
6.8 KiB
HTML
143 lines
6.8 KiB
HTML
{% extends "base.html" %}
|
||
{% block main %}
|
||
{% set d = load_data(path="data/cv-en.json") %}
|
||
<h1 class="text-4xl font-bold tracking-tight">CV</h1>
|
||
<div class="mt-3 flex flex-wrap gap-x-4 gap-y-1 text-sm text-muted">
|
||
<span>Aalborg, Denmark</span>
|
||
<a class="text-accent hover:underline" href="mailto:asger@weirsoe.dk">asger@weirsoe.dk</a>
|
||
<a class="text-accent hover:underline" href="https://www.linkedin.com/in/ag-weirs%C3%B8e/">LinkedIn</a>
|
||
</div>
|
||
|
||
<p class="mt-6 max-w-2xl text-muted">
|
||
Technical Solution Architect who has worked on Danish national e-invoicing infrastructure
|
||
since 2021. I have led responses to production outages and security vulnerabilities,
|
||
coordinating engineers, hosting providers and the client, and I built an
|
||
information security management system around ISO/IEC 27001 with procedures for incident
|
||
response, escalation and post-incident review. M.Sc. in Computer Science, specialising in
|
||
security in distributed systems, and currently studying business administration alongside work.
|
||
</p>
|
||
|
||
<section class="mt-10">
|
||
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Areas of expertise</h2>
|
||
<p class="mt-4 max-w-2xl text-muted">
|
||
I work with <strong class="text-text">electronic invoicing</strong> and e-procurement. At CGI I helped
|
||
develop the open source eDelivery solution for NemHandel, built on the open source access point
|
||
<strong class="text-text">Oxalis</strong> (Java). Today I am a Technical Solution Architect at Digisense A/S,
|
||
working on solution architecture in the same field: <strong class="text-text">Peppol</strong> (BIS,
|
||
Access Point and eDelivery/AS4), <strong class="text-text">NemHandel</strong>,
|
||
<strong class="text-text">OIOUBL/UBL</strong> and the European e-invoicing standard EN 16931.
|
||
</p>
|
||
<div class="mt-4 flex flex-wrap gap-2">
|
||
{% for k in ["Peppol", "Peppol Access Point", "Oxalis", "NemHandel", "E-invoicing", "OIOUBL / UBL", "eDelivery (AS4)", "EN 16931", "E-procurement"] %}
|
||
<span class="wt-tag">{{ k }}</span>
|
||
{% endfor %}
|
||
</div>
|
||
</section>
|
||
|
||
<section class="mt-10">
|
||
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Incident response and compliance</h2>
|
||
<p class="mt-4 max-w-2xl text-muted">
|
||
When something breaks in production, the technical fix is only half of it. The other half is
|
||
getting the right people moving, keeping the client informed and learning from it afterwards.
|
||
During the <strong class="text-text">July 2024 CrowdStrike outage</strong> a database failure hit our
|
||
hosted production platform just as most of the team’s workstations went down. As tech lead on
|
||
CGI’s NemHandel team I coordinated by phone with the hosting provider and the one developer whose
|
||
machine still worked, and the database was restored that afternoon. When the critical SnakeYAML
|
||
vulnerability <strong class="text-text">CVE-2022-1471</strong> affected the NemHandel reference
|
||
implementation, we notified the client immediately, mitigation guidance went out to operators,
|
||
and we shipped a fixed release within two weeks.
|
||
</p>
|
||
<p class="mt-3 max-w-2xl text-muted">
|
||
At Digisense I built the information security management system around
|
||
<strong class="text-text">ISO/IEC 27001</strong>: incident management and escalation procedures,
|
||
post-incident reviews and an incident register. That is the work that has to be in place before
|
||
anything is on fire, so nobody has to invent the response as it happens.
|
||
</p>
|
||
</section>
|
||
|
||
<section class="mt-10">
|
||
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Experience</h2>
|
||
<div class="mt-4 space-y-4">
|
||
{% for e in d.work %}
|
||
<div class="wt-card">
|
||
<h3 class="font-semibold">{{ e.org }} <span class="font-normal text-muted">· {{ e.place }}</span></h3>
|
||
<div class="mt-3 space-y-3">
|
||
{% for r in e.roles %}
|
||
<div>
|
||
<div class="flex flex-wrap items-baseline justify-between gap-2">
|
||
<span class="font-medium text-text">{{ r.title }}</span>
|
||
<span class="text-xs text-muted">{{ r.when }}</span>
|
||
</div>
|
||
<ul class="mt-1 list-disc pl-5 text-sm text-muted">
|
||
{% for d in r.details %}<li>{{ d }}</li>{% endfor %}
|
||
</ul>
|
||
</div>
|
||
{% endfor %}
|
||
</div>
|
||
</div>
|
||
{% endfor %}
|
||
</div>
|
||
</section>
|
||
|
||
<section class="mt-10">
|
||
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Education</h2>
|
||
<div class="mt-4 space-y-4">
|
||
{% for u in d.education %}
|
||
<div class="wt-card">
|
||
<div class="flex flex-wrap items-baseline justify-between gap-2">
|
||
<h3 class="font-semibold">{{ u.what }}</h3><span class="text-xs text-muted">{{ u.when }}</span>
|
||
</div>
|
||
<p class="text-sm text-muted">{{ u.where }}</p>
|
||
{% if u.note %}<p class="mt-1 text-sm text-muted/80">{{ u.note }}</p>{% endif %}
|
||
</div>
|
||
{% endfor %}
|
||
</div>
|
||
</section>
|
||
|
||
<section class="mt-10">
|
||
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Publication</h2>
|
||
<div class="mt-4 wt-card">
|
||
<a href="https://arxiv.org/abs/2310.00999" target="_blank" rel="noopener" class="font-medium hover:text-accent">
|
||
CGAAL: Distributed On-The-Fly ATL Model Checker with Heuristics
|
||
</a>
|
||
<p class="mt-1 text-sm text-muted">
|
||
Carlsen, Frydenskov, Jensen, Rasmussen, Sørensen, <span class="text-text">Weirsøe</span>, Jensen & Larsen.
|
||
<em>EPTCS</em>, vol. 390 (2023), pp. 99–114. <span class="text-muted/80">arXiv:2310.00999</span>
|
||
</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="mt-10">
|
||
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Skills</h2>
|
||
<div class="mt-4 space-y-4">
|
||
{% for s in d.skills %}
|
||
<div>
|
||
<h3 class="text-sm font-medium text-text">{{ s.k }}</h3>
|
||
<div class="mt-2 flex flex-wrap gap-2">
|
||
{% for k in s.v %}<span class="wt-tag">{{ k }}</span>{% endfor %}
|
||
</div>
|
||
</div>
|
||
{% endfor %}
|
||
</div>
|
||
</section>
|
||
|
||
<section class="mt-10 grid gap-4 sm:grid-cols-2">
|
||
<div>
|
||
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Languages</h2>
|
||
<ul class="mt-4 space-y-2 text-sm">
|
||
<li class="wt-card wt-card--compact">Danish (native)</li>
|
||
<li class="wt-card wt-card--compact">English (fluent, spoken and written)</li>
|
||
</ul>
|
||
</div>
|
||
<div>
|
||
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Projects and interests</h2>
|
||
<p class="mt-4 text-sm text-muted">
|
||
I run a self-hosted Proxmox environment with around 50 containers and virtual machines,
|
||
single sign-on through Authentik, central logging and monitoring. My family uses it every day.
|
||
I have contributed to qutebrowser and Stregsystemet,
|
||
and I am a licensed radio amateur (call sign <strong class="text-text">OZ0AGW</strong>).
|
||
</p>
|
||
</div>
|
||
</section>
|
||
{% endblock %}
|