diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2019-07-26 22:33:49 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2019-07-26 22:33:49 +0200 |
commit | 8c6ad29b2ba47732b3fddbf5c3112b4add1ee14d (patch) | |
tree | f81cf6240dd3cd015a0ddc129478339c99295ed9 | |
parent | 365a64e1277b1396dca17c6a5083876e0385fb80 (diff) |
Add post: Talk at the rust meetup stuttgart
-rw-r--r-- | content/blog/2019-07-26-meetup-talk.md | 15 | ||||
-rw-r--r-- | static/rust-meetup-talk-20190726/slides.html | 439 | ||||
-rw-r--r-- | static/rust-meetup-talk-20190726/talk.md | 383 |
3 files changed, 837 insertions, 0 deletions
diff --git a/content/blog/2019-07-26-meetup-talk.md b/content/blog/2019-07-26-meetup-talk.md new file mode 100644 index 0000000..27e4051 --- /dev/null +++ b/content/blog/2019-07-26-meetup-talk.md @@ -0,0 +1,15 @@ +--- +title: "Rust Meetup Slides" +date: "2019-07-26T21:45:40" +tags: [ "linux", " open source", " programming", " rust", " software", " tools", " imag", "talk" ] +--- + +Today, I held a talk on imag at the +[Rust Meetup Stuttgart](https://gettogether.community/rust-stuttgart/). + +Here are [the slides](/rust-meetup-talk-20190726/slides.html) (revealjs). + +The revealjs is _not_ included in the website, so it pulls it from the web. If +you don't want it, don't click this link. +The [raw markup can be found here](/rust-meetup-talk-20190726/talk.md). + diff --git a/static/rust-meetup-talk-20190726/slides.html b/static/rust-meetup-talk-20190726/slides.html new file mode 100644 index 0000000..cb31b61 --- /dev/null +++ b/static/rust-meetup-talk-20190726/slides.html @@ -0,0 +1,439 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="generator" content="pandoc"> + <meta name="author" content="Matthias Beyer"> + <meta name="dcterms.date" content="2019-07-26"> + <title>imag</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://revealjs.com/css/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%;} + </style> + <link rel="stylesheet" href="https://revealjs.com/css/theme/black.css" id="theme"> + <!-- Printing and PDF exports --> + <script> + var link = document.createElement( 'link' ); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = window.location.search.match( /print-pdf/gi ) ? 'https://revealjs.com/css/print/pdf.css' : 'https://revealjs.com/css/print/paper.css'; + document.getElementsByTagName( 'head' )[0].appendChild( link ); + </script> + <!--[if lt IE 9]> + <script src="https://revealjs.com/lib/js/html5shiv.js"></script> + <![endif]--> +</head> +<body> + <div class="reveal"> + <div class="slides"> + +<section id="title-slide"> + <h1 class="title">imag</h1> + <p class="author">Matthias Beyer</p> + <p class="date">July 26, 2019</p> +</section> + +<section id="imag" class="slide level1"> +<h1>imag</h1> +<p>Personal information management suite</p> +</section> +<section id="idea" class="slide level1"> +<h1>Idea</h1> +<ul> +<li>Collect Metadata +<ul> +<li>calendar, contacts, todos…</li> +</ul></li> +<li>Connect Metadata</li> +<li>Query Metadata</li> +</ul> +</section> +<section id="future" class="slide level1"> +<h1>Future…</h1> +<ul> +<li>Automatic suggestions</li> +</ul> +<blockquote> +<p>Hey Dave…</p> +</blockquote> +</section> +<section id="existing-tools" class="slide level1"> +<h1>Existing tools</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +taskwarrior +</li> +<li class="fragment fade-in" data-fragment-index="2"> +khal +</li> +<li class="fragment fade-in" data-fragment-index="3"> +khard +</li> +<li class="fragment fade-in" data-fragment-index="4"> +abook +</li> +<li class="fragment fade-in" data-fragment-index="5"> +… +</li> +</ul> +<p><span class="fragment fade-in"> yes, but… </span></p> +</section> +<section id="existing-tools-1" class="slide level1"> +<h1>Existing tools</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +no interoperability +</li> +<li class="fragment fade-in" data-fragment-index="2"> +no composability +</li> +<li class="fragment fade-in" data-fragment-index="3"> +no scriptability +</li> +<li class="fragment fade-in" data-fragment-index="4"> +not always text-only +</li> +</ul> +</section> +<section id="workflow" class="slide level1"> +<h1>Workflow</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +Email comes in +</li> +<li class="fragment fade-in" data-fragment-index="2"> +imag classifies it +</li> +<li class="fragment fade-in" data-fragment-index="3"> +it is from Lisa +</li> +<li class="fragment fade-in" data-fragment-index="4"> +it is in a thread of emails +</li> +</ul> +</section> +<section id="workflow-1" class="slide level1"> +<h1>Workflow</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +… which is connected to a calendar entry (tomorrow) +</li> +<li class="fragment fade-in" data-fragment-index="2"> +… which is connected to a recipe +</li> +<li class="fragment fade-in" data-fragment-index="3"> +… which is connected to a shopping list +</li> +<li class="fragment fade-in" data-fragment-index="4"> +… which is connected to opening times of a shop +</li> +</ul> +</section> +<section id="workflow-2" class="slide level1"> +<h1>Workflow</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +The shop closes at 8pm, it is 6pm +</li> +<li class="fragment fade-in" data-fragment-index="2"> +this seems to be important! +</li> +<li class="fragment fade-in" data-fragment-index="2"> +imag notifies you +</li> +</ul> +</section> +<section id="goals" class="slide level1"> +<h1>Goals</h1> +<ul> +<li>plain text only</li> +<li>scriptable</li> +<li>composable</li> +</ul> +</section> +<section id="facts" class="slide level1"> +<h1>Facts</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +Rust +</li> +<li class="fragment fade-in" data-fragment-index="2"> +init commit: 2015-10-18 +</li> +<li class="fragment fade-in" data-fragment-index="3"> +41,827 LOC (2019-07-14, master) +<ul> +<li> +34,925 LOC Rust +</li> +<li> +3,025 LOC Markdown (documentation) +</li> +</ul> +</ul> +</section> +<section id="facts-1" class="slide level1"> +<h1>Facts</h1> +<p>Implemented domains:</p> +<ul> +<li>bookmark</li> +<li>contact</li> +<li>diary (log)</li> +<li>habit</li> +<li>notes</li> +<li>timetrack</li> +<li>wiki</li> +<li>todo / mail (rewrite pending)</li> +</ul> +</section> +<section id="architecture" class="slide level1"> +<h1>Architecture</h1> +<ol type="1"> +<li>“Core” +<ol type="1"> +<li>“The Store”</li> +<li>“The Runtime”</li> +</ol></li> +<li>“Entry layer”</li> +<li>“Domain layer”</li> +<li>“UI Layer”</li> +</ol> +<ul> +<div class="fragment fade-in" data-fragment-index="1"> +<pre><code>MVC anyone?</code></pre> +</div> +</ul> +</section> +<section id="core-the-store" class="slide level1"> +<h1>Core: The Store</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +Filesystem abstraction +</li> +<li class="fragment fade-in" data-fragment-index="2"> +CRUD interface +</li> +<li class="fragment fade-in" data-fragment-index="3"> +defines “Entry” +</li> +<li class="fragment fade-in" data-fragment-index="4"> +Different backends (FS, inmemory for testing) +</li> +</ul> +</section> +<section id="core-entry" class="slide level1"> +<h1>Core: Entry</h1> +<ol type="1"> +<li>Header</li> +<li>Content</li> +</ol> +<pre class="toml"><code>[imag] +version = "0.10.0" + +[somemore] +headers = 123</code></pre> +</section> +<section id="core-the-runtime" class="slide level1"> +<h1>Core: The Runtime</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +Configuration handling +</li> +<li class="fragment fade-in" data-fragment-index="2"> +CLI utilities (clap) +</li> +<li class="fragment fade-in" data-fragment-index="3"> +Logging setup +</li> +</ul> +</section> +<section id="entry-layer" class="slide level1"> +<h1>Entry layer</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +Extensions for “Entry” +<ul> +<li class="fragment fade-in" data-fragment-index="2"> +“link” +</li> +<li class="fragment fade-in" data-fragment-index="3"> +“tag” +</li> +<li class="fragment fade-in" data-fragment-index="4"> +“category” +</li> +<li class="fragment fade-in" data-fragment-index="5"> +“edit” +</li> +<li class="fragment fade-in" data-fragment-index="6"> +“…” +</li> +</ul> +</li> +</ul> +</section> +<section id="domain-layer" class="slide level1"> +<h1>Domain layer</h1> +<ul> +<li>diary</li> +<li>bookmark</li> +<li>contact</li> +<li>todo</li> +</ul> +</section> +<section id="ui-layer" class="slide level1"> +<h1>UI Layer</h1> +<ul> +<li>CLI</li> +<li>(TUI)</li> +<li>(GUI)</li> +<li>(WUI)</li> +</ul> +</section> +<section id="external-libraries" class="slide level1"> +<h1>External libraries</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +Policy: Use what’s useful +</li> +<li class="fragment fade-in" data-fragment-index="1"> +clap +</li> +<li class="fragment fade-in" data-fragment-index="1"> +toml +</li> +</ul> +</section> +<section id="extracted-libraries" class="slide level1"> +<h1>Extracted libraries</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="2"> +toml-query +<ul> +<li> +human-readable X-Path for toml +</li> +</ul> +</li> +<li class="fragment fade-in" data-fragment-index="3"> +filters +<ul> +<li> +composable (failable) predicates +</li> +</ul> +</li> +<li class="fragment fade-in" data-fragment-index="4"> +kairos +<ul> +<li> +human-readable date/time processing +</li> +</ul> +</li> +</ul> +</section> +<section id="concepts" class="slide level1"> +<h1>Concepts</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +StoreId +</li> +<li class="fragment fade-in" data-fragment-index="2"> +Entry +</li> +<li class="fragment fade-in" data-fragment-index="3"> +FileLockEntry +</li> +<li class="fragment fade-in" data-fragment-index="4"> +Store +</li> +<li class="fragment fade-in" data-fragment-index="5"> +Traits +<ul> +<li class="fragment fade-in" data-fragment-index="6"> +extending Store +</li> +<li class="fragment fade-in" data-fragment-index="7"> +extending Entry +</li> +</ul> +</li> +<li class="fragment fade-in" data-fragment-index="8"> +Iterators +</li> +</ul> +</section> +<section id="more-concepts" class="slide level1"> +<h1>More Concepts</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +IsA +</li> +<li class="fragment fade-in" data-fragment-index="2"> +(Header)Partial +</li> +</ul> +</section> +<section id="other-things" class="slide level1"> +<h1>Other things</h1> +<ul> +<li class="fragment fade-in" data-fragment-index="1"> +Minimal coding styleguide +</li> +<li class="fragment fade-in" data-fragment-index="2"> +LGPL-2.1 (only) +</li> +<li class="fragment fade-in" data-fragment-index="3"> +Documentation: pandoc +</li> +<li class="fragment fade-in" data-fragment-index="4"> +Website: hugo +</li> +<li class="fragment fade-in" data-fragment-index="5"> +Contributions +<ul> +<li> +Signed-off-by +</li> +<li> +anything I can pull/apply +</li> +</ul> +</li> +</ul> +</section> +<section id="thanks" class="slide level1"> +<h1>Thanks</h1> +<p>Thank you for your attention!</p> +</section> + </div> + </div> + + <script src="https://revealjs.com/lib/js/head.min.js"></script> + <script src="https://revealjs.com/js/reveal.js"></script> + + <script> + + // Full list of configuration options available at: + // https://github.com/hakimel/reveal.js#configuration + Reveal.initialize({ + // Push each slide change to the browser history + history: true, + + // Optional reveal.js plugins + dependencies: [ + { src: 'https://revealjs.com/lib/js/classList.js', condition: function() { return !document.body.classList; } }, + { src: 'https://revealjs.com/plugin/zoom-js/zoom.js', async: true }, + { src: 'https://revealjs.com/plugin/notes/notes.js', async: true } + ] + }); + </script> + </body> +</html> diff --git a/static/rust-meetup-talk-20190726/talk.md b/static/rust-meetup-talk-20190726/talk.md new file mode 100644 index 0000000..6f760fb --- /dev/null +++ b/static/rust-meetup-talk-20190726/talk.md @@ -0,0 +1,383 @@ +--- +author: Matthias Beyer +title: imag +date: July 26, 2019 +--- + +# imag + +Personal information management suite + + +# Idea + +* Collect Metadata + * calendar, contacts, todos... +* Connect Metadata +* Query Metadata + + +# Future... + +* Automatic suggestions + +> Hey Dave... + + +# Existing tools + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + taskwarrior +</li> +<li class="fragment fade-in" data-fragment-index="2"> + khal +</li> +<li class="fragment fade-in" data-fragment-index="3"> + khard +</li> +<li class="fragment fade-in" data-fragment-index="4"> + abook +</li> +<li class="fragment fade-in" data-fragment-index="5"> + ... +</li> +</ul> + +<span class="fragment fade-in"> + yes, but... +</span> + + +# Existing tools + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + no interoperability +</li> +<li class="fragment fade-in" data-fragment-index="2"> + no composability +</li> +<li class="fragment fade-in" data-fragment-index="3"> + no scriptability +</li> +<li class="fragment fade-in" data-fragment-index="4"> + not always text-only +</li> +</ul> + + +# Workflow + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + Email comes in +</li> +<li class="fragment fade-in" data-fragment-index="2"> + imag classifies it +</li> +<li class="fragment fade-in" data-fragment-index="3"> + it is from Lisa +</li> +<li class="fragment fade-in" data-fragment-index="4"> + it is in a thread of emails +</li> +</ul> + +# Workflow + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + ... which is connected to a calendar entry (tomorrow) +</li> +<li class="fragment fade-in" data-fragment-index="2"> + ... which is connected to a recipe +</li> +<li class="fragment fade-in" data-fragment-index="3"> + ... which is connected to a shopping list +</li> +<li class="fragment fade-in" data-fragment-index="4"> + ... which is connected to opening times of a shop +</li> +</ul> + +# Workflow + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + The shop closes at 8pm, it is 6pm +</li> +<li class="fragment fade-in" data-fragment-index="2"> + this seems to be important! +</li> +<li class="fragment fade-in" data-fragment-index="2"> + imag notifies you +</li> +</ul> + + +# Goals + +* plain text only +* scriptable +* composable + + +# Facts + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + Rust +</li> +<li class="fragment fade-in" data-fragment-index="2"> + init commit: 2015-10-18 +</li> +<li class="fragment fade-in" data-fragment-index="3"> + 41,827 LOC (2019-07-14, master) + <ul> + <li> + 34,925 LOC Rust + </li> + <li> + 3,025 LOC Markdown (documentation) + </li> + </ul> +</ul> + + +# Facts + +Implemented domains: + +* bookmark +* contact +* diary (log) +* habit +* notes +* timetrack +* wiki +* todo / mail (rewrite pending) + + +# Architecture + +1. "Core" + 1. "The Store" + 1. "The Runtime" +1. "Entry layer" +1. "Domain layer" +1. "UI Layer" + +<ul> +<div class="fragment fade-in" data-fragment-index="1"> + MVC anyone? +</div> +</ul> + + +# Core: The Store + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + Filesystem abstraction +</li> +<li class="fragment fade-in" data-fragment-index="2"> + CRUD interface +</li> +<li class="fragment fade-in" data-fragment-index="3"> + defines "Entry" +</li> +<li class="fragment fade-in" data-fragment-index="4"> + Different backends (FS, inmemory for testing) +</li> +</ul> + + +# Core: Entry + +1. Header +1. Content + +```toml +[imag] +version = "0.10.0" + +[somemore] +headers = 123 +``` + + +# Core: The Runtime + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + Configuration handling +</li> +<li class="fragment fade-in" data-fragment-index="2"> + CLI utilities (clap) +</li> +<li class="fragment fade-in" data-fragment-index="3"> + Logging setup +</li> +</ul> + + +# Entry layer + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + Extensions for "Entry" + <ul> + <li class="fragment fade-in" data-fragment-index="2"> + "link" + </li> + <li class="fragment fade-in" data-fragment-index="3"> + "tag" + </li> + <li class="fragment fade-in" data-fragment-index="4"> + "category" + </li> + <li class="fragment fade-in" data-fragment-index="5"> + "edit" + </li> + <li class="fragment fade-in" data-fragment-index="6"> + "..." + </li> + </ul> +</li> +</ul> + + +# Domain layer + +* diary +* bookmark +* contact +* todo + + +# UI Layer + +* CLI +* (TUI) +* (GUI) +* (WUI) + + +# External libraries + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + Policy: Use what's useful +</li> +<li class="fragment fade-in" data-fragment-index="1"> + clap +</li> +<li class="fragment fade-in" data-fragment-index="1"> + toml +</li> +</ul> + + +# Extracted libraries + +<ul> +<li class="fragment fade-in" data-fragment-index="2"> + toml-query + <ul> + <li>human-readable X-Path for toml</li> + </ul> +</li> +<li class="fragment fade-in" data-fragment-index="3"> + filters + <ul> + <li>composable (failable) predicates</li> + </ul> +</li> +<li class="fragment fade-in" data-fragment-index="4"> + kairos + <ul> + <li>human-readable date/time processing</li> + </ul> +</li> +</ul> + +# Concepts + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + StoreId +</li> +<li class="fragment fade-in" data-fragment-index="2"> + Entry +</li> +<li class="fragment fade-in" data-fragment-index="3"> + FileLockEntry +</li> +<li class="fragment fade-in" data-fragment-index="4"> + Store +</li> +<li class="fragment fade-in" data-fragment-index="5"> + Traits + <ul> + <li class="fragment fade-in" data-fragment-index="6"> + extending Store + </li> + <li class="fragment fade-in" data-fragment-index="7"> + extending Entry + </li> + </ul> +</li> +<li class="fragment fade-in" data-fragment-index="8"> + Iterators + <ul> + <li class="fragment fade-in" data-fragment-index="9"> + Entries + </li> + </ul> +</li> +</ul> + + +# More Concepts + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + IsA +</li> +<li class="fragment fade-in" data-fragment-index="2"> + (Header)Partial +</li> +</ul> + + +# Other things + +<ul> +<li class="fragment fade-in" data-fragment-index="1"> + Minimal coding styleguide +</li> +<li class="fragment fade-in" data-fragment-index="2"> + LGPL-2.1 (only) +</li> +<li class="fragment fade-in" data-fragment-index="3"> + Documentation: pandoc +</li> +<li class="fragment fade-in" data-fragment-index="4"> + Website: hugo +</li> +<li class="fragment fade-in" data-fragment-index="5"> + Contributions + <ul> + <li>Signed-off-by</li> + <li>anything I can pull/apply</li> + </ul> +</li> +</ul> + +# Thanks + + +Thank you for your attention! + + |