Claude-Session: https://claude.ai/code/session_012LCTmU2ewo8tnM1dByYAoG
This commit is contained in:
@@ -43,6 +43,7 @@ Nøgleord: Asger Weirsøe, datalog, nemhandel, e-faktura, efaktura, elektronisk
|
||||
## Sider
|
||||
- [Forside](https://asger.weirsøe.dk/): introduktion, FAQ og seneste blogindlæg
|
||||
- [CV](https://asger.weirsøe.dk/cv): erfaring, uddannelse, publikationer og kompetencer
|
||||
- [CV in English](https://asger.weirsøe.dk/en/cv): English CV with incident response and ISO/IEC 27001 compliance experience
|
||||
- [Projekter](https://asger.weirsøe.dk/projekter): offentlige open source-projekter
|
||||
- [Blog](https://asger.weirsøe.dk/blog): artikler om Proxmox, selvhosting, AI og udvikling
|
||||
|
||||
|
||||
+5
-1
@@ -57,8 +57,12 @@ const primaere = ['Java', 'Python', 'GoLang', 'TypeScript', 'JavaScript', 'Angul
|
||||
const sekundaere = ['C#', 'C++', 'C', 'Kubernetes', 'AWS', 'RabbitMQ', 'Datadog', 'XeLaTeX'];
|
||||
const sprog = ['Dansk (modersmål)', 'Engelsk (flydende i tale og skrift)'];
|
||||
---
|
||||
<Base title="CV" description="Asger Weirsøe, datalog og Technical Solution Architect. Erfaring, uddannelse og publikationer.">
|
||||
<Base title="CV" description="Asger Weirsøe, datalog og Technical Solution Architect. Erfaring, uddannelse og publikationer."
|
||||
alternates={[{ lang: 'da', path: '/cv' }, { lang: 'en', path: '/en/cv' }]}>
|
||||
<div class="flex items-center justify-between gap-4">
|
||||
<h1 class="text-4xl font-bold tracking-tight">CV</h1>
|
||||
<a href="/en/cv" hreflang="en" lang="en" class="rounded-full border border-border px-2.5 py-0.5 text-sm text-muted hover:border-accent hover:text-accent">English</a>
|
||||
</div>
|
||||
<div class="mt-3 flex flex-wrap gap-x-4 gap-y-1 text-sm text-muted">
|
||||
<span>{SITE.location}</span>
|
||||
<a class="text-accent hover:underline" href={`mailto:${SITE.email}`}>{SITE.email}</a>
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
---
|
||||
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 supplier team for the Danish Business Authority’s national e-invoicing infrastructure, and the client’s technical adviser', 'Led the response to CVE-2022-1471 (SnakeYAML, remote code execution) in the NemHandel reference implementation: the authority was notified immediately and published mitigation guidance on 8 January 2024, 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) for the Danish Business Authority', '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' }]}>
|
||||
<div class="flex items-center justify-between gap-4">
|
||||
<h1 class="text-4xl font-bold tracking-tight">CV</h1>
|
||||
<a href="/cv" hreflang="da" lang="da" class="rounded-full border border-border px-2.5 py-0.5 text-sm text-muted hover:border-accent hover:text-accent">Dansk</a>
|
||||
</div>
|
||||
<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 Danish Business Authority, 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">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 Danish Business Authority immediately, it published
|
||||
<a class="text-accent hover:underline" href="https://nemhandel.dk/orientering-om-mulig-saarbarhed-paa-nemhandel-referenceimplementering" target="_blank" rel="noopener">mitigation guidance</a>
|
||||
for service providers, 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="rounded-2xl border border-border bg-surface/60 p-5">
|
||||
<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="rounded-2xl border border-border bg-surface/60 p-5">
|
||||
<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 rounded-2xl border border-border bg-surface/60 p-5">
|
||||
<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">
|
||||
{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="rounded-full border border-border bg-surface/60 px-3 py-1 text-sm">{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="rounded-xl border border-border bg-surface/60 px-3 py-2">Danish (native)</li>
|
||||
<li class="rounded-xl border border-border bg-surface/60 px-3 py-2">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>
|
||||
@@ -7,6 +7,7 @@ export async function GET() {
|
||||
const items = [
|
||||
{ type: 'page', title: 'Forside', url: '/' },
|
||||
{ type: 'page', title: 'CV', url: '/cv' },
|
||||
{ type: 'page', title: 'CV (English)', url: '/en/cv' },
|
||||
{ type: 'page', title: 'Projekter', url: '/projekter' },
|
||||
...projekter.map((p) => p.data.lang === 'en'
|
||||
? { type: 'page', title: `Project: ${p.data.title} (English)`, url: `/en/projects/${p.id.replace(/^en\//, '')}`,
|
||||
|
||||
Reference in New Issue
Block a user