<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://ottoschnurr.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ottoschnurr.com/" rel="alternate" type="text/html" /><updated>2021-04-26T00:32:02+00:00</updated><id>https://ottoschnurr.com/feed.xml</id><title type="html">Otto Schnurr</title><subtitle>iOS Software Engineer</subtitle><author><name>Otto Schnurr</name></author><entry><title type="html">Simplicity</title><link href="https://ottoschnurr.com/simplicity" rel="alternate" type="text/html" title="Simplicity" /><published>2020-12-12T00:00:00+00:00</published><updated>2020-12-12T00:00:00+00:00</updated><id>https://ottoschnurr.com/simplicity</id><content type="html" xml:base="https://ottoschnurr.com/simplicity">&lt;blockquote&gt;
  &lt;p&gt;Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible you are, by definition, not smart enough to debug it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— &lt;a href=&quot;http://en.wikipedia.org/wiki/Brian_Kernighan&quot;&gt;Brian Kernighan&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Any word you have to hunt for in a thesaurus is the wrong word.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— Steven King&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you love writing code – really, truly love to write code – you’ll love it enough to write as little of it as possible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000878.html&quot;&gt;Jeff Atwood&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Make everything as simple as possible, but not simpler.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— Albert Einstein&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“C” is for cookie. That’s good enough for me.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— Anonymous&lt;/p&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible you are, by definition, not smart enough to debug it. — Brian Kernighan Any word you have to hunt for in a thesaurus is the wrong word. — Steven King If you love writing code – really, truly love to write code – you’ll love it enough to write as little of it as possible. — Jeff Atwood Make everything as simple as possible, but not simpler. — Albert Einstein “C” is for cookie. That’s good enough for me. — Anonymous</summary></entry><entry><title type="html">A Different Kind of Software</title><link href="https://ottoschnurr.com/different-kind-of-software" rel="alternate" type="text/html" title="A Different Kind of Software" /><published>2019-04-08T00:00:00+00:00</published><updated>2019-04-08T00:00:00+00:00</updated><id>https://ottoschnurr.com/different-kind-of-software</id><content type="html" xml:base="https://ottoschnurr.com/different-kind-of-software">&lt;p&gt;What makes machine learning different? What implications does it have for how software is developed?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://youtu.be/K2oWAn76tUw&quot;&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.ottoschnurr.com/different-kind-of-software.jpg&quot; alt=&quot;A Different Kind of Software&quot; title=&quot;Watch the video.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My second installment in the “&lt;a href=&quot;https://www.youtube.com/playlist?list=PLpT0j_geOltAP7WejEHZB4uUD2EeuEC0c&quot;&gt;Demystifying Machine Learning&lt;/a&gt;” video series. More details can be found on my &lt;a href=&quot;https://deepdojo.com&quot;&gt;machine learning blog&lt;/a&gt;.&lt;/p&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">What makes machine learning different? What implications does it have for how software is developed? My second installment in the “Demystifying Machine Learning” video series. More details can be found on my machine learning blog.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://s3.amazonaws.com/assets.ottoschnurr.com/different-kind-of-software.jpg" /><media:content medium="image" url="https://s3.amazonaws.com/assets.ottoschnurr.com/different-kind-of-software.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">An Unlikely Robot Apocalypse</title><link href="https://ottoschnurr.com/unlikely-robot-apocalypse" rel="alternate" type="text/html" title="An Unlikely Robot Apocalypse" /><published>2019-01-18T00:00:00+00:00</published><updated>2019-01-18T00:00:00+00:00</updated><id>https://ottoschnurr.com/unlikely-robot-apocalypse</id><content type="html" xml:base="https://ottoschnurr.com/unlikely-robot-apocalypse">&lt;p&gt;&lt;a href=&quot;https://youtu.be/qf-icotKDo4&quot;&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.ottoschnurr.com/unlikely-robot-apocalypse.jpg&quot; alt=&quot;An Unlikely Robot Apocalypse&quot; title=&quot;Watch the video.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My first attempt at recording a series of videos that try to unwrap some of the mystery surrounding machine learning. More details can be found on my &lt;a href=&quot;https://deepdojo.com&quot;&gt;machine learning blog&lt;/a&gt;.&lt;/p&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">My first attempt at recording a series of videos that try to unwrap some of the mystery surrounding machine learning. More details can be found on my machine learning blog.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://s3.amazonaws.com/assets.ottoschnurr.com/unlikely-robot-apocalypse.jpg" /><media:content medium="image" url="https://s3.amazonaws.com/assets.ottoschnurr.com/unlikely-robot-apocalypse.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A Programmer’s Guide to Joining the Circus</title><link href="https://ottoschnurr.com/joining-the-circus" rel="alternate" type="text/html" title="A Programmer’s Guide to Joining the Circus" /><published>2018-08-15T00:00:00+00:00</published><updated>2018-08-15T00:00:00+00:00</updated><id>https://ottoschnurr.com/joining-the-circus</id><content type="html" xml:base="https://ottoschnurr.com/joining-the-circus">&lt;p&gt;There was a time in my life when I wanted to bring more right-brain thinking into my career. The division between technical and creative work always seemed somehow artificial and pervasive. Like some unexpected obstacle in the road. A Monty Python &lt;a href=&quot;https://youtu.be/0D7hFHfLEyk?t=1m8s&quot;&gt;bridge of death&lt;/a&gt; where you are stopped and forced to choose. Creative or technical. Design or implementation.&lt;/p&gt;

