From 458f9e65ef6ca251e1c2edf53012aaec87f8ad16 Mon Sep 17 00:00:00 2001
From: Daniel Flanagan
Date: Tue, 14 Jul 2020 16:47:54 -0500
Subject: [PATCH] initial commit
---
.gitignore | 1 +
config.yaml | 29 ++
content/404.md | 17 +
content/about.md | 45 ++
content/blog/_index.md | 5 +
...-reflection-for-simple-admin-crud-forms.md | 420 ++++++++++++++++++
content/blog/elm-form-fields-abstractions.md | 260 +++++++++++
...to-other-repository-management-services.md | 145 ++++++
.../blog/weechat-matrix-encryption-guide.md | 148 ++++++
content/contact.md | 34 ++
content/privacy.md | 10 +
content/thanks.md | 16 +
layouts/blog/li.html | 1 +
layouts/index.html | 35 ++
static/icon.png | Bin 0 -> 19816 bytes
static/img/avatar.jpg | Bin 0 -> 57652 bytes
themes/lyte/layouts/_default/baseof.html | 39 ++
themes/lyte/layouts/_default/list.html | 12 +
themes/lyte/layouts/_default/single.html | 13 +
themes/lyte/static/font/iosevka/LICENSE.md | 130 ++++++
.../font/iosevka/ss07-bold-italic.woff2 | Bin 0 -> 266000 bytes
.../lyte/static/font/iosevka/ss07-bold.woff2 | Bin 0 -> 242748 bytes
.../static/font/iosevka/ss07-italic.woff2 | Bin 0 -> 262492 bytes
.../static/font/iosevka/ss07-regular.woff2 | Bin 0 -> 241548 bytes
themes/lyte/static/global.js | 0
themes/lyte/static/styles.css | 197 ++++++++
26 files changed, 1557 insertions(+)
create mode 100644 .gitignore
create mode 100644 config.yaml
create mode 100644 content/404.md
create mode 100644 content/about.md
create mode 100644 content/blog/_index.md
create mode 100644 content/blog/ecto-reflection-for-simple-admin-crud-forms.md
create mode 100644 content/blog/elm-form-fields-abstractions.md
create mode 100644 content/blog/mirroring-gitea-to-other-repository-management-services.md
create mode 100644 content/blog/weechat-matrix-encryption-guide.md
create mode 100644 content/contact.md
create mode 100644 content/privacy.md
create mode 100644 content/thanks.md
create mode 100644 layouts/blog/li.html
create mode 100644 layouts/index.html
create mode 100644 static/icon.png
create mode 100644 static/img/avatar.jpg
create mode 100644 themes/lyte/layouts/_default/baseof.html
create mode 100644 themes/lyte/layouts/_default/list.html
create mode 100644 themes/lyte/layouts/_default/single.html
create mode 100644 themes/lyte/static/font/iosevka/LICENSE.md
create mode 100644 themes/lyte/static/font/iosevka/ss07-bold-italic.woff2
create mode 100644 themes/lyte/static/font/iosevka/ss07-bold.woff2
create mode 100644 themes/lyte/static/font/iosevka/ss07-italic.woff2
create mode 100644 themes/lyte/static/font/iosevka/ss07-regular.woff2
create mode 100644 themes/lyte/static/global.js
create mode 100644 themes/lyte/static/styles.css
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cb76b31
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+resources/
diff --git a/config.yaml b/config.yaml
new file mode 100644
index 0000000..a7874cc
--- /dev/null
+++ b/config.yaml
@@ -0,0 +1,29 @@
+baseURL: https://lyte.dev
+languageCode: en-us
+title: lyte.dev
+theme: lyte
+pygmentsCodeFences: true
+pygmentsCodeFencesGuessSyntax: true
+pygmentsUseClasses: true
+markup:
+ goldmark:
+ renderer:
+ unsafe: true
+
+# permalinks:
+# post: /blog/:title
+
+menu:
+ main:
+ - identifier: about
+ name: about
+ url: /about
+ weight: 10
+ - identifier: blog
+ name: blog
+ url: /blog
+ weight: 20
+ - identifier: contact
+ name: contact
+ url: /contact
+ weight: 30
diff --git a/content/404.md b/content/404.md
new file mode 100644
index 0000000..8e7b913
--- /dev/null
+++ b/content/404.md
@@ -0,0 +1,17 @@
+---
+image: /img/mountain-lake.jpg
+imageOverlayColor: "#000"
+imageOverlayOpacity: 0.5
+heroBackgroundColor: "#840"
+title: 404 Not Found
+description: "Don't you just hate that?"
+---
+
+Looks like you're lost or found a deleted page. Enjoy the picture of the mountains above for just a moment...
+
+Now scoot! Back to whatever you were doing!
+
+Maybe start at [the beginning][home]?
+
+
+[home]: /
diff --git a/content/about.md b/content/about.md
new file mode 100644
index 0000000..0ef71d1
--- /dev/null
+++ b/content/about.md
@@ -0,0 +1,45 @@
+---
+date: 2017-02-22T14:43:02-06:00
+image: /img/space.jpg
+imageOverlayColor: "#000"
+imageOverlayOpacity: 0.6
+heroBackgroundColor: "#0af"
+title: About
+description: "A little about the man behind this website."
+---
+
+My name is Daniel Flanagan. I was born in Virginia (but my family didn't stay
+long) and now live in Kansas City, Missouri. My family still lives in the area
+and I have 6 awesome little brothers. Yes, my parents had seven boys and are
+fantastic. I'm married and have a son of my own, who is an absolute *joy*!
+I love my family quite a lot.
+
+I'm a systems engineer/software developer and an elder-in-training for my small church where I help run
+the tech and audio-visual systems. My faith is the framework around which I've
+built my life and it plays a pivotal role in all aspects of my life.
+
+I'm a big proponent of self-discipline and working from home. My favorite video
+game has to be *Super Smash Bros. Melee*. I listen to a lot of metal and
+electronic music. My favorite drink is *Red Bull Yellow Edition* and I prefer
+tea over coffee. I run GNU+Linux on all my machines. My keyboard is a custom
+Iris board that was a blast to put together.
+
+My wife, Valerie, is absolutely the most beautiful and lovely woman in the
+entire world. She's a Physical Therapist Assistant by vocation and somewhat of
+a fitness and health nut, which has yet to rub off on me (darn!). Now she
+raises our son Oliver and savors every second. We've been married since late
+2016 and we fall more in love every day. We currently live in a cozy little
+apartment which she somehow manages to keep clean, organized, and
+well-decorated while managing a growing baby boy.
+
+I grew up not around the dining table, but around the keyboard or latest
+Nintendo console; video games were bonding and family time. I discovered
+programming through my dad who showed me `QBASIC` after I persisted in asking
+how video games were made. Within a few weeks I had made a simple snake game and
+he then bought me a book titled *C# for the Absolute Beginner* and that was it.
+I was hooked.
+
+Now we're here!
+
+[daniel-and-valerie-pic]: /img/daniel-and-valerie.jpg
diff --git a/content/blog/_index.md b/content/blog/_index.md
new file mode 100644
index 0000000..96c97d4
--- /dev/null
+++ b/content/blog/_index.md
@@ -0,0 +1,5 @@
+---
+title: Blog
+---
+
+### Latest Posts
diff --git a/content/blog/ecto-reflection-for-simple-admin-crud-forms.md b/content/blog/ecto-reflection-for-simple-admin-crud-forms.md
new file mode 100644
index 0000000..a4c988d
--- /dev/null
+++ b/content/blog/ecto-reflection-for-simple-admin-crud-forms.md
@@ -0,0 +1,420 @@
+---
+image: "/img/teal-bubbles.jpg"
+date: "2019-03-28T10:30:00-05:00"
+imageOverlayColor: "#000"
+imageOverlayOpacity: 0.5
+heroBackgroundColor: "#333"
+description: "Clean and functional Admin CRUD forms using the metadata already
+in your schemas!"
+title: Using Ecto Reflection for Simple Admin CRUD Forms in Elixir's Phoenix
+draft: false
+---
+
+If you're working on a Phoenix project, you probably realized the client might
+want to view (or even -- *gasp* -- edit!) their data in a pretty raw form.
+Frameworks like [Django][django] provide this out of the box.
+[Phoenix][phoenix], however, leaves this up to you!
+
+
+
+Sure, there are [`ex_admin`][ex_admin] and [Torch][torch], but `ex_admin` is
+pretty much abandoned and Torch is more of a form generator. Personally, I'm not
+really a fan of code generators. In my opinion, if something can generate code,
+why doesn't it just offer whatever functionality is being provided by the
+generated code?
+
+I'll share what I did and hopefully this helps you!
+
+# TL;DR
+
+Leverage your Ecto schemas' [`__schema__/1`][__schema__] and
+[`__schema__/2`][__schema__] functions to retrieve the fields and associations
+metadata created when using the [`schema/2`][schema/2] macro. From there, you
+can decide how to render an appropriate HTML field in a form. From there, you
+can either use [`Ecto.Changeset.change/2`][Ecto.Changeset.change/2] to handle
+the results of an admin user submitting those forms or implement some sort of
+protocol that lets you specify an admin-specific changeset.
+
+## Getting That Sweet, Sweet Metadata
+
+My first issue was figuring out how to get the metadata that I knew Ecto already
+had about my schemas. Y'know, which fields are which types, so that I could use
+that metadata to render the appropriate form elements: a text box for
+a `:string`, a checkbox for a `:boolean`, a [`multiple`
+select][select_attributes] for a [`many_to_many/3`][many_to_many/3] association,
+etc.
+
+After asking in the ever-helpful [Elixir Slack][elixir-slack], somebody
+mentioned that Ecto Schemas [supported reflection][__schema__] using
+a `__schema__` method that could access what I was looking for.
+
+```elixir
+iex(1)> MyApp.Accounts.User.__schema__ :fields
+[:id, :email, :full_name, :password_hash, :verified, :inserted_at, :updated_at]
+iex(2)> MyApp.Accounts.User.__schema__ :associations
+[:roles]
+iex(3)> MyApp.Accounts.User.__schema__ :type, :id
+:id
+iex(4)> MyApp.Accounts.User.__schema__ :type, :email
+:string
+iex(5)> MyApp.Accounts.User.__schema__ :association, :roles
+%Ecto.Association.ManyToMany{
+ cardinality: :many,
+ defaults: [],
+ field: :roles,
+ join_keys: [user_id: :id, role_id: :id],
+ join_through: MyApp.Accounts.UserRole,
+ on_cast: nil,
+ on_delete: :nothing,
+ on_replace: :raise,
+ owner: MyApp.Accounts.User,
+ owner_key: :id,
+ queryable: MyApp.Accounts.Role,
+ related: MyApp.Accounts.Role,
+ relationship: :child,
+ unique: false,
+ where: []
+}
+iex(6)> "siiiiiiiiiick"
+...
+```
+
+Awesome! Using this, I can *definitely* construct a basic form!
+
+So, we'll want an admin controller that knows how to add new schema entries
+generically as well as edit and update existing ones:
+
+```elixir
+# admin_controller.ex
+
+@models %{
+ "user" => MyApp.Accounts.User,
+ "role" => MyApp.Accounts.Role
+ # ... and any other possible schema you have!
+}
+
+def edit(conn, %{"schema" => schema, "pk" => pk}) do
+ schema_module = @models[schema]
+
+ model = schema_module.__schema__(:associations)
+ |> Enum.reduce(MyApp.Repo.get(m, pk), fn a, m ->
+ MyApp.Repo.preload(m, a)
+ end)
+
+ # TODO: load changeset from session?
+ opts = [
+ changeset: Ecto.Changeset.change(model, %{}),
+ schema_module: schema_module,
+ schema: schema,
+ pk: pk
+ ]
+ render(conn, "edit.html", opts)
+end
+
+# create/2 works similarly and may be considered an exercise for the reader =)
+def update(conn, %{"schema" => schema, "pk" => pk, "data" => data}) do
+ schema_module = @models[schema]
+
+ # TODO: be wary! this lets an admin change EVERYTHING!
+ # if you want to avoid this like I did, setup an AdminEditable protocol that
+ # requires your schema to implement an admin-specific changeset and use that
+ # instead
+ changeset = Ecto.Changeset.change(MyApp.Repo.get!(module, pk), data)
+
+ case MyApp.Repo.update(changeset) do
+ {:ok, updated_model} ->
+ conn
+ |> put_flash(:info, "#{String.capitalize(schema)} ID #{pk} updated!")
+ |> redirect(to: Routes.admin_path(conn, :edit, schema, pk))
+
+ {:error, changeset} ->
+ conn
+ |> put_flash(:failed, "#{String.capitalize(schema)} ID #{pk} failed to update!")
+ |> put_session(:changeset, changeset)
+ |> redirect(to: Routes.admin_path(conn, :edit, schema, pk))
+ end
+end
+```
+
+Yep. That's a lot of code. The first chunk to define the `@models` module
+attribute is very simple: map a string to a schema module. Easy. If we want, we
+could have this map to a tuple like `"user" => {Module, "user", "users"}` so we
+could control how they're displayed as well, passing this information to the
+view.
+
+The `edit/2` method takes a schema type (to map to a schema module via
+`@models`) and a primary key so we can retrieve the actual entry for that
+schema. Generally, this will be a UUID or an integer, but it could be something
+more complex, in which case your `router.ex` will probably need unusual help to
+accommodate this route.
+
+Anyway, `edit/2` just grabs the schema module and loads the given entry, using
+the reflection we saw earlier to go ahead and preload all the associations.
+Neat! We also create a blank changeset and pass these important things on to our
+view. `new/2` is left as an exercise all for you! But mostly because I haven't
+written it yet myself! I'm also not retrieving the changeset from the session
+here. I also leave that up to you.
+
+`update/2` works similarly, grabbing the schema module, creating a changeset
+from the given data (note the big warning!), and then attempting to update the
+repo. Here, we have some reasonable error handling and proper Phoenix CRUD'ing
+-- or at least... U'ing, but that doesn't sound as fun.
+
+This gets us really close to being able to update arbitrary schema entries! We
+just need to setup the view to know how to handle the view logic (duh).
+
+First, though, let's go to our template and figure out how we want it to work,
+then we know what helper functions we'll need in our view.
+
+Oh, by the way, I'm using [Slime][slime] instead of [EEx][eex] for my
+templates. If you haven't heard of it, you should check it out. It makes for
+very clean template code.
+
+```elixir
+# edit.html.slime
+
+h1
+ = "Edit #{String.capitalize(to_string(@schema))}"
+ = " ID #{@id}"
+
+- action_path = Routes.admin_path(@conn, :update, @schema, @id)
+= form_for @changeset, action_path, [as: :data], fn f ->
+ h2 Fields
+
+ = for field <- @schema_module.__schema__(:fields) do
+ .field
+ label
+ .label-text #{String.capitalize(to_string(field))}
+ = field(f, @schema_module, field)
+
+ h2 Associations
+
+ = for association <- @schema_module.__schema__(:associations) do
+ .field
+ label
+ .label-text #{String.capitalize(to_string(association))}
+ = association(f, @schema_module, association)
+```
+
+Wow, this is cool! Obviously, most of the magic is going to be in the view
+functions we now have to implement, but this *one* view will theoretically
+handle any basic schema! This is great!
+
+If you're locking down which fields an admin can modify, you can do something
+like this:
+
+```elixir
+# edit.html.slime
+
+# for field in fields...
+
+.field
+ label
+ .label-text #{String.capitalize(to_string(field))}
+ = if Enum.member?(@editable_fields, field) do
+ = field(f, @schema_module, field)
+ - else
+ input readonly="true" value=Map.get(@changeset.data, field)
+```
+
+Let's get to the nitty gritty and implement `field/3` and `association/3`:
+
+```elixir
+def field(form, schema_module, field, opts \\ []) do
+ case schema_module.__schema__(:schema, field) do
+ :boolean -> Phoenix.HTML.Form.checkbox(form, field, opts)
+ :integer -> Phoenix.HTML.Form.number_input(form, field, opts)
+ # ... I haven't implemented any other types, yet, but datetimes and other
+ # such fields shouldn't be too difficult!
+ # see: https://hexdocs.pm/phoenix_html/Phoenix.HTML.Form.html#functions
+ _ -> Phoenix.HTML.Form.text_input(form, field, opts)
+ end
+end
+
+def association(form, schema_module, association, opts \\ []) do
+ association = schema_module.__schema__(:association, association)
+
+ # make sure your schemas implement the `String.Chars` protocol so they can
+ # look nice in a select!
+ # obviously, if you have massive tables, `Repo.all/1` is a bad idea!
+ options = MyApp.Repo.all(association.queryable)
+ |> Enum.map(&{&1.id, to_string(&1)})
+
+ case association.cardinality do
+ :many ->
+ opts = Keyword.put_new(opts, :multiple, true)
+ Phoenix.HTML.Form.select(form, association, options, opts)
+ _ ->
+ Phoenix.HTML.Form.select(form, association, options, opts)
+ end
+end
+```
+
+Holy cow! Not bad at all! Actually, it would be really easy to extend this and
+even handle the wacky edge cases that may come down the line! As previously
+mentioned implementing some kind of `AdminEditable` protocol would be ideal,
+then you could attach whatever metadata you wanted in order for your admin CRUD
+system to work exactly how you want.
+
+I'm doing that since I don't actually want an admin to be able to change certain
+things that the system is solely responsible for. This includes primary keys,
+slugs, user-provided information, etc. Therefore this looks a bit different in
+practice on my end.
+
+```elixir
+# accounts/user.ex
+
+defimpl MyApp.AdminEditable, for: MyApp.Accounts.User do
+ @readable [:id, :email, :full_name, :inserted_at, :updated_at]
+ @editable [:verified]
+
+ def admin_readable_fields(_s), do: @readable ++ @editable
+ def admin_editable_fields(_s), do: @editable
+
+ # this controls what shows up on the index for a given schema
+ def admin_index_fields(s), do: admin_readable_fields(s)
+end
+```
+
+You could then use these methods instead of schema reflection. You could also
+handle associations separately as well.
+
+```elixir
+# accounts/user.ex
+
+# defimpl MyApp.AdminEditable ...
+
+@readable_associations []
+@editable_associations [:roles]
+
+def admin_readable_associations(_s), do:
+ @readable_associations ++ @editable_associations
+def admin_editable_fields(_s), do: @editable_associations
+```
+
+You could use this *and* define the implementation for `Any` *and* use the
+aforementioned schema reflection and get the best of both worlds!
+
+Anyways, I have a billion ideas on how to extend this basic concept. Hopefully
+you can implement your own admin interface without writing a form for every
+single schema you have, too! Ahh, simplicity.
+
+Here's all the code jumbled together (and perhaps slightly different):
+
+## All Together Now!
+
+```elixir
+# router.ex
+
+get("/edit/:schema/:pk", AdminController, :edit)
+post("/new/:schema/:pk", AdminController, :create)
+put("/update/:schema/:pk", AdminController, :update)
+
+# admin_controller.ex
+
+@models %{
+ "user" => MyApp.Accounts.User,
+ "role" => MyApp.Accounts.Role
+ # ... and any other possible schema you have!
+}
+
+def edit(conn, %{"schema" => schema, "pk" => pk}) do
+ schema_module = @models[schema]
+
+ model = schema_module.__schema__(:associations)
+ |> Enum.reduce(MyApp.Repo.get(m, pk), fn a, m ->
+ MyApp.Repo.preload(m, a)
+ end)
+
+ # TODO: load changeset from session?
+ opts = [
+ changeset: Ecto.Changeset.change(model, %{}),
+ schema_module: schema_module
+ ]
+ render(conn, "edit.html", opts)
+end
+
+# create/2 works similarly and may be considered an exercise for the reader =)
+def update(conn, %{"schema" => schema, "pk" => pk, "data" => data}) do
+ schema_module = @models[schema]
+
+ # TODO: be wary! this lets an admin change EVERYTHING!
+ # if you want to avoid this like I did, setup an AdminEditable protocol that
+ # requires your schema to implement an admin-specific changeset and use that
+ # instead
+ changeset = Ecto.Changeset.change(MyApp.Repo.get!(module, pk), data)
+
+ case MyApp.Repo.update(changeset) do
+ {:ok, updated_model} ->
+ conn
+ |> put_flash(:info, "#{String.capitalize(schema)} ID #{pk} updated!")
+ |> redirect(to: Routes.admin_path(conn, :edit, schema, pk))
+
+ {:error, changeset} ->
+ conn
+ |> put_flash(:failed, "#{String.capitalize(schema)} ID #{pk} failed to update!")
+ |> put_session(:changeset, changeset)
+ |> redirect(to: Routes.admin_path(conn, :edit, schema, pk))
+ end
+end
+
+# admin_view.ex
+
+def field(form, changeset, schema_module, field, opts \\ []) do
+ # this is pretty much the result of the magic - render a partial, look at
+ # additional metadata, etc!
+ case schema_module.__schema__(:schema, field) do
+ :boolean -> Phoenix.HTML.Form.checkbox(form, field, opts)
+ _ -> Phoenix.HTML.Form.text_input(form, field, opts)
+ end
+end
+
+def association(form, changeset, schema_module, association, opts \\ []) do
+ # similar magic for associations! huzzah!
+ association = schema_module.__schema__(:association, association)
+
+ # make sure your schemas implement the `String.Chars` protocol!
+ options = MyApp.Repo.all(association.queryable)
+ |> Enum.map(&{&1.id, to_string(&1)})
+
+ case association.cardinality do
+ :many ->
+ Phoenix.HTML.Form.select(form, association, options, Keyword.put_new(opts, :multiple, true))
+ _ ->
+ Phoenix.HTML.Form.select(form, association, options, opts)
+ end
+end
+
+# new.html.slime is similar and also an exercise for the reader =)
+# edit.html.slime
+
+= form_for @changeset, Routes.admin_path(@conn, :update, @schema, @id), [as: :data], fn f ->
+ h2 Fields
+
+ = for field <- @schema_module.__schema__(:fields) do
+ .field
+ label
+ .label-text #{String.capitalize(to_string(field))}
+ = field(f, @changeset, @schema_module, field)
+
+ h2 Associations
+
+ = for association <- @schema_module.__schema__(:associations) do
+ .field
+ label
+ .label-text #{String.capitalize(to_string(association))}
+ = association(f, @changeset, @schema_module, association)
+```
+
+[django]: https://www.djangoproject.com/
+[phoenix]: https://phoenixframework.org/
+[ex_admin]: https://github.com/smpallen99/ex_admin
+[torch]:https://github.com/danielberkompas/torch
+[__schema__]: https://hexdocs.pm/ecto/3.0.7/Ecto.Schema.html#module-reflection
+[schema/2]: https://hexdocs.pm/ecto/3.0.7/Ecto.Schema.html#schema/2
+[Ecto.Changeset.change/2]: https://hexdocs.pm/ecto/3.0.7/Ecto.Changeset.html#change/2
+[elixir-slack]: https://elixir-slackin.herokuapp.com/
+[select_attributes]:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select#Attributes
+[many_to_many/3]: https://hexdocs.pm/ecto/3.0.7/Ecto.Schema.html#many_to_many/3
+[slime]: https://github.com/slime-lang/slime
+[eex]: https://hexdocs.pm/eex/EEx.html
diff --git a/content/blog/elm-form-fields-abstractions.md b/content/blog/elm-form-fields-abstractions.md
new file mode 100644
index 0000000..c499913
--- /dev/null
+++ b/content/blog/elm-form-fields-abstractions.md
@@ -0,0 +1,260 @@
+---
+image: "/img/dried-lava.jpg"
+date: "2019-03-20T20:24:54-05:00"
+imageOverlayColor: "#000"
+imageOverlayOpacity: 0.5
+heroBackgroundColor: "#333"
+description: "If you're using Elm, you're probably dealing with forms and
+fields. Here's how I did!"
+title: "Elm: Forms, Fields, and Abstractions"
+draft: false
+---
+
+If you're using Elm, you're probably dealing with forms and fields. You're also
+probably wanting to do functional programming "right" and compose smaller
+functions together. Hopefully this helps!
+
+
+
+# TL;DR
+
+Check it out in context on
+Ellie,
+the Elm playground!
+
+## How Did I Get Here?
+
+To preface this, I'm going to be writing a *lot* of forms with a *lot* of
+fields, all of which will pretty much work exactly the same, so creating a layer
+of abstraction to boost my productivity down the line is going to be massively
+important when it comes to changing things.
+
+You may have even found or been told to use [this library][1]. If you're really
+nuts, you may have even tried to use it before finding out that as soon as you
+want to change the default renderings at all, you are [encouraged][2] to [copy
+and paste this 700+ line file][3] and tweak accordingly, all the while being
+told it's not really a big deal.
+
+To be fair, technically this is appropriately "composable", as you are given the
+minimum functioning piece so that you can bolt whatever you need onto it, but as
+soon as a library or module isn't *easily* doing what I need it to do, instead
+of copying code from it, I'm just going to roll my own, which is generally
+a really good way to learn something anyways. So, while frustrated, I was also
+eager to tackle the problem.
+
+## Code Already!
+
+Since the Elm compiler is so awesome, I've taken to what I'm calling
+"compiler-driven development", which is where I write out what I expect to work
+and then proceed to make it work.
+
+As a simple test, I know I'm going to need fields that let a user input currency
+and percentages. I know that the only real differences that need to be
+abstracted away will be the type (currency, percentage, etc.), the getter they
+can use to display their current value from my `Model`, and the `Msg`
+constructor they will use to update that `Model` as the user fires `input`
+events. There will also be tooltips, validation, and other such things, but for
+the sake of simplicity, let's focus on these. So, my code will look something
+like the following:
+
+```elm
+-- ... imports and module definitions ...
+main =
+ Browser.element
+ { init = init
+ , update = update
+ , subscriptions = \m -> Sub.none
+ , view = view
+ }
+
+type alias Model =
+ { amount : String
+ , ratePercent : String
+ }
+
+init : () -> ( Model, Cmd msg )
+init _ =
+ ( { amount = "$1000.87" |> currency
+ , ratePercent = "3.427857%" |> percent
+ }
+ , Cmd.none
+ )
+
+type Msg
+ = UpdateAmount String (Cmd Msg)
+ | UpdateRatePercent String (Cmd Msg)
+
+update : Msg -> Model -> ( Model, Cmd Msg )
+update msg model =
+ case msg of
+ UpdateAmount s c -> ( { model | amount = s }, c )
+ UpdateRatePercent s c -> ( { model | ratePercent = s }, c )
+
+view : Model -> Html Msg
+view model =
+ Html.div []
+ [ form model
+ [ currencyField "Amount" .amount UpdateAmount
+ , percentField "Rate" .ratePercent UpdateRatePercent
+ ]
+```
+
+I want this code to handle rendering my fields, formatting and un-formatting the
+text input's value (more on this later), and firing update `Msg`s accordingly.
+So we just need to implement the `form` function and the `currencyField` and
+`percentField` functions.
+
+Note that I'm storing my values as a string in this case, even though my intent
+is for them to be numbers. I'm sure there is a cool Elm way to handle this using
+the type system, but I haven't got that far. For the moment I'm just extracting
+the value from them whenever the calculations need to be done (not shown here).
+If and when that changes, perhaps I can make that another blog post explaining
+that process as well!
+
+Let's start with form, since it should be the simplest.
+
+```elm
+form : model -> List (model -> Html msg) -> Html msg
+form model fields =
+ Html.form []
+ (List.map (\f -> f model) fields)
+```
+
+All the `form` function does is create an `Html.form` whose children are just
+the result of mapping over the list of fields, calling "view-like" functions,
+passing the model. Easy. Now your form function may need stuff like submit
+buttons or other actions, but mine does not. Again, do what is necessary for
+*your* application!
+
+Now, with some forward thinking, I know both my `currencyField` and
+`percentField` are going to do similar things with minor differences. Let's talk
+about those for a moment.
+
+My inputs need to show human-friendly values while idle, but once they're
+focused, they should show a more "raw" value so that editing the numerical
+values is easy and the user doesn't need to manage commas, units, or anything
+else; they just enter a number and the app will show them a nicely-formatted
+version of it. Most high-tech spreadsheets work similarly. I'll use `onFocus`
+and `onBlur` events to accomplish this.
+
+So let's do some more "compiler-driven development" (this will get a little
+nuts):
+
+```elm
+currencyField : String -> (model -> String) -> (String -> Cmd msg -> msg) -> model -> Html msg
+currencyField label getter updateMsg model =
+ formattedNumberField label (\m -> m |> getter |> currency) getter updateMsg model
+
+percentField : String -> (model -> String) -> (String -> Cmd msg -> msg) -> model -> Html msg
+percentField label getter updateMsg model =
+ formattedNumberField label (\m -> m |> getter |> percent) getter updateMsg model
+```
+
+Whew! I know these type signatures can look intimidating if you're new to Elm,
+but here's the breakdown of the arguments:
+
+1. The field's label (as we've seen in the call)
+2. A getter, which, given a model, can provide the text that the input should
+ display (as we've seen in the call - [here's an explanation][4])
+3. A `Msg` constructor that takes a `String` (which is passed from `onInput`)
+ and a `Cmd msg`, since in some cases we might wanna do that, but I won't get
+ into that here (as we've seen in the call)
+4. The model
+
+Okay! That all makes sense. Now what's up with `formattedNumberField`? That's
+the next layer of the abstraction onion I'm building up. It's for any number
+field that needs to unformat with `onFocus` and reformat with `onBlur`. Also,
+we're going to ignore `currency` and `percent` (thought the full code will have
+it) as that brings in a whole lot of code that's mostly unrelated to the core
+concept I'm trying to convey here. Basically, they take a string like "4.8" and
+convert that to "$4.80" or "4.80%".
+
+Now we might also have a number field that doesn't necessarily care about
+handling `onFocus` or `onBlur`, so we'll have another abstraction layer there
+called `numberField`. Let's see the code:
+
+```elm
+type alias FieldConfig t model msg =
+ { label : String
+ , value : model -> t
+ , onInput : t -> msg
+ , onFocus : model -> msg
+ , onBlur : model -> msg
+ , class : model -> String
+ }
+
+numberField : FieldConfig String model msg -> model -> Html msg
+numberField config model =
+ Html.div [ Html.Attributes.class "field" ]
+ [ Html.label []
+ [ Html.text config.label
+ ]
+ , Html.input
+ [ Html.Attributes.value (config.value model)
+ , Html.Attributes.class (config.class model)
+ , Html.Attributes.pattern "[0-9\\.]"
+ , Html.Attributes.id
+ (config.label
+ |> String.replace " " "_"
+ )
+ , Html.Events.onInput config.onInput
+ , Html.Events.onFocus (config.onFocus model)
+ , Html.Events.onBlur (config.onBlur model)
+ ]
+ []
+ ]
+
+formattedNumberField : String -> (model -> String) -> (model -> String) -> (String -> Cmd msg -> msg) -> model -> Html msg
+formattedNumberField label formatter getter updateMsg model =
+ numberField
+ -- FieldConfig
+ { label = label
+ , value = getter
+ , onInput = \s -> updateMsg s Cmd.none
+ , onFocus = \m -> updateMsg (m |> getter |> unFormat) (selectElementId label)
+ , onBlur = \m -> updateMsg (formatter m) Cmd.none
+ , class = \m -> m |> getter |> unFormat |> String.toFloat |> numberFieldClass
+ }
+ model
+```
+
+Alrighty! Our biggest chunk. The first block is just a type that tells the
+compiler what kind of things we're going to need to build a field. Most of them
+are functions that take a model and result in either the type of the field,
+a msg to update our model with, or some attribute used within the field for
+UX-related things, such as validation.
+
+The second chunk, `numberField` is perhaps the most familiar to newbies and
+straightforward. It takes a `FieldConfig`, which we just talked about, and
+a model and turns that into HTML that can trigger the messages as specified in
+the config. At a glance, it looks pretty magical, but hopefully the next chunk
+makes it clear.
+
+`formattedNumberField` specifies the `FieldConfig` which houses all the magic.
+It's pretty much a bunch of lambda functions that know how to take a model and
+create a `Msg`, which runs through our `update` function, which is that really
+important piece of [The Elm Architecture][5].
+
+There are a lot of functions in there like `unFormat`, `numberFieldClass`, and
+`selectElementId` that you can check out in the full example, but (again) aren't
+really relevant to the core of what I'm talking about.
+
+Hopefully this all makes sense. If it doesn't, check out the full example after
+the jump for a working example that you can play with. If this is "Elm 101" to
+you, awesome! It took me some serious mind-bending and frustration with Elm's
+incredible type checking system not implicitly understanding what I'm trying to
+do (computers, amirite?) before I made it to this point.
+
+Now, I'm confident Elm is a tool that can do everything I need it to do. I look
+forward to using it more in the future!
+
+## Full Source
+
+Check it out in context on
+Ellie,
+the Elm playground!
+
+[1]: https://github.com/hecrj/composable-form
+[2]: https://github.com/hecrj/composable-form/blob/dd846d84de9df181a9c6e8803ba408e628ff9a93/src/Form/Base.elm#L26
+[3]: https://github.com/hecrj/composable-form/blob/dd846d84de9df181a9c6e8803ba408e628ff9a93/src/Form.elm
+[4]: https://elm-lang.org/docs/records#access
diff --git a/content/blog/mirroring-gitea-to-other-repository-management-services.md b/content/blog/mirroring-gitea-to-other-repository-management-services.md
new file mode 100644
index 0000000..e217d60
--- /dev/null
+++ b/content/blog/mirroring-gitea-to-other-repository-management-services.md
@@ -0,0 +1,145 @@
+---
+image: "/img/code-mirror.jpg"
+date: "2019-03-13T08:37:34-05:00"
+imageOverlayColor: "#000"
+imageOverlayOpacity: 0.7
+heroBackgroundColor: "#333"
+description: For those of us who want to self-host and display their work in a "socially expectable" manner.
+title: Mirroring Gitea to Other Repository Management Services
+draft: false
+---
+
+I have a [Gitea][gitea] instance I self-host at home. I keep most of my
+repositories there, but I recognize that most other developers and potential
+employers will want to see [my work *on* GitHub][me-on-github].
+
+
+
+# TL;DR
+
++ Setup an SSH key for your Gitea instance on the relevant external repositories
++ Leverage `post-receive` git hooks in Gitea to push changes to the relevant
+ external repositories while identifying with your new SSH key
+
+Also, most of the magic is [here](#post-receive-script).
+
+# Mirroring
+
+In order to achieve this with minimal effort, I was going to need to utilize
+mirroring. Mirroring is a popular git concept that allow a repository to
+effectively exist in multiple places at once, though generally mirrors are
+read-only.
+
+Mirroring isn't exactly a specific procedure or command, it's simply the act of
+reflecting all (or some specific subset) of commits that exist elsewhere,
+generally in an automated fashion. Forks might be considered "mirrors" of
+a repository at a given point in time.
+
+GitLab, for example, [supports mirroring pretty seamlessly][0]. Gitea, however,
+is pretty minimal, which is one of its perks to me. That does not, however, mean
+that it is lacking in features.
+
+Gitea supports a few [git hooks][1], which are a simple way to run a script when
+something happens. As far as a repository manager is concerned, the only real
+hooks that matter are the following (which Gitea supports):
+
++ `pre-receive`: Runs when a client pushes code to the repository. You can use
+ this to prevent, for example, code that fails linters, doesn't pass tests,
+ or even that can't be merged using a specific merge strategy.
++ `update`: Runs for each branch being updated when a client pushes code to the
+ repository. This is similar to pre-receive, but allows for more fine-grained
+ control. Maybe you want to only make the previous restrictions on your
+ `master` branch. This would be the way to do it.
++ `post-receive`: Runs after your `pre-receive` and `update` hooks have finished
+ when a client pushes code to the repository. This is what we'll be
+ leveraging to push code downstream!
+
+With that lengthy introduction, let's dive in!
+
+# Setup
+
+Alrighty, this has a few simple steps, so let's outline what we need to do
+first:
+
+1. Setup SSH keys for Gitea and your other repository management services
+ 1. Generate fresh keys (`ssh-keygen -f gitea` will generate a private key in
+ the `gitea` file and a public key in the `gitea.pub` file)
+ 2. Add the public key (`gitea.pub`) to your "mirrors-to-be" repositories *with
+ write access*
+ + **Note**: I recommend at the very least to create one Gitea key and add it
+ to the individual repositories, though individual keys for each repository
+ is tighter security in case your Gitea instance becomes compromised
+ + **Note**: Your "mirrors-to-be" repositories must be blank or have related
+ histories!
+2. Setup the `post-receive` hook on your Gitea repository to push using the
+ newly generated private key to the mirror(s)
+
+I'm not going to explain much on how to add Deploy Keys for the various
+repository management systems out there, so here's a link [explaining the process
+for GitHub][2].
+
+# Hookin' Around
+
+Now we're all set for the magic! Also, for reference and sanity, I'm running
+Gitea in Docker on an Arch Linux server with the following version (but this
+should work pretty much regardless):
+
++ Gitea Version: `3b612ce built with go1.11.5 : bindata, sqlite,
+ sqlite_unlock_notify`
++ Git Version: `2.18.1`
+
+Let's go ahead and open up our Gitea repository's index page.
+
+![My dotfiles repository index](/img/scrots/gitea-mirroring/repo-index.png)
+
+And head to the repository's "Settings" tab... (oh yes, you'll need to have the proper permissions on
+the repository itself!)
+
+![Click the "Settings" tab in the
+top-right](/img/scrots/gitea-mirroring/repo-index-hl-settings.png)
+
+And now to the "Git Hooks" tab...
+
+![Click the "Git Hooks"
+tab](/img/scrots/gitea-mirroring/repo-settings-hl-git-hooks.png)
+
+Let's edit the "Post Receive" hook...
+
+![Edit the "Post Receieve"
+hook](/img/scrots/gitea-mirroring/repo-hooks-hl-post-receive-edit.png)
+
+And you will be presented with a form where you can put any kind of script you
+want! Remember the SSH keys you generated so long ago? We're going to need the
+contents of the private key now. Here are the script contents you're going to
+use, replacing the variables as necessary.
+
+## Post-Receive Script
+
+```bash
+#!/usr/bin/env bash
+
+downstream_repo="git@github.com:lytedev/dotfiles.git"
+# if tmp worries you, put it somewhere else!
+pkfile="/tmp/gitea_dotfiles_to_github_dotfiles_id_rsa"
+
+if [ ! -e "$pkfile" ]; then # unindented block for heredoc's sake
+cat > "$pkfile" << PRIVATEKEY
+# ==> REMOVE THIS ENTIRE LINE & PASTE YOUR PRIVATE KEY HERE <==
+PRIVATEKEY
+fi
+
+chmod 400 "$pkfile"
+export GIT_SSH_COMMAND="ssh -oStrictHostKeyChecking=no -i \"$pkfile\""
+# if you want strict host key checking, just add the host to the known_hosts for
+# your Gitea server/user beforehand
+git push --mirror "$downstream_repo"
+```
+
+Click "Update Hook" and you're all set! Now just push to the repo and watch it
+magically become mirrored to the downstream repository!
+
+[me-on-github]: https://github.com/lytedev
+[gitea]: https://gitea.io/en-us/
+[0]: https://docs.gitlab.com/ee/workflow/repository_mirroring.html
+[1]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
+[2]: https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys
diff --git a/content/blog/weechat-matrix-encryption-guide.md b/content/blog/weechat-matrix-encryption-guide.md
new file mode 100644
index 0000000..31dbb7f
--- /dev/null
+++ b/content/blog/weechat-matrix-encryption-guide.md
@@ -0,0 +1,148 @@
+---
+image: "/img/locks.jpg"
+date: "2019-03-07T10:17:30-06:00"
+imageOverlayColor: "#000"
+imageOverlayOpacity: 0.8
+heroBackgroundColor: "#000"
+description: "Use an amazing terminal client with an amazing Chat framework!"
+title: Weechat & Matrix Encryption Guide
+draft: false
+---
+
+There's a new-fangled [Python WeeChat plugin][weechat-matrix] that supports
+end-to-end encryption. This guide will walk you through what is currently
+a semi-annoying setup, as the entire project is still under heavy development.
+
+
+
+# TL;DR
+
++ Setup [dependencies](#dependencies)
++ Run `git clone
+https://git.faceless.lyte.dev/lytedev/weechat-matrix-encryption-guide.git
+/tmp/wmeg && $EDITOR /tmp/wmeg/easy-script.bash && /tmp/wmeg/easy-script.bash`
++ [Configure](#configuration) as needed
+
+## Python Versions
+
+We need to establish which version of Python your WeeChat is using. You can find
+this out in WeeChat with `/python version`. In my case, my `python` binary is
+3.7.2 (`python -V`) while my WeeChat Python version is 2.7.15.
+
+## Dependencies
+
+There are a number of dependencies we can go ahead and start grabbing. The main
+repository lists a number of them in the `README`, so we will grab those. We
+also need to install `libolm` however you would do that for your environment.
+
+```
+sudo pip2 install pyOpenSSL typing webcolors future atomicwrites attrs logbook pygments
+pacaur -S libolm # or for Ubuntu (and maybe Debian?): sudo apt-get install libolm-dev
+```
+
+Notice that we left out the [`matrix-nio`][matrix-nio] dependency. It's not in
+PyPi, so we can't just `pip2 install matrix-nio` (yet!) and PyPi's `nio` package
+is something probably unrelated, so we'll need to install it manually.
+
+## Installing `matrix-nio`
+
+Let's go ahead and clone down the repository and get ready to do some stuff:
+
+```bash
+git clone https://github.com/poljar/matrix-nio.git
+cd matrix-nio
+```
+
+```go-html-template
+
+
+
{{ .Title }}
+ {{ range .Pages }}
+ {{ .Render "summary"}}
+ {{ end }}
+
+
+```
+
+If you're looking around, documentation seems a bit sparse on how to do this,
+but it has a mostly normal manual Python package installation workflow.
+
+First, lets grab all the dependencies specific to the `matrix-nio` package:
+
+```
+sudo pip2 install -r ./rtd-requirements.txt
+```
+
+And now we expect to be able to install it:
+
+```
+sudo python2 ./setup.py install
+```
+
+But you'll see the install script pauses for a second before we get an odd
+error:
+
+```
+Processing dependencies for matrix-nio==0.1
+Searching for python-olm@ git+https://github.com/poljar/python-olm.git@master#egg=python-olm-0
+Reading https://pypi.org/simple/python-olm/
+Couldn't find index page for 'python-olm' (maybe misspelled?)
+Scanning index of all packages (this may take a while)
+Reading https://pypi.org/simple/
+No local packages or working download links found for python-olm@ git+https://github.com/poljar/python-olm.git@master#egg=python-olm-0
+error: Could not find suitable distribution for Requirement.parse('python-olm@ git+https://github.com/poljar/python-olm.git@master#egg=python-olm-0')
+```
+
+Out of the box, Python packages' `setup.py` scripts seem to not know how to
+handle packages whose URL specifies to grab it via VCS, such as `git+`. So we'll
+just help it out and grab it ourselves (instead of tinkering with anybody's
+scripts):
+
+```
+sudo pip2 install -e git+https://github.com/poljar/python-olm.git@master#egg=python-olm-0
+```
+
+*Now* we should have everything we need to install the `matrix-nio` Python
+package:
+
+```
+sudo python2 ./setup.py install
+```
+
+## Weechat Plugin Installation
+
+Once we've done that, we should have all the dependencies for `weechat-matrix`,
+so let's go ahead and clone that and install it!
+
+```
+git clone https://github.com/poljar/weechat-matrix.git
+cd weechat-matrix
+make install
+```
+
+Done!
+
+## Configuration
+
+The rest is up to you! You'll need to [configure your Matrix servers within
+WeeChat][weechat-matrix-config] and then verify keys. Verifying keys isn't
+a particularly clean process at the moment, but I expect it shall improve. For
+now, I followed this basic process in WeeChat:
+
++ Open a split at your status window so you can see it and the encrypted channel
+ at the same time. (`/window splitv`)
++ Open the encrypted channel whose keys you need to verify.
++ List the unverified keys in the current channel. (`/olm info unverified`)
++ For each user with keys listed there, verify all of their listed keys via your
+ preferred method. Alternatively, you can do this on a per-device basis. See
+ `/help olm` for details.
++ Once all keys are verified, tell WeeChat you have done so. (`/olm verify
+ @username:homeserver.example.com`)
++ Repeat until there are no unverified keys remaining in the current channel and
+ repeat for each channel. Whew!
+
+
+[weechat-matrix]: https://github.com/poljar/weechat-matrix
+[weechat-matrix-config]: https://github.com/poljar/weechat-matrix#Configuration
+[matrix-nio]: https://github.com/poljar/matrix-nio
+
diff --git a/content/contact.md b/content/contact.md
new file mode 100644
index 0000000..40ae3ea
--- /dev/null
+++ b/content/contact.md
@@ -0,0 +1,34 @@
+---
+date: 2017-02-22T14:43:02-06:00
+image: /img/pen-journal.jpg
+imageOverlayColor: "#000"
+imageOverlayOpacity: 0.7
+heroBackgroundColor: "#333"
+title: Contact
+description: "Need to get in touch?"
+---
+
+Email me at daniel@lyte.dev or use
+the form below.
+
+
+
+
diff --git a/content/privacy.md b/content/privacy.md
new file mode 100644
index 0000000..9bd1b09
--- /dev/null
+++ b/content/privacy.md
@@ -0,0 +1,10 @@
+---
+title: Privacy Policy
+---
+
+I collect basic analytics to a system I run and control for insight into how
+people use my website. That's it! No Google or Facebook here.
+
+Thanks for reading. Thanks for being concerned about your privacy.
+
+Head back to the home page.
diff --git a/content/thanks.md b/content/thanks.md
new file mode 100644
index 0000000..b7366ab
--- /dev/null
+++ b/content/thanks.md
@@ -0,0 +1,16 @@
+---
+date: 2017-02-22T14:43:02-06:00
+image: https://images.unsplash.com/photo-1473186505569-9c61870c11f9?dpr=1&auto=format&fit=crop&w=1500&h=1000&q=80&cs=tinysrgb&crop=
+imageOverlayColor: "#000"
+imageOverlayOpacity: 0.7
+heroBackgroundColor: "#333"
+title: Thank You!
+description: "I appreciate your participation!"
+---
+
+## Thank you so much for reaching out!
+
+I usually reply within a day.
+
+Back to Home
+Or check out the blog!
diff --git a/layouts/blog/li.html b/layouts/blog/li.html
new file mode 100644
index 0000000..b3b8a64
--- /dev/null
+++ b/layouts/blog/li.html
@@ -0,0 +1 @@
+{{ .Title }}
diff --git a/layouts/index.html b/layouts/index.html
new file mode 100644
index 0000000..c4067c4
--- /dev/null
+++ b/layouts/index.html
@@ -0,0 +1,35 @@
+{{ define "main" }}
+
+
+ Hi! I'm Daniel.
+
+
+
+
+
+
+ I live in Kansas City where I help run a small Christian church, raise a
+ family, and write software for Postmates.
+
+
+
+ Occasionally, I write technical blog posts. You can also check out my work
+ on GitHub.
+
+
+
+
+ Latest Posts
+
+
+
+
+
+
+{{ end }}
diff --git a/static/icon.png b/static/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ddf077ca635425fb60dee284f47723cb72fb8c0c
GIT binary patch
literal 19816
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 |