<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
  <meta charset="utf-8">
  <title>Bynario</title>
  <meta name="author" content="psgonza">

  <link href="https://bynario.com/rss.xml" type="application/rss+xml" rel="alternate"
        title="Bynario RSS Feed" />



  <!-- http://t.co/dKP3o1e -->
  <meta name="HandheldFriendly" content="True">
  <meta name="MobileOptimized" content="320">
  <meta name="viewport" content="width=device-width, initial-scale=1">


    <link href="https://bynario.com/favicon.png" rel="icon">

  <link href="https://bynario.com/theme/css/main.css" media="screen, projection"
        rel="stylesheet" type="text/css">

  <link href="//fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic"
        rel="stylesheet" type="text/css">
  <link href="//fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic"
        rel="stylesheet" type="text/css">
</head>

<body>
  <header role="banner"><hgroup>
  <h1><a href="https://bynario.com/"><img src="/img/bynario_logo.gif"></a></h1>
    <h2>Geek as a platform</h2>
</hgroup></header>
  <nav role="navigation">
<form action="https://www.google.com/search" method="get">
  <fieldset role="search">
    <input type="hidden" name="sitesearch" value="bynario.com">
    <input class="search" type="text" name="q" results="0" placeholder="Search"/>
  </fieldset>
</form>

<ul class="main-navigation">
    <li><a href="/">Home</a></li>
    <li><a href="/category/posts.html">Posts</a></li>
    <li><a href="/rss.xml">RSS</a></li>
</ul></nav>
  <div id="main">
    <div id="content">
<div class="blog-index">
  		<article>
<header>
      <h1 class="entry-title">
        <a href="https://bynario.com/2018-05-15-batch-macos-convert-resize-nef-to-jpg.html">NEF batch processing in MacOS (from CLI)</a>
      </h1>
    <p class="meta">
<time datetime="2018-05-15T00:05:15+02:00" pubdate>mar 15 mayo 2018</time>    </p>
</header>

  <div class="entry-content"><p>Hi there</p>
<p>In case someone has to scratch the same itch as me (converting and resizing big NEF files to ease the visualization over the network), this is (by far, I'd say) the easiest way to generate (and resize) a jpg file from a big fat Nikon RAW file (NEF):</p>
<div class="prettyprint"><pre><span class="code-line">psgonza/Nikon$ for i in `ls -1 *.NEF`; </span>
<span class="code-line">do </span>
<span class="code-line">sips -s format jpeg -s formatOptions 50 -Z 3000 &quot;<span class="cp">${</span><span class="n">i</span><span class="cp">}</span>&quot; --out &quot;jpg/<span class="cp">${</span><span class="n">i</span><span class="o">%</span><span class="n">NEF</span><span class="cp">}</span>jpg&quot;; </span>
<span class="code-line">done</span>
</pre></div>


<p>Above command will:</p>
<ul>
<li>Go through all the NEF files in current directory   </li>
<li>Generate a jpg from the original nef file    </li>
<li>Set jpg quality at 50%    </li>
<li>Resize the image to max 3000px (either width or height, whatever is bigger) </li>
</ul>
<p>It took <strong>A WHILE</strong> to process all the files (in my case, 1003 pictures), but I'd say it is worthy... I ended up dealing with (aprox) 1MB jpg files, instead of the original 25MB NEF files I had.</p>
<p>I am fairly new to the Mac OS world so I didn't know about <a href="https://ss64.com/osx/sips.html">sips</a> until 30 min ago, although it has been included by default in Mac OS since 2003...</p>
<p>Pretty handy</p></div>
  		</article>
  		<article>
<header>
      <h1 class="entry-title">
        <a href="https://bynario.com/2018-02-17-psa_minikeepass_and_key_files.html">PSA: MiniKeePass and key files</a>
      </h1>
    <p class="meta">
<time datetime="2018-02-17T00:01:17+02:00" pubdate>sáb 17 febrero 2018</time>    </p>
</header>

  <div class="entry-content"><p>In case you plan to use MiniKeePass on your iphone with key files (which I guess is highly recommended if you plan to share your kdb via Dropbox/Drive/you_name_it), pay special attention to the last line of their help page:</p>
<div class="prettyprint"><pre><span class="code-line">Using Key Files</span>
<span class="code-line"></span>
<span class="code-line">MiniKeePass can open KeePass 1.x/2.x files that use a key file instead of or in</span>
<span class="code-line">addition to a password.</span>
<span class="code-line"></span>
<span class="code-line">Steps:</span>
<span class="code-line"></span>
<span class="code-line">Load your KeePass database and key file in MiniKeePass using iTunes, Dropbox, etc.</span>
<span class="code-line">Open your KeePass file in MiniKeePass</span>
<span class="code-line">When prompted for your password you can enter a password and/or select a key file</span>
<span class="code-line"></span>
<span class="code-line">Note: MiniKeePass will automatically select your key file if it has the same</span>
<span class="code-line">filename as your KeePass file but with a .key extension.</span>
</pre></div>


<p>Basically, you have to upload your data base and the key file <strong> with the same name </strong>(ie: MyDB.kdb and MyDB.key) to your_cloud_storage_service_here, and then, open both of them with MiniKeePass. Otherwise, all you will see in the Key-file screen is "None". </p>
<p>I learnt it the hard way and I lost 15 minutes of my life trying to import a key file with a different name than the KeePass database.</p>
<p>The devil is in the detail, as usual.... ;)</p>
<p>///psgonza</p>
<p><a href="https://keepass.info/">KeePass</a> is great, you should totally use. <a href="https://minikeepass.github.io/">MiniKeePass</a> is just fine, does the job too.</p></div>
  		</article>
  		<article>