&lt;p&gt;Once you make the choice, you live with it. There’s no going back. Not without significant personal cost. No crossing the streams.&lt;/p&gt;

&lt;p&gt;I knew this but I didn’t like it. With technical experience under my belt, why should creative pursuits be placed out of consideration?&lt;/p&gt;

&lt;h2 id=&quot;what-to-do&quot;&gt;What to Do?&lt;/h2&gt;

&lt;p&gt;At the time I was employed at Midway Games helping them update their sports animation engine from C to C++. I had been working there for almost four years.&lt;/p&gt;

&lt;p&gt;Animation was a fascination for me. It felt full of promise. A hallowed ground where technical and creative ambition intersect. I started poking around on the web and ran across a new animation school. The courses and instruction were on-line. The mentors were professional animators. The founders of the school hailed from Pixar and Industrial Light and Magic.&lt;/p&gt;

&lt;p&gt;Yoda and The Incredibles. Big time stuff.&lt;/p&gt;

&lt;p&gt;The more I considered it, the more interested I became. This was 2005. I was single. No kids. No commitments. What would be the harm in seeing if &lt;a href=&quot;https://www.animationmentor.com&quot;&gt;Animation Mentor&lt;/a&gt; would even consider me?&lt;/p&gt;

&lt;h2 id=&quot;a-left-brain-defector&quot;&gt;A Left-Brain Defector&lt;/h2&gt;

&lt;p&gt;In May of 2005 I sent in my application. To my surprise, they accepted me into their character animation program. I decided to go for it full time and see where it would lead. When I handed in my 4-week notice at work and explained why, the reaction from my engineering colleagues ranged from perplexed to dumbfounded.&lt;/p&gt;

&lt;p&gt;I may as well have joined the circus.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.ottoschnurr.com/ottos-hand.jpg&quot; alt=&quot;Otto's hand&quot; title=&quot;A sketch of mine from 2001&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I was wandering into territory not many software engineers dare tread. “What’s your favorite RGB color?” they’d ask. “How can you consider yourself an artist if you don’t even have a favorite RGB color?”&lt;/p&gt;

&lt;p&gt;Colors would be the least of my concerns.&lt;/p&gt;

&lt;p&gt;As it turned out, my adventure into training for a creative vocation was not at all what I had expected. New cracks of consideration started showing up in this thing that I had called my career and I was unprepared to deal with them.&lt;/p&gt;

&lt;p&gt;Looking back thirteen years later, if I could somehow reach back and give that person some advice this is what it would be.&lt;/p&gt;

&lt;h2 id=&quot;ghost-of-ottos-future&quot;&gt;Ghost of Otto’s Future&lt;/h2&gt;

&lt;p&gt;You are going from a left-brain field into a right-brain field. That’s going to have a stronger emotional component than you’re used to. The disappointments and challenges you’ll face won’t be on an intellectual level that can be reasoned out.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Should I learn more Python or continue getting better at Swift?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, you’ll be wandering into a subjective arena.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I know I need to learn overlap better but the work of this other student over here is blowing my mind. I don’t even understand how they’re doing it. At this point, I don’t know if better overlap will really even make a difference in my work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(hint: It will.)&lt;/p&gt;

&lt;p&gt;The biggest difference between a programming guru and an animation guru is that the animation guru will seem like a magician. You can make decent guesses at how a programming guru got good at their craft. In contrast, the animation guru’s skill will seem like a mystery. Like a professional surfer, the better they are, the more effortless they are going to make animating look (even though for most people, animation is quite difficult).&lt;/p&gt;

