<?xml version="1.0" encoding="utf-8"?>

<feed xmlns="http://www.w3.org/2005/Atom">
<title>Tyler Cipriani: TIL</title>
<link href="https://tylercipriani.com/tags/TIL/"/>
<link href="https://tylercipriani.com/tags/TIL/index.atom" rel="self" type="application/atom+xml"/>
<author>

<name>Tyler Cipriani</name>

</author>

<rights type="html" xml:lang="en">

	<a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike License</a>
	Copyright © 2017 Tyler Cipriani

</rights>


<id>https://tylercipriani.com/tags/TIL/</id>

<subtitle type="html">Tyler Cipriani</subtitle>
<generator uri="http://ikiwiki.info/">ikiwiki</generator>
<updated>2019-12-31T18:38:37Z</updated>
<entry>
	<title>The Square Knot</title>

	<id>https://tylercipriani.com/blog/2019/12/31/the-square-knot/</id>

	<link href="https://tylercipriani.com/blog/2019/12/31/the-square-knot/"/>

	<author><name>Tyler Cipriani</name></author>


	<rights type="html" xml:lang="en">

		Copyright © 2019 Tyler Cipriani

	</rights>



	<category term="TIL" />

	<category term="knots" />


	<updated>2019-12-31T18:38:37Z</updated>
	<published>2019-12-31T17:37:58Z</published>


	<content type="html" xml:lang="en">
	&lt;p&gt;TIL how to tie my shoes 😐.&lt;/p&gt;
&lt;p&gt;I figured this out today – the last day of 2019 – while I was tying together two ends of &lt;a href=&quot;https://www.knotandrope.com/products/1-4-solid-braid-cotton&quot;&gt;cotton sash cord&lt;/a&gt; to make a loop. I suddenly noticed my square knot didn’t look like the cover of the &lt;a href=&quot;https://www.scoutshop.org/knots-and-how-to-tie-them-33170.html&quot;&gt;Boy Scouts knot book&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I looked up the square knot on &lt;a href=&quot;https://www.animatedknots.com/square-knot&quot;&gt;animatedknots.com&lt;/a&gt; – which is an amazing site with step-by-step instructions for all kinds of knots. Sure enough, I had been doing wrong – left-over-right, left-over-right – a &lt;em&gt;granny&lt;/em&gt; knot vs a &lt;em&gt;square&lt;/em&gt; knot.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://photos.tylercipriani.com/thumbs/98/35fdab9623b1a33494ae7288baa1e9/large.jpg&quot; title=&quot;Loose Granny Knot&quot; alt=&quot;Granny Knot&quot;&gt;
    &lt;figcaption&gt;Loose Granny Knot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://photos.tylercipriani.com/thumbs/20/1930bb79419f3618b660d77414b9c3/large.jpg&quot; title=&quot;Loose Square/Reef Knot&quot; alt=&quot;Square Knot&quot;&gt;
    &lt;figcaption&gt;Loose Square/Reef Knot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This was satisfying, if a little embarassing – I somehow made it through Cub Scouts without learning to tie a square knot. As I kept reading animatedknots.com I learned something else:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Square (Reef) Knot […] is usually learned when we tie the laces on our first pair of shoes. Admittedly it is usually a bow that we tie – but the underlying knot is a Square (Reef) Knot.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I quickly untied and retied my shoes – left-over-right, left-over-right – damnit – a granny knot. It’s especially frustrating given that I’d seen &lt;a href=&quot;https://www.fieggen.com/shoelace/grannyknot.htm&quot;&gt;Ian’s Shoelace Site’s page on Granny Knots&lt;/a&gt; forever ago and dismissed it because my shoelace bows weren’t askew.&lt;/p&gt;
&lt;p&gt;So here I am – a living cautionary tale. It’s the last day of 2019. I’m 33. And I &lt;em&gt;just&lt;/em&gt; learned to tie my shoes 🌠.&lt;/p&gt;

	</content>


	<link rel="comments" href="//tylercipriani.com/blog/2019/12/31/the-square-knot/#comments" type="text/html" />


	<link rel="comments" href="//tylercipriani.com/blog/2019/12/31/the-square-knot/comments.atom" type="application/atom+xml" />

</entry>
<entry>
	<title>Git Annex Metadata Filtered Views</title>

	<id>https://tylercipriani.com/blog/2016/09/28/git-annex-metadata-filtered-views/</id>

	<link href="https://tylercipriani.com/blog/2016/09/28/git-annex-metadata-filtered-views/"/>

	<author><name>Tyler Cipriani</name></author>



	<rights type="html" xml:lang="en">
	Creative Commons Attribution-ShareAlike License
	</rights>




	<category term="git" />

	<category term="git-annex" />

	<category term="til" />


	<updated>2017-10-12T03:25:12Z</updated>
	<published>2016-09-29T03:30:55Z</published>


	<content type="html" xml:lang="en">
	&lt;p&gt;Git annex goes mindbogglingly deep.&lt;/p&gt;