<header>
      <h1 class="entry-title">
        <a href="https://bynario.com/2017-12-31-bye-bye-2017_hello-2018.html">Bye bye 2017, hello 2018</a>
      </h1>
    <p class="meta">
<time datetime="2017-12-31T23:59:59+02:00" pubdate>dom 31 diciembre 2017</time>    </p>
</header>

  <div class="entry-content"><p>We have a coouple of hours left from this 2017... Or maybe you are already in 2018, or half a day away if you are in some places of the US... </p>
<p>Anyways, happy new year!</p>
<p>There will be time to analyze what was good, bad or needs to be improved in the coming days... Meanwhile, enjoy New Years Eve!</p>
<p>\\psgonza</p></div>
  		</article>
  		<article>
<header>
      <h1 class="entry-title">
        <a href="https://bynario.com/2017-08-25-string-manipulation-exercise-perl-python-awk.html">String manipulation exercise: Perl, Python, Awk</a>
      </h1>
    <p class="meta">
<time datetime="2017-08-25T08:25:00+02:00" pubdate>vie 25 agosto 2017</time>    </p>
</header>

  <div class="entry-content"><p>Here comes a small comparation of the performance of Perl, Awk and Python while parsing and splitting lines in a BIG ldif file with thousands or millions of subscriber profiles like <a href="https://raw.githubusercontent.com/psgonza/bynario/master/2017-08-25-string-manipulation_example.ldif">this one</a> (I created this ldif file as an example, just for the sake of clarity)</p>