&lt;p&gt;Expect to run into students like this. The biggest gift you can give yourself is to try to not worry about it and avoid comparing yourself to them as much as you can.&lt;/p&gt;

&lt;p&gt;You are not there to be better than them. You’re not even there to try and be as good as them.&lt;/p&gt;

&lt;p&gt;You’re there to turn yourself into the best animator &lt;em&gt;that you can be&lt;/em&gt;, starting from where you are right now.&lt;/p&gt;

&lt;p&gt;A big trap that can get in your way is feeling bad about your work. It’s hard because portfolio is important. It will be emphasized. But the most important thing isn’t your work. It’s the &lt;em&gt;time you will get to spend working on the work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The pro surfer makes it look effortless because they’ve spent a ton of time in the water doing it. Less time out of the water thinking about it.&lt;/p&gt;

&lt;p&gt;As much as you can (without burning out), treat this situation as an unprecedented opportunity to invest &lt;em&gt;time&lt;/em&gt; in the animation craft. Regardless of how good or bad you think your work is, invest as much time as you can. Be that surfer that is in the water as much or more than anyone else.&lt;/p&gt;

&lt;p class=&quot;youtube-video&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/RiikgUvHfAA&quot; frameborder=&quot;0&quot; allow=&quot;clipboard-write; encrypted-media; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The students you will meet and the friends you will make are going to be your greatest career resource. Many of them will enter the animation industry (not just the best ones). Even decades later, many of them will still be there.&lt;/p&gt;

&lt;p&gt;Soon after school is done, they are not going to remember how good or bad you animate. They’re just going to remember what it’s like to hang out with you.&lt;/p&gt;

&lt;p&gt;Finally, if you do nothing else, go get &lt;a href=&quot;https://stevenpressfield.com/books/the-war-of-art/&quot;&gt;“The War of Art”&lt;/a&gt;. Read it often. Use it to help keep your internal Resistance at bay.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Look in your own heart. Unless I’m crazy, right now a still small voice is piping up, telling you as it has ten thousand times, the calling that is yours and yours alone. You know it. No one has to tell you. And unless I’m crazy, you’re no closer to taking action on it than you were yesterday or will be tomorrow. You think Resistance isn’t real? Resistance will bury you.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— &lt;a href=&quot;https://www.stevenpressfield.com&quot;&gt;Steven Pressfield&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;prologue&quot;&gt;Prologue&lt;/h2&gt;

&lt;p&gt;The program lasted 18 months.&lt;/p&gt;

&lt;p&gt;Until that point in my life, I had always thought of myself as having super power. A secret internal pool of something called “attention to detail” that was somehow inexhaustible. When necessary, I could pull out as much of it as I needed and recruit it for the situation at hand.&lt;/p&gt;

&lt;p&gt;With animation however, I had met my match. The attention to detail that the art form requires from animators is staggering. When a director asks to put the cup in a character’s left hand instead of its right hand, the professional animator will deliver. Even if it means rebuilding the entire performance to do so. Untold amounts of painstaking work gets discarded when necessary.&lt;/p&gt;

&lt;p&gt;For someone with software engineering sensibilities, this brute-force accountability to detail is an anathema. It’s seen as a liability that quickly gets trained out of us early in our careers. Concepts like abstraction and re-usability come to an engineer’s aid to manage these kinds of things. Without them, a project can &lt;a href=&quot;/complexity&quot;&gt;quickly get out of control&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In 2006, character animators didn’t have such luxuries (at least not yet). In a world where word processors give us the power of editing with cut and paste, character animation in a production sense still belongs to monks in the monastery where manuscripts are re-written in ink by hand.&lt;/p&gt;

&lt;h2 id=&quot;a-left-brain-returns&quot;&gt;A Left-Brain Returns&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://pragprog.com/book/tpp/the-pragmatic-programmer&quot;&gt;Pragmatic Programmer&lt;/a&gt; says you can’t simply gather requirements. You have to dig for them. That was my plan in 2007. I was a strange bird who had crossed the streams. A software developer who had seen a glimpse of what it was like to animate.&lt;/p&gt;