&lt;p&gt;I use git annex to manage my photos – I have tons of RAW photos in &lt;code&gt;~/Pictures&lt;/code&gt; that are backed-up to a few git annex special remotes.&lt;/p&gt;
&lt;p&gt;Whenever I&#39;m done editing a set of raw files I go through this song and dance:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb1&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;bu&quot;&gt;cd&lt;/span&gt; raw&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex add&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-3&quot; title=&quot;3&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex copy --to=s3&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-4&quot; title=&quot;4&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex copy --to=nas&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-5&quot; title=&quot;5&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; commit -m &lt;span class=&quot;st&quot;&gt;&amp;#39;Added a bunch of files to s3&amp;#39;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-6&quot; title=&quot;6&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; push origin master&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-7&quot; title=&quot;7&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; push origin git-annex&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-8&quot; title=&quot;8&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex drop&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And magically my raw files are available on s3 and my home NAS.&lt;/p&gt;
&lt;p&gt;If I jump over to a different machine I can run:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb2&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;bu&quot;&gt;cd&lt;/span&gt; ~/Pictures&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; fetch&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-3&quot; title=&quot;3&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; rebase&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-4&quot; title=&quot;4&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex get [new-raw-file]&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that raw file is available on my new machine, I can open it in Darktable, I can do whatever I want to it: it&#39;s just a file.&lt;/p&gt;
&lt;p&gt;This is a pretty powerful extension of git.&lt;/p&gt;
&lt;p&gt;While I was reading the &lt;a href=&quot;https://git-annex.branchable.com/internals/&quot;&gt;git annex internals&lt;/a&gt; page today I stumbled across an even more powerful feature: metadata. You can store and retrieve arbitrary metadata about any git annex file. For instance, if I wanted to store EXIF info for a particular file, I could do:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb3&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex metadata 20140118-BlazeyAndTyler.jpg --set exif=&lt;span class=&quot;st&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;va&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;exiftool&lt;/span&gt; -S \&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-2&quot; title=&quot;2&quot;&gt;  -filename \&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-3&quot; title=&quot;3&quot;&gt;  -filetypeextensions \&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-4&quot; title=&quot;4&quot;&gt;  -make \&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-5&quot; title=&quot;5&quot;&gt;  -model \&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-6&quot; title=&quot;6&quot;&gt;  -lensid \&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-7&quot; title=&quot;7&quot;&gt;  -focallength \&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-8&quot; title=&quot;8&quot;&gt;  -fnumber \&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-9&quot; title=&quot;9&quot;&gt;  -iso 20140118-BlazeyAndTyler.jpg&lt;span class=&quot;va&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And I can drop that file and still retrieve the EXIF data&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb4&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-1&quot; title=&quot;1&quot;&gt;$ &lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex drop 20140118-BlazeyAndTyler.jpg&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;ex&quot;&gt;drop&lt;/span&gt; 20140118-BlazeyAndTyler.jpg (checking tylercipriani-raw...) &lt;span class=&quot;kw&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;checking&lt;/span&gt; tylercipriani-raw...&lt;span class=&quot;kw&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kw&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;checking&lt;/span&gt; tylercipriani-raw...&lt;span class=&quot;kw&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ex&quot;&gt;ok&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-3&quot; title=&quot;3&quot;&gt;&lt;span class=&quot;kw&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;recording&lt;/span&gt; state in git...&lt;span class=&quot;kw&quot;&gt;)&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-4&quot; title=&quot;4&quot;&gt;$ &lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex metadata --get exif !$&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-5&quot; title=&quot;5&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex metadata --get exif 20140118-BlazeyAndTyler.jpg&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-6&quot; title=&quot;6&quot;&gt;&lt;span class=&quot;ex&quot;&gt;FileName&lt;/span&gt;: 20140118-BlazeyAndTyler.jpg&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-7&quot; title=&quot;7&quot;&gt;&lt;span class=&quot;ex&quot;&gt;Make&lt;/span&gt;: SAMSUNG&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-8&quot; title=&quot;8&quot;&gt;&lt;span class=&quot;ex&quot;&gt;Model&lt;/span&gt;: SPH-L720&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-9&quot; title=&quot;9&quot;&gt;&lt;span class=&quot;ex&quot;&gt;FocalLength&lt;/span&gt;: 4.2 mm&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-10&quot; title=&quot;10&quot;&gt;&lt;span class=&quot;ex&quot;&gt;FNumber&lt;/span&gt;: 2.2&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb4-11&quot; title=&quot;11&quot;&gt;&lt;span class=&quot;ex&quot;&gt;ISO&lt;/span&gt;: 125&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is pretty neat, but it can also be achieved with &lt;a href=&quot;https://tylercipriani.com/blog/2016/08/26/abusing-git-notes/&quot;&gt;git notes&lt;/a&gt; so it&#39;s nothing too spectacular.&lt;/p&gt;
&lt;p&gt;But git annex metadata doesn&#39;t quite stop there.&lt;/p&gt;
&lt;section id=&quot;random-background&quot; class=&quot;level2&quot;&gt;
&lt;h2&gt;Random background &lt;a href=&quot;https://tylercipriani.com/tags/TIL/#random-background&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My picture directory is laid out like this:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb5&quot;&gt;&lt;pre class=&quot;sourceCode txt&quot;&gt;&lt;code class=&quot;sourceCode default&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-1&quot; title=&quot;1&quot;&gt;Pictures/&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-2&quot; title=&quot;2&quot;&gt;└── 2015&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-3&quot; title=&quot;3&quot;&gt;    └── 2015-08-14_Project-name&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-4&quot; title=&quot;4&quot;&gt;        ├── bin&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-5&quot; title=&quot;5&quot;&gt;        │   └── convert-and-resize.sh&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-6&quot; title=&quot;6&quot;&gt;        ├── edit&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-7&quot; title=&quot;7&quot;&gt;        │   ├── 2015-08-14_Project-name_00001.jpg&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-8&quot; title=&quot;8&quot;&gt;        │   └── 2015-08-14_Project-name_00002.jpg&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-9&quot; title=&quot;9&quot;&gt;        └── raw&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb5-10&quot; title=&quot;10&quot;&gt;            └── 2015-08-14_Project-name_00001.NEF&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I have directories for each year, under those directories I create directories that are prefixed with the &lt;a href=&quot;https://xkcd.com/1179/&quot;&gt;ISO 8601&lt;/a&gt; import date for the photo, some memorable project name (like &lt;code&gt;mom-birthday&lt;/code&gt; or &lt;code&gt;rmnp-hike&lt;/code&gt;). Inside that directory I have 2 directories: &lt;code&gt;raw&lt;/code&gt; and &lt;code&gt;edit&lt;/code&gt;. Inside each one of those directories, I have photos that are named with ISO 8601 import date, project name, and 5-digit import number and a file extension – raw files go in &lt;code&gt;raw&lt;/code&gt; and edited/finished files &lt;code&gt;edit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I got this system from &lt;a href=&quot;http://www.rileybrandt.com/lessons/&quot;&gt;Riley Brandt&lt;/a&gt; (I can&#39;t recommend the Open Source Photography Course enough – it&#39;s amazing!) and it&#39;s served me well. I can find stuff! But git annex really expands the possibilities of this system.&lt;/p&gt;
&lt;/section&gt;
&lt;section id=&quot;fictional-real-world-totally-real-actually-happening-scenario&quot; class=&quot;level2&quot;&gt;
&lt;h2&gt;Fictional, real-world, totally real actually happening scenario &lt;a href=&quot;https://tylercipriani.com/tags/TIL/#fictional-real-world-totally-real-actually-happening-scenario&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I go to Rocky Mountain National Park (RMNP) multiple times per year. I&#39;ve taken a lot of photos there. If I take a trip there in October I will generally import those photos in October and create &lt;code&gt;2015/2015-10-05_RMNP-hike/{raw,edit}&lt;/code&gt;, and then if I go there again next March I&#39;d create &lt;code&gt;2016/2016-03-21_RMNP-daytrip-with-blazey/{raw,edit}&lt;/code&gt;. So if I want to preview my RMNP edited photos from October I&#39;d go:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb6&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb6-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;bu&quot;&gt;cd&lt;/span&gt; 2015/2015-10-05_RMNP-hike/edit&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb6-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex get&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb6-3&quot; title=&quot;3&quot;&gt;&lt;span class=&quot;ex&quot;&gt;geeqie&lt;/span&gt; .&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But what happens if I want to see all the photos I&#39;ve ever taken in RMNP? I could probably cook up some script to do this. Off the top of my head I could do something like &lt;code&gt;find . -iname &#39;*rmnp*&#39; -type l&lt;/code&gt;, but that would undoubtedly miss some files from a project in RMNP that I didn&#39;t name with the string &lt;code&gt;rmnp&lt;/code&gt;. Git annex gives me a different option: metadata tags.&lt;/p&gt;
&lt;/section&gt;
&lt;section id=&quot;metadata-tags&quot; class=&quot;level2&quot;&gt;
&lt;h2&gt;Metadata Tags &lt;a href=&quot;https://tylercipriani.com/tags/TIL/#metadata-tags&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Git annex supports a special type of short metadata – &lt;code&gt;--tag&lt;/code&gt;. With &lt;code&gt;--tag&lt;/code&gt;, you can tag individual files in your repo.&lt;/p&gt;
&lt;p&gt;The WMF reading team offsite in 2016 was partially in RMNP, but I didn&#39;t name any photos &lt;code&gt;RMNP&lt;/code&gt; because that wasn&#39;t the most memorable bit of information about those photos (&lt;code&gt;reading-team-offsite&lt;/code&gt; seemed like a better project name) nor did &lt;code&gt;RMNP&lt;/code&gt; represent all the photos from the offsite. I should tag a few of those photos &lt;code&gt;rmnp&lt;/code&gt; with git annex:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb7&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-1&quot; title=&quot;1&quot;&gt;$ &lt;span class=&quot;bu&quot;&gt;cd&lt;/span&gt; ./2016/2016-05-01_wikimedia-reading-offsite/edit/&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-2&quot; title=&quot;2&quot;&gt;$ &lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex metadata --tag rmnp Elk.jpg&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-3&quot; title=&quot;3&quot;&gt;&lt;span class=&quot;ex&quot;&gt;metadata&lt;/span&gt; Elk.jpg &lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-4&quot; title=&quot;4&quot;&gt;  &lt;span class=&quot;va&quot;&gt;lastchanged=&lt;/span&gt;2016-09-29&lt;span class=&quot;ex&quot;&gt;@04-14-44&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-5&quot; title=&quot;5&quot;&gt;  &lt;span class=&quot;va&quot;&gt;tag=&lt;/span&gt;rmnp&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-6&quot; title=&quot;6&quot;&gt;  &lt;span class=&quot;ex&quot;&gt;tag-lastchanged&lt;/span&gt;=2016-09-29@04-14-44&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-7&quot; title=&quot;7&quot;&gt;&lt;span class=&quot;ex&quot;&gt;ok&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-8&quot; title=&quot;8&quot;&gt;&lt;span class=&quot;kw&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;recording&lt;/span&gt; state in git...&lt;span class=&quot;kw&quot;&gt;)&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-9&quot; title=&quot;9&quot;&gt;$ &lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex metadata --tag rmnp Reading&lt;span class=&quot;dt&quot;&gt;\ &lt;/span&gt;folks&lt;span class=&quot;dt&quot;&gt;\ &lt;/span&gt;bing&lt;span class=&quot;dt&quot;&gt;\ &lt;/span&gt;higher&lt;span class=&quot;dt&quot;&gt;\ &lt;/span&gt;up&lt;span class=&quot;dt&quot;&gt;\ &lt;/span&gt;than&lt;span class=&quot;dt&quot;&gt;\ &lt;/span&gt;it&lt;span class=&quot;dt&quot;&gt;\ &lt;/span&gt;looks.jpg&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-10&quot; title=&quot;10&quot;&gt;&lt;span class=&quot;ex&quot;&gt;metadata&lt;/span&gt; Reading folks bing higher up than it looks.jpg &lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-11&quot; title=&quot;11&quot;&gt;  &lt;span class=&quot;va&quot;&gt;lastchanged=&lt;/span&gt;2016-09-29&lt;span class=&quot;ex&quot;&gt;@04-14-57&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-12&quot; title=&quot;12&quot;&gt;  &lt;span class=&quot;va&quot;&gt;tag=&lt;/span&gt;rmnp&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-13&quot; title=&quot;13&quot;&gt;  &lt;span class=&quot;ex&quot;&gt;tag-lastchanged&lt;/span&gt;=2016-09-29@04-14-57&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-14&quot; title=&quot;14&quot;&gt;&lt;span class=&quot;ex&quot;&gt;ok&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb7-15&quot; title=&quot;15&quot;&gt;&lt;span class=&quot;kw&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;recording&lt;/span&gt; state in git...&lt;span class=&quot;kw&quot;&gt;)&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Also, when my old roommate came to town we went to RMNP, but I tagged those photos &lt;code&gt;cody-family-adventure-time&lt;/code&gt;. So let&#39;s tag a few of those &lt;code&gt;rmnp&lt;/code&gt;, too:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb8&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb8-1&quot; title=&quot;1&quot;&gt;$ &lt;span class=&quot;bu&quot;&gt;cd&lt;/span&gt; 2015/2016-01-25_cody-family-adventuretime/edit&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb8-2&quot; title=&quot;2&quot;&gt;$ &lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex metadata --tag rmnp alberta-falls.jpg&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb8-3&quot; title=&quot;3&quot;&gt;&lt;span class=&quot;ex&quot;&gt;metadata&lt;/span&gt; alberta-falls.jpg &lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb8-4&quot; title=&quot;4&quot;&gt;  &lt;span class=&quot;va&quot;&gt;lastchanged=&lt;/span&gt;2016-09-29&lt;span class=&quot;ex&quot;&gt;@04-17-48&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb8-5&quot; title=&quot;5&quot;&gt;  &lt;span class=&quot;va&quot;&gt;tag=&lt;/span&gt;rmnp&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb8-6&quot; title=&quot;6&quot;&gt;  &lt;span class=&quot;ex&quot;&gt;tag-lastchanged&lt;/span&gt;=2016-09-29@04-17-48&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb8-7&quot; title=&quot;7&quot;&gt;&lt;span class=&quot;ex&quot;&gt;ok&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb8-8&quot; title=&quot;8&quot;&gt;&lt;span class=&quot;kw&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;recording&lt;/span&gt; state in git...&lt;span class=&quot;kw&quot;&gt;)&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id=&quot;metadata-views&quot; class=&quot;level2&quot;&gt;
&lt;h2&gt;Metadata views &lt;a href=&quot;https://tylercipriani.com/tags/TIL/#metadata-views&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now the thing that was really surprising to me, you can filter the whole pictures directory based on a particular tag with git annex by using a &lt;a href=&quot;https://git-annex.branchable.com/tips/metadata_driven_views/&quot;&gt;metadata driven view&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb9&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-1&quot; title=&quot;1&quot;&gt;$ &lt;span class=&quot;ex&quot;&gt;tree&lt;/span&gt; -d -L 1&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;ex&quot;&gt;.&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-3&quot; title=&quot;3&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;2011&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-4&quot; title=&quot;4&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;2012&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-5&quot; title=&quot;5&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;2013&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-6&quot; title=&quot;6&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;2014&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-7&quot; title=&quot;7&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;2015&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-8&quot; title=&quot;8&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;2016&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-9&quot; title=&quot;9&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;instagram&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-10&quot; title=&quot;10&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;lib&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-11&quot; title=&quot;11&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;lossy&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-12&quot; title=&quot;12&quot;&gt;├── &lt;span class=&quot;ex&quot;&gt;nasa&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-13&quot; title=&quot;13&quot;&gt;└── &lt;span class=&quot;ex&quot;&gt;Webcam&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-14&quot; title=&quot;14&quot;&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-15&quot; title=&quot;15&quot;&gt;$ &lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; annex view tag=rmnp&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-16&quot; title=&quot;16&quot;&gt;&lt;span class=&quot;ex&quot;&gt;view&lt;/span&gt;  (searching...) &lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-17&quot; title=&quot;17&quot;&gt;&lt;span class=&quot;ex&quot;&gt;Switched&lt;/span&gt; to branch &lt;span class=&quot;st&quot;&gt;&amp;#39;views/(tag=rmnp)&amp;#39;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-18&quot; title=&quot;18&quot;&gt;&lt;span class=&quot;ex&quot;&gt;ok&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-19&quot; title=&quot;19&quot;&gt;$ &lt;span class=&quot;fu&quot;&gt;ls&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-20&quot; title=&quot;20&quot;&gt;&lt;span class=&quot;ex&quot;&gt;alberta-falls_%2015%2016-01-25_cody-family-adventuretime%edit%.jpg&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-21&quot; title=&quot;21&quot;&gt;&lt;span class=&quot;ex&quot;&gt;Elk_%2016%2016-05-01_wikimedia-reading-offsite%edit%.jpg&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb9-22&quot; title=&quot;22&quot;&gt;&lt;span class=&quot;ex&quot;&gt;Reading&lt;/span&gt; folks bing higher up than it looks_%2016%2016-05-01_wikimedia-reading-offsite%edit%.jpg&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I can even filter this view using other tags with &lt;code&gt;git annex vfilter tag=whatever&lt;/code&gt;. And I can continue to edit, refine, and work with the photo files from there.&lt;/p&gt;
&lt;p&gt;This feature absolutely blew my mind – I dropped what I was doing to write this – I&#39;m trying to think of a good way to work it into my photo workflow &lt;img src=&quot;https://tylercipriani.com/smileys/smile.png&quot; alt=&quot;:)&quot; /&gt;&lt;/p&gt;
&lt;/section&gt;

	</content>


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/28/git-annex-metadata-filtered-views/#comments" type="text/html" />


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/28/git-annex-metadata-filtered-views/comments.atom" type="application/atom+xml" />

