summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-07-26 22:33:49 +0200
committerMatthias Beyer <mail@beyermatthias.de>2019-07-26 22:33:49 +0200
commit8c6ad29b2ba47732b3fddbf5c3112b4add1ee14d (patch)
treef81cf6240dd3cd015a0ddc129478339c99295ed9
parent365a64e1277b1396dca17c6a5083876e0385fb80 (diff)
Add post: Talk at the rust meetup stuttgart
-rw-r--r--content/blog/2019-07-26-meetup-talk.md15
-rw-r--r--static/rust-meetup-talk-20190726/slides.html439
-rw-r--r--static/rust-meetup-talk-20190726/talk.md383
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 = &quot;0.10.0&quot;
+
+[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!
+
+