&lt;p&gt;Not long after I finished the animation program, I landed a new job &lt;a href=&quot;/hello-digitalfish&quot;&gt;working for two Pixar alumni&lt;/a&gt; on a character animation tool.&lt;/p&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">There was a time in my life when I wanted to bring more right-brain thinking into my career. The division between technical and creative work always seemed somehow artificial and pervasive. Like some unexpected obstacle in the road. A Monty Python bridge of death where you are stopped and forced to choose. Creative or technical. Design or implementation. Once you make the choice, you live with it. There’s no going back. Not without significant personal cost. No crossing the streams.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://s3.amazonaws.com/assets.ottoschnurr.com/animation-reel.png" /><media:content medium="image" url="https://s3.amazonaws.com/assets.ottoschnurr.com/animation-reel.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Complexity</title><link href="https://ottoschnurr.com/complexity" rel="alternate" type="text/html" title="Complexity" /><published>2018-03-28T00:00:00+00:00</published><updated>2018-03-28T00:00:00+00:00</updated><id>https://ottoschnurr.com/complexity</id><content type="html" xml:base="https://ottoschnurr.com/complexity">&lt;blockquote&gt;
  &lt;p&gt;The Programmers’ Credo: We do these things not because they are easy, but because we thought they were going to be easy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— &lt;a href=&quot;https://en.wikipedia.org/wiki/Maciej_Cegłowski&quot;&gt;Maciej Cegłowski&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The key to performance is elegance, not battalions of special cases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— &lt;a href=&quot;https://en.wikipedia.org/wiki/Jon_Bentley_(computer_scientist)&quot;&gt;Jon Bentley&lt;/a&gt; and &lt;a href=&quot;https://www.cs.dartmouth.edu/~doug/&quot;&gt;Doug McIlroy&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;First you learn the value of abstraction. Then you learn the cost of abstraction. Then you’re ready to engineer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— &lt;a href=&quot;https://en.wikipedia.org/wiki/Kent_Beck&quot;&gt;Kent Beck&lt;/a&gt;&lt;/p&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">The Programmers’ Credo: We do these things not because they are easy, but because we thought they were going to be easy. — Maciej Cegłowski The key to performance is elegance, not battalions of special cases. — Jon Bentley and Doug McIlroy First you learn the value of abstraction. Then you learn the cost of abstraction. Then you’re ready to engineer. — Kent Beck</summary></entry><entry><title type="html">Hello Capture and Motion</title><link href="https://ottoschnurr.com/hello-capture-and-motion" rel="alternate" type="text/html" title="Hello Capture and Motion" /><published>2017-09-21T00:00:00+00:00</published><updated>2017-09-21T00:00:00+00:00</updated><id>https://ottoschnurr.com/hello-capture-and-motion</id><content type="html" xml:base="https://ottoschnurr.com/hello-capture-and-motion">&lt;p&gt;We’ve been working on &lt;a href=&quot;https://www.techsmith.com/mobile-apps.html&quot;&gt;a couple new iOS apps at work&lt;/a&gt;. Both released this week.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.techsmith.com/mobile-apps.html&quot;&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.ottoschnurr.com/techsmith-capture.jpg&quot; alt=&quot;TechSmith capture&quot; title=&quot;TechSmith Capture is capable of recording the screen of an iPhone or iPad.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">We’ve been working on a couple new iOS apps at work. Both released this week.</summary></entry><entry><title type="html">Persistence</title><link href="https://ottoschnurr.com/persistence" rel="alternate" type="text/html" title="Persistence" /><published>2017-08-27T00:00:00+00:00</published><updated>2017-08-27T00:00:00+00:00</updated><id>https://ottoschnurr.com/persistence</id><content type="html" xml:base="https://ottoschnurr.com/persistence">&lt;blockquote&gt;
  &lt;p&gt;The best writing is rewriting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— E. B. White&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Opportunity is missed by most people because it is dressed in overalls and looks like work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— Thomas Edison&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Play a game you can win. Lose as much as you need to, to get there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— David Allen&lt;/p&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">The best writing is rewriting. — E. B. White Opportunity is missed by most people because it is dressed in overalls and looks like work. — Thomas Edison Play a game you can win. Lose as much as you need to, to get there. — David Allen</summary></entry><entry><title type="html">Reliability</title><link href="https://ottoschnurr.com/reliability" rel="alternate" type="text/html" title="Reliability" /><published>2017-06-26T00:00:00+00:00</published><updated>2017-06-26T00:00:00+00:00</updated><id>https://ottoschnurr.com/reliability</id><content type="html" xml:base="https://ottoschnurr.com/reliability">&lt;blockquote&gt;
  &lt;p&gt;If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilisation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— &lt;a href=&quot;https://en.wikipedia.org/wiki/Gerald_Weinberg&quot;&gt;Gerald Weinberg&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— &lt;a href=&quot;https://en.wikipedia.org/wiki/Henry_Spencer&quot;&gt;Henry Spencer&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;… In fact, never ever use gets() or sprintf(), period. If you do, we will send evil dwarfs after you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— FreeBSD Secure Programming Guidelines&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Simplicity is prerequisite for reliability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— &lt;a href=&quot;https://en.wikipedia.org/wiki/Edsger_Dijkstra&quot;&gt;Edsger Dijkstra&lt;/a&gt;&lt;/p&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilisation. — Gerald Weinberg Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end. — Henry Spencer … In fact, never ever use gets() or sprintf(), period. If you do, we will send evil dwarfs after you. — FreeBSD Secure Programming Guidelines Simplicity is prerequisite for reliability. — Edsger Dijkstra</summary></entry><entry><title type="html">Courage</title><link href="https://ottoschnurr.com/courage" rel="alternate" type="text/html" title="Courage" /><published>2017-05-11T00:00:00+00:00</published><updated>2017-05-11T00:00:00+00:00</updated><id>https://ottoschnurr.com/courage</id><content type="html" xml:base="https://ottoschnurr.com/courage">&lt;blockquote&gt;
  &lt;p&gt;Life shrinks or expands in proportion to one’s courage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;quote-source&quot;&gt;— Anais Nin&lt;/p&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">Life shrinks or expands in proportion to one’s courage. — Anais Nin</summary></entry><entry><title type="html">Jekyll Notes</title><link href="https://ottoschnurr.com/jekyll-notes" rel="alternate" type="text/html" title="Jekyll Notes" /><published>2017-04-03T00:00:00+00:00</published><updated>2017-05-21T10:00:00+00:00</updated><id>https://ottoschnurr.com/jekyll-notes</id><content type="html" xml:base="https://ottoschnurr.com/jekyll-notes">&lt;p&gt;Most of this information comes directly from &lt;a href=&quot;https://jekyllrb.com/docs/home/&quot;&gt;documentation at jekyllrb.com&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;To learn Jekyll, first understand &lt;a href=&quot;https://github.com/Shopify/liquid/wiki/Liquid-for-Designers&quot;&gt;Liquid&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;To learn Liquid, first understand &lt;a href=&quot;https://yaml.org&quot;&gt;YAML&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;yaml&quot;&gt;&lt;a href=&quot;http://www.yaml.org/spec/1.2/spec.html#Introduction&quot;&gt;YAML&lt;/a&gt;&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;When data is easy to view and understand, programming becomes a simpler