<p>As in the example, one of the attributes in my ldif files was a huge base64 string (more than 10k bytes long) in a single line, which is not supported by slapadd/slapd (I have checked LDIF rfc and I don't see any mention to the 4096 bytes limitation, so it could be our own implementation, not sure about this), so the idea was to spit this line into 76 characters lines (as per recommendation)... Something like this:</p>
<p>Original line (short version):</p>
<div class="prettyprint"><pre><span class="code-line">...</span>
<span class="code-line">Service: SSBhbSBoYXBweSB0byBqb2luIHdpdGggeW91IHRvZGF5IGluIHdoYXQgd2lsbCBnbyBkb3duIGluIGhpc3RvcnkgYXMgdGhlIGdyZWF0ZXN0IGRlbW9uc3RyYXRpIGV2ZXJ5IHN0YXRlIGZa</span>
<span class="code-line">...</span>
</pre></div>


<p>Replaced by:</p>
<div class="prettyprint"><pre><span class="code-line">...</span>
<span class="code-line">Service: SSBhbSBoYXBweSB0byBqb2luIHdpdGggeW91IHRvZGF5IGluIHdoYXQgd2lsbCBnbyBkb3</span>
<span class="code-line"> duIGluIGhpc3RvcnkgYXMgdGhlIGdyZWF0ZXN0IGRlbW9uc3RyYXRpIGV2ZXJ5IHN0YXRlIGZa</span>
<span class="code-line">...</span>
</pre></div>


<p>(Notice the blank at the beginning of the second line)</p>
<p>My first approach was to use Python standard module <em>textwrap</em>:</p>
<div class="prettyprint"><pre><span class="code-line"><span class="kn">import</span> <span class="nn">sys</span></span>
<span class="code-line"><span class="kn">import</span> <span class="nn">textwrap</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">try</span><span class="p">:</span></span>
<span class="code-line">    <span class="n">ldiffile</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span></span>
<span class="code-line"><span class="k">except</span><span class="p">:</span></span>
<span class="code-line">    <span class="k">print</span><span class="p">(</span><span class="s">&quot;Input file missing... Exit&quot;</span><span class="p">)</span></span>
<span class="code-line">    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">ldiffile</span><span class="p">,</span> <span class="s">&quot;rU&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span></span>
<span class="code-line">    <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span></span>
<span class="code-line">        <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&quot;Service:&quot;</span><span class="p">):</span></span>
<span class="code-line">            <span class="k">print</span><span class="p">(</span><span class="n">textwrap</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">76</span><span class="p">,</span><span class="n">subsequent_indent</span><span class="o">=</span><span class="s">&#39; &#39;</span><span class="p">))</span></span>
<span class="code-line">        <span class="k">else</span><span class="p">:</span></span>
<span class="code-line">            <span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span></span>
</pre></div>


<p>It was really simple and produced the expected result, but it was ridiculously slow. <strong>RIDICULOUSLY</strong>. Really, difficult to believe...</p>
<p>So I decided to do something similar, but this time I dealt with the line split myself:</p>
<div class="prettyprint"><pre><span class="code-line"><span class="kn">import</span> <span class="nn">sys</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">try</span><span class="p">:</span></span>
<span class="code-line">    <span class="n">ldiffile</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span></span>
<span class="code-line"><span class="k">except</span><span class="p">:</span></span>
<span class="code-line">    <span class="k">print</span><span class="p">(</span><span class="s">&quot;Input file missing... Exit&quot;</span><span class="p">)</span></span>
<span class="code-line">    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">def</span> <span class="nf">fixlen</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span></span>
<span class="code-line">    <span class="c">#First line, no blank at the beginning of the line</span></span>
<span class="code-line">    <span class="k">print</span> <span class="p">(</span><span class="n">s</span><span class="p">[:</span><span class="n">n</span><span class="p">])</span></span>
<span class="code-line">    <span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">n</span><span class="p">:]</span></span>
<span class="code-line">    <span class="c">#now, starting with blank</span></span>
<span class="code-line">    <span class="k">while</span> <span class="n">s</span><span class="p">:</span></span>
<span class="code-line">        <span class="k">print</span> <span class="p">(</span><span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="n">s</span><span class="p">[:</span><span class="n">n</span><span class="p">])</span></span>
<span class="code-line">        <span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">n</span><span class="p">:]</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">ldiffile</span><span class="p">,</span> <span class="s">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span></span>
<span class="code-line">    <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span></span>
<span class="code-line">        <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&quot;Service:&quot;</span><span class="p">):</span></span>
<span class="code-line">            <span class="n">fixlen</span><span class="p">(</span><span class="n">line</span><span class="p">,</span><span class="mi">76</span><span class="p">)</span></span>
<span class="code-line">        <span class="k">else</span><span class="p">:</span></span>
<span class="code-line">            <span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span></span>
</pre></div>


