Master of Puppets^HScience!

So, on Thursday I defended my thesis in front of the graduation committee, and passed! This means that the work I have been doing for the last year comes to an end. From now on there are not long nights and weekends working on my thesis anymore. Back in 2021 I started my journey of achieving a Master’s degree, first with a connecting program and then with the 2 year Master program. Even though I have been in computer science in some form for the last 30 years I still found it to be quite a learning experience. ...

June 24, 2024 - 1 min Arjen Wiersma

Resigning as Hack The Box Ambassador

So, today I have some news. I will be resigning as Ambassador for Hack The Box after our in-person meetup in June (2024). This means that I will be stepping down from organizing the monthly virtual and quarterly in-person Hack The Box meetups. Let me explain how I got to this decision. The beginning So, in 2019, I started out building a cyber security curriculum for NOVI Hogeschool. I had the ability to greenfield the courses and create something that is of value to students. In this curriculum I started using Hack The Box for exercises and training next to the regular classwork. ...

May 28, 2024 - 5 min Arjen Wiersma

The cyber cafe podcast

Last week I was a guest on the Cyber Cafe podcast by rootsec. It was a fun discussion on education and the current xz backdoor story. It is in the Dutch language. It is available on youtube and included below:

April 9, 2024 - 1 min Arjen Wiersma

Microsoft Teams (v2) on Linux

This post is just a small note for those of you who also run Microsoft Teams on Linux through their browser and now receive a note “your browser does not meet the requirements for the new Teams”. It turns out that the client is looking at the user-agent string to determine which browsers it accepts, and which not. So, if you have the message, install an user-agent switcher and select a common browser on a common OS (from the MS perspective) and you will suddenly meet the requirements. ...

April 1, 2024 - 1 min Arjen Wiersma

My computing environment

This is a longer form article. I is relevant as of February 18th 2023. If the circumstances of my environment changes I will try to update this article to reflect the situation. You can find the full source code of my dotfiles on Github. I like consistency and simplicity. I do not like to use many different tools to do different things, I rather spend my time learning to use a few tools very well then to follow the hype on the latest trend of tools for something we have been doing forever. ...

February 18, 2024 - 7 min Arjen Wiersma

Heading to the finish line

It has been a little while. I have been swamped with work and the work on my thesis, leaving no room to finish the Advent of Code or much of anything else. Yesterday I gave my practice presentation for my thesis. This means I am one more step closer to the finish line. During the day there were many interactions with fellow students. One of the topics has been the templates to use at Open Universiteit. So, I thought I would just create a repository of the templates that I use, so that anyone can learn from them. ...

February 17, 2024 - 1 min Arjen Wiersma

Advent of Code 2023 day 9

The weekend generally is a place to find hard puzzles again, this time not so much. A simple quest to find the next number in a sequence with a fully written out algorithm to follow. They key here is to use recursion. package main import ( "fmt" "time" "arjenwiersma.nl/aoc/internal/aoc" ) func NextStep(in []int) int { allZero := true for _, v := range in { if v != 0 { allZero = false } } if allZero { return 0 } var diffs []int for i := 1; i < len(in); i++ { diffs = append(diffs, in[i]-in[i-1]) } p := NextStep(diffs) return in[len(in)-1] + p } func main() { content := aoc.AsLines("2023/Day09/input.txt") var lines [][]int for _, v := range content { lines = append(lines, aoc.AsNumbers(v)) } startTime := time.Now() var res []int for _, v := range lines { res = append(res, NextStep(v)) } r := aoc.SumArray(res) endTime := time.Now() elapsed := endTime.Sub(startTime) fmt.Printf("Part 1: %d (%v)\n", r, elapsed) startTime = time.Now() for _, v := range lines { aoc.Reverse(v) } res = []int{} for _, v := range lines { res = append(res, NextStep(v)) } r = aoc.SumArray(res) endTime = time.Now() elapsed = endTime.Sub(startTime) fmt.Printf("Part 2: %d (%v)\n", r, elapsed) }

December 9, 2023 - 1 min Arjen Wiersma

Advent of Code 2023 day 8