</entry>
<entry>
	<title>The 14KB in the TCP Initial Window</title>

	<id>https://tylercipriani.com/blog/2016/09/25/the-14kb-in-the-tcp-initial-window/</id>

	<link href="https://tylercipriani.com/blog/2016/09/25/the-14kb-in-the-tcp-initial-window/"/>

	<author><name>Tyler Cipriani</name></author>






	<category term="computing" />

	<category term="tcp" />

	<category term="til" />


	<updated>2017-02-14T15:11:05Z</updated>
	<published>2016-09-26T03:07:53Z</published>


	<content type="html" xml:lang="en">
	&lt;p&gt;Today I went to coffee with a buddy of mine from &lt;code&gt;$DAY_JOB - 2&lt;/code&gt;. During coffee we were discussing all the folk theories of “fast” websites. I made some off-the-cuff remark that I didn’t really understand – that you should try to squeeze the most important bits of your website into the first &lt;em&gt;X&lt;/em&gt; bytes (&lt;em&gt;X&lt;/em&gt; being a value I didn’t remember) for an opaque reason that has to do with TCP congestion algorithms that I’ve never understood.&lt;/p&gt;
&lt;p&gt;We spent a good chunk of time looking at Wireshark captures of an HTTP request. It got muddled and we got off-track because we were looking at an HTTPS request and we started talking about TLS1.2, CLIENT-HELLO, and the TLS handshake in general.&lt;/p&gt;
&lt;p&gt;I eventually found the &lt;a href=&quot;https://developers.google.com/speed/docs/insights/mobile&quot;&gt;source&lt;/a&gt; for what I was yammering about.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Due to how TCP estimates the capacity of a connection (i.e. TCP Slow Start), a new TCP connection cannot immediately use the full available bandwidth between the client and the server. Because of this, the server can send up to 10 TCP packets on a new connection (~14KB) in first roundtrip, and then it must wait for client to acknowledge this data before it can grow its congestion window and proceed to deliver more data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After I got home and ate some ice cream, I did some more reading trying to understand this stuff. I think a lot of what was confusing about the Wireshark stuff we were looking at is it also had TLS1.2 mixed in there. Requesting a plain-old HTTP, port 80 site made looking at packets a bit more sane.&lt;/p&gt;
&lt;p&gt;It seems like the size of a TCP packet is negotiated during the &lt;code&gt;SYN&lt;/code&gt;, &lt;code&gt;SYN-ACK&lt;/code&gt; phase of the TCP &lt;a href=&quot;http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm&quot;&gt;three-way handshake&lt;/a&gt;. In the &lt;code&gt;Options&lt;/code&gt; section of the TCP segment (for a segment that has the &lt;code&gt;SYN&lt;/code&gt;-flag set in the TCP segment header) a sender or receiver may indicate a Max Segment Size (MSS). An MSS is derived from a machine’s Maximum Transmission Unit (MTU). In the case of my machine the MTU is set to 1500. I found this via the &lt;code&gt;ip&lt;/code&gt; command:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb1&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;ex&quot;&gt;tyler@magneto&lt;/span&gt;:~$ ip -4 link show dev wlp3s0&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;ex&quot;&gt;2&lt;/span&gt;: wlp3s0: &lt;span class=&quot;op&quot;&gt;&amp;lt;&lt;/span&gt;BROADCAST,MULTICAST,UP,LOWER_UP&lt;span class=&quot;op&quot;&gt;&amp;gt;&lt;/span&gt; mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The MSS is derived from the MTU and is (at most?) the MTU minus the 40 bytes used for the TCP header and the IP header, so my machine sent the MSS size of 1460 to the server in the &lt;code&gt;Options&lt;/code&gt; section of the SYN TCP segment that it initially sent my webserver.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tylercipriani.com/static/images/2016/mss.png&quot; alt=&quot;Client MSS&quot; /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;So the data portion of a TCP segment sent in this particular connection should never exceed 1460 bytes.&lt;/p&gt;
&lt;p&gt;While we were looking at Wireshark packet captures we kept noticing a TCP segment size of 1486 in the “length” column with a TCP segment data length of 1432. I noticed that my webserver sent an MSS size of 1432, which I suppose became the limiting factor in how much data could be sent per segment (rather than the 1460 MSS sent by my client – the browser):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tylercipriani.com/static/images/2016/server-mss.png&quot; alt=&quot;Server MSS&quot; /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Each TCP segment had a header-size of 20 bytes, so that leaves 34 unexplained bytes which (I guess) were part of the IP header.&lt;/p&gt;
&lt;p&gt;So why try to squeeze a website into ~14KB? Seems like you should be trying to squeeze it into 1432 bytes.&lt;/p&gt;
&lt;p&gt;I found my answer in &lt;a href=&quot;https://tools.ietf.org/html/rfc6928&quot;&gt;IETF RFC 6928&lt;/a&gt; – a proposal to increase the TCP Initial Window to 10 segments. The &lt;a href=&quot;https://en.wikipedia.org/wiki/Congestion_window#Congestion_window&quot;&gt;Initial Congestion Window&lt;/a&gt; (&lt;code&gt;cwnd&lt;/code&gt;) is the maximum number of bytes that a server can send without receiving any acknowledgement that the bytes were received via a client ACK packet. This maximum number of bytes to send is calculated by multiplying &lt;em&gt;some number&lt;/em&gt; by MSS. As of RFC 6928 &lt;em&gt;some number&lt;/em&gt; is equal to 10 (initially).&lt;/p&gt;
&lt;p&gt;I checked the value of &lt;code&gt;cwnd&lt;/code&gt; on some established connections on my server:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb2&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;ex&quot;&gt;tyler@magneto&lt;/span&gt;:~$ sudo ss -ti&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-2&quot; title=&quot;2&quot;&gt;    &lt;span class=&quot;ex&quot;&gt;...cwnd&lt;/span&gt;:10...&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And it is indeed set to 10.&lt;/p&gt;
&lt;p&gt;This means that my server can send &lt;code&gt;cwnd&lt;/code&gt; * MSS bytes of information before the client has to acknowledge that anything has been receieved. So, in the case of the Wireshark connection I recorded, my webserver can send 1432 * 10 bytes, or 14320 bytes:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb3&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;ex&quot;&gt;tyler@magneto&lt;/span&gt;:~$ units&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;ex&quot;&gt;Currency&lt;/span&gt; exchange rates from www.timegenie.com on 2016-06-22&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-3&quot; title=&quot;3&quot;&gt;&lt;span class=&quot;ex&quot;&gt;202926&lt;/span&gt; units, 109 prefixes, 88 nonlinear units&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-4&quot; title=&quot;4&quot;&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-5&quot; title=&quot;5&quot;&gt;&lt;span class=&quot;ex&quot;&gt;You&lt;/span&gt; have: 14320 bytes&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-6&quot; title=&quot;6&quot;&gt;&lt;span class=&quot;ex&quot;&gt;You&lt;/span&gt; want: kilobytes&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-7&quot; title=&quot;7&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;*&lt;/span&gt; 14.32&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-8&quot; title=&quot;8&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;/&lt;/span&gt; 0.069832402&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;OR&lt;/em&gt; around 14KB of data can be sent to a browser before another round-trip from the client to the webserver has to happen.&lt;/p&gt;
&lt;p&gt;So, overall, a nice, relaxing coffee and catch-up session with an old coworker.&lt;/p&gt;

	</content>


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/25/the-14kb-in-the-tcp-initial-window/#comments" type="text/html" />


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/25/the-14kb-in-the-tcp-initial-window/comments.atom" type="application/atom+xml" />