task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Where JSON is designed for portability, YAML is
&lt;a href=&quot;http://www.yaml.org/spec/1.2/spec.html#id2708649&quot;&gt;designed for readabilty&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“YAML Ain’t Markup Language” (abbreviated YAML) is a data serialization
language designed to be human-friendly and work well with modern
programming languages for common everyday tasks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To achieve readability, YAML is more complex to parse than JSON.
Consequently, YAML is able to cover JSON as a superset. Valid JSON is also
valid YAML.&lt;/p&gt;

&lt;h3 id=&quot;primitives&quot;&gt;Primitives&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;maps&lt;/li&gt;
  &lt;li&gt;sequences&lt;/li&gt;
  &lt;li&gt;scalars (strings and numbers)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;YAML excels in working with those languages that are fundamentally built
around the three basic primitives. These include the new wave of agile
languages such as Perl, Python, PHP, Ruby, and JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;syntax&quot;&gt;Syntax&lt;/h3&gt;

&lt;p&gt;Colons map keys to values.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;time: 20:03:20
name: John Doe
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dashes designate a sequence&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Comments start with a hash.
# Three dashes start a YAML document.
---
- John
- Jane
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Sequences and maps may commingle.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;-
   name: apple
   color: red
-
   name: banana
   color: yellow

fruit:
   - apple
   - banana
vegetable:
   - carrot
   - onion
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;More &lt;a href=&quot;http://www.yaml.org/spec/1.2/spec.html#Preview&quot;&gt;YAML syntax here&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;liquid&quot;&gt;Liquid&lt;/h2&gt;

