HaskellerZ 2021-04-29 meetup slides
This commit is contained in:
commit
12cc69b3cf
22
Makefile
Normal file
22
Makefile
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
SLUG=haskellerz
|
||||||
|
|
||||||
|
TYPES=\
|
||||||
|
slidy \
|
||||||
|
revealjs \
|
||||||
|
# dzslides \
|
||||||
|
# s5 \
|
||||||
|
# slideous \
|
||||||
|
|
||||||
|
default: build open watch
|
||||||
|
|
||||||
|
open:
|
||||||
|
open *.html
|
||||||
|
|
||||||
|
build:
|
||||||
|
for T in $(TYPES); do pandoc --slide-level=2 -s -t $$T $(SLUG).md -o $(SLUG).$$T.html; done
|
||||||
|
|
||||||
|
watch:
|
||||||
|
ls *.md | entr bash -c 'make -s build && date'
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(SLUG).*.html
|
||||||
50
README.org
Normal file
50
README.org
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
* Haskellerz talk 2021-04-29
|
||||||
|
|
||||||
|
** blurb
|
||||||
|
Inside hledger: an architectural tour and how-to
|
||||||
|
|
||||||
|
hledger is a suite of CLI, TUI and WUI tools, file formats, and
|
||||||
|
documentation for doing accounting with plain text. It is something
|
||||||
|
that's not yet common: an end-user application written in Haskell,
|
||||||
|
that aims to be easy to install, robust and pleasing to use, on all
|
||||||
|
major platforms, including by non-techies.
|
||||||
|
|
||||||
|
I have been building and growing hledger and the hledger project for
|
||||||
|
about 15 years. In this talk I will, after a quick intro to plain text
|
||||||
|
accounting and hledger, give a tour of hledger's architecture,
|
||||||
|
codebase, significant evolutions, and some design principles. Then
|
||||||
|
I'll give some practical tips on how to: add your own custom hledger
|
||||||
|
commands; use hledger from your own app; troubleshoot hledger
|
||||||
|
behaviour; investigate bugs; and create effective pull requests. This
|
||||||
|
will hopefully go smoothly, and the Q&A we can go deeper on whatever
|
||||||
|
you like.
|
||||||
|
|
||||||
|
Simon: https://joyful.com
|
||||||
|
hledger: https://hledger.org
|
||||||
|
Plain Text Accounting: https://plaintextaccounting.org
|
||||||
|
|
||||||
|
** preliminary outline
|
||||||
|
*** Inside hledger: an architectural tour and how-to
|
||||||
|
**** quick intro to accounting, plain text accounting, hledger
|
||||||
|
10m
|
||||||
|
**** project goals
|
||||||
|
**** a look at the essential functionality in its earliest/simplest form
|
||||||
|
**** a fast run through the evolution since then
|
||||||
|
**** a tour of the codebase and project today (2021Q2)
|
||||||
|
**** design principles
|
||||||
|
25m
|
||||||
|
|
||||||
|
**** how to script hledger
|
||||||
|
**** how to integrate hledger in your app
|
||||||
|
***** run cli, capture csv/json
|
||||||
|
***** run hledger-web, use http-json api
|
||||||
|
***** link with hledger-lib and/or other hledger packages, call public functions
|
||||||
|
**** how to investigate a hledger bug
|
||||||
|
***** basic troubleshooting - docs, comparison, minimisation, reproduction, support
|
||||||
|
***** code debugging
|
||||||
|
**** how to submit a pull request
|
||||||
|
25m
|
||||||
|
|
||||||
|
**** Q & A
|
||||||
|
30m
|
||||||
|
|
||||||
356
haskellerz.md
Normal file
356
haskellerz.md
Normal file
@ -0,0 +1,356 @@
|
|||||||
|
% Inside hledger: an architectural tour and how-to
|
||||||
|
% Simon Michael
|
||||||
|
% April 29, 2021
|
||||||
|
|
||||||
|
# Introductions
|
||||||
|
|
||||||
|
`0:00 (10m)`
|
||||||
|
|
||||||
|
## Who am I ?
|
||||||
|
|
||||||
|
Simon Michael\
|
||||||
|
Independent software consultant and developer.\
|
||||||
|
<!-- Currently based in Hawaii. -->
|
||||||
|
<https://joyful.com>
|
||||||
|
|
||||||
|
Started in the home computer era (Ireland, 80s). ZX-80, Pet, VIC, C64, Amiga, PC, Mac, VAX/VMS, unix..
|
||||||
|
|
||||||
|
FOSS fan, contributor, project leader. Two big projects:
|
||||||
|
|
||||||
|
- **Zwiki**, 1996-2006, wiki engine, Python/Zope
|
||||||
|
|
||||||
|
- **hledger**, 2006-present, accounting tool, Haskell
|
||||||
|
|
||||||
|
## Overview of talk
|
||||||
|
|
||||||
|
- A quick intro to plain text accounting and hledger. (10m)
|
||||||
|
|
||||||
|
- A tour of hledger's
|
||||||
|
architecture,
|
||||||
|
codebase,
|
||||||
|
evolutions,
|
||||||
|
and design principles. (25m)
|
||||||
|
|
||||||
|
- How to script and develop hledger:
|
||||||
|
custom commands,
|
||||||
|
calling from other apps,
|
||||||
|
troubleshooting,
|
||||||
|
bug investigation,
|
||||||
|
effective pull requests. (25m)
|
||||||
|
|
||||||
|
- Q&A to go deeper on whatever you like. (30m)
|
||||||
|
|
||||||
|
|
||||||
|
## What's Plain Text Accounting ?
|
||||||
|
|
||||||
|
A name I proposed (and a website I built) to help unify and grow the
|
||||||
|
communities around
|
||||||
|
Ledger, hledger, Beancount and similar accounting
|
||||||
|
tools.
|
||||||
|
|
||||||
|
<https://plaintextaccounting.org>
|
||||||
|
|
||||||
|
## The PTA ecosystem
|
||||||
|
|
||||||
|
The "big three" apps:
|
||||||
|
|
||||||
|
* **Ledger** - John Wiegley's pioneering command line accounting app,
|
||||||
|
inspiration for all the rest.\
|
||||||
|
C++, 2003-present
|
||||||
|
|
||||||
|
* **hledger** - Simon Michael's rewrite/remix.\
|
||||||
|
Haskell, 2007-present
|
||||||
|
|
||||||
|
* **Beancount** - Martin Blais' variant.\
|
||||||
|
Python, 2008-present
|
||||||
|
|
||||||
|
Many more apps and add-on tools - <https://plaintextaccounting.org/#software>
|
||||||
|
|
||||||
|
|
||||||
|
## What's hledger ?
|
||||||
|
|
||||||
|
A suite of
|
||||||
|
tools,
|
||||||
|
file formats,
|
||||||
|
and documentation
|
||||||
|
for doing "plain text accounting".
|
||||||
|
|
||||||
|
<https://hledger.org>
|
||||||
|
|
||||||
|
## A successful FOSS project
|
||||||
|
|
||||||
|
15 years, 134 contributors, 80-100 chatters, some number of happy
|
||||||
|
users, useful to me every week.
|
||||||
|
|
||||||
|
Reasonably successful.
|
||||||
|
|
||||||
|
Not fulfilling my original goal of being financially
|
||||||
|
self-sustaining and minimally time-consuming !
|
||||||
|
|
||||||
|
## An end-user Haskell application
|
||||||
|
|
||||||
|
hledger is something that's not yet common:
|
||||||
|
|
||||||
|
An end user application (ie: not a programming tool),
|
||||||
|
written in Haskell, that aims to be
|
||||||
|
|
||||||
|
- easy to install,
|
||||||
|
- dependable,
|
||||||
|
- and pleasing to use,
|
||||||
|
- on all major platforms,
|
||||||
|
- by non-techies as well as power users.
|
||||||
|
|
||||||
|
## Tools
|
||||||
|
|
||||||
|
* hledger
|
||||||
|
* hledger-ui
|
||||||
|
* hledger-web
|
||||||
|
* hledger-iadd
|
||||||
|
* hledger-interest
|
||||||
|
* etc.
|
||||||
|
|
||||||
|
## File formats
|
||||||
|
|
||||||
|
* journal
|
||||||
|
* csv
|
||||||
|
* timeclock
|
||||||
|
* timedot
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
* introductory
|
||||||
|
* reference
|
||||||
|
* cookbook
|
||||||
|
* developer
|
||||||
|
|
||||||
|
|
||||||
|
# Architecture
|
||||||
|
|
||||||
|
`0:10 (25m)`
|
||||||
|
|
||||||
|
## hledger project goals
|
||||||
|
|
||||||
|
I was a Ledger user and new Haskeller. I started hledger with many goals:
|
||||||
|
|
||||||
|
- acquire a more robust, usable, evolving incarnation of Ledger
|
||||||
|
- develop a consistent, effective accounting habit
|
||||||
|
- get better at Haskell
|
||||||
|
- find out if Haskell was good for end-user apps and maintainer productivity
|
||||||
|
- grow a useful, long-lasting, financially sustainable FOSS accounting project
|
||||||
|
|
||||||
|
## A fast run through the evolution
|
||||||
|
|
||||||
|
- First commit
|
||||||
|
- First types
|
||||||
|
- First report
|
||||||
|
- Balance report
|
||||||
|
- Multi-column balance report
|
||||||
|
- Stateful parser
|
||||||
|
- Web interface
|
||||||
|
- Curses interface
|
||||||
|
- Package split
|
||||||
|
- Speed, features
|
||||||
|
- General currency conversion
|
||||||
|
- Valuation
|
||||||
|
- Always documentation
|
||||||
|
|
||||||
|
## A tour of the codebase and project today (2021Q2)
|
||||||
|
|
||||||
|
|
||||||
|
## Design principles
|
||||||
|
|
||||||
|
|
||||||
|
# How to..
|
||||||
|
|
||||||
|
`0:35 (25m)`
|
||||||
|
|
||||||
|
## Script hledger
|
||||||
|
|
||||||
|
|
||||||
|
## Integrate hledger in your app
|
||||||
|
|
||||||
|
|
||||||
|
### Run cli, capture csv/json
|
||||||
|
|
||||||
|
|
||||||
|
### Run hledger-web, use http-json api
|
||||||
|
|
||||||
|
|
||||||
|
### Link with hledger-lib and/or other hledger packages, call public functions
|
||||||
|
|
||||||
|
|
||||||
|
## Investigate a hledger bug
|
||||||
|
|
||||||
|
|
||||||
|
### Basic troubleshooting - docs, comparison, minimisation, reproduction, support
|
||||||
|
|
||||||
|
|
||||||
|
### Code debugging
|
||||||
|
|
||||||
|
|
||||||
|
## How to submit a pull request
|
||||||
|
|
||||||
|
|
||||||
|
# Q & A
|
||||||
|
|
||||||
|
`1:00 (30m)`
|
||||||
|
|
||||||
|
# End
|
||||||
|
|
||||||
|
`1:30`
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git shortlog -s
|
||||||
|
Aerex
|
||||||
|
Aiken Cairncross
|
||||||
|
Alejandro García Montoro
|
||||||
|
Aleksandar Dimitrov
|
||||||
|
Alex Chen
|
||||||
|
Alvaro Fernando García
|
||||||
|
Amarandus
|
||||||
|
Amitai Burstein
|
||||||
|
Andreas Pauley
|
||||||
|
Andrew Jones
|
||||||
|
Andriy Mykhaylyk
|
||||||
|
Arnout Engelen
|
||||||
|
Ben Boeckel
|
||||||
|
Ben Creasy
|
||||||
|
Boyd Kelly
|
||||||
|
Brian Scott
|
||||||
|
Brian Wignall
|
||||||
|
Bryan Richter
|
||||||
|
Caleb Maclennan
|
||||||
|
Carel Fellinger
|
||||||
|
Carl Richard Theodor Schneider
|
||||||
|
Carlos Lopez-Camey
|
||||||
|
Christian G. Warden
|
||||||
|
Christoph Nicolai
|
||||||
|
Clint Adams
|
||||||
|
Colin Woodbury
|
||||||
|
Damien Cassou
|
||||||
|
David Reaver
|
||||||
|
David Zhang
|
||||||
|
Dmitry Astapov
|
||||||
|
Dominik Süß
|
||||||
|
Doug Goldstein
|
||||||
|
Eli Flanagan
|
||||||
|
Elijah Caine
|
||||||
|
Eric Kow
|
||||||
|
Eric Mertens
|
||||||
|
Everett Hildenbrandt
|
||||||
|
Evilham
|
||||||
|
Felix Van der Jeugt
|
||||||
|
Felix Yan
|
||||||
|
Fun Ilrys (Nissar Chababy)
|
||||||
|
Gabriel Ebner
|
||||||
|
Gaith Hallak
|
||||||
|
Gergely Risko
|
||||||
|
Hans-Peter Deifel
|
||||||
|
Henning Thielemann
|
||||||
|
Imuli
|
||||||
|
Jacek Generowicz
|
||||||
|
Jacob Weisz
|
||||||
|
Jakob Schöttl
|
||||||
|
Jakub Zárybnický
|
||||||
|
Jan Zerebecki
|
||||||
|
Jeff Richards
|
||||||
|
Jesse Rosenthal
|
||||||
|
Joachim Breitner
|
||||||
|
Joe Horsnell
|
||||||
|
Johann Klähn
|
||||||
|
Johannes Gerer
|
||||||
|
John Wiegley
|
||||||
|
Joseph Weston
|
||||||
|
Joshua Chia
|
||||||
|
Joshua Kehn
|
||||||
|
Judah Jacobson
|
||||||
|
Julien Moutinho
|
||||||
|
Justin Le
|
||||||
|
Kyle Marek-Spartz
|
||||||
|
Luca Molteni
|
||||||
|
Léo Gaspard
|
||||||
|
M Parker
|
||||||
|
Malte Brandy
|
||||||
|
Mark Hansen
|
||||||
|
Marko Kocić
|
||||||
|
Martin Michlmayr
|
||||||
|
Mateus Furquim
|
||||||
|
Matthias Kauer
|
||||||
|
Max Bolingbroke
|
||||||
|
Michael Kainer
|
||||||
|
Michael Sanders
|
||||||
|
Michael Snoyman
|
||||||
|
Michael Walker
|
||||||
|
Mick Dekkers
|
||||||
|
Mitchell Rosen
|
||||||
|
Moritz Kiefer
|
||||||
|
Mykola Orliuk
|
||||||
|
Nadrieril
|
||||||
|
Nicholas Niro
|
||||||
|
Nick Ingolia
|
||||||
|
Nicolas Wavrant
|
||||||
|
Nikhil Jha
|
||||||
|
Nissar Chababy
|
||||||
|
Nolan Darilek
|
||||||
|
Oliver Braun
|
||||||
|
Omari Norman
|
||||||
|
Pavan Rikhi
|
||||||
|
Pavlo Kerestey
|
||||||
|
Peter Simons
|
||||||
|
Pia Mancini
|
||||||
|
Rick Lupton
|
||||||
|
Roman Cheplyaka
|
||||||
|
Rui Chen
|
||||||
|
Ryan Desfosses
|
||||||
|
Sam Doshi
|
||||||
|
Sam Jeeves
|
||||||
|
Samuel May
|
||||||
|
Sergei Trofimovich
|
||||||
|
Sergey Astanin
|
||||||
|
Shubham Lagwankar
|
||||||
|
Simon Hengel
|
||||||
|
Simon Michael
|
||||||
|
SpicyCat
|
||||||
|
Stefano Rodighiero
|
||||||
|
Stephen Morgan
|
||||||
|
Steven R. Baker
|
||||||
|
TANIGUCHI Kohei
|
||||||
|
Thomas R. Koll
|
||||||
|
Tim Docker
|
||||||
|
Timofey ZAKREVSKIY
|
||||||
|
Trygve Laugstøl
|
||||||
|
Vladimir Sorokin
|
||||||
|
Vladimir Zhelezov
|
||||||
|
Wad
|
||||||
|
Xinruo Sun
|
||||||
|
afarrow
|
||||||
|
agander
|
||||||
|
aragaer
|
||||||
|
awjchen
|
||||||
|
azure-pipelines[bot]
|
||||||
|
flip111
|
||||||
|
gwern
|
||||||
|
jeevcat
|
||||||
|
jungle-boogie
|
||||||
|
legrostdg
|
||||||
|
trevorriles
|
||||||
|
zieone
|
||||||
|
```
|
||||||
|
|
||||||
|
<!--
|
||||||
|
https://pandoc.org/MANUAL.html#slide-shows
|
||||||
|
|
||||||
|
By default, the slide level is the highest heading level in the
|
||||||
|
hierarchy that is followed immediately by content, and not another
|
||||||
|
heading, somewhere in the document. In the example above, level-1
|
||||||
|
headings are always followed by level-2 headings, which are followed
|
||||||
|
by content, so the slide level is 2. This default can be overridden
|
||||||
|
using the --slide-level option.
|
||||||
|
|
||||||
|
The document is carved up into slides according to the following rules:
|
||||||
|
A horizontal rule always starts a new slide.
|
||||||
|
A heading at the slide level always starts a new slide.
|
||||||
|
Headings below the slide level in the hierarchy create headings within a slide.
|
||||||
|
Headings above the slide level in the hierarchy create “title slides,” which just contain the section title and help to break the slide show into sections. Non-slide content under these headings will be included on the title slide (for HTML slide shows) or in a subsequent slide with the same title (for beamer).
|
||||||
|
-->
|
||||||
|
|
||||||
380
haskellerz.revealjs.html
Normal file
380
haskellerz.revealjs.html
Normal file
@ -0,0 +1,380 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="generator" content="pandoc">
|
||||||
|
<meta name="author" content="Simon Michael">
|
||||||
|
<meta name="dcterms.date" content="2021-04-29">
|
||||||
|
<title>Inside hledger: an architectural tour and how-to</title>
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/reveal.js@^4//dist/reset.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/reveal.js@^4//dist/reveal.css">
|
||||||
|
<style>
|
||||||
|
code{white-space: pre-wrap;}
|
||||||
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
span.underline{text-decoration: underline;}
|
||||||
|
div.column{display: inline-block; vertical-align: top; width: 50%;}
|
||||||
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
|
ul.task-list{list-style: none;}
|
||||||
|
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
||||||
|
</style>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/reveal.js@^4//dist/theme/black.css" id="theme">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="reveal">
|
||||||
|
<div class="slides">
|
||||||
|
|
||||||
|
<section id="title-slide">
|
||||||
|
<h1 class="title">Inside hledger: an architectural tour and how-to</h1>
|
||||||
|
<p class="author">Simon Michael</p>
|
||||||
|
<p class="date">April 29, 2021</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<section id="introductions" class="title-slide slide level1">
|
||||||
|
<h1>Introductions</h1>
|
||||||
|
<p><code>0:00 (10m)</code></p>
|
||||||
|
</section>
|
||||||
|
<section id="who-am-i" class="slide level2">
|
||||||
|
<h2>Who am I ?</h2>
|
||||||
|
<p>Simon Michael<br />
|
||||||
|
Independent software consultant and developer.<br />
|
||||||
|
<!-- Currently based in Hawaii. --> <a href="https://joyful.com" class="uri">https://joyful.com</a></p>
|
||||||
|
<p>Started in the home computer era (Ireland, 80s). ZX-80, Pet, VIC, C64, Amiga, PC, Mac, VAX/VMS, unix..</p>
|
||||||
|
<p>FOSS fan, contributor, project leader. Two big projects:</p>
|
||||||
|
<ul>
|
||||||
|
<li><p><strong>Zwiki</strong>, 1996-2006, wiki engine, Python/Zope</p></li>
|
||||||
|
<li><p><strong>hledger</strong>, 2006-present, accounting tool, Haskell</p></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section id="overview-of-talk" class="slide level2">
|
||||||
|
<h2>Overview of talk</h2>
|
||||||
|
<ul>
|
||||||
|
<li><p>A quick intro to plain text accounting and hledger. (10m)</p></li>
|
||||||
|
<li><p>A tour of hledger’s architecture, codebase, evolutions, and design principles. (25m)</p></li>
|
||||||
|
<li><p>How to script and develop hledger: custom commands, calling from other apps, troubleshooting, bug investigation, effective pull requests. (25m)</p></li>
|
||||||
|
<li><p>Q&A to go deeper on whatever you like. (30m)</p></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section id="whats-plain-text-accounting" class="slide level2">
|
||||||
|
<h2>What’s Plain Text Accounting ?</h2>
|
||||||
|
<p>A name I proposed (and a website I built) to help unify and grow the communities around Ledger, hledger, Beancount and similar accounting tools.</p>
|
||||||
|
<p><a href="https://plaintextaccounting.org" class="uri">https://plaintextaccounting.org</a></p>
|
||||||
|
</section>
|
||||||
|
<section id="the-pta-ecosystem" class="slide level2">
|
||||||
|
<h2>The PTA ecosystem</h2>
|
||||||
|
<p>The “big three” apps:</p>
|
||||||
|
<ul>
|
||||||
|
<li><p><strong>Ledger</strong> - John Wiegley’s pioneering command line accounting app, inspiration for all the rest.<br />
|
||||||
|
C++, 2003-present</p></li>
|
||||||
|
<li><p><strong>hledger</strong> - Simon Michael’s rewrite/remix.<br />
|
||||||
|
Haskell, 2007-present</p></li>
|
||||||
|
<li><p><strong>Beancount</strong> - Martin Blais’ variant.<br />
|
||||||
|
Python, 2008-present</p></li>
|
||||||
|
</ul>
|
||||||
|
<p>Many more apps and add-on tools - <a href="https://plaintextaccounting.org/#software" class="uri">https://plaintextaccounting.org/#software</a></p>
|
||||||
|
</section>
|
||||||
|
<section id="whats-hledger" class="slide level2">
|
||||||
|
<h2>What’s hledger ?</h2>
|
||||||
|
<p>A suite of tools, file formats, and documentation for doing “plain text accounting”.</p>
|
||||||
|
<p><a href="https://hledger.org" class="uri">https://hledger.org</a></p>
|
||||||
|
</section>
|
||||||
|
<section id="a-successful-foss-project" class="slide level2">
|
||||||
|
<h2>A successful FOSS project</h2>
|
||||||
|
<p>15 years, 134 contributors, 80-100 chatters, some number of happy users, useful to me every week.</p>
|
||||||
|
<p>Reasonably successful.</p>
|
||||||
|
<p>Not fulfilling my original goal of being financially self-sustaining and minimally time-consuming !</p>
|
||||||
|
</section>
|
||||||
|
<section id="an-end-user-haskell-application" class="slide level2">
|
||||||
|
<h2>An end-user Haskell application</h2>
|
||||||
|
<p>hledger is something that’s not yet common:</p>
|
||||||
|
<p>An end user application (ie: not a programming tool), written in Haskell, that aims to be</p>
|
||||||
|
<ul>
|
||||||
|
<li>easy to install,</li>
|
||||||
|
<li>dependable,</li>
|
||||||
|
<li>and pleasing to use,</li>
|
||||||
|
<li>on all major platforms,</li>
|
||||||
|
<li>by non-techies as well as power users.</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section id="tools" class="slide level2">
|
||||||
|
<h2>Tools</h2>
|
||||||
|
<ul>
|
||||||
|
<li>hledger</li>
|
||||||
|
<li>hledger-ui</li>
|
||||||
|
<li>hledger-web</li>
|
||||||
|
<li>hledger-iadd</li>
|
||||||
|
<li>hledger-interest</li>
|
||||||
|
<li>etc.</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section id="file-formats" class="slide level2">
|
||||||
|
<h2>File formats</h2>
|
||||||
|
<ul>
|
||||||
|
<li>journal</li>
|
||||||
|
<li>csv</li>
|
||||||
|
<li>timeclock</li>
|
||||||
|
<li>timedot</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section id="documentation" class="slide level2">
|
||||||
|
<h2>Documentation</h2>
|
||||||
|
<ul>
|
||||||
|
<li>introductory</li>
|
||||||
|
<li>reference</li>
|
||||||
|
<li>cookbook</li>
|
||||||
|
<li>developer</li>
|
||||||
|
</ul>
|
||||||
|
</section></section>
|
||||||
|
<section>
|
||||||
|
<section id="architecture" class="title-slide slide level1">
|
||||||
|
<h1>Architecture</h1>
|
||||||
|
<p><code>0:10 (25m)</code></p>
|
||||||
|
</section>
|
||||||
|
<section id="hledger-project-goals" class="slide level2">
|
||||||
|
<h2>hledger project goals</h2>
|
||||||
|
<p>I was a Ledger user and new Haskeller. I started hledger with many goals:</p>
|
||||||
|
<ul>
|
||||||
|
<li>acquire a more robust, usable, evolving incarnation of Ledger</li>
|
||||||
|
<li>develop a consistent, effective accounting habit</li>
|
||||||
|
<li>get better at Haskell</li>
|
||||||
|
<li>find out if Haskell was good for end-user apps and maintainer productivity</li>
|
||||||
|
<li>grow a useful, long-lasting, financially sustainable FOSS accounting project</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section id="a-fast-run-through-the-evolution" class="slide level2">
|
||||||
|
<h2>A fast run through the evolution</h2>
|
||||||
|
<ul>
|
||||||
|
<li>First commit</li>
|
||||||
|
<li>First types</li>
|
||||||
|
<li>First report</li>
|
||||||
|
<li>Balance report</li>
|
||||||
|
<li>Multi-column balance report</li>
|
||||||
|
<li>Stateful parser</li>
|
||||||
|
<li>Web interface</li>
|
||||||
|
<li>Curses interface</li>
|
||||||
|
<li>Package split</li>
|
||||||
|
<li>Speed, features</li>
|
||||||
|
<li>General currency conversion</li>
|
||||||
|
<li>Valuation</li>
|
||||||
|
<li>Always documentation</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section id="a-tour-of-the-codebase-and-project-today-2021q2" class="slide level2">
|
||||||
|
<h2>A tour of the codebase and project today (2021Q2)</h2>
|
||||||
|
</section>
|
||||||
|
<section id="design-principles" class="slide level2">
|
||||||
|
<h2>Design principles</h2>
|
||||||
|
</section></section>
|
||||||
|
<section>
|
||||||
|
<section id="how-to.." class="title-slide slide level1">
|
||||||
|
<h1>How to..</h1>
|
||||||
|
<p><code>0:35 (25m)</code></p>
|
||||||
|
</section>
|
||||||
|
<section id="script-hledger" class="slide level2">
|
||||||
|
<h2>Script hledger</h2>
|
||||||
|
</section>
|
||||||
|
<section id="integrate-hledger-in-your-app" class="slide level2">
|
||||||
|
<h2>Integrate hledger in your app</h2>
|
||||||
|
<h3 id="run-cli-capture-csvjson">Run cli, capture csv/json</h3>
|
||||||
|
<h3 id="run-hledger-web-use-http-json-api">Run hledger-web, use http-json api</h3>
|
||||||
|
<h3 id="link-with-hledger-lib-andor-other-hledger-packages-call-public-functions">Link with hledger-lib and/or other hledger packages, call public functions</h3>
|
||||||
|
</section>
|
||||||
|
<section id="investigate-a-hledger-bug" class="slide level2">
|
||||||
|
<h2>Investigate a hledger bug</h2>
|
||||||
|
<h3 id="basic-troubleshooting---docs-comparison-minimisation-reproduction-support">Basic troubleshooting - docs, comparison, minimisation, reproduction, support</h3>
|
||||||
|
<h3 id="code-debugging">Code debugging</h3>
|
||||||
|
</section>
|
||||||
|
<section id="how-to-submit-a-pull-request" class="slide level2">
|
||||||
|
<h2>How to submit a pull request</h2>
|
||||||
|
</section></section>
|
||||||
|
<section id="q-a" class="title-slide slide level1">
|
||||||
|
<h1>Q & A</h1>
|
||||||
|
<p><code>1:00 (30m)</code></p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="end" class="title-slide slide level1">
|
||||||
|
<h1>End</h1>
|
||||||
|
<p><code>1:30</code></p>
|
||||||
|
<pre><code>$ git shortlog -s
|
||||||
|
Aerex
|
||||||
|
Aiken Cairncross
|
||||||
|
Alejandro García Montoro
|
||||||
|
Aleksandar Dimitrov
|
||||||
|
Alex Chen
|
||||||
|
Alvaro Fernando García
|
||||||
|
Amarandus
|
||||||
|
Amitai Burstein
|
||||||
|
Andreas Pauley
|
||||||
|
Andrew Jones
|
||||||
|
Andriy Mykhaylyk
|
||||||
|
Arnout Engelen
|
||||||
|
Ben Boeckel
|
||||||
|
Ben Creasy
|
||||||
|
Boyd Kelly
|
||||||
|
Brian Scott
|
||||||
|
Brian Wignall
|
||||||
|
Bryan Richter
|
||||||
|
Caleb Maclennan
|
||||||
|
Carel Fellinger
|
||||||
|
Carl Richard Theodor Schneider
|
||||||
|
Carlos Lopez-Camey
|
||||||
|
Christian G. Warden
|
||||||
|
Christoph Nicolai
|
||||||
|
Clint Adams
|
||||||
|
Colin Woodbury
|
||||||
|
Damien Cassou
|
||||||
|
David Reaver
|
||||||
|
David Zhang
|
||||||
|
Dmitry Astapov
|
||||||
|
Dominik Süß
|
||||||
|
Doug Goldstein
|
||||||
|
Eli Flanagan
|
||||||
|
Elijah Caine
|
||||||
|
Eric Kow
|
||||||
|
Eric Mertens
|
||||||
|
Everett Hildenbrandt
|
||||||
|
Evilham
|
||||||
|
Felix Van der Jeugt
|
||||||
|
Felix Yan
|
||||||
|
Fun Ilrys (Nissar Chababy)
|
||||||
|
Gabriel Ebner
|
||||||
|
Gaith Hallak
|
||||||
|
Gergely Risko
|
||||||
|
Hans-Peter Deifel
|
||||||
|
Henning Thielemann
|
||||||
|
Imuli
|
||||||
|
Jacek Generowicz
|
||||||
|
Jacob Weisz
|
||||||
|
Jakob Schöttl
|
||||||
|
Jakub Zárybnický
|
||||||
|
Jan Zerebecki
|
||||||
|
Jeff Richards
|
||||||
|
Jesse Rosenthal
|
||||||
|
Joachim Breitner
|
||||||
|
Joe Horsnell
|
||||||
|
Johann Klähn
|
||||||
|
Johannes Gerer
|
||||||
|
John Wiegley
|
||||||
|
Joseph Weston
|
||||||
|
Joshua Chia
|
||||||
|
Joshua Kehn
|
||||||
|
Judah Jacobson
|
||||||
|
Julien Moutinho
|
||||||
|
Justin Le
|
||||||
|
Kyle Marek-Spartz
|
||||||
|
Luca Molteni
|
||||||
|
Léo Gaspard
|
||||||
|
M Parker
|
||||||
|
Malte Brandy
|
||||||
|
Mark Hansen
|
||||||
|
Marko Kocić
|
||||||
|
Martin Michlmayr
|
||||||
|
Mateus Furquim
|
||||||
|
Matthias Kauer
|
||||||
|
Max Bolingbroke
|
||||||
|
Michael Kainer
|
||||||
|
Michael Sanders
|
||||||
|
Michael Snoyman
|
||||||
|
Michael Walker
|
||||||
|
Mick Dekkers
|
||||||
|
Mitchell Rosen
|
||||||
|
Moritz Kiefer
|
||||||
|
Mykola Orliuk
|
||||||
|
Nadrieril
|
||||||
|
Nicholas Niro
|
||||||
|
Nick Ingolia
|
||||||
|
Nicolas Wavrant
|
||||||
|
Nikhil Jha
|
||||||
|
Nissar Chababy
|
||||||
|
Nolan Darilek
|
||||||
|
Oliver Braun
|
||||||
|
Omari Norman
|
||||||
|
Pavan Rikhi
|
||||||
|
Pavlo Kerestey
|
||||||
|
Peter Simons
|
||||||
|
Pia Mancini
|
||||||
|
Rick Lupton
|
||||||
|
Roman Cheplyaka
|
||||||
|
Rui Chen
|
||||||
|
Ryan Desfosses
|
||||||
|
Sam Doshi
|
||||||
|
Sam Jeeves
|
||||||
|
Samuel May
|
||||||
|
Sergei Trofimovich
|
||||||
|
Sergey Astanin
|
||||||
|
Shubham Lagwankar
|
||||||
|
Simon Hengel
|
||||||
|
Simon Michael
|
||||||
|
SpicyCat
|
||||||
|
Stefano Rodighiero
|
||||||
|
Stephen Morgan
|
||||||
|
Steven R. Baker
|
||||||
|
TANIGUCHI Kohei
|
||||||
|
Thomas R. Koll
|
||||||
|
Tim Docker
|
||||||
|
Timofey ZAKREVSKIY
|
||||||
|
Trygve Laugstøl
|
||||||
|
Vladimir Sorokin
|
||||||
|
Vladimir Zhelezov
|
||||||
|
Wad
|
||||||
|
Xinruo Sun
|
||||||
|
afarrow
|
||||||
|
agander
|
||||||
|
aragaer
|
||||||
|
awjchen
|
||||||
|
azure-pipelines[bot]
|
||||||
|
flip111
|
||||||
|
gwern
|
||||||
|
jeevcat
|
||||||
|
jungle-boogie
|
||||||
|
legrostdg
|
||||||
|
trevorriles
|
||||||
|
zieone</code></pre>
|
||||||
|
<!--
|
||||||
|
https://pandoc.org/MANUAL.html#slide-shows
|
||||||
|
|
||||||
|
By default, the slide level is the highest heading level in the
|
||||||
|
hierarchy that is followed immediately by content, and not another
|
||||||
|
heading, somewhere in the document. In the example above, level-1
|
||||||
|
headings are always followed by level-2 headings, which are followed
|
||||||
|
by content, so the slide level is 2. This default can be overridden
|
||||||
|
using the --slide-level option.
|
||||||
|
|
||||||
|
The document is carved up into slides according to the following rules:
|
||||||
|
A horizontal rule always starts a new slide.
|
||||||
|
A heading at the slide level always starts a new slide.
|
||||||
|
Headings below the slide level in the hierarchy create headings within a slide.
|
||||||
|
Headings above the slide level in the hierarchy create “title slides,” which just contain the section title and help to break the slide show into sections. Non-slide content under these headings will be included on the title slide (for HTML slide shows) or in a subsequent slide with the same title (for beamer).
|
||||||
|
-->
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="https://unpkg.com/reveal.js@^4//dist/reveal.js"></script>
|
||||||
|
|
||||||
|
// reveal.js plugins
|
||||||
|
<script src="https://unpkg.com/reveal.js@^4//plugin/notes/notes.js"></script>
|
||||||
|
<script src="https://unpkg.com/reveal.js@^4//plugin/search/search.js"></script>
|
||||||
|
<script src="https://unpkg.com/reveal.js@^4//plugin/zoom/zoom.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
// Full list of configuration options available at:
|
||||||
|
// https://revealjs.com/config/
|
||||||
|
Reveal.initialize({
|
||||||
|
// Push each slide change to the browser history
|
||||||
|
history: true,
|
||||||
|
|
||||||
|
// reveal.js plugins
|
||||||
|
plugins: [
|
||||||
|
RevealNotes,
|
||||||
|
RevealSearch,
|
||||||
|
RevealZoom
|
||||||
|
]
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
353
haskellerz.slidy.html
Normal file
353
haskellerz.slidy.html
Normal file
@ -0,0 +1,353 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta http-equiv="Content-Style-Type" content="text/css" />
|
||||||
|
<meta name="generator" content="pandoc" />
|
||||||
|
<meta name="author" content="Simon Michael" />
|
||||||
|
<meta name="date" content="2021-04-29" />
|
||||||
|
<title>Inside hledger: an architectural tour and how-to</title>
|
||||||
|
<style type="text/css">
|
||||||
|
code{white-space: pre-wrap;}
|
||||||
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
span.underline{text-decoration: underline;}
|
||||||
|
div.column{display: inline-block; vertical-align: top; width: 50%;}
|
||||||
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
|
ul.task-list{list-style: none;}
|
||||||
|
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
||||||
|
</style>
|
||||||
|
<link rel="stylesheet" type="text/css" media="screen, projection, print"
|
||||||
|
href="https://www.w3.org/Talks/Tools/Slidy2/styles/slidy.css" />
|
||||||
|
<script src="https://www.w3.org/Talks/Tools/Slidy2/scripts/slidy.js"
|
||||||
|
charset="utf-8" type="text/javascript"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="slide titlepage">
|
||||||
|
<h1 class="title">Inside hledger: an architectural tour and how-to</h1>
|
||||||
|
<p class="author">
|
||||||
|
Simon Michael
|
||||||
|
</p>
|
||||||
|
<p class="date">April 29, 2021</p>
|
||||||
|
</div>
|
||||||
|
<div id="introductions" class="title-slide slide section level1">
|
||||||
|
<h1>Introductions</h1>
|
||||||
|
<p><code>0:00 (10m)</code></p>
|
||||||
|
</div>
|
||||||
|
<div id="who-am-i" class="slide section level2">
|
||||||
|
<h1>Who am I ?</h1>
|
||||||
|
<p>Simon Michael<br />
|
||||||
|
Independent software consultant and developer.<br />
|
||||||
|
<!-- Currently based in Hawaii. --> <a href="https://joyful.com" class="uri">https://joyful.com</a></p>
|
||||||
|
<p>Started in the home computer era (Ireland, 80s). ZX-80, Pet, VIC, C64, Amiga, PC, Mac, VAX/VMS, unix..</p>
|
||||||
|
<p>FOSS fan, contributor, project leader. Two big projects:</p>
|
||||||
|
<ul>
|
||||||
|
<li><p><strong>Zwiki</strong>, 1996-2006, wiki engine, Python/Zope</p></li>
|
||||||
|
<li><p><strong>hledger</strong>, 2006-present, accounting tool, Haskell</p></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="overview-of-talk" class="slide section level2">
|
||||||
|
<h1>Overview of talk</h1>
|
||||||
|
<ul>
|
||||||
|
<li><p>A quick intro to plain text accounting and hledger. (10m)</p></li>
|
||||||
|
<li><p>A tour of hledger’s architecture, codebase, evolutions, and design principles. (25m)</p></li>
|
||||||
|
<li><p>How to script and develop hledger: custom commands, calling from other apps, troubleshooting, bug investigation, effective pull requests. (25m)</p></li>
|
||||||
|
<li><p>Q&A to go deeper on whatever you like. (30m)</p></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="whats-plain-text-accounting" class="slide section level2">
|
||||||
|
<h1>What’s Plain Text Accounting ?</h1>
|
||||||
|
<p>A name I proposed (and a website I built) to help unify and grow the communities around Ledger, hledger, Beancount and similar accounting tools.</p>
|
||||||
|
<p><a href="https://plaintextaccounting.org" class="uri">https://plaintextaccounting.org</a></p>
|
||||||
|
</div>
|
||||||
|
<div id="the-pta-ecosystem" class="slide section level2">
|
||||||
|
<h1>The PTA ecosystem</h1>
|
||||||
|
<p>The “big three” apps:</p>
|
||||||
|
<ul>
|
||||||
|
<li><p><strong>Ledger</strong> - John Wiegley’s pioneering command line accounting app, inspiration for all the rest.<br />
|
||||||
|
C++, 2003-present</p></li>
|
||||||
|
<li><p><strong>hledger</strong> - Simon Michael’s rewrite/remix.<br />
|
||||||
|
Haskell, 2007-present</p></li>
|
||||||
|
<li><p><strong>Beancount</strong> - Martin Blais’ variant.<br />
|
||||||
|
Python, 2008-present</p></li>
|
||||||
|
</ul>
|
||||||
|
<p>Many more apps and add-on tools - <a href="https://plaintextaccounting.org/#software" class="uri">https://plaintextaccounting.org/#software</a></p>
|
||||||
|
</div>
|
||||||
|
<div id="whats-hledger" class="slide section level2">
|
||||||
|
<h1>What’s hledger ?</h1>
|
||||||
|
<p>A suite of tools, file formats, and documentation for doing “plain text accounting”.</p>
|
||||||
|
<p><a href="https://hledger.org" class="uri">https://hledger.org</a></p>
|
||||||
|
</div>
|
||||||
|
<div id="a-successful-foss-project" class="slide section level2">
|
||||||
|
<h1>A successful FOSS project</h1>
|
||||||
|
<p>15 years, 134 contributors, 80-100 chatters, some number of happy users, useful to me every week.</p>
|
||||||
|
<p>Reasonably successful.</p>
|
||||||
|
<p>Not fulfilling my original goal of being financially self-sustaining and minimally time-consuming !</p>
|
||||||
|
</div>
|
||||||
|
<div id="an-end-user-haskell-application" class="slide section level2">
|
||||||
|
<h1>An end-user Haskell application</h1>
|
||||||
|
<p>hledger is something that’s not yet common:</p>
|
||||||
|
<p>An end user application (ie: not a programming tool), written in Haskell, that aims to be</p>
|
||||||
|
<ul>
|
||||||
|
<li>easy to install,</li>
|
||||||
|
<li>dependable,</li>
|
||||||
|
<li>and pleasing to use,</li>
|
||||||
|
<li>on all major platforms,</li>
|
||||||
|
<li>by non-techies as well as power users.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="tools" class="slide section level2">
|
||||||
|
<h1>Tools</h1>
|
||||||
|
<ul>
|
||||||
|
<li>hledger</li>
|
||||||
|
<li>hledger-ui</li>
|
||||||
|
<li>hledger-web</li>
|
||||||
|
<li>hledger-iadd</li>
|
||||||
|
<li>hledger-interest</li>
|
||||||
|
<li>etc.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="file-formats" class="slide section level2">
|
||||||
|
<h1>File formats</h1>
|
||||||
|
<ul>
|
||||||
|
<li>journal</li>
|
||||||
|
<li>csv</li>
|
||||||
|
<li>timeclock</li>
|
||||||
|
<li>timedot</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="documentation" class="slide section level2">
|
||||||
|
<h1>Documentation</h1>
|
||||||
|
<ul>
|
||||||
|
<li>introductory</li>
|
||||||
|
<li>reference</li>
|
||||||
|
<li>cookbook</li>
|
||||||
|
<li>developer</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="architecture" class="title-slide slide section level1">
|
||||||
|
<h1>Architecture</h1>
|
||||||
|
<p><code>0:10 (25m)</code></p>
|
||||||
|
</div>
|
||||||
|
<div id="hledger-project-goals" class="slide section level2">
|
||||||
|
<h1>hledger project goals</h1>
|
||||||
|
<p>I was a Ledger user and new Haskeller. I started hledger with many goals:</p>
|
||||||
|
<ul>
|
||||||
|
<li>acquire a more robust, usable, evolving incarnation of Ledger</li>
|
||||||
|
<li>develop a consistent, effective accounting habit</li>
|
||||||
|
<li>get better at Haskell</li>
|
||||||
|
<li>find out if Haskell was good for end-user apps and maintainer productivity</li>
|
||||||
|
<li>grow a useful, long-lasting, financially sustainable FOSS accounting project</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="a-fast-run-through-the-evolution" class="slide section level2">
|
||||||
|
<h1>A fast run through the evolution</h1>
|
||||||
|
<ul>
|
||||||
|
<li>First commit</li>
|
||||||
|
<li>First types</li>
|
||||||
|
<li>First report</li>
|
||||||
|
<li>Balance report</li>
|
||||||
|
<li>Multi-column balance report</li>
|
||||||
|
<li>Stateful parser</li>
|
||||||
|
<li>Web interface</li>
|
||||||
|
<li>Curses interface</li>
|
||||||
|
<li>Package split</li>
|
||||||
|
<li>Speed, features</li>
|
||||||
|
<li>General currency conversion</li>
|
||||||
|
<li>Valuation</li>
|
||||||
|
<li>Always documentation</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="a-tour-of-the-codebase-and-project-today-2021q2" class="slide section level2">
|
||||||
|
<h1>A tour of the codebase and project today (2021Q2)</h1>
|
||||||
|
</div>
|
||||||
|
<div id="design-principles" class="slide section level2">
|
||||||
|
<h1>Design principles</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="how-to.." class="title-slide slide section level1">
|
||||||
|
<h1>How to..</h1>
|
||||||
|
<p><code>0:35 (25m)</code></p>
|
||||||
|
</div>
|
||||||
|
<div id="script-hledger" class="slide section level2">
|
||||||
|
<h1>Script hledger</h1>
|
||||||
|
</div>
|
||||||
|
<div id="integrate-hledger-in-your-app" class="slide section level2">
|
||||||
|
<h1>Integrate hledger in your app</h1>
|
||||||
|
<h3 id="run-cli-capture-csvjson">Run cli, capture csv/json</h3>
|
||||||
|
<h3 id="run-hledger-web-use-http-json-api">Run hledger-web, use http-json api</h3>
|
||||||
|
<h3 id="link-with-hledger-lib-andor-other-hledger-packages-call-public-functions">Link with hledger-lib and/or other hledger packages, call public functions</h3>
|
||||||
|
</div>
|
||||||
|
<div id="investigate-a-hledger-bug" class="slide section level2">
|
||||||
|
<h1>Investigate a hledger bug</h1>
|
||||||
|
<h3 id="basic-troubleshooting---docs-comparison-minimisation-reproduction-support">Basic troubleshooting - docs, comparison, minimisation, reproduction, support</h3>
|
||||||
|
<h3 id="code-debugging">Code debugging</h3>
|
||||||
|
</div>
|
||||||
|
<div id="how-to-submit-a-pull-request" class="slide section level2">
|
||||||
|
<h1>How to submit a pull request</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="q-a" class="title-slide slide section level1">
|
||||||
|
<h1>Q & A</h1>
|
||||||
|
<p><code>1:00 (30m)</code></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="end" class="title-slide slide section level1">
|
||||||
|
<h1>End</h1>
|
||||||
|
<p><code>1:30</code></p>
|
||||||
|
<pre><code>$ git shortlog -s
|
||||||
|
Aerex
|
||||||
|
Aiken Cairncross
|
||||||
|
Alejandro García Montoro
|
||||||
|
Aleksandar Dimitrov
|
||||||
|
Alex Chen
|
||||||
|
Alvaro Fernando García
|
||||||
|
Amarandus
|
||||||
|
Amitai Burstein
|
||||||
|
Andreas Pauley
|
||||||
|
Andrew Jones
|
||||||
|
Andriy Mykhaylyk
|
||||||
|
Arnout Engelen
|
||||||
|
Ben Boeckel
|
||||||
|
Ben Creasy
|
||||||
|
Boyd Kelly
|
||||||
|
Brian Scott
|
||||||
|
Brian Wignall
|
||||||
|
Bryan Richter
|
||||||
|
Caleb Maclennan
|
||||||
|
Carel Fellinger
|
||||||
|
Carl Richard Theodor Schneider
|
||||||
|
Carlos Lopez-Camey
|
||||||
|
Christian G. Warden
|
||||||
|
Christoph Nicolai
|
||||||
|
Clint Adams
|
||||||
|
Colin Woodbury
|
||||||
|
Damien Cassou
|
||||||
|
David Reaver
|
||||||
|
David Zhang
|
||||||
|
Dmitry Astapov
|
||||||
|
Dominik Süß
|
||||||
|
Doug Goldstein
|
||||||
|
Eli Flanagan
|
||||||
|
Elijah Caine
|
||||||
|
Eric Kow
|
||||||
|
Eric Mertens
|
||||||
|
Everett Hildenbrandt
|
||||||
|
Evilham
|
||||||
|
Felix Van der Jeugt
|
||||||
|
Felix Yan
|
||||||
|
Fun Ilrys (Nissar Chababy)
|
||||||
|
Gabriel Ebner
|
||||||
|
Gaith Hallak
|
||||||
|
Gergely Risko
|
||||||
|
Hans-Peter Deifel
|
||||||
|
Henning Thielemann
|
||||||
|
Imuli
|
||||||
|
Jacek Generowicz
|
||||||
|
Jacob Weisz
|
||||||
|
Jakob Schöttl
|
||||||
|
Jakub Zárybnický
|
||||||
|
Jan Zerebecki
|
||||||
|
Jeff Richards
|
||||||
|
Jesse Rosenthal
|
||||||
|
Joachim Breitner
|
||||||
|
Joe Horsnell
|
||||||
|
Johann Klähn
|
||||||
|
Johannes Gerer
|
||||||
|
John Wiegley
|
||||||
|
Joseph Weston
|
||||||
|
Joshua Chia
|
||||||
|
Joshua Kehn
|
||||||
|
Judah Jacobson
|
||||||
|
Julien Moutinho
|
||||||
|
Justin Le
|
||||||
|
Kyle Marek-Spartz
|
||||||
|
Luca Molteni
|
||||||
|
Léo Gaspard
|
||||||
|
M Parker
|
||||||
|
Malte Brandy
|
||||||
|
Mark Hansen
|
||||||
|
Marko Kocić
|
||||||
|
Martin Michlmayr
|
||||||
|
Mateus Furquim
|
||||||
|
Matthias Kauer
|
||||||
|
Max Bolingbroke
|
||||||
|
Michael Kainer
|
||||||
|
Michael Sanders
|
||||||
|
Michael Snoyman
|
||||||
|
Michael Walker
|
||||||
|
Mick Dekkers
|
||||||
|
Mitchell Rosen
|
||||||
|
Moritz Kiefer
|
||||||
|
Mykola Orliuk
|
||||||
|
Nadrieril
|
||||||
|
Nicholas Niro
|
||||||
|
Nick Ingolia
|
||||||
|
Nicolas Wavrant
|
||||||
|
Nikhil Jha
|
||||||
|
Nissar Chababy
|
||||||
|
Nolan Darilek
|
||||||
|
Oliver Braun
|
||||||
|
Omari Norman
|
||||||
|
Pavan Rikhi
|
||||||
|
Pavlo Kerestey
|
||||||
|
Peter Simons
|
||||||
|
Pia Mancini
|
||||||
|
Rick Lupton
|
||||||
|
Roman Cheplyaka
|
||||||
|
Rui Chen
|
||||||
|
Ryan Desfosses
|
||||||
|
Sam Doshi
|
||||||
|
Sam Jeeves
|
||||||
|
Samuel May
|
||||||
|
Sergei Trofimovich
|
||||||
|
Sergey Astanin
|
||||||
|
Shubham Lagwankar
|
||||||
|
Simon Hengel
|
||||||
|
Simon Michael
|
||||||
|
SpicyCat
|
||||||
|
Stefano Rodighiero
|
||||||
|
Stephen Morgan
|
||||||
|
Steven R. Baker
|
||||||
|
TANIGUCHI Kohei
|
||||||
|
Thomas R. Koll
|
||||||
|
Tim Docker
|
||||||
|
Timofey ZAKREVSKIY
|
||||||
|
Trygve Laugstøl
|
||||||
|
Vladimir Sorokin
|
||||||
|
Vladimir Zhelezov
|
||||||
|
Wad
|
||||||
|
Xinruo Sun
|
||||||
|
afarrow
|
||||||
|
agander
|
||||||
|
aragaer
|
||||||
|
awjchen
|
||||||
|
azure-pipelines[bot]
|
||||||
|
flip111
|
||||||
|
gwern
|
||||||
|
jeevcat
|
||||||
|
jungle-boogie
|
||||||
|
legrostdg
|
||||||
|
trevorriles
|
||||||
|
zieone</code></pre>
|
||||||
|
<!--
|
||||||
|
https://pandoc.org/MANUAL.html#slide-shows
|
||||||
|
|
||||||
|
By default, the slide level is the highest heading level in the
|
||||||
|
hierarchy that is followed immediately by content, and not another
|
||||||
|
heading, somewhere in the document. In the example above, level-1
|
||||||
|
headings are always followed by level-2 headings, which are followed
|
||||||
|
by content, so the slide level is 2. This default can be overridden
|
||||||
|
using the --slide-level option.
|
||||||
|
|
||||||
|
The document is carved up into slides according to the following rules:
|
||||||
|
A horizontal rule always starts a new slide.
|
||||||
|
A heading at the slide level always starts a new slide.
|
||||||
|
Headings below the slide level in the hierarchy create headings within a slide.
|
||||||
|
Headings above the slide level in the hierarchy create “title slides,” which just contain the section title and help to break the slide show into sections. Non-slide content under these headings will be included on the title slide (for HTML slide shows) or in a subsequent slide with the same title (for beamer).
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
Reference in New Issue
Block a user