<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
<channel>
<atom:link href="http://micahelliott.com/" rel="self" type="application/rss+xml"/>
<title>
Micah Elliott
</title>
<link>
http://micahelliott.com/
</link>
<description>
A Tech Journal
</description>
<lastBuildDate>
Mon, 20 Feb 2017 17:08:03 -0800
</lastBuildDate>
<generator>
clj-rss
</generator>
<language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:summary> A Tech Journal </itunes:summary><itunes:subtitle> A Tech Journal </itunes:subtitle><item>
<guid>
http://micahelliott.com/posts/2016-12-03-clojure-annoyances.html
</guid>
<link>
http://micahelliott.com/posts/2016-12-03-clojure-annoyances.html
</link>
<title>
Clojure Annoyances
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;Clojure beginners&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
“You have to be quite heavily invested in someone to do them the honour of
telling them you’re annoyed with them.” &lt;em&gt;― Alain de Botton&lt;/em&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Every language has warts. This is not the first wart piece written on Clojure,
but it’s my unique take on it. There are some workarounds, but these will bite
newbies. Despite these minor annoyances, I still find Clojure to be the best
environment to work in for many years to come.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/img/annoyances/title.jpg" alt="title" width="600"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_memory_hogging"&gt;Memory hogging&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="../img/annoyances/memhog.jpg" alt="memhog" width="600"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;That’s a Raspberry Pi in his mouth. It’s being devoured.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Every time this is brought up there are arguments that Clojure and the JVM alone
don’t use too much memory. But once &lt;code&gt;lein&lt;/code&gt; is starting an nREPL for a
non-trivial project, you’ll want to have a 16+ GB machine. The situation would
be even worse if you use a heavy IDE (like IntelliJ or Eclipse).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’m still sometimes clumsy with my setup, and may have a REPL going that’s not
connected to Vim, plus a &lt;code&gt;lein run&lt;/code&gt; server running. And then another for
generating this blog (that one has some leak that gets it up to 5 GB after a few
days!). Maybe another for testing and working through 4clojure. So if you’re not
careful, you’ll want to limit yourself to running one project at a time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;All this can make Clojure a non-starter for students with minimal systems, like
older Linux laptops or Raspberry Pis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Remedies:&lt;/strong&gt; &lt;a href="https://github.com/technomancy/leiningen/wiki/Faster" class="bare"&gt;https://github.com/technomancy/leiningen/wiki/Faster&lt;/a&gt;, light/smart
editors&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_slow_startup"&gt;Slow startup&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="../img/annoyances/slow-start.jpg" alt="slow start" width="600"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Clojure starts up quickly (relative to lein, anyway). But the full &lt;code&gt;lein&lt;/code&gt;
environment is taking me 17+ seconds in a default Luminus project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Clojure itself is super fast for a lot of things&amp;#8230;&amp;#8203;. once it’s started.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Remedies:&lt;/strong&gt; Trampoline, Drip&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_lots_of_parentheses"&gt;Lots of parentheses&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="../img/annoyances/parens.jpg" alt="parens" width="600"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;These can drive a newbie crazy. But once you learn to paredit them, they’re
quite a boon for moving code around. They’re also pretty easy to auto-add and
auto-balance, and even auto-color.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Remedies:&lt;/strong&gt; paredit, sexp, rainbow parentheses&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_deal_with_java"&gt;Deal with Java&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="../img/annoyances/htop.jpg" alt="htop" width="600"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Process trees cluttered with really long invocations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This happens with a lot of other environments, too, though. I see it with Erlang
when running RabbitMQ; with Rails running Passenger; with MySQL; etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Remedies:&lt;/strong&gt; tree view, live with it, forget *top and use real monitoring tools&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_awful_backtraces"&gt;Awful backtraces&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="../img/annoyances/stacktrace.jpg" alt="stacktrace" width="600"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I actually don’t see these very often. I’m not sure if it’s due to
&lt;code&gt;clj-stacktrace&lt;/code&gt; being everpresent in my setup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Remedies:&lt;/strong&gt; small fonts, scrolling&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_not_always_expressive"&gt;Not always expressive&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="../img/annoyances/py-vs-pi.jpg" alt="py vs pi" width="600"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_heavy_setup"&gt;Heavy setup&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In Racket&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_everyone_uses_emacs"&gt;Everyone uses Emacs&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&amp;#8230;&amp;#8203;and maybe you don’t. But that’s okay.
&lt;a href="http://stackoverflow.com/questions/4248171/choosing-an-ide-editor-for-clojure-coding"&gt;Many&lt;/a&gt;
are also having success with
&lt;a href="http://micahelliott.com/posts/2015-07-13-clojure-vim-setup.html"&gt;Vim&lt;/a&gt;,
LightTable, and Cursive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can watch &lt;em&gt;guns&lt;/em&gt; in this video doing some cool things:
&lt;a href="https://vimeo.com/80650659https://vimeo.com/80650659" class="bare"&gt;https://vimeo.com/80650659https://vimeo.com/80650659&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_docstrings_require_an_extra_line"&gt;Docstrings require an extra line&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;Python supports this style of coding:&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="highlight"&gt;&lt;code class="language-python" data-lang="python"&gt;def fetch(dog):
    "Get dog to grab my slippers."
    dog.walk_to_bedroom() ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;In Clojure, we have to write:&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="highlight"&gt;&lt;code class="language-clojure" data-lang="clojure"&gt;(defn fetch
  "Get dog to grab my slippers."
  [dog]
  (walk-to-bedroom ...) ...)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;But it would be much nicer to write:&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="highlight"&gt;&lt;code class="language-clojure" data-lang="clojure"&gt;(defn fetch [dog]
  "Get dog to grab my slippers."
  (walk-to-bedroom ...) ...)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This, of course, is due to multiple arity support, but still annoying. So I find
myself resorting to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="highlight"&gt;&lt;code class="language-clojure" data-lang="clojure"&gt;;; Get dog to grab my slippers.
(defn fetch [dog]
  (walk-to-bedroom ...) ...)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_but_clojure_is_still_the_best"&gt;But Clojure is still the best&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_the_criteria_only_three_really_in_the_race"&gt;The Criteria: Only three really in the race&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="../img/annoyances/trinity.jpg" alt="trinity"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’ve grown persnickety after many years working with less satisfying