&lt;p&gt;Liquid is a &lt;a href=&quot;https://github.com/Shopify/liquid/wiki/Liquid-for-Programmers&quot;&gt;ruby implementation&lt;/a&gt; that parses &lt;a href=&quot;https://github.com/Shopify/liquid#what-does-it-look-like&quot;&gt;markup embedded with
template expressions&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;ul id=&quot;products&quot;&amp;gt;
  {% for product in products %}
    &amp;lt;li&amp;gt;
      &amp;lt;h2&amp;gt;{{ product.name }}&amp;lt;/h2&amp;gt;
      Only {{ product.price | price }}
      {{ product.description | prettyprint | paragraph }}
    &amp;lt;/li&amp;gt;
  {% endfor %}
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once the templates are compiled, Liquid &lt;a href=&quot;https://github.com/Shopify/liquid#how-to-use-liquid&quot;&gt;evaluates them with supplied
parameters&lt;/a&gt; to “render” new markup as output.&lt;/p&gt;

&lt;h3 id=&quot;primitives-1&quot;&gt;Primitives&lt;/h3&gt;

&lt;p&gt;Liquid offers two kinds of markup.&lt;/p&gt;

&lt;p&gt;Output markup pipes content through &lt;a href=&quot;https://github.com/Shopify/liquid/wiki/Liquid-for-Designers#standard-filters&quot;&gt;filters&lt;/a&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;    Hello {{ 'dave' | capitalize }}.&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Tag markup applies &lt;a href=&quot;https://github.com/Shopify/liquid/wiki/Liquid-for-Designers#tags&quot;&gt;control logic&lt;/a&gt;&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;{% if user %}
  Hello {{ user.name }}.
{% endif %}&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;building-with-jekyll&quot;&gt;Building with Jekyll&lt;/h2&gt;

&lt;h3 id=&quot;overview&quot;&gt;Overview&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt; is a simple, blog aware, static site generator. It’s the
engine behind &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unlike blog engines that use a database, Jekyll parses files from a directory
structure to statically generate a website.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jekyll at its core is a text transformation engine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Consequently, source text for a Jekyll website can live in version control.&lt;/p&gt;

&lt;p&gt;Jekyll &lt;a href=&quot;https://jekyllrb.com/docs/frontmatter/&quot;&gt;parses meta data&lt;/a&gt; from source files using
&lt;a href=&quot;https://yaml.org&quot;&gt;YAML&lt;/a&gt;. &lt;a href=&quot;https://github.com/Shopify/liquid/wiki/Liquid-for-Designers&quot;&gt;Liquid&lt;/a&gt; injects this data into template code for
output.&lt;/p&gt;

&lt;p&gt;Blog posts may be written as &lt;a href=&quot;https://daringfireball.net/projects/markdown/&quot;&gt;Markdown&lt;/a&gt; source files and then
injected as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{{ content }}&lt;/code&gt; into template code.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;verified with: MacBook Pro (Mid 2014), OS X 10.11.6&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Using &lt;a href=&quot;http://mattgiguere.com/2015/12/16/Installing_Jekyll_on_Mac_OS_X_El_Capitan.html&quot;&gt;these OS X instructions&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo gem update --system
xcode-select --install
sudo xcodebuild -license
brew install ruby
sudo gem install -n /usr/local/bin jekyll bundler
bundle update
bundle install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;local-blog&quot;&gt;Local Blog&lt;/h4&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jekyll new myblog
cd myblog
bundle exec jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;alternate-instructions&quot;&gt;Alternate Instructions&lt;/h4&gt;

&lt;p&gt;The steps outlined &lt;a href=&quot;https://idratherbewriting.com/documentation-theme-jekyll/mydoc_install_jekyll_on_mac.html&quot;&gt;here&lt;/a&gt; seem to be specifically catered
to the Mac.&lt;/p&gt;

&lt;h4 id=&quot;basic-commands&quot;&gt;Basic Commands&lt;/h4&gt;

&lt;p&gt;Compile current folder into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/&lt;/code&gt; directory:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jekyll build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Compile current folder into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;destination&amp;gt;&lt;/code&gt; folder:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jekyll build --destination &amp;lt;destination&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Compile &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;source&amp;gt;&lt;/code&gt; folder into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;destination&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jekyll build --source &amp;lt;source&amp;gt; --destination &amp;lt;destination&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Watch the current folder. Automatically compile changes into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jekyll build --watch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; is considered “global” configuration. Changes there are not
watched. Instead the executable must be restarted.&lt;/p&gt;

