mirror of
https://github.com/morten-olsen/morten-olsen.github.io.git
synced 2026-02-08 01:46:28 +01:00
update astro
This commit is contained in:
13
package.json
13
package.json
@@ -20,15 +20,15 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@playform/compress": "^0.0.3",
|
||||
"astro": "^4.5.6",
|
||||
"astro": "^5.3.0",
|
||||
"date-fns": "^3.6.0",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@astrojs/check": "^0.5.9",
|
||||
"@astrojs/mdx": "^2.2.1",
|
||||
"@astrojs/rss": "^4.0.5",
|
||||
"@astrojs/sitemap": "^3.1.2",
|
||||
"@astrojs/check": "^0.9.4",
|
||||
"@astrojs/mdx": "^4.0.8",
|
||||
"@astrojs/rss": "^4.0.11",
|
||||
"@astrojs/sitemap": "^3.2.1",
|
||||
"@eslint/js": "^8.57.0",
|
||||
"@iconify-json/mdi": "^1.1.64",
|
||||
"@img/sharp-wasm32": "^0.33.3",
|
||||
@@ -55,5 +55,6 @@
|
||||
"sharp-ico": "^0.1.5",
|
||||
"tsx": "^4.7.1",
|
||||
"vite-plugin-pwa": "^0.19.7"
|
||||
}
|
||||
},
|
||||
"packageManager": "pnpm@10.3.0+sha512.ee592eda8815a8a293c206bb0917c4bb0ff274c50def7cbc17be05ec641fc2d1b02490ce660061356bd0d126a4d7eb2ec8830e6959fb8a447571c631d5a2442d"
|
||||
}
|
||||
|
||||
15727
pnpm-lock.yaml
generated
15727
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,7 @@ description: none
|
||||
pubDate: 2022-04-15
|
||||
heroImage: ./assets/cover.png
|
||||
color: '#3d91ef'
|
||||
slug: a-defense-for-the-coding-challenge
|
||||
---
|
||||
|
||||
Let's talk about code challenges. Code challenges are a topic with many opinions and something I have been unsure if I liked or hated. Still, I would like to make a case for why I think there are situations where this practise is beneficial, not only for the interviewer but the candidate as well.
|
||||
|
||||
@@ -4,6 +4,7 @@ pubDate: 2022-12-05
|
||||
color: '#ff9922'
|
||||
heroImage: ./assets/cover.png
|
||||
description: 'Can Git can be your trusted "expected state" for deployments?'
|
||||
slug: a-meta-talk-about-git-strategies
|
||||
---
|
||||
|
||||
Let me start with a (semi) fictional story; It is Friday, and you and your team have spent the last five weeks working on this excellent new feature. You have written a bunch of unit tests to ensure that you maintain your project's impressive 100% test coverage, and both you, your product owner and the QA testers have all verified that everything is tip-top and ready to go for the launch! You hit the big "Deploy" button. 3-2-1 Success! it is released to production, and everyone gets their glass of Champagne!
|
||||
|
||||
@@ -4,6 +4,7 @@ pubDate: 2022-05-06
|
||||
description: ''
|
||||
color: '#e7d9ac'
|
||||
heroImage: ./assets/cover.png
|
||||
slug: bob-the-algorithm
|
||||
---
|
||||
|
||||
import { Image } from 'astro:assets'
|
||||
|
||||
@@ -4,6 +4,7 @@ description: ''
|
||||
pubDate: 2022-03-16
|
||||
color: '#8bae8c'
|
||||
heroImage: ./assets/cover.png
|
||||
slug: how-to-hire-engineers-by-an-engineer
|
||||
---
|
||||
|
||||
It has been a few years since I have been part of the recruitment process. Still, I did reasonably go through the hiring process when looking for a new job so that I will mix a bit from both sides for this article, so you get both some experience from hires and what worked and experience from the other side of the table and what caused my not to consider a company, because spoiler alert: Engineers are contacted a lot!
|
||||
|
||||
@@ -4,6 +4,7 @@ pubDate: 2022-03-15
|
||||
color: '#e80ccf'
|
||||
description: ''
|
||||
heroImage: ./assets/cover.png
|
||||
slug: my-home-runs-redux
|
||||
---
|
||||
|
||||
import graph from './assets/graph.png'
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
import { defineCollection, z } from 'astro:content'
|
||||
import { glob } from 'astro/loaders'
|
||||
import { resolve } from 'path'
|
||||
|
||||
const base = import.meta.dirname
|
||||
|
||||
const articles = defineCollection({
|
||||
loader: glob({ pattern: '*/index.mdx', base: resolve(base, 'articles') }),
|
||||
schema: ({ image }) =>
|
||||
z.object({
|
||||
slug: z.string(),
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
color: z.string(),
|
||||
pubDate: z.coerce.date(),
|
||||
updatedDate: z.coerce.date().optional(),
|
||||
tags: z.array(z.string()).optional(),
|
||||
heroImage: image().refine((img) => img.width >= 320, {
|
||||
message: 'Cover image must be at least 1080 pixels wide!'
|
||||
})
|
||||
heroImage: image()
|
||||
})
|
||||
})
|
||||
|
||||
const work = defineCollection({
|
||||
loader: glob({ pattern: '*.mdx', base: resolve(base, 'work') }),
|
||||
schema: ({ image }) =>
|
||||
z.object({
|
||||
slug: z.string(),
|
||||
name: z.string(),
|
||||
position: z.string(),
|
||||
startDate: z.coerce.date(),
|
||||
endDate: z.coerce.date().optional(),
|
||||
summary: z.string().optional(),
|
||||
url: z.string().optional(),
|
||||
logo: image()
|
||||
.refine((img) => img.width >= 200, {
|
||||
message: 'Logo must be at least 320 pixels wide!'
|
||||
})
|
||||
.optional(),
|
||||
banner: image()
|
||||
.refine((img) => img.height >= 50, {
|
||||
message: 'Logo must be at least 320 pixels wide!'
|
||||
})
|
||||
.optional()
|
||||
logo: image().optional(),
|
||||
banner: image().optional()
|
||||
})
|
||||
})
|
||||
|
||||
const references = defineCollection({
|
||||
loader: glob({ pattern: '*.mdx', base: resolve(base, 'references') }),
|
||||
schema: () =>
|
||||
z.object({
|
||||
slug: z.string(),
|
||||
name: z.string(),
|
||||
position: z.string(),
|
||||
company: z.string(),
|
||||
@@ -50,8 +50,10 @@ const references = defineCollection({
|
||||
})
|
||||
|
||||
const skills = defineCollection({
|
||||
loader: glob({ pattern: '*.mdx', base: './src/content/skills' }),
|
||||
schema: () =>
|
||||
z.object({
|
||||
slug: z.string(),
|
||||
name: z.string(),
|
||||
technologies: z.array(z.string())
|
||||
})
|
||||
|
||||
@@ -5,6 +5,7 @@ company: ZeroNorth
|
||||
date: 2021-10-28
|
||||
relation: Jens was senior to Morten but didn't manage Morten directly at Trendsales
|
||||
profile: https://www.linkedin.com/in/jensroland/
|
||||
slug: jens-roland
|
||||
---
|
||||
|
||||
Morten joined the frontend team at Trendsales as a very young developer and immediately it became clear that he is the kind of rock star developer you dream of managing; passionate, thirsty for learning, and exceptionally talented. Any task given, no matter how challenging, he would complete in record time and at a level far beyond expectations. And he manages to do this while always remaining humble, generous, and an overall fun guy to be around.
|
||||
|
||||
@@ -5,6 +5,7 @@ company: Apple
|
||||
date: 2017-11-22
|
||||
relation: Ole Højriis managed Morten directly at Trendsales
|
||||
profile: https://www.linkedin.com/in/okristensen/
|
||||
slug: ole-kristensen
|
||||
---
|
||||
|
||||
Jeg har haft den udsøgte fornøjelse at arbejde sammen med Morten i de sidste godt to år. Morten er en af de udviklere man sjældent møder i Danmark, og kan vel nærmest bedst beskrives som en troldmand. Morten har en dyb viden om frontend teknologi, og er i stand til at se en problemstilling fra vinkler kun få kender til. Morten stod i spidsen for vores frontend-team og var den naturlige tech-lead i et projekt hvor vi skulle bygge en platform op fra grunden. Morten er inspirerende at tale med, hvadenten det handler om reelle udfordringer i forbindelse med en opgave, eller om dybere teknologiske tanker. Jeg har sat stor pris på den tid vi har haft sammen, og kan kun give Morten mine varmeste anbefalinger
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
---
|
||||
|
||||
name: DevOps
|
||||
slug: devops
|
||||
technologies:
|
||||
|
||||
- Kubernetes
|
||||
- Docker
|
||||
- ArgoCD
|
||||
- Terraform
|
||||
- GitHub Actions
|
||||
- AWS
|
||||
|
||||
---
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
|
||||
name: Mobile development
|
||||
slug: mobile-development
|
||||
technologies:
|
||||
|
||||
- TypeScript
|
||||
@@ -8,3 +9,5 @@ technologies:
|
||||
- Expo
|
||||
- React Navigation
|
||||
- Xamarian
|
||||
|
||||
---
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
|
||||
name: Service development
|
||||
slug: service-development
|
||||
technologies:
|
||||
|
||||
- TypeScript
|
||||
@@ -14,3 +15,5 @@ technologies:
|
||||
- Apollo
|
||||
- .Net
|
||||
- Rust
|
||||
|
||||
---
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
name: Web Development
|
||||
slug: web-development
|
||||
technologies:
|
||||
- React
|
||||
- TypeScript
|
||||
|
||||
@@ -4,6 +4,7 @@ position: Web Developer
|
||||
startDate: 2010-06-01
|
||||
endDate: 2012-02-28
|
||||
summary: As a part-time web developer at bilzonen.dk, I managed both routine maintenance and major projects like new modules and integrations, introduced a custom provider-model system in .NET (C#) for data management, and established the development environment, including server setup and custom tools for building and testing.
|
||||
slug: bilzonen-1
|
||||
---
|
||||
|
||||
I work as a part-time web developer on bilzonen.dk. I have worked with both day-to-day maintenance and large scale projects (new search module, integration of new data catalog, mobile site, new-car-catalog and the entire dealer solution). The page is an Umbraco solution, with all .NET (C#) code. I have introduced a new custom build provider-model system, which allows data-providers to move data between data stores, external services, and the site. (search, caching and external car date is running through the provider system). Also, i have set up the development environment, from setting up virtual server hosts to building custom tool for building and unit testing.
|
||||
|
||||
@@ -5,6 +5,7 @@ startDate: 2018-01-01
|
||||
endDate: 2021-12-31
|
||||
logo: ./assets/logo.jpeg
|
||||
summary: At Sampension, a Danish pension fund, I designed and helped build a cross-platform frontend architecture using React Native and React Native for Web, ensuring a unified, maintainable codebase for native iOS, Android, and web applications across devices.
|
||||
slug: sampension
|
||||
---
|
||||
|
||||
Sampension is a danish pension fund and my work has been to design and help to build a frontend architecture that would run natively on iOS and Android as well as on the web on both desktop and mobile devices.
|
||||
|
||||
@@ -6,6 +6,7 @@ endDate: 2012-09-30
|
||||
logo: ./assets/logo.png
|
||||
banner: ./assets/banner.png
|
||||
summary: At Trendsales, I started with a part-time role focused on maintaining the API for the iOS app, eventually diversifying my responsibilities to include broader platform development, allocating 25-50% of my time to the API.
|
||||
slug: trendales-1
|
||||
---
|
||||
|
||||
I got a part-time job at Trendsales, where my primary responsibility was maintaining the API which powered the iOS app. Quickly my tasks became more diverse, and I ended using about 25-50 percent of my time on the API, while the remaining was spend doing work on the platform in general.
|
||||
|
||||
@@ -5,6 +5,7 @@ startDate: 2012-10-01
|
||||
endDate: 2015-12-31
|
||||
logo: ./trendsales-1/assets/logo.png
|
||||
summary: I led the development of a new Xamarin-based iOS app from scratch at Trendsales, including a supporting API and backend work, culminating in a successful app with over 15 million screen views and 1.5 million sessions per month, and later joined a team to expand into Android development.
|
||||
slug: trendsales-2
|
||||
---
|
||||
|
||||
I became responsible for the iOS platform, which was a task that required a new app to be built from the ground up using _Xamarin_. In addition to that, a new API to support the app along with support for our larger vendors was needed which had to be build using something closely similar to _Microsoft MVC_ so that other people could join the project at a later stage.
|
||||
|
||||
@@ -5,6 +5,7 @@ startDate: 2016-01-01
|
||||
endDate: 2017-12-31
|
||||
logo: ./trendsales-1/assets/logo.png
|
||||
summary: In 2015, I spearheaded the creation of a new frontend architecture for Trendsales, leading to the development of m.trendsales.dk, using React and Redux, and devising bespoke frameworks for navigation, flexible routing, skeleton page transitions, and integrating workflows across systems like Github, Jira, Octopus Deploy, AppVeyor, and Docker.
|
||||
slug: trendsales-3
|
||||
---
|
||||
|
||||
In 2015 Trendsales decided to build an entirely new platform. It became my responsibility to create a modernized frontend architecture. The work began in 2016 with just me on the project and consisted of a proof of concept version containing everything from framework selection, structure, style guides build chain, continuous deployment, and an actual initial working version. The result where the platform which I was given technical ownership over and which I, along with two others, worked on expanding over the next year. The platform is currently powering _m.trendsales.dk_. The project is build using React and state management are done using Redux. In addition to the of the shelve frameworks, we also needed to develop quite a few bespoke frameworks, in order to meet demands. Among others, these were created to solve the following issues:
|
||||
|
||||
@@ -4,6 +4,7 @@ position: Senior Software Engineer
|
||||
startDate: 2022-01-01
|
||||
logo: ./assets/logo.png
|
||||
summary: At ZeroNorth, I develop and maintain a NextJS-based, offline-first PWA for on-vessel reporting, and enhance report processing infrastructure using Terraform and NodeJS.
|
||||
slug: zeronorth-1
|
||||
---
|
||||
|
||||
I am currently employed at ZeroNorth, a Danish software as a service company that specializes in providing solutions to help the shipping industry decarbonize through optimization. My primary focus has been on the development and maintenance of the on-vessel reporting platform. This platform is a NextJS based PWA with offline-first capabilities, which allows for easy and efficient reporting on board ships.
|
||||
|
||||
@@ -4,7 +4,7 @@ class Articles {
|
||||
public find = () => getCollection('articles')
|
||||
public get = async (slug: string) => {
|
||||
const collection = await this.find()
|
||||
return collection.find((entry) => entry.slug === slug)
|
||||
return collection.find((entry) => entry.data.slug === slug)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ class References {
|
||||
public find = () => getCollection('references')
|
||||
public get = async (slug: string) => {
|
||||
const collection = await this.find()
|
||||
return collection.find((entry) => entry.slug === slug)
|
||||
return collection.find((entry) => entry.data.slug === slug)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ class Skills {
|
||||
public find = () => getCollection('skills')
|
||||
public get = async (slug: string) => {
|
||||
const collection = await this.find()
|
||||
return collection.find((entry) => entry.slug === slug)
|
||||
return collection.find((entry) => entry.data.slug === slug)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ class Work {
|
||||
public find = () => getCollection('work')
|
||||
public get = async (slug: string) => {
|
||||
const collection = await this.find()
|
||||
return collection.find((entry) => entry.slug === slug)
|
||||
return collection.find((entry) => entry.data.slug === slug)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
import { Picture } from 'astro:assets'
|
||||
import { render } from 'astro:content';
|
||||
|
||||
import { type Article, data } from '@/data/data.js'
|
||||
import { getArticleJsonLD } from '@/data/data.utils'
|
||||
@@ -11,7 +12,8 @@ type Props = {
|
||||
}
|
||||
const { props } = Astro
|
||||
const { article } = props
|
||||
const { Content } = await article.render()
|
||||
const { Content } = await render(article);
|
||||
console.log('foo', Content)
|
||||
---
|
||||
|
||||
<Html
|
||||
|
||||
@@ -12,7 +12,7 @@ type Props = {
|
||||
const { article: item } = Astro.props
|
||||
---
|
||||
|
||||
<a href={`/articles/${item.slug}`}>
|
||||
<a href={`/articles/${item.data.slug}`}>
|
||||
<article>
|
||||
<Picture
|
||||
class='thumb'
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
---
|
||||
import { render } from 'astro:content';
|
||||
import Time from '@/components/time/absolute.astro'
|
||||
import type { WorkItem } from '@/data/data.js'
|
||||
import { formatYearMonth } from '@/utils/time.js'
|
||||
@@ -8,7 +9,7 @@ type Props = {
|
||||
}
|
||||
|
||||
const { item } = Astro.props
|
||||
const { Content } = await item.render()
|
||||
const { Content } = await render(item)
|
||||
---
|
||||
|
||||
<div class='item'>
|
||||
|
||||
@@ -9,7 +9,7 @@ type Props = {
|
||||
export const getStaticPaths = async () => {
|
||||
const articles = await data.articles.find()
|
||||
return articles.map((article) => ({
|
||||
params: { slug: article.slug },
|
||||
params: { slug: article.data.slug },
|
||||
props: { article }
|
||||
}))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user