environments, and now I value comfortable workflow above most things. This has
brought me to only considering a few that have hope for joyful programming. They
are Clojure, Racket, and OCaml. (Elm and LiveScript get honorable mentions as
great languages.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;expressive, succinct&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;simple&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;functional (and thus parallelizable)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fast and light (Clojure almost doesn’t make the cut here)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Considerations that are secondary also, unfortunately, have strong impact:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;jobs available&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;projects with many eyeballs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;widely adopted in usage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tutorials, books, screencasts, discussions&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In the end, Racket and OCaml both suffer from having communities that are too
small, tools that are not widely enough adopted, projects without enough
eyeballs, and tutorials not yet written. As much as I (and you) should work on
addressing those shortcomings, most of us have other practical things presently
pressing harder.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So that leaves us with Clojure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;(It’s not that I haven’t considered most of the up-and-coming languages that get
a lot of attention. They just don’t satisfy the above constraints. So, I’m left
not really considering: Scala, Elixir, Rust, Go, Haskell.)&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_summary_of_why_clojure_wins"&gt;Summary of Why Clojure Wins&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="../img/annoyances/pretty2.jpg" alt="pretty2"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;(Note: shown above is vim using the “conceal” feature for functions like
partition, map, apply, etc. You either love or hate this.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aesthetics&lt;/strong&gt;&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;code density&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;beautiful rainbow parens (hooks for moving code)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;functional: &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;reduce&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Paredit/Sexp: &lt;strong&gt;parentheses&lt;/strong&gt; become hooks for moving code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trivial &lt;strong&gt;parallelism&lt;/strong&gt; (sometimes, via &lt;code&gt;pmap&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Isomorphic&lt;/strong&gt; possibilities: server (web frameworks) and client (reagent, om).
You’re probably not going to be a &lt;em&gt;great&lt;/em&gt; developer in both
JavaScript and some other language on the back end (Ruby, Python, Java), so
why not just be great in Clojure/Script?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Crazy &lt;strong&gt;REPL&lt;/strong&gt; abilities&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many &lt;strong&gt;&lt;a href="http://clojure.org/companies"&gt;companies&lt;/a&gt;&lt;/strong&gt; are invested&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A better way to use Java libs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lein&lt;/strong&gt; is an all-in-one (cf. rails, gem, bundle, rake)&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;but also boot&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many &lt;strong&gt;learning resources&lt;/strong&gt; (books, podcasts, screencasts, newletters,
discussions)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;&lt;a href="https://yogthos.github.io/ClojureDistilled.html"&gt;simple language&lt;/a&gt;&lt;/strong&gt; mostly
grokkable in a day (by experienced programmers with some functional
knowledge)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.clojure-toolbox.com/"&gt;Many tools&lt;/a&gt;&lt;/strong&gt; (plus anything from java)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great data structures&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Functional code (referentially transparent) is most &lt;strong&gt;testable&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All the fancy &lt;strong&gt;big data tools&lt;/strong&gt; are now java (spark, storm, flink, hadoop&amp;#8230;&amp;#8203;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Macros&lt;/strong&gt; (there’s even a book on them)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;&lt;a href="https://github.com/bbatsov/clojure-style-guide"&gt;style guide&lt;/a&gt;&lt;/strong&gt; whose perfect
sensibility says a lot&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href="http://endlessparentheses.com/cider-debug-a-visual-interactive-debugger-for-clojure.html"&gt;debugger&lt;/a&gt; inside emacs!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Sat, 03 Dec 2016 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: Clojure beginners “You have to be quite heavily invested in someone to do them the honour of telling them you’re annoyed with them.” ― Alain de Botton Every language has warts. This is not the first wart piece written on Clojure, but it’s my unique take on it. There are some workarounds, but these will bite newbies. Despite these minor annoyances, I still find Clojure to be the best environment to work in for many years to come. Memory hogging That’s a Raspberry Pi in his mouth. It’s being devoured. Every time this is brought up there are arguments that Clojure and the JVM alone don’t use too much memory. But once lein is starting an nREPL for a non-trivial project, you’ll want to have a 16+ GB machine. The situation would be even worse if you use a heavy IDE (like IntelliJ or Eclipse). I’m still sometimes clumsy with my setup, and may have a REPL going that’s not connected to Vim, plus a lein run server running. And then another for generating this blog (that one has some leak that gets it up to 5 GB after a few days!). Maybe another for testing and working through 4clojure. So if you’re not careful, you’ll want to limit yourself to running one project at a time. All this can make Clojure a non-starter for students with minimal systems, like older Linux laptops or Raspberry Pis. Remedies: https://github.com/technomancy/leiningen/wiki/Faster, light/smart editors Slow startup Clojure starts up quickly (relative to lein, anyway). But the full lein environment is taking me 17+ seconds in a default Luminus project. Clojure itself is super fast for a lot of things&amp;#8230;&amp;#8203;. once it’s started. Remedies: Trampoline, Drip Lots of parentheses These can drive a newbie crazy. But once you learn to paredit them, they’re quite a boon for moving code around. They’re also pretty easy to auto-add and auto-balance, and even auto-color. Remedies: paredit, sexp, rainbow parentheses Deal with Java Process trees cluttered with really long invocations. This happens with a lot of other environments, too, though. I see it with Erlang when running RabbitMQ; with Rails running Passenger; with MySQL; etc. Remedies: tree view, live with it, forget *top and use real monitoring tools Awful backtraces I actually don’t see these very often. I’m not sure if it’s due to clj-stacktrace being everpresent in my setup. Remedies: small fonts, scrolling Not always expressive Heavy setup In Racket Everyone uses Emacs &amp;#8230;&amp;#8203;and maybe you don’t. But that’s okay. Many are also having success with Vim, LightTable, and Cursive. You can watch guns in this video doing some cool things: https://vimeo.com/80650659https://vimeo.com/80650659 Docstrings require an extra line Python supports this style of coding: def fetch(dog): "Get dog to grab my slippers." dog.walk_to_bedroom() ... In Clojure, we have to write: (defn fetch "Get dog to grab my slippers." [dog] (walk-to-bedroom ...) ...) But it would be much nicer to write: (defn fetch [dog] "Get dog to grab my slippers." (walk-to-bedroom ...) ...) This, of course, is due to multiple arity support, but still annoying. So I find myself resorting to: ;; Get dog to grab my slippers. (defn fetch [dog] (walk-to-bedroom ...) ...) But Clojure is still the best The Criteria: Only three really in the race I’ve grown persnickety after many years working with less satisfying environments, and now I value comfortable workflow above most things. This has brought me to only considering a few that have hope for joyful programming. They are Clojure, Racket, and OCaml. (Elm and LiveScript get honorable mentions as great languages.) expressive, succinct simple functional (and thus parallelizable) fast and light (Clojure almost doesn’t make the cut here) Considerations that are secondary also, unfortunately, have strong impact: jobs available projects with many eyeballs widely adopted in usage tutorials, books, screencasts, discussions In the end, Racket and OCaml both suffer from having communities that are too small, tools that are not widely enough adopted, projects without enough eyeballs, and tutorials not yet written. As much as I (and you) should work on addressing those shortcomings, most of us have other practical things presently pressing harder. So that leaves us with Clojure. (It’s not that I haven’t considered most of the up-and-coming languages that get a lot of attention. They just don’t satisfy the above constraints. So, I’m left not really considering: Scala, Elixir, Rust, Go, Haskell.) Summary of Why Clojure Wins (Note: shown above is vim using the “conceal” feature for functions like partition, map, apply, etc. You either love or hate this.) Aesthetics code density beautiful rainbow parens (hooks for moving code) functional: map, filter, reduce Paredit/Sexp: parentheses become hooks for moving code Trivial parallelism (sometimes, via pmap) Isomorphic possibilities: server (web frameworks) and client (reagent, om). You’re probably not going to be a great developer in both JavaScript and some other language on the back end (Ruby, Python, Java), so why not just be great in Clojure/Script? Crazy REPL abilities Many companies are invested A better way to use Java libs Lein is an all-in-one (cf. rails, gem, bundle, rake) but also boot Many learning resources (books, podcasts, screencasts, newletters, discussions) A simple language mostly grokkable in a day (by experienced programmers with some functional knowledge) Many tools (plus anything from java) Great data structures Functional code (referentially transparent) is most testable All the fancy big data tools are now java (spark, storm, flink, hadoop&amp;#8230;&amp;#8203;) Macros (there’s even a book on them) A style guide whose perfect sensibility says a lot A debugger inside emacs!</itunes:subtitle><itunes:summary>Audience: Clojure beginners “You have to be quite heavily invested in someone to do them the honour of telling them you’re annoyed with them.” ― Alain de Botton Every language has warts. This is not the first wart piece written on Clojure, but it’s my unique take on it. There are some workarounds, but these will bite newbies. Despite these minor annoyances, I still find Clojure to be the best environment to work in for many years to come. Memory hogging That’s a Raspberry Pi in his mouth. It’s being devoured. Every time this is brought up there are arguments that Clojure and the JVM alone don’t use too much memory. But once lein is starting an nREPL for a non-trivial project, you’ll want to have a 16+ GB machine. The situation would be even worse if you use a heavy IDE (like IntelliJ or Eclipse). I’m still sometimes clumsy with my setup, and may have a REPL going that’s not connected to Vim, plus a lein run server running. And then another for generating this blog (that one has some leak that gets it up to 5 GB after a few days!). Maybe another for testing and working through 4clojure. So if you’re not careful, you’ll want to limit yourself to running one project at a time. All this can make Clojure a non-starter for students with minimal systems, like older Linux laptops or Raspberry Pis. Remedies: https://github.com/technomancy/leiningen/wiki/Faster, light/smart editors Slow startup Clojure starts up quickly (relative to lein, anyway). But the full lein environment is taking me 17+ seconds in a default Luminus project. Clojure itself is super fast for a lot of things&amp;#8230;&amp;#8203;. once it’s started. Remedies: Trampoline, Drip Lots of parentheses These can drive a newbie crazy. But once you learn to paredit them, they’re quite a boon for moving code around. They’re also pretty easy to auto-add and auto-balance, and even auto-color. Remedies: paredit, sexp, rainbow parentheses Deal with Java Process trees cluttered with really long invocations. This happens with a lot of other environments, too, though. I see it with Erlang when running RabbitMQ; with Rails running Passenger; with MySQL; etc. Remedies: tree view, live with it, forget *top and use real monitoring tools Awful backtraces I actually don’t see these very often. I’m not sure if it’s due to clj-stacktrace being everpresent in my setup. Remedies: small fonts, scrolling Not always expressive Heavy setup In Racket Everyone uses Emacs &amp;#8230;&amp;#8203;and maybe you don’t. But that’s okay. Many are also having success with Vim, LightTable, and Cursive. You can watch guns in this video doing some cool things: https://vimeo.com/80650659https://vimeo.com/80650659 Docstrings require an extra line Python supports this style of coding: def fetch(dog): "Get dog to grab my slippers." dog.walk_to_bedroom() ... In Clojure, we have to write: (defn fetch "Get dog to grab my slippers." [dog] (walk-to-bedroom ...) ...) But it would be much nicer to write: (defn fetch [dog] "Get dog to grab my slippers." (walk-to-bedroom ...) ...) This, of course, is due to multiple arity support, but still annoying. So I find myself resorting to: ;; Get dog to grab my slippers. (defn fetch [dog] (walk-to-bedroom ...) ...) But Clojure is still the best The Criteria: Only three really in the race I’ve grown persnickety after many years working with less satisfying environments, and now I value comfortable workflow above most things. This has brought me to only considering a few that have hope for joyful programming. They are Clojure, Racket, and OCaml. (Elm and LiveScript get honorable mentions as great languages.) expressive, succinct simple functional (and thus parallelizable) fast and light (Clojure almost doesn’t make the cut here) Considerations that are secondary also, unfortunately, have strong impact: jobs available projects with many eyeballs widely adopted in usage tutorials, books, screencasts, discussions In the end, Racket and OCaml both suffer from having communities that are too small, tools that are not widely enough adopted, projects without enough eyeballs, and tutorials not yet written. As much as I (and you) should work on addressing those shortcomings, most of us have other practical things presently pressing harder. So that leaves us with Clojure. (It’s not that I haven’t considered most of the up-and-coming languages that get a lot of attention. They just don’t satisfy the above constraints. So, I’m left not really considering: Scala, Elixir, Rust, Go, Haskell.) Summary of Why Clojure Wins (Note: shown above is vim using the “conceal” feature for functions like partition, map, apply, etc. You either love or hate this.) Aesthetics code density beautiful rainbow parens (hooks for moving code) functional: map, filter, reduce Paredit/Sexp: parentheses become hooks for moving code Trivial parallelism (sometimes, via pmap) Isomorphic possibilities: server (web frameworks) and client (reagent, om). You’re probably not going to be a great developer in both JavaScript and some other language on the back end (Ruby, Python, Java), so why not just be great in Clojure/Script? Crazy REPL abilities Many companies are invested A better way to use Java libs Lein is an all-in-one (cf. rails, gem, bundle, rake) but also boot Many learning resources (books, podcasts, screencasts, newletters, discussions) A simple language mostly grokkable in a day (by experienced programmers with some functional knowledge) Many tools (plus anything from java) Great data structures Functional code (referentially transparent) is most testable All the fancy big data tools are now java (spark, storm, flink, hadoop&amp;#8230;&amp;#8203;) Macros (there’s even a book on them) A style guide whose perfect sensibility says a lot A debugger inside emacs!</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2016-09-10-why-learn-a-lisp.html
</guid>
<link>
http://micahelliott.com/posts/2016-09-10-why-learn-a-lisp.html
</link>
<title>
Why Learn a Lisp?
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;Programming in Lisp is a different kind of programming. Some things seem similar
to your daily imperative treadmill, but mostly it’s different. There’s a
different lexicon of terms, REPL-driven (or rather, -dominated) programming,
there’s immutability, a really different type of (par)editing, a higher level of
conciseness, a naturalness to using HoFs, a leaning on a small set of primitives,
recursion as the norm, and so on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It’s worth gaining some proficiency with a Lisp, if anything, to change the way
you think about programming. In this post I explore the Lisp landscape, and try
to convince you to get in on the Racket, for edification, fun, and
even profit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_lisp_engines"&gt;Lisp Engines&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Lisp is embedded in a lot of places.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Despite Lua being often recognized as being The Embeddable Language,
surprisingly many tools are programmable in Lisp. Some examples include: Gimp,
&lt;a href="http://www.gnu.org/software/guix/"&gt;Guix&lt;/a&gt;, Emacs, &lt;a href="https://en.m.wikipedia.org/wiki/AutoLISP"&gt;AutoCAD&lt;/a&gt;, LilyPond,
GnuCash,
&lt;a href="http://www.cstr.ed.ac.uk/projects/festival/manual/festival_8.html"&gt;Festival&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There are several Lisps designed especially for embedding, such as
&lt;a href="http://synthcode.com/wiki/chibi-scheme"&gt;Chibi-scheme&lt;/a&gt;,
&lt;a href="http://www.software-lab.de/down.html"&gt;PicoLisp&lt;/a&gt;,
&lt;a href="http://tinyscheme.sourceforge.net/home.html"&gt;TinyScheme&lt;/a&gt;, and
&lt;a href="https://github.com/sbp/hedgehog"&gt;Hedgehog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;BTW, I don’t discredit Vim for not having an embedded Lisp. I see most of Vim
(even VimL) as a very special DSL. Even with Lisp, you just can’t get as
concise as Vim commands.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_scheme_learning_resources"&gt;Scheme learning resources&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_books"&gt;Books&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://mitpress.mit.edu/sicp/"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt;(SICP)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://mitpress.mit.edu/books/little-schemer"&gt;The Little Schemer&lt;/a&gt; (TLS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.cs.berkeley.edu/~bh/ss-toc2.html"&gt;Simply Scheme: Introducing CS&lt;/a&gt; (SSICS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.ccs.neu.edu/home/matthias/HtDP2e/"&gt;How to Design Programs&lt;/a&gt; (HtDP)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.scheme.com/tspl4/"&gt;The Scheme Programming Language&lt;/a&gt; (TSPL4)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://realmofracket.com/"&gt;Realm of Racket&lt;/a&gt; (RoR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://cs.brown.edu/~sk/Publications/Books/ProgLangs/2007-04-26/"&gt;Programming Languages: Application and Interpretation&lt;/a&gt; (PLAI)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Some of those are seminal classics that can teach you how to program like almost
no other book. Notice that bent towards Scheme. That’s the beauty of Racket:
decades of academic knowledge still applicable to a modern language. Most of
those books available for free in web form.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you want to get into Artificial Intelligence (AI), you’ll surely spend some
time in Lisp.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_web"&gt;Web&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A few invaluable web resources are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://docs.racket-lang.org/guide/"&gt;The Racket Guide&lt;/a&gt;; extensive&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://rosettacode.org/wiki/Category:Racket"&gt;Racket on Rosetta Code&lt;/a&gt;; a
&lt;a href="http://blog.racket-lang.org/2015/05/king-of-hill-on-rosetta-code.html"&gt;top language&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://learnxinyminutes.com/docs/racket/"&gt;Racket on “Learn X in Y minutes”&lt;/a&gt;;
brief feature/language overview&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_videos"&gt;Videos&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=vJGV7HaTdbg"&gt;Randall Schwartz intro on Twit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_lightweight"&gt;Lightweight&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Racket installs everywhere. It has a small footprint and starts up quickly. Very
modest student machines can run it without hitting any resource limits.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Although the community heavily supports their own IDE, there’s no reason you
have to use it. It has some nice graphical-oriented features, but Vim and Emacs
are great for editing Racket.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_decent_repl"&gt;Decent REPL&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Nice little REPL can do completion, and features a vi-mode. Works well with
vim-slime.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_but_can_you_get_paid_to_code_in_lisp"&gt;But can you get paid to code in Lisp?&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Yes. I think the most likely route right now is through
&lt;a href="http://clojure.org/Companies"&gt;Clojure&lt;/a&gt;. I loved my couple of years with it, but
it’s a little too beastly to be promoting for student adoption.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;ClojureScript (and Om/Reagent) is also sure to open up more webdev jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_so_why_learn_racket"&gt;So why learn Racket?&lt;/h2&gt;
&lt;div class="sectionbody"&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_successful_lisp_companies_sites"&gt;Successful Lisp companies/sites&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cognitect&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=GAmZIgs72wA"&gt;Airstash&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youpatch.com/"&gt;YouPatch&lt;/a&gt; (startup)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.paulgraham.com/carl.html"&gt;Orbitz&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://flightcaster.com"&gt;Flightcaster&lt;/a&gt; (much of it in Clojure, now acquired)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Sat, 10 Sep 2016 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Programming in Lisp is a different kind of programming. Some things seem similar to your daily imperative treadmill, but mostly it’s different. There’s a different lexicon of terms, REPL-driven (or rather, -dominated) programming, there’s immutability, a really different type of (par)editing, a higher level of conciseness, a naturalness to using HoFs, a leaning on a small set of primitives, recursion as the norm, and so on. It’s worth gaining some proficiency with a Lisp, if anything, to change the way you think about programming. In this post I explore the Lisp landscape, and try to convince you to get in on the Racket, for edification, fun, and even profit. Lisp Engines Lisp is embedded in a lot of places. Despite Lua being often recognized as being The Embeddable Language, surprisingly many tools are programmable in Lisp. Some examples include: Gimp, Guix, Emacs, AutoCAD, LilyPond, GnuCash, Festival There are several Lisps designed especially for embedding, such as Chibi-scheme, PicoLisp, TinyScheme, and Hedgehog. BTW, I don’t discredit Vim for not having an embedded Lisp. I see most of Vim (even VimL) as a very special DSL. Even with Lisp, you just can’t get as concise as Vim commands. Scheme learning resources Books Structure and Interpretation of Computer Programs(SICP) The Little Schemer (TLS) Simply Scheme: Introducing CS (SSICS) How to Design Programs (HtDP) The Scheme Programming Language (TSPL4) Realm of Racket (RoR) Programming Languages: Application and Interpretation (PLAI) Some of those are seminal classics that can teach you how to program like almost no other book. Notice that bent towards Scheme. That’s the beauty of Racket: decades of academic knowledge still applicable to a modern language. Most of those books available for free in web form. If you want to get into Artificial Intelligence (AI), you’ll surely spend some time in Lisp. Web A few invaluable web resources are: The Racket Guide; extensive Racket on Rosetta Code; a top language Racket on “Learn X in Y minutes”; brief feature/language overview Videos Randall Schwartz intro on Twit Lightweight Racket installs everywhere. It has a small footprint and starts up quickly. Very modest student machines can run it without hitting any resource limits. Although the community heavily supports their own IDE, there’s no reason you have to use it. It has some nice graphical-oriented features, but Vim and Emacs are great for editing Racket. Decent REPL Nice little REPL can do completion, and features a vi-mode. Works well with vim-slime. But can you get paid to code in Lisp? Yes. I think the most likely route right now is through Clojure. I loved my couple of years with it, but it’s a little too beastly to be promoting for student adoption. ClojureScript (and Om/Reagent) is also sure to open up more webdev jobs. So why learn Racket? Successful Lisp companies/sites Cognitect Airstash YouPatch (startup) Orbitz Flightcaster (much of it in Clojure, now acquired)</itunes:subtitle><itunes:summary>Programming in Lisp is a different kind of programming. Some things seem similar to your daily imperative treadmill, but mostly it’s different. There’s a different lexicon of terms, REPL-driven (or rather, -dominated) programming, there’s immutability, a really different type of (par)editing, a higher level of conciseness, a naturalness to using HoFs, a leaning on a small set of primitives, recursion as the norm, and so on. It’s worth gaining some proficiency with a Lisp, if anything, to change the way you think about programming. In this post I explore the Lisp landscape, and try to convince you to get in on the Racket, for edification, fun, and even profit. Lisp Engines Lisp is embedded in a lot of places. Despite Lua being often recognized as being The Embeddable Language, surprisingly many tools are programmable in Lisp. Some examples include: Gimp, Guix, Emacs, AutoCAD, LilyPond, GnuCash, Festival There are several Lisps designed especially for embedding, such as Chibi-scheme, PicoLisp, TinyScheme, and Hedgehog. BTW, I don’t discredit Vim for not having an embedded Lisp. I see most of Vim (even VimL) as a very special DSL. Even with Lisp, you just can’t get as concise as Vim commands. Scheme learning resources Books Structure and Interpretation of Computer Programs(SICP) The Little Schemer (TLS) Simply Scheme: Introducing CS (SSICS) How to Design Programs (HtDP) The Scheme Programming Language (TSPL4) Realm of Racket (RoR) Programming Languages: Application and Interpretation (PLAI) Some of those are seminal classics that can teach you how to program like almost no other book. Notice that bent towards Scheme. That’s the beauty of Racket: decades of academic knowledge still applicable to a modern language. Most of those books available for free in web form. If you want to get into Artificial Intelligence (AI), you’ll surely spend some time in Lisp. Web A few invaluable web resources are: The Racket Guide; extensive Racket on Rosetta Code; a top language Racket on “Learn X in Y minutes”; brief feature/language overview Videos Randall Schwartz intro on Twit Lightweight Racket installs everywhere. It has a small footprint and starts up quickly. Very modest student machines can run it without hitting any resource limits. Although the community heavily supports their own IDE, there’s no reason you have to use it. It has some nice graphical-oriented features, but Vim and Emacs are great for editing Racket. Decent REPL Nice little REPL can do completion, and features a vi-mode. Works well with vim-slime. But can you get paid to code in Lisp? Yes. I think the most likely route right now is through Clojure. I loved my couple of years with it, but it’s a little too beastly to be promoting for student adoption. ClojureScript (and Om/Reagent) is also sure to open up more webdev jobs. So why learn Racket? Successful Lisp companies/sites Cognitect Airstash YouPatch (startup) Orbitz Flightcaster (much of it in Clojure, now acquired)</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2016-07-17-why-centos.html
</guid>
<link>
http://micahelliott.com/posts/2016-07-17-why-centos.html
</link>
<title>
CentOS vs the Rest
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;I’ve been hooked on CentOS for servers for a couple years now. We used to use
Ubuntu, but I see several advantages to choosing CentOS over Ubuntu and others.
Here’s why:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;UPDATE 2017:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Smooth updates.&lt;/strong&gt; Since starting all our servers out on CentOS 7.0,
  they&amp;#8217;ve all been cleanly upgraded to 7.3 without any fuss or
  ceremony.  Looked like any other daily update.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Our Consultancies use CentOS.&lt;/strong&gt; We&amp;#8217;ve been in a couple data centers
  that encourage using their supported platforms based on CentOS.  We
  also work with a MySQL team that knows and prefers CentOS to any
  other.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;CentOS (and Fedora) have had Systemd in production releases for over a year.&lt;/strong&gt;
This is probably the biggest reason. Ubuntu is getting it eventually, but CentOS
has had it and it’s working well. You’ll have to adopt it with Linux anyway, so
why not now?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;CentOS is a first-class member of a strong Red Hat family.&lt;/strong&gt; They were
recently acquired by Red Hat and now benefit from lots of company resources.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Vendors will install CentOS for you.&lt;/strong&gt; It was EC2’s default OS for a while
(still?), and is found widely available on other VPSs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;More hardware is certified for Red Hat.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;CentOS releases are good for 10 years.&lt;/strong&gt; If you were totally stuck with not being
able to upgrade a system, this makes for a pretty good life span. Ubuntu LTSs
are &lt;em&gt;only&lt;/em&gt; 5 years. :) So, minor win.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Fedora is a well-tested cutting edge distro and CentOS get the best of its
learnings.&lt;/strong&gt; It’s solid as a desktop, so you can use it for development and have
a pretty consistent environment across your desk and servers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Red Hat/CentOS have a well-defined focus.&lt;/strong&gt; They embrace the fact that they
are a server OS. Compare this to Ubuntu’s focus on touch interfaces, display
managers, phones.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;There are certifications for becoming a (so-called) Red Hat expert.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;There is an upgrade path to RHEL if someone insists upon it.&lt;/strong&gt; Some PHBs will
want to know that they can throw money around to buy “guarantees” about
stability/support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;CentOS is ubiquitous.&lt;/strong&gt; Most cloud VPSs will offer it as an option.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Docker is in production.&lt;/strong&gt; I don’t think Docker is a panacea, but it’s good to
see it’s being well tested in RHEL and CentOS.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Firewalld is new and in.&lt;/strong&gt; It’s not terribly well documented, but it’s really
just a front end to iptables.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;EPEL provides many extra packages.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Docker is a
  &lt;a href="https://blog.docker.com/2013/09/red-hat-and-docker-collaborate/"&gt;major
  focus&lt;/a&gt;
  of Red Hat.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;SELinux is more powerful than AppArmor.&lt;/strong&gt; Though there is a bigger
  learning curve.  See
  &lt;a href="http://serverfault.com/questions/142934/selinux-vs-apparmor-vs-grsecurity"&gt;this comparison&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Arch is very similar.&lt;/strong&gt; Arch is a popular and powerful development Linux OS.
It’s cutting edge, and the AUR is the easiest way to quickly install the widest
variety of tools. Hopping onto a CentOS server from the comforts of your Arch
setup is not much of a leap. Generally, you’ll find the same standard tools on
both.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_shortcomings"&gt;Shortcomings&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Not everything is perfect with CentOS, though. It does not always have the
newest versions of packages you might desire. I end up building my own versions
of Nginx, Redis, Ruby, and others.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The security update story is also a bit lacking. The simplest way I
have found to stay up-to-date on vulnerability patching is to watch
the daily mail list, and email myself every time a server sees
available updates (&lt;code&gt;yum-cron&lt;/code&gt;).  Then I can use Ansible to update the
fleet, and check if any updates will require reboots, though they&amp;#8217;re
rarely needed: a few per year, when kernels or glibc updates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Yum is the package manager and it is in flux, and essentially
&lt;a href="http://dnf.baseurl.org/2015/05/11/yum-is-dead-long-live-dnf/"&gt;pronounced dead&lt;/a&gt;.
Fortunately, dnf appears to have some backward compatibility with yum and should
provide a clean transition.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you’re looking for a broader spectrum of OSs to choose from, particularly for
your desktop, read my article
on &lt;a href="/posts/2015-01-10-choosing-an-os.html"&gt;choosing an OS&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Sun, 17 Jul 2016 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>I’ve been hooked on CentOS for servers for a couple years now. We used to use Ubuntu, but I see several advantages to choosing CentOS over Ubuntu and others. Here’s why: UPDATE 2017: Smooth updates. Since starting all our servers out on CentOS 7.0, they&amp;#8217;ve all been cleanly upgraded to 7.3 without any fuss or ceremony. Looked like any other daily update. Our Consultancies use CentOS. We&amp;#8217;ve been in a couple data centers that encourage using their supported platforms based on CentOS. We also work with a MySQL team that knows and prefers CentOS to any other. CentOS (and Fedora) have had Systemd in production releases for over a year. This is probably the biggest reason. Ubuntu is getting it eventually, but CentOS has had it and it’s working well. You’ll have to adopt it with Linux anyway, so why not now? CentOS is a first-class member of a strong Red Hat family. They were recently acquired by Red Hat and now benefit from lots of company resources. Vendors will install CentOS for you. It was EC2’s default OS for a while (still?), and is found widely available on other VPSs. More hardware is certified for Red Hat. CentOS releases are good for 10 years. If you were totally stuck with not being able to upgrade a system, this makes for a pretty good life span. Ubuntu LTSs are only 5 years. :) So, minor win. Fedora is a well-tested cutting edge distro and CentOS get the best of its learnings. It’s solid as a desktop, so you can use it for development and have a pretty consistent environment across your desk and servers. Red Hat/CentOS have a well-defined focus. They embrace the fact that they are a server OS. Compare this to Ubuntu’s focus on touch interfaces, display managers, phones. There are certifications for becoming a (so-called) Red Hat expert. There is an upgrade path to RHEL if someone insists upon it. Some PHBs will want to know that they can throw money around to buy “guarantees” about stability/support. CentOS is ubiquitous. Most cloud VPSs will offer it as an option. Docker is in production. I don’t think Docker is a panacea, but it’s good to see it’s being well tested in RHEL and CentOS. Firewalld is new and in. It’s not terribly well documented, but it’s really just a front end to iptables. EPEL provides many extra packages. Docker is a major focus of Red Hat. SELinux is more powerful than AppArmor. Though there is a bigger learning curve. See this comparison. Arch is very similar. Arch is a popular and powerful development Linux OS. It’s cutting edge, and the AUR is the easiest way to quickly install the widest variety of tools. Hopping onto a CentOS server from the comforts of your Arch setup is not much of a leap. Generally, you’ll find the same standard tools on both. Shortcomings Not everything is perfect with CentOS, though. It does not always have the newest versions of packages you might desire. I end up building my own versions of Nginx, Redis, Ruby, and others. The security update story is also a bit lacking. The simplest way I have found to stay up-to-date on vulnerability patching is to watch the daily mail list, and email myself every time a server sees available updates (yum-cron). Then I can use Ansible to update the fleet, and check if any updates will require reboots, though they&amp;#8217;re rarely needed: a few per year, when kernels or glibc updates. Yum is the package manager and it is in flux, and essentially pronounced dead. Fortunately, dnf appears to have some backward compatibility with yum and should provide a clean transition. If you’re looking for a broader spectrum of OSs to choose from, particularly for your desktop, read my article on choosing an OS.</itunes:subtitle><itunes:summary>I’ve been hooked on CentOS for servers for a couple years now. We used to use Ubuntu, but I see several advantages to choosing CentOS over Ubuntu and others. Here’s why: UPDATE 2017: Smooth updates. Since starting all our servers out on CentOS 7.0, they&amp;#8217;ve all been cleanly upgraded to 7.3 without any fuss or ceremony. Looked like any other daily update. Our Consultancies use CentOS. We&amp;#8217;ve been in a couple data centers that encourage using their supported platforms based on CentOS. We also work with a MySQL team that knows and prefers CentOS to any other. CentOS (and Fedora) have had Systemd in production releases for over a year. This is probably the biggest reason. Ubuntu is getting it eventually, but CentOS has had it and it’s working well. You’ll have to adopt it with Linux anyway, so why not now? CentOS is a first-class member of a strong Red Hat family. They were recently acquired by Red Hat and now benefit from lots of company resources. Vendors will install CentOS for you. It was EC2’s default OS for a while (still?), and is found widely available on other VPSs. More hardware is certified for Red Hat. CentOS releases are good for 10 years. If you were totally stuck with not being able to upgrade a system, this makes for a pretty good life span. Ubuntu LTSs are only 5 years. :) So, minor win. Fedora is a well-tested cutting edge distro and CentOS get the best of its learnings. It’s solid as a desktop, so you can use it for development and have a pretty consistent environment across your desk and servers. Red Hat/CentOS have a well-defined focus. They embrace the fact that they are a server OS. Compare this to Ubuntu’s focus on touch interfaces, display managers, phones. There are certifications for becoming a (so-called) Red Hat expert. There is an upgrade path to RHEL if someone insists upon it. Some PHBs will want to know that they can throw money around to buy “guarantees” about stability/support. CentOS is ubiquitous. Most cloud VPSs will offer it as an option. Docker is in production. I don’t think Docker is a panacea, but it’s good to see it’s being well tested in RHEL and CentOS. Firewalld is new and in. It’s not terribly well documented, but it’s really just a front end to iptables. EPEL provides many extra packages. Docker is a major focus of Red Hat. SELinux is more powerful than AppArmor. Though there is a bigger learning curve. See this comparison. Arch is very similar. Arch is a popular and powerful development Linux OS. It’s cutting edge, and the AUR is the easiest way to quickly install the widest variety of tools. Hopping onto a CentOS server from the comforts of your Arch setup is not much of a leap. Generally, you’ll find the same standard tools on both. Shortcomings Not everything is perfect with CentOS, though. It does not always have the newest versions of packages you might desire. I end up building my own versions of Nginx, Redis, Ruby, and others. The security update story is also a bit lacking. The simplest way I have found to stay up-to-date on vulnerability patching is to watch the daily mail list, and email myself every time a server sees available updates (yum-cron). Then I can use Ansible to update the fleet, and check if any updates will require reboots, though they&amp;#8217;re rarely needed: a few per year, when kernels or glibc updates. Yum is the package manager and it is in flux, and essentially pronounced dead. Fortunately, dnf appears to have some backward compatibility with yum and should provide a clean transition. If you’re looking for a broader spectrum of OSs to choose from, particularly for your desktop, read my article on choosing an OS.</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2016-04-26-emacs-hackers.html
</guid>
<link>
http://micahelliott.com/posts/2016-04-26-emacs-hackers.html
</link>
<title>
Who Uses Emacs?
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;It has been a difficult decision to consider moving to Emacs. Besides
discovering that it had some superpowers that Vim lacked, I had a
niggling feeling that most of my programming heroes were already using
Emacs.  So I did some digging around to see who were the luminaries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The digging turned up that the following all use Emacs.  (Sorry for
not recording many references.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_language_creators"&gt;Language Creators&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Rich Hickey (Clojure creator)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Joe Armstrong (Erlang creator)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Xavier Leroy (OCaml creator)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Matz (Ruby creator)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Guido van Rossum (GvR, Python creator)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Donald Knuth (TeX, Algo books)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Michael Widenius (MySQL creator)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Guy Steele (creator of many languages)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;James Gosling (Java creator)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Peter Norvig&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_miscellaneous_celebrities"&gt;Miscellaneous Celebrities&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Eric Raymond (ESR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Richard Stallman (RMS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jamie Zawinsky (JWZ)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Linux Torvalds (Creator of Linux, uses micro-emacs)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Neal Stephenson (author)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Steve Yegge&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avdi Grimm (and other Ruby Rogues)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vernor Vinge&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;More mentioned: Norvig, Andreesen, Guy Steele, Martin Fowler, Knuth, Julian Assange&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And, 45% of Clojure devs use Emacs, accoring to the recent survey.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_who_surprisingly_does_not_use_emacs"&gt;Who (surprisingly) does not use Emacs&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Paul Graham (lisp hacker)&amp;#8201;&amp;#8212;&amp;#8201;vim&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Larry Wall&amp;#8201;&amp;#8212;&amp;#8201;vim&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Rob Pike&amp;#8201;&amp;#8212;&amp;#8201;acme&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Brendan Eich&amp;#8201;&amp;#8212;&amp;#8201;vim&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Tue, 26 Apr 2016 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>It has been a difficult decision to consider moving to Emacs. Besides discovering that it had some superpowers that Vim lacked, I had a niggling feeling that most of my programming heroes were already using Emacs. So I did some digging around to see who were the luminaries. The digging turned up that the following all use Emacs. (Sorry for not recording many references.) Language Creators Rich Hickey (Clojure creator) Joe Armstrong (Erlang creator) Xavier Leroy (OCaml creator) Matz (Ruby creator) Guido van Rossum (GvR, Python creator) Donald Knuth (TeX, Algo books) Michael Widenius (MySQL creator) Guy Steele (creator of many languages) James Gosling (Java creator) Peter Norvig Miscellaneous Celebrities Eric Raymond (ESR) Richard Stallman (RMS) Jamie Zawinsky (JWZ) Linux Torvalds (Creator of Linux, uses micro-emacs) Neal Stephenson (author) Steve Yegge Avdi Grimm (and other Ruby Rogues) Vernor Vinge More mentioned: Norvig, Andreesen, Guy Steele, Martin Fowler, Knuth, Julian Assange And, 45% of Clojure devs use Emacs, accoring to the recent survey. Who (surprisingly) does not use Emacs Paul Graham (lisp hacker)&amp;#8201;&amp;#8212;&amp;#8201;vim Larry Wall&amp;#8201;&amp;#8212;&amp;#8201;vim Rob Pike&amp;#8201;&amp;#8212;&amp;#8201;acme Brendan Eich&amp;#8201;&amp;#8212;&amp;#8201;vim</itunes:subtitle><itunes:summary>It has been a difficult decision to consider moving to Emacs. Besides discovering that it had some superpowers that Vim lacked, I had a niggling feeling that most of my programming heroes were already using Emacs. So I did some digging around to see who were the luminaries. The digging turned up that the following all use Emacs. (Sorry for not recording many references.) Language Creators Rich Hickey (Clojure creator) Joe Armstrong (Erlang creator) Xavier Leroy (OCaml creator) Matz (Ruby creator) Guido van Rossum (GvR, Python creator) Donald Knuth (TeX, Algo books) Michael Widenius (MySQL creator) Guy Steele (creator of many languages) James Gosling (Java creator) Peter Norvig Miscellaneous Celebrities Eric Raymond (ESR) Richard Stallman (RMS) Jamie Zawinsky (JWZ) Linux Torvalds (Creator of Linux, uses micro-emacs) Neal Stephenson (author) Steve Yegge Avdi Grimm (and other Ruby Rogues) Vernor Vinge More mentioned: Norvig, Andreesen, Guy Steele, Martin Fowler, Knuth, Julian Assange And, 45% of Clojure devs use Emacs, accoring to the recent survey. Who (surprisingly) does not use Emacs Paul Graham (lisp hacker)&amp;#8201;&amp;#8212;&amp;#8201;vim Larry Wall&amp;#8201;&amp;#8212;&amp;#8201;vim Rob Pike&amp;#8201;&amp;#8212;&amp;#8201;acme Brendan Eich&amp;#8201;&amp;#8212;&amp;#8201;vim</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2016-02-10-the-outage-log.html
</guid>
<link>
http://micahelliott.com/posts/2016-02-10-the-outage-log.html
</link>
<title>
The Outage Log
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;sysadmins&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
“A captain of a ship, no matter his rank, must follow the book.” &lt;em&gt;—Captain James T. Kirk&lt;/em&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I&amp;#8217;ve been keeping an "Outages Log" for the last few years to track
downtime and causes of failures (sometimes they&amp;#8217;re only theories).
This has turned out to be an invaluable record, so I&amp;#8217;ll share the idea
here and encourage you to keep one, too.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The OutagesLog is maintained as a wiki page.  It&amp;#8217;s helpful is spotting
problem patterns, and identifies when something has been neglected.
The goal is to never have the same problem twice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The front-matter is a brainstorm/laundry list of things that can go
(or have gone) wrong.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cloudflare hiccups&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Data center network&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Failing critical batch job&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hardware&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;App bugs (looping retries)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DB swap/backup problem&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Forgetting to restart passengers on deploy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DNS confusion/loss&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bad upgrade rotation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A list of symptoms of each is also helpful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Depending on the number of machines you&amp;#8217;re managing, it might be
feasible to also track system updates and reboots here.  Hopefully
these are done on a consistent schedule across most machines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here is an example set of entries.  The entries are organized by
year.  Each entry contains a date-time-stamp with the number of
minutes down/impacted, followed by diagnosis.  A more detailed
reporting would also contain a link to a fuller description of the
outage and planned remedies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;2014
[Jan 13 18:14] 18m: db network failure; VIP disappeared (link to full report)
[Feb 06 22:44] 2m: Two hiccups. DC acknowledged router issue on their end
[Feb 28 12:24] 3h: Wow, DC breaker trip, fries dbs91 controller. Recovery takes many hours before discovering disk will be too slow. Eventual reboots help, but we have to fail over to Houston.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Wed, 10 Feb 2016 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: sysadmins “A captain of a ship, no matter his rank, must follow the book.” —Captain James T. Kirk I&amp;#8217;ve been keeping an "Outages Log" for the last few years to track downtime and causes of failures (sometimes they&amp;#8217;re only theories). This has turned out to be an invaluable record, so I&amp;#8217;ll share the idea here and encourage you to keep one, too. The OutagesLog is maintained as a wiki page. It&amp;#8217;s helpful is spotting problem patterns, and identifies when something has been neglected. The goal is to never have the same problem twice. The front-matter is a brainstorm/laundry list of things that can go (or have gone) wrong. Cloudflare hiccups Data center network Failing critical batch job Hardware App bugs (looping retries) DB swap/backup problem Forgetting to restart passengers on deploy DNS confusion/loss Bad upgrade rotation A list of symptoms of each is also helpful. Depending on the number of machines you&amp;#8217;re managing, it might be feasible to also track system updates and reboots here. Hopefully these are done on a consistent schedule across most machines. Here is an example set of entries. The entries are organized by year. Each entry contains a date-time-stamp with the number of minutes down/impacted, followed by diagnosis. A more detailed reporting would also contain a link to a fuller description of the outage and planned remedies. 2014 [Jan 13 18:14] 18m: db network failure; VIP disappeared (link to full report) [Feb 06 22:44] 2m: Two hiccups. DC acknowledged router issue on their end [Feb 28 12:24] 3h: Wow, DC breaker trip, fries dbs91 controller. Recovery takes many hours before discovering disk will be too slow. Eventual reboots help, but we have to fail over to Houston.</itunes:subtitle><itunes:summary>Audience: sysadmins “A captain of a ship, no matter his rank, must follow the book.” —Captain James T. Kirk I&amp;#8217;ve been keeping an "Outages Log" for the last few years to track downtime and causes of failures (sometimes they&amp;#8217;re only theories). This has turned out to be an invaluable record, so I&amp;#8217;ll share the idea here and encourage you to keep one, too. The OutagesLog is maintained as a wiki page. It&amp;#8217;s helpful is spotting problem patterns, and identifies when something has been neglected. The goal is to never have the same problem twice. The front-matter is a brainstorm/laundry list of things that can go (or have gone) wrong. Cloudflare hiccups Data center network Failing critical batch job Hardware App bugs (looping retries) DB swap/backup problem Forgetting to restart passengers on deploy DNS confusion/loss Bad upgrade rotation A list of symptoms of each is also helpful. Depending on the number of machines you&amp;#8217;re managing, it might be feasible to also track system updates and reboots here. Hopefully these are done on a consistent schedule across most machines. Here is an example set of entries. The entries are organized by year. Each entry contains a date-time-stamp with the number of minutes down/impacted, followed by diagnosis. A more detailed reporting would also contain a link to a fuller description of the outage and planned remedies. 2014 [Jan 13 18:14] 18m: db network failure; VIP disappeared (link to full report) [Feb 06 22:44] 2m: Two hiccups. DC acknowledged router issue on their end [Feb 28 12:24] 3h: Wow, DC breaker trip, fries dbs91 controller. Recovery takes many hours before discovering disk will be too slow. Eventual reboots help, but we have to fail over to Houston.</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2016-01-20-why-bare-metal.html
</guid>
<link>
http://micahelliott.com/posts/2016-01-20-why-bare-metal.html
</link>
<title>
Bare Metal vs The Cloud
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;devops&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
Only you can decide if the cloud is flipping you the bird.
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/img/cloud/title.jpg" alt="title" width="600"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Most of us start our fledgling apps in the cloud, on EC2 or Linode or
DigitalOcean or ASmallOrange or whatever. With Membean, we’ve bounced around
on all of those. But we eventually ended up in real data centers, for a lot of
reasons.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_tl_dr"&gt;TL;DR&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’ve had servers spread around several VPS providers for the last
eight years.  The last four years have been mostly colocated on
hardware I’ve purchased, and that HW has served us well. Granted, a
lot of my time (and thus salary) is spent on taking care of machines,
but it’s not much more (if any) than we’d be spending if we had stuck
fully to the cloud. I think it’s a lot less.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_cases_for_the_vps_cloud"&gt;Cases for the VPS Cloud&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You’ll need multiple servers before long, for scale and redundancy. So, early
on, two little VPSs are much cheaper than two physical servers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It’s really easy to create nodes through a web UI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t need to know much about data centers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In some cases, theoretically cheaper if you spin down servers, and your
off-peak hours are long. I believe the &lt;em&gt;spin-down-to-save&lt;/em&gt; model is unique
to EC2. A Droplet incurs the same price whether running or powered off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Backups are simple. Just check a box when you create your Droplet, and you’re
probably safe enough.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_war_stories_beware_the_cloud"&gt;War Stories (Beware the Cloud)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Linode was down for days.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I have seen more than a few emails from DO and Linode saying that a node has
been rebooted due to an unknown issue. If these had been production systems,
OUCH!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There are times where CPU has spiked for no apparent reason.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;CPU availability may be unpredictable.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_vmware_lock_in"&gt;VMWare Lock-in&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’ve stayed away from virtualization, particularly proprietary offerings.
Running servers is expensive enough as it is.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I don’t see what the big gains are from virtualization for SMBs. If hardware is
going to fail, it’ll wipe out the whole machine and all its virtualized nodes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It’s yet another thing to understand and monitor. Plus, there are potentially
some performance costs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_cost"&gt;Cost&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’m not convinced that paying 10x for a RHEL licensed Megacorp Certified
System gets you much more than a more standard off-brand setup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can find beefy servers for as low as $1500.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_performance"&gt;Performance&lt;/h2&gt;
&lt;div class="sectionbody"&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_latency"&gt;Latency&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Nodes won’t be right next to each other. Maybe there are tactics to control
this, but I haven’t found many yet.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_risks"&gt;Risks&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;DDoS is always a concern, whether Cloud or Data Center. After moving to a DC, we
got hit hard enough by a DDoS that it took down the whole data center. That was
the worst outage we’ve had, and resulted in 8 hours of downtime. We never
found out why we were targeted, but learned some good lessons from it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I actually think we’re less likely to be impacted by DDoS in a DC. It seems to
be the bigger players, like Linode and Amazon who get targeted. I hope DO is
prepared for what happened to Linode. The DCs we’ve been in have few
high-profile customers in them. So a whole network outage seems less likely.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_common_objections"&gt;Common Objections&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;“The cloud gives me snapshots so I can just build up one server and then
duplicate them from the single good snapshot.”&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You’ll still want to get your setup into a configuration management system, like
Ansible or Chef or Puppet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;“The cloud takes care of monitoring for me.”&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You’ll still need to come up with monitoring solutions, like monit, monitorix,
nagios, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;“I’m not comfortable running servers myself.”&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;That’s a valid concern, but you need to learn a lot about them anyway, even if
you’re in the cloud. The cloud does kind of save you from dealing with HW
failures, but the still certainly happen in the cloud.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And, failures are often not something you have to handle all on your own. The DC
folks are very knowledgable about networking issues, and swapping out failed
disks is something they do a lot of.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;“But I don’t live anywhere near a good data center.”&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We started out in a nearby DC thinking that we’d want to get inside when horror
struck. That lasted a year before we looked outside to find a better DC
thousands of miles away. It’s possible to do everything remotely. &lt;em&gt;Remote hands&lt;/em&gt;
are pretty cheap, usually around $25/hr.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’ve had them replace disks, rebuild machines, install OSs, reconfigure RAIDs,
figure out my network blunderings, and much more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;They’ve even tuned network routes so that our cross-DC transfers are much
improved.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_downsides"&gt;Downsides&lt;/h2&gt;
&lt;div class="sectionbody"&gt;

&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Wed, 20 Jan 2016 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: devops Only you can decide if the cloud is flipping you the bird. Most of us start our fledgling apps in the cloud, on EC2 or Linode or DigitalOcean or ASmallOrange or whatever. With Membean, we’ve bounced around on all of those. But we eventually ended up in real data centers, for a lot of reasons. TL;DR I’ve had servers spread around several VPS providers for the last eight years. The last four years have been mostly colocated on hardware I’ve purchased, and that HW has served us well. Granted, a lot of my time (and thus salary) is spent on taking care of machines, but it’s not much more (if any) than we’d be spending if we had stuck fully to the cloud. I think it’s a lot less. Cases for the VPS Cloud You’ll need multiple servers before long, for scale and redundancy. So, early on, two little VPSs are much cheaper than two physical servers. It’s really easy to create nodes through a web UI. Don’t need to know much about data centers. In some cases, theoretically cheaper if you spin down servers, and your off-peak hours are long. I believe the spin-down-to-save model is unique to EC2. A Droplet incurs the same price whether running or powered off. Backups are simple. Just check a box when you create your Droplet, and you’re probably safe enough. War Stories (Beware the Cloud) Linode was down for days. I have seen more than a few emails from DO and Linode saying that a node has been rebooted due to an unknown issue. If these had been production systems, OUCH! There are times where CPU has spiked for no apparent reason. CPU availability may be unpredictable. VMWare Lock-in I’ve stayed away from virtualization, particularly proprietary offerings. Running servers is expensive enough as it is. I don’t see what the big gains are from virtualization for SMBs. If hardware is going to fail, it’ll wipe out the whole machine and all its virtualized nodes. It’s yet another thing to understand and monitor. Plus, there are potentially some performance costs. Cost I’m not convinced that paying 10x for a RHEL licensed Megacorp Certified System gets you much more than a more standard off-brand setup. You can find beefy servers for as low as $1500. Performance Latency Nodes won’t be right next to each other. Maybe there are tactics to control this, but I haven’t found many yet. Risks DDoS is always a concern, whether Cloud or Data Center. After moving to a DC, we got hit hard enough by a DDoS that it took down the whole data center. That was the worst outage we’ve had, and resulted in 8 hours of downtime. We never found out why we were targeted, but learned some good lessons from it. I actually think we’re less likely to be impacted by DDoS in a DC. It seems to be the bigger players, like Linode and Amazon who get targeted. I hope DO is prepared for what happened to Linode. The DCs we’ve been in have few high-profile customers in them. So a whole network outage seems less likely. Common Objections “The cloud gives me snapshots so I can just build up one server and then duplicate them from the single good snapshot.” You’ll still want to get your setup into a configuration management system, like Ansible or Chef or Puppet. “The cloud takes care of monitoring for me.” You’ll still need to come up with monitoring solutions, like monit, monitorix, nagios, etc. “I’m not comfortable running servers myself.” That’s a valid concern, but you need to learn a lot about them anyway, even if you’re in the cloud. The cloud does kind of save you from dealing with HW failures, but the still certainly happen in the cloud. And, failures are often not something you have to handle all on your own. The DC folks are very knowledgable about networking issues, and swapping out failed disks is something they do a lot of. “But I don’t live anywhere near a good data center.” We started out in a nearby DC thinking that we’d want to get inside when horror struck. That lasted a year before we looked outside to find a better DC thousands of miles away. It’s possible to do everything remotely. Remote hands are pretty cheap, usually around $25/hr. I’ve had them replace disks, rebuild machines, install OSs, reconfigure RAIDs, figure out my network blunderings, and much more. They’ve even tuned network routes so that our cross-DC transfers are much improved. Downsides</itunes:subtitle><itunes:summary>Audience: devops Only you can decide if the cloud is flipping you the bird. Most of us start our fledgling apps in the cloud, on EC2 or Linode or DigitalOcean or ASmallOrange or whatever. With Membean, we’ve bounced around on all of those. But we eventually ended up in real data centers, for a lot of reasons. TL;DR I’ve had servers spread around several VPS providers for the last eight years. The last four years have been mostly colocated on hardware I’ve purchased, and that HW has served us well. Granted, a lot of my time (and thus salary) is spent on taking care of machines, but it’s not much more (if any) than we’d be spending if we had stuck fully to the cloud. I think it’s a lot less. Cases for the VPS Cloud You’ll need multiple servers before long, for scale and redundancy. So, early on, two little VPSs are much cheaper than two physical servers. It’s really easy to create nodes through a web UI. Don’t need to know much about data centers. In some cases, theoretically cheaper if you spin down servers, and your off-peak hours are long. I believe the spin-down-to-save model is unique to EC2. A Droplet incurs the same price whether running or powered off. Backups are simple. Just check a box when you create your Droplet, and you’re probably safe enough. War Stories (Beware the Cloud) Linode was down for days. I have seen more than a few emails from DO and Linode saying that a node has been rebooted due to an unknown issue. If these had been production systems, OUCH! There are times where CPU has spiked for no apparent reason. CPU availability may be unpredictable. VMWare Lock-in I’ve stayed away from virtualization, particularly proprietary offerings. Running servers is expensive enough as it is. I don’t see what the big gains are from virtualization for SMBs. If hardware is going to fail, it’ll wipe out the whole machine and all its virtualized nodes. It’s yet another thing to understand and monitor. Plus, there are potentially some performance costs. Cost I’m not convinced that paying 10x for a RHEL licensed Megacorp Certified System gets you much more than a more standard off-brand setup. You can find beefy servers for as low as $1500. Performance Latency Nodes won’t be right next to each other. Maybe there are tactics to control this, but I haven’t found many yet. Risks DDoS is always a concern, whether Cloud or Data Center. After moving to a DC, we got hit hard enough by a DDoS that it took down the whole data center. That was the worst outage we’ve had, and resulted in 8 hours of downtime. We never found out why we were targeted, but learned some good lessons from it. I actually think we’re less likely to be impacted by DDoS in a DC. It seems to be the bigger players, like Linode and Amazon who get targeted. I hope DO is prepared for what happened to Linode. The DCs we’ve been in have few high-profile customers in them. So a whole network outage seems less likely. Common Objections “The cloud gives me snapshots so I can just build up one server and then duplicate them from the single good snapshot.” You’ll still want to get your setup into a configuration management system, like Ansible or Chef or Puppet. “The cloud takes care of monitoring for me.” You’ll still need to come up with monitoring solutions, like monit, monitorix, nagios, etc. “I’m not comfortable running servers myself.” That’s a valid concern, but you need to learn a lot about them anyway, even if you’re in the cloud. The cloud does kind of save you from dealing with HW failures, but the still certainly happen in the cloud. And, failures are often not something you have to handle all on your own. The DC folks are very knowledgable about networking issues, and swapping out failed disks is something they do a lot of. “But I don’t live anywhere near a good data center.” We started out in a nearby DC thinking that we’d want to get inside when horror struck. That lasted a year before we looked outside to find a better DC thousands of miles away. It’s possible to do everything remotely. Remote hands are pretty cheap, usually around $25/hr. I’ve had them replace disks, rebuild machines, install OSs, reconfigure RAIDs, figure out my network blunderings, and much more. They’ve even tuned network routes so that our cross-DC transfers are much improved. Downsides</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2016-01-16-how-to-structure-zshrc.html
</guid>
<link>
http://micahelliott.com/posts/2016-01-16-how-to-structure-zshrc.html
</link>
<title>
How to Structure a .zshrc
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;intermediate&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/img/zshrc/organizized.jpg" alt="organizized" width="600"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I often recommend that people “stick this-or-that in their &lt;code&gt;.zshrc&lt;/code&gt;.” But what I
really mean is to “put this-or-that into &lt;em&gt;the appropriate subfile that makes up a
bit of their grander Zsh configuration&lt;/em&gt;.” There are some great benefits to
piecing apart a single monolithic &lt;code&gt;.zshrc&lt;/code&gt; file into individual files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;At the top level, you still have your &lt;code&gt;~/.zshrc&lt;/code&gt;, but it’s mostly just responsible
for `source`ing the meatier files.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It looks something like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="highlight"&gt;&lt;code class="language-bash" data-lang="bash"&gt;# Some envars
my_fname=micah
my_shdir=~/config/shell
my_configs=(
    envars.sh
    actions.sh  # super fast
    options.zsh # potential to be slow
    aliases.sh
    aliases.zsh
    functions.sh
)
my_plugins=( $my_shdir/zsh/plugins/*.zsh )

# Time the stuff.
integer t0=$(date '+%s')

# Source all the Zsh-specific and sh-generic files.
for f in $my_configs; do
    ##print starting $f
    [[ -f $my_shdir/$f ]] &amp;amp;&amp;amp; . $my_shdir/$f
    ##print finished $f
done

# Plugin stuff omitted
# Site-specific stuff omitted

function {
    local -i t1 startup
    t1=$(date '+%s')
    startup=$(( t1 - t0 ))
    [[ $startup -gt 1 ]] &amp;amp;&amp;amp; print "Hmm, poor shell startup time: $startup"
    ##print "startup time: $startup"
}
unset t0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This is helpful in that it:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;keeps things well organized&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;enables reloading of any particular piece&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The key commands I use to change, say, a single alias or function in a config
file are aliases themselves:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="highlight"&gt;&lt;code class="language-bash" data-lang="bash"&gt;alias re-env=". $my_shdir/envars.sh"
alias re-funcs=". $my_shdir/functions.sh"
re-aliases() { . $my_shdir/aliases.sh; . $my_shdir/aliases.zsh }
alias re-opts=". $my_shdir/options.zsh"

# Bonus
alias a=alias
alias fn='declare -f'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you are simply re-&lt;code&gt;source&lt;/code&gt;-ing a giant &lt;code&gt;.zshrc&lt;/code&gt;, you’re possibly overriding
or double-setting environment variables, or undoing setting you’ve made manually
in your shell session.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I recommend you come up with your own, mostly from scratch, but
&lt;a href="https://github.com/MicahElliott/dotfiles/blob/master/config/zshrc"&gt;here’s mine&lt;/a&gt;
if you’re curious.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="http://stackoverflow.com/a/30791711/326516"&gt;This StackOverflow answer&lt;/a&gt; has more
details about how to profile your shell start-up time.&lt;/p&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Sat, 16 Jan 2016 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: intermediate I often recommend that people “stick this-or-that in their .zshrc.” But what I really mean is to “put this-or-that into the appropriate subfile that makes up a bit of their grander Zsh configuration.” There are some great benefits to piecing apart a single monolithic .zshrc file into individual files. At the top level, you still have your ~/.zshrc, but it’s mostly just responsible for `source`ing the meatier files. It looks something like: # Some envars my_fname=micah my_shdir=~/config/shell my_configs=( envars.sh actions.sh # super fast options.zsh # potential to be slow aliases.sh aliases.zsh functions.sh ) my_plugins=( $my_shdir/zsh/plugins/*.zsh ) # Time the stuff. integer t0=$(date '+%s') # Source all the Zsh-specific and sh-generic files. for f in $my_configs; do ##print starting $f [[ -f $my_shdir/$f ]] &amp;amp;&amp;amp; . $my_shdir/$f ##print finished $f done # Plugin stuff omitted # Site-specific stuff omitted function { local -i t1 startup t1=$(date '+%s') startup=$(( t1 - t0 )) [[ $startup -gt 1 ]] &amp;amp;&amp;amp; print "Hmm, poor shell startup time: $startup" ##print "startup time: $startup" } unset t0 This is helpful in that it: keeps things well organized enables reloading of any particular piece The key commands I use to change, say, a single alias or function in a config file are aliases themselves: alias re-env=". $my_shdir/envars.sh" alias re-funcs=". $my_shdir/functions.sh" re-aliases() { . $my_shdir/aliases.sh; . $my_shdir/aliases.zsh } alias re-opts=". $my_shdir/options.zsh" # Bonus alias a=alias alias fn='declare -f' If you are simply re-source-ing a giant .zshrc, you’re possibly overriding or double-setting environment variables, or undoing setting you’ve made manually in your shell session. I recommend you come up with your own, mostly from scratch, but here’s mine if you’re curious. This StackOverflow answer has more details about how to profile your shell start-up time.</itunes:subtitle><itunes:summary>Audience: intermediate I often recommend that people “stick this-or-that in their .zshrc.” But what I really mean is to “put this-or-that into the appropriate subfile that makes up a bit of their grander Zsh configuration.” There are some great benefits to piecing apart a single monolithic .zshrc file into individual files. At the top level, you still have your ~/.zshrc, but it’s mostly just responsible for `source`ing the meatier files. It looks something like: # Some envars my_fname=micah my_shdir=~/config/shell my_configs=( envars.sh actions.sh # super fast options.zsh # potential to be slow aliases.sh aliases.zsh functions.sh ) my_plugins=( $my_shdir/zsh/plugins/*.zsh ) # Time the stuff. integer t0=$(date '+%s') # Source all the Zsh-specific and sh-generic files. for f in $my_configs; do ##print starting $f [[ -f $my_shdir/$f ]] &amp;amp;&amp;amp; . $my_shdir/$f ##print finished $f done # Plugin stuff omitted # Site-specific stuff omitted function { local -i t1 startup t1=$(date '+%s') startup=$(( t1 - t0 )) [[ $startup -gt 1 ]] &amp;amp;&amp;amp; print "Hmm, poor shell startup time: $startup" ##print "startup time: $startup" } unset t0 This is helpful in that it: keeps things well organized enables reloading of any particular piece The key commands I use to change, say, a single alias or function in a config file are aliases themselves: alias re-env=". $my_shdir/envars.sh" alias re-funcs=". $my_shdir/functions.sh" re-aliases() { . $my_shdir/aliases.sh; . $my_shdir/aliases.zsh } alias re-opts=". $my_shdir/options.zsh" # Bonus alias a=alias alias fn='declare -f' If you are simply re-source-ing a giant .zshrc, you’re possibly overriding or double-setting environment variables, or undoing setting you’ve made manually in your shell session. I recommend you come up with your own, mostly from scratch, but here’s mine if you’re curious. This StackOverflow answer has more details about how to profile your shell start-up time.</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2016-01-14-the-14-digit-timestamp.html
</guid>
<link>
http://micahelliott.com/posts/2016-01-14-the-14-digit-timestamp.html
</link>
<title>
The 14-Digit Timestamp, et al
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;anyone&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The so-called “14-digit timestamp” is turning up in more and more places. For
those unfamiliar, it takes the form of:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;YYYYMMDDhhmmss&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’ve seen it recently in &lt;a href="https://github.com/yogthos/migratus"&gt;Migratus&lt;/a&gt; and
Rails/Cap deploys (&lt;code&gt;current&lt;/code&gt; symlink), and it’s been used widely by MySQL.
They’re pretty handy for setting to-the-second precision for ordering of things,
like database migrations. And, they’re fairly human-parsable.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;At the time of this writing, the 14-digit time is &lt;code&gt;20160114180301&lt;/code&gt;. If you find
that hard to eye-parse, here’s a (really ugly) shell function to help:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;dt14p() { sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:\5:\6/' &amp;lt;&amp;lt;&amp;lt; $1 }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;% dt14p 20160114184117
2016-01-14 18:41:17&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This enables &lt;code&gt;date&lt;/code&gt; (and your eyes) to parse it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Something I see missed on occasion is the use of UTC on such stamps. That seems
pretty important if you’re using these for ordering, and have a time
zone-distributed team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;14s are not to be confused with the 10-digit epoch-second-stamp, or
&lt;a href="https://docs.mongodb.org/manual/reference/bson-types/#document-bson-type-date"&gt;MongoDB’s&lt;/a&gt;
similar 64-bit 13-digit stamp (1452758412345).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You might also find &lt;a href="https://en.wikipedia.org/wiki/ISO_week_date"&gt;weekstamps&lt;/a&gt;
useful for writing weekly reports and other organization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_generating_a_14_digit_stamp"&gt;Generating a 14-digit stamp&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;date --utc +%Y%m%d%H%M%S&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Why not make it an alias?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;alias dt14='date --utc +%Y%m%d%H%M%S'&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And use it often:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;mkdir `dt14`-something&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;(I usually find the 8-digit datestamp &lt;code&gt;dt8&lt;/code&gt; to be sufficient for directory
names.)&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;While we’re at it, here are some other useful stamping aliases. I use the &lt;code&gt;dt&lt;/code&gt;
prefix to make them easy to both remember and tab-complete. Some of these I use
every day. Put them in your &lt;a href="/posts/2016-01-16-how-to-structure-zshrc.html"&gt;.zshrc&lt;/a&gt;
and enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="highlight"&gt;&lt;code class="language-bash" data-lang="bash"&gt;alias dt='date +%Y%m%d'    # frequent 8-digit stamp: 20160114
alias dt8=dt
alias day=dt
alias dts='date +%s'       # seconds since epoch: 1452795263
alias dte=dts
alias dt10=dts
alias dtep='print "use this to parse: date -d @123..."'  # parse the epoch
alias dtp='date -d '       # parse
alias dttm='date --utc +%Y%m%d%H%M%S'  # datetime: 20160114192940
alias dt14=dttm
alias dt13=dtb
alias dto='date +%Y%j'     # ordinal date: 2016016 (16th day of year)
alias dt7=dto
# https://en.wikipedia.org/wiki/ISO_week_date
alias dtwk='date +W%V'     # week date: W02
alias dtyrwk='date +%GW%V' # year week date: 2016W02
# ISO 8601
alias dtw='date +%G-W%V-%' # year week: 2016-W02-4
alias dti='date -I'        # ISO-8601: 2016-01-14
alias dt-=dti
alias dti='date -u +%Y%m%dT%H%M%S'        # 20160111T173110Z
alias dti-='date -u +%Y-%m-%dT%H:%M:%SZ'  # 2016-01-11T17:31:10Z
alias dti0='date -u -Iseconds'            # 2016-01-11T17:31:10+0000
alias dto-='date +%Y-%j'                  # ordinal date: 2016-016
alias dtb="date-iso2bson.rb &amp;lt;&amp;lt;&amp;lt;\"'`dt-`'\""  # for mongo bson&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;(Note: this is using &lt;code&gt;date&lt;/code&gt; from GNU Coreutils. Yours may be different if you’re
not on Linux.)&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Thu, 14 Jan 2016 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: anyone The so-called “14-digit timestamp” is turning up in more and more places. For those unfamiliar, it takes the form of: YYYYMMDDhhmmss I’ve seen it recently in Migratus and Rails/Cap deploys (current symlink), and it’s been used widely by MySQL. They’re pretty handy for setting to-the-second precision for ordering of things, like database migrations. And, they’re fairly human-parsable. At the time of this writing, the 14-digit time is 20160114180301. If you find that hard to eye-parse, here’s a (really ugly) shell function to help: dt14p() { sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:\5:\6/' &amp;lt;&amp;lt;&amp;lt; $1 } % dt14p 20160114184117 2016-01-14 18:41:17 This enables date (and your eyes) to parse it. Something I see missed on occasion is the use of UTC on such stamps. That seems pretty important if you’re using these for ordering, and have a time zone-distributed team. 14s are not to be confused with the 10-digit epoch-second-stamp, or MongoDB’s similar 64-bit 13-digit stamp (1452758412345). You might also find weekstamps useful for writing weekly reports and other organization. Generating a 14-digit stamp date --utc +%Y%m%d%H%M%S Why not make it an alias? alias dt14='date --utc +%Y%m%d%H%M%S' And use it often: mkdir `dt14`-something (I usually find the 8-digit datestamp dt8 to be sufficient for directory names.) While we’re at it, here are some other useful stamping aliases. I use the dt prefix to make them easy to both remember and tab-complete. Some of these I use every day. Put them in your .zshrc and enjoy! alias dt='date +%Y%m%d' # frequent 8-digit stamp: 20160114 alias dt8=dt alias day=dt alias dts='date +%s' # seconds since epoch: 1452795263 alias dte=dts alias dt10=dts alias dtep='print "use this to parse: date -d @123..."' # parse the epoch alias dtp='date -d ' # parse alias dttm='date --utc +%Y%m%d%H%M%S' # datetime: 20160114192940 alias dt14=dttm alias dt13=dtb alias dto='date +%Y%j' # ordinal date: 2016016 (16th day of year) alias dt7=dto # https://en.wikipedia.org/wiki/ISO_week_date alias dtwk='date +W%V' # week date: W02 alias dtyrwk='date +%GW%V' # year week date: 2016W02 # ISO 8601 alias dtw='date +%G-W%V-%' # year week: 2016-W02-4 alias dti='date -I' # ISO-8601: 2016-01-14 alias dt-=dti alias dti='date -u +%Y%m%dT%H%M%S' # 20160111T173110Z alias dti-='date -u +%Y-%m-%dT%H:%M:%SZ' # 2016-01-11T17:31:10Z alias dti0='date -u -Iseconds' # 2016-01-11T17:31:10+0000 alias dto-='date +%Y-%j' # ordinal date: 2016-016 alias dtb="date-iso2bson.rb &amp;lt;&amp;lt;&amp;lt;\"'`dt-`'\"" # for mongo bson (Note: this is using date from GNU Coreutils. Yours may be different if you’re not on Linux.)</itunes:subtitle><itunes:summary>Audience: anyone The so-called “14-digit timestamp” is turning up in more and more places. For those unfamiliar, it takes the form of: YYYYMMDDhhmmss I’ve seen it recently in Migratus and Rails/Cap deploys (current symlink), and it’s been used widely by MySQL. They’re pretty handy for setting to-the-second precision for ordering of things, like database migrations. And, they’re fairly human-parsable. At the time of this writing, the 14-digit time is 20160114180301. If you find that hard to eye-parse, here’s a (really ugly) shell function to help: dt14p() { sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:\5:\6/' &amp;lt;&amp;lt;&amp;lt; $1 } % dt14p 20160114184117 2016-01-14 18:41:17 This enables date (and your eyes) to parse it. Something I see missed on occasion is the use of UTC on such stamps. That seems pretty important if you’re using these for ordering, and have a time zone-distributed team. 14s are not to be confused with the 10-digit epoch-second-stamp, or MongoDB’s similar 64-bit 13-digit stamp (1452758412345). You might also find weekstamps useful for writing weekly reports and other organization. Generating a 14-digit stamp date --utc +%Y%m%d%H%M%S Why not make it an alias? alias dt14='date --utc +%Y%m%d%H%M%S' And use it often: mkdir `dt14`-something (I usually find the 8-digit datestamp dt8 to be sufficient for directory names.) While we’re at it, here are some other useful stamping aliases. I use the dt prefix to make them easy to both remember and tab-complete. Some of these I use every day. Put them in your .zshrc and enjoy! alias dt='date +%Y%m%d' # frequent 8-digit stamp: 20160114 alias dt8=dt alias day=dt alias dts='date +%s' # seconds since epoch: 1452795263 alias dte=dts alias dt10=dts alias dtep='print "use this to parse: date -d @123..."' # parse the epoch alias dtp='date -d ' # parse alias dttm='date --utc +%Y%m%d%H%M%S' # datetime: 20160114192940 alias dt14=dttm alias dt13=dtb alias dto='date +%Y%j' # ordinal date: 2016016 (16th day of year) alias dt7=dto # https://en.wikipedia.org/wiki/ISO_week_date alias dtwk='date +W%V' # week date: W02 alias dtyrwk='date +%GW%V' # year week date: 2016W02 # ISO 8601 alias dtw='date +%G-W%V-%' # year week: 2016-W02-4 alias dti='date -I' # ISO-8601: 2016-01-14 alias dt-=dti alias dti='date -u +%Y%m%dT%H%M%S' # 20160111T173110Z alias dti-='date -u +%Y-%m-%dT%H:%M:%SZ' # 2016-01-11T17:31:10Z alias dti0='date -u -Iseconds' # 2016-01-11T17:31:10+0000 alias dto-='date +%Y-%j' # ordinal date: 2016-016 alias dtb="date-iso2bson.rb &amp;lt;&amp;lt;&amp;lt;\"'`dt-`'\"" # for mongo bson (Note: this is using date from GNU Coreutils. Yours may be different if you’re not on Linux.)</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2016-01-10-choosing-an-os.html
</guid>
<link>
http://micahelliott.com/posts/2016-01-10-choosing-an-os.html
</link>
<title>
Choosing your Everyday Operating System
</title>
<description>
&lt;div class="quoteblock"&gt;
&lt;div class="title"&gt;A wise person on some podcast I once heard said something like &amp;#8230;&amp;#8203;&lt;/div&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Linux is a PC OS ported to UNIX, BSD is a UNIX ported to the PC.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Three great operating systems are recommended for growing your
programming chops: Arch Linux, Gentoo Linux, and FreeBSD/PC-BSD.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You&amp;#8217;re welcome to go with a more mainstream UNIX like Ubuntu or OSX,
but these have a tendency to hide lower level OS details; you&amp;#8217;ll learn
a lot more by choosing one of our recommendations. Your preference for
control, speed, licensing, and mainstreamedness will determine your
choice. All three are bleeding edge rolling release, highly open,
fast, minimalist, configurable via text files, and security
conscious. And all have uniquely fantastic package managers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_linux_or_bsd"&gt;Linux or BSD?&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The first consideration is what license model appeals to you. Linux is
&lt;a href="http://en.wikipedia.org/wiki/GNU_General_Public_License"&gt;GPL&lt;/a&gt; (v2), which
means that many of the tools you&amp;#8217;ll use are going to be GPL, and changes that
you make to code should be shared back with the community. BSD&amp;#8217;s stance on
licensing is that you can do whatever you want with changing of code. For some
business cases this may be a preferable model. You may not be augmenting your
system tools or kernel, but some day you very well may.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Linux is more popular than BSD, but that doesn&amp;#8217;t mean it&amp;#8217;s better. BSD powers
much of the internet today, including sites like Netflix and Yahoo. It&amp;#8217;s even
what&amp;#8217;s underneath OSX.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Linux has broader reach, particularly in mobile and embedded computing. It&amp;#8217;s
what powers your Android phone. It&amp;#8217;s in your router, and probably even in your
microwave. There are literally
&lt;a href="http://distrowatch.com/"&gt;hundreds of distributions&lt;/a&gt; out there that you could
install on your laptop right now, many of which are in widespread use in data
centers and as desktops.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When you start up your shiny new service on an affordable VPS, most of your
options are going to be Linux based. Popular VPS hosting services include
Linode, DigitalOcean, and Rackspace, all of which primarily offer Linux (and
only Linux). There are BSD hosts out there, but the paucity is something to
keep in mind. If you have some idea of what OS you&amp;#8217;ll want to eventually host
your apps on, you probably want to choose that OS as what you&amp;#8217;ll run for your
home/development systems. IOW, if you decide to go with a Mac (or PC-BSD) for
your daily development, you may want to go with FreeBSD in the cloud.
Otherwise, choose a Linux family for both.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Linuxes nowadays are mostly based on systemd. This gives you sophisticated
control of running services, fancy journaling/logging, and super-fast booting.
BSDs have a simpler init startup system (but sometimes simple is a feature).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;More details on
&lt;a href="http://www.techrepublic.com/blog/10-things/10-differences-between-linux-and-bsd/"&gt;this TechRepublic post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_arch_linux"&gt;Arch Linux&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The first Linux option is Arch. It is the most popular of our three and
features several niceties:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fast installation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wikis and forums for any topic under the sun&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Binary packages for speed of install&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A lot of adoption momentum&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_gentoo_linux"&gt;Gentoo Linux&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Gentoo is a DIY OS. You build everything yourself to suit the architectural
details of your system; you even configure and build your own kernel! It takes
some time to build/install a Gentoo, but the result and learning experience is
usually worth it. Compelling features:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;System is tuned to be fast!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ultimate control of every tool&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Portage/emerge&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_fedora_linux"&gt;Fedora Linux&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The main advantage to using fedora is that it&amp;#8217;s in the RedHat family. The most
commonly deployed server OS these days is CentOS (also based on RedHat). Read
&lt;a href="posts/2015-07-17-why-centos.html"&gt;why I like CentOS&lt;/a&gt; to see why I this is a
good choice.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_pc_bsd"&gt;PC-BSD&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;FreeBSD is by far the most popular of the BSDs. The experience is pretty
similar to Gentoo, in that you can build most things yourself. It has some
very compelling features:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ZFS (compression, reliability, raid, speed, ease of use)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disk encryption&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DTrace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All-in-one OS, maintaining the kernel and userland together&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reputation for robust security&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A PC-BSD super-distro with easy installation, making laptop and server
consistent&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Great, you can make a choice now! It won&amp;#8217;t be final, but it will get you on
your way with your first machine of many in your lucrative career.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Sun, 10 Jan 2016 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>A wise person on some podcast I once heard said something like &amp;#8230;&amp;#8203; Linux is a PC OS ported to UNIX, BSD is a UNIX ported to the PC. Three great operating systems are recommended for growing your programming chops: Arch Linux, Gentoo Linux, and FreeBSD/PC-BSD. You&amp;#8217;re welcome to go with a more mainstream UNIX like Ubuntu or OSX, but these have a tendency to hide lower level OS details; you&amp;#8217;ll learn a lot more by choosing one of our recommendations. Your preference for control, speed, licensing, and mainstreamedness will determine your choice. All three are bleeding edge rolling release, highly open, fast, minimalist, configurable via text files, and security conscious. And all have uniquely fantastic package managers. Linux or BSD? The first consideration is what license model appeals to you. Linux is GPL (v2), which means that many of the tools you&amp;#8217;ll use are going to be GPL, and changes that you make to code should be shared back with the community. BSD&amp;#8217;s stance on licensing is that you can do whatever you want with changing of code. For some business cases this may be a preferable model. You may not be augmenting your system tools or kernel, but some day you very well may. Linux is more popular than BSD, but that doesn&amp;#8217;t mean it&amp;#8217;s better. BSD powers much of the internet today, including sites like Netflix and Yahoo. It&amp;#8217;s even what&amp;#8217;s underneath OSX. Linux has broader reach, particularly in mobile and embedded computing. It&amp;#8217;s what powers your Android phone. It&amp;#8217;s in your router, and probably even in your microwave. There are literally hundreds of distributions out there that you could install on your laptop right now, many of which are in widespread use in data centers and as desktops. When you start up your shiny new service on an affordable VPS, most of your options are going to be Linux based. Popular VPS hosting services include Linode, DigitalOcean, and Rackspace, all of which primarily offer Linux (and only Linux). There are BSD hosts out there, but the paucity is something to keep in mind. If you have some idea of what OS you&amp;#8217;ll want to eventually host your apps on, you probably want to choose that OS as what you&amp;#8217;ll run for your home/development systems. IOW, if you decide to go with a Mac (or PC-BSD) for your daily development, you may want to go with FreeBSD in the cloud. Otherwise, choose a Linux family for both. Linuxes nowadays are mostly based on systemd. This gives you sophisticated control of running services, fancy journaling/logging, and super-fast booting. BSDs have a simpler init startup system (but sometimes simple is a feature). More details on this TechRepublic post. Arch Linux The first Linux option is Arch. It is the most popular of our three and features several niceties: Fast installation Wikis and forums for any topic under the sun Binary packages for speed of install A lot of adoption momentum Gentoo Linux Gentoo is a DIY OS. You build everything yourself to suit the architectural details of your system; you even configure and build your own kernel! It takes some time to build/install a Gentoo, but the result and learning experience is usually worth it. Compelling features: System is tuned to be fast! Ultimate control of every tool Portage/emerge Fedora Linux The main advantage to using fedora is that it&amp;#8217;s in the RedHat family. The most commonly deployed server OS these days is CentOS (also based on RedHat). Read why I like CentOS to see why I this is a good choice. PC-BSD FreeBSD is by far the most popular of the BSDs. The experience is pretty similar to Gentoo, in that you can build most things yourself. It has some very compelling features: ZFS (compression, reliability, raid, speed, ease of use) Disk encryption DTrace All-in-one OS, maintaining the kernel and userland together Reputation for robust security A PC-BSD super-distro with easy installation, making laptop and server consistent Great, you can make a choice now! It won&amp;#8217;t be final, but it will get you on your way with your first machine of many in your lucrative career.</itunes:subtitle><itunes:summary>A wise person on some podcast I once heard said something like &amp;#8230;&amp;#8203; Linux is a PC OS ported to UNIX, BSD is a UNIX ported to the PC. Three great operating systems are recommended for growing your programming chops: Arch Linux, Gentoo Linux, and FreeBSD/PC-BSD. You&amp;#8217;re welcome to go with a more mainstream UNIX like Ubuntu or OSX, but these have a tendency to hide lower level OS details; you&amp;#8217;ll learn a lot more by choosing one of our recommendations. Your preference for control, speed, licensing, and mainstreamedness will determine your choice. All three are bleeding edge rolling release, highly open, fast, minimalist, configurable via text files, and security conscious. And all have uniquely fantastic package managers. Linux or BSD? The first consideration is what license model appeals to you. Linux is GPL (v2), which means that many of the tools you&amp;#8217;ll use are going to be GPL, and changes that you make to code should be shared back with the community. BSD&amp;#8217;s stance on licensing is that you can do whatever you want with changing of code. For some business cases this may be a preferable model. You may not be augmenting your system tools or kernel, but some day you very well may. Linux is more popular than BSD, but that doesn&amp;#8217;t mean it&amp;#8217;s better. BSD powers much of the internet today, including sites like Netflix and Yahoo. It&amp;#8217;s even what&amp;#8217;s underneath OSX. Linux has broader reach, particularly in mobile and embedded computing. It&amp;#8217;s what powers your Android phone. It&amp;#8217;s in your router, and probably even in your microwave. There are literally hundreds of distributions out there that you could install on your laptop right now, many of which are in widespread use in data centers and as desktops. When you start up your shiny new service on an affordable VPS, most of your options are going to be Linux based. Popular VPS hosting services include Linode, DigitalOcean, and Rackspace, all of which primarily offer Linux (and only Linux). There are BSD hosts out there, but the paucity is something to keep in mind. If you have some idea of what OS you&amp;#8217;ll want to eventually host your apps on, you probably want to choose that OS as what you&amp;#8217;ll run for your home/development systems. IOW, if you decide to go with a Mac (or PC-BSD) for your daily development, you may want to go with FreeBSD in the cloud. Otherwise, choose a Linux family for both. Linuxes nowadays are mostly based on systemd. This gives you sophisticated control of running services, fancy journaling/logging, and super-fast booting. BSDs have a simpler init startup system (but sometimes simple is a feature). More details on this TechRepublic post. Arch Linux The first Linux option is Arch. It is the most popular of our three and features several niceties: Fast installation Wikis and forums for any topic under the sun Binary packages for speed of install A lot of adoption momentum Gentoo Linux Gentoo is a DIY OS. You build everything yourself to suit the architectural details of your system; you even configure and build your own kernel! It takes some time to build/install a Gentoo, but the result and learning experience is usually worth it. Compelling features: System is tuned to be fast! Ultimate control of every tool Portage/emerge Fedora Linux The main advantage to using fedora is that it&amp;#8217;s in the RedHat family. The most commonly deployed server OS these days is CentOS (also based on RedHat). Read why I like CentOS to see why I this is a good choice. PC-BSD FreeBSD is by far the most popular of the BSDs. The experience is pretty similar to Gentoo, in that you can build most things yourself. It has some very compelling features: ZFS (compression, reliability, raid, speed, ease of use) Disk encryption DTrace All-in-one OS, maintaining the kernel and userland together Reputation for robust security A PC-BSD super-distro with easy installation, making laptop and server consistent Great, you can make a choice now! It won&amp;#8217;t be final, but it will get you on your way with your first machine of many in your lucrative career.</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2016-01-05-centos-7-networking-tools.html
</guid>
<link>
http://micahelliott.com/posts/2016-01-05-centos-7-networking-tools.html
</link>
<title>
CentOS 7 Networking Tools
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;sysadmins&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
“Networking is an essential part of building wealth.”  &lt;em&gt;— Armstrong Williams&lt;/em&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The networking toolchain is a bit different on every OS. I’ve been spending
enough time on CentOS 7 lately that its specifics are worth recording.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’ll assume you don’t care about OSs that deviate much from RH-derived. I’m also
leaving out anything to do with IPv6.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Wireless networking is not something you do much on servers, so it (&lt;code&gt;iw&lt;/code&gt;) is
mostly omitted, too.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_packages"&gt;Packages&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;iproute2&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_commands"&gt;Commands&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The &lt;code&gt;ip&lt;/code&gt; command has replaced some of the trusty old guard. If you use Zsh, the
&lt;code&gt;ip&lt;/code&gt; tab-completion is excellent for quickly using various subcommands.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;wolfram cidr&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ethtool&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ip a&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ip link&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ifconfig&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ifstat&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ifup/ifdown&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;nmcli/nmtui&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;nmcli d s&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;NetworkManager (need it for firewalld)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;sys&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;netstat -tulpn
netstat -pn tcp
netstat -ln4
netstat -naf inet&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ss (socket stat)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;netcat&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;arp&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;route&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;iotop&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;iostat&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;iperf3&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;host&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;whois/dig&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ping&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;lsof -ni&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;tcpdump&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ipcalc&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ifrename&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;sockstack -4&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Although &lt;code&gt;traceroute&lt;/code&gt; is the old standard, the netadmins I’ve worked with tend
to ask for &lt;code&gt;mtr&lt;/code&gt; output.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;mtr/tracepath&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;firewall-cmd&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;iostat -xdm 5&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_files"&gt;Files&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;/etc/sysconfig/network-scripts/ifcfg-e*
/etc/services
/etc/resolv.conf&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_normal_things"&gt;Normal Things&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;pinging local Gb network: 0.15 ms&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_antiquated_deprecated"&gt;Antiquated/Deprecated&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/" class="bare"&gt;https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;arp
iptunnel
iwconfig
nameif
netstat
route
ifconfig
traceroute
tcpdump&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;yum install net-tools (last release 2001
&lt;a href="https://lists.debian.org/debian-devel/2009/03/msg00780.html" class="bare"&gt;https://lists.debian.org/debian-devel/2009/03/msg00780.html&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_glossary"&gt;Glossary&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="dlist"&gt;
&lt;dl&gt;
&lt;dt class="hdlist1"&gt;uplink&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;incoming network drop&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;layers (physical, datalink, network, transport, app)&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;tcp/ip&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;nat&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;private addresses&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
&lt;a href="https://en.wikipedia.org/wiki/Private_network" class="bare"&gt;https://en.wikipedia.org/wiki/Private_network&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;arp/mac address&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;cidr&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;lan&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;vlan (multi-homing)&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;netmask&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;broadcast&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;gateway&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;icmp&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;mtu&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;ttl&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;snmp&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;simple network management protocol&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;cat5e&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;the only cable you probably want to use&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_resources"&gt;Resources&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.michaelwlucas.com/nonfiction/n4sa"&gt;Networking for Systems Administrators&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html-single/Networking_Guide/"&gt;Red Hat Networking Guide&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This could become a short ebook: DevOps Practical Guide to Modern Linux Networking&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Tue, 05 Jan 2016 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: sysadmins “Networking is an essential part of building wealth.” — Armstrong Williams The networking toolchain is a bit different on every OS. I’ve been spending enough time on CentOS 7 lately that its specifics are worth recording. I’ll assume you don’t care about OSs that deviate much from RH-derived. I’m also leaving out anything to do with IPv6. Wireless networking is not something you do much on servers, so it (iw) is mostly omitted, too. Packages iproute2 Commands The ip command has replaced some of the trusty old guard. If you use Zsh, the ip tab-completion is excellent for quickly using various subcommands. wolfram cidr ethtool ip a ip link ifconfig ifstat ifup/ifdown nmcli/nmtui nmcli d s NetworkManager (need it for firewalld) sys netstat -tulpn netstat -pn tcp netstat -ln4 netstat -naf inet ss (socket stat) netcat arp route iotop iostat iperf3 host whois/dig ping lsof -ni tcpdump ipcalc ifrename sockstack -4 Although traceroute is the old standard, the netadmins I’ve worked with tend to ask for mtr output. mtr/tracepath firewall-cmd iostat -xdm 5 Files /etc/sysconfig/network-scripts/ifcfg-e* /etc/services /etc/resolv.conf Normal Things pinging local Gb network: 0.15 ms Antiquated/Deprecated https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ arp iptunnel iwconfig nameif netstat route ifconfig traceroute tcpdump yum install net-tools (last release 2001 https://lists.debian.org/debian-devel/2009/03/msg00780.html) Glossary uplink incoming network drop layers (physical, datalink, network, transport, app) tcp/ip nat private addresses 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 https://en.wikipedia.org/wiki/Private_network arp/mac address cidr lan vlan (multi-homing) netmask broadcast gateway icmp mtu ttl snmp simple network management protocol cat5e the only cable you probably want to use Resources Networking for Systems Administrators Red Hat Networking Guide This could become a short ebook: DevOps Practical Guide to Modern Linux Networking</itunes:subtitle><itunes:summary>Audience: sysadmins “Networking is an essential part of building wealth.” — Armstrong Williams The networking toolchain is a bit different on every OS. I’ve been spending enough time on CentOS 7 lately that its specifics are worth recording. I’ll assume you don’t care about OSs that deviate much from RH-derived. I’m also leaving out anything to do with IPv6. Wireless networking is not something you do much on servers, so it (iw) is mostly omitted, too. Packages iproute2 Commands The ip command has replaced some of the trusty old guard. If you use Zsh, the ip tab-completion is excellent for quickly using various subcommands. wolfram cidr ethtool ip a ip link ifconfig ifstat ifup/ifdown nmcli/nmtui nmcli d s NetworkManager (need it for firewalld) sys netstat -tulpn netstat -pn tcp netstat -ln4 netstat -naf inet ss (socket stat) netcat arp route iotop iostat iperf3 host whois/dig ping lsof -ni tcpdump ipcalc ifrename sockstack -4 Although traceroute is the old standard, the netadmins I’ve worked with tend to ask for mtr output. mtr/tracepath firewall-cmd iostat -xdm 5 Files /etc/sysconfig/network-scripts/ifcfg-e* /etc/services /etc/resolv.conf Normal Things pinging local Gb network: 0.15 ms Antiquated/Deprecated https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ arp iptunnel iwconfig nameif netstat route ifconfig traceroute tcpdump yum install net-tools (last release 2001 https://lists.debian.org/debian-devel/2009/03/msg00780.html) Glossary uplink incoming network drop layers (physical, datalink, network, transport, app) tcp/ip nat private addresses 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 https://en.wikipedia.org/wiki/Private_network arp/mac address cidr lan vlan (multi-homing) netmask broadcast gateway icmp mtu ttl snmp simple network management protocol cat5e the only cable you probably want to use Resources Networking for Systems Administrators Red Hat Networking Guide This could become a short ebook: DevOps Practical Guide to Modern Linux Networking</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-12-22-slow-keyboard-repeat-rate.html
</guid>
<link>
http://micahelliott.com/posts/2015-12-22-slow-keyboard-repeat-rate.html
</link>
<title>
No More Holding Down Keys
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;button holders&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
“The chains of habit are too weak to be felt until they are too strong to be
broken.” &lt;em&gt;― Samuel Johnson&lt;/em&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’m trying an experiment where I’ve turned my keyboard repeat rate way down.
This should force me to never hold down a key for repetition, but rather use a
prefix like &lt;code&gt;4w&lt;/code&gt; (vim) or &lt;code&gt;Ctrl-Backspace&lt;/code&gt; (browsers). I’m learning some
interesting things!&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This is done easily across X with:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;#              msdelay rate
#exec xset r rate 250    60    # super fast keyboard cursor delay and rate!
exec xset r rate 250    2     # super slow (vim training)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;More details
&lt;a href="https://wiki.archlinux.org/index.php/Keyboard_configuration_in_Xorg#Using_xset"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;That line is from my &lt;code&gt;~/.i3/config&lt;/code&gt;. Remove the &lt;code&gt;exec&lt;/code&gt; to put in in &lt;code&gt;~/.xinitrc&lt;/code&gt;
or the CLI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_other_experiments"&gt;Other Experiments&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reverse your &lt;code&gt;:;&lt;/code&gt; key&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turn on your awful beep&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Tue, 22 Dec 2015 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: button holders “The chains of habit are too weak to be felt until they are too strong to be broken.” ― Samuel Johnson I’m trying an experiment where I’ve turned my keyboard repeat rate way down. This should force me to never hold down a key for repetition, but rather use a prefix like 4w (vim) or Ctrl-Backspace (browsers). I’m learning some interesting things! This is done easily across X with: # msdelay rate #exec xset r rate 250 60 # super fast keyboard cursor delay and rate! exec xset r rate 250 2 # super slow (vim training) More details here. That line is from my ~/.i3/config. Remove the exec to put in in ~/.xinitrc or the CLI. Other Experiments Reverse your :; key Turn on your awful beep</itunes:subtitle><itunes:summary>Audience: button holders “The chains of habit are too weak to be felt until they are too strong to be broken.” ― Samuel Johnson I’m trying an experiment where I’ve turned my keyboard repeat rate way down. This should force me to never hold down a key for repetition, but rather use a prefix like 4w (vim) or Ctrl-Backspace (browsers). I’m learning some interesting things! This is done easily across X with: # msdelay rate #exec xset r rate 250 60 # super fast keyboard cursor delay and rate! exec xset r rate 250 2 # super slow (vim training) More details here. That line is from my ~/.i3/config. Remove the exec to put in in ~/.xinitrc or the CLI. Other Experiments Reverse your :; key Turn on your awful beep</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-10-15-programming-heroes.html
</guid>
<link>
http://micahelliott.com/posts/2015-10-15-programming-heroes.html
</link>
<title>
Programming Heroes
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;anyone&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
“To be a hero, you have to learn to be a deviant, because you’re always going
against the conformity of the group. Heroes are ordinary people whose social
actions are extraordinary. Who act.”  &lt;em&gt;— Philip Zimbardo&lt;/em&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The question of “who is your programming hero” comes up on episodes of
[The Changelog], and it’s a good one. I have no means or aspirations to be
asked, but it’s a fun question to answer, so here are my programming heroes&amp;#8230;&amp;#8203;&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_john_mccarthy_1927_2011"&gt;John McCarthy (1927-2011)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For conceiving of Lisp.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_gerald_sussman"&gt;Gerald Sussman&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For co-creating Scheme and making lisp more accessible to students through
his development, writing, and lecturing.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_richard_stallman_1953"&gt;Richard Stallman (1953-)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For GNU tools, Emacs, and indefatigable promotion of open source. And for being
the one to really make us think different.
&lt;a href="https://stallman.org/" class="bare"&gt;https://stallman.org/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_bram_moolenaar_1961"&gt;Bram Moolenaar (1961-)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;for Vim.
&lt;a href="https://en.wikipedia.org/wiki/Bram_Moolenaar" class="bare"&gt;https://en.wikipedia.org/wiki/Bram_Moolenaar&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_linus_torvalds_1969"&gt;Linus Torvalds (1969-)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Linus_Torvalds" class="bare"&gt;https://en.wikipedia.org/wiki/Linus_Torvalds&lt;/a&gt;
Linux and Git.  Jeez.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_edgar_codd_1923_2003"&gt;Edgar Codd (1923-2003)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For his &lt;a href="http://www.acm.org/classics/nov95/toc.html"&gt;relational model&lt;/a&gt; which led
to SQL.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_robin_milner_1934_2010"&gt;Robin Milner (1934-2010)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Robin_Milner"&gt;Robin Milner&lt;/a&gt; created ML, and ran
with the ideas of type inference.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_steven_kleene_1909_1994"&gt;Steven Kleene (1909-1994)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For basically inventing the regex.
&lt;a href="https://en.wikipedia.org/wiki/Stephen_Cole_Kleene" class="bare"&gt;https://en.wikipedia.org/wiki/Stephen_Cole_Kleene&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_ken_thompson"&gt;Ken Thompson&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For putting the regex into practical use in editors. And for co-inventing UNIX.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_honorable_mentions"&gt;Honorable mentions&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_rich_hickey"&gt;Rich Hickey&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My first year with Clojure (2012)&amp;#8201;&amp;#8212;&amp;#8201;which was created by Rich&amp;#8201;&amp;#8212;&amp;#8201;opened my
eyes to the beauty of lisp.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;After spending some more recent time with Racket, I believe Clojure is not a
panacea. Racket is beautiful for its simplicity and regularity. It also doesn’t
suffer from the bloat associated with sitting on top of the JVM.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_paul_graham"&gt;Paul Graham&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Insights such as patterns being smells, the glory of Pride and Prejudice&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_john_backus"&gt;John Backus&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;for his work on language specification (BNF). And for his
&lt;a href="http://www.stanford.edu/class/cs242/readings/backus.pdf"&gt;contributions&lt;/a&gt; to
functional programming.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_ronald_rivest"&gt;Ronald Rivest&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For voluminous contributions to literature on algorithms, and for giving us the
security that we have today.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_paul_falstad"&gt;Paul Falstad&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For creating Zsh, the shell that is both featureful and fast.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_george_boole"&gt;George Boole&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For having managed to get his name and logic into every programming language.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_haskell_curry"&gt;Haskell Curry&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For getting his name and ideas into almost as many languages and Boole.
&lt;a href="https://en.wikipedia.org/wiki/Haskell_Curry" class="bare"&gt;https://en.wikipedia.org/wiki/Haskell_Curry&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_george_zahariev_david_nolen_evan_czaplicki"&gt;George Zahariev, David Nolen, Evan Czaplicki&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For their continued efforts to make JavaScript sane via LiveScript,
ClojureScript, and Elm, respectively.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_on_anti_heroes"&gt;On anti-heroes&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I don’t think it’s productive to name names here, so use your imagination.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Despite the efforts of the heroes I’ve listed, many have come and been
seen as heroes to the masses, and yet they often worked against the
real heroes. Let us eschew the “heroics” of those who have pushed
languages, operating systems, and tools in directions that have done
harm. Some were great experiments, and much was learned, but they have
errantly gone mainstream. I’m speaking of languages where everything
is an object, mutability is the norm, parallelism nears impossibility,
functions are not first-class, state and behavior are conflated, and
where we tell the machines &lt;em&gt;how&lt;/em&gt; to do things instead of &lt;em&gt;what&lt;/em&gt;
to do. Of opaque systems where we have no way to know what they’re
doing on our behalves.  Of tools that lock us into perpetual
agreements and eventual compromises and pain.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_resources"&gt;Resources&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Turing_Award"&gt;Winners of the Turing Award&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Thu, 15 Oct 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: anyone “To be a hero, you have to learn to be a deviant, because you’re always going against the conformity of the group. Heroes are ordinary people whose social actions are extraordinary. Who act.” — Philip Zimbardo The question of “who is your programming hero” comes up on episodes of [The Changelog], and it’s a good one. I have no means or aspirations to be asked, but it’s a fun question to answer, so here are my programming heroes&amp;#8230;&amp;#8203; John McCarthy (1927-2011) For conceiving of Lisp. Gerald Sussman For co-creating Scheme and making lisp more accessible to students through his development, writing, and lecturing. Richard Stallman (1953-) For GNU tools, Emacs, and indefatigable promotion of open source. And for being the one to really make us think different. https://stallman.org/ Bram Moolenaar (1961-) for Vim. https://en.wikipedia.org/wiki/Bram_Moolenaar Linus Torvalds (1969-) https://en.wikipedia.org/wiki/Linus_Torvalds Linux and Git. Jeez. Edgar Codd (1923-2003) For his relational model which led to SQL. Robin Milner (1934-2010) Robin Milner created ML, and ran with the ideas of type inference. Steven Kleene (1909-1994) For basically inventing the regex. https://en.wikipedia.org/wiki/Stephen_Cole_Kleene Ken Thompson For putting the regex into practical use in editors. And for co-inventing UNIX. Honorable mentions Rich Hickey My first year with Clojure (2012)&amp;#8201;&amp;#8212;&amp;#8201;which was created by Rich&amp;#8201;&amp;#8212;&amp;#8201;opened my eyes to the beauty of lisp. After spending some more recent time with Racket, I believe Clojure is not a panacea. Racket is beautiful for its simplicity and regularity. It also doesn’t suffer from the bloat associated with sitting on top of the JVM. Paul Graham Insights such as patterns being smells, the glory of Pride and Prejudice John Backus for his work on language specification (BNF). And for his contributions to functional programming. Ronald Rivest For voluminous contributions to literature on algorithms, and for giving us the security that we have today. Paul Falstad For creating Zsh, the shell that is both featureful and fast. George Boole For having managed to get his name and logic into every programming language. Haskell Curry For getting his name and ideas into almost as many languages and Boole. https://en.wikipedia.org/wiki/Haskell_Curry George Zahariev, David Nolen, Evan Czaplicki For their continued efforts to make JavaScript sane via LiveScript, ClojureScript, and Elm, respectively. On anti-heroes I don’t think it’s productive to name names here, so use your imagination. Despite the efforts of the heroes I’ve listed, many have come and been seen as heroes to the masses, and yet they often worked against the real heroes. Let us eschew the “heroics” of those who have pushed languages, operating systems, and tools in directions that have done harm. Some were great experiments, and much was learned, but they have errantly gone mainstream. I’m speaking of languages where everything is an object, mutability is the norm, parallelism nears impossibility, functions are not first-class, state and behavior are conflated, and where we tell the machines how to do things instead of what to do. Of opaque systems where we have no way to know what they’re doing on our behalves. Of tools that lock us into perpetual agreements and eventual compromises and pain. Resources Winners of the Turing Award</itunes:subtitle><itunes:summary>Audience: anyone “To be a hero, you have to learn to be a deviant, because you’re always going against the conformity of the group. Heroes are ordinary people whose social actions are extraordinary. Who act.” — Philip Zimbardo The question of “who is your programming hero” comes up on episodes of [The Changelog], and it’s a good one. I have no means or aspirations to be asked, but it’s a fun question to answer, so here are my programming heroes&amp;#8230;&amp;#8203; John McCarthy (1927-2011) For conceiving of Lisp. Gerald Sussman For co-creating Scheme and making lisp more accessible to students through his development, writing, and lecturing. Richard Stallman (1953-) For GNU tools, Emacs, and indefatigable promotion of open source. And for being the one to really make us think different. https://stallman.org/ Bram Moolenaar (1961-) for Vim. https://en.wikipedia.org/wiki/Bram_Moolenaar Linus Torvalds (1969-) https://en.wikipedia.org/wiki/Linus_Torvalds Linux and Git. Jeez. Edgar Codd (1923-2003) For his relational model which led to SQL. Robin Milner (1934-2010) Robin Milner created ML, and ran with the ideas of type inference. Steven Kleene (1909-1994) For basically inventing the regex. https://en.wikipedia.org/wiki/Stephen_Cole_Kleene Ken Thompson For putting the regex into practical use in editors. And for co-inventing UNIX. Honorable mentions Rich Hickey My first year with Clojure (2012)&amp;#8201;&amp;#8212;&amp;#8201;which was created by Rich&amp;#8201;&amp;#8212;&amp;#8201;opened my eyes to the beauty of lisp. After spending some more recent time with Racket, I believe Clojure is not a panacea. Racket is beautiful for its simplicity and regularity. It also doesn’t suffer from the bloat associated with sitting on top of the JVM. Paul Graham Insights such as patterns being smells, the glory of Pride and Prejudice John Backus for his work on language specification (BNF). And for his contributions to functional programming. Ronald Rivest For voluminous contributions to literature on algorithms, and for giving us the security that we have today. Paul Falstad For creating Zsh, the shell that is both featureful and fast. George Boole For having managed to get his name and logic into every programming language. Haskell Curry For getting his name and ideas into almost as many languages and Boole. https://en.wikipedia.org/wiki/Haskell_Curry George Zahariev, David Nolen, Evan Czaplicki For their continued efforts to make JavaScript sane via LiveScript, ClojureScript, and Elm, respectively. On anti-heroes I don’t think it’s productive to name names here, so use your imagination. Despite the efforts of the heroes I’ve listed, many have come and been seen as heroes to the masses, and yet they often worked against the real heroes. Let us eschew the “heroics” of those who have pushed languages, operating systems, and tools in directions that have done harm. Some were great experiments, and much was learned, but they have errantly gone mainstream. I’m speaking of languages where everything is an object, mutability is the norm, parallelism nears impossibility, functions are not first-class, state and behavior are conflated, and where we tell the machines how to do things instead of what to do. Of opaque systems where we have no way to know what they’re doing on our behalves. Of tools that lock us into perpetual agreements and eventual compromises and pain. Resources Winners of the Turing Award</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-09-01-arch-aur-getting-started-guide.html
</guid>
<link>
http://micahelliott.com/posts/2015-09-01-arch-aur-getting-started-guide.html
</link>
<title>
AUR Getting Started Guide
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;intermediate&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There are many options to access Arch’s User Repository (AUR). The AUR is one of
the most compelling features of Arch Linux. I’ll walk you through the simplest
path to getting started with the AUR, with minimal bootstrapping effort.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The most primitive yet useful tool I’ve found for first accessing the AUR is
&lt;a href="https://aur.archlinux.org/packages/cower/"&gt;cower&lt;/a&gt;. On the right side of that page
you’ll see a link to “Download snapshot”. It’s
&lt;a href="https://aur.archlinux.org/cgit/aur.git/snapshot/cower.tar.gz"&gt;https://aur.archlinux.org/cgit/aur.git/snapshot/cower.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Grab/extract/install it with:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;cd $TMPDIR
wget https://aur.archlinux.org/cgit/aur.git/snapshot/cower.tar.gz
tar xzvf cower.tar.gz
cd cower
makepkg -si&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You could continue to search the AUR website for packages to install, and
continue to run &lt;code&gt;wget/tar/cur/makepkg&lt;/code&gt; on them. But AUR managers make life much
better than that. And now with &lt;code&gt;cower&lt;/code&gt; (and soon more) you have full
command-line access to the AUR!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Let’s search for a more featureful AUR
manager. &lt;code&gt;cower&lt;/code&gt; is cool. You can use it directly, and it’s the simple base
command underlying a few of the other managers. It’s also a good tool for
learning about the low-level details of the AUR (now right now). But we’ll
prefer those managers that conform to &lt;code&gt;pacman&lt;/code&gt;’s option syntax.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;cower -s aurget
cower -s pacaur
cower -s yaourt&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;These also all happen to support nice Zsh completions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Let’s find and install something useful.
&lt;a href="https://aur.archlinux.org/packages/?SB=p&amp;amp;SO=d&amp;amp;O=0&amp;amp;PP=50"&gt;Here&lt;/a&gt; is the list of
packages, sorted by popularity. You’ll notice &lt;code&gt;yaourt&lt;/code&gt; is at the top.
Interesting. Install &lt;code&gt;archey&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;aurget -S --noconfirm --noedit archey&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Tue, 01 Sep 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: intermediate There are many options to access Arch’s User Repository (AUR). The AUR is one of the most compelling features of Arch Linux. I’ll walk you through the simplest path to getting started with the AUR, with minimal bootstrapping effort. The most primitive yet useful tool I’ve found for first accessing the AUR is cower. On the right side of that page you’ll see a link to “Download snapshot”. It’s https://aur.archlinux.org/cgit/aur.git/snapshot/cower.tar.gz Grab/extract/install it with: cd $TMPDIR wget https://aur.archlinux.org/cgit/aur.git/snapshot/cower.tar.gz tar xzvf cower.tar.gz cd cower makepkg -si You could continue to search the AUR website for packages to install, and continue to run wget/tar/cur/makepkg on them. But AUR managers make life much better than that. And now with cower (and soon more) you have full command-line access to the AUR! Let’s search for a more featureful AUR manager. cower is cool. You can use it directly, and it’s the simple base command underlying a few of the other managers. It’s also a good tool for learning about the low-level details of the AUR (now right now). But we’ll prefer those managers that conform to pacman’s option syntax. cower -s aurget cower -s pacaur cower -s yaourt These also all happen to support nice Zsh completions. Let’s find and install something useful. Here is the list of packages, sorted by popularity. You’ll notice yaourt is at the top. Interesting. Install archey aurget -S --noconfirm --noedit archey</itunes:subtitle><itunes:summary>Audience: intermediate There are many options to access Arch’s User Repository (AUR). The AUR is one of the most compelling features of Arch Linux. I’ll walk you through the simplest path to getting started with the AUR, with minimal bootstrapping effort. The most primitive yet useful tool I’ve found for first accessing the AUR is cower. On the right side of that page you’ll see a link to “Download snapshot”. It’s https://aur.archlinux.org/cgit/aur.git/snapshot/cower.tar.gz Grab/extract/install it with: cd $TMPDIR wget https://aur.archlinux.org/cgit/aur.git/snapshot/cower.tar.gz tar xzvf cower.tar.gz cd cower makepkg -si You could continue to search the AUR website for packages to install, and continue to run wget/tar/cur/makepkg on them. But AUR managers make life much better than that. And now with cower (and soon more) you have full command-line access to the AUR! Let’s search for a more featureful AUR manager. cower is cool. You can use it directly, and it’s the simple base command underlying a few of the other managers. It’s also a good tool for learning about the low-level details of the AUR (now right now). But we’ll prefer those managers that conform to pacman’s option syntax. cower -s aurget cower -s pacaur cower -s yaourt These also all happen to support nice Zsh completions. Let’s find and install something useful. Here is the list of packages, sorted by popularity. You’ll notice yaourt is at the top. Interesting. Install archey aurget -S --noconfirm --noedit archey</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-08-30-lisp-glossary.html
</guid>
<link>
http://micahelliott.com/posts/2015-08-30-lisp-glossary.html
</link>
<title>
Lisp Jargon
</title>
<description>
&lt;div class="sect1"&gt;
&lt;h2 id="_lisp_jargon"&gt;Lisp Jargon&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&amp;#8201;&amp;#8212;&amp;#8201;&lt;a href="http://www.lispworks.com/documentation/lw51/CLHS/Body/26_glo_b.htm" class="bare"&gt;http://www.lispworks.com/documentation/lw51/CLHS/Body/26_glo_b.htm&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The following is a glossary of fundamental lisp terms that may be somewhat
foreign to someone who is not versed in a lisp. I have cherry-picked the terms
that I find to be most productive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;They are intentionally not alphabetical, but are ordered and grouped into
logical sections.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="dlist"&gt;
&lt;dl&gt;
&lt;dt class="hdlist1"&gt;sexp&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;s-expression, symbolic expression&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;statement&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;nothing&amp;#8201;&amp;#8212;&amp;#8201;everything is an expression&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;expression&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;form&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;(vim)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;string&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;(vim)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;element&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;like atom (vim)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;redex&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;reducible expression&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;regex(p)&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;regular expression&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;lisp&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;list processor&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;list&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;()&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;sequence&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;singleton&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;a sequence with only one element&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;pair&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;rpn&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;reverse polish notation: operator first&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;quoting&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;boolean&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;homoiconic&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;code is data&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;scheme&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;academic lisp dialect&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;racket&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;another scheme implementation&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;clojure&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;modern lisp on java/javascript&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;clisp&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;common lisp; old, robust lisp dialect/implementation&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;repl&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;read, eval, print, loop&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;emacs&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;most common way to edit lisp&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;vim&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;another powerful editor&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;slime&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;an editor mode that enables immediate transfer of forms from editor to repl&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;tree&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;leaves, nodes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;recursion&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;iteration&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;loop&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;tco&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;tail call optimization for recursive functions&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;lexical (scoping)&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;referring to scope of visibility, done through &lt;em&gt;textual analysis&lt;/em&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;formal parameter&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;actual argument&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;splice&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;slurp&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;barf&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;name&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;an identifier bound to an object&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;object&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;any lisp datum&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;atom&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;identifier&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;a symbol used to identify names&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;variable&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;symbol&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;value&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;the result of an evaluation&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;reference&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;refer to an object or binding by name&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;binding&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;association between a name and its value (e.g., “let-binding”)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;literal&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;keyword&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;vector&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;hash table&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;mapping of keys to values&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;macro&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;reader&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;eval&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;immutable&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;concurrency&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;parallelism&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;primitive/built-in&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;ex: car, cdr, cond, cons, map, null?, add1, sub1&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;null&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;map&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;apply&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;rest list&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;cdr&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;operator/operand&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;predicate&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;lambda&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;function&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;procedure&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;application&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;continuation&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;signature&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;descirption of the parameters of a method&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;block&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;begin/do&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;implicit block&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt; has these&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;currying&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;closure&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;hof&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;higher-order function, passed in to another func or returned&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;declaration&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;definition&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;htdp&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;tls&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;sicp&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;ror&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;exception&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;environment&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;set of bindings&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;package&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;bundle of reusable, installable code&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;rank&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;number of dimensions of an array&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;R5RS&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;revision 5 report on scheme&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;fingernail clippings and oatmeal&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;lambda calculus&lt;/dt&gt;
&lt;dt class="hdlist1"&gt;srfi&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;scheme requests for implementation; see the &lt;a href="http://srfi.schemers.org/srfi-faq.html"&gt;SRFI FAQs&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;(The definitions herein are mostly my own, but much of what I know is inevitably
copied from others.)&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Sun, 30 Aug 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Lisp Jargon &amp;#8201;&amp;#8212;&amp;#8201;http://www.lispworks.com/documentation/lw51/CLHS/Body/26_glo_b.htm The following is a glossary of fundamental lisp terms that may be somewhat foreign to someone who is not versed in a lisp. I have cherry-picked the terms that I find to be most productive. They are intentionally not alphabetical, but are ordered and grouped into logical sections. sexp s-expression, symbolic expression statement nothing&amp;#8201;&amp;#8212;&amp;#8201;everything is an expression expression form (vim) string (vim) element like atom (vim) redex reducible expression regex(p) regular expression lisp list processor list () sequence singleton a sequence with only one element pair rpn reverse polish notation: operator first quoting boolean homoiconic code is data scheme academic lisp dialect racket another scheme implementation clojure modern lisp on java/javascript clisp common lisp; old, robust lisp dialect/implementation repl read, eval, print, loop emacs most common way to edit lisp vim another powerful editor slime an editor mode that enables immediate transfer of forms from editor to repl tree leaves, nodes recursion iteration loop tco tail call optimization for recursive functions lexical (scoping) referring to scope of visibility, done through textual analysis formal parameter actual argument splice slurp barf name an identifier bound to an object object any lisp datum atom identifier a symbol used to identify names variable symbol value the result of an evaluation reference refer to an object or binding by name binding association between a name and its value (e.g., “let-binding”) literal keyword vector hash table mapping of keys to values macro reader eval immutable concurrency parallelism primitive/built-in ex: car, cdr, cond, cons, map, null?, add1, sub1 null map apply rest list cdr operator/operand predicate lambda function procedure application continuation signature descirption of the parameters of a method block begin/do implicit block if has these currying closure hof higher-order function, passed in to another func or returned declaration definition htdp tls sicp ror exception environment set of bindings package bundle of reusable, installable code rank number of dimensions of an array R5RS revision 5 report on scheme fingernail clippings and oatmeal lambda calculus srfi scheme requests for implementation; see the SRFI FAQs (The definitions herein are mostly my own, but much of what I know is inevitably copied from others.)</itunes:subtitle><itunes:summary>Lisp Jargon &amp;#8201;&amp;#8212;&amp;#8201;http://www.lispworks.com/documentation/lw51/CLHS/Body/26_glo_b.htm The following is a glossary of fundamental lisp terms that may be somewhat foreign to someone who is not versed in a lisp. I have cherry-picked the terms that I find to be most productive. They are intentionally not alphabetical, but are ordered and grouped into logical sections. sexp s-expression, symbolic expression statement nothing&amp;#8201;&amp;#8212;&amp;#8201;everything is an expression expression form (vim) string (vim) element like atom (vim) redex reducible expression regex(p) regular expression lisp list processor list () sequence singleton a sequence with only one element pair rpn reverse polish notation: operator first quoting boolean homoiconic code is data scheme academic lisp dialect racket another scheme implementation clojure modern lisp on java/javascript clisp common lisp; old, robust lisp dialect/implementation repl read, eval, print, loop emacs most common way to edit lisp vim another powerful editor slime an editor mode that enables immediate transfer of forms from editor to repl tree leaves, nodes recursion iteration loop tco tail call optimization for recursive functions lexical (scoping) referring to scope of visibility, done through textual analysis formal parameter actual argument splice slurp barf name an identifier bound to an object object any lisp datum atom identifier a symbol used to identify names variable symbol value the result of an evaluation reference refer to an object or binding by name binding association between a name and its value (e.g., “let-binding”) literal keyword vector hash table mapping of keys to values macro reader eval immutable concurrency parallelism primitive/built-in ex: car, cdr, cond, cons, map, null?, add1, sub1 null map apply rest list cdr operator/operand predicate lambda function procedure application continuation signature descirption of the parameters of a method block begin/do implicit block if has these currying closure hof higher-order function, passed in to another func or returned declaration definition htdp tls sicp ror exception environment set of bindings package bundle of reusable, installable code rank number of dimensions of an array R5RS revision 5 report on scheme fingernail clippings and oatmeal lambda calculus srfi scheme requests for implementation; see the SRFI FAQs (The definitions herein are mostly my own, but much of what I know is inevitably copied from others.)</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-08-27-firewalld-best-practices.html
</guid>
<link>
http://micahelliott.com/posts/2015-08-27-firewalld-best-practices.html
</link>
<title>
Firewalld Best Practices
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;sysadmins&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Firewalld is the replacement for iptables in RedHat-family distros. Like it or
not, you’ll probably end up having to wrestle with it at some point. I’ve read
several articles describing it with an overview, but most miss out on
important subtleties of a tool that’s in production but maybe not friendly
enough for prime time. Here you’ll find my guide to getting the most out of
Firewalld and avoiding its gotchas.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The commands get long, long, and very long to type frequently. What’s worse is
that it seems you usually need to repeat them with a &lt;code&gt;--permanent&lt;/code&gt; option, which
is painful and easy to forget.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_command_line_completion"&gt;Command line completion&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There appears to be a bash completer. I haven’t tried it since I’m fully in Zsh
land these days for all activities. It’s not any RH repo I’m aware of anyway, so
let’s forget it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Firewalld supports a poor man’s version of completion. Instead of typing
&lt;code&gt;--zone&lt;/code&gt;, you can just type &lt;code&gt;--zo&lt;/code&gt; or even &lt;code&gt;--z&lt;/code&gt;. You’d have to memorize how
much of each option is unambiguous. So you still have to type &lt;code&gt;--list-all-z&lt;/code&gt; to
get &lt;code&gt;--list-all-zones&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So aliases are the way to go.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I did write a Zsh completer here, if you want to use it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_ansible_support"&gt;Ansible support&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;TLDR: don’t bother with Ansible for Firewalld. Even if you do, you’ll likely
need to experiment with &lt;code&gt;firewall-cmd&lt;/code&gt; to get your rules right.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ansible’s new version 2 purports to support most of the full set of options,
including &lt;code&gt;--source&lt;/code&gt;, which I use frequently. Unfortunately, I’ve found this
bleeding edge Ansible to be way too buggy to use. However, you can actually copy
the newest firewalld add-on python module into Ansible v1.9. However, I don’t
think it actually words, whatever version of the module your get.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_really_understanding_zones"&gt;Really understanding “zones”&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can actually create your own new zone:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_creating_a_services_file"&gt;Creating a services file&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It should look like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;service&amp;gt;
  &amp;lt;short&amp;gt;Some Service&amp;lt;/short&amp;gt;
  &amp;lt;description&amp;gt;Something very descriptive&amp;lt;/description&amp;gt;
  &amp;lt;port port="1234" protocol="tcp"/&amp;gt;
  &amp;lt;source ip="10.1.10.10" /&amp;gt;
&amp;lt;/service&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Put it into &lt;code&gt;/usr/lib/firewalld/services&lt;/code&gt; and run &lt;code&gt;fwr&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_needed_aliases"&gt;Needed aliases&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;alias fw='firewall-cmd'
alias fwz='fw --zone'
alias fwp='fw --permanent'
alias fwr='fw --runtime-to-permanent'
alias fwpz='fw --permanent --zone'
alias fwl='fw --list-all-zones'&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_gotchas"&gt;Gotchas&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Sometimes you want to specify a &lt;em&gt;source&lt;/em&gt; and &lt;em&gt;port&lt;/em&gt;. But it’s not at all obvious
when it’s an &lt;em&gt;AND&lt;/em&gt; or &lt;em&gt;OR&lt;/em&gt; specification. No one seems to mention this. But I
did find this gem in the &lt;code&gt;firewalld.zone&lt;/code&gt; man page:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The default target is {chain}_ZONE_{zone} and will be used if the target is not
specified. If other than the default target is used, all settings except
interface and source are ignored, because the first rule created in firewall for
this zone is 'jump to target'.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To discover all the man pages, in Zsh do &lt;code&gt;man firewalld«tab»&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;firewalld                     firewalld.lockdown-whitelist
firewalld.conf                firewalld.richlanguage
firewalld.dbus                firewalld.service
firewalld.direct              firewalld.zone
firewalld.icmptype            firewalld.zones&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Thu, 27 Aug 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: sysadmins Firewalld is the replacement for iptables in RedHat-family distros. Like it or not, you’ll probably end up having to wrestle with it at some point. I’ve read several articles describing it with an overview, but most miss out on important subtleties of a tool that’s in production but maybe not friendly enough for prime time. Here you’ll find my guide to getting the most out of Firewalld and avoiding its gotchas. The commands get long, long, and very long to type frequently. What’s worse is that it seems you usually need to repeat them with a --permanent option, which is painful and easy to forget. Command line completion There appears to be a bash completer. I haven’t tried it since I’m fully in Zsh land these days for all activities. It’s not any RH repo I’m aware of anyway, so let’s forget it. Firewalld supports a poor man’s version of completion. Instead of typing --zone, you can just type --zo or even --z. You’d have to memorize how much of each option is unambiguous. So you still have to type --list-all-z to get --list-all-zones. So aliases are the way to go. I did write a Zsh completer here, if you want to use it. Ansible support TLDR: don’t bother with Ansible for Firewalld. Even if you do, you’ll likely need to experiment with firewall-cmd to get your rules right. Ansible’s new version 2 purports to support most of the full set of options, including --source, which I use frequently. Unfortunately, I’ve found this bleeding edge Ansible to be way too buggy to use. However, you can actually copy the newest firewalld add-on python module into Ansible v1.9. However, I don’t think it actually words, whatever version of the module your get. Really understanding “zones” You can actually create your own new zone: Creating a services file It should look like this: &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &amp;lt;service&amp;gt; &amp;lt;short&amp;gt;Some Service&amp;lt;/short&amp;gt; &amp;lt;description&amp;gt;Something very descriptive&amp;lt;/description&amp;gt; &amp;lt;port port="1234" protocol="tcp"/&amp;gt; &amp;lt;source ip="10.1.10.10" /&amp;gt; &amp;lt;/service&amp;gt; Put it into /usr/lib/firewalld/services and run fwr. Needed aliases alias fw='firewall-cmd' alias fwz='fw --zone' alias fwp='fw --permanent' alias fwr='fw --runtime-to-permanent' alias fwpz='fw --permanent --zone' alias fwl='fw --list-all-zones' Gotchas Sometimes you want to specify a source and port. But it’s not at all obvious when it’s an AND or OR specification. No one seems to mention this. But I did find this gem in the firewalld.zone man page: The default target is {chain}_ZONE_{zone} and will be used if the target is not specified. If other than the default target is used, all settings except interface and source are ignored, because the first rule created in firewall for this zone is 'jump to target'. To discover all the man pages, in Zsh do man firewalld«tab» firewalld firewalld.lockdown-whitelist firewalld.conf firewalld.richlanguage firewalld.dbus firewalld.service firewalld.direct firewalld.zone firewalld.icmptype firewalld.zones</itunes:subtitle><itunes:summary>Audience: sysadmins Firewalld is the replacement for iptables in RedHat-family distros. Like it or not, you’ll probably end up having to wrestle with it at some point. I’ve read several articles describing it with an overview, but most miss out on important subtleties of a tool that’s in production but maybe not friendly enough for prime time. Here you’ll find my guide to getting the most out of Firewalld and avoiding its gotchas. The commands get long, long, and very long to type frequently. What’s worse is that it seems you usually need to repeat them with a --permanent option, which is painful and easy to forget. Command line completion There appears to be a bash completer. I haven’t tried it since I’m fully in Zsh land these days for all activities. It’s not any RH repo I’m aware of anyway, so let’s forget it. Firewalld supports a poor man’s version of completion. Instead of typing --zone, you can just type --zo or even --z. You’d have to memorize how much of each option is unambiguous. So you still have to type --list-all-z to get --list-all-zones. So aliases are the way to go. I did write a Zsh completer here, if you want to use it. Ansible support TLDR: don’t bother with Ansible for Firewalld. Even if you do, you’ll likely need to experiment with firewall-cmd to get your rules right. Ansible’s new version 2 purports to support most of the full set of options, including --source, which I use frequently. Unfortunately, I’ve found this bleeding edge Ansible to be way too buggy to use. However, you can actually copy the newest firewalld add-on python module into Ansible v1.9. However, I don’t think it actually words, whatever version of the module your get. Really understanding “zones” You can actually create your own new zone: Creating a services file It should look like this: &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &amp;lt;service&amp;gt; &amp;lt;short&amp;gt;Some Service&amp;lt;/short&amp;gt; &amp;lt;description&amp;gt;Something very descriptive&amp;lt;/description&amp;gt; &amp;lt;port port="1234" protocol="tcp"/&amp;gt; &amp;lt;source ip="10.1.10.10" /&amp;gt; &amp;lt;/service&amp;gt; Put it into /usr/lib/firewalld/services and run fwr. Needed aliases alias fw='firewall-cmd' alias fwz='fw --zone' alias fwp='fw --permanent' alias fwr='fw --runtime-to-permanent' alias fwpz='fw --permanent --zone' alias fwl='fw --list-all-zones' Gotchas Sometimes you want to specify a source and port. But it’s not at all obvious when it’s an AND or OR specification. No one seems to mention this. But I did find this gem in the firewalld.zone man page: The default target is {chain}_ZONE_{zone} and will be used if the target is not specified. If other than the default target is used, all settings except interface and source are ignored, because the first rule created in firewall for this zone is 'jump to target'. To discover all the man pages, in Zsh do man firewalld«tab» firewalld firewalld.lockdown-whitelist firewalld.conf firewalld.richlanguage firewalld.dbus firewalld.service firewalld.direct firewalld.zone firewalld.icmptype firewalld.zones</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-08-20-vim-sexp-cheat-sheet.html
</guid>
<link>
http://micahelliott.com/posts/2015-08-20-vim-sexp-cheat-sheet.html
</link>
<title>
Vim Sexp Cheat Sheet
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;There are two fantastic Vim plugins that make it delightful to edit
parentheses-heavy Lisp code (e.g., Racket or Clojure). I don’t know
how I lived without making much use of these for years: &lt;em&gt;parentheses can be
terribly unwieldy&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/guns/vim-sexp"&gt;Vim-Sexp&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/tpope/vim-sexp-mappings-for-regular-people"&gt;Sexp for Regular People&lt;/a&gt;,
aka SRP, pronounced “Syrup”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Install them both now if you haven’t already! And read on for &lt;strong&gt;the cheat sheet
that makes wrangling parentheses a walk in the park&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you don’t grok Vim yet, there is surprisingly little you need to know to get
started editing a Lisp with Vim. [Read this post to get started.]&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Emacs users know that what appear to be a preponderance of brackets are
really hooks the editor may use to effortlessly transform the text before
them.&amp;#8201;&amp;#8212;&amp;#8201;guns (author of vim-sexp)&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Emacs has been the go-to environment for Lisp hackers for years. One of its
particularly compelling features is “paredit”. Vim has a paredit, too, which is
used as part of the SLIMV stack. I feel that SLIMV tries to do too much to your
Vim, so now I’m telling you about a lighter solution: the Sexp/SRP combo.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;SRP has a short README that describes all of its mappings, and it gets you most
of the way to bliss. But there are a few from Sexp that are still very handy.
Unlike SRP, Sexp has a lot of documentation, in both its README and vimdoc. This
guide puts together the docs from both projects into a short, memorizable cheat
sheet, choosing what I feel are the simplest/best set. These mostly avoid the
&lt;a href="http://stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim"&gt;troublesome
Alt/Meta&lt;/a&gt; leader (which tpope doesn’t like much), and visual selection
(sometimes a crutch). Where &lt;code&gt;&amp;lt;leader&amp;gt;&lt;/code&gt; is still needed, I’ve just marked &lt;code&gt;,&lt;/code&gt; (my
leader) for brevity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# Movement
()      move cursor to matching paren (same as % but easier) _[SEXP]_
[[ ]]   move cursor to top-level element _[SEXP]_
W B E   move cursor element/form-wise&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# Indent
==      indent form  _[SEXP]_
=-      indent top level _[SEXP]_
=&amp;lt;movement&amp;gt;  indent whatever&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# Move elements/forms around
&amp;gt;e &amp;lt;e     move element right/left
&amp;gt;f &amp;lt;f     move form right/left
&amp;lt;m- j h&amp;gt;  move elt left/right _[SEXP fast alternative]_ — but don’t use meta
&amp;lt;m- k l&amp;gt;  move elt left/right _[SEXP fast alternative]_ — but don’t use meta&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# Slurpage and barfage
&amp;lt;( &amp;gt;)       slurp (push paren out wider)
&amp;gt;( &amp;lt;)       barf  (pull paren in narrower)
&amp;lt;m-s- H L&amp;gt;  slurp _[SEXP alternative]_ — but don’t use meta
&amp;lt;m-s- K J&amp;gt;  barf  _[SEXP alternative]_ — but don’t use meta&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# Insertion, some with new parens
cse)     add surround form — easier than ysie)
&amp;lt;I &amp;gt;I    insert front/end — don’t use, too diff from ,i/,I
,h ,l    insert front/end _[SEXP]_
,i ,I    insert front/end, add surround form _[SEXP]_
,w ,W    insert front/end, add surround element _[SEXP]_&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# Deletion
dsf      delete form (splice ,@)
daf dif  delete around/in form
,o       delete outer form _[SEXP]_&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Note that SRP builds off of another of tpope’s concepts:
&lt;a href="https://github.com/tpope/vim-surround"&gt;Surround&lt;/a&gt;. That’s a
good one to install and learn for any type of editing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I struggled with these for many hours. The slurp and barf are especially hard
to get your head around, so be patient. Get a simple function to experiment
with, and add some extra spacing to make forms/elements stand apart. Then
try out every mapping listed above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You probably also want to install &lt;a href="https://github.com/tpope/vim-repeat"&gt;Repeat&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Also &lt;a href="http://stackoverflow.com/a/31999765/326516"&gt;read this answer&lt;/a&gt; for more info
on using Vim to edit Lisp.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_caveats"&gt;Caveats&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;inline comments can get in the way&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;undo is funky since some commands do multiple things&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_demo"&gt;Demo&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Similar to the &lt;a href="http://emacswiki.org/emacs/PareditCheatsheet"&gt;Emacs Wiki Cheat Sheet&lt;/a&gt;.
But this is way better than Emacs’ paredit where various things are mapped to
arrow keys, forcing an atrocious hand move. Oh, for shame.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You need to actually try these&amp;#8230;&amp;#8203; a lot. But to give you an idea, see below. The
&lt;code&gt;^&lt;/code&gt; is where your cursor is. The &lt;code&gt;&lt;em&gt;&lt;/code&gt; is where your cursor is in _insert&lt;/em&gt; mode.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa bbb)
        ^       (
(aaa bbb)
^&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa bbb)
      ^         &amp;lt;e
(bbb aaa)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa bbb) (ccc ddd)
      ^                 &amp;gt;f
(ccc ddd) (aaa bbb)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;((aaa bbb) ccc)
       ^                &amp;gt;)  slurp
((aaa bbb ccc))&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;((aaa bbb) ccc)
   ^                    &amp;lt;)  barf
((aaa) bbb ccc)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa bbb) (ccc ddd)
            ^           yss)
((aaa bbb) (ccc ddd))&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa bbb)
      ^         &amp;lt;I  insert
(_ aaa bbb)
 ^&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa bbb)
      ^         ,i  surround and insert
(_ (aaa bbb))
 ^&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa bbb)
      ^         ,w  surround and insert word
(aaa (_ bbb))
      ^&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa (bbb ccc))
       ^        dsf
(aaa bbb ccc)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa (bbb ccc))
       ^        daf
(aaa )
     ^&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;(aaa (bbb ccc))
       ^        ,o
(bbb ccc)
        ^&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Thu, 20 Aug 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>There are two fantastic Vim plugins that make it delightful to edit parentheses-heavy Lisp code (e.g., Racket or Clojure). I don’t know how I lived without making much use of these for years: parentheses can be terribly unwieldy. Vim-Sexp Sexp for Regular People, aka SRP, pronounced “Syrup” Install them both now if you haven’t already! And read on for the cheat sheet that makes wrangling parentheses a walk in the park. If you don’t grok Vim yet, there is surprisingly little you need to know to get started editing a Lisp with Vim. [Read this post to get started.] Emacs users know that what appear to be a preponderance of brackets are really hooks the editor may use to effortlessly transform the text before them.&amp;#8201;&amp;#8212;&amp;#8201;guns (author of vim-sexp) Emacs has been the go-to environment for Lisp hackers for years. One of its particularly compelling features is “paredit”. Vim has a paredit, too, which is used as part of the SLIMV stack. I feel that SLIMV tries to do too much to your Vim, so now I’m telling you about a lighter solution: the Sexp/SRP combo. SRP has a short README that describes all of its mappings, and it gets you most of the way to bliss. But there are a few from Sexp that are still very handy. Unlike SRP, Sexp has a lot of documentation, in both its README and vimdoc. This guide puts together the docs from both projects into a short, memorizable cheat sheet, choosing what I feel are the simplest/best set. These mostly avoid the troublesome Alt/Meta leader (which tpope doesn’t like much), and visual selection (sometimes a crutch). Where &amp;lt;leader&amp;gt; is still needed, I’ve just marked , (my leader) for brevity. # Movement () move cursor to matching paren (same as % but easier) _[SEXP]_ [[ ]] move cursor to top-level element _[SEXP]_ W B E move cursor element/form-wise # Indent == indent form _[SEXP]_ =- indent top level _[SEXP]_ =&amp;lt;movement&amp;gt; indent whatever # Move elements/forms around &amp;gt;e &amp;lt;e move element right/left &amp;gt;f &amp;lt;f move form right/left &amp;lt;m- j h&amp;gt; move elt left/right _[SEXP fast alternative]_ — but don’t use meta &amp;lt;m- k l&amp;gt; move elt left/right _[SEXP fast alternative]_ — but don’t use meta # Slurpage and barfage &amp;lt;( &amp;gt;) slurp (push paren out wider) &amp;gt;( &amp;lt;) barf (pull paren in narrower) &amp;lt;m-s- H L&amp;gt; slurp _[SEXP alternative]_ — but don’t use meta &amp;lt;m-s- K J&amp;gt; barf _[SEXP alternative]_ — but don’t use meta # Insertion, some with new parens cse) add surround form — easier than ysie) &amp;lt;I &amp;gt;I insert front/end — don’t use, too diff from ,i/,I ,h ,l insert front/end _[SEXP]_ ,i ,I insert front/end, add surround form _[SEXP]_ ,w ,W insert front/end, add surround element _[SEXP]_ # Deletion dsf delete form (splice ,@) daf dif delete around/in form ,o delete outer form _[SEXP]_ Note that SRP builds off of another of tpope’s concepts: Surround. That’s a good one to install and learn for any type of editing. I struggled with these for many hours. The slurp and barf are especially hard to get your head around, so be patient. Get a simple function to experiment with, and add some extra spacing to make forms/elements stand apart. Then try out every mapping listed above. You probably also want to install Repeat. Also read this answer for more info on using Vim to edit Lisp. Caveats inline comments can get in the way undo is funky since some commands do multiple things Demo Similar to the Emacs Wiki Cheat Sheet. But this is way better than Emacs’ paredit where various things are mapped to arrow keys, forcing an atrocious hand move. Oh, for shame. You need to actually try these&amp;#8230;&amp;#8203; a lot. But to give you an idea, see below. The ^ is where your cursor is. The is where your cursor is in _insert mode. (aaa bbb) ^ ( (aaa bbb) ^ (aaa bbb) ^ &amp;lt;e (bbb aaa) (aaa bbb) (ccc ddd) ^ &amp;gt;f (ccc ddd) (aaa bbb) ((aaa bbb) ccc) ^ &amp;gt;) slurp ((aaa bbb ccc)) ((aaa bbb) ccc) ^ &amp;lt;) barf ((aaa) bbb ccc) (aaa bbb) (ccc ddd) ^ yss) ((aaa bbb) (ccc ddd)) (aaa bbb) ^ &amp;lt;I insert (_ aaa bbb) ^ (aaa bbb) ^ ,i surround and insert (_ (aaa bbb)) ^ (aaa bbb) ^ ,w surround and insert word (aaa (_ bbb)) ^ (aaa (bbb ccc)) ^ dsf (aaa bbb ccc) (aaa (bbb ccc)) ^ daf (aaa ) ^ (aaa (bbb ccc)) ^ ,o (bbb ccc) ^</itunes:subtitle><itunes:summary>There are two fantastic Vim plugins that make it delightful to edit parentheses-heavy Lisp code (e.g., Racket or Clojure). I don’t know how I lived without making much use of these for years: parentheses can be terribly unwieldy. Vim-Sexp Sexp for Regular People, aka SRP, pronounced “Syrup” Install them both now if you haven’t already! And read on for the cheat sheet that makes wrangling parentheses a walk in the park. If you don’t grok Vim yet, there is surprisingly little you need to know to get started editing a Lisp with Vim. [Read this post to get started.] Emacs users know that what appear to be a preponderance of brackets are really hooks the editor may use to effortlessly transform the text before them.&amp;#8201;&amp;#8212;&amp;#8201;guns (author of vim-sexp) Emacs has been the go-to environment for Lisp hackers for years. One of its particularly compelling features is “paredit”. Vim has a paredit, too, which is used as part of the SLIMV stack. I feel that SLIMV tries to do too much to your Vim, so now I’m telling you about a lighter solution: the Sexp/SRP combo. SRP has a short README that describes all of its mappings, and it gets you most of the way to bliss. But there are a few from Sexp that are still very handy. Unlike SRP, Sexp has a lot of documentation, in both its README and vimdoc. This guide puts together the docs from both projects into a short, memorizable cheat sheet, choosing what I feel are the simplest/best set. These mostly avoid the troublesome Alt/Meta leader (which tpope doesn’t like much), and visual selection (sometimes a crutch). Where &amp;lt;leader&amp;gt; is still needed, I’ve just marked , (my leader) for brevity. # Movement () move cursor to matching paren (same as % but easier) _[SEXP]_ [[ ]] move cursor to top-level element _[SEXP]_ W B E move cursor element/form-wise # Indent == indent form _[SEXP]_ =- indent top level _[SEXP]_ =&amp;lt;movement&amp;gt; indent whatever # Move elements/forms around &amp;gt;e &amp;lt;e move element right/left &amp;gt;f &amp;lt;f move form right/left &amp;lt;m- j h&amp;gt; move elt left/right _[SEXP fast alternative]_ — but don’t use meta &amp;lt;m- k l&amp;gt; move elt left/right _[SEXP fast alternative]_ — but don’t use meta # Slurpage and barfage &amp;lt;( &amp;gt;) slurp (push paren out wider) &amp;gt;( &amp;lt;) barf (pull paren in narrower) &amp;lt;m-s- H L&amp;gt; slurp _[SEXP alternative]_ — but don’t use meta &amp;lt;m-s- K J&amp;gt; barf _[SEXP alternative]_ — but don’t use meta # Insertion, some with new parens cse) add surround form — easier than ysie) &amp;lt;I &amp;gt;I insert front/end — don’t use, too diff from ,i/,I ,h ,l insert front/end _[SEXP]_ ,i ,I insert front/end, add surround form _[SEXP]_ ,w ,W insert front/end, add surround element _[SEXP]_ # Deletion dsf delete form (splice ,@) daf dif delete around/in form ,o delete outer form _[SEXP]_ Note that SRP builds off of another of tpope’s concepts: Surround. That’s a good one to install and learn for any type of editing. I struggled with these for many hours. The slurp and barf are especially hard to get your head around, so be patient. Get a simple function to experiment with, and add some extra spacing to make forms/elements stand apart. Then try out every mapping listed above. You probably also want to install Repeat. Also read this answer for more info on using Vim to edit Lisp. Caveats inline comments can get in the way undo is funky since some commands do multiple things Demo Similar to the Emacs Wiki Cheat Sheet. But this is way better than Emacs’ paredit where various things are mapped to arrow keys, forcing an atrocious hand move. Oh, for shame. You need to actually try these&amp;#8230;&amp;#8203; a lot. But to give you an idea, see below. The ^ is where your cursor is. The is where your cursor is in _insert mode. (aaa bbb) ^ ( (aaa bbb) ^ (aaa bbb) ^ &amp;lt;e (bbb aaa) (aaa bbb) (ccc ddd) ^ &amp;gt;f (ccc ddd) (aaa bbb) ((aaa bbb) ccc) ^ &amp;gt;) slurp ((aaa bbb ccc)) ((aaa bbb) ccc) ^ &amp;lt;) barf ((aaa) bbb ccc) (aaa bbb) (ccc ddd) ^ yss) ((aaa bbb) (ccc ddd)) (aaa bbb) ^ &amp;lt;I insert (_ aaa bbb) ^ (aaa bbb) ^ ,i surround and insert (_ (aaa bbb)) ^ (aaa bbb) ^ ,w surround and insert word (aaa (_ bbb)) ^ (aaa (bbb ccc)) ^ dsf (aaa bbb ccc) (aaa (bbb ccc)) ^ daf (aaa ) ^ (aaa (bbb ccc)) ^ ,o (bbb ccc) ^</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-08-08-gpg-howto.html
</guid>
<link>
http://micahelliott.com/posts/2015-08-08-gpg-howto.html
</link>
<title>
GPG Howto
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;anyone&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Keywords:&lt;/strong&gt; &lt;em&gt;gpg security privacy encryption&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;❧❧❧&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;At one point I thought changing my name might help with privacy, but that was
before the Internet. &lt;em&gt;— Olivia Wilde&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Have you ever told a secret to a friend? Made a transaction at your bank?
Wrote an entry in your diary? Invented a secret handshake? Been to the doctor?
Got a "steal" sign from your baseball coach? All of these should
be private&amp;#8201;&amp;#8212;&amp;#8201;between you and the person or thing you&amp;#8217;re communicating with.
There are two main technical standards for privacy: TLS/SSL and OpenPGP.
TLS/SSL are what&amp;#8217;s used to secure the forms you fill out on web pages, and
handle secure "connections". In this episode we&amp;#8217;ll learn all about OpenPGP,
AKA Pretty Good Privacy. This is what&amp;#8217;s used to encrypt, sign, and verify
(prove who the person is) any message or file you write or read. It uses a
pair of "keys" to do these jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;GPG is the tool we&amp;#8217;ll focus on that implements the OpenPGP standard. It&amp;#8217;s been
around for 20+ years and is &lt;em&gt;the&lt;/em&gt; industry standard for encrypting, signing,
and verifying the contents and senders of messages and files. It&amp;#8217;s also pretty
fun to use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The users of OpenPGP form a club of folks who want to build a "Web Of Trust"
(WOT). Anyone can get in; all you need is:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="olist arabic"&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;
&lt;p&gt;A little knowledge of the &lt;code&gt;gpg&lt;/code&gt; tool (which you&amp;#8217;ll get here)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some official identification for yourself&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A willingness to meet people to verify their identity and sign their keys&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;(I hope you&amp;#8217;re already using Zsh. If not, see previous episodes to get up to
speed.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Zsh has great command completion for &lt;code&gt;gpg&lt;/code&gt;. Make sure you&amp;#8217;re &lt;code&gt;tab&lt;/code&gt;-ing all the
time to auto-complete options and arguments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_is_it_worth_the_effort_trouble"&gt;Is it worth the effort/trouble?&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In order to join certain mailing lists and development groups (fedora), the
first thing you may be asked for is your GPG public key.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Some people you work with are going to require that your emails to them be
signed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you develop and distribute a software package, many of your users may
expect to be able to download your public key in order to verify that the
software comes from you. (&lt;code&gt;pacman -Qi coreutils&lt;/code&gt;).
(&lt;a href="https://wiki.archlinux.org/index.php/pacman-key" class="bare"&gt;https://wiki.archlinux.org/index.php/pacman-key&lt;/a&gt;) Though it&amp;#8217;s more typically
just a hash (MD5/SHA1).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_go_get_some_official_identification"&gt;Go get some official identification&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To make any of this OpenPGP stuff legit, you&amp;#8217;re going to need some real ID.
Many kids don&amp;#8217;t have ready access to a common ID card. But they should.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You absolutely need some sort of official ID. This could be a driver&amp;#8217;s
licence, identification card (get this from your local DMV; no age
requirement), school student-body card, birth certificate/card, social
security card.
([ID cards in California](&lt;a href="http://www.dmv.ca.gov/dl/dl_info.htm#idcard)" class="bare"&gt;http://www.dmv.ca.gov/dl/dl_info.htm#idcard)&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you don&amp;#8217;t think you have a need for a passport, just pick up a state ID
card from your DMV. It&amp;#8217;s easy and cheap. Too many kids don&amp;#8217;t have ID
that they can readily show. So go get one.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_commands_not_options"&gt;Commands (not options)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;GPG has several &lt;strong&gt;commands&lt;/strong&gt;. They come near the end of the invocation. The ones
we&amp;#8217;ll care about are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;--gen-key
--gen-revoke
--list-keys    -k
--verify
--encrypt      -e
--decrypt      -d
--sign         -s
--cl(earsign)
--fin(gerprint)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Some later uses:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;--fingerprint
--recv-keys
--send-keys
--edit-key&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Options&lt;/strong&gt; alter the way commands behave. Most of the options we can set
permanently in our config file. We&amp;#8217;ll get to that later. But here are some
important ones:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;--armor
--recipient   -r&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_creating_your_own_key"&gt;Creating your own key&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When creating your keys, you&amp;#8217;ll want to ensure that your name is identical to
what&amp;#8217;s on your ID cards. If you use your middle name or initial on them, type
it exactly as it shows on them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;% gpg --gen-key
&amp;gt; 1
&amp;gt; 4096
&amp;gt; 1y
&amp;gt; Your Full Real Name
&amp;gt; you@yourmail.com
&amp;gt; student and hacker
&amp;gt; confirm&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now you need to generate some entropy! Moving your mouse around as instructed
might not be enough. Here&amp;#8217;s something to run which will speed things up.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;% haveged -n 0 | dieharder -g 200 -a&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Take a look at your new key!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;gpg --list-keys&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;gpg --list-keys you«tab»&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_revocation_key"&gt;Revocation key&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_adding_a_picture"&gt;Adding a picture&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Your pic should be a JPEG of dimensions 240 wide by 288 tall. Aim for 4 KB in
size. If you don&amp;#8217;t have a good headshot, use your webcam with a solid
background. Capture part of your shoulderblades, and all of your head. Crop it
down, and export to a fairly low resolution/quality. I like &lt;code&gt;gimp&lt;/code&gt; for this.
Tune the size until you get down to ~4KB. (show vid of how to do this)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now let&amp;#8217;s add it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;gpg --edit-key &amp;lt;your-key-ID&amp;gt; addphoto
&amp;gt; /full/path/to/you.jpg
&amp;gt; save&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;GnuPG will then ask you for the filename of your JPEG image. Specify the
complete path.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_configuration"&gt;Configuration&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There&amp;#8217;s a file in your &lt;code&gt;~/.gnupg&lt;/code&gt; directory called &lt;code&gt;gpg.conf&lt;/code&gt;. This contains
several settings that affect the way &lt;code&gt;gpg&lt;/code&gt; behaves. Here are the settings
you&amp;#8217;ll want to enable:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;% vim ~/.gnupg/gpg.conf
---
keyserver hkp://keys.gnupg.net
no-greeting
keyserver-options auto-key-retrieve
armor
list-options show-photos
photo-viewer "feh --title 'GPG: KeyID 0x%k' %i"
keyid-format long&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_upload_your_key_to_a_key_server"&gt;Upload your key to a key server&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Upload your key after once you&amp;#8217;re absolutely certain you&amp;#8217;ve done this as
described. Once a key gets posted, the only way to remove it is with a
revocation key.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_getting_others_keys"&gt;Getting others' keys&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;gpg --recv-keys&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;gpg --import&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Get a [well trusted GPG guru&amp;#8217;s key](&lt;a href="http://pgp.mit.edu/pks/lookup?op=vindex&amp;amp;search=0x9CDD9A214EBA9723" class="bare"&gt;http://pgp.mit.edu/pks/lookup?op=vindex&amp;amp;search=0x9CDD9A214EBA9723&lt;/a&gt;). Take a look at that page and note that his &lt;em&gt;keyID&lt;/em&gt; is &lt;code&gt;4EBA9723&lt;/code&gt;. Grab it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;gpg --recv-keys 4EBA9723&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now let&amp;#8217;s search for someone else&amp;#8217;s key. Visit
[the GPG search tool](&lt;a href="http://pgp.mit.edu/" class="bare"&gt;http://pgp.mit.edu/&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Actually, we can do it from the command line:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;gpg --sea(rch-keys)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Search for "Richard Stallman". Notice that there are several of them. How do
you know which to trust? Head over to his site and note his message:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;"to be really sure which key is mine, you need to get my key fingerprint
from me or follow a chain of signatures."&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here&amp;#8217;s a security legend: Bruce Schneier&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Some people post their pubkeys on their websites. Here are a couple examples:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Bruce Schneier: &lt;a href="https://www.schneier.com/contact.html" class="bare"&gt;https://www.schneier.com/contact.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Postmodern: &lt;a href="http://postmodern.github.io/contact.html" class="bare"&gt;http://postmodern.github.io/contact.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_how_to_make_sense_of_gpg_output"&gt;How to make sense of gpg output&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bruce Schneier no longer keeps his current valid key on a key server. You have
to go to his site to download it. Actually, select and copy it from that page
and paste it into &lt;code&gt;pubkey.schneier.com.asc&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now let&amp;#8217;s import it. This is essentially the same thing as a &lt;code&gt;--recv-keys&lt;/code&gt; does.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;gpg --import pubkey.schneier.com.asc&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Let&amp;#8217;s look at Bruce Schneier&amp;#8217;s GPG info:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;9A98966F&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Notice that both of these luminaries are now using 4096-bit keys. That&amp;#8217;s why
we bumped ours up, too.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_testing_dummy_keys"&gt;Testing dummy keys&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Generate a new user on your system, or partner up with a friend.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_exchanging_keys_with_people_you_meet"&gt;Exchanging keys with people you meet&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You should only sign keys for persons you meet face-to-face. The goal is to
verify their &lt;em&gt;identity&lt;/em&gt;, not how good of a person she is. Here&amp;#8217;s what you
need from them.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_inspecting_someone_s_key"&gt;Inspecting someone&amp;#8217;s key&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Check their fingerprint&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;View their picture.
    gpg --list-keys --list-options show-photo mde&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_key_signing_parties"&gt;Key-signing parties&lt;/h3&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_other_tools"&gt;Other tools&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Entropy generation (haveged, dieharder):
    haveged -n 0 | dieharder -g 200 -a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Seahorse key manager GUI&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_other_cool_uses_for_gpg"&gt;Other cool uses for GPG&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;bitcoin privacy&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_terminology"&gt;Terminology&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Web Of Trust (WOT)&amp;#8201;&amp;#8212;&amp;#8201;a network of folks who have signed each others' keys&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;subkey&amp;#8201;&amp;#8212;&amp;#8201;same as a pubkey (public key); pub and priv are each "sub"-keys
since it takes them both together to make the "full" key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;key server&amp;#8201;&amp;#8212;&amp;#8201;keys.gnupg.net, pgp.mit.edu&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PKI&amp;#8201;&amp;#8212;&amp;#8201;Public Key Infrastructure (the systems, people, and keys that service the WOT)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gpg&lt;/code&gt;&amp;#8201;&amp;#8212;&amp;#8201;CLI interface with a lot of options&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;.asc&lt;/code&gt;&amp;#8201;&amp;#8212;&amp;#8201;a plain ASCII file encoding; basically plain readable (not binary) text&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;.sig&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fingerprint&amp;#8201;&amp;#8212;&amp;#8201;a long hex string identifying they person/key; view with:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;keyID&amp;#8201;&amp;#8212;&amp;#8201;a short version of the fingerprint; these are shown everywhere! eg, &lt;code&gt;299C28F0&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;signature&amp;#8201;&amp;#8212;&amp;#8201;the signings of a given key, the more the better&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;signing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;hkp&amp;#8201;&amp;#8212;&amp;#8201;Horowitz Key Protocol, eg: hkp://pgp.mit.edu&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;certificate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;non-repudiation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rsa&amp;#8201;&amp;#8212;&amp;#8201;the only algorithm you&amp;#8217;ll want to use&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;base64&amp;#8201;&amp;#8212;&amp;#8201;the encoding of ascii you can read&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Sat, 08 Aug 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: anyone Keywords: gpg security privacy encryption ❧❧❧ At one point I thought changing my name might help with privacy, but that was before the Internet. — Olivia Wilde Have you ever told a secret to a friend? Made a transaction at your bank? Wrote an entry in your diary? Invented a secret handshake? Been to the doctor? Got a "steal" sign from your baseball coach? All of these should be private&amp;#8201;&amp;#8212;&amp;#8201;between you and the person or thing you&amp;#8217;re communicating with. There are two main technical standards for privacy: TLS/SSL and OpenPGP. TLS/SSL are what&amp;#8217;s used to secure the forms you fill out on web pages, and handle secure "connections". In this episode we&amp;#8217;ll learn all about OpenPGP, AKA Pretty Good Privacy. This is what&amp;#8217;s used to encrypt, sign, and verify (prove who the person is) any message or file you write or read. It uses a pair of "keys" to do these jobs. GPG is the tool we&amp;#8217;ll focus on that implements the OpenPGP standard. It&amp;#8217;s been around for 20+ years and is the industry standard for encrypting, signing, and verifying the contents and senders of messages and files. It&amp;#8217;s also pretty fun to use. The users of OpenPGP form a club of folks who want to build a "Web Of Trust" (WOT). Anyone can get in; all you need is: A little knowledge of the gpg tool (which you&amp;#8217;ll get here) Some official identification for yourself A willingness to meet people to verify their identity and sign their keys (I hope you&amp;#8217;re already using Zsh. If not, see previous episodes to get up to speed.) Zsh has great command completion for gpg. Make sure you&amp;#8217;re tab-ing all the time to auto-complete options and arguments. Is it worth the effort/trouble? In order to join certain mailing lists and development groups (fedora), the first thing you may be asked for is your GPG public key. Some people you work with are going to require that your emails to them be signed. If you develop and distribute a software package, many of your users may expect to be able to download your public key in order to verify that the software comes from you. (pacman -Qi coreutils). (https://wiki.archlinux.org/index.php/pacman-key) Though it&amp;#8217;s more typically just a hash (MD5/SHA1). Go get some official identification To make any of this OpenPGP stuff legit, you&amp;#8217;re going to need some real ID. Many kids don&amp;#8217;t have ready access to a common ID card. But they should. You absolutely need some sort of official ID. This could be a driver&amp;#8217;s licence, identification card (get this from your local DMV; no age requirement), school student-body card, birth certificate/card, social security card. ([ID cards in California](http://www.dmv.ca.gov/dl/dl_info.htm#idcard)) If you don&amp;#8217;t think you have a need for a passport, just pick up a state ID card from your DMV. It&amp;#8217;s easy and cheap. Too many kids don&amp;#8217;t have ID that they can readily show. So go get one. Commands (not options) GPG has several commands. They come near the end of the invocation. The ones we&amp;#8217;ll care about are: --gen-key --gen-revoke --list-keys -k --verify --encrypt -e --decrypt -d --sign -s --cl(earsign) --fin(gerprint) Some later uses: --fingerprint --recv-keys --send-keys --edit-key Options alter the way commands behave. Most of the options we can set permanently in our config file. We&amp;#8217;ll get to that later. But here are some important ones: --armor --recipient -r Creating your own key When creating your keys, you&amp;#8217;ll want to ensure that your name is identical to what&amp;#8217;s on your ID cards. If you use your middle name or initial on them, type it exactly as it shows on them. % gpg --gen-key &amp;gt; 1 &amp;gt; 4096 &amp;gt; 1y &amp;gt; Your Full Real Name &amp;gt; you@yourmail.com &amp;gt; student and hacker &amp;gt; confirm Now you need to generate some entropy! Moving your mouse around as instructed might not be enough. Here&amp;#8217;s something to run which will speed things up. % haveged -n 0 | dieharder -g 200 -a Take a look at your new key! gpg --list-keys gpg --list-keys you«tab» Revocation key Adding a picture Your pic should be a JPEG of dimensions 240 wide by 288 tall. Aim for 4 KB in size. If you don&amp;#8217;t have a good headshot, use your webcam with a solid background. Capture part of your shoulderblades, and all of your head. Crop it down, and export to a fairly low resolution/quality. I like gimp for this. Tune the size until you get down to ~4KB. (show vid of how to do this) Now let&amp;#8217;s add it. gpg --edit-key &amp;lt;your-key-ID&amp;gt; addphoto &amp;gt; /full/path/to/you.jpg &amp;gt; save GnuPG will then ask you for the filename of your JPEG image. Specify the complete path. Configuration There&amp;#8217;s a file in your ~/.gnupg directory called gpg.conf. This contains several settings that affect the way gpg behaves. Here are the settings you&amp;#8217;ll want to enable: % vim ~/.gnupg/gpg.conf --- keyserver hkp://keys.gnupg.net no-greeting keyserver-options auto-key-retrieve armor list-options show-photos photo-viewer "feh --title 'GPG: KeyID 0x%k' %i" keyid-format long Upload your key to a key server Upload your key after once you&amp;#8217;re absolutely certain you&amp;#8217;ve done this as described. Once a key gets posted, the only way to remove it is with a revocation key. Getting others' keys gpg --recv-keys gpg --import Get a [well trusted GPG guru&amp;#8217;s key](http://pgp.mit.edu/pks/lookup?op=vindex&amp;amp;search=0x9CDD9A214EBA9723). Take a look at that page and note that his keyID is 4EBA9723. Grab it. gpg --recv-keys 4EBA9723 Now let&amp;#8217;s search for someone else&amp;#8217;s key. Visit [the GPG search tool](http://pgp.mit.edu/). Actually, we can do it from the command line: gpg --sea(rch-keys) Search for "Richard Stallman". Notice that there are several of them. How do you know which to trust? Head over to his site and note his message: "to be really sure which key is mine, you need to get my key fingerprint from me or follow a chain of signatures." Here&amp;#8217;s a security legend: Bruce Schneier Some people post their pubkeys on their websites. Here are a couple examples: Bruce Schneier: https://www.schneier.com/contact.html Postmodern: http://postmodern.github.io/contact.html How to make sense of gpg output Bruce Schneier no longer keeps his current valid key on a key server. You have to go to his site to download it. Actually, select and copy it from that page and paste it into pubkey.schneier.com.asc. Now let&amp;#8217;s import it. This is essentially the same thing as a --recv-keys does. gpg --import pubkey.schneier.com.asc Let&amp;#8217;s look at Bruce Schneier&amp;#8217;s GPG info: 9A98966F Notice that both of these luminaries are now using 4096-bit keys. That&amp;#8217;s why we bumped ours up, too. Testing dummy keys Generate a new user on your system, or partner up with a friend. Exchanging keys with people you meet You should only sign keys for persons you meet face-to-face. The goal is to verify their identity, not how good of a person she is. Here&amp;#8217;s what you need from them. Inspecting someone&amp;#8217;s key Check their fingerprint View their picture. gpg --list-keys --list-options show-photo mde Key-signing parties Other tools Entropy generation (haveged, dieharder): haveged -n 0 | dieharder -g 200 -a Seahorse key manager GUI Other cool uses for GPG bitcoin privacy Terminology Web Of Trust (WOT)&amp;#8201;&amp;#8212;&amp;#8201;a network of folks who have signed each others' keys subkey&amp;#8201;&amp;#8212;&amp;#8201;same as a pubkey (public key); pub and priv are each "sub"-keys since it takes them both together to make the "full" key. key server&amp;#8201;&amp;#8212;&amp;#8201;keys.gnupg.net, pgp.mit.edu PKI&amp;#8201;&amp;#8212;&amp;#8201;Public Key Infrastructure (the systems, people, and keys that service the WOT) gpg&amp;#8201;&amp;#8212;&amp;#8201;CLI interface with a lot of options .asc&amp;#8201;&amp;#8212;&amp;#8201;a plain ASCII file encoding; basically plain readable (not binary) text .sig fingerprint&amp;#8201;&amp;#8212;&amp;#8201;a long hex string identifying they person/key; view with: keyID&amp;#8201;&amp;#8212;&amp;#8201;a short version of the fingerprint; these are shown everywhere! eg, 299C28F0 signature&amp;#8201;&amp;#8212;&amp;#8201;the signings of a given key, the more the better signing hkp&amp;#8201;&amp;#8212;&amp;#8201;Horowitz Key Protocol, eg: hkp://pgp.mit.edu certificate non-repudiation rsa&amp;#8201;&amp;#8212;&amp;#8201;the only algorithm you&amp;#8217;ll want to use base64&amp;#8201;&amp;#8212;&amp;#8201;the encoding of ascii you can read</itunes:subtitle><itunes:summary>Audience: anyone Keywords: gpg security privacy encryption ❧❧❧ At one point I thought changing my name might help with privacy, but that was before the Internet. — Olivia Wilde Have you ever told a secret to a friend? Made a transaction at your bank? Wrote an entry in your diary? Invented a secret handshake? Been to the doctor? Got a "steal" sign from your baseball coach? All of these should be private&amp;#8201;&amp;#8212;&amp;#8201;between you and the person or thing you&amp;#8217;re communicating with. There are two main technical standards for privacy: TLS/SSL and OpenPGP. TLS/SSL are what&amp;#8217;s used to secure the forms you fill out on web pages, and handle secure "connections". In this episode we&amp;#8217;ll learn all about OpenPGP, AKA Pretty Good Privacy. This is what&amp;#8217;s used to encrypt, sign, and verify (prove who the person is) any message or file you write or read. It uses a pair of "keys" to do these jobs. GPG is the tool we&amp;#8217;ll focus on that implements the OpenPGP standard. It&amp;#8217;s been around for 20+ years and is the industry standard for encrypting, signing, and verifying the contents and senders of messages and files. It&amp;#8217;s also pretty fun to use. The users of OpenPGP form a club of folks who want to build a "Web Of Trust" (WOT). Anyone can get in; all you need is: A little knowledge of the gpg tool (which you&amp;#8217;ll get here) Some official identification for yourself A willingness to meet people to verify their identity and sign their keys (I hope you&amp;#8217;re already using Zsh. If not, see previous episodes to get up to speed.) Zsh has great command completion for gpg. Make sure you&amp;#8217;re tab-ing all the time to auto-complete options and arguments. Is it worth the effort/trouble? In order to join certain mailing lists and development groups (fedora), the first thing you may be asked for is your GPG public key. Some people you work with are going to require that your emails to them be signed. If you develop and distribute a software package, many of your users may expect to be able to download your public key in order to verify that the software comes from you. (pacman -Qi coreutils). (https://wiki.archlinux.org/index.php/pacman-key) Though it&amp;#8217;s more typically just a hash (MD5/SHA1). Go get some official identification To make any of this OpenPGP stuff legit, you&amp;#8217;re going to need some real ID. Many kids don&amp;#8217;t have ready access to a common ID card. But they should. You absolutely need some sort of official ID. This could be a driver&amp;#8217;s licence, identification card (get this from your local DMV; no age requirement), school student-body card, birth certificate/card, social security card. ([ID cards in California](http://www.dmv.ca.gov/dl/dl_info.htm#idcard)) If you don&amp;#8217;t think you have a need for a passport, just pick up a state ID card from your DMV. It&amp;#8217;s easy and cheap. Too many kids don&amp;#8217;t have ID that they can readily show. So go get one. Commands (not options) GPG has several commands. They come near the end of the invocation. The ones we&amp;#8217;ll care about are: --gen-key --gen-revoke --list-keys -k --verify --encrypt -e --decrypt -d --sign -s --cl(earsign) --fin(gerprint) Some later uses: --fingerprint --recv-keys --send-keys --edit-key Options alter the way commands behave. Most of the options we can set permanently in our config file. We&amp;#8217;ll get to that later. But here are some important ones: --armor --recipient -r Creating your own key When creating your keys, you&amp;#8217;ll want to ensure that your name is identical to what&amp;#8217;s on your ID cards. If you use your middle name or initial on them, type it exactly as it shows on them. % gpg --gen-key &amp;gt; 1 &amp;gt; 4096 &amp;gt; 1y &amp;gt; Your Full Real Name &amp;gt; you@yourmail.com &amp;gt; student and hacker &amp;gt; confirm Now you need to generate some entropy! Moving your mouse around as instructed might not be enough. Here&amp;#8217;s something to run which will speed things up. % haveged -n 0 | dieharder -g 200 -a Take a look at your new key! gpg --list-keys gpg --list-keys you«tab» Revocation key Adding a picture Your pic should be a JPEG of dimensions 240 wide by 288 tall. Aim for 4 KB in size. If you don&amp;#8217;t have a good headshot, use your webcam with a solid background. Capture part of your shoulderblades, and all of your head. Crop it down, and export to a fairly low resolution/quality. I like gimp for this. Tune the size until you get down to ~4KB. (show vid of how to do this) Now let&amp;#8217;s add it. gpg --edit-key &amp;lt;your-key-ID&amp;gt; addphoto &amp;gt; /full/path/to/you.jpg &amp;gt; save GnuPG will then ask you for the filename of your JPEG image. Specify the complete path. Configuration There&amp;#8217;s a file in your ~/.gnupg directory called gpg.conf. This contains several settings that affect the way gpg behaves. Here are the settings you&amp;#8217;ll want to enable: % vim ~/.gnupg/gpg.conf --- keyserver hkp://keys.gnupg.net no-greeting keyserver-options auto-key-retrieve armor list-options show-photos photo-viewer "feh --title 'GPG: KeyID 0x%k' %i" keyid-format long Upload your key to a key server Upload your key after once you&amp;#8217;re absolutely certain you&amp;#8217;ve done this as described. Once a key gets posted, the only way to remove it is with a revocation key. Getting others' keys gpg --recv-keys gpg --import Get a [well trusted GPG guru&amp;#8217;s key](http://pgp.mit.edu/pks/lookup?op=vindex&amp;amp;search=0x9CDD9A214EBA9723). Take a look at that page and note that his keyID is 4EBA9723. Grab it. gpg --recv-keys 4EBA9723 Now let&amp;#8217;s search for someone else&amp;#8217;s key. Visit [the GPG search tool](http://pgp.mit.edu/). Actually, we can do it from the command line: gpg --sea(rch-keys) Search for "Richard Stallman". Notice that there are several of them. How do you know which to trust? Head over to his site and note his message: "to be really sure which key is mine, you need to get my key fingerprint from me or follow a chain of signatures." Here&amp;#8217;s a security legend: Bruce Schneier Some people post their pubkeys on their websites. Here are a couple examples: Bruce Schneier: https://www.schneier.com/contact.html Postmodern: http://postmodern.github.io/contact.html How to make sense of gpg output Bruce Schneier no longer keeps his current valid key on a key server. You have to go to his site to download it. Actually, select and copy it from that page and paste it into pubkey.schneier.com.asc. Now let&amp;#8217;s import it. This is essentially the same thing as a --recv-keys does. gpg --import pubkey.schneier.com.asc Let&amp;#8217;s look at Bruce Schneier&amp;#8217;s GPG info: 9A98966F Notice that both of these luminaries are now using 4096-bit keys. That&amp;#8217;s why we bumped ours up, too. Testing dummy keys Generate a new user on your system, or partner up with a friend. Exchanging keys with people you meet You should only sign keys for persons you meet face-to-face. The goal is to verify their identity, not how good of a person she is. Here&amp;#8217;s what you need from them. Inspecting someone&amp;#8217;s key Check their fingerprint View their picture. gpg --list-keys --list-options show-photo mde Key-signing parties Other tools Entropy generation (haveged, dieharder): haveged -n 0 | dieharder -g 200 -a Seahorse key manager GUI Other cool uses for GPG bitcoin privacy Terminology Web Of Trust (WOT)&amp;#8201;&amp;#8212;&amp;#8201;a network of folks who have signed each others' keys subkey&amp;#8201;&amp;#8212;&amp;#8201;same as a pubkey (public key); pub and priv are each "sub"-keys since it takes them both together to make the "full" key. key server&amp;#8201;&amp;#8212;&amp;#8201;keys.gnupg.net, pgp.mit.edu PKI&amp;#8201;&amp;#8212;&amp;#8201;Public Key Infrastructure (the systems, people, and keys that service the WOT) gpg&amp;#8201;&amp;#8212;&amp;#8201;CLI interface with a lot of options .asc&amp;#8201;&amp;#8212;&amp;#8201;a plain ASCII file encoding; basically plain readable (not binary) text .sig fingerprint&amp;#8201;&amp;#8212;&amp;#8201;a long hex string identifying they person/key; view with: keyID&amp;#8201;&amp;#8212;&amp;#8201;a short version of the fingerprint; these are shown everywhere! eg, 299C28F0 signature&amp;#8201;&amp;#8212;&amp;#8201;the signings of a given key, the more the better signing hkp&amp;#8201;&amp;#8212;&amp;#8201;Horowitz Key Protocol, eg: hkp://pgp.mit.edu certificate non-repudiation rsa&amp;#8201;&amp;#8212;&amp;#8201;the only algorithm you&amp;#8217;ll want to use base64&amp;#8201;&amp;#8212;&amp;#8201;the encoding of ascii you can read</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-07-20-stackoverflow-motivation-engine.html
</guid>
<link>
http://micahelliott.com/posts/2015-07-20-stackoverflow-motivation-engine.html
</link>
<title>
Stack Overflow’s Motivation Engine
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;programmers&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You’ve spent plenty of time on Stack Overflow. Google loves it. Several visits
per day? But unless you’re one who answers questions there, you’re probably not
aware of how they get so much participation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’ve recently been answering questions on Stack Overflow. Well, I &lt;em&gt;had to&lt;/em&gt; in
order to be able to do things like upvoting. Aren’t we obligated to upvote when
someone has taken the time to teach us something valuable? And that was the
first hook. But it turns out that SO has a very sophisticated set of motivators
to keep you participating &amp;#8230;&amp;#8203; &lt;em&gt;frequently&lt;/em&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;What first puzzled me was how so many other users there had such high
reputation. You might think that 1,000 points came from answering 1,000
questions. But it’s an elaborate point system. You feel yourself growing points
at a fairly rapid clip. It would sure be nice to have a &lt;em&gt;k&lt;/em&gt; (thousand) next to
your name, right?!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_get_busy"&gt;Get Busy!&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You eventually realize that you’re never going to be the first to answer a
question unless you’re tuned into a near real-time picture of what’s happening
with your tags of interest. The best way to earn points is to be the first to
answer and get your answer accepted. So you subscribe to be updated via email.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Every sub-site requires another set of reputation. You’ll quickly find yourself
trying to answer questions on other Stack Exchange sites.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_way_more_than_badges"&gt;Way More than Badges&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Sure, you earn badges. But you have to do more and more to earn the
next type of badge. You even have your “next badge” dangled from your
profile. The badges are more like &lt;em&gt;abilities&lt;/em&gt;. And there are three
categories of them: bronze, silver, and gold. It’s pretty challenging
to get even your first silver.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Each badge is documented. You know what you have to do to earn the
&lt;em&gt;archaeologist&lt;/em&gt; badge: edit some old posts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ultimately, people are on SO to prove their worth and get hired. So the&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_surprises"&gt;Surprises&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You’re given a pleasant surprise when they tell you that they’ve removed ads
since you’re such a great participant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There’s an invisible goal of getting to 200 points. It opens a few doors, but
you have to poke around to discover that it’s a key number. When you finally hit
it, you’re invited to join the “Careers” portal and create a resume. You also
suddenly get a 100-point boost across all the sites in the network. This was
huge!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_not_social"&gt;Not Social&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It’s pretty interesting that there is no notion of “following”. You can’t even
“message” someone.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_gaming_it"&gt;Gaming It&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’m not going to bother trying to game this, because I don’t (think) I care too
much about my reputation points. But it can be done. I see people asking
questions that they shortly thereafter answer themselves.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I suppose you could also create a dummy account that spends a lot of its time
upvoting your real posts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Mon, 20 Jul 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: programmers You’ve spent plenty of time on Stack Overflow. Google loves it. Several visits per day? But unless you’re one who answers questions there, you’re probably not aware of how they get so much participation. I’ve recently been answering questions on Stack Overflow. Well, I had to in order to be able to do things like upvoting. Aren’t we obligated to upvote when someone has taken the time to teach us something valuable? And that was the first hook. But it turns out that SO has a very sophisticated set of motivators to keep you participating &amp;#8230;&amp;#8203; frequently! What first puzzled me was how so many other users there had such high reputation. You might think that 1,000 points came from answering 1,000 questions. But it’s an elaborate point system. You feel yourself growing points at a fairly rapid clip. It would sure be nice to have a k (thousand) next to your name, right?! Get Busy! You eventually realize that you’re never going to be the first to answer a question unless you’re tuned into a near real-time picture of what’s happening with your tags of interest. The best way to earn points is to be the first to answer and get your answer accepted. So you subscribe to be updated via email. Every sub-site requires another set of reputation. You’ll quickly find yourself trying to answer questions on other Stack Exchange sites. Way More than Badges Sure, you earn badges. But you have to do more and more to earn the next type of badge. You even have your “next badge” dangled from your profile. The badges are more like abilities. And there are three categories of them: bronze, silver, and gold. It’s pretty challenging to get even your first silver. Each badge is documented. You know what you have to do to earn the archaeologist badge: edit some old posts. Ultimately, people are on SO to prove their worth and get hired. So the Surprises You’re given a pleasant surprise when they tell you that they’ve removed ads since you’re such a great participant. There’s an invisible goal of getting to 200 points. It opens a few doors, but you have to poke around to discover that it’s a key number. When you finally hit it, you’re invited to join the “Careers” portal and create a resume. You also suddenly get a 100-point boost across all the sites in the network. This was huge! Not Social It’s pretty interesting that there is no notion of “following”. You can’t even “message” someone. Gaming It I’m not going to bother trying to game this, because I don’t (think) I care too much about my reputation points. But it can be done. I see people asking questions that they shortly thereafter answer themselves. I suppose you could also create a dummy account that spends a lot of its time upvoting your real posts.</itunes:subtitle><itunes:summary>Audience: programmers You’ve spent plenty of time on Stack Overflow. Google loves it. Several visits per day? But unless you’re one who answers questions there, you’re probably not aware of how they get so much participation. I’ve recently been answering questions on Stack Overflow. Well, I had to in order to be able to do things like upvoting. Aren’t we obligated to upvote when someone has taken the time to teach us something valuable? And that was the first hook. But it turns out that SO has a very sophisticated set of motivators to keep you participating &amp;#8230;&amp;#8203; frequently! What first puzzled me was how so many other users there had such high reputation. You might think that 1,000 points came from answering 1,000 questions. But it’s an elaborate point system. You feel yourself growing points at a fairly rapid clip. It would sure be nice to have a k (thousand) next to your name, right?! Get Busy! You eventually realize that you’re never going to be the first to answer a question unless you’re tuned into a near real-time picture of what’s happening with your tags of interest. The best way to earn points is to be the first to answer and get your answer accepted. So you subscribe to be updated via email. Every sub-site requires another set of reputation. You’ll quickly find yourself trying to answer questions on other Stack Exchange sites. Way More than Badges Sure, you earn badges. But you have to do more and more to earn the next type of badge. You even have your “next badge” dangled from your profile. The badges are more like abilities. And there are three categories of them: bronze, silver, and gold. It’s pretty challenging to get even your first silver. Each badge is documented. You know what you have to do to earn the archaeologist badge: edit some old posts. Ultimately, people are on SO to prove their worth and get hired. So the Surprises You’re given a pleasant surprise when they tell you that they’ve removed ads since you’re such a great participant. There’s an invisible goal of getting to 200 points. It opens a few doors, but you have to poke around to discover that it’s a key number. When you finally hit it, you’re invited to join the “Careers” portal and create a resume. You also suddenly get a 100-point boost across all the sites in the network. This was huge! Not Social It’s pretty interesting that there is no notion of “following”. You can’t even “message” someone. Gaming It I’m not going to bother trying to game this, because I don’t (think) I care too much about my reputation points. But it can be done. I see people asking questions that they shortly thereafter answer themselves. I suppose you could also create a dummy account that spends a lot of its time upvoting your real posts.</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-07-20-vim-zsh-tmux-cursor.html
</guid>
<link>
http://micahelliott.com/posts/2015-07-20-vim-zsh-tmux-cursor.html
</link>
<title>
Vi-Mode Ubiquitous Cursor Indicator
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; &lt;em&gt;programmers&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It should be as easy as possible to tell if you’re in normal or insert mode.
Your eye tends to be on your cursor, so you’ll find the cursor to be the best
indicator of your mode. Of course, you’re effectively in Vim when in Zsh
(&lt;code&gt;bindkey -v&lt;/code&gt;, right?), too, so it should have the same cursor indicator.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This recipe has been described scattershot in various places, but never
comprehensively. This version will give you a solid block cursor in normal
mode, and a blinking, gray underscore cursor in insert mode. I’ve also set it to
green block for Zsh, blue for Vim. Change it to whatever you like. It’s big and
bright so you can easily find it. Then it’s small and flashing to remind you to
get out of insert mode. Whatever colors/styles you choose, rejoice that it now
works!&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I worked for a couple years without having this working in Tmux and it drove me
crazy. Now that it works well, I find myself using Tmux much more often.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This has been battle tested in URxvt, but it also seems to work in Xterm and
Termite.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_zsh"&gt;Zsh&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;&lt;code&gt;~/.zshrc&lt;/code&gt;&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# Modal cursor color for vi's insert/normal modes.
# http://stackoverflow.com/questions/30985436/
# https://bbs.archlinux.org/viewtopic.php?id=95078
# http://unix.stackexchange.com/questions/115009/
zle-line-init () {
  zle -K viins
  #echo -ne "\033]12;Grey\007"
  #echo -n 'grayline1'
  echo -ne "\033]12;Gray\007"
  echo -ne "\033[4 q"
  #print 'did init' &amp;gt;/dev/pts/16
}
zle -N zle-line-init
zle-keymap-select () {
  if [[ $KEYMAP == vicmd ]]; then
    if [[ -z $TMUX ]]; then
      printf "\033]12;Green\007"
      printf "\033[2 q"
    else
      printf "\033Ptmux;\033\033]12;red\007\033\\"
      printf "\033Ptmux;\033\033[2 q\033\\"
    fi
  else
    if [[ -z $TMUX ]]; then
      printf "\033]12;Grey\007"
      printf "\033[4 q"
    else
      printf "\033Ptmux;\033\033]12;grey\007\033\\"
      printf "\033Ptmux;\033\033[4 q\033\\"
    fi
  fi
  #print 'did select' &amp;gt;/dev/pts/16
}
zle -N zle-keymap-select&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_vim"&gt;Vim&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;&lt;code&gt;~/.vimrc&lt;/code&gt;&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre&gt;" http://vim.wikia.com/wiki/Configuring_the_cursor
" Tmux details: http://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursor
if &amp;amp;term =~ "xterm\\|rxvt"
  " Insert
  let &amp;amp;t_SI  = "\&amp;lt;Esc&amp;gt;]12;gray\x7"
  let &amp;amp;t_SI .= "\&amp;lt;Esc&amp;gt;[3 q"
  " Normal
  let &amp;amp;t_EI  = "\&amp;lt;Esc&amp;gt;]12;green\x7"
  let &amp;amp;t_EI .= "\&amp;lt;Esc&amp;gt;[2 q"
  autocmd VimLeave * silent !echo -ne "\033]112\007"
elseif &amp;amp;term =~ "screen-it"
  " Insert
  let &amp;amp;t_SI  = "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;]12;gray\x7\&amp;lt;Esc&amp;gt;\\"
  let &amp;amp;t_SI .= "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;[3 q\&amp;lt;Esc&amp;gt;\\"
  " Normal
  let &amp;amp;t_EI  = "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;]12;blue\x7\&amp;lt;Esc&amp;gt;\\"
  let &amp;amp;t_EI .= "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;[2 q\&amp;lt;Esc&amp;gt;\\"
  autocmd VimLeave * silent !printf "\033Ptmux;\033\033]12;grey\007\033\\"
endif&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_tmux"&gt;Tmux&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I like to keep these lines in my &lt;code&gt;.tmux.conf&lt;/code&gt; so I can easily access the
&lt;code&gt;infocmp&lt;/code&gt; and &lt;code&gt;tic&lt;/code&gt; commands to run on new machines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Note that &lt;code&gt;TERM&lt;/code&gt; will be auto-set by Tmux now to &lt;code&gt;screen-it&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;One time tmux setup commands (keep around in &lt;code&gt;~/.tmux.conf&lt;/code&gt;)&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# One-time setup for italic support (instead of reverse).
# http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/FAQ
# % infocmp screen-256color |
#   sed -e 's/^screen[^|]*|[^,]*,/screen-it|screen with italics support,/' \
#     -e 's/%?%p1%t;3%/%?%p1%t;7%/' \
#     -e 's/smso=[^,]*,/smso=\\E[7m,/' \
#     -e 's/rmso=[^,]*,/rmso=\\E[27m,/' \
#     -e '$s/$/ sitm=\\E[3m, ritm=\\E[23m,/' \
#     &amp;gt;| /tmp/screen.terminfo
# Compile and create binary file ~/.terminfo/s/screen-it
# % tic /tmp/screen.terminfo

# This is actually active.
set -g default-terminal "screen-it"&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_addendum"&gt;Addendum&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There is still an issue where on Tmux pane/window changing, the cursor stays in
the mode that its last pane/window was in.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Mon, 20 Jul 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Audience: programmers It should be as easy as possible to tell if you’re in normal or insert mode. Your eye tends to be on your cursor, so you’ll find the cursor to be the best indicator of your mode. Of course, you’re effectively in Vim when in Zsh (bindkey -v, right?), too, so it should have the same cursor indicator. This recipe has been described scattershot in various places, but never comprehensively. This version will give you a solid block cursor in normal mode, and a blinking, gray underscore cursor in insert mode. I’ve also set it to green block for Zsh, blue for Vim. Change it to whatever you like. It’s big and bright so you can easily find it. Then it’s small and flashing to remind you to get out of insert mode. Whatever colors/styles you choose, rejoice that it now works! I worked for a couple years without having this working in Tmux and it drove me crazy. Now that it works well, I find myself using Tmux much more often. This has been battle tested in URxvt, but it also seems to work in Xterm and Termite. Zsh ~/.zshrc # Modal cursor color for vi's insert/normal modes. # http://stackoverflow.com/questions/30985436/ # https://bbs.archlinux.org/viewtopic.php?id=95078 # http://unix.stackexchange.com/questions/115009/ zle-line-init () { zle -K viins #echo -ne "\033]12;Grey\007" #echo -n 'grayline1' echo -ne "\033]12;Gray\007" echo -ne "\033[4 q" #print 'did init' &amp;gt;/dev/pts/16 } zle -N zle-line-init zle-keymap-select () { if [[ $KEYMAP == vicmd ]]; then if [[ -z $TMUX ]]; then printf "\033]12;Green\007" printf "\033[2 q" else printf "\033Ptmux;\033\033]12;red\007\033\\" printf "\033Ptmux;\033\033[2 q\033\\" fi else if [[ -z $TMUX ]]; then printf "\033]12;Grey\007" printf "\033[4 q" else printf "\033Ptmux;\033\033]12;grey\007\033\\" printf "\033Ptmux;\033\033[4 q\033\\" fi fi #print 'did select' &amp;gt;/dev/pts/16 } zle -N zle-keymap-select Vim ~/.vimrc " http://vim.wikia.com/wiki/Configuring_the_cursor " Tmux details: http://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursor if &amp;amp;term =~ "xterm\\|rxvt" " Insert let &amp;amp;t_SI = "\&amp;lt;Esc&amp;gt;]12;gray\x7" let &amp;amp;t_SI .= "\&amp;lt;Esc&amp;gt;[3 q" " Normal let &amp;amp;t_EI = "\&amp;lt;Esc&amp;gt;]12;green\x7" let &amp;amp;t_EI .= "\&amp;lt;Esc&amp;gt;[2 q" autocmd VimLeave * silent !echo -ne "\033]112\007" elseif &amp;amp;term =~ "screen-it" " Insert let &amp;amp;t_SI = "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;]12;gray\x7\&amp;lt;Esc&amp;gt;\\" let &amp;amp;t_SI .= "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;[3 q\&amp;lt;Esc&amp;gt;\\" " Normal let &amp;amp;t_EI = "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;]12;blue\x7\&amp;lt;Esc&amp;gt;\\" let &amp;amp;t_EI .= "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;[2 q\&amp;lt;Esc&amp;gt;\\" autocmd VimLeave * silent !printf "\033Ptmux;\033\033]12;grey\007\033\\" endif Tmux I like to keep these lines in my .tmux.conf so I can easily access the infocmp and tic commands to run on new machines. Note that TERM will be auto-set by Tmux now to screen-it. One time tmux setup commands (keep around in ~/.tmux.conf) # One-time setup for italic support (instead of reverse). # http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/FAQ # % infocmp screen-256color | # sed -e 's/^screen[^|]*|[^,]*,/screen-it|screen with italics support,/' \ # -e 's/%?%p1%t;3%/%?%p1%t;7%/' \ # -e 's/smso=[^,]*,/smso=\\E[7m,/' \ # -e 's/rmso=[^,]*,/rmso=\\E[27m,/' \ # -e '$s/$/ sitm=\\E[3m, ritm=\\E[23m,/' \ # &amp;gt;| /tmp/screen.terminfo # Compile and create binary file ~/.terminfo/s/screen-it # % tic /tmp/screen.terminfo # This is actually active. set -g default-terminal "screen-it" Addendum There is still an issue where on Tmux pane/window changing, the cursor stays in the mode that its last pane/window was in.</itunes:subtitle><itunes:summary>Audience: programmers It should be as easy as possible to tell if you’re in normal or insert mode. Your eye tends to be on your cursor, so you’ll find the cursor to be the best indicator of your mode. Of course, you’re effectively in Vim when in Zsh (bindkey -v, right?), too, so it should have the same cursor indicator. This recipe has been described scattershot in various places, but never comprehensively. This version will give you a solid block cursor in normal mode, and a blinking, gray underscore cursor in insert mode. I’ve also set it to green block for Zsh, blue for Vim. Change it to whatever you like. It’s big and bright so you can easily find it. Then it’s small and flashing to remind you to get out of insert mode. Whatever colors/styles you choose, rejoice that it now works! I worked for a couple years without having this working in Tmux and it drove me crazy. Now that it works well, I find myself using Tmux much more often. This has been battle tested in URxvt, but it also seems to work in Xterm and Termite. Zsh ~/.zshrc # Modal cursor color for vi's insert/normal modes. # http://stackoverflow.com/questions/30985436/ # https://bbs.archlinux.org/viewtopic.php?id=95078 # http://unix.stackexchange.com/questions/115009/ zle-line-init () { zle -K viins #echo -ne "\033]12;Grey\007" #echo -n 'grayline1' echo -ne "\033]12;Gray\007" echo -ne "\033[4 q" #print 'did init' &amp;gt;/dev/pts/16 } zle -N zle-line-init zle-keymap-select () { if [[ $KEYMAP == vicmd ]]; then if [[ -z $TMUX ]]; then printf "\033]12;Green\007" printf "\033[2 q" else printf "\033Ptmux;\033\033]12;red\007\033\\" printf "\033Ptmux;\033\033[2 q\033\\" fi else if [[ -z $TMUX ]]; then printf "\033]12;Grey\007" printf "\033[4 q" else printf "\033Ptmux;\033\033]12;grey\007\033\\" printf "\033Ptmux;\033\033[4 q\033\\" fi fi #print 'did select' &amp;gt;/dev/pts/16 } zle -N zle-keymap-select Vim ~/.vimrc " http://vim.wikia.com/wiki/Configuring_the_cursor " Tmux details: http://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursor if &amp;amp;term =~ "xterm\\|rxvt" " Insert let &amp;amp;t_SI = "\&amp;lt;Esc&amp;gt;]12;gray\x7" let &amp;amp;t_SI .= "\&amp;lt;Esc&amp;gt;[3 q" " Normal let &amp;amp;t_EI = "\&amp;lt;Esc&amp;gt;]12;green\x7" let &amp;amp;t_EI .= "\&amp;lt;Esc&amp;gt;[2 q" autocmd VimLeave * silent !echo -ne "\033]112\007" elseif &amp;amp;term =~ "screen-it" " Insert let &amp;amp;t_SI = "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;]12;gray\x7\&amp;lt;Esc&amp;gt;\\" let &amp;amp;t_SI .= "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;[3 q\&amp;lt;Esc&amp;gt;\\" " Normal let &amp;amp;t_EI = "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;]12;blue\x7\&amp;lt;Esc&amp;gt;\\" let &amp;amp;t_EI .= "\&amp;lt;Esc&amp;gt;Ptmux;\&amp;lt;Esc&amp;gt;\&amp;lt;Esc&amp;gt;[2 q\&amp;lt;Esc&amp;gt;\\" autocmd VimLeave * silent !printf "\033Ptmux;\033\033]12;grey\007\033\\" endif Tmux I like to keep these lines in my .tmux.conf so I can easily access the infocmp and tic commands to run on new machines. Note that TERM will be auto-set by Tmux now to screen-it. One time tmux setup commands (keep around in ~/.tmux.conf) # One-time setup for italic support (instead of reverse). # http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/FAQ # % infocmp screen-256color | # sed -e 's/^screen[^|]*|[^,]*,/screen-it|screen with italics support,/' \ # -e 's/%?%p1%t;3%/%?%p1%t;7%/' \ # -e 's/smso=[^,]*,/smso=\\E[7m,/' \ # -e 's/rmso=[^,]*,/rmso=\\E[27m,/' \ # -e '$s/$/ sitm=\\E[3m, ritm=\\E[23m,/' \ # &amp;gt;| /tmp/screen.terminfo # Compile and create binary file ~/.terminfo/s/screen-it # % tic /tmp/screen.terminfo # This is actually active. set -g default-terminal "screen-it" Addendum There is still an issue where on Tmux pane/window changing, the cursor stays in the mode that its last pane/window was in.</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-07-13-clojure-vim-setup.html
</guid>
<link>
http://micahelliott.com/posts/2015-07-13-clojure-vim-setup.html
</link>
<title>
Clojure, Vim, nREPL, Fireplace, REDL Setup
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;These are the steps I take to set up a new Arch system with a Clojure
environment for vim.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Get lein up to date&lt;/p&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;lein update&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install new version of clojure, eg, Arch: &lt;code&gt;yaourt -S clojure&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update lein search index: &lt;code&gt;lein search whatever&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up fireplace, highlighting, mappings, sexp into &lt;code&gt;.vimrc&lt;/code&gt; with Vundle:&lt;/p&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;Plugin 'guns/vim-clojure-static.git'
Plugin 'guns/vim-clojure-highlight.git'
Plugin 'tpope/vim-leiningen.git'
Plugin 'tpope/vim-dispatch.git'
Plugin 'tpope/vim-fireplace.git'
Plugin 'tpope/vim-sexp-mappings-for-regular-people'
Plugin 'guns/vim-sexp'
Plugin 'guns/vim-slamhound'
Plugin 'dgrnbrg/redl'&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add to &lt;code&gt;~/.lein/profiles.clj&lt;/code&gt;:&lt;/p&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;{:user {:plugins [...
                  [cider/cider-nrepl "0.10.0"] ]
        :dependencies [...
                       [spyscope "0.1.5"]
                       [redl "0.2.4"] ]
        :injections [...
                     (require 'spyscope.core)
                     (require '[redl complete core]) ]}}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create new project:&lt;/p&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;lein new foo&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add to each project:&lt;/p&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;:main foo.core
:repl-options {:init-ns foo.core})&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;lein deps&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start tmux? Maybe not; slime not working now anyway&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now you need an nrepl running &lt;em&gt;somewhere&lt;/em&gt;. You can either:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Start &lt;code&gt;lein repl&lt;/code&gt; in a terminal&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Or, in vim, run: &lt;code&gt;:Console&lt;/code&gt; to fire up nrepl in a new shell (or tmux window if
tmux is running)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now finally&amp;#8230;&amp;#8203;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fire up vim if you haven’t already (fireplace will auto-connect to running nrepl)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In vim, run: &lt;code&gt;:Eval (require '[redl core complete])&lt;/code&gt; (might not be necessary for you)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start &lt;a href="https://github.com/dgrnbrg/vim-redl"&gt;redl&lt;/a&gt; with &lt;code&gt;:ReplHere&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start drip (optional)&lt;/p&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;export LEIN_JAVA_CMD=drip  # could make lein hang on app template&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop drip (later) with &lt;code&gt;drip kill&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_tldr_for_next_time"&gt;TLDR for next time&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;% cd some-project
% lein repl  # and twiddle your thumbs
% vim src/.../foo.clj
" Play with fireplace commands, like cpp
:Eval (require '[redl core complete])
:ReplHere
" Do things in vim in the real nrepl!&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Mon, 13 Jul 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>These are the steps I take to set up a new Arch system with a Clojure environment for vim. Get lein up to date lein update Install new version of clojure, eg, Arch: yaourt -S clojure Update lein search index: lein search whatever Set up fireplace, highlighting, mappings, sexp into .vimrc with Vundle: Plugin 'guns/vim-clojure-static.git' Plugin 'guns/vim-clojure-highlight.git' Plugin 'tpope/vim-leiningen.git' Plugin 'tpope/vim-dispatch.git' Plugin 'tpope/vim-fireplace.git' Plugin 'tpope/vim-sexp-mappings-for-regular-people' Plugin 'guns/vim-sexp' Plugin 'guns/vim-slamhound' Plugin 'dgrnbrg/redl' Add to ~/.lein/profiles.clj: {:user {:plugins [... [cider/cider-nrepl "0.10.0"] ] :dependencies [... [spyscope "0.1.5"] [redl "0.2.4"] ] :injections [... (require 'spyscope.core) (require '[redl complete core]) ]}} Create new project: lein new foo Add to each project: :main foo.core :repl-options {:init-ns foo.core}) Run lein deps Start tmux? Maybe not; slime not working now anyway Now you need an nrepl running somewhere. You can either: Start lein repl in a terminal Or, in vim, run: :Console to fire up nrepl in a new shell (or tmux window if tmux is running) Now finally&amp;#8230;&amp;#8203;. Fire up vim if you haven’t already (fireplace will auto-connect to running nrepl) In vim, run: :Eval (require '[redl core complete]) (might not be necessary for you) Start redl with :ReplHere Start drip (optional) export LEIN_JAVA_CMD=drip # could make lein hang on app template Stop drip (later) with drip kill TLDR for next time % cd some-project % lein repl # and twiddle your thumbs % vim src/.../foo.clj " Play with fireplace commands, like cpp :Eval (require '[redl core complete]) :ReplHere " Do things in vim in the real nrepl!</itunes:subtitle><itunes:summary>These are the steps I take to set up a new Arch system with a Clojure environment for vim. Get lein up to date lein update Install new version of clojure, eg, Arch: yaourt -S clojure Update lein search index: lein search whatever Set up fireplace, highlighting, mappings, sexp into .vimrc with Vundle: Plugin 'guns/vim-clojure-static.git' Plugin 'guns/vim-clojure-highlight.git' Plugin 'tpope/vim-leiningen.git' Plugin 'tpope/vim-dispatch.git' Plugin 'tpope/vim-fireplace.git' Plugin 'tpope/vim-sexp-mappings-for-regular-people' Plugin 'guns/vim-sexp' Plugin 'guns/vim-slamhound' Plugin 'dgrnbrg/redl' Add to ~/.lein/profiles.clj: {:user {:plugins [... [cider/cider-nrepl "0.10.0"] ] :dependencies [... [spyscope "0.1.5"] [redl "0.2.4"] ] :injections [... (require 'spyscope.core) (require '[redl complete core]) ]}} Create new project: lein new foo Add to each project: :main foo.core :repl-options {:init-ns foo.core}) Run lein deps Start tmux? Maybe not; slime not working now anyway Now you need an nrepl running somewhere. You can either: Start lein repl in a terminal Or, in vim, run: :Console to fire up nrepl in a new shell (or tmux window if tmux is running) Now finally&amp;#8230;&amp;#8203;. Fire up vim if you haven’t already (fireplace will auto-connect to running nrepl) In vim, run: :Eval (require '[redl core complete]) (might not be necessary for you) Start redl with :ReplHere Start drip (optional) export LEIN_JAVA_CMD=drip # could make lein hang on app template Stop drip (later) with drip kill TLDR for next time % cd some-project % lein repl # and twiddle your thumbs % vim src/.../foo.clj " Play with fireplace commands, like cpp :Eval (require '[redl core complete]) :ReplHere " Do things in vim in the real nrepl!</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-07-07-gists-as-blog.html
</guid>
<link>
http://micahelliott.com/posts/2015-07-07-gists-as-blog.html
</link>
<title>
Using Gist As Your Blog
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;Github&amp;#8217;s Gist is almost good enough as a blog. If you don&amp;#8217;t want to take the
time to set up your own blog, you could probably get away with using gists. As
an example, &lt;a href="https://gist.github.com/MicahElliott"&gt;this&lt;/a&gt; is a pretty decent index
display.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;


&lt;!-- &lt;iframe src="https://player.vimeo.com/video/82339989" width="500" height="529" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt; --&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_where_it_shines"&gt;Where it shines&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;nice comment system (&lt;a href="https://gist.github.com/MicahElliott/3048622"&gt;example&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;markdown support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;auto-abstracts (shortened posts in index)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;built-in editor or use git&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;store associated files with your article in a real git repo&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nothing to host yourself&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_where_it_falls_short"&gt;Where it falls short&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;no global feed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;people don&amp;#8217;t expect it to serve as your blog&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gets cluttered with other snippets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;google will not index these well&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no analytics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;it seems unlikely that someone will like your post and decide to go explore your other gists&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Gists are great. Even if you set up a real blog, you&amp;#8217;ll still want to use gists to host code samples.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Tue, 07 Jul 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Github&amp;#8217;s Gist is almost good enough as a blog. If you don&amp;#8217;t want to take the time to set up your own blog, you could probably get away with using gists. As an example, this is a pretty decent index display. -- Where it shines nice comment system (example) markdown support auto-abstracts (shortened posts in index) built-in editor or use git store associated files with your article in a real git repo nothing to host yourself Where it falls short no global feed people don&amp;#8217;t expect it to serve as your blog gets cluttered with other snippets google will not index these well no analytics it seems unlikely that someone will like your post and decide to go explore your other gists Conclusion Gists are great. Even if you set up a real blog, you&amp;#8217;ll still want to use gists to host code samples.</itunes:subtitle><itunes:summary>Github&amp;#8217;s Gist is almost good enough as a blog. If you don&amp;#8217;t want to take the time to set up your own blog, you could probably get away with using gists. As an example, this is a pretty decent index display. -- Where it shines nice comment system (example) markdown support auto-abstracts (shortened posts in index) built-in editor or use git store associated files with your article in a real git repo nothing to host yourself Where it falls short no global feed people don&amp;#8217;t expect it to serve as your blog gets cluttered with other snippets google will not index these well no analytics it seems unlikely that someone will like your post and decide to go explore your other gists Conclusion Gists are great. Even if you set up a real blog, you&amp;#8217;ll still want to use gists to host code samples.</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-07-05-docker-systemd-ansible.html
</guid>
<link>
http://micahelliott.com/posts/2015-07-05-docker-systemd-ansible.html
</link>
<title>
Docker as a Full CentOS
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;Docker has arrived. It&amp;#8217;s a "container" system for isolating services. It&amp;#8217;s
simpler and lighter than a VM, yet easier to use than a jail. But it&amp;#8217;s not
quite a full OS: it usually lacks things like systemd, cron, sshd, syslog, etc.
&lt;a href="http://phusion.github.io/baseimage-docker/"&gt;Some folks are trying to address this for Ubuntu&lt;/a&gt;.
It turns out that this can also be done with CentOS 7! This all-in-one docker
instance becomes a great vehicle for testing deploys (and probably much more).&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ubuntu wasn&amp;#8217;t going to work for my needs, but I found
&lt;a href="https://github.com/maci0/docker-systemd-unpriv"&gt;a minimal CentOS 7&lt;/a&gt;
version of the Ubuntu approach. So now Docker can actually be used for testing
deployments with almost real full OSs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_docker_with_centos_7"&gt;Docker With CentOS 7&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On your local host, stop docker if running (to reset IPs) and start up the
docker service:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;systemctl stop docker.service
systemctl start docker.service&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Maci has provided
&lt;a href="http://maci0.wordpress.com/2014/07/23/run-systemd-in-an-unprivileged-docker-container/"&gt;an article&lt;/a&gt;
and repo to get centos7 working with docker, which this article extends.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Get it (one time ever):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;git clone https://github.com/maci0/docker-systemd-unpriv
cd docker-systemd-unpriv&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Build (one time ever):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;alias dk=docker  # put in ~/.zshrc
dk build --rm -t maci/systemd .&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Fire up an instance any time, setting hostname etc:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;dk run -h dk1 --rm -t -i -p 2221:22 -v /sys/fs/cgroup:/sys/fs/cgroup:ro maci/systemd /usr/lib/systemd/systemd&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Switch to other term.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;See the IP:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;dk ps
dk inspect 097241cd8024 |grep IPAddress&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Test login:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;sshpass -p root ssh dk1
# Oops. Wipe existing/offending key.
sed -i '47d' ~/.ssh/known_hosts
sshpass -p root ssh dk1&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Manually update the system:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;yum update&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Optionally save as latest/greatest
(&lt;a href="http://stackoverflow.com/questions/19585028/i-lose-my-data-when-the-container-exits"&gt;see also&lt;/a&gt;):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;dk commit c0d3c28f5a86 mde/centos71&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Manually install the very basics, and set up a deploy user, say “dummy”:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# yum -y install openssh-clients sudo; useradd -m -G wheel dummy; passwd dummy&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Get dummy into a good state:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# su - dummy
% ssh somewhere-valid
&amp;gt; yes  # then ^c, just wanted proper .ssh/ dir created&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Set up to watch progress in a logged in shell:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;% sudo journalctl -xaf&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Copy your ssh key onto it:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;scp ~/.ssh/id_rsa.pub dk1:~/.ssh/authorized_keys&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Run ansible toward it:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;time ansible-playbook --skip=skip,security,nondocker -u dummy -b --ask-become-pass -l offsvrs:172.17.0.1 site.yml -v ; beep&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When you’re done testing, shut down instance:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;dk ps
...
dk stop ea970de7e735&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Save the image:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;dk save -o centos7-systemd-maci.img.tar maci/systemd:latest
gzip centos7-systemd-maci.img.tar&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Archive it to S3:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;s3.sh put centos7-systemd-maci.img.tar.gz s3://dockers.example.com&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_helpers"&gt;Helpers&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Generate hashed password:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;python2 -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Script to quickly remove a key, &lt;code&gt;~/bin/sshrmkey&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;#! /usr/bin/env zsh
# sshrmkey — delete a line containing stale/offending key
line=${1?Must provide offending line}
sed -i "${line}d" ~/.ssh/known_hosts&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;% sshrmkey 42&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_vagrant_virtualbox"&gt;Vagrant/Virtualbox&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you really want to avoid Docker but still test your deploy on CentOS 7, you
can accomplish much of the same setup with Vagrant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Install:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;y -S vagrant&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Set up kernel: &lt;a href="http://unix.stackexchange.com/questions/131792/" class="bare"&gt;http://unix.stackexchange.com/questions/131792/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;sudo depmod [3.19.2-1-ARCH]
sudo modprobe vboxdrv&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Choose work area:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;md ~/exp/vagrant/t1&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Find a box: &lt;a href="http://www.vagrantbox.es/" class="bare"&gt;http://www.vagrantbox.es/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;vagrant init hashicorp/precise32 # OR
vagrant init https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
[vagrant up]??&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Log in:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;vagrant ssh&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Better:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;sshpass -p vagrant ssh -p 2200 vagrant@127.0.0.1&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Consult: &lt;a href="http://docs.ansible.com/guide_vagrant.html" class="bare"&gt;http://docs.ansible.com/guide_vagrant.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Add to generated &lt;code&gt;Vagrantfile&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;config.vm.provision "ansible" do |ans|
  ans.playbook = "playbook.yaml"
end&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Start it:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;vagrant up&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Create hosts file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&amp;gt;hosts
[foos]
127.0.0.1:2200&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Create a playbook.yaml:&lt;/p&gt;
&lt;/div&gt;
- hosts: foos
  tasks:
    - name: install zsh
      yum: name=zsh state=present
&lt;div class="paragraph"&gt;
&lt;p&gt;Run ansible:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;ansible-playbook -i ./hosts -u vagrant playbook.yml -ksK&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Sun, 05 Jul 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>Docker has arrived. It&amp;#8217;s a "container" system for isolating services. It&amp;#8217;s simpler and lighter than a VM, yet easier to use than a jail. But it&amp;#8217;s not quite a full OS: it usually lacks things like systemd, cron, sshd, syslog, etc. Some folks are trying to address this for Ubuntu. It turns out that this can also be done with CentOS 7! This all-in-one docker instance becomes a great vehicle for testing deploys (and probably much more). Ubuntu wasn&amp;#8217;t going to work for my needs, but I found a minimal CentOS 7 version of the Ubuntu approach. So now Docker can actually be used for testing deployments with almost real full OSs. Docker With CentOS 7 On your local host, stop docker if running (to reset IPs) and start up the docker service: systemctl stop docker.service systemctl start docker.service Maci has provided an article and repo to get centos7 working with docker, which this article extends. Get it (one time ever): git clone https://github.com/maci0/docker-systemd-unpriv cd docker-systemd-unpriv Build (one time ever): alias dk=docker # put in ~/.zshrc dk build --rm -t maci/systemd . Fire up an instance any time, setting hostname etc: dk run -h dk1 --rm -t -i -p 2221:22 -v /sys/fs/cgroup:/sys/fs/cgroup:ro maci/systemd /usr/lib/systemd/systemd Switch to other term. See the IP: dk ps dk inspect 097241cd8024 |grep IPAddress Test login: sshpass -p root ssh dk1 # Oops. Wipe existing/offending key. sed -i '47d' ~/.ssh/known_hosts sshpass -p root ssh dk1 Manually update the system: yum update Optionally save as latest/greatest (see also): dk commit c0d3c28f5a86 mde/centos71 Manually install the very basics, and set up a deploy user, say “dummy”: # yum -y install openssh-clients sudo; useradd -m -G wheel dummy; passwd dummy Get dummy into a good state: # su - dummy % ssh somewhere-valid &amp;gt; yes # then ^c, just wanted proper .ssh/ dir created Set up to watch progress in a logged in shell: % sudo journalctl -xaf Copy your ssh key onto it: scp ~/.ssh/id_rsa.pub dk1:~/.ssh/authorized_keys Run ansible toward it: time ansible-playbook --skip=skip,security,nondocker -u dummy -b --ask-become-pass -l offsvrs:172.17.0.1 site.yml -v ; beep When you’re done testing, shut down instance: dk ps ... dk stop ea970de7e735 Save the image: dk save -o centos7-systemd-maci.img.tar maci/systemd:latest gzip centos7-systemd-maci.img.tar Archive it to S3: s3.sh put centos7-systemd-maci.img.tar.gz s3://dockers.example.com Helpers Generate hashed password: python2 -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())" Script to quickly remove a key, ~/bin/sshrmkey: #! /usr/bin/env zsh # sshrmkey — delete a line containing stale/offending key line=${1?Must provide offending line} sed -i "${line}d" ~/.ssh/known_hosts % sshrmkey 42 Vagrant/Virtualbox If you really want to avoid Docker but still test your deploy on CentOS 7, you can accomplish much of the same setup with Vagrant. Install: y -S vagrant Set up kernel: http://unix.stackexchange.com/questions/131792/ sudo depmod [3.19.2-1-ARCH] sudo modprobe vboxdrv Choose work area: md ~/exp/vagrant/t1 Find a box: http://www.vagrantbox.es/ vagrant init hashicorp/precise32 # OR vagrant init https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box [vagrant up]?? Log in: vagrant ssh Better: sshpass -p vagrant ssh -p 2200 vagrant@127.0.0.1 Consult: http://docs.ansible.com/guide_vagrant.html Add to generated Vagrantfile: config.vm.provision "ansible" do |ans| ans.playbook = "playbook.yaml" end Start it: vagrant up Create hosts file: &amp;gt;hosts [foos] 127.0.0.1:2200 Create a playbook.yaml: - hosts: foos tasks: - name: install zsh yum: name=zsh state=present Run ansible: ansible-playbook -i ./hosts -u vagrant playbook.yml -ksK</itunes:subtitle><itunes:summary>Docker has arrived. It&amp;#8217;s a "container" system for isolating services. It&amp;#8217;s simpler and lighter than a VM, yet easier to use than a jail. But it&amp;#8217;s not quite a full OS: it usually lacks things like systemd, cron, sshd, syslog, etc. Some folks are trying to address this for Ubuntu. It turns out that this can also be done with CentOS 7! This all-in-one docker instance becomes a great vehicle for testing deploys (and probably much more). Ubuntu wasn&amp;#8217;t going to work for my needs, but I found a minimal CentOS 7 version of the Ubuntu approach. So now Docker can actually be used for testing deployments with almost real full OSs. Docker With CentOS 7 On your local host, stop docker if running (to reset IPs) and start up the docker service: systemctl stop docker.service systemctl start docker.service Maci has provided an article and repo to get centos7 working with docker, which this article extends. Get it (one time ever): git clone https://github.com/maci0/docker-systemd-unpriv cd docker-systemd-unpriv Build (one time ever): alias dk=docker # put in ~/.zshrc dk build --rm -t maci/systemd . Fire up an instance any time, setting hostname etc: dk run -h dk1 --rm -t -i -p 2221:22 -v /sys/fs/cgroup:/sys/fs/cgroup:ro maci/systemd /usr/lib/systemd/systemd Switch to other term. See the IP: dk ps dk inspect 097241cd8024 |grep IPAddress Test login: sshpass -p root ssh dk1 # Oops. Wipe existing/offending key. sed -i '47d' ~/.ssh/known_hosts sshpass -p root ssh dk1 Manually update the system: yum update Optionally save as latest/greatest (see also): dk commit c0d3c28f5a86 mde/centos71 Manually install the very basics, and set up a deploy user, say “dummy”: # yum -y install openssh-clients sudo; useradd -m -G wheel dummy; passwd dummy Get dummy into a good state: # su - dummy % ssh somewhere-valid &amp;gt; yes # then ^c, just wanted proper .ssh/ dir created Set up to watch progress in a logged in shell: % sudo journalctl -xaf Copy your ssh key onto it: scp ~/.ssh/id_rsa.pub dk1:~/.ssh/authorized_keys Run ansible toward it: time ansible-playbook --skip=skip,security,nondocker -u dummy -b --ask-become-pass -l offsvrs:172.17.0.1 site.yml -v ; beep When you’re done testing, shut down instance: dk ps ... dk stop ea970de7e735 Save the image: dk save -o centos7-systemd-maci.img.tar maci/systemd:latest gzip centos7-systemd-maci.img.tar Archive it to S3: s3.sh put centos7-systemd-maci.img.tar.gz s3://dockers.example.com Helpers Generate hashed password: python2 -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())" Script to quickly remove a key, ~/bin/sshrmkey: #! /usr/bin/env zsh # sshrmkey — delete a line containing stale/offending key line=${1?Must provide offending line} sed -i "${line}d" ~/.ssh/known_hosts % sshrmkey 42 Vagrant/Virtualbox If you really want to avoid Docker but still test your deploy on CentOS 7, you can accomplish much of the same setup with Vagrant. Install: y -S vagrant Set up kernel: http://unix.stackexchange.com/questions/131792/ sudo depmod [3.19.2-1-ARCH] sudo modprobe vboxdrv Choose work area: md ~/exp/vagrant/t1 Find a box: http://www.vagrantbox.es/ vagrant init hashicorp/precise32 # OR vagrant init https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box [vagrant up]?? Log in: vagrant ssh Better: sshpass -p vagrant ssh -p 2200 vagrant@127.0.0.1 Consult: http://docs.ansible.com/guide_vagrant.html Add to generated Vagrantfile: config.vm.provision "ansible" do |ans| ans.playbook = "playbook.yaml" end Start it: vagrant up Create hosts file: &amp;gt;hosts [foos] 127.0.0.1:2200 Create a playbook.yaml: - hosts: foos tasks: - name: install zsh yum: name=zsh state=present Run ansible: ansible-playbook -i ./hosts -u vagrant playbook.yml -ksK</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-07-02-stop-using-markdown.html
</guid>
<link>
http://micahelliott.com/posts/2015-07-02-stop-using-markdown.html
</link>
<title>
From Markdown to Asciidoc
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 2017&lt;/strong&gt;: I&amp;#8217;m going to move everything to org-mode or Markdown since
  I&amp;#8217;m no longer finding the case for adoc compelling enough.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Markdown has become the de facto standard for plain text syntax. It&amp;#8217;s supported
in the webform editors of Stack Overflow, Github, and many blogs, wikis, and
forums. It’s built into most static site generators. You can even use it to
write a book. It&amp;#8217;s fantastic that it has raised awareness of text-based markup,
but it’s not enough.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Asciidoc fills in many of the shortcomings of Markdown. Here&amp;#8217;s a
&lt;a href="http://powerman.name/doc/asciidoc"&gt;cheat-sheet&lt;/a&gt; to give you a feel for its
syntax. It&amp;#8217;s almost as simple as Markdown, and thus quick to learn.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_markdown_shortcomings"&gt;Markdown Shortcomings&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You’re probably aware of most of these, but maybe don’t notice the pain as much
as you should.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Comments are clumsy. And multi-line becomes a mess.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Vim ends up loading its HTML syntax which clutters functionality and causes confusion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;No good way to add extra markup without dropping into HTML.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;No tables, citations, footnotes, or sub-/super-scripting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Inferior to Asciidoc&amp;#8217;s Docbook toolchain.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_asciidoc_extras_and_general_niceties"&gt;Asciidoc Extras and General Niceties&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Consistency of section delimiters. All are four characters and delineate blocks:
line-wise pairs of quadruples &lt;code&gt;-&lt;/code&gt; (code), &lt;code&gt;_&lt;/code&gt; (quote), &lt;code&gt;/&lt;/code&gt; (comment), &lt;code&gt;=&lt;/code&gt;
(caption), &lt;code&gt;+&lt;/code&gt; (pass-through HTML).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Titles can be added to most sections.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Auto-up-converting of some punctuation, like the pedant&amp;#8217;s apostrophes&amp;#8201;&amp;#8212;&amp;#8201;and yes, even dashes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can add anchors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Auto-generated Table Of Contents.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_markdown_to_asciidoc_conversion_guide"&gt;Markdown-to-Asciidoc Conversion Guide&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_headings"&gt;Headings&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;## Foo&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Asciidoc:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;== Foo&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_links"&gt;Links&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;[This is Google](http://google.com)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Asciidoc:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;http://google.com[This is Google]
link:/relative-page[some relative page]&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The Asciidoc feels more natural to me. My first instinct when inserting a link
is to insert the link itself. It&amp;#8217;s also nice to avoid the parens. Also, I often
will type a paragraph that has a few things that need to be linked after the
fact. It&amp;#8217;s really easy to paste the link just before the text in Asciidoc.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_images"&gt;Images&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;![Mittens is my fave](/img/kitty1.jpg "My Cat")&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Asciidoc:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;image:/img/kitty1.jpg[My Cat]  Mittens is my fave] "My Cat")&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_comments"&gt;Comments&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&amp;lt;!-- just a comment --&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Asciidoc:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;// just a comment&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;or multi-line (yay!):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;////
a bunch
of comment
lines
////&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_code_fragments"&gt;Code Fragments&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;    This is indented, yet subtle and easily mishandled when mixing with lists.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Asciidoc (weird but easy enough):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;  ----
  This is left-aligned, or wherever you want. It is explicit.
  ----&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Asciidoc also supports Markdown-style indents, but I&amp;#8217;m finding that being
explicit is less susceptible to ambiguous translating.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_hrs"&gt;HRs&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Markdown:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;  ----&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Asciidoc (weird but easy enough):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;  ''''&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_definition_lists"&gt;Definition lists&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Asciidoc is much richer, and not significantly harder to learn.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Thu, 02 Jul 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>UPDATE 2017: I&amp;#8217;m going to move everything to org-mode or Markdown since I&amp;#8217;m no longer finding the case for adoc compelling enough. Markdown has become the de facto standard for plain text syntax. It&amp;#8217;s supported in the webform editors of Stack Overflow, Github, and many blogs, wikis, and forums. It’s built into most static site generators. You can even use it to write a book. It&amp;#8217;s fantastic that it has raised awareness of text-based markup, but it’s not enough. Asciidoc fills in many of the shortcomings of Markdown. Here&amp;#8217;s a cheat-sheet to give you a feel for its syntax. It&amp;#8217;s almost as simple as Markdown, and thus quick to learn. Markdown Shortcomings You’re probably aware of most of these, but maybe don’t notice the pain as much as you should. Comments are clumsy. And multi-line becomes a mess. Vim ends up loading its HTML syntax which clutters functionality and causes confusion. No good way to add extra markup without dropping into HTML. No tables, citations, footnotes, or sub-/super-scripting. Inferior to Asciidoc&amp;#8217;s Docbook toolchain. Asciidoc Extras and General Niceties Consistency of section delimiters. All are four characters and delineate blocks: line-wise pairs of quadruples - (code), _ (quote), / (comment), = (caption), + (pass-through HTML). Titles can be added to most sections. Auto-up-converting of some punctuation, like the pedant&amp;#8217;s apostrophes&amp;#8201;&amp;#8212;&amp;#8201;and yes, even dashes. You can add anchors. Auto-generated Table Of Contents. Markdown-to-Asciidoc Conversion Guide Headings Markdown: ## Foo Asciidoc: == Foo Links Markdown: [This is Google](http://google.com) Asciidoc: http://google.com[This is Google] link:/relative-page[some relative page] The Asciidoc feels more natural to me. My first instinct when inserting a link is to insert the link itself. It&amp;#8217;s also nice to avoid the parens. Also, I often will type a paragraph that has a few things that need to be linked after the fact. It&amp;#8217;s really easy to paste the link just before the text in Asciidoc. Images Markdown: ![Mittens is my fave](/img/kitty1.jpg "My Cat") Asciidoc: image:/img/kitty1.jpg[My Cat] Mittens is my fave] "My Cat") Comments Markdown: &amp;lt;!-- just a comment --&amp;gt; Asciidoc: // just a comment or multi-line (yay!): //// a bunch of comment lines //// Code Fragments Markdown: This is indented, yet subtle and easily mishandled when mixing with lists. Asciidoc (weird but easy enough): ---- This is left-aligned, or wherever you want. It is explicit. ---- Asciidoc also supports Markdown-style indents, but I&amp;#8217;m finding that being explicit is less susceptible to ambiguous translating. HRs Markdown: ---- Asciidoc (weird but easy enough): '''' Definition lists Asciidoc is much richer, and not significantly harder to learn.</itunes:subtitle><itunes:summary>UPDATE 2017: I&amp;#8217;m going to move everything to org-mode or Markdown since I&amp;#8217;m no longer finding the case for adoc compelling enough. Markdown has become the de facto standard for plain text syntax. It&amp;#8217;s supported in the webform editors of Stack Overflow, Github, and many blogs, wikis, and forums. It’s built into most static site generators. You can even use it to write a book. It&amp;#8217;s fantastic that it has raised awareness of text-based markup, but it’s not enough. Asciidoc fills in many of the shortcomings of Markdown. Here&amp;#8217;s a cheat-sheet to give you a feel for its syntax. It&amp;#8217;s almost as simple as Markdown, and thus quick to learn. Markdown Shortcomings You’re probably aware of most of these, but maybe don’t notice the pain as much as you should. Comments are clumsy. And multi-line becomes a mess. Vim ends up loading its HTML syntax which clutters functionality and causes confusion. No good way to add extra markup without dropping into HTML. No tables, citations, footnotes, or sub-/super-scripting. Inferior to Asciidoc&amp;#8217;s Docbook toolchain. Asciidoc Extras and General Niceties Consistency of section delimiters. All are four characters and delineate blocks: line-wise pairs of quadruples - (code), _ (quote), / (comment), = (caption), + (pass-through HTML). Titles can be added to most sections. Auto-up-converting of some punctuation, like the pedant&amp;#8217;s apostrophes&amp;#8201;&amp;#8212;&amp;#8201;and yes, even dashes. You can add anchors. Auto-generated Table Of Contents. Markdown-to-Asciidoc Conversion Guide Headings Markdown: ## Foo Asciidoc: == Foo Links Markdown: [This is Google](http://google.com) Asciidoc: http://google.com[This is Google] link:/relative-page[some relative page] The Asciidoc feels more natural to me. My first instinct when inserting a link is to insert the link itself. It&amp;#8217;s also nice to avoid the parens. Also, I often will type a paragraph that has a few things that need to be linked after the fact. It&amp;#8217;s really easy to paste the link just before the text in Asciidoc. Images Markdown: ![Mittens is my fave](/img/kitty1.jpg "My Cat") Asciidoc: image:/img/kitty1.jpg[My Cat] Mittens is my fave] "My Cat") Comments Markdown: &amp;lt;!-- just a comment --&amp;gt; Asciidoc: // just a comment or multi-line (yay!): //// a bunch of comment lines //// Code Fragments Markdown: This is indented, yet subtle and easily mishandled when mixing with lists. Asciidoc (weird but easy enough): ---- This is left-aligned, or wherever you want. It is explicit. ---- Asciidoc also supports Markdown-style indents, but I&amp;#8217;m finding that being explicit is less susceptible to ambiguous translating. HRs Markdown: ---- Asciidoc (weird but easy enough): '''' Definition lists Asciidoc is much richer, and not significantly harder to learn.</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-07-02-cryogen-on-freebsd-with-ansible.html
</guid>
<link>
http://micahelliott.com/posts/2015-07-02-cryogen-on-freebsd-with-ansible.html
</link>
<title>
Cryogen Blog Setup
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;The tech running this blog is described on the &lt;a href="/about.html"&gt;About page&lt;/a&gt;. This
recipe explains what I did to set it all up.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- more --&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_infrastructure"&gt;Infrastructure&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can set up a static site easily enough with Github pages, but I think it’s
nice to manage a server yourself. You might want it for other things, and you
get to control it completely. Your learnings there will apply to any other
site/server you host.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can get yourself a “Droplet” at &lt;a href="http://digitalocean.com"&gt;DigitalOcean&lt;/a&gt; for $5
USD per month. That’s cheap. It’s just a matter of a few clicks on their simple
control panel. I’m somewhat near San Francisco, so I chose that data center.
&lt;a href="/posts/2015-07-17-why-centos.html"&gt;I like CentOS&lt;/a&gt; quite a bit as a server
OS, but I also like to play around with FreeBSD, so I chose that. It’s a recent
addition to the DO arsenal, and is a rock-solid OS with a fantastic security
record and a very famous file system: ZFS.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_deployment"&gt;Deployment&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I’ve configured Ansible to push changes to the Droplet. Take a look at
&lt;a href="https://github.com/MicahElliott/blog/blob/master/provn/site.yaml"&gt;the simple playbook&lt;/a&gt;.
I’d normally have set this up
&lt;a href="https://docs.ansible.com/playbooks_roles.html"&gt;hierarchically with roles&lt;/a&gt;,
but this machine’s config is simple enough to fit in a single file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Any time I feel like deploying, I can simple run &lt;code&gt;deploy.zsh&lt;/code&gt; to fire the
&lt;code&gt;ansible-playbook&lt;/code&gt; command.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_git_versioning"&gt;Git Versioning&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I like to commit often, but I don’t rely on git for updating the blog. I do
maintain the engine, styling, and text all in
&lt;a href="https://github.com/MicahElliott/blog"&gt;a single repository&lt;/a&gt;. I usually commit when
a new post is added, and more frequently as it nears completion. Probably a good
idea to have a deploy cadence that’s in line with git-commits.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_cryogen"&gt;Cryogen&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Although I’ve looked at Jekyll, Octopress, and several others over the years,
Cryogen is looking like a winner for a few reasons.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;minimal code base&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;one of the developers is the most prolific author of clojure web dev&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;they’re very responsive to issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;it’s already got bootstrap, and is thus mobile-friendly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no engine to run on the server; just deploy the static &lt;code&gt;public/&lt;/code&gt; directory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;it supports
&lt;a href="/posts/2015-07-02-stop-using-markdown.html"&gt;Asciidoc, which is superior to Markdown&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;it comes with a base theme that is easy to style; just tweak the existing
HTML template files that are in your project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Google Fonts are included. I really like
&lt;a href="https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm?hl=en"&gt;WhatFont
for Chrome&lt;/a&gt; for showing fonts. Try it here to see what I’ve chosen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The documentation is small and great, and you can start running your blog
locally by following
&lt;a href="http://cryogenweb.org/docs/getting-started.html"&gt;this tiny guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_things_you_can_add"&gt;Things you can add&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Add feedburner as the RSS feed. This takes load off your server as you start
getting subscribers who may hit your feed frequently/automatically. You just
need to edit your &lt;code&gt;base.html&lt;/code&gt; to replace the feed link to point to your
feedburner XML.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Google Analytics is a simple way to see your site traffic. It’s a simple matter
of pasting a tiny javascript snippet in the bottom of your &lt;code&gt;base.html&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Videos can be embedded. You could use Youtube, but Vimeo might be better at not
pointing to random, odd videos as recommendations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_things_that_are_not_needed"&gt;Things that are not needed&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;tag clouds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ads&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;wysiwyg editing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;user management&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a comment system (spam is insidious), but Disqus is an option&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;backups (they’re already in git)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;blogrolls&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;emailer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;categories&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;widgets for “like”ing or twitter updates&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Although I use CloudFlare elsewhere to protect from DDoS attacks (been hit
before) I don’t see much need for it for a blog. It could be added.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_things_that_may_be_coming_to_cryogen"&gt;Things that may be coming to Cryogen&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/cryogen-project/cryogen/issues/65"&gt;a &lt;em&gt;read more&lt;/em&gt; abstract mechanism&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/cryogen-project/cryogen/issues/67"&gt;smarter recompilation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/cryogen-project/cryogen/issues/64"&gt;jade markup support&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Thu, 02 Jul 2015 00:00:00 -0700
</pubDate>
<itunes:explicit/><itunes:subtitle>The tech running this blog is described on the About page. This recipe explains what I did to set it all up. Infrastructure You can set up a static site easily enough with Github pages, but I think it’s nice to manage a server yourself. You might want it for other things, and you get to control it completely. Your learnings there will apply to any other site/server you host. You can get yourself a “Droplet” at DigitalOcean for $5 USD per month. That’s cheap. It’s just a matter of a few clicks on their simple control panel. I’m somewhat near San Francisco, so I chose that data center. I like CentOS quite a bit as a server OS, but I also like to play around with FreeBSD, so I chose that. It’s a recent addition to the DO arsenal, and is a rock-solid OS with a fantastic security record and a very famous file system: ZFS. Deployment I’ve configured Ansible to push changes to the Droplet. Take a look at the simple playbook. I’d normally have set this up hierarchically with roles, but this machine’s config is simple enough to fit in a single file. Any time I feel like deploying, I can simple run deploy.zsh to fire the ansible-playbook command. Git Versioning I like to commit often, but I don’t rely on git for updating the blog. I do maintain the engine, styling, and text all in a single repository. I usually commit when a new post is added, and more frequently as it nears completion. Probably a good idea to have a deploy cadence that’s in line with git-commits. Cryogen Although I’ve looked at Jekyll, Octopress, and several others over the years, Cryogen is looking like a winner for a few reasons. minimal code base one of the developers is the most prolific author of clojure web dev they’re very responsive to issues it’s already got bootstrap, and is thus mobile-friendly no engine to run on the server; just deploy the static public/ directory it supports Asciidoc, which is superior to Markdown it comes with a base theme that is easy to style; just tweak the existing HTML template files that are in your project. Google Fonts are included. I really like WhatFont for Chrome for showing fonts. Try it here to see what I’ve chosen. The documentation is small and great, and you can start running your blog locally by following this tiny guide. Things you can add Add feedburner as the RSS feed. This takes load off your server as you start getting subscribers who may hit your feed frequently/automatically. You just need to edit your base.html to replace the feed link to point to your feedburner XML. Google Analytics is a simple way to see your site traffic. It’s a simple matter of pasting a tiny javascript snippet in the bottom of your base.html. Videos can be embedded. You could use Youtube, but Vimeo might be better at not pointing to random, odd videos as recommendations. Things that are not needed tag clouds ads wysiwyg editing user management a comment system (spam is insidious), but Disqus is an option backups (they’re already in git) blogrolls emailer categories widgets for “like”ing or twitter updates Although I use CloudFlare elsewhere to protect from DDoS attacks (been hit before) I don’t see much need for it for a blog. It could be added. Things that may be coming to Cryogen a read more abstract mechanism smarter recompilation jade markup support</itunes:subtitle><itunes:summary>The tech running this blog is described on the About page. This recipe explains what I did to set it all up. Infrastructure You can set up a static site easily enough with Github pages, but I think it’s nice to manage a server yourself. You might want it for other things, and you get to control it completely. Your learnings there will apply to any other site/server you host. You can get yourself a “Droplet” at DigitalOcean for $5 USD per month. That’s cheap. It’s just a matter of a few clicks on their simple control panel. I’m somewhat near San Francisco, so I chose that data center. I like CentOS quite a bit as a server OS, but I also like to play around with FreeBSD, so I chose that. It’s a recent addition to the DO arsenal, and is a rock-solid OS with a fantastic security record and a very famous file system: ZFS. Deployment I’ve configured Ansible to push changes to the Droplet. Take a look at the simple playbook. I’d normally have set this up hierarchically with roles, but this machine’s config is simple enough to fit in a single file. Any time I feel like deploying, I can simple run deploy.zsh to fire the ansible-playbook command. Git Versioning I like to commit often, but I don’t rely on git for updating the blog. I do maintain the engine, styling, and text all in a single repository. I usually commit when a new post is added, and more frequently as it nears completion. Probably a good idea to have a deploy cadence that’s in line with git-commits. Cryogen Although I’ve looked at Jekyll, Octopress, and several others over the years, Cryogen is looking like a winner for a few reasons. minimal code base one of the developers is the most prolific author of clojure web dev they’re very responsive to issues it’s already got bootstrap, and is thus mobile-friendly no engine to run on the server; just deploy the static public/ directory it supports Asciidoc, which is superior to Markdown it comes with a base theme that is easy to style; just tweak the existing HTML template files that are in your project. Google Fonts are included. I really like WhatFont for Chrome for showing fonts. Try it here to see what I’ve chosen. The documentation is small and great, and you can start running your blog locally by following this tiny guide. Things you can add Add feedburner as the RSS feed. This takes load off your server as you start getting subscribers who may hit your feed frequently/automatically. You just need to edit your base.html to replace the feed link to point to your feedburner XML. Google Analytics is a simple way to see your site traffic. It’s a simple matter of pasting a tiny javascript snippet in the bottom of your base.html. Videos can be embedded. You could use Youtube, but Vimeo might be better at not pointing to random, odd videos as recommendations. Things that are not needed tag clouds ads wysiwyg editing user management a comment system (spam is insidious), but Disqus is an option backups (they’re already in git) blogrolls emailer categories widgets for “like”ing or twitter updates Although I use CloudFlare elsewhere to protect from DDoS attacks (been hit before) I don’t see much need for it for a blog. It could be added. Things that may be coming to Cryogen a read more abstract mechanism smarter recompilation jade markup support</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-02-16-should-i-run-today.html
</guid>
<link>
http://micahelliott.com/posts/2015-02-16-should-i-run-today.html
</link>
<title>
Should I Run Today?
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Probably&amp;#8230;&amp;#8203;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s not downpouring or freezing or broiling.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My phone is charged and GPS is toiling.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My gear is nearby.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Runner&amp;#8217;s high makes me feel I can fly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I&amp;#8217;m not sick, injured, hung over, or feeling too sadly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Nothing is hurting too badly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I have (semi-)waterproof shoes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I really have nothing to lose.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s not  too early or too late.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Better get out there.  Don&amp;#8217;t test fate.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;If I don&amp;#8217;t&amp;#8230;&amp;#8203;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I will lose progress.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My stats will be a mess.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I will gain weight.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I won&amp;#8217;t feel great.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The next event will hurt even worse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I might have to see a nurse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I won&amp;#8217;t get to hear a podcast.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Run those miles as if they&amp;#8217;re my last!&lt;/p&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Mon, 16 Feb 2015 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>Probably&amp;#8230;&amp;#8203; It&amp;#8217;s not downpouring or freezing or broiling. My phone is charged and GPS is toiling. My gear is nearby. Runner&amp;#8217;s high makes me feel I can fly. I&amp;#8217;m not sick, injured, hung over, or feeling too sadly. Nothing is hurting too badly. I have (semi-)waterproof shoes. I really have nothing to lose. It&amp;#8217;s not too early or too late. Better get out there. Don&amp;#8217;t test fate. If I don&amp;#8217;t&amp;#8230;&amp;#8203; I will lose progress. My stats will be a mess. I will gain weight. I won&amp;#8217;t feel great. The next event will hurt even worse. I might have to see a nurse. I won&amp;#8217;t get to hear a podcast. Run those miles as if they&amp;#8217;re my last!</itunes:subtitle><itunes:summary>Probably&amp;#8230;&amp;#8203; It&amp;#8217;s not downpouring or freezing or broiling. My phone is charged and GPS is toiling. My gear is nearby. Runner&amp;#8217;s high makes me feel I can fly. I&amp;#8217;m not sick, injured, hung over, or feeling too sadly. Nothing is hurting too badly. I have (semi-)waterproof shoes. I really have nothing to lose. It&amp;#8217;s not too early or too late. Better get out there. Don&amp;#8217;t test fate. If I don&amp;#8217;t&amp;#8230;&amp;#8203; I will lose progress. My stats will be a mess. I will gain weight. I won&amp;#8217;t feel great. The next event will hurt even worse. I might have to see a nurse. I won&amp;#8217;t get to hear a podcast. Run those miles as if they&amp;#8217;re my last!</itunes:summary></item>
<item>
<guid>
http://micahelliott.com/posts/2015-02-01-livescript-vs-clojurescript-vs-racket.html
</guid>
<link>
http://micahelliott.com/posts/2015-02-01-livescript-vs-clojurescript-vs-racket.html
</link>
<title>
LiveScript vs ClojureScript
</title>
<description>
&lt;div class="paragraph"&gt;
&lt;p&gt;The following are my pros/cons notes comparing LiveScript (which I really loved
using) to Clojure(Script), and eventually to Racket. The conclusion was that
ClojureScript wins, partly because of my other biases toward Clojure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_ls"&gt;LS&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_pros"&gt;Pros&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;concise, haskell-like&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;improved coffee, a very popular language&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;npm&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;node is fast&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;beautifully simple standard node lib&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;brunch et al&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jade (hiccup might suffice, but there is clj-jade)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;angular/backbone&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;express&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;socket.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;d3 (but c2)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;native json&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;many lessons/projects already written in ls&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;put into any proj that uses coffee&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;testing frameworks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugs into everything where js is used with minimal change&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_cons"&gt;Cons&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;callback hell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;impossible async recursion (and no tco)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;not multi-threaded so maybe harder to scale for production&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;poor repl&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;too many npm pkgs to choose from&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;won&amp;#8217;t paste into browser repl&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bad vim syntax highlighting (fixable)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;node won&amp;#8217;t go on windows (anyone care?)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;prelude confused with underscore/lodash/async/nimble&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;obscure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;syntax heavy; a bit quirky&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;surprising scope issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaScript\* community fragmented among langs/tools&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_clj_s"&gt;CLJ(S)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_pros_2"&gt;Pros&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;lisp, beautiful functional&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a fit for every domain&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;immutability&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;avoids node event loop&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4clojure for practice/competition&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;multi-runtime options (java, node, browser)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;maybe preferred by academics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;browser repl?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;native structures more expressive/concise than json and racket&amp;#8217;s&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;edn&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;concurrency&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sensible scoping&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;easier to teach (vs ls), been done many times&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;laziness&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;clojure toolbox (nicely settles on a few tools for any job)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;many settled libs: korma/sql, hiccup/templating, luminus/web, incanter/stats, midje/testing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;obviates ChucK with Overtone&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lighttable as drracket competitor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;om/reagent/react&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;practical real-world, employable skillset&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;js compatible (ClojureScript)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;simple web deployment via uberjar/uberwar to jetty, tomcat, or nginx&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;google closure compiler/optimizer (though heavy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;macros&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_cons_2"&gt;Cons&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;too bulky for raspi!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;memory hogging beast! so not good for kids learning on limited hw&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;slow startup? (but maybe okay since single repl stays alive for days)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lots of parens, more verbose&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;prefers emacs (but PG uses vi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;heavy on java and suffers from its limitations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RPN opaque for beginners&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lacking JavaScript/node/npm ecosystem?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;complexity of setup&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;terrible error messages, but &lt;a href="https://github.com/mmcgrana/clj-stacktrace"&gt;clj-stacktrace&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_racket"&gt;Racket&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_pros_3"&gt;Pros&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;fast and light and easy to generate executables (for meager hardware)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nice, kid-friendly starter book (Realm of Racket), plus HtDP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;actually is plt-scheme, so little schemer and sicp also apply&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;has graph plotting and math modules&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;well accepted as academic/teaching language, with scheme history&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;many teaching resources, maybe even full course&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;well contained/organized documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;might want to build everything from scratch anyway, for teaching purposes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DrRacket&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nice repl(?)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;scribble documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/greghendershott/frog"&gt;a scribble-based blog engine&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;friendly error messages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;most flexible language (toolkit)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;accepts [] in place of ()&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;language "teach" packs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;decent startup time: 230ms for hello.rkt, 46ms with just racket/base&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no java to deal with&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;probably nice small install with racket-minimal from aur, excluding DrRacket&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pretty simple to move to clojure from racket, later on&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;probably does recursion right&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;true pattern matching(?)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nice unicode identifier support, even as symbols! use λ instead of lambda&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;raco (lein equivalent?)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lang hosted on github&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;browsable package repo: &lt;a href="http://pkgs.racket-lang.org/" class="bare"&gt;http://pkgs.racket-lang.org/&lt;/a&gt; and &lt;a href="http://planet.racket-lang.org" class="bare"&gt;http://planet.racket-lang.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;only 20 MB for racket-minimal install&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;probably great tdd testing utils&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_cons_3"&gt;Cons&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;syntax not as brief as Clojure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lacking ecosystem (web framework, templating, overtone, etc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no vim plugins like fireplace/vim-sexp? (workflow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lacking libraries (mongo, etc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lacking syntax; everything is parens: harder to read (but &lt;code&gt;[]&lt;/code&gt; accepted)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;less powerful data structures&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;maybe not scalable? well, people claim it&amp;#8217;s faster than python&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no good js transpiler story (whalesong?)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a little bulky to install at 400 MB (but sans-DrRacket pkg available&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;docs not as friendly as &lt;a href="http://clojuredocs.org/" class="bare"&gt;http://clojuredocs.org/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;? npm equivalent? maybe &lt;code&gt;raco planet&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_es6"&gt;ES6&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_cons_4"&gt;Cons&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;still just an ugly and verbose [braces and semicolons] syntax&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;will need transpilation for some time, so might as well use another lang&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_ocaml"&gt;OCaml&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;fast&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;statically typed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tools can be very good&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;immutable by default&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;growing in popularity&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;like haskell but better/simpler&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;great completion&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;utop repl&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ocsigen web&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;good error messages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;interfaces are slick&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_cons_5"&gt;Cons&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;syntax heavy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no mixed types in lists (&lt;a href="http://www.paulgraham.com/lispfaq1.html" class="bare"&gt;http://www.paulgraham.com/lispfaq1.html&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;slime is clumsy with &lt;code&gt;;;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lots/hard to teach&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_r"&gt;R&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_pros_4"&gt;Pros&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;vector oriented&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;replaces graphing calculator&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fits math/stats curriculum&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;libraries&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;graphing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;shiny&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fast and light&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fantastic repl and help system&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;math and data oriented&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;so many books/learning resources&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;industry standard&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rstudio(?)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_cons_6"&gt;Cons&lt;/h3&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;no hash/dict native&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;not a lisp&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;syntax can be awkward and a bit ugly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;not very web oriented(?)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;have to know stats to do much&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;probably not as good tdd testing utils&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;maybe slow for big data sets/crunching&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_compelling_rstudio_features"&gt;Compelling RStudio Features&lt;/h3&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_pros_5"&gt;Pros&lt;/h4&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;spreadsheet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;searchable help and libs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;graphic window mgmt&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_cons_7"&gt;Cons&lt;/h4&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;binary is 260 MB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bad fonts and colors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mouse-oriented&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_but_what_do_they_want_to_build"&gt;But what do they want to build?&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;web apps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;graphs/stats/analytics/reporting/journalism&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;parallel/fast improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;games&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;robots&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;back-end service&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cars&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;automation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;system tools&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;interfaces&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iot/devices (home automation: lights, garage door)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;making music&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;language processing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;measuring instruments (farming, atmosphere, seismology, etc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;or whatever, there are lots of jobs if that’s the end goal&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_requirements"&gt;Requirements&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;concise&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;functional&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;easy enough to learn&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;simple environment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;minimal machine/$ resources&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;multi-domain&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;somewhat visual&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fun and not painful&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
<enclosure>

</enclosure>
<pubDate>
Sun, 01 Feb 2015 00:00:00 -0800
</pubDate>
<itunes:explicit/><itunes:subtitle>The following are my pros/cons notes comparing LiveScript (which I really loved using) to Clojure(Script), and eventually to Racket. The conclusion was that ClojureScript wins, partly because of my other biases toward Clojure. LS Pros concise, haskell-like improved coffee, a very popular language npm node is fast beautifully simple standard node lib brunch et al jade (hiccup might suffice, but there is clj-jade) angular/backbone express socket.io d3 (but c2) native json many lessons/projects already written in ls put into any proj that uses coffee testing frameworks plugs into everything where js is used with minimal change Cons callback hell impossible async recursion (and no tco) not multi-threaded so maybe harder to scale for production poor repl too many npm pkgs to choose from won&amp;#8217;t paste into browser repl bad vim syntax highlighting (fixable) node won&amp;#8217;t go on windows (anyone care?) prelude confused with underscore/lodash/async/nimble obscure syntax heavy; a bit quirky surprising scope issues JavaScript\* community fragmented among langs/tools CLJ(S) Pros lisp, beautiful functional a fit for every domain immutability avoids node event loop 4clojure for practice/competition multi-runtime options (java, node, browser) maybe preferred by academics browser repl? native structures more expressive/concise than json and racket&amp;#8217;s edn concurrency sensible scoping easier to teach (vs ls), been done many times laziness clojure toolbox (nicely settles on a few tools for any job) many settled libs: korma/sql, hiccup/templating, luminus/web, incanter/stats, midje/testing obviates ChucK with Overtone lighttable as drracket competitor om/reagent/react practical real-world, employable skillset js compatible (ClojureScript) simple web deployment via uberjar/uberwar to jetty, tomcat, or nginx google closure compiler/optimizer (though heavy) macros Cons too bulky for raspi! memory hogging beast! so not good for kids learning on limited hw slow startup? (but maybe okay since single repl stays alive for days) lots of parens, more verbose prefers emacs (but PG uses vi) heavy on java and suffers from its limitations RPN opaque for beginners lacking JavaScript/node/npm ecosystem? complexity of setup terrible error messages, but clj-stacktrace Racket Pros fast and light and easy to generate executables (for meager hardware) nice, kid-friendly starter book (Realm of Racket), plus HtDP actually is plt-scheme, so little schemer and sicp also apply has graph plotting and math modules well accepted as academic/teaching language, with scheme history many teaching resources, maybe even full course well contained/organized documentation might want to build everything from scratch anyway, for teaching purposes DrRacket nice repl(?) scribble documentation a scribble-based blog engine friendly error messages most flexible language (toolkit) accepts [] in place of () language "teach" packs decent startup time: 230ms for hello.rkt, 46ms with just racket/base no java to deal with probably nice small install with racket-minimal from aur, excluding DrRacket pretty simple to move to clojure from racket, later on probably does recursion right true pattern matching(?) nice unicode identifier support, even as symbols! use λ instead of lambda raco (lein equivalent?) lang hosted on github browsable package repo: http://pkgs.racket-lang.org/ and http://planet.racket-lang.org only 20 MB for racket-minimal install probably great tdd testing utils Cons syntax not as brief as Clojure lacking ecosystem (web framework, templating, overtone, etc) no vim plugins like fireplace/vim-sexp? (workflow) lacking libraries (mongo, etc) lacking syntax; everything is parens: harder to read (but [] accepted) less powerful data structures maybe not scalable? well, people claim it&amp;#8217;s faster than python no good js transpiler story (whalesong?) a little bulky to install at 400 MB (but sans-DrRacket pkg available docs not as friendly as http://clojuredocs.org/ ? npm equivalent? maybe raco planet ES6 Cons still just an ugly and verbose [braces and semicolons] syntax will need transpilation for some time, so might as well use another lang OCaml fast statically typed tools can be very good immutable by default growing in popularity like haskell but better/simpler great completion utop repl ocsigen web good error messages interfaces are slick Cons syntax heavy no mixed types in lists (http://www.paulgraham.com/lispfaq1.html) slime is clumsy with ;; lots/hard to teach R Pros vector oriented replaces graphing calculator fits math/stats curriculum libraries graphing shiny fast and light fantastic repl and help system math and data oriented so many books/learning resources industry standard rstudio(?) Cons no hash/dict native not a lisp syntax can be awkward and a bit ugly not very web oriented(?) have to know stats to do much probably not as good tdd testing utils maybe slow for big data sets/crunching Compelling RStudio Features Pros spreadsheet searchable help and libs graphic window mgmt Cons binary is 260 MB bad fonts and colors mouse-oriented But what do they want to build? web apps graphs/stats/analytics/reporting/journalism parallel/fast improvements games robots back-end service cars automation system tools interfaces iot/devices (home automation: lights, garage door) making music language processing measuring instruments (farming, atmosphere, seismology, etc) or whatever, there are lots of jobs if that’s the end goal Requirements concise functional easy enough to learn simple environment minimal machine/$ resources multi-domain somewhat visual fun and not painful</itunes:subtitle><itunes:summary>The following are my pros/cons notes comparing LiveScript (which I really loved using) to Clojure(Script), and eventually to Racket. The conclusion was that ClojureScript wins, partly because of my other biases toward Clojure. LS Pros concise, haskell-like improved coffee, a very popular language npm node is fast beautifully simple standard node lib brunch et al jade (hiccup might suffice, but there is clj-jade) angular/backbone express socket.io d3 (but c2) native json many lessons/projects already written in ls put into any proj that uses coffee testing frameworks plugs into everything where js is used with minimal change Cons callback hell impossible async recursion (and no tco) not multi-threaded so maybe harder to scale for production poor repl too many npm pkgs to choose from won&amp;#8217;t paste into browser repl bad vim syntax highlighting (fixable) node won&amp;#8217;t go on windows (anyone care?) prelude confused with underscore/lodash/async/nimble obscure syntax heavy; a bit quirky surprising scope issues JavaScript\* community fragmented among langs/tools CLJ(S) Pros lisp, beautiful functional a fit for every domain immutability avoids node event loop 4clojure for practice/competition multi-runtime options (java, node, browser) maybe preferred by academics browser repl? native structures more expressive/concise than json and racket&amp;#8217;s edn concurrency sensible scoping easier to teach (vs ls), been done many times laziness clojure toolbox (nicely settles on a few tools for any job) many settled libs: korma/sql, hiccup/templating, luminus/web, incanter/stats, midje/testing obviates ChucK with Overtone lighttable as drracket competitor om/reagent/react practical real-world, employable skillset js compatible (ClojureScript) simple web deployment via uberjar/uberwar to jetty, tomcat, or nginx google closure compiler/optimizer (though heavy) macros Cons too bulky for raspi! memory hogging beast! so not good for kids learning on limited hw slow startup? (but maybe okay since single repl stays alive for days) lots of parens, more verbose prefers emacs (but PG uses vi) heavy on java and suffers from its limitations RPN opaque for beginners lacking JavaScript/node/npm ecosystem? complexity of setup terrible error messages, but clj-stacktrace Racket Pros fast and light and easy to generate executables (for meager hardware) nice, kid-friendly starter book (Realm of Racket), plus HtDP actually is plt-scheme, so little schemer and sicp also apply has graph plotting and math modules well accepted as academic/teaching language, with scheme history many teaching resources, maybe even full course well contained/organized documentation might want to build everything from scratch anyway, for teaching purposes DrRacket nice repl(?) scribble documentation a scribble-based blog engine friendly error messages most flexible language (toolkit) accepts [] in place of () language "teach" packs decent startup time: 230ms for hello.rkt, 46ms with just racket/base no java to deal with probably nice small install with racket-minimal from aur, excluding DrRacket pretty simple to move to clojure from racket, later on probably does recursion right true pattern matching(?) nice unicode identifier support, even as symbols! use λ instead of lambda raco (lein equivalent?) lang hosted on github browsable package repo: http://pkgs.racket-lang.org/ and http://planet.racket-lang.org only 20 MB for racket-minimal install probably great tdd testing utils Cons syntax not as brief as Clojure lacking ecosystem (web framework, templating, overtone, etc) no vim plugins like fireplace/vim-sexp? (workflow) lacking libraries (mongo, etc) lacking syntax; everything is parens: harder to read (but [] accepted) less powerful data structures maybe not scalable? well, people claim it&amp;#8217;s faster than python no good js transpiler story (whalesong?) a little bulky to install at 400 MB (but sans-DrRacket pkg available docs not as friendly as http://clojuredocs.org/ ? npm equivalent? maybe raco planet ES6 Cons still just an ugly and verbose [braces and semicolons] syntax will need transpilation for some time, so might as well use another lang OCaml fast statically typed tools can be very good immutable by default growing in popularity like haskell but better/simpler great completion utop repl ocsigen web good error messages interfaces are slick Cons syntax heavy no mixed types in lists (http://www.paulgraham.com/lispfaq1.html) slime is clumsy with ;; lots/hard to teach R Pros vector oriented replaces graphing calculator fits math/stats curriculum libraries graphing shiny fast and light fantastic repl and help system math and data oriented so many books/learning resources industry standard rstudio(?) Cons no hash/dict native not a lisp syntax can be awkward and a bit ugly not very web oriented(?) have to know stats to do much probably not as good tdd testing utils maybe slow for big data sets/crunching Compelling RStudio Features Pros spreadsheet searchable help and libs graphic window mgmt Cons binary is 260 MB bad fonts and colors mouse-oriented But what do they want to build? web apps graphs/stats/analytics/reporting/journalism parallel/fast improvements games robots back-end service cars automation system tools interfaces iot/devices (home automation: lights, garage door) making music language processing measuring instruments (farming, atmosphere, seismology, etc) or whatever, there are lots of jobs if that’s the end goal Requirements concise functional easy enough to learn simple environment minimal machine/$ resources multi-domain somewhat visual fun and not painful</itunes:summary></item>
</channel>
</rss>