&lt;p&gt;The destination folder is always cleaned on rebuilds. Don’t put anything
there unless you add it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keep_files&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;source-structure&quot;&gt;Source Structure&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Taken directly from &lt;a href=&quot;https://jekyllrb.com/docs/structure/&quot;&gt;jekyllrb.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.
├── _config.yml
├── _data
|   └── members.yml
├── _drafts
|   ├── begin-with-the-crazy-ideas.md
|   └── on-simplicity-in-technology.md
├─(gem)─ _includes
|        ├── footer.html
|        └── header.html
├─(gem)─ _layouts
|        ├── default.html
|        └── post.html
├── _posts
|   ├── 2007-10-29-why-every-programmer-should-play-nethack.md
|   └── 2009-04-26-barcamp-boston-4-roundup.md
├─(gem)─ _sass
|        ├── _base.scss
|        └── _layout.scss
├── _site
├── .jekyll-metadata
└── index.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;: Build configuration.
    &lt;ul&gt;
      &lt;li&gt;An alternative to loading up &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jekyll build&lt;/code&gt; with a bunch of command-line arguments.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_drafts/&lt;/code&gt;: Articles that are not published.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_includes/&lt;/code&gt;: Reusable code/content to share across pages and posts.
    &lt;ul&gt;
      &lt;li&gt;Invoked using liquid tag, e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{% include header.html %}&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_layouts/&lt;/code&gt;: Contains templates for posts.
    &lt;ul&gt;
      &lt;li&gt;Chosen using the &lt;a href=&quot;https://jekyllrb.com/docs/frontmatter/&quot;&gt;YAML front matter&lt;/a&gt; of each post.&lt;/li&gt;
      &lt;li&gt;A post is injected into a template using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{{ content }}&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_posts/&lt;/code&gt;: Where the articles live.
    &lt;ul&gt;
      &lt;li&gt;The filename convention for each article is specific:
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YEAR-MONTH-DAY-title.MARKUP&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;The resulting link for each article is &lt;a href=&quot;https://jekyllrb.com/docs/permalinks/&quot;&gt;configured&lt;/a&gt; using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;permalink&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_data/&lt;/code&gt;: Data files that jekyll loads and makes available at build time.
    &lt;ul&gt;
      &lt;li&gt;Supported formats: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.yml&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.yaml&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.json&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.csv&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Example: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;members.yml&lt;/code&gt; would be available as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;site.data.members&lt;/code&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_sass/&lt;/code&gt;: Contains &lt;a href=&quot;https://sass-lang.com/guide&quot;&gt;Sass partials&lt;/a&gt; that compile into a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main.css&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/&lt;/code&gt;: The default destination targeted by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jekyll build&lt;/code&gt;.
    &lt;ul&gt;
      &lt;li&gt;Any previous content in this directory is clobbered
        &lt;ul&gt;
          &lt;li&gt;Unless added to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keep_files&lt;/code&gt;.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.jekyll-metadata&lt;/code&gt;: Private file for tracking incremental builds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any remaining files in the source directory are converted by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jekyll&lt;/code&gt; if:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Then contain &lt;a href=&quot;https://jekyllrb.com/docs/frontmatter/&quot;&gt;YAML front matter&lt;/a&gt; and …&lt;/li&gt;
  &lt;li&gt;They have an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.markdown&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.md&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.textile&lt;/code&gt; file extension.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Otherwise, files and folders in the source directory are copied into the
target destination as is.&lt;/p&gt;

&lt;h3 id=&quot;configuration&quot;&gt;Configuration&lt;/h3&gt;

&lt;p&gt;There are a variety of &lt;a href=&quot;https://jekyllrb.com/docs/configuration/#configuration-settings&quot;&gt;global options&lt;/a&gt; that can be specified either in
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; or as command-line arguments (or both).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;source directory, destination directory&lt;/li&gt;
  &lt;li&gt;files to include or exclude&lt;/li&gt;
  &lt;li&gt;timezone, character encoding&lt;/li&gt;
  &lt;li&gt;drafts, future and unpublished posts&lt;/li&gt;
  &lt;li&gt;build environment&lt;/li&gt;
  &lt;li&gt;incremental and profile builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also specify
&lt;a href=&quot;https://jekyllrb.com/docs/configuration/#front-matter-defaults&quot;&gt;default values across specific areas of the site&lt;/a&gt;
(for known and custom variables).&lt;/p&gt;

&lt;p&gt;Here’s the &lt;a href=&quot;https://jekyllrb.com/docs/configuration/#default-configuration&quot;&gt;complete list of default options that Jekyll runs with&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;content-in-jekyll&quot;&gt;Content in Jekyll&lt;/h2&gt;

