git-subtree-dir: doc/haskellerz git-subtree-mainline:684af10643git-subtree-split:79beb34b90
		
			
				
	
	
		
			354 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			354 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
% 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>
 | 
						|
 | 
						|
## 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
 | 
						|
 | 
						|
## 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.
 | 
						|
 | 
						|
## 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 !
 | 
						|
 | 
						|
## 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)`
 | 
						|
 | 
						|
## 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
 | 
						|
 | 
						|
 | 
						|
 | 
						|
  * <https://hledger.org/scripting.html>
 | 
						|
 | 
						|
## 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
 | 
						|
 | 
						|
  * <https://hledger.org/CONTRIBUTING.html#pull-requests>
 | 
						|
 | 
						|
# 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).
 | 
						|
-->
 | 
						|
 |