<p>The results I got were way better, but still, it took more than I expected... Time to give it a try with other tools: AWK and Perl</p>
<p>Basically I "translated" the python script to awk and perl, almost to the letter...</p>
<p>Perl version:</p>
<div class="prettyprint"><pre><span class="code-line"><span class="c1">#!/usr/bin/perl</span></span>
<span class="code-line"><span class="k">my</span> <span class="nv">$noident</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span></span>
<span class="code-line"><span class="k">while</span> <span class="p">(</span><span class="nv">$line</span> <span class="o">=</span> <span class="o">&lt;&gt;</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line">  <span class="nb">chomp</span><span class="p">(</span><span class="nv">$line</span><span class="p">);</span></span>
<span class="code-line">  <span class="k">if</span> <span class="p">(</span> <span class="nv">$line</span> <span class="o">=~</span><span class="sr"> /^Service:.*/</span><span class="p">)</span></span>
<span class="code-line">  <span class="p">{</span></span>
<span class="code-line">    <span class="k">for</span> <span class="p">(</span><span class="nb">unpack</span><span class="p">(</span><span class="s">&quot;(A76)*&quot;</span><span class="p">,</span><span class="nv">$line</span><span class="p">))</span> <span class="p">{</span></span>
<span class="code-line">        <span class="k">if</span> <span class="p">(</span><span class="nv">$noindent</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line">            <span class="k">print</span> <span class="s">&quot;$_\n&quot;</span><span class="p">;</span></span>
<span class="code-line">            <span class="nv">$noindent</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span></span>
<span class="code-line">        <span class="k">else</span> <span class="p">{</span> <span class="k">print</span> <span class="s">&quot; $_\n&quot;</span><span class="p">;</span> <span class="p">}</span></span>
<span class="code-line">    <span class="p">}</span></span>
<span class="code-line">  <span class="p">}</span></span>
<span class="code-line">  <span class="k">else</span></span>
<span class="code-line">  <span class="p">{</span></span>
<span class="code-line">    <span class="nv">$noindent</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span></span>
<span class="code-line">    <span class="k">print</span> <span class="s">&quot;$line\n&quot;</span><span class="p">;</span></span>
<span class="code-line">  <span class="p">}</span></span>
<span class="code-line"><span class="p">}</span></span>
</pre></div>


<p>Awk version:</p>
<div class="prettyprint"><pre><span class="code-line"><span class="x">awk &#39;</span></span>
<span class="code-line"><span class="x">  BEGIN </span><span class="err">{</span><span class="x"></span></span>
<span class="code-line"><span class="x">    indent = 0;</span></span>
<span class="code-line"><span class="x">    i=0;</span></span>
<span class="code-line"><span class="x">  }</span></span>
<span class="code-line"><span class="x">  </span><span class="err">{</span><span class="x"></span></span>
<span class="code-line"><span class="x">  if ( </span><span class="p">$</span><span class="x">0 ~ /^Service:.*/) </span><span class="err">{</span><span class="x"></span></span>
<span class="code-line"><span class="x">    while(i&lt;=length(</span><span class="p">$</span><span class="x">0))</span><span class="err">{</span><span class="x"></span></span>
<span class="code-line"><span class="x">        if ( </span><span class="p">$</span><span class="nv">indent</span><span class="x"> == 0 ) </span><span class="err">{</span><span class="x"> printf &quot;%s\n&quot;, substr(</span><span class="p">$</span><span class="x">0,i,76);i+=76;indent=1; }</span></span>
<span class="code-line"><span class="x">        else </span><span class="err">{</span><span class="x"> printf &quot; %s\n&quot;, substr(</span><span class="p">$</span><span class="x">0,i,76);i+=76;}</span></span>
<span class="code-line"><span class="x">   }</span></span>
<span class="code-line"><span class="x">   }</span></span>
<span class="code-line"><span class="x">   else </span><span class="err">{</span><span class="x"></span></span>
<span class="code-line"><span class="x">        print </span><span class="p">$</span><span class="x">0;</span></span>
<span class="code-line"><span class="x">   }</span></span>
<span class="code-line"><span class="x">  }&#39; </span><span class="p">$</span><span class="x">1</span></span>
</pre></div>


<p>I "faked" several input files with thousands of lines (discarding the output), executed all the scripts in Cygwin64, and then checked the time it took.. Something like this:</p>
<div class="prettyprint"><pre><span class="code-line">time python3 textwrap.py XXXX.ldif &amp;&gt; /dev/null</span>
<span class="code-line">time python3 pythonv1.py XXXX.ldif &amp;&gt; /dev/null</span>
<span class="code-line">time python3 pythonv2.py XXXX.ldif &amp;&gt; /dev/null</span>
<span class="code-line">time perl split.pl  XXXX.ldif &amp;&gt; /dev/null</span>
<span class="code-line">time ./split.awk XXXX.ldif &amp;&gt; /dev/null</span>
</pre></div>


<p>All of them generated the exact same output (except the textwrap version that handles the first line in a different way), but the execution time differs:</p>
<p><img src="https://raw.githubusercontent.com/psgonza/bynario/master/results_table.JPG" alt="'results_table'" class="center" title="'results_table'"></p>
<p>It is easier to see in a chart:</p>
<p><img src="https://raw.githubusercontent.com/psgonza/bynario/master/results_chart.JPG" alt="'results_chart'" class="center" title="'results_chart'"></p>
<p>My takeaways after this small exercise:</p>
<ul>
<li>Awk rocks. </li>
<li>Perl's black magic is almost as fast as awk. </li>
<li>Python is not really fast at file processing. Yes, there are ways to improve this, by splitting in chunks, parallel processing and whatnot... But it takes more than 15 lines. </li>
<li>Stay away of textwrap module for heavy usage. </li>
</ul>
<p>It was fun... Bye!</p>
<p>PS: As you can see in the results, there is a "Python v2" column which produced better results... It is a modification of the original script where I used a comprehension list approach:</p>
<div class="prettyprint"><pre><span class="code-line"><span class="kn">import</span> <span class="nn">sys</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">try</span><span class="p">:</span></span>
<span class="code-line">    <span class="n">ldiffile</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span></span>
<span class="code-line"><span class="k">except</span><span class="p">:</span></span>
<span class="code-line">    <span class="k">print</span><span class="p">(</span><span class="s">&quot;Input file missing... Exit&quot;</span><span class="p">)</span></span>
<span class="code-line">    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">def</span> <span class="nf">fixlen</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span></span>
<span class="code-line">    <span class="n">first</span> <span class="o">=</span> <span class="bp">True</span></span>
<span class="code-line">    <span class="n">tmp</span> <span class="o">=</span> <span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="mi">0</span><span class="o">+</span><span class="n">i</span><span class="p">:</span><span class="n">n</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">),</span> <span class="n">n</span><span class="p">))</span></span>
<span class="code-line">    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">tmp</span><span class="p">:</span></span>
<span class="code-line">        <span class="c">#First line, no blank at the beginning of the line</span></span>
<span class="code-line">        <span class="k">if</span> <span class="n">first</span><span class="p">:</span></span>
<span class="code-line">            <span class="k">print</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></span>
<span class="code-line">            <span class="n">first</span><span class="o">=</span><span class="bp">False</span></span>
<span class="code-line">        <span class="k">else</span><span class="p">:</span></span>
<span class="code-line">            <span class="c">#now, starting with blank</span></span>
<span class="code-line">            <span class="k">print</span><span class="p">(</span><span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="n">x</span><span class="p">)</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">ldiffile</span><span class="p">,</span> <span class="s">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span></span>
<span class="code-line">    <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span></span>
<span class="code-line">        <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&quot;Service:&quot;</span><span class="p">):</span></span>
<span class="code-line">            <span class="n">fixlen</span><span class="p">(</span><span class="n">line</span><span class="p">,</span><span class="mi">76</span><span class="p">)</span></span>
<span class="code-line">        <span class="k">else</span><span class="p">:</span></span>
<span class="code-line">            <span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span></span>
</pre></div></div>
  		</article>
  		<article>
