Files
pw/src/pages/en/cv.astro
T
Asger Geel Weirsøe 490835e6ae
Build & Deploy / deploy (push) Successful in 2m48s
Use the theme's cards, buttons, inputs and filter buttons everywhere
Every hand-written card, button, input, the profiler's filter buttons, the
upload area, the chat bubbles, the nav links and the shortcut key now use
Weircon-wind components. The theme is imported into Tailwind's components
layer so utilities on the same element still apply.

Claude-Session: https://claude.ai/code/session_012LCTmU2ewo8tnM1dByYAoG
2026-10-29 18:52:00 +01:00

182 lines
10 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
import Base from '../../layouts/Base.astro';
import { SITE } from '../../consts';
const work = [
{
org: 'Digisense A/S', place: 'Denmark', roles: [
{ title: 'Technical Solution Architect', when: 'May 2026 – present', details: ['Built the company’s information security management system around ISO/IEC 27001, including incident management and escalation procedures, post-incident reviews and an incident register', 'Technical point of contact across engineering, sales and support for a Peppol and NemHandel access point provider', 'Solution design for customer projects'] },
],
},
{
org: 'CGI Danmark', place: 'Aalborg', roles: [
{ title: 'Tech Lead, NemHandel', when: 'Aug 2023 – May 2026', details: ['Technical lead on CGI’s NemHandel team and the client’s technical adviser', 'Led the response to CVE-2022-1471 (SnakeYAML, remote code execution) in the NemHandel reference implementation: the client was notified immediately, mitigation guidance went out to operators, and the team shipped a fixed release within two weeks', 'Coordinated recovery from a production database failure during the July 2024 CrowdStrike outage, when most team workstations were unavailable', 'Translated client requirements for the development team'] },
{ title: 'Senior Consultant', when: 'Apr 2023 – May 2026', details: ['Mentored a newly hired developer', 'Delivered installation webinars for the NemHandel reference implementation'] },
{ title: 'Consultant', when: 'Aug 2022 – Apr 2023', details: ['Developed the open source NemHandel eDelivery reference implementation (Java, built on Oxalis)', 'Solution architect on the project'] },
{ title: 'Student Developer', when: 'Aug 2020 – Aug 2022', details: ['Owned a rules engine (Java, Drools)', 'Deployment and operations (Docker, Docker Compose, Linux)'] },
{ title: 'Consultant', when: 'Jun 2019 – Aug 2020', details: ['Frontend (Angular, TypeScript)', 'Backend (Go, Java, Python)'] },
],
},
{
org: 'BilligVVS', place: 'Egå', roles: [
{ title: 'Full-stack Developer', when: 'Sep 2018 – Jun 2019', details: ['Webshop checkout and shipping integration (Python, TypeScript)', 'Movex ERP integration', 'Internal BI dashboards (Python, Chart.js)'] },
],
},
];
const education = [
{ what: 'HD Part 1, Business Administration', where: 'Aalborg University', when: '2025 – 2027 (in progress)', note: 'Business economics, accounting and finance.' },
{ what: 'M.Sc. in Computer Science (cand.scient.)', where: 'Aalborg University', when: '2020 – 2022', note: 'Specialisation in security in distributed systems. Thesis: Thread-Fuzz, mutation-based behavioural blackbox fuzzing of Thread.' },
{ what: 'B.Sc. in Computer Science', where: 'Aalborg University', when: '2015 – 2018', note: '' },
];
const skills = [
{ k: 'Incident response', v: ['Incident coordination', 'Escalation', 'Stakeholder communication', 'Vulnerability response', 'Post-incident review'] },
{ k: 'Compliance and security', v: ['ISO/IEC 27001', 'ISMS', 'Information security'] },
{ k: 'E-invoicing', v: ['Peppol', 'eDelivery (AS4)', 'Oxalis', 'NemHandel', 'OIOUBL / UBL', 'EN 16931'] },
{ k: 'Infrastructure', v: ['Linux', 'Docker', 'Kubernetes', 'AWS', 'Proxmox', 'Datadog'] },
{ k: 'Development', v: ['Java', 'Python', 'Go', 'TypeScript', 'Angular', 'C#', 'PostgreSQL', 'RabbitMQ', 'Git / GitLab', 'Jenkins'] },
];
---
<Base title="CV" description="Asger Weirsøe, computer scientist and Technical Solution Architect. Incident response, ISO/IEC 27001 compliance and national e-invoicing infrastructure."
lang="en" alternates={[{ lang: 'da', path: '/cv' }, { lang: 'en', path: '/en/cv' }]}>
<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:${SITE.email}`}>{SITE.email}</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">
{['Peppol', 'Peppol Access Point', 'Oxalis', 'NemHandel', 'E-invoicing', 'OIOUBL / UBL', 'eDelivery (AS4)', 'EN 16931', 'E-procurement'].map((k) => (
<span class="wt-tag">{k}</span>
))}
</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">
{work.map((e) => (
<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">
{e.roles.map((r) => (
<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">
{r.details.map((d) => <li>{d}</li>)}
</ul>
</div>
))}
</div>
</div>
))}
</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">
{education.map((u) => (
<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>
{u.note && <p class="mt-1 text-sm text-muted/80">{u.note}</p>}
</div>
))}
</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 &amp; 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">
{skills.map((s) => (
<div>
<h3 class="text-sm font-medium text-text">{s.k}</h3>
<div class="mt-2 flex flex-wrap gap-2">
{s.v.map((k) => <span class="wt-tag">{k}</span>)}
</div>
</div>
))}
</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,
which makes for honest incident reviews. 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>
</Base>