commit 4aab758b5c2d330060796823bea6466678b90e47 Author: Julian Ospald Date: Sat Sep 14 21:27:25 2024 +0800 Initial commit diff --git a/512px-Tux.svg.png b/512px-Tux.svg.png new file mode 100644 index 0000000..329efc4 Binary files /dev/null and b/512px-Tux.svg.png differ diff --git a/blender.png b/blender.png new file mode 100644 index 0000000..43c0b3f Binary files /dev/null and b/blender.png differ diff --git a/chain-saw.png b/chain-saw.png new file mode 100644 index 0000000..bdd29e2 Binary files /dev/null and b/chain-saw.png differ diff --git a/debian.png b/debian.png new file mode 100644 index 0000000..ebd2290 Binary files /dev/null and b/debian.png differ diff --git a/downloads.png b/downloads.png new file mode 100644 index 0000000..772a1ce Binary files /dev/null and b/downloads.png differ diff --git a/feedback.png b/feedback.png new file mode 100644 index 0000000..13a45b7 Binary files /dev/null and b/feedback.png differ diff --git a/firefox.png b/firefox.png new file mode 100644 index 0000000..81a263e Binary files /dev/null and b/firefox.png differ diff --git a/ghaction.png b/ghaction.png new file mode 100644 index 0000000..d7cf466 Binary files /dev/null and b/ghaction.png differ diff --git a/ghcup.png b/ghcup.png new file mode 100644 index 0000000..b295d11 Binary files /dev/null and b/ghcup.png differ diff --git a/haskell_logo.png b/haskell_logo.png new file mode 100644 index 0000000..8c189e2 Binary files /dev/null and b/haskell_logo.png differ diff --git a/install.dia b/install.dia new file mode 100644 index 0000000..f8e8fea Binary files /dev/null and b/install.dia differ diff --git a/install.svg b/install.svg new file mode 100644 index 0000000..a2f6970 --- /dev/null +++ b/install.svg @@ -0,0 +1,393 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/linux.png b/linux.png new file mode 100644 index 0000000..2cfbca3 Binary files /dev/null and b/linux.png differ diff --git a/notes.md b/notes.md new file mode 100644 index 0000000..35cb01d --- /dev/null +++ b/notes.md @@ -0,0 +1,54 @@ +## Other + +- the idea of a distribution is to create a user experience + - you log into your computer and install a program and everything just works + - or: something doesn't work... what are your next steps? +- you create an experience +- the distribution is that brings all the pieces together: installation, service management (systemd, openrc, initd), kernel updates, support + +- lesson: composition + - functions + - libraries + - programs (unix) +- lesson: specifications + - LSP (open source milestone) +- lesson: caring about features and code instead of maintenance and collaborations + +- lesson: dicatorships work + +- decision making (processes) + - lightweight when risk of mistakes is low (can revert?) + +- tests in CI are garbage + +- reverse dependencies <-> me <-> users +- collaboration vs boundaries, communication + + +- what distribution work taught me for programming +- posix principles and their connection to functional programming (streams) + +- navigation + +- strings +- open source politics +- how to drive change +- how to handle contributions (contribution experience, PRs, documentation, mentoring,. ..) +- collaboration +- relationship between industry and FOSS +- what is the main currency (money vs energy) +- bus factor +- feedback from universities regarding Haskell tooling +- respect other projects when contributing +- enabling and supporting (switching from coding wizard to support role) +- project life cycles +- support +- stability vs. .. +- boundaries vs collaboration +- trust, respect, relationship +- working mode in open source +- dealing with expectations +- how to test (on the end users system) +- what if you diverge from the happy path +- why is stability an interesting goal? + diff --git a/nus.html b/nus.html new file mode 100644 index 0000000..b307be5 --- /dev/null +++ b/nus.html @@ -0,0 +1,553 @@ + + + + + + + + + Two decades of Open Source + + + + + +
+

Two decades of Open Source

+

