<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Alex Smith</title>
    <link>/</link>
    <description>Alex Smith</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-gb</language>
    
      
        <managingEditor>me@alexsmith.xyz
          
            (Alex Smith)
          
        </managingEditor>
      

      
    

    
    <lastBuildDate>Mon, 28 Jul 2025 16:48:00 +0100</lastBuildDate>
    
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Where is the highest 7-Eleven in Thailand?</title>
      <link>/posts/where-is-the-highest-7-eleven-in-thailand/</link>
      <pubDate>Mon, 28 Jul 2025 16:48:00 +0100</pubDate>
      <author>me@alexsmith.xyz (Alex Smith)</author>
      <guid>/posts/where-is-the-highest-7-eleven-in-thailand/</guid>
      <description>&lt;p&gt;Here I describe how I used &lt;strong&gt;OpenStreetMap&lt;/strong&gt; and &lt;strong&gt;SRTM&lt;/strong&gt; data to answer a
question nobody asked.&lt;/p&gt;
&lt;h2 id=&#34;gathering-data&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#gathering-data&#34;&gt;
        #
    &lt;/a&gt;
    Gathering Data
&lt;/div&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;openstreetmap-finding-convenience-stores&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#openstreetmap-finding-convenience-stores&#34;&gt;
        ##
    &lt;/a&gt;
    OpenStreetMap: Finding Convenience Stores
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://openstreetmap.org&#34;&gt;OpenStreetMap&lt;/a&gt;&lt;/strong&gt; is crowdsourced alternative to
Google Maps, offering freely accessible geodata. Using &lt;strong&gt;&lt;a href=&#34;https://overpass-turbo.eu&#34;&gt;Overpass
Turbo&lt;/a&gt;&lt;/strong&gt; we can easily query OSM:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click on &lt;strong&gt;wizard&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;&amp;quot;convenience store&amp;quot; in thailand&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run the query (Overpass generates it for us)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;export&lt;/strong&gt; and download the data (I used raw JSON format)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result is a big JSON file with ~10,000 points matching the &amp;ldquo;convenience
store&amp;rdquo; type.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;overpass.png&#34;&gt;&lt;img src=&#34;overpass.png&#34; alt=&#34;Overpass Turbo example&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Because this query returns a lot of data, it may cause browser
slow-down.&lt;/p&gt;
&lt;h3 id=&#34;srtm-elevation-data&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#srtm-elevation-data&#34;&gt;
        ##
    &lt;/a&gt;
    SRTM: Elevation Data
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Since OSM doesn&amp;rsquo;t have elevation data, I used &lt;strong&gt;Shuttle Radar Topography
Mission&lt;/strong&gt; (SRTM) data from NASA. &lt;a href=&#34;https://srtm.csi.cgiar.org/&#34;&gt;The &lt;strong&gt;CGIAR-CSI
GeoPortal&lt;/strong&gt;&lt;/a&gt; provides easy access to it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;SRTM Data&lt;/strong&gt; from the menu&lt;/li&gt;
&lt;li&gt;Select the regions we want and click &lt;strong&gt;Search&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Download all the ZIP files and extract the TIFFs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&#34;srtm.png&#34;&gt;&lt;img src=&#34;srtm.png&#34; alt=&#34;CGIAR-CSI GeoPortal example&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; When selecting regions, it&amp;rsquo;s difficult to guess exactly which area
each square corresponds to. You might have to use trial-and-error (you&amp;rsquo;ll see
maps highlighting the areas you selected after you click Search).&lt;/p&gt;
&lt;h2 id=&#34;processing-data&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#processing-data&#34;&gt;
        #
    &lt;/a&gt;
    Processing Data
