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).
 | |
| -->
 | |
| 
 |