+Julian Ospald +

+

Sep 20, 2024

+
+
+

Introduction

+ +
+
+

About me

+ +
+
+

Professional career

+ +
+
+

Open Source career

+ +
+ +
+

Open Source

+ +
+
+

What is Open Source

+ +
+ +
+

Value proposition of Open Source

+ +
+
+

Reality of Open Source

+ +
+ +
+

Gentoo and package management

+ +
+
+

What is Gentoo

+ +
+
+

How does a Linux distro work (relationships)

+

+
+
+

How does a Linux distro work (activities)

+

+
+
+

A typical ebuild

+
EAPI=8
+
+DESCRIPTION="A dummy package"
+HOMEPAGE="https://dummy.org"
+SRC_URI="https://github.com/dummy/dummy/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="BSD-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86 "
+IUSE="debug"
+
+RDEPEND="dev-util/boost"
+
+PATCHES=( "${FILESDIR}"/${PN}-4.9.2-disable_python_rpath.patch)
+
+src_configure() {
+    econf $(use_enable debug)
+}
+
+src_compile() {
+    emake
+}
+
+src_test() {
+    emake test
+}
+
+src_install() {
+    emake DESTDIR="${D}" install
+}
+
+
+

Packaging challenges

+ +
+
+

Packaging challenges (pt 2.)

+ +
+
+

What is a Distro really?

+ +
+ +
+

GHCup

+ +
+
+

Demo

+

+
+
+

State of 2019 (Haskell Installers)

+ +
+
+

How it started

+ +
+
+

GHCup today

+

Haskell +Survey 2022:

+

+ +
+
+

What is GHCup (simplified)?

+
curl -s -L \
+  'https://downloads.haskell.org/~ghc/9.6.5/ghc-9.6.5-x86_64-fedora33-linux.tar.xz' |
+  tar -xJ -C /tmp                              &&
+  cd /tmp/ghc-9.6.5-x86_64-unknown-linux/      &&
+  ./configure --prefix="$HOME/.local"          &&
+  make install                                 &&
+  rm -rf /tmp/ghc-9.6.5-x86_64-unknown-linux/
+
+
+

What is GHCup really?

+ +
+
+

The difference to Gentoo

+ +
+
+

Relationships in detail

+

Dependencies:

+ +
+
+

Relationships in detail

+

Dependents:

+ +
+
+

Other