</entry>
<entry>
	<title>Git-Config Colors and Include</title>

	<id>https://tylercipriani.com/blog/2016/09/21/git-config-include-and-colors/</id>

	<link href="https://tylercipriani.com/blog/2016/09/21/git-config-include-and-colors/"/>

	<author><name>Tyler Cipriani</name></author>



	<rights type="html" xml:lang="en">
	Creative Commons Attribution-ShareAlike License
	</rights>




	<category term="TIL" />

	<category term="git" />


	<updated>2017-02-14T15:11:05Z</updated>
	<published>2016-09-22T00:56:33Z</published>


	<content type="html" xml:lang="en">
	&lt;p&gt;While I was looking through my &lt;code&gt;~/.gitconfig&lt;/code&gt; today, I learned some new tricks.&lt;/p&gt;
&lt;p&gt;I&#39;ve had the &lt;code&gt;color&lt;/code&gt; section in my &lt;code&gt;~/.gitconfig&lt;/code&gt; without really understanding it:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb1&quot;&gt;&lt;pre class=&quot;sourceCode ini&quot;&gt;&lt;code class=&quot;sourceCode ini&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;kw&quot;&gt;[color]&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    ui &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kw&quot;&gt;true&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;First, it seems that &lt;code&gt;git config color.ui true&lt;/code&gt; is superfluous as it has been set to &lt;code&gt;true&lt;/code&gt; by default since Git 1.8.4. More importantly, I learned that you can customize the colors of &lt;code&gt;git-branch&lt;/code&gt;, &lt;code&gt;git-diff&lt;/code&gt;, &lt;code&gt;git-status&lt;/code&gt;, &lt;code&gt;git log --decorate&lt;/code&gt;, &lt;code&gt;git-grep&lt;/code&gt;, and &lt;code&gt;git {add,clean} --interactive&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The easiest way I could find to view what properties are available to colorize is to search for &lt;code&gt;&amp;lt;slot&amp;gt;&lt;/code&gt; on the git-config man page.&lt;/p&gt;
&lt;p&gt;The other neat thing I learned is that you can include other config files by adding an &lt;code&gt;include&lt;/code&gt; section in your &lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb2&quot;&gt;&lt;pre class=&quot;sourceCode ini&quot;&gt;&lt;code class=&quot;sourceCode ini&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;kw&quot;&gt;[include]&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    path &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; ~/.config/git/colors.config&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;By combining these two tricks, you can create one colorscheme for a terminal that uses the &lt;a href=&quot;https://github.com/ChrisKempson/Tomorrow-Theme&quot;&gt;Tomorrow Theme&lt;/a&gt; and one for the terminal that uses &lt;a href=&quot;http://ethanschoonover.com/solarized&quot;&gt;Solarized&lt;/a&gt; and swap between them easily by swapping the symlink pointed at by &lt;code&gt;~/.config/git/color.config&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb3&quot;&gt;&lt;pre class=&quot;sourceCode ini&quot;&gt;&lt;code class=&quot;sourceCode ini&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;co&quot;&gt;# Tomorrow Night Eighties in ~/.config/git/tomorrow-night-eighties.config&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;co&quot;&gt;# Included in ~/.gitconfig via:&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-3&quot; title=&quot;3&quot;&gt;&lt;span class=&quot;co&quot;&gt;# [include]&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-4&quot; title=&quot;4&quot;&gt;&lt;span class=&quot;co&quot;&gt;#     path = ~tyler/.config/git/tomorrow-night-eighties.config&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-5&quot; title=&quot;5&quot;&gt;&lt;span class=&quot;kw&quot;&gt;[color &amp;quot;status&amp;quot;]&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-6&quot; title=&quot;6&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    header &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#&lt;/span&gt;&lt;span class=&quot;dv&quot;&gt;999999&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-7&quot; title=&quot;7&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    added &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#99cc99&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-8&quot; title=&quot;8&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    changed &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#f2777a&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-9&quot; title=&quot;9&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    untracked &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#ffcc66&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-10&quot; title=&quot;10&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    branch &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#2d2d2d&amp;quot; &amp;quot;#6699cc&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-11&quot; title=&quot;11&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;co&quot;&gt;# Because the phrase &amp;quot;Detached HEAD&amp;quot; isn&amp;#39;t unnerving enough&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-12&quot; title=&quot;12&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    nobranch &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; bold ul blink &amp;quot;#f99157&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-13&quot; title=&quot;13&quot;&gt;&lt;span class=&quot;kw&quot;&gt;[color &amp;quot;diff&amp;quot;]&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-14&quot; title=&quot;14&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    meta &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#&lt;/span&gt;&lt;span class=&quot;dv&quot;&gt;515151&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-15&quot; title=&quot;15&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    func &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#cc99cc&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-16&quot; title=&quot;16&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    frag &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#66cccc&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-17&quot; title=&quot;17&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    context &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#&lt;/span&gt;&lt;span class=&quot;dv&quot;&gt;999999&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-18&quot; title=&quot;18&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    old &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#f2777a&amp;quot; &amp;quot;#&lt;/span&gt;&lt;span class=&quot;dv&quot;&gt;393939&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-19&quot; title=&quot;19&quot;&gt;&lt;span class=&quot;dt&quot;&gt;    new &lt;/span&gt;&lt;span class=&quot;ot&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st&quot;&gt; &amp;quot;#bef2be&amp;quot; &amp;quot;#&lt;/span&gt;&lt;span class=&quot;dv&quot;&gt;515151&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I wish the symlink swap didn&#39;t have to happen – I wish you could just use environment variables.&lt;/p&gt;
&lt;p&gt;As far as I can tell the only variables that are expanded in &lt;code&gt;~/.gitconfig&lt;/code&gt; are &lt;code&gt;~&lt;/code&gt; to point at the current user&#39;s home directory and &lt;code&gt;~[user]&lt;/code&gt; points to &lt;code&gt;[user]&lt;/code&gt;&#39;s home directory.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;include&lt;/code&gt; also fails silently by design.&lt;/p&gt;
&lt;p&gt;I feel like there are some other neat tricks to uncover here, but I haven&#39;t quite grokked this to fullness just yet.&lt;/p&gt;

	</content>


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/21/git-config-include-and-colors/#comments" type="text/html" />


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/21/git-config-include-and-colors/comments.atom" type="application/atom+xml" />

