jhn_stdlib [(γ)][5]
==========
A few thought experiments solidified as code.
JSON, MessagePack, syslog, URI, IP addresses, Timestamps, UUIDs
* [Introduction](#introduction)
* [Behaviours](#behaviours)
* [Features/Modules](#features)
* [Deprecated Features/Modules](#deprecated)
* [Build](#build)
* [Install](#install)
* [Contribute](#contribute) - Read if you're planning to submit patches
<a name='introduction'>
Introduction
------------
This library consists mainly of code that arose out of my curiosity, either
about Erlang and coding in general or concerning a perticular protocol or
technique. So there is little of cohesion in purposes between the different
library modules. But having published these I will continue to support these
since the road to enlightenment is one without terminus.
Behaviours
--------
* jhn_server -- A generic server
* jhn_fsm -- A FSM with the ability to defer acting on events until
a later state
<a name='features'>
Features/Modules
--------
* String Processing Functions for binary encoded strings
* jhn_blist -- drop in replacement for the lists module in stdlib
* jhn_bstring -- drop in replacement for the string module in stdlib
* jhn_mustache -- [Mustache (template system)][37]
* Protocols
* JSON -- encoding/decoding -- jhn_json [rfc8259][30]
* JSON Pointer -- encoding/decoding/evaluation -- jhn_json [rfc6901][8]
* JSON Patch -- evaluation -- jhn_json [rfc6902][31]
* JSON Merge Patch -- evaluation -- jhn_json [rfc7396][32]
* MessagePack -- encoding/decoding -- jhn_msgpack [MessagePack][12]/Erlang
* Bencoding -- encoding/decoding -- jhn_bencoding
* Syslog -- encoding/decoding -- jhn_syslog [rfc5424][13],
[rfc5427][14],
[rfc6012][29]
* Standards
* IP Addresses -- encoding/decoding -- jhn_ip_addr [rfc4291][16],
[rfc5952][17],
[rfc4632][18]
* Timestamps -- generating/encoding/decoding -- jhn_timestamp [rfc3339][19],
[rfc7231][21]
* URI -- encoding/decoding -- jhn_uri [rfc3986][15]
* UUID -- generating/encoding/decoding -- jhn_uuid [rfc9562][42]
* Clients
* HTTP -- client -- jhn_shttpc [rfc7230][20], [rfc7231][21],
[rfc7538][22], [rfc5789][23],
[rfc2818][24]
* Syslog -- server/client -- jhn_syslog [rfc5425][25], [rfc5426][26],
[rfc6587][27]
* Pull oriented data source abstraction
* lazy -- jhn_lazy abstracts different data sources as uniform lazy data
* Data structures
* Bloom filters -- jhn_bloom [Bloom Filters][36]
* Property lists -- jhn_plist
* Prefix trees -- jhn_p_tree [Prefix Tree][38]
* Binary(UTF-8) Prefix trees -- jhn_pb_tree [Prefix Tree][38]
[UTF-8][39]
* Range trees -- jhn_r_tree [Range Tree][40]
* T-trees -- t_tree [T-tree][41]
* Algorithms
* Levenshtein distance -- jhn_math:levenshtein/2 [Levenshtein][35]
* CRC32-C checksum -- jhn_hash:crc32c/1 [rfc9260][33]
* xxHash-32 checksum -- jhn_hash:xxh32/1/2 [xxHash][34]
* Consistent Hashing -- jhn_chash [J. Lamping, Eric Veach][28]
<a name='deprecated'>
Deprecated Features/Modules
--------
* Renamed
* bencoding -- use jhn_bencoding
* blist -- use jhn_blist
* bloom -- use jhn_bloom
* bstring -- use jhn_bstring
* ip_addr -- use jhn_ip_addr
* lazy -- use jhn_lazy
* msgpack -- use jhn_msgpack
* mustache -- use jhn_mustache
* p_tree -- use jhn_p_tree
* pb_tree -- use jhn_pb_tree
* plist -- use jhn_plist
* r_tree -- use jhn_r_tree
* shttpc -- use jhn_shttpc
* syslog -- use jhn_syslog
* t_tree -- use jhn_t_tree
* timestamp -- use jhn_timestamp
* uri -- use jhn_uri
<a name='build'>
Build
-----
jhn_stdlib requires [rebar3][1] to build, but provides make support to download
and install rebar. To build jhn_stdlib, go to the jhn_stdlib directory and type:
```sh
make
```
To make sure jhn_stdlib works on your platform, run the tests:
```sh
make test
```
Two things might seem alarming when running the tests:
1. Warnings emitted by cover
2. En exception printed by SASL
Both are expected due to the way Erlang currently prints errors. The
important line you should look for is `All XX tests passed`, if that
appears all is correct.
<a name='install'>
Install
-------
If you want to install your own built version of jhn_stdlib add the ebin
directory to your Erlang code path or move the jhn_stdlib folder into your
release folder and make sure that folder is in your `ERL_LIBS`
environment variable.
<a name='contribute'>
Contribute
----------
Should you find yourself using jhn_stdlib and have issues, comments or
feedback please [create an issue here on GitHub.] [2]
Patches are greatly appreciated, but since these libraries reflect my
learning process and I have rather peculiar notions of code hygiene
I may do extensive rewrites that does not in any way diminish the
appreciation I feel or indeed express
For a much nicer history, please [write good commit messages][4].
I know I really should.
[1]: https://github.com/erlang/rebar3
"Rebar3 - A build tool for Erlang"
[2]: http://github.com/JanHenryNystrom/jhn_stdlib/issues
"jhn_stdlib issues"
[4]: http://github.com/erlang/otp/wiki/Writing-good-commit-messages
"Erlang/OTP commit messages"
[5]: http://en.wikipedia.org/wiki/Software_release_life_cycle
"Software release life cycle"
[6]: http://www.ietf.org/rfc/rfc4627.txt
"The application/json Media Type for JavaScript Object Notation (JSON)"
[7]: http://www.ietf.org/rfc/rfc7159.txt
"The JavaScript Object Notation (JSON) Data Interchange Format"
[8]: http://www.ietf.org/rfc/rfc6901.txt
"JavaScript Object Notation (JSON) Pointer"
[10]: http://tools.ietf.org/id/draft-zyp-json-schema-04.txt
"JSON Schema: core definitions and terminology"
[11]: http://tools.ietf.org/id/draft-fge-json-schema-validation-00.txt
"JSON Schema: interactive and non interactive validation"
[12]: http://msgpack.org/
"An efficient binary serialization format"
[13]: http://www.ietf.org/rfc/rfc5424.txt
"The Syslog Protocol"
[14]: http://www.ietf.org/rfc/rfc5427.txt
"Textual Conventions for Syslog Management"
[15]: http://www.ietf.org/rfc/rfc3986.txt
"Uniform Resource Identifier (URI): Generic Syntax"
[16]: http://www.ietf.org/rfc/rfc4291.txt
"IP Version 6 Addressing Architecture"
[17]: http://www.ietf.org/rfc/rfc5952.txt
"A Recommendation for IPv6 Address Text Representation"
[18]: http://www.ietf.org/rfc/rfc4632.txt
"Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan"
[19]: http://www.ietf.org/rfc/rfc3339.txt
"Date and Time on the Internet: Timestamps"
[20]: http://www.ietf.org/rfc/rfc7230.txt
"Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing"
[21]: http://www.ietf.org/rfc/rfc7231.txt
"Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content"
[22]: http://www.ietf.org/rfc/rfc7538.txt
"The Hypertext Transfer Protocol Status Code 308 (Permanent Redirect)"
[23]: http://www.ietf.org/rfc/rfc5789.txt
"PATCH Method for HTTP"
[24]: http://www.ietf.org/rfc/rfc2818.txt
"HTTP Over TLS (rfc2818)"
[25]: http://www.ietf.org/rfc/rfc5425.txt
"Transport Layer Security (TLS) Transport Mapping for Syslog"
[26]: http://www.ietf.org/rfc/rfc5426.txt
"Transmission of Syslog Messages over UDP"
[27]: http://www.ietf.org/rfc/rfc6587.txt
"Transmission of Syslog Messages over TCP"
[28]: https://arxiv.org/ftp/arxiv/papers/1406/1406.2294.pdf
"A Fast, Minimal Memory, Consistent Hash Algorithm, John Lamping, Eric Veach"
[29]: http://www.ietf.org/rfc/rfc6012.txt
"Datagram Transport Layer Security (DTLS) Transport Mapping for Syslog"
[30]: http://www.ietf.org/rfc/rfc8259.txt
"The JavaScript Object Notation (JSON) Data Interchange Format"
[31]: http://www.ietf.org/rfc/rfc6902.txt
"JavaScript Object Notation (JSON) Patch"
[32]: http://www.ietf.org/rfc/rfc7396.txt
"JSON Merge Patch"
[33]: http://www.ietf.org/rfc/rfc9260.txt
"[Castagnoli93] G. Castagnoli, S. Braeuer and M. Herrman \"Optimization
of Cyclic Redundancy-Check Codes with 24 and 32 Parity
Bits\", IEEE Transact. on Communications, Vol. 41, No.
6, June 1993."
[34]: http://github.com/Cyan4973/xxHash
"xxHash - Extremely fast hash algorithm"
[35]: https://en.wikipedia.org/wiki/Levenshtein_distance
"Levenshtein distance"
[36]: https://en.wikipedia.org/wiki/Bloom_filter
"Bloom filter"
[37]: https://en.wikipedia.org/wiki/Mustache_(template_system)
"Mustache (template system)"
[38]: https://en.wikipedia.org/wiki/Trie
"Trie"
[39]: https://en.wikipedia.org/wiki/UTF-8
"UTF-8"
[40]: https://en.wikipedia.org/wiki/Range_tree
"Range tree"
[41]: https://en.wikipedia.org/wiki/T-tree
"T-tree"
[42]: http://www.ietf.org/rfc/rfc9562.txt
"Universally Unique IDentifiers (UUIDs)"