&lt;h3 id=&quot;yaml-front-matter&quot;&gt;YAML Front Matter&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
# The first line segment starts a YAML &quot;document&quot;.
# In Jekyll, this document is known as &quot;YAML front
# matter&quot;. It is the indicator to Jekyll that a file
# should get sent through the text engine.

# YAML front matter doesn't have to contain anything.
# However if it does, the information there becomes
# available to the the Jekyll build including this `page`
# containing the front matter.

title: Describing YAML Front Matter
custom_variable: custom values

# The second line segment ends the front matter.
---

All the stuff here is processed as `{{ content }}` in layout files.
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Predefined front matter &lt;a href=&quot;https://jekyllrb.com/docs/frontmatter/#predefined-global-variables&quot;&gt;variables for all files&lt;/a&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;layout&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;permalink&lt;/code&gt;,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;published&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Additional &lt;a href=&quot;https://jekyllrb.com/docs/frontmatter/#predefined-variables-for-posts&quot;&gt;front matter variables for posts&lt;/a&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;date&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;category&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tags&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;date&lt;/code&gt; helps give a post more precision if necessary for sorting different posts that occur on the same day.&lt;/p&gt;

&lt;h3 id=&quot;blog-posts&quot;&gt;Blog Posts&lt;/h3&gt;

&lt;p&gt;Add posts into the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_posts/&lt;/code&gt; directory with the format
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YEAR-MONTH-DAY-title.MARKDOWN&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;linking-to-other-posts&quot;&gt;Linking to Other Posts&lt;/h4&gt;

&lt;p&gt;Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_url&lt;/code&gt; to &lt;a href=&quot;https://jekyllrb.com/docs/templates/#linking-to-posts&quot;&gt;refer to other posts in the site&lt;/a&gt;. This
inoculates the link against changes in markup and permalink format.&lt;/p&gt;

&lt;h4 id=&quot;linking-to-assets&quot;&gt;Linking to Assets&lt;/h4&gt;

&lt;p&gt;You can use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{{ site.url }}&lt;/code&gt; to innoculate against changes to the location of the blog (e.g. going from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog.example.com&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;example.com/blog/&lt;/code&gt;).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;You can [get the PDF here]({{ site.url }}/assets/doc.pdf).
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You don’t need to do this if you know the blog will always be at the root.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;You can [get the PDF here](/assets/doc.pdf).
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;access-to-posts&quot;&gt;Access to Posts&lt;/h4&gt;

&lt;p&gt;All posts are available in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;site.posts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A variety of post components are available including &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;title&lt;/code&gt; and
&lt;a href=&quot;https://jekyllrb.com/docs/posts/#post-excerpts&quot;&gt;exerpts&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;static-pages&quot;&gt;Static Pages&lt;/h3&gt;

&lt;p&gt;A static page (as opposed to a post) is content that is not date-based.&lt;/p&gt;

&lt;p&gt;Place marked up files with front matter in the source directory or in
subdirectories and those files will appear as HTML pages (in the same
subdirectories) in the destination directory.&lt;/p&gt;

&lt;h3 id=&quot;static-files&quot;&gt;Static Files&lt;/h3&gt;

&lt;p&gt;Files that aren’t converted and just copied by Jekyll are collected in
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;site.static_files&lt;/code&gt;. These files still have some
&lt;a href=&quot;https://jekyllrb.com/docs/static-files/&quot;&gt;Liquid properties&lt;/a&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;modified_time&lt;/code&gt;,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;name&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;basename&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;extname&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can assign additional front matter to these files using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;defaults&lt;/code&gt; in
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;variables&quot;&gt;Variables&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jekyllrb.com/docs/variables/#global-variables&quot;&gt;global variables&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jekyllrb.com/docs/variables/#site-variables&quot;&gt;site variables&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jekyllrb.com/docs/variables/#page-variables&quot;&gt;page variables&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jekyllrb.com/docs/variables/#paginator&quot;&gt;paginator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;collections&quot;&gt;Collections&lt;/h3&gt;

&lt;p&gt;A collection (like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;posts&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pages&lt;/code&gt;) is a namespace for a sequence of
items. You can create &lt;a href=&quot;https://jekyllrb.com/docs/collections/#documents&quot;&gt;custom collections&lt;/a&gt; (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;members&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apidocs&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Declare the collection type in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;collections:
  members
  apidocs:
    output: true
    permalink: /api/:path/:title:output_ext
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Otto Schnurr</name></author><summary type="html">Most of this information comes directly from documentation at jekyllrb.com. To learn Jekyll, first understand Liquid. To learn Liquid, first understand YAML.</summary></entry></feed>