</entry>
<entry>
	<title>ImageMagick to Extract a PDF Page</title>

	<id>https://tylercipriani.com/blog/2016/09/13/imagemagick-to-extract-a-pdf-page/</id>

	<link href="https://tylercipriani.com/blog/2016/09/13/imagemagick-to-extract-a-pdf-page/"/>

	<author><name>Tyler Cipriani</name></author>



	<rights type="html" xml:lang="en">
	Creative Commons Attribution-ShareAlike License
	</rights>




	<category term="TIL" />


	<updated>2017-02-14T15:11:05Z</updated>
	<published>2016-09-13T16:35:22Z</published>


	<content type="html" xml:lang="en">
	&lt;p&gt;Today I was working with a PDF that was 27,000 pages long (god help me).&lt;/p&gt;
&lt;p&gt;I never tried to open that PDF. This is just the page count I got from a python script I wrote to parse that PDF to a CSV file.&lt;/p&gt;
&lt;p&gt;When the time came to spot-check the results of that python script I needed to compare some pages deep within the PDF with the output on the CSV file.&lt;/p&gt;
&lt;p&gt;I use the &lt;a href=&quot;https://pwmt.org/projects/zathura/&quot;&gt;Zathura&lt;/a&gt; document viewer to view PDFs, but I was reasonably certain that it would choke on such a large document. Instead I extracted one page at a time using &lt;a href=&quot;https://www.imagemagick.org/script/index.php&quot;&gt;ImageMagick&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb1&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;ex&quot;&gt;convert&lt;/span&gt; &lt;span class=&quot;st&quot;&gt;&amp;#39;big.pdf[2000]&amp;#39;&lt;/span&gt; big-pg2000.pdf&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I opened the generated PDF using Zathura.&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb2&quot; data-org-language=&quot;sh&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;ex&quot;&gt;zathura&lt;/span&gt; big-pg2000.pdf&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I was able to compare that side-by-side with the generated CSV.&lt;/p&gt;
&lt;p&gt;Easy peasy.&lt;/p&gt;

	</content>


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/13/imagemagick-to-extract-a-pdf-page/#comments" type="text/html" />


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/13/imagemagick-to-extract-a-pdf-page/comments.atom" type="application/atom+xml" />

