diff --git a/public/llms.txt b/public/llms.txt index 96ff684..bddc412 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -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 diff --git a/src/pages/cv.astro b/src/pages/cv.astro index 9ffe2c2..7186beb 100644 --- a/src/pages/cv.astro +++ b/src/pages/cv.astro @@ -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)']; --- - -

CV

+ +
+

CV

+ English +
{SITE.location} {SITE.email} diff --git a/src/pages/en/cv.astro b/src/pages/en/cv.astro new file mode 100644 index 0000000..43f2d22 --- /dev/null +++ b/src/pages/en/cv.astro @@ -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'] }, +]; +--- + +
+

CV

+ Dansk +
+
+ Aalborg, Denmark + {SITE.email} + LinkedIn +
+ +

+ 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. +

+ +
+

Incident response and compliance

+

+ 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 July 2024 CrowdStrike outage 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 CVE-2022-1471 affected the NemHandel reference + implementation, we notified the Danish Business Authority immediately, it published + mitigation guidance + for service providers, and we shipped a fixed release within two weeks. +

+

+ At Digisense I built the information security management system around + ISO/IEC 27001: 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. +

+
+ +
+

Experience

+
+ {work.map((e) => ( +
+

{e.org} · {e.place}

+
+ {e.roles.map((r) => ( +
+
+ {r.title} + {r.when} +
+
    + {r.details.map((d) =>
  • {d}
  • )} +
+
+ ))} +
+
+ ))} +
+
+ +
+

Education

+
+ {education.map((u) => ( +
+
+

{u.what}

{u.when} +
+

{u.where}

+ {u.note &&

{u.note}

} +
+ ))} +
+
+ +
+

Publication

+
+ + CGAAL: Distributed On-The-Fly ATL Model Checker with Heuristics + +

+ Carlsen, Frydenskov, Jensen, Rasmussen, Sørensen, Weirsøe, Jensen & Larsen. + EPTCS, vol. 390 (2023), pp. 99–114. arXiv:2310.00999 +

+
+
+ +
+

Skills

+
+ {skills.map((s) => ( +
+

{s.k}

+
+ {s.v.map((k) => {k})} +
+
+ ))} +
+
+ +
+
+

Languages

+
    +
  • Danish (native)
  • +
  • English (fluent, spoken and written)
  • +
+
+
+

Projects and interests

+

+ 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 OZ0AGW). +

+
+
+ diff --git a/src/pages/search-index.json.js b/src/pages/search-index.json.js index e17fa32..049d577 100644 --- a/src/pages/search-index.json.js +++ b/src/pages/search-index.json.js @@ -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\//, '')}`,