+ +
+ + diff --git a/nus.md b/nus.md new file mode 100644 index 0000000..9f9cd68 --- /dev/null +++ b/nus.md @@ -0,0 +1,271 @@ +% Two decades of Open Source +% Julian Ospald +% Sep 20, 2024 + +# Introduction + +## About me + +* From Germany +* Studied CS +* Haskell developer +* I love open source + +## Professional career + +* Software Engineer in R&D (automotive industry) +* Go Backend Developer (online advertisement platform +* Haskell Developer at **Capital Match** (invoice financing platform in Singapore) +* Haskell Developer at **IOHK** (Cardano Blockchain) +* Haskell Freelancer (blockchain and others) +* Haskell Developer at **Standard Chartered Bank** +* Haskell Freelancer (chimney sweeper app for german businesses) + +## Open Source career + +* Gentoo Linux developer (core team), 2012-2016 + - Ebuild development (packaging) + - Code review + - Development of a [git workflow](https://www.gentoo.org/glep/glep-0066.html) +* Author of GHCup (the Haskell installer), ca. 2019 +* Maintainer of Haskell core libraries: filepath, unix, os-string, file-io +* Implementation of the [Abstract FilePath Proposal](https://hasufell.github.io/posts/2022-06-29-fixing-haskell-filepaths.html) +* Member of the Haskell Core Libraries Comittee 2023-2026 +* Haskell Influencer (Haskell Foundation, ...) + +# Open Source + +## What is Open Source + +* ![](osi.png){#id .class height=32px} A group of licenses (see OSI) + * *Not* free software + * *Not* copyleft +* 🧑‍🤝‍🧑 A community + * volunteers + * companies +* 🔮 A philosophy + * sharing + * collaboration + * transparency + +## Popular Open Source projects + +* ![](512px-Tux.svg.png){#id .class height=32px} Linux kernel + * 1500 developers from 200-250 companies +* ![](firefox.png){#id .class height=32px} Firefox +* ![](vscode.png){#id .class height=32px} VSCode +* ![](blender.png){#id .class height=32px} Blender +* ![](haskell_logo.png){#id .class height=32px} GHC (The Haskell compiler) + +## Value proposition of Open Source + +* ⚗️ the scientific method + * share your results + * allow people to replicate it +* 🔓 access to a community + * users + * collaborators +* 🕸️ network effects + +## Reality of Open Source + +* most projects... + * are one-man shows + * have no users + * are underdocumened + * have horrible code +* writing new code is easy, maintenance is hard +* most maintainers + * don't get paid + * will stop maintenance at some point + * don't care much about their users + +# Gentoo and package management + +## What is Gentoo + +* a Linux distribution + * rolling release + * source based +* 19000 packages (program, library, ...) +* 200 core developers (at its peak) +* over 1000 contributors + +## How does a Linux distro work (relationships) + +![](packager_relationships.svg){#id .class height=500px} + +## How does a Linux distro work (activities) + +![](install.svg){#id .class height=500px} + +## A typical ebuild + +```bash +EAPI=8 + +DESCRIPTION="A dummy package" +HOMEPAGE="https://dummy.org" +SRC_URI="https://github.com/dummy/dummy/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz" + +LICENSE="BSD-3" +SLOT="0" +KEYWORDS="~amd64 ~x86 " +IUSE="debug" + +RDEPEND="dev-util/boost" + +PATCHES=( "${FILESDIR}"/${PN}-4.9.2-disable_python_rpath.patch) + +src_configure() { + econf $(use_enable debug) +} + +src_compile() { + emake +} + +src_test() { + emake test +} + +src_install() { + emake DESTDIR="${D}" install +} +``` + +## Packaging challenges + +* no standard on build systems (make, autotools, meson, cmake, ...) + * => an abstraction over build systems +* thousands of different execution environments (fragility) + - system configuration + - package configuration + - platform, architecture +* reverse dependencies + - shipping a "chain" instead of a single artifact +* high impact on small mistakes (e.g. assuming a specific shell) + +## Packaging challenges (pt 2.) + +* communication between teams/maintainers +* execution of large changes + - e.g. introduction of LibreSSL + - e.g. changing of fundamental workflows (from CVS to git) +* monitoring upstream changes and making decisions about compatibility/stability + - when to update + +## What is a Distro really? + +* a user experience + - LTS distros vs rolling release + - binary vs source based + - choice of init system +* plug and play (everything works) +* deviating from the happy path (fixing issues) +* combining components to a coherent system (init system, coreutils, kernel, ...) +* a choice of **defaults** + +## Why Gentoo made me a better programmer + +* primary packaging skill: being meticulous + * small mistakes -> big impact +* long term maintenance of small code pieces +* intense review culture +* strict policies and workflow guidelines +* how to learn complex system + +# GHCup + +## Demo + +![](ghcup.png){#id .class height=500px} + +## State of 2019 (Haskell Installers) + +* stack is the only "Haskell Installer" +* no unified alternative for cabal users +* distro packages, nix, manual installs, ... +* 😭 + +## How it started + +* 🤹 small team at work (Capital Match), using different platforms + - originally used stack + - distro packages constantly out of date +* 🦾 first version was 165 LOC + - Posix shell +* ![](linux.png){#id .class height=32px} only supported linux and mac +* ![](rust.png){#id .class height=32px} inspired by **rustup** +* support from haskell.org + +## GHCup today + +[Haskell Survey 2022](https://taylor.fausak.me/2022/11/18/haskell-survey-results/#s2q1): + +![](survey.png) + +- over **17k** LOC Haskell +- supports all platforms: Linux, Windows, macOS, FreeBSD +- first thing new Haskell users get exposed to + +## What is GHCup (simplified)? + +```sh +curl -s -L \ + 'https://downloads.haskell.org/~ghc/9.6.5/ghc-9.6.5-x86_64-fedora33-linux.tar.xz' | + tar -xJ -C /tmp && + cd /tmp/ghc-9.6.5-x86_64-unknown-linux/ && + ./configure --prefix="$HOME/.local" && + make install && + rm -rf /tmp/ghc-9.6.5-x86_64-unknown-linux/ +``` + +## What is GHCup really? + +* ![](open-box.png){#id .class width=32 height=32px} installer (portable) +* ![](debian.png){#id .class width=32 height=32px} distribution channel +* ![](feedback.png){#id .class width=32 height=32px} feedback channel +* ![](qa.png){#id .class width=32 height=32px} testing/QA gateway +* ![](user.png){#id .class width=32 height=32px} provider of sane defaults (e.g. "recommended" GHC version) +* ![](chain-saw.png){#id .class width=32 height=32px} glue for holistic toolchain experience + - VSCode, stack, cabal-install integration +* ![](ghaction.png){#id .class width=32 height=32px} CI provisioning (e.g. github actions) + +## The difference to Gentoo + +* one-man project (mostly) +* much tighter coupling between upstream (e.g. GHC developers) and downstream (GHCup developers) + * heavier on relationship issues +* much more responsibility +* position of authority + +## Relationships in detail + +Dependencies: + +- supported tools + - GHC + - Cabal + - HLS + - Stack +- decisions that affect us + - release frequency + - upstream CI + - platform support + - binary distributions (the `.tar.gz`/`.zip`) + +## Relationships in detail + +Dependents: + +- ![](haskell_logo.png){#id .class height=32px} Haskell developers + - beginners, advanced, students, companies +- ![](person.png){#id .class width=32 height=32px} end users (e.g. compiling pandoc from source) +- ![](ghaction.png){#id .class width=32 height=32px} GitHub CI + - GitHub images, Haskell repos +- 🪞 mirrors + - [sjtug](https://mirror.sjtu.edu.cn/docs/ghcup) +- 🧰 tools + - [vscode-haskell](https://github.com/haskell/vscode-haskell), [Haskell playground](https://play.haskell.org/), [nvim-lsp-installer](https://github.com/williamboman/nvim-lsp-installer) + diff --git a/open-box.png b/open-box.png new file mode 100644 index 0000000..2d59ffa Binary files /dev/null and b/open-box.png differ diff --git a/osi.png b/osi.png new file mode 100644 index 0000000..964767d Binary files /dev/null and b/osi.png differ diff --git a/packager_relationships.dia b/packager_relationships.dia new file mode 100644 index 0000000..104a565 Binary files /dev/null and b/packager_relationships.dia differ diff --git a/packager_relationships.svg b/packager_relationships.svg new file mode 100644 index 0000000..96c8824 --- /dev/null +++ b/packager_relationships.svg @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/person.png b/person.png new file mode 100644 index 0000000..12be719 Binary files /dev/null and b/person.png differ diff --git a/qa.png b/qa.png new file mode 100644 index 0000000..2edb79d Binary files /dev/null and b/qa.png differ diff --git a/rust.png b/rust.png new file mode 100644 index 0000000..e8b521f Binary files /dev/null and b/rust.png differ diff --git a/survey.png b/survey.png new file mode 100644 index 0000000..2460fa8 Binary files /dev/null and b/survey.png differ diff --git a/user.png b/user.png new file mode 100644 index 0000000..9afed7b Binary files /dev/null and b/user.png differ diff --git a/vscode.png b/vscode.png new file mode 100644 index 0000000..1a15311 Binary files /dev/null and b/vscode.png differ