<header>
      <h1 class="entry-title">
        <a href="https://bynario.com/2017-06-05-issues-running-gpg-in-a-container.html">Issues running gpg in a container</a>
      </h1>
    <p class="meta">
<time datetime="2017-06-05T00:01:17+02:00" pubdate>lun 05 junio 2017</time>    </p>
</header>

  <div class="entry-content"><p>In case it helps...</p>
<p>I am giving a try to <a href="https://github.com/pahaz/docker-compose-django-postgresql-redis-example">this docker componse example</a>, and for some strange reason, docker was stuck in this block of code in the Dockerfile for one of the components:</p>
<div class="prettyprint"><pre><span class="code-line"><span class="err">#</span><span class="x"> grab gosu for easy step-down from root</span></span>
<span class="code-line"><span class="x">ENV GOSU_VERSION 1.7</span></span>
<span class="code-line"><span class="x">RUN set -x \</span></span>
<span class="code-line"><span class="x">        &amp;&amp; apt-get update &amp;&amp; apt-get install -y --no-install-recommends ca-certificates wget &amp;&amp; rm -rf /var/lib/apt/lists/* \</span></span>
<span class="code-line"><span class="x">        &amp;&amp; wget -O /usr/local/bin/gosu &quot;https://github.com/tianon/gosu/releases/download/</span><span class="p">$</span><span class="nv">GOSU_VERSION</span><span class="x">/gosu-</span><span class="p">$(</span><span class="err">dpkg</span> <span class="err">--print-architecture</span><span class="p">)</span><span class="x">&quot; \</span></span>
<span class="code-line"><span class="x">        &amp;&amp; wget -O /usr/local/bin/gosu.asc &quot;https://github.com/tianon/gosu/releases/download/</span><span class="p">$</span><span class="nv">GOSU_VERSION</span><span class="x">/gosu-</span><span class="p">$(</span><span class="err">dpkg</span> <span class="err">--print-architecture</span><span class="p">).</span><span class="nv">asc</span><span class="x">&quot; \</span></span>
<span class="code-line"><span class="x">        &amp;&amp; export GNUPGHOME=&quot;</span><span class="p">$(</span><span class="err">mktemp</span> <span class="err">-d</span><span class="p">)</span><span class="x">&quot; \</span></span>
<span class="code-line"><span class="x">        &amp;&amp; gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \</span></span>
<span class="code-line"><span class="x">        &amp;&amp; gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \</span></span>
<span class="code-line"><span class="x">        &amp;&amp; rm -r &quot;</span><span class="p">$</span><span class="nv">GNUPGHOME</span><span class="x">&quot; /usr/local/bin/gosu.asc \</span></span>
<span class="code-line"><span class="x">        &amp;&amp; chmod +x /usr/local/bin/gosu \</span></span>
<span class="code-line"><span class="x">        &amp;&amp; gosu nobody true</span></span>
</pre></div>


<p>Specifically, in this line:</p>
<div class="prettyprint"><pre><span class="code-line">gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 </span>
</pre></div>


<p>It is a really simple command... I could ping the keyserver, I checked the website and everything looked ok, but it wasn't working, neither in the host machine or inside a container... The response was the same: timeout while getting the keys</p>
<p>So... Here comes netstat to the rescue:</p>
<div class="prettyprint"><pre><span class="code-line"># netstat -natop | grep gpg</span>
<span class="code-line">tcp        0      1 192.168.1.10:34340      104.236.209.43:11371    SYN_SENT    8653/gpg2keys_hkp    on (7,10/3/0)</span>
</pre></div>


<p>SYN_SENT? So it was trying to stablish the connection, but there wasn't any response from the remote host... <strong><em>In that port</em></strong></p>
<p>It turns out I recently upgraded my internet connection, and the new router allows you to customize the firewall security levels (you know, low, medium, high and paranoid... yeah, I am using the latter). I noticed that port 11371 was not defined in as a "known service", so I wasn't able to reach it from within my home network.  </p>
<p>As soon as I allowed the connection to that port:</p>
<div class="prettyprint"><pre><span class="code-line"># gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4</span>
<span class="code-line">gpg: solicitando clave BF357DD4 de hkp servidor ha.pool.sks-keyservers.net</span>
<span class="code-line">gpg: /root/.gnupg/trustdb.gpg: se ha creado base de datos de confianza</span>
<span class="code-line">gpg: clave BF357DD4: clave pública &quot;Tianon Gravi &lt;tianon@tianon.xyz&gt;&quot; importada</span>
<span class="code-line">gpg: no se encuentran claves absolutamente fiables</span>
<span class="code-line">gpg: Cantidad total procesada: 1</span>
<span class="code-line">gpg:               importadas: 1  (RSA: 1)</span>
</pre></div>


<p>So make sure all your ip flows are open, even for such a small thing as this one...</p>
<p>Take care out there!</p></div>
  		</article>
<div class="pagination">
    <a class="prev" href="https://bynario.com/index2.html">&larr; Older</a>

  <br />
</div></div>
<aside class="sidebar">
  <section>
	  <img src="/img/roundPic.gif" alt="" width=""/> 
  </section>
  <section>
    <h1>Recent Posts</h1>
    <ul id="recent_posts">
      <li class="post">
          <a href="https://bynario.com/2018-05-15-batch-macos-convert-resize-nef-to-jpg.html">NEF batch processing in MacOS (from CLI)</a>
      </li>
      <li class="post">
          <a href="https://bynario.com/2018-02-17-psa_minikeepass_and_key_files.html">PSA: MiniKeePass and key files</a>
      </li>
      <li class="post">
          <a href="https://bynario.com/2017-12-31-bye-bye-2017_hello-2018.html">Bye bye 2017, hello 2018</a>
      </li>
      <li class="post">
          <a href="https://bynario.com/2017-08-25-string-manipulation-exercise-perl-python-awk.html">String manipulation exercise: Perl, Python, Awk</a>
      </li>
      <li class="post">
          <a href="https://bynario.com/2017-06-05-issues-running-gpg-in-a-container.html">Issues running gpg in a container</a>
      </li>
    </ul>
  </section>

  <section>
  <h1>Tags</h1>
    <a href="https://bynario.com/tag/pelican.html">pelican</a>,    <a href="https://bynario.com/tag/google.html">google</a>,    <a href="https://bynario.com/tag/data-science.html">data science</a>,    <a href="https://bynario.com/tag/telegram.html">telegram</a>,    <a href="https://bynario.com/tag/coding.html">coding</a>,    <a href="https://bynario.com/tag/blogging.html">blogging</a>,    <a href="https://bynario.com/tag/books.html">books</a>,    <a href="https://bynario.com/tag/linux.html">linux</a>,    <a href="https://bynario.com/tag/images.html">images</a>,    <a href="https://bynario.com/tag/technology.html">technology</a>,    <a href="https://bynario.com/tag/bynario.html">bynario</a>,    <a href="https://bynario.com/tag/spotify.html">spotify</a>,    <a href="https://bynario.com/tag/git.html">Git</a>,    <a href="https://bynario.com/tag/networking.html">networking</a>,    <a href="https://bynario.com/tag/ads.html">ads</a>,    <a href="https://bynario.com/tag/quickthoughts.html">quickthoughts</a>,    <a href="https://bynario.com/tag/spam.html">spam</a>,    <a href="https://bynario.com/tag/tv.html">tv</a>,    <a href="https://bynario.com/tag/octopress.html">octopress</a>,    <a href="https://bynario.com/tag/psgonza.html">psgonza</a>,    <a href="https://bynario.com/tag/synology.html">synology</a>,    <a href="https://bynario.com/tag/perl.html">perl</a>,    <a href="https://bynario.com/tag/nas.html">nas</a>,    <a href="https://bynario.com/tag/internet.html">internet</a>,    <a href="https://bynario.com/tag/interview.html">interview</a>,    <a href="https://bynario.com/tag/2014.html">2014</a>,    <a href="https://bynario.com/tag/2017.html">2017</a>,    <a href="https://bynario.com/tag/2016.html">2016</a>,    <a href="https://bynario.com/tag/iptables.html">iptables</a>,    <a href="https://bynario.com/tag/kubernetes.html">kubernetes</a>,    <a href="https://bynario.com/tag/python.html">python</a>,    <a href="https://bynario.com/tag/ntp.html">ntp</a>,    <a href="https://bynario.com/tag/2015.html">2015</a>,    <a href="https://bynario.com/tag/keepass.html">keepass</a>,    <a href="https://bynario.com/tag/photos.html">photos</a>,    <a href="https://bynario.com/tag/ssmtp.html">ssmtp</a>,    <a href="https://bynario.com/tag/awk.html">awk</a>,    <a href="https://bynario.com/tag/cygwin.html">cygwin</a>,    <a href="https://bynario.com/tag/meetups.html">meetups</a>,    <a href="https://bynario.com/tag/scripts.html">scripts</a>,    <a href="https://bynario.com/tag/ipython.html">ipython</a>,    <a href="https://bynario.com/tag/monitoring.html">monitoring</a>,    <a href="https://bynario.com/tag/security.html">security</a>,    <a href="https://bynario.com/tag/bash.html">bash</a>,    <a href="https://bynario.com/tag/rss.html">rss</a>,    <a href="https://bynario.com/tag/macos.html">macos</a>,    <a href="https://bynario.com/tag/tips.html">tips</a>,    <a href="https://bynario.com/tag/geotagging.html">geotagging</a>,    <a href="https://bynario.com/tag/ssl.html">ssl</a>,    <a href="https://bynario.com/tag/windows.html">windows</a>,    <a href="https://bynario.com/tag/blogs.html">blogs</a>,    <a href="https://bynario.com/tag/privacy.html">privacy</a>,    <a href="https://bynario.com/tag/programming.html">programming</a>,    <a href="https://bynario.com/tag/cli.html">cli</a>,    <a href="https://bynario.com/tag/podcasts.html">podcasts</a>,    <a href="https://bynario.com/tag/ansible.html">ansible</a>,    <a href="https://bynario.com/tag/opinion.html">opinion</a>,    <a href="https://bynario.com/tag/docker.html">docker</a>,    <a href="https://bynario.com/tag/note2self.html">note2self</a>,    <a href="https://bynario.com/tag/scripting.html">scripting</a>  </section>



  <section>
    <h1>GitHub Repos</h1>
    <ul id="gh_repos">
      <p><a href="https://github.com/psgonza">@psgonza</a></p>
    </ul>
    <script type="text/javascript">
      $.domReady(function(){
          if (!window.jXHR){
              var jxhr = document.createElement('script');
              jxhr.type = 'text/javascript';
              jxhr.src = 'https://bynario.com/theme/js/jXHR.js';
              var s = document.getElementsByTagName('script')[0];
              s.parentNode.insertBefore(jxhr, s);
          }

          github.showRepos({
              user: 'psgonza',
              count: 5,
              skip_forks: false,
              target: '#gh_repos'
          });
      });
    </script>
    <script src="https://bynario.com/theme/js/github.js" type="text/javascript"> </script>
  </section>


<section>
   <h1>Tweeter</h1>
    <p>Follow <a href="http://twitter.com/psgonza">@psgonza</a></p>
</section>
</aside>    </div>
  </div>
  <footer role="contentinfo"><p>
    Copyright &copy;  2011&ndash;2018  psgonza &mdash;
  <span class="credit">Powered by <a href="http://getpelican.com">Pelican</a></span>
</p></footer>
  <script src="https://bynario.com/theme/js/modernizr-2.0.js"></script>
  <script src="https://bynario.com/theme/js/ender.js"></script>
  <script src="https://bynario.com/theme/js/octopress.js" type="text/javascript"></script>
    <script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-90925-1']);
    _gaq.push(['_trackPageview']);
    (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();

    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

    ga('create', 'UA-90925-1');
    ga('send', 'pageview');
</script>
  <script type="text/javascript">
    var disqus_shortname = 'bynario';
    (function() {
      var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
      dsq.src = "//" + disqus_shortname + '.disqus.com/embed.js';
      (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
     })();
  </script>
</body>
</html>