</entry>
<entry>
	<title>Git Revision Colon Slash</title>

	<id>https://tylercipriani.com/blog/2016/09/09/git-revision-colon-slash/</id>

	<link href="https://tylercipriani.com/blog/2016/09/09/git-revision-colon-slash/"/>

	<author><name>Tyler Cipriani</name></author>






	<category term="TIL" />


	<updated>2017-02-14T15:11:05Z</updated>
	<published>2016-09-09T13:47:22Z</published>


	<content type="html" xml:lang="en">
	&lt;p&gt;From &lt;code&gt;gitrevisions(7)&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb1&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;ex&quot;&gt;SPECIFYING&lt;/span&gt; REVISIONS&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-2&quot; title=&quot;2&quot;&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-3&quot; title=&quot;3&quot;&gt;    :/&lt;span class=&quot;op&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;op&quot;&gt;&amp;gt;&lt;/span&gt;, e.g. :/fix nasty bug&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-4&quot; title=&quot;4&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;A&lt;/span&gt; colon, followed by a slash, followed by a text, names a commit whose&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-5&quot; title=&quot;5&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;commit&lt;/span&gt; message matches the specified regular expression. This name&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-6&quot; title=&quot;6&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;returns&lt;/span&gt; the youngest matching commit which is reachable from any ref.&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-7&quot; title=&quot;7&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;The&lt;/span&gt; regular expression can match any part of the commit message. To&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-8&quot; title=&quot;8&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;match&lt;/span&gt; messages starting with a string, one can use e.g.  :/^foo. The&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-9&quot; title=&quot;9&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;special&lt;/span&gt; sequence :/! is reserved for modifiers to what is matched.&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-10&quot; title=&quot;10&quot;&gt;        :/!&lt;span class=&quot;ex&quot;&gt;-foo&lt;/span&gt; performs a negative match, while :/!!foo matches a literal !&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-11&quot; title=&quot;11&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;character&lt;/span&gt;, followed by foo. Any other sequence beginning with :/! is&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb1-12&quot; title=&quot;12&quot;&gt;        &lt;span class=&quot;ex&quot;&gt;reserved&lt;/span&gt; for now.&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is the same revision that is returned by&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb2&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb2-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; log --grep &lt;span class=&quot;st&quot;&gt;&amp;#39;&amp;lt;regex&amp;gt;&amp;#39;&lt;/span&gt; -1&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Where it seems awesome is in combination with &lt;code&gt;git revert&lt;/code&gt; or &lt;code&gt;git commit --fixup&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I could see running this in a panic:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb3&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-1&quot; title=&quot;1&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; revert --no-edit &lt;span class=&quot;st&quot;&gt;&amp;#39;:/that thing that broke&amp;#39;&lt;/span&gt;&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-2&quot; title=&quot;2&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; commit&lt;/a&gt;