Somewhat suspicious of 2 easy days we end up at Day 8. A simple map to follow again, from one key follow the instructions until we hit ZZZ. Part 2 had us do it for several keys at once, with the goal to find the spot where they all converge. This can take forever, erhm, a long time. So there has to be a math type solution to this problem. It turns out to be a Least Common Multiple problem. It is the smallest positive integer that is divisible by two or more numbers without leaving a remainder. To find the LCM of two or more numbers, you can use a method called prime factorization or a simpler approach involving multiples. We can also use the Greatest Common Divisor (GCD) to find the LCM. ...

December 9, 2023 - 2 min Arjen Wiersma

Advent of Code 2023 day 7

Today we learned about CamelCards, a game of poker meant to play on the back of a camel. The most interesting part here was the parsing of the cards and figuring out how to properly rank them. Part 2 turned out to be as easy as tracking Jokers. package main import ( "fmt" "sort" "strconv" "strings" "time" "arjenwiersma.nl/aoc/internal/aoc" ) type Card struct { bid int hand []int jokers int } func (c *Card) strongerThen(o *Card) bool { for i, v := range c.hand { if v > o.hand[i] { return true } else if v < o.hand[i] { return false } } return false } func (c *Card) rank() int { freq := make([]int, 15) for _, v := range c.hand { if v == 1 { // skip counting the joker continue } freq[v]++ } sort.Ints(freq) freq[len(freq)-1] += c.jokers strength := 2 * freq[len(freq)-1] // full house and 2 pair if freq[len(freq)-2] == 2 { strength += 1 } return strength } func NewCard(s string, bid int, p2 bool) *Card { c := &Card{} c.bid = bid c.jokers = 0 for p := 0; p < len(s); p++ { if s[p]-'0' >= 2 && s[p]-'0' <= 9 { c.hand = append(c.hand, int(s[p]-'0')) } else { x := 10 switch s[p] { case 'A': x = 14 case 'K': x = 13 case 'Q': x = 12 case 'J': if p2 { c.jokers += 1 x = 1 } else { x = 11 } case 'T': x = 10 } c.hand = append(c.hand, x) } } return c } func (c *Card) String() string { return fmt.Sprintf("%v (%d)", c.hand, c.bid) } func main() { content := aoc.AsLines("2023/Day07/input.txt") var cards []*Card for _, v := range content { p := strings.Split(v, " ") b, _ := strconv.Atoi(p[1]) c := NewCard(p[0], b, false) cards = append(cards, c) } startTime := time.Now() lessFunc := func(i, j int) bool { if cards[i].rank() == cards[j].rank() { return cards[j].strongerThen(cards[i]) } return cards[i].rank() < cards[j].rank() } sort.Slice(cards, lessFunc) res := 0 for i, c := range cards { res += (i + 1) * c.bid } endTime := time.Now() elapsed := endTime.Sub(startTime) if 251216224 != res { panic("Wrong answer") } fmt.Printf("Part 1: %d (%v)\n", res, elapsed) // 251216224 cards = []*Card{} for _, v := range content { p := strings.Split(v, " ") b, _ := strconv.Atoi(p[1]) c := NewCard(p[0], b, true) cards = append(cards, c) } startTime = time.Now() sort.Slice(cards, lessFunc) res = 0 for i, c := range cards { res += (i + 1) * c.bid } endTime = time.Now() elapsed = endTime.Sub(startTime) if 250825971 != res { panic("Wrong part 2") } fmt.Printf("Part 2: %d (%v)\n", res, elapsed) // 250825971 }

December 9, 2023 - 3 min Arjen Wiersma

Advent of Code 2023 day 6

Day 6 turned out to be the easiest day in the range so far. A simple implementation of the algorithm was more than sufficient. I later learned that it was a quadratic function. On the subreddit Deatranger999 said: If you hold down the button for x seconds, then you will beat the distance if the quadratic x^2 - t x + d is at most 0, where t is the total time of the race and d is the distance you’d like to beat. So I just plugged each one into WolframAlpha, found the roots, and then calculated the number of integers between the two roots. ...

December 9, 2023 - 2 min Arjen Wiersma