&lt;/div&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;formatting-osm-data&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#formatting-osm-data&#34;&gt;
        ##
    &lt;/a&gt;
    Formatting OSM Data
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I wrote a Ruby script to parse the JSON and generate a simple CSV containing
names and coordinates:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;json&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;csv&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;JSON&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;load_file&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;thailand-convenience-stores.json&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;out&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;CSV&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;generate&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;col_sep&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\t&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;csv&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;elements&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;each&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;lat&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lon&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_1&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;bounds&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Some points represent areas instead of containing an exact&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# coordinate, requiring a geometric midpoint calculation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;_1&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;bounds&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;minlat&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_1&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;bounds&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;maxlat&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;_1&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;bounds&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;minlon&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_1&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;bounds&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;maxlon&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;_1&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;lat&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_1&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;lon&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_1&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;tags&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;slice&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;name:en&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;alt_name&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;compact&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;convenience store&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;csv&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lat&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lon&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;puts&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;out&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;getting-elevation-with-gdal&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#getting-elevation-with-gdal&#34;&gt;
        ##
    &lt;/a&gt;
    Getting Elevation with GDAL
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Using &lt;code&gt;gdallocationinfo&lt;/code&gt;, (part of the &lt;a href=&#34;https://gdal.org/&#34;&gt;&lt;strong&gt;GDAL&lt;/strong&gt; library&lt;/a&gt;) I
can cross-referenced OSM coordinates with SRTM elevations:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gdallocationinfo -geoloc &amp;lt;path to TIFF file&amp;gt; &amp;lt;longitude&amp;gt; &amp;lt;latitude&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A shell script, looping through the CSV, queries each coordinate against SRTM
tiles:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;read&lt;/span&gt; -r line&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;lat&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$line&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; cut -f2&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;lon&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$line&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; cut -f3&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# `gdallocationinfo` only accepts one TIFF file per invocation, requiring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# multiple calls per row, one for each TIFF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;el&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;ls elevation-data/*.tif &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;read&lt;/span&gt; -r filepath&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      gdallocationinfo -geoloc &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$filepath&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$lon&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$lat&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grep &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Value:&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; sed &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;s/ \+Value: //&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;done)&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87&#34;&gt;echo&lt;/span&gt; -e &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$line&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\t&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$el&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;done&lt;/span&gt; &amp;lt; convenience-stores.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;result&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#result&#34;&gt;
        #
    &lt;/a&gt;
    Result
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;After sorting the resulting CSV, the answer is in &lt;strong&gt;Mae Salong&lt;/strong&gt;, a little
village in the mountains of Chiang Rai province. There are actually two
7-Elevens here, standing at an elevation of ~1,100 metres:&lt;/p&gt;
&lt;iframe
    src=&#34;https://www.google.com/maps/embed?pb=!1m16!1m12!1m3!1d14981.170047185431!2d99.6250136291762!3d20.163542769470784!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!2m1!1s7-Eleven!5e0!3m2!1sen!2suk!4v1753437303761!5m2!1sen!2suk&#34;
    width=&#34;100%&#34;
    height=&#34;405&#34;
    style=&#34;border:0;&#34;
    allowfullscreen=&#34;&#34;
    loading=&#34;lazy&#34;
    referrerpolicy=&#34;no-referrer-when-downgrade&#34;&gt;
&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;Not all 7-Elevens in the OSM data are labelled as such, so it takes a little
manual investigation of the results to find the answer.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;caveat&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#caveat&#34;&gt;
        #
    &lt;/a&gt;
    Caveat
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;OSM is impressive but it&amp;rsquo;s not the most complete or up-to-date, especially in
remote areas. Therefore, data I pulled from OSM is probably not an accurate
reflection of all convenience stores in Thailand. The two 7-Elevens in Mae
Salong are likely among the highest, but they might not be &lt;em&gt;the&lt;/em&gt; highest.&lt;/p&gt;
&lt;h2 id=&#34;why-bother&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#why-bother&#34;&gt;
        #
    &lt;/a&gt;
    Why Bother?
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;The heat of Southeast Asia is concerning for an Englishman (like me) interested
in living there. Higher altitudes bring cooler temperatures but fewer
amenities. So: &lt;em&gt;Where can I find convenience at a greater elevation?&lt;/em&gt; A
&lt;strong&gt;convenience store&lt;/strong&gt;, of course!&lt;/p&gt;
&lt;h2 id=&#34;bonus&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#bonus&#34;&gt;
        #
    &lt;/a&gt;
    Bonus
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Mae Salong seems like it&amp;rsquo;s worth a visit. It&amp;rsquo;s famous for its tea plantations
and &lt;strong&gt;Phra Boromathat Chedi&lt;/strong&gt; (which looks amazing).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My Minimal, Terminal-based Work Setup</title>
      <link>/posts/my-minimal-terminal-based-work-setup/</link>
      <pubDate>Sat, 06 Apr 2024 12:20:00 +0000</pubDate>
      <author>me@alexsmith.xyz (Alex Smith)</author>
      <guid>/posts/my-minimal-terminal-based-work-setup/</guid>
      <description>&lt;p&gt;Here I describe the various software I use to form a development environment
for programming projects.&lt;/p&gt;
&lt;h2 id=&#34;dtach&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#dtach&#34;&gt;
        #
    &lt;/a&gt;
    dtach
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;The basis for my setup is &lt;a href=&#34;https://dtach.sourceforge.net/&#34;&gt;dtach&lt;/a&gt;. dtach
executes a program in a session which the user can &amp;lsquo;detach&amp;rsquo; from, returning
them to the shell while the program continues to run. Later, the session can be
reattached to. It allows me to, for example, start Neovim in a terminal window,
make changes to some files and detach, allowing me to use the terminal window
again for some other purpose or even close it entirely without disturbing
Neovim. This is useful is because it allows me to attach to an existing session
after connecting to the machine it&amp;rsquo;s running on via SSH. I can open a project
and begin working while sitting at my desk, and then later access the same
session remotely. dtach will also save you if the connection drops because you
just reconnect and attach to the session again. If you want to replicate a
setup like mine and you don&amp;rsquo;t need SSH then you may not need dtach.&lt;/p&gt;
&lt;h2 id=&#34;dvtm&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#dvtm&#34;&gt;
        #
    &lt;/a&gt;
    dvtm
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.brain-dump.org/projects/dvtm/&#34;&gt;dvtm&lt;/a&gt; is a terminal multiplexer I
use to construct my development environment user interface. It allows you to
open various programs using one terminal window and display them in various
layouts. It functions similarly to &lt;a href=&#34;https://dwm.suckless.org/&#34;&gt;dwm&lt;/a&gt;. I&amp;rsquo;ll
usually have open my text editor and several instances of bash displayed
side-by-side, which I can switch between when required. Windows may be closed
and new ones opened as necessary.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;dvtm-example.jpg&#34;&gt;&lt;img src=&#34;dvtm-example.jpg&#34; alt=&#34;dvtm example&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Window positions are determined by preconfigured layouts which can be cycled
between to suit requirements. I almost never use anything other than the
default &amp;lsquo;master and stack&amp;rsquo; layout displayed above (master window on the left,
other windows in &amp;rsquo;the stack&amp;rsquo; on the right).&lt;/p&gt;
&lt;h2 id=&#34;neovim&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#neovim&#34;&gt;
        #
    &lt;/a&gt;
    Neovim
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://neovim.io/&#34;&gt;Neovim&lt;/a&gt; is my text editor of choice. I dislike the
tendency people often have of weighing Vim/Neovim down with loads of useless
plugins. However, there are two that I use which contribute well to speedy and
efficient development:&lt;/p&gt;
&lt;h3 id=&#34;fzf&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#fzf&#34;&gt;
        ##
    &lt;/a&gt;
    fzf
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/junegunn/fzf&#34;&gt;fzf&lt;/a&gt; is a command-line fuzzy finder and there
is &lt;a href=&#34;https://github.com/junegunn/fzf.vim&#34;&gt;a plugin&lt;/a&gt; that allows its usage from
within Vim/Neovim. It can be configured to fuzzy-find any kind of text content,
but I use it for finding files from within Neovim. The two commands I use are
&lt;code&gt;:Files&lt;/code&gt; and &lt;code&gt;:Buffers&lt;/code&gt; mapped to &lt;code&gt;&amp;lt;Leader&amp;gt;f&lt;/code&gt; and &lt;code&gt;&amp;lt;Leader&amp;gt;b&lt;/code&gt;, respectively.
&lt;code&gt;:Files&lt;/code&gt; fuzzy-finds all files from the current directory, whereas &lt;code&gt;:Buffers&lt;/code&gt;
fuzzy-finds only opened buffers. I have fzf configured to open inside a split
where results appear as I type. The results can be cycled between and selecting
an entry will open the file. fzf itself is very fast and its incorporation into
Vim/Neovim saves a lot of time spent hunting for files.&lt;/p&gt;
&lt;h3 id=&#34;fugitive&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#fugitive&#34;&gt;
        ##
    &lt;/a&gt;
    Fugitive
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tpope/vim-fugitive&#34;&gt;Fugitive&lt;/a&gt; adds Git integration to
Vim/Neovim. The key feature for me is the ability to easily add files to staged
changes with a keystroke. Fugitive also makes it trivial to add only specific
hunks to staged changes and even just specific lines. It allows me to have
fine-grained control over what changes are to be committed and a clear view of
those changes with its summary window in which I can open diffs. It is very
good and if you use Vim/Neovim and Git then I recommend you use Fugitive.&lt;/p&gt;
&lt;h2 id=&#34;the-clipboard-problem&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#the-clipboard-problem&#34;&gt;
        #
    &lt;/a&gt;
    The clipboard problem
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;I use &lt;a href=&#34;https://github.com/lemonade-command/lemonade&#34;&gt;lemonade&lt;/a&gt; for clipboard
usage over SSH which works well, but there&amp;rsquo;s an issue when switching between
between local and remote. A dtach session started in the context of an X server
will contain the &lt;code&gt;DISPLAY&lt;/code&gt; environment variable which Neovim uses to determine
whether to call &lt;code&gt;xclip&lt;/code&gt;. The problem is that this variable is still present if
the session is attached to later over SSH, which means Neovim executes &lt;code&gt;xclip&lt;/code&gt;
instead of lemonade.&lt;/p&gt;
&lt;p&gt;The solution is to simply remove the variable from Neovim while it&amp;rsquo;s running
with &lt;code&gt;:unlet $DISPLAY&lt;/code&gt; and then reload the clipboard provider:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;unlet&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;:&lt;span style=&#34;color:#000&#34;&gt;loaded_clipboard_provider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;runtime&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;autoload&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;/provider/&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;clipboard&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;vim&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can assign this to a function which can be called via a key-binding:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ResetClipboardProvider&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :&lt;span style=&#34;color:#000&#34;&gt;unlet&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;:&lt;span style=&#34;color:#000&#34;&gt;loaded_clipboard_provider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  :&lt;span style=&#34;color:#000&#34;&gt;runtime&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;autoload&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;/provider/&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;clipboard&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;vim&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;endfunction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;nnoremap&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Leader&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;cr&lt;/span&gt; :&lt;span style=&#34;color:#000&#34;&gt;call&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ResetClipboardProvider&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;CR&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you have the opposite problem (session created outside of X) then the
solution is the same except you set the variable rather than removing it: &lt;code&gt;:let $DISPLAY=&#39;:0&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In windows running a shell you&amp;rsquo;ll need to &lt;code&gt;export DISPLAY=:0&lt;/code&gt; as appropriate.&lt;/p&gt;
&lt;h2 id=&#34;putting-it-all-together&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#putting-it-all-together&#34;&gt;
        #
    &lt;/a&gt;
    Putting it all together
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;There are a couple of shell scripts I use to open all the programs. First, my
&lt;code&gt;work&lt;/code&gt; script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;dtach_dir&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$HOME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;/.dtach&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$dtach_dir&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dtach -c &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$dtach_dir&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; tr / &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; tac &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; sed &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;/^\s*$/d&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; head -n 1&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  dvtm-work &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This takes a single argument, which is the directory of a project it changes
into, and spawns a dtach session inside which the &lt;code&gt;dvtm-work&lt;/code&gt; script is called:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;FIFO&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;/tmp/dvtm-status.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$$&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt; -p &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$FIFO&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;||&lt;/span&gt; mkfifo -m &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;600&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$FIFO&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;STATUS_PID&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;cd&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dvtm -M -t &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;pwd&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; -s &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$FIFO&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt; nvim &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;bash -l&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;bash -l&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;kill&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$STATUS_PID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;wait&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;$STATUS_PID&lt;/span&gt; 2&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -f &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;$FIFO&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This script is a small modification of dvtm&amp;rsquo;s
&lt;a href=&#34;https://github.com/martanne/dvtm/blob/master/dvtm-status&#34;&gt;&lt;code&gt;dvtm-status&lt;/code&gt; script&lt;/a&gt;,
the only change being the removal of the time in the status bar and a tweak to
the invocation of dvtm itself. dvtm, upon opening, will open three windows:
Neovim and two instances of bash.&lt;/p&gt;
&lt;p&gt;Say I have a project located at &lt;code&gt;projects/my-project&lt;/code&gt; which I want to begin
work on, I just call the &lt;code&gt;work&lt;/code&gt; script with the project&amp;rsquo;s directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ work projects/my-project
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A dtach session will spawn, starting &lt;code&gt;dvtm-work&lt;/code&gt;, which then starts Neovim and
bash. I&amp;rsquo;m then ready to begin working. I can detach using &lt;code&gt;Ctrl+\&lt;/code&gt; and later
reattach with &lt;code&gt;dtach -a .dtach/my-project&lt;/code&gt;, resuming where I left off.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#conclusion&#34;&gt;
        #
    &lt;/a&gt;
    Conclusion
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s not a huge amount to say about this setup. It&amp;rsquo;s small, simple and only
uses a few components. Its simplicity makes modifications easy. It&amp;rsquo;s powerful.
It&amp;rsquo;s good at staying out of my way so I can just pursue the task of
programming. The result is Vim-powered text editing; fast file access; Git
integration with concise in-editor diffs and quick, fine-grained file staging;
shell access; all displayed neatly in automatically determined layouts.&lt;/p&gt;
&lt;h3 id=&#34;why-dont-you-just-use-vs-code-or-similar&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#why-dont-you-just-use-vs-code-or-similar&#34;&gt;
        ##
    &lt;/a&gt;
    Why don&amp;rsquo;t you just use VS Code or similar?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;With only a handful of components I&amp;rsquo;ve satisfied all my requirements for
programming tasks. VS Code is bloated software that comes with many features
that I&amp;rsquo;ll likely never use. I believe it&amp;rsquo;s a better choice to go with something
smaller and simpler. If I discover a requirement then there will most likely be
a way I can work it into my setup.&lt;/p&gt;
&lt;h3 id=&#34;neovim-has-terminal-support-why-dont-you-use-it&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#neovim-has-terminal-support-why-dont-you-use-it&#34;&gt;
        ##
    &lt;/a&gt;
    Neovim has terminal support, why don&amp;rsquo;t you use it?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I find it a bit cumbersome to have to manually open up splits and call the
&lt;code&gt;:term&lt;/code&gt; command. The idea with dvtm is that layouts are handled automatically
by the software, so when a new window is opened it goes where you expect it to
without any extra fiddling.&lt;/p&gt;
&lt;h3 id=&#34;no-nerdtree-or-similar&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#no-nerdtree-or-similar&#34;&gt;
        ##
    &lt;/a&gt;
    No NERDTree or similar?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I don&amp;rsquo;t think file-tree-like explorers suit Vim/Neovim. fzf works well for
fuzzy finding files from within Neovim and I have access to a shell with
programs like &lt;code&gt;ls&lt;/code&gt; and &lt;code&gt;find&lt;/code&gt; for file discovery.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