&lt;a class=&quot;sourceLine&quot; id=&quot;cb3-3&quot; title=&quot;3&quot;&gt;&lt;span class=&quot;fu&quot;&gt;git&lt;/span&gt; push origin HEAD:refs/for/master&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Found via a &lt;a href=&quot;https://news.ycombinator.com/item?id=12461992&quot;&gt;comment on hackernews&lt;/a&gt;&lt;/p&gt;

	</content>


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/09/git-revision-colon-slash/#comments" type="text/html" />


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/09/git-revision-colon-slash/comments.atom" type="application/atom+xml" />

</entry>
<entry>
	<title>sensible-editor</title>

	<id>https://tylercipriani.com/blog/2016/09/07/sensible-editor/</id>

	<link href="https://tylercipriani.com/blog/2016/09/07/sensible-editor/"/>

	<author><name>Tyler Cipriani</name></author>



	<rights type="html" xml:lang="en">
	Creative Commons Attribution-ShareAlike License
	</rights>




	<category term="TIL" />


	<updated>2017-02-14T15:11:05Z</updated>
	<published>2016-09-07T16:34:11Z</published>


	<content type="html" xml:lang="en">
	&lt;p&gt;&lt;code&gt;sensible-editor&lt;/code&gt; is a shell script in Debian at &lt;code&gt;/usr/bin/sensible-editor&lt;/code&gt; that selects a &lt;strong&gt;sensible editor&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;See also: &lt;code&gt;sensible-{browser,editor,pager}&lt;/code&gt;&lt;/p&gt;

	</content>


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/07/sensible-editor/#comments" type="text/html" />


	<link rel="comments" href="//tylercipriani.com/blog/2016/09/07/sensible-editor/comments.atom" type="application/atom+xml" />

</entry>

</feed>
