commit ca3b23daa5ac1dfbc59e2369fdab9bcd77aa9621 parent f143eaae307596e3450784a9ec4cb3eb19baaa51 Author: lash <dev@holbrook.no> Date: Sat, 1 Oct 2022 13:18:21 +0000 Bugfixes for portable metadata post Diffstat:
74 files changed, 333 insertions(+), 4154 deletions(-)
diff --git a/09c60de8503f5115c11d7059476de0a930bdeaf0511609d24ed93d15aadef47b.asc b/09c60de8503f5115c11d7059476de0a930bdeaf0511609d24ed93d15aadef47b.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzsACgkQzcvSTdHQ -4AFVDQgAqdsTEMu0m6C1lMiCKKujR7+xyslkJjVrp14OpV4m55ZjQDMOqkK97PB9 -6PHlJDuluYsHPRTXVHQvWreA9JTD00D1M1wZjSkHarM3taYouhfIY+tlReIw5JSj -+mKHa0u4O637dlylbTRo2BFv+MQX+g2U+QyB+xiPVwD+pMLT6fEtD/kntY5gH0bL -KhCV+GTMJmc21iM9C+A+gqGEL33OnHdShwKs5bUGxgtjWdozSK4QM4md0DoAIhIW -gi/82rtiCpMlcYKimK++lT0D67ghTV8moZ4qa9HmbtMGY0pQNseUolLjyrSl65YT -Wc3jIXR3YKFNYJuOBlcxeVwB2NNLEw== -=3Wp9 +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AGPuwf+KpTAkzdTTDfoFkXy9MvYE/sg0VDCckYS0jRgmAtwLhyVeXK8SlG/4Haa +LFOk0y/905kc60AjHdqZ5E3QjofylT9HR8v5wQ+OfqIITYvjGxIRmNMat99JygSe +35oiPv8x6eIwwczFeSteSU+pIaiZa1q4oyCv6Ivv6nONWNSgD9CmL4WdAvSK6hZm +LyDVk4xLjgroF+Vkj0faDYqCpzQZ2kG4AZgRyAbdckHy7OUTYRP6hqQuTle5uCT5 +ykOGaQsYCqSmckDh/re1UsJXza6vs31bdAwgopansThSDPEjhOr3as597VASkLe7 +i+Xye5Rq2bWBIbfJygc+4UNUpzAzjg== +=lNRe -----END PGP SIGNATURE----- diff --git a/1147e630f5d17d981407c49cfc72bb0b340e2b672044f7df387490f23c8700c0.asc b/1147e630f5d17d981407c49cfc72bb0b340e2b672044f7df387490f23c8700c0.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AEw+AgAnVLl2QbGjK++z5q1+NnQXhsWBfT/MFk6XrM0d2CCy6yLJaSU31nYzeWl -a7Z2GTw1m0VipLmag4gedo4L1Mjl9pNjr/vUmGHj56jPmOeij8sL/3XrefsMPoGD -N61sQKLxzrJ896K0Qcrqg92EIYkDk6tBkm4tn5iHBByjeScifKZojnGkYVR1Mu11 -jPI6YtLQVN64R8bSFmfWuuDZEJCRxwZcaYH4+GaIM+du7TvhQ2pKR5PXnZcugxet -QCXytgWV9W2uo5V1OwGy+YGBIayvqYJuZF4fTHGZD5idEkCOXzibXUTV+nKpUGPL -WYfS3WcX3E6R7VoNuOfio6Nb97YSNQ== -=ws7R +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AFC9wf/fhTcnIrN9Tk6wY07hAMEUXYSad5YCr5ugAWH8d4YxvJPe8bGLBsCysIQ +IPc0WiXYbdAQFswZhe2n0BzfWX5fmlePVB8I8vqpM1CIFvP98f7Dg0MAmx8x4onk +f1gXHHRzekIdGocK7r59ZWJaX3Ah3rG4g1sYULri54fGomxMOg6iOntC/HE38Vqg +sxVFcgaq+yb+s2/V/l5FrL1/IZZMQSr2zbjcJRCbi9IUVGiCBWpJXERsckvT68nR +Ea3TNDMQDP4pYqkLm6OVsgIA9mF59uaOJHiiKPq6758GMDKe1SyGDDBozwLfccfB +LHZ5CAy30ttm+4uL6ckgrnJjW2Z7yw== +=NUFH -----END PGP SIGNATURE----- diff --git a/24345ef2cf2edbf32d9ec3e55a6e0801a5a73f8337bb81bc1a7395ebbe3bf7e0.asc b/24345ef2cf2edbf32d9ec3e55a6e0801a5a73f8337bb81bc1a7395ebbe3bf7e0.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzsACgkQzcvSTdHQ -4AFDcAf+PhGwhBAACBONtnExlRdrDjruax1tLkq5DBoTJY65m5uNEJVJ7L5vunON -UTvbF7gk4HWER7gWOs0jdfeybQJaHC5I9IKkjo8Hynfc+wHqC2HNRmYoV2UZw0nT -2iTeJULmYuj1Equoav8mtyQHTTPZOvIEAH5GPSUFnCVM83ObzZgAX1h17pfN2vVe -CpmbMUGIvHEXYL0YfhmcSRjEQNL0WAwOPRoS90ba6jdeMlVv3axy51bkxw7IoJbu -taIrevqD1437Gzc6ubNgNeftvGOC6F7sY/D1ek9CYxhaMpuhs1olWR2e93RIzV0U -jL/FJyqBID+2Rx1QMF8yjaKESY2cxw== -=sHf6 +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AGHBQgAl8FigfzBG4qYcIa5tklugEF9w0ft4b6vYi6MnK9guK4F0oxVw/xxGKGR +LJ9BIovTSc+xLqW/BJQ9Kaqhs9rgiBL/1oQmURnh4ZPhmTIgkdKSW1NrnKA/KGCj +nXB98NvlmfGp1m+sNEZpA1Qq7a8UZaxzcDQXxOc3WmB9XnLkUkaep62i634bzd56 +jnuvWq/byHpz8wsVMJpK6QFYvsehpcVspbiH/2KHdp6BlF9ewZQjv2T2okkjawFg +ktZc0efkcCS6K4Fg1Z3t5bbxQPwdDcWtQMAWZ3NkL0kOPqXYrp7F9CwcUVGo4FRN +d/X0r0+kXv7sRfPMSggDAFBZiMK4Hg== +=VOlI -----END PGP SIGNATURE----- diff --git a/37f77922ca667d5ced9d58cdc642bacb89fa428365585bad4aa09a6e9ab67d82 b/37f77922ca667d5ced9d58cdc642bacb89fa428365585bad4aa09a6e9ab67d82 @@ -0,0 +1,237 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <link rel="stylesheet" type="text/css" href="./theme/css/style.css" /> + <link rel="stylesheet" type="text/css" href="./theme/css/syntax.css" /> + <title>man bytes gnu - A portable book metadata exercise</title> + <meta charset="utf-8" /> + <meta name="generator" content="Pelican" /> + +</head> + +<body id="index" class="home"> + + <header id="banner" class="body"> + <h1>> <a href="./">man bytes gnu</a><span id="cursor">_</span></h1> + </header> + <nav id="menu"> + <ul> + <li class="active"><a href="./category/archiving.html">Archiving</a></li> + <li><a href="./category/code.html">Code</a></li> + <li><a href="./category/hygiene.html">Hygiene</a></li> + <li><a href="./category/offlining.html">Offlining</a></li> + <li><a href="./pages/identities.html">Identities</a></li> + <li><a href="./pages/shares.html">Shares</a></li> + + <li><a href="/tags.html">tags</a></li> + </ul> + <hr/> + </nav><!-- /#menu --> + <header> + <h1 class="entry-title top-body-title"> + <a href="./portable-book-metadata.html" rel="bookmark" + title="Permalink to A portable book metadata exercise">A portable book metadata exercise</a></h1> + + + <div class="category meta"> + Posted +<time class="published" datetime="2022-10-01T12:40:00+02:00"> + Sat 01 October 2022 + </time> +in <a class="category" href="./category/archiving.html">archiving</a> + <a href="./tag/hash.html">hash</a> + <a href="./tag/kitab.html">kitab</a> + <a href="./tag/literature.html">literature</a> + <a href="./tag/metadata.html">metadata</a> + <a href="./tag/dublincore.html">dublincore</a> + <a href="./tag/libgen.html">libgen</a> + </div> + + <div class="neighbors meta"> + <ul> + <li> + Previous: <a href="./backup-rsync-duplicity.html"> + Combining duplicity and rsync + </a> + </li> + </ul> + </div> + <div class="meta"> +<hr/> + </div> +</header> + +<section id="content" class="body"> + <div class="entry-content"> + <p>One of the things I have been working on the last few weeks is a rust application I have dubbed <a class="reference external" href="https://git.defalsify.net/kitab">kitab</a>.</p> +<p>In short, the application makes it easy to extract literary metadata to a separate file structure.</p> +<p>The metadata can in turn be applied as <em>extended attributes</em> recursively on a directory for files that match.</p> +<p>The way it's accomplished it simple: The file name of the metadata is the hex representation of the digest of the file. The same digest is used to match files to metadata when applying it back to the file.</p> +<p>There are two advantages to this:</p> +<ol class="arabic simple"> +<li>The digest of the media file need not be affected by the metadata, i.e. by embedding metadata in the file itself.</li> +<li>You do not need to use the file name to keep record of what a file is.</li> +</ol> +<div class="section" id="yarr-ye-matey-data"> +<h2>Yarr, ye matey-data</h2> +<p>Let's demonstrate with an example.</p> +<p>The fabulous <a class="reference external" href="https://libgen.rs">Library Genesis</a> project has made available an endpoint to retrieve <tt class="docutils literal">bibtex</tt> entries based on the <tt class="docutils literal">md5</tt> hash of the book media file.</p> +<p>A version of the <a class="reference external" href="https://libgen.rs/book/index.php?md5=BCD99F1AB4155F2A2A362E5B7938A852">Bitcoin White Paper</a>, under the <code>md5</code> hash <code>bcd99f1ab4155f2a2a362e5b7938a852</code>, can be found there.</p> +<p>If you download this file using a synchronous download link, the browser will provide you with a filename to go with the download.</p> +<p>However, if you use the torrent alternative, the filename will be the <tt class="docutils literal">md5</tt> hash itself. If you are torrenting a bunch of those files, it quickly becomes a nuisance to distinguish them.</p> +<p>And, of course: In either case there is no guarantee the any metadata comes with the file.</p> +<div class="section" id="inside-the-book"> +<h3>Inside the book</h3> +<p>Kitab (v0.0.2) is able to read metadata from both a bibtex source and xattr entries on a file, as well as its native <a class="reference external" href="https://www.w3.org/TR/turtle/">rdf-turtle</a> format.</p> +<p>In kitab's data store, every media file entity in rdf-turtle is keyed with a <a class="reference external" href="https://www.rfc-editor.org/info/rfc8141">URN</a> specifying a digest for the file.</p> +<p>To see exactly what that looks like, let's download and import the bibtex metadata for the paper <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a>:</p> +<pre class="code bash literal-block"> +<span class="nv">bibtex_file</span><span class="o">=</span><span class="sb">`</span>mktemp<span class="sb">`</span> +<span class="nv">kitab_dir</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> +curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span>BCD99F1AB4155F2A2A362E5B7938A852 -o <span class="nv">$bibtex_file</span> +kitab --store <span class="nv">$kitab_dir</span> import --digest md5:BCD99F1AB4155F2A2A362E5B7938A852 <span class="nv">$bibtex_file</span> +cat <span class="nv">$kitab_dir</span>/* +</pre> +<p>The output of the above should be:</p> +<pre class="code turtle literal-block"> +<span class="nv"><URN:md5:bcd99f1ab4155f2a2a362e5b7938a852></span> <span class="nv"><https://purl.org/dc/terms/title></span> <span class="s">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> +<span class="nv"><https://purl.org/dc/terms/creator></span> <span class="s">"Satoshi Nakamoto"</span> <span class="p">;</span> +<span class="nv"><https://purl.org/dc/terms/type></span> <span class="s">"book"</span> <span class="p">.</span> +</pre> +<p>Now let's say the media file itself has been downloaded to <tt class="docutils literal"><span class="pre">~/.local/share/transmission</span></tt>. We can apply this metadata as extended attributes.</p> +<p>This time we turn on logging to see what's going on:</p> +<pre class="code console literal-block"> +<span class="gp">$ </span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab --store <span class="nv">$kitab_dir</span> apply --digest md5 ~/.local/share/transmission +<span class="go">[2022-10-01T11:14:59Z INFO kitab] have index directory "/tmp/tmp.r0jBm6q4hW" +[2022-10-01T11:14:59Z INFO kitab] using digest type md5 +[2022-10-01T11:14:59Z INFO kitab] apply from path "/home/lash/.local/share/transmission/" +[2022-10-01T11:14:59Z INFO kitab] apply DirEntry("/home/lash/.local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852") -> title "Bitcoin: A Peer-to-Peer Electronic Cash System" author "Satoshi Nakamoto" digest md5:bcd99f1ab4155f2a2a362e5b7938a852 + +</span><span class="gp">$ </span>find ~/.local/share/transmission -type f -regextype sed -regex <span class="s2">".*/[a-f0-9]\{32\}</span>$<span class="s2">"</span> -exec getfattr -d <span class="o">{}</span> <span class="se">\;</span> +<span class="gp"># </span>file: .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 +<span class="go">user.dcterms:creator="Satoshi Nakamoto" +user.dcterms:title="Bitcoin: A Peer-to-Peer Electronic Cash System" +user.dcterms:type="book"</span> +</pre> +</div> +<div class="section" id="let-the-right-one-in"> +<h3>Let the right one in</h3> +<p>Conversely, the metadata can be re-imported directly from the extended attributes. And this time, let's store it both under the <tt class="docutils literal">md5</tt> and the <tt class="docutils literal">sha512</tt> hash:</p> +<pre class="code bash literal-block"> +$ <span class="nv">kitab_dir_new</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> +$ kitab --store <span class="nv">$kitab_dir_new</span> import --digest md5 --digest sha512 .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 +$ find <span class="nv">$kitab_dir_new</span> -type f -exec cat <span class="o">{}</span> <span class="se">\;</span> +/tmp/tmp.B6j41YMmEM/493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792 +<URN:sha512:493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> + <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> + <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> + <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . +/tmp/tmp.B6j41YMmEM/bcd99f1ab4155f2a2a362e5b7938a852 +<URN:md5:bcd99f1ab4155f2a2a362e5b7938a852> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> + <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> + <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> + <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . +</pre> +</div> +</div> +<div class="section" id="level-up"> +<h2>Level up</h2> +<p>Finally, a bash script <a class="footnote-reference" href="#footnote-2" id="footnote-reference-2">[2]</a> example that lets you retrieve and apply metadata for a batch of files found in the directory given as the <em>first positional arg</em>.</p> +<p>This script even renames the files according to the metadata applied.</p> +<pre class="code bash literal-block"> +<span class="ln"> 0 </span><span class="c1"># NOTE! this will only work if your fs supports xattr. +</span><span class="ln"> 1 </span><span class="c1"># That's why we cannot use tmpfs (mktemp) here; tmpfs does not support xattr. +</span><span class="ln"> 2 </span><span class="c1"></span> +<span class="ln"> 3 </span><span class="c1"># directory to copy media files to +</span><span class="ln"> 4 </span><span class="c1"></span><span class="nv">outdir</span><span class="o">=</span>./<span class="k">$(</span>uuidgen<span class="k">)</span> +<span class="ln"> 5 </span>mkdir -vp <span class="nv">$outdir</span> +<span class="ln"> 6 </span> +<span class="ln"> 7 </span><span class="c1"># Input dir is the first positional arg. +</span><span class="ln"> 8 </span><span class="c1"></span><span class="nv">indir</span><span class="o">=</span><span class="nv">$1</span> +<span class="ln"> 9 </span> +<span class="ln">10 </span><span class="nv">IFS</span><span class="o">=</span><span class="s1">$'\n'</span> +<span class="ln">11 </span> +<span class="ln">12 </span><span class="c1"># Retrieve metadata for each file and import it into the kitab store. +</span><span class="ln">13 </span><span class="c1"># Also copy the media file to the separate output directory. +</span><span class="ln">14 </span><span class="c1"></span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>find <span class="nv">$indir</span> -type f<span class="k">)</span><span class="p">;</span> <span class="k">do</span> +<span class="ln">15 </span> <span class="nv">sum</span><span class="o">=</span><span class="k">$(</span>md5sum <span class="nv">$f</span> <span class="p">|</span> awk <span class="s1">'{print $1;}'</span><span class="k">)</span> +<span class="ln">16 </span> <span class="nb">echo</span> <span class="s2">"downloading metadata for </span><span class="nv">$indir</span><span class="s2">/</span><span class="nv">$f</span><span class="s2">"</span> +<span class="ln">17 </span> <span class="nv">srct</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> +<span class="ln">18 </span> curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span><span class="nv">$sum</span> -o <span class="nv">$srct</span> +<span class="ln">19 </span> <span class="nv">dstt</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> +<span class="ln">20 </span> xmllint --html --xpath <span class="s1">'string(/html/body/textarea[@id="bibtext"])'</span> <span class="nv">$srct</span> > <span class="nv">$dstt</span> +<span class="ln">21 </span> kitab import --digest md5:<span class="nv">$sum</span> <span class="nv">$dstt</span> +<span class="ln">22 </span> cp <span class="nv">$f</span> <span class="nv">$outdir</span>/ +<span class="ln">23 </span><span class="k">done</span> +<span class="ln">24 </span> +<span class="ln">25 </span><span class="c1"># Apply metadata imported from bibtex as xattr for the media files. +</span><span class="ln">26 </span><span class="c1"></span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab apply --digest md5 <span class="nv">$outdir</span>/ +<span class="ln">27 </span> +<span class="ln">28 </span><span class="c1"># Rename the files according to the metadata title and media type. +</span><span class="ln">29 </span><span class="c1"></span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>ls <span class="nv">$outdir</span><span class="k">)</span><span class="p">;</span> <span class="k">do</span> +<span class="ln">30 </span> <span class="nv">title</span><span class="o">=</span><span class="k">$(</span>getfattr --only-values -n user.dcterms:title <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> +<span class="ln">31 </span> +<span class="ln">32 </span> <span class="nv">f_typ</span><span class="o">=</span><span class="k">$(</span>file -b --mime-type <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> +<span class="ln">33 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">""</span> +<span class="ln">34 </span> <span class="k">case</span> <span class="s2">"</span><span class="nv">$f_typ</span><span class="s2">"</span> <span class="k">in</span> +<span class="ln">35 </span> <span class="s2">"application/pdf"</span><span class="o">)</span> +<span class="ln">36 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".pdf"</span> +<span class="ln">37 </span> <span class="p">;;</span> +<span class="ln">38 </span> <span class="s2">"application/epub+zip"</span><span class="o">)</span> +<span class="ln">39 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".epub"</span> +<span class="ln">40 </span> <span class="p">;;</span> +<span class="ln">41 </span> <span class="s2">"application/x-mobipocket-ebook"</span><span class="o">)</span> +<span class="ln">42 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".mobi"</span> +<span class="ln">43 </span> <span class="p">;;</span> +<span class="ln">44 </span> <span class="s2">"text/plain"</span><span class="o">)</span> +<span class="ln">45 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".txt"</span> +<span class="ln">46 </span> <span class="p">;;</span> +<span class="ln">47 </span> <span class="s2">"text/html"</span><span class="o">)</span> +<span class="ln">48 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".html"</span> +<span class="ln">49 </span> <span class="p">;;</span> +<span class="ln">50 </span> *<span class="o">)</span> +<span class="ln">51 </span> ><span class="p">&</span><span class="m">2</span> <span class="nb">echo</span> unhandled mime <span class="nb">type</span> <span class="nv">$f_typ</span> +<span class="ln">52 </span> <span class="nb">exit</span> <span class="m">1</span> +<span class="ln">53 </span> <span class="k">esac</span> +<span class="ln">54 </span> mv -v <span class="nv">$outdir</span>/<span class="nv">$f</span> <span class="nv">$outdir</span>/<span class="si">${</span><span class="nv">title</span><span class="si">}${</span><span class="nv">f_ext</span><span class="si">}</span> +<span class="ln">55 </span><span class="k">done</span> +</pre> +<p>This last example will result in:</p> +<ul class="simple"> +<li>A media file named <tt class="docutils literal">$outdir/Bitcoin: A <span class="pre">Peer-to-Peer</span> Electronic Cash System.epub</tt></li> +<li>... with metadata applied as extended attributes</li> +<li>An rdf-turtle metadata entry in <tt class="docutils literal"><span class="pre">~/.local/share/kitab/idx/bcd99f1ab4155f2a2a362e5b7938a852</span></tt></li> +</ul> +<!-- --> +<blockquote> +<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td>The <code>kitab</code> command in the script assumes you have built the <em>kitab binary</em> and made it available in your path.</td></tr> +</tbody> +</table> +</blockquote> +<!-- --> +<blockquote> +<table class="docutils footnote" frame="void" id="footnote-2" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label"><a class="fn-backref" href="#footnote-reference-2">[2]</a></td><td>the script uses <code>xmllint</code> which on archlinux is provided by the <tt class="docutils literal">libxml2</tt> package.</td></tr> +</tbody> +</table> +</blockquote> +</div> + + </div><!-- /.entry-content --> + <footer class="meta"> + </footer> + +</section> + <footer id="contentinfo" class="body"> + <hr/> + <address id="about" class="vcard body"> + Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> + </address><!-- /#about --> + </footer><!-- /#contentinfo --> +</body> +</html> +\ No newline at end of file diff --git a/37f77922ca667d5ced9d58cdc642bacb89fa428365585bad4aa09a6e9ab67d82.asc b/37f77922ca667d5ced9d58cdc642bacb89fa428365585bad4aa09a6e9ab67d82.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP SIGNATURE----- + +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AEB9ggApnYXtjJpHP7hQyFwo2IKsyaF9pKLGeXEUfL2KAObqnNdAUkzbKo6yvxz +fquQv1C7FGeQagQcMaXggwPlpl1F7z9dFGNWFGm9MRSsLJZTdtO3DOqHe4outqsu +WWnfS1gP+/B3NoH7jf3zKSJTRms5lF+d979/g9zfJ0du34d2h5CI0BBVldMtrmZE +gQSAz48YuANXq0YYwde/I/KJdCXIymkoMXCPpG6YPiNuPt50yfWtS3jZsQ39yTbN +V4uEZxzE6CoodH+4OnIikt1JM46BgPIws9Yc1GTGecRSIk849laVwpCJvDxU92kW +oU728awqSSoLpR/mUdIDf2RTCB2Vzw== +=vn9K +-----END PGP SIGNATURE----- diff --git a/617878ecd470e80c0f5fadc0cf7e669ceea086a54343e56a35aeaf8131038d6c.asc b/617878ecd470e80c0f5fadc0cf7e669ceea086a54343e56a35aeaf8131038d6c.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzsACgkQzcvSTdHQ -4AH2HQf5Afq7lMppFTu2kyMAHdjtFjzbSrMjrZ88lg7SeJjTLTurNc75rMsvu+lU -C19WFpg7uVecQi3aJlsMKA7zUDJ0i2bPW9waM/VO4OlKcMjm4TLE/w4Os/lm+Ljn -TY2/4X/pJuk011PWAowOkmJpIhXclTxBATiNI6SCb0QzoliY7jsazFzGqW5mYDIk -Dn4IW2CrXRBMgKn+mRZud5dk5dbS4Kw90hcjbKzo8XCaQPuxXlwWjiQr3bJTd0dC -/DwZtQxd9U2CM5/2a8WPszP1ZHqSJ7Lx4vbI0hFCZttEeznTzDlwfVPdCB8v2MoI -DzjUzNiUm4TatsXHyeY/cnEO3rhPTA== -=vBiY +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AEdkggAhs4galtVUDOMY7lUeART8C498CCIwyZY4ZUt+fIguj294uyJRxsyywdl +U9G1dY6jniTi6O70+mFOzOcN4E27VrKBOETb6nv71HOXWV1IxBk8mLJVsSEKpzhU +UR9v0C1jZunykViArfRhSm9tRiJMhWIHQ9hYtlM/eECwQlT0bOr4AZsBtpn+aL3/ +DluGWtCUtJW78TgAQpzt1S6rwNIlI366pqs7re9LioLcWqsU4Vqv8bXAkUYQFwRk +6aEoIidwaTXiH57lukI+aio5/hcvpIbrSEH9T8OnXENtNFA9Zr0zaOXRfdbKlWJ0 +0E8+y1Nr8ft5+7KP+DFE8sDWiXZYOg== +=EVnR -----END PGP SIGNATURE----- diff --git a/788f1df1d56d3aeb5a7374de267f9ebd41865fefabacd46810270f1596856a71.asc b/788f1df1d56d3aeb5a7374de267f9ebd41865fefabacd46810270f1596856a71.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzsACgkQzcvSTdHQ -4AGi7QgAgf5uOFOstKB1yKJ1UfV88uDzuhctz62FcxQ/rt6dEcjEhU3ETebqlp+G -3QtkKhUuQOLtBpyltdyqogbcN/AgTYht1GaGaYrlI2C8pqlhmfF4PZQ/Y72okV8K -AzPe/Q5i09Qgw2ccOU7iCKsZ9NO4gZ/GVMjjOBEjPSTWAUW124MPTP382qCyQkc7 -SgrbjV0Fmyfph4KNnEcjt3Gj/5Ua0JFlrLgEhIy8DG0/RIaXAi4NnY6ZivYDC2p4 -zWftPI3NWYbcvbWoRk0TzD1uGQxzBTp7ZoVZGVskoKttjE02dddwhTVVA4qPWz8n -s1j2cBGLV0TVpcWithHMFbBmjxgl2g== -=FUj+ +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AEhGwf/S64e0SlOcBxMl1AVD5foo5qf81Bj1y5PhW6yRxKWmb9FVLe1SZtV3W+n +xy0p22YYU5T992fB7Nr8gH3t1IXpj2aLvDYPf6NC4Wh058gF6XTydoftJBrssAHw +CS8LfDgzrxq8KRm71MLX9I1CDOKuwtiQcyVWU7jolhQp2UpNOhMvOcEvA7SEdZN5 +urMJdzYk6yzGIz39AUAA4cydWS+fgohkOMUU7yhskKogzZ6S0VDJIlS0WRWRk17V ++LVlJSl9/L76pAgxopnnyv1B9YJT+vOP/OQFIc/D0u/QrLWN3AyKY8wwMtkZMHBh +9r3NsgXN94wAF/QmqFrbwEF7V9ZloQ== +=2rFd -----END PGP SIGNATURE----- diff --git a/80d5137e80648103735073b716f744b6e2210092a4c2ea556d87a931a3878c53.asc b/80d5137e80648103735073b716f744b6e2210092a4c2ea556d87a931a3878c53.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AGsTgf/eLMQ0jVh7sf+WSUFvNLE/xue01c5D9aegvk1Jb+oQ+EB4PJAEnTvDdJ4 -agTiWv4wpVP0Ktmw7DFDJo2tjVakjuRvLLs59WHsGlGsWAvCGPi1T9oVn6SBcnGy -ntM0jMPlLj/6rRFyhE055DlX5Zzy0eDceAuFWkz/yObewGJ7kxPgFkcvQPqklF6c -uvElCtp9DCe7GtEt3wQcdW/s3e1ZEiJw6p7SIV2H1wTwilR7akEA4CILrwEGVta/ -DxAX5hLsErx9U4uJu/oLZYjxUSzswAoUZZs3zh0yCmYKQZFhmMVyGLMrkaGrwh+8 -q7ceklr/bUV8Ic134VODkzn1HmNlNg== -=Cy6B +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AH1Qgf/QDq4Pnvx8JhCYOhdxWl5bPa7HPhew5CvApEjP3QHIM69pQ8bEwQ0WWUh +TdNbeKOChYSGMaYAsAh3OhkqwJQnVv2CSG2HX858AazvKHjbIo7cYlpwl5DcUZAi +kAfeW5XAxyTjQO3xA6S1j6Fw1Ngl8os3aYmvGyOAPCqkLtEXPCy0dEsKnQQXVSmY +AFwU8AWH3l+wRc5laErSUac2ehQ4X1HHpuU5i4EYPOnzCcHSaEFF9JCapJrN8T5R +D8vvJhf+lUiSvR2FPfO91ikzTpOrpwHA8sGhuw1XF/lxmmM5Z8NVRu9X3MQo6v3F +qM5Dh6KqKxVms5h1oImCzzk9Nl6ctQ== +=fHv+ -----END PGP SIGNATURE----- diff --git a/92eb83e7074b2760e6001d40b17eecffb874b23f036abd5b6d2328f28f49bac8.asc b/92eb83e7074b2760e6001d40b17eecffb874b23f036abd5b6d2328f28f49bac8.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzsACgkQzcvSTdHQ -4AFSegf6Ar0VsD+2aMnMxyLrNduJsmqtgw4DaI3F6qwd801H34FfPfOh8dMCxXp2 -Ko8/rroEvEzXxnA7F6v3XpGky4ETL7E3Y+XN0GLYAoAwe3L7aEXWT0dC+DqMABL/ -ZWBcGFCxdWmKDdYzbiPdKep/BNFYfBlC1vTTaEZfTqRSLb1KyYhh2ryTJFfrRkBz -MpwzEGEJuhs8XMcSwAnjrFeuTuQQftLOV9+IyWcYZEVqDfuHA2O25Cbp6MTTIS9a -s3bzFgdKUutlbJH1orcrh0cPqodS8S7tYcJeGj3FZ2zmjE1jFA5/zj5/kFEJl5Tx -uCTSWBRw5ZW9dH82ZZHmQ4ZVfXZQ7Q== -=nige +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AE/Ggf+JafmzsI2bEJBTA9sLk4kVQCmUFfvnlsvExnZ622kp6om4N8Kfo5Ofjvr +x+wmAbPxZzJIqyAm46IQcMU5X7I3zgeDIMYvBJ5eQubXne4NN5ZLQgk9hkCWc3ly +gZP0bhoL68SasBIlufNvyT0zKBFO3+8LP0SiuVKRFu9gisfTjSEDVU5K5ofminZB +fk8YLaVXVkKSMCo0MTyGrsAzPiBiBwvIbNQCcFIjXk1DjoQE/2XErN+JGUTa2vbO +zx2JrPCXFERKoZ9DcSHyOqRz0HS+OhXVOkxqJZuduff9k2svHp/TyqEIB8m12E3B +jeD3WCzFDmvhZICTy73EJlakdfTLAQ== +=/TIs -----END PGP SIGNATURE----- diff --git a/970551f6b9e85da64aa25d67d89191d0a1a3223b899604a354fc694903cbf615 b/970551f6b9e85da64aa25d67d89191d0a1a3223b899604a354fc694903cbf615 @@ -1,227 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="./theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="./theme/css/syntax.css" /> - <title>man bytes gnu - A portable book metadata exercise</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="./">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li class="active"><a href="./category/archiving.html">Archiving</a></li> - <li><a href="./category/code.html">Code</a></li> - <li><a href="./category/hygiene.html">Hygiene</a></li> - <li><a href="./category/offlining.html">Offlining</a></li> - <li><a href="./pages/identities.html">Identities</a></li> - <li><a href="./pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="./portable-book-metadata.html" rel="bookmark" - title="Permalink to A portable book metadata exercise">A portable book metadata exercise</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-10-01T12:40:00+02:00"> - Sat 01 October 2022 - </time> -in <a class="category" href="./category/archiving.html">archiving</a> - <a href="./tag/hash.html">hash</a> - <a href="./tag/kitab.html">kitab</a> - <a href="./tag/literature.html">literature</a> - <a href="./tag/metadata.html">metadata</a> - <a href="./tag/dublincore.html">dublincore</a> - <a href="./tag/libgen.html">libgen</a> - </div> - - <div class="neighbors meta"> - <ul> - <li> - Previous: <a href="./backup-rsync-duplicity.html"> - Combining duplicity and rsync - </a> - </li> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <p>One of the things I have been working on the last few weeks is a rust application I have dubbed <a class="reference external" href="https://git.defalsify.net/kitab">kitab</a>.</p> -<p>In short, the application makes it easy to extract literary metadata to a separate file structure.</p> -<p>The metadata can in turn be applied as <em>extended attributes</em> recursively on a directory for files that match.</p> -<p>The way it's accomplished it simple: The file name of the metadata is the hex representation of the digest of the file. The same digest is used to match files to metadata when applying it back to the file.</p> -<p>There are two advantages to this:</p> -<ol class="arabic simple"> -<li>The digest of the media file need not be affected by the metadata, i.e. by embedding metadata in the file itself.</li> -<li>You do not need to use the file name to keep record of what a file is.</li> -</ol> -<div class="section" id="yarr-ye-matey-data"> -<h2>Yarr, ye matey-data</h2> -<p>Let's demonstrate with an example.</p> -<p>The fabulous <a class="reference external" href="https://libgen.rs">Library Genesis</a> project has made available an endpoint to retrieve <tt class="docutils literal">bibtex</tt> entries based on the <tt class="docutils literal">md5</tt> hash of the book media file.</p> -<p>A version of the <a class="reference external" href="https://libgen.rs/book/index.php?md5=BCD99F1AB4155F2A2A362E5B7938A852">Bitcoin White Paper</a>, under the <code>md5</code> hash <code>bcd99f1ab4155f2a2a362e5b7938a852</code>, can be found there.</p> -<p>If you download this file using a synchronous download link, the browser will provide you with a filename to go with the download.</p> -<p>However, if you use the torrent alternative, the filename will be the <tt class="docutils literal">md5</tt> hash itself. If you are torrenting a bunch of those files, it quickly becomes a nuisance to distinguish them.</p> -<p>And, of course: In either case there is no guarantee the any metadata comes with the file.</p> -<div class="section" id="inside-the-book"> -<h3>Inside the book</h3> -<p>Kitab (v0.0.2) is able to read metadata from both a bibtex source and xattr entries on a file, as well as its native <a class="reference external" href="https://www.w3.org/TR/turtle/">rdf-turtle</a> format.</p> -<p>In kitab's data store, every media file entity in rdf-turtle is keyed with a <a class="reference external" href="https://www.rfc-editor.org/info/rfc8141">URN</a> specifying a digest for the file.</p> -<p>To see exactly what that looks like, let's download and import the bibtex metadata for the paper <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a>:</p> -<pre class="code bash literal-block"> -<span class="nv">bibtex_file</span><span class="o">=</span><span class="sb">`</span>mktemp<span class="sb">`</span> -<span class="nv">kitab_dir</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> -curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span>BCD99F1AB4155F2A2A362E5B7938A852 -o <span class="nv">$bibtex_file</span> -kitab --store <span class="nv">$kitab_dir</span> import --digest md5:BCD99F1AB4155F2A2A362E5B7938A852 <span class="nv">$bibtex_file</span> -cat <span class="nv">$kitab_dir</span>/* -</pre> -<p>The output of the above should be:</p> -<pre class="code turtle literal-block"> -<span class="nv"><URN:md5:bcd99f1ab4155f2a2a362e5b7938a852></span> <span class="nv"><https://purl.org/dc/terms/title></span> <span class="s">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> -<span class="nv"><https://purl.org/dc/terms/creator></span> <span class="s">"Satoshi Nakamoto"</span> <span class="p">;</span> -<span class="nv"><https://purl.org/dc/terms/type></span> <span class="s">"book"</span> <span class="p">.</span> -</pre> -<p>Now let's say the media file itself has been downloaded to <tt class="docutils literal"><span class="pre">~/.local/share/transmission</span></tt>. We can apply this metadata as extended attributes.</p> -<p>This time we turn on logging to see what's going on:</p> -<pre class="code console literal-block"> -<span class="gp">$ </span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab --store <span class="nv">$kitab_dir</span> apply --digest md5 ~/.local/share/transmission -<span class="go">[2022-10-01T11:14:59Z INFO kitab] have index directory "/tmp/tmp.r0jBm6q4hW" -[2022-10-01T11:14:59Z INFO kitab] using digest type md5 -[2022-10-01T11:14:59Z INFO kitab] apply from path "/home/lash/.local/share/transmission/" -[2022-10-01T11:14:59Z INFO kitab] apply DirEntry("/home/lash/.local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852") -> title "Bitcoin: A Peer-to-Peer Electronic Cash System" author "Satoshi Nakamoto" digest md5:bcd99f1ab4155f2a2a362e5b7938a852 - -</span><span class="gp">$ </span>find ~/.local/share/transmission -type f -regextype sed -regex <span class="s2">".*/[a-f0-9]\{32\}</span>$<span class="s2">"</span> -exec getfattr -d <span class="o">{}</span> <span class="se">\;</span> -<span class="gp"># </span>file: .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 -<span class="go">user.dcterms:creator="Satoshi Nakamoto" -user.dcterms:title="Bitcoin: A Peer-to-Peer Electronic Cash System" -user.dcterms:type="book"</span> -</pre> -</div> -<div class="section" id="let-the-right-one-in"> -<h3>Let the right one in</h3> -<p>Conversely, the metadata can be re-imported directly from the extended attributes. And this time, let's store it both under the <tt class="docutils literal">md5</tt> and the <tt class="docutils literal">sha512</tt> hash:</p> -<pre class="code bash literal-block"> -$ <span class="nv">kitab_dir_new</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> -$ kitab --store <span class="nv">$kitab_dir_new</span> import --digest md5 --digest sha512 .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 -$ find <span class="nv">$kitab_dir_new</span> -type f -exec cat <span class="o">{}</span> <span class="se">\;</span> -/tmp/tmp.B6j41YMmEM/493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792 -<URN:sha512:493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> - <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> - <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> - <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . -/tmp/tmp.B6j41YMmEM/bcd99f1ab4155f2a2a362e5b7938a852 -<URN:md5:bcd99f1ab4155f2a2a362e5b7938a852> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> - <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> - <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> - <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . -</pre> -</div> -</div> -<div class="section" id="level-up"> -<h2>Level up</h2> -<p>Finally, a bash script <a class="footnote-reference" href="#footnote-2" id="footnote-reference-2">[2]</a> example that lets you retrieve and apply metadata for a batch of files. This script even renames the files according to the metadata applied.</p> -<pre class="code bash literal-block"> -<span class="ln"> 0 </span><span class="c1"># NOTE! this will only work if your fs supports xattr. -</span><span class="ln"> 1 </span><span class="c1"># That's why we cannot use tmpfs (mktemp) here; tmpfs does not support xattr. -</span><span class="ln"> 2 </span><span class="c1"></span><span class="nv">outdir</span><span class="o">=</span>./<span class="k">$(</span>uuidgen<span class="k">)</span> -<span class="ln"> 3 </span>mkdir -vp <span class="nv">$outdir</span> -<span class="ln"> 4 </span> -<span class="ln"> 5 </span><span class="nv">IFS</span><span class="o">=</span><span class="s1">$'\n'</span> -<span class="ln"> 6 </span> -<span class="ln"> 7 </span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>find <span class="nv">$1</span> -type f<span class="k">)</span><span class="p">;</span> <span class="k">do</span> -<span class="ln"> 8 </span> <span class="nv">sum</span><span class="o">=</span><span class="k">$(</span>md5sum <span class="nv">$f</span> <span class="p">|</span> awk <span class="s1">'{print $1;}'</span><span class="k">)</span> -<span class="ln"> 9 </span> <span class="nb">echo</span> <span class="s2">"downloading metadata for </span><span class="nv">$1</span><span class="s2">/</span><span class="nv">$f</span><span class="s2">"</span> -<span class="ln">10 </span> <span class="nv">srct</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> -<span class="ln">11 </span> curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span><span class="nv">$sum</span> -o <span class="nv">$srct</span> -<span class="ln">12 </span> <span class="nv">dstt</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> -<span class="ln">13 </span> xmllint --html --xpath <span class="s1">'string(/html/body/textarea[@id="bibtext"])'</span> <span class="nv">$srct</span> > <span class="nv">$dstt</span> -<span class="ln">14 </span> kitab import --digest md5:<span class="nv">$sum</span> <span class="nv">$dstt</span> -<span class="ln">15 </span> cp <span class="nv">$f</span> <span class="nv">$outdir</span>/ -<span class="ln">16 </span><span class="k">done</span> -<span class="ln">17 </span> -<span class="ln">18 </span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab apply --digest md5 <span class="nv">$outdir</span>/ -<span class="ln">19 </span> -<span class="ln">20 </span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>ls <span class="nv">$outdir</span><span class="k">)</span><span class="p">;</span> <span class="k">do</span> -<span class="ln">21 </span> <span class="nv">title</span><span class="o">=</span><span class="k">$(</span>getfattr --only-values -n user.dcterms:title <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> -<span class="ln">22 </span> -<span class="ln">23 </span> <span class="nv">f_typ</span><span class="o">=</span><span class="k">$(</span>file -b --mime-type <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> -<span class="ln">24 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">""</span> -<span class="ln">25 </span> <span class="k">case</span> <span class="s2">"</span><span class="nv">$f_typ</span><span class="s2">"</span> <span class="k">in</span> -<span class="ln">26 </span> <span class="s2">"application/pdf"</span><span class="o">)</span> -<span class="ln">27 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".pdf"</span> -<span class="ln">28 </span> <span class="p">;;</span> -<span class="ln">29 </span> <span class="s2">"application/epub+zip"</span><span class="o">)</span> -<span class="ln">30 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".epub"</span> -<span class="ln">31 </span> <span class="p">;;</span> -<span class="ln">32 </span> <span class="s2">"application/x-mobipocket-ebook"</span><span class="o">)</span> -<span class="ln">33 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".mobi"</span> -<span class="ln">34 </span> <span class="p">;;</span> -<span class="ln">35 </span> <span class="s2">"text/plain"</span><span class="o">)</span> -<span class="ln">36 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".txt"</span> -<span class="ln">37 </span> <span class="p">;;</span> -<span class="ln">38 </span> <span class="s2">"text/html"</span><span class="o">)</span> -<span class="ln">39 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".html"</span> -<span class="ln">40 </span> <span class="p">;;</span> -<span class="ln">41 </span> *<span class="o">)</span> -<span class="ln">42 </span> ><span class="p">&</span><span class="m">2</span> <span class="nb">echo</span> unhandled mime <span class="nb">type</span> <span class="nv">$f_typ</span> -<span class="ln">43 </span> <span class="nb">exit</span> <span class="m">1</span> -<span class="ln">44 </span> <span class="k">esac</span> -<span class="ln">45 </span> mv -v <span class="nv">$outdir</span>/<span class="nv">$f</span> <span class="nv">$outdir</span>/<span class="si">${</span><span class="nv">title</span><span class="si">}${</span><span class="nv">f_ext</span><span class="si">}</span> -<span class="ln">46 </span><span class="k">done</span> -</pre> -<p>This last example will result in:</p> -<ul class="simple"> -<li>A media file named <tt class="docutils literal">$outdir/Bitcoin: A <span class="pre">Peer-to-Peer</span> Electronic Cash System.epub</tt></li> -<li>... with metadata applied as extended attributes</li> -<li>An rdf-turtle metadata entry in <tt class="docutils literal"><span class="pre">~/.local/share/kitab/idx/bcd99f1ab4155f2a2a362e5b7938a852</span></tt></li> -</ul> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td>The <code>kitab</code> command in the script assumes you have built the <em>kitab binary</em> and made it available in your path.</td></tr> -</tbody> -</table> -</blockquote> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-2" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-2">[2]</a></td><td>the script uses <cite>xmllint</cite> which on archlinux is provided by the <tt class="docutils literal">libxml2</tt> package.</td></tr> -</tbody> -</table> -</blockquote> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/970551f6b9e85da64aa25d67d89191d0a1a3223b899604a354fc694903cbf615.asc b/970551f6b9e85da64aa25d67d89191d0a1a3223b899604a354fc694903cbf615.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NWEACgkQzcvSTdHQ -4AGwJwf/baQulBK5dAEFaXhgtOzl1kSDZ/TbQ8D1FAiQK0IyDJf+/ITxB7pJ/1A6 -6I+wN/KeMa1BrRhHxOuoYLH4JQ2Cm6UW51w+wcTfnLdaX4maZer4nUi63hjvVaYj -Pn+AeyaDJGVQvXStJRLW75xKkl1/QGcg7hBH6nbVInMJqYTyWST0RC2ERX/0+kTN -mWotHZ8z6TAHtD4AfLsKmkcFpAFVLDys5xY6gRPbIeaKertoou31ESIfKC2IvCiJ -5x1veVRyPb5HSmLqzaaQkyAbWnn+PmmtHUMeUKz1ozgwLoHVmhwwd8+tOXChn7PN -mZbAEaqI2mPfghrGDWmyd7BDmAndVA== -=sxPi ------END PGP SIGNATURE----- diff --git a/a65e1931616b12b513de414d8a220ee14e85e9cc12165dd27d77773d3e593760 b/a65e1931616b12b513de414d8a220ee14e85e9cc12165dd27d77773d3e593760 @@ -1,228 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="./theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="./theme/css/syntax.css" /> - <title>man bytes gnu - A portable book metadata exercise</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="./">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li class="active"><a href="./category/archiving.html">Archiving</a></li> - <li><a href="./category/code.html">Code</a></li> - <li><a href="./category/hygiene.html">Hygiene</a></li> - <li><a href="./category/offlining.html">Offlining</a></li> - <li><a href="./pages/identities.html">Identities</a></li> - <li><a href="./pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="./portable-book-metadata.html" rel="bookmark" - title="Permalink to A portable book metadata exercise">A portable book metadata exercise</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-10-01T12:40:00+02:00"> - Sat 01 October 2022 - </time> -in <a class="category" href="./category/archiving.html">archiving</a> - <a href="./tag/hash.html">hash</a> - <a href="./tag/kitab.html">kitab</a> - <a href="./tag/literature.html">literature</a> - <a href="./tag/metadata.html">metadata</a> - <a href="./tag/dublincore.html">dublincore</a> - <a href="./tag/libgen.html">libgen</a> - </div> - - <div class="neighbors meta"> - <ul> - <li> - Previous: <a href="./backup-rsync-duplicity.html"> - Combining duplicity and rsync - </a> - </li> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <p>One of the things I have been working on the last few weeks is a rust application I have dubbed <a class="reference external" href="https://git.defalsify.net/kitab">kitab</a>.</p> -<p>In short, the application makes it easy to extract literary metadata to a separate file structure.</p> -<p>The metadata can in turn be applied as <em>extended attributes</em> recursively on a directory for files that match.</p> -<p>The way it's accomplished it simple: The file name of the metadata is the hex representation of the digest of the file. The same digest is used to match files to metadata when applying it back to the file.</p> -<p>There are two advantages to this:</p> -<ol class="arabic simple"> -<li>The digest of the media file need not be affected by the metadata, i.e. by embedding metadata in the file itself.</li> -<li>You do not need to use the file name to keep record of what a file is.</li> -</ol> -<div class="section" id="yarr-ye-matey-data"> -<h2>Yarr, ye matey-data</h2> -<p>Let's demonstrate with an example.</p> -<p>The fabulous <a class="reference external" href="https://libgen.rs">Library Genesis</a> project has made available an endpoint to retrieve <tt class="docutils literal">bibtex</tt> entries based on the <tt class="docutils literal">md5</tt> hash of the book media file.</p> -<p>A version of the <a class="reference external" href="https://libgen.rs/book/index.php?md5=BCD99F1AB4155F2A2A362E5B7938A852">Bitcoin White Paper</a>, under the <code>md5</code> hash <code>bcd99f1ab4155f2a2a362e5b7938a852</code>, can be found there.</p> -<p>If you download this file using a synchronous download link, the browser will provide you with a filename to go with the download.</p> -<p>However, if you use the torrent alternative, the filename will be the <tt class="docutils literal">md5</tt> hash itself. If you are torrenting a bunch of those files, it quickly becomes a nuisance to distinguish them.</p> -<p>And, of course: In either case there is no guarantee the any metadata comes with the file.</p> -<div class="section" id="inside-the-book"> -<h3>Inside the book</h3> -<p>Kitab (v0.0.2) is able to read metadata from both a bibtex source and xattr entries on a file, as well as its native <a class="reference external" href="https://www.w3.org/TR/turtle/">rdf-turtle</a> format.</p> -<p>In kitab's data store, every media file entity in rdf-turtle is keyed with a <a class="reference external" href="https://www.rfc-editor.org/info/rfc8141">URN</a> specifying a digest for the file.</p> -<p>To see exactly what that looks like, let's download and import the bibtex metadata for the paper <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a>:</p> -<pre class="code bash literal-block"> -<span class="nv">bibtex_file</span><span class="o">=</span><span class="sb">`</span>mktemp<span class="sb">`</span> -<span class="nv">kitab_dir</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> -curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span>BCD99F1AB4155F2A2A362E5B7938A852 -o <span class="nv">$bibtex_file</span> -kitab --store <span class="nv">$kitab_dir</span> import --digest md5:BCD99F1AB4155F2A2A362E5B7938A852 <span class="nv">$bibtex_file</span> -cat <span class="nv">$kitab_dir</span>/* -</pre> -<p>The output of the above should be:</p> -<pre class="code turtle literal-block"> -<span class="nv"><URN:md5:bcd99f1ab4155f2a2a362e5b7938a852></span> <span class="nv"><https://purl.org/dc/terms/title></span> <span class="s">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> -<span class="nv"><https://purl.org/dc/terms/creator></span> <span class="s">"Satoshi Nakamoto"</span> <span class="p">;</span> -<span class="nv"><https://purl.org/dc/terms/type></span> <span class="s">"book"</span> <span class="p">.</span> -</pre> -<p>Now let's say the media file itself has been downloaded to <tt class="docutils literal"><span class="pre">~/.local/share/transmission</span></tt>. We can apply this metadata as extended attributes.</p> -<p>This time we turn on logging to see what's going on:</p> -<pre class="code console literal-block"> -<span class="gp">$ </span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab --store <span class="nv">$kitab_dir</span> apply --digest md5 ~/.local/share/transmission -<span class="go">[2022-10-01T11:14:59Z INFO kitab] have index directory "/tmp/tmp.r0jBm6q4hW" -[2022-10-01T11:14:59Z INFO kitab] using digest type md5 -[2022-10-01T11:14:59Z INFO kitab] apply from path "/home/lash/.local/share/transmission/" -[2022-10-01T11:14:59Z INFO kitab] apply DirEntry("/home/lash/.local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852") -> title "Bitcoin: A Peer-to-Peer Electronic Cash System" author "Satoshi Nakamoto" digest md5:bcd99f1ab4155f2a2a362e5b7938a852 - -</span><span class="gp">$ </span>find ~/.local/share/transmission -type f -regextype sed -regex <span class="s2">".*/[a-f0-9]\{32\}</span>$<span class="s2">"</span> -exec getfattr -d <span class="o">{}</span> <span class="se">\;</span> -<span class="gp"># </span>file: .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 -<span class="go">user.dcterms:creator="Satoshi Nakamoto" -user.dcterms:title="Bitcoin: A Peer-to-Peer Electronic Cash System" -user.dcterms:type="book"</span> -</pre> -</div> -<div class="section" id="let-the-right-one-in"> -<h3>Let the right one in</h3> -<p>Conversely, the metadata can be re-imported directly from the extended attributes. And this time, let's store it both under the <tt class="docutils literal">md5</tt> and the <tt class="docutils literal">sha512</tt> hash:</p> -<pre class="code bash literal-block"> -$ <span class="nv">kitab_dir_new</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> -$ kitab --store <span class="nv">$kitab_dir_new</span> import --digest md5 --digest sha512 .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 -$ find <span class="nv">$kitab_dir_new</span> -type f -exec cat <span class="o">{}</span> <span class="se">\;</span> -/tmp/tmp.B6j41YMmEM/493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792 -<URN:sha512:493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> - <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> - <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> - <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . -/tmp/tmp.B6j41YMmEM/bcd99f1ab4155f2a2a362e5b7938a852 -<URN:md5:bcd99f1ab4155f2a2a362e5b7938a852> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> - <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> - <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> - <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . -</pre> -</div> -</div> -<div class="section" id="level-up"> -<h2>Level up</h2> -<p>Finally, a bash script <a class="footnote-reference" href="#footnote-2" id="footnote-reference-2">[2]</a> example that lets you retrieve and apply metadata for a batch of files found in the directory given as the <em>first positional arg</em>.</p> -<p>This script even renames the files according to the metadata applied.</p> -<pre class="code bash literal-block"> -<span class="ln"> 0 </span><span class="c1"># NOTE! this will only work if your fs supports xattr. -</span><span class="ln"> 1 </span><span class="c1"># That's why we cannot use tmpfs (mktemp) here; tmpfs does not support xattr. -</span><span class="ln"> 2 </span><span class="c1"></span><span class="nv">outdir</span><span class="o">=</span>./<span class="k">$(</span>uuidgen<span class="k">)</span> -<span class="ln"> 3 </span>mkdir -vp <span class="nv">$outdir</span> -<span class="ln"> 4 </span> -<span class="ln"> 5 </span><span class="nv">IFS</span><span class="o">=</span><span class="s1">$'\n'</span> -<span class="ln"> 6 </span> -<span class="ln"> 7 </span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>find <span class="nv">$1</span> -type f<span class="k">)</span><span class="p">;</span> <span class="k">do</span> -<span class="ln"> 8 </span> <span class="nv">sum</span><span class="o">=</span><span class="k">$(</span>md5sum <span class="nv">$f</span> <span class="p">|</span> awk <span class="s1">'{print $1;}'</span><span class="k">)</span> -<span class="ln"> 9 </span> <span class="nb">echo</span> <span class="s2">"downloading metadata for </span><span class="nv">$1</span><span class="s2">/</span><span class="nv">$f</span><span class="s2">"</span> -<span class="ln">10 </span> <span class="nv">srct</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> -<span class="ln">11 </span> curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span><span class="nv">$sum</span> -o <span class="nv">$srct</span> -<span class="ln">12 </span> <span class="nv">dstt</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> -<span class="ln">13 </span> xmllint --html --xpath <span class="s1">'string(/html/body/textarea[@id="bibtext"])'</span> <span class="nv">$srct</span> > <span class="nv">$dstt</span> -<span class="ln">14 </span> kitab import --digest md5:<span class="nv">$sum</span> <span class="nv">$dstt</span> -<span class="ln">15 </span> cp <span class="nv">$f</span> <span class="nv">$outdir</span>/ -<span class="ln">16 </span><span class="k">done</span> -<span class="ln">17 </span> -<span class="ln">18 </span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab apply --digest md5 <span class="nv">$outdir</span>/ -<span class="ln">19 </span> -<span class="ln">20 </span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>ls <span class="nv">$outdir</span><span class="k">)</span><span class="p">;</span> <span class="k">do</span> -<span class="ln">21 </span> <span class="nv">title</span><span class="o">=</span><span class="k">$(</span>getfattr --only-values -n user.dcterms:title <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> -<span class="ln">22 </span> -<span class="ln">23 </span> <span class="nv">f_typ</span><span class="o">=</span><span class="k">$(</span>file -b --mime-type <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> -<span class="ln">24 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">""</span> -<span class="ln">25 </span> <span class="k">case</span> <span class="s2">"</span><span class="nv">$f_typ</span><span class="s2">"</span> <span class="k">in</span> -<span class="ln">26 </span> <span class="s2">"application/pdf"</span><span class="o">)</span> -<span class="ln">27 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".pdf"</span> -<span class="ln">28 </span> <span class="p">;;</span> -<span class="ln">29 </span> <span class="s2">"application/epub+zip"</span><span class="o">)</span> -<span class="ln">30 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".epub"</span> -<span class="ln">31 </span> <span class="p">;;</span> -<span class="ln">32 </span> <span class="s2">"application/x-mobipocket-ebook"</span><span class="o">)</span> -<span class="ln">33 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".mobi"</span> -<span class="ln">34 </span> <span class="p">;;</span> -<span class="ln">35 </span> <span class="s2">"text/plain"</span><span class="o">)</span> -<span class="ln">36 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".txt"</span> -<span class="ln">37 </span> <span class="p">;;</span> -<span class="ln">38 </span> <span class="s2">"text/html"</span><span class="o">)</span> -<span class="ln">39 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".html"</span> -<span class="ln">40 </span> <span class="p">;;</span> -<span class="ln">41 </span> *<span class="o">)</span> -<span class="ln">42 </span> ><span class="p">&</span><span class="m">2</span> <span class="nb">echo</span> unhandled mime <span class="nb">type</span> <span class="nv">$f_typ</span> -<span class="ln">43 </span> <span class="nb">exit</span> <span class="m">1</span> -<span class="ln">44 </span> <span class="k">esac</span> -<span class="ln">45 </span> mv -v <span class="nv">$outdir</span>/<span class="nv">$f</span> <span class="nv">$outdir</span>/<span class="si">${</span><span class="nv">title</span><span class="si">}${</span><span class="nv">f_ext</span><span class="si">}</span> -<span class="ln">46 </span><span class="k">done</span> -</pre> -<p>This last example will result in:</p> -<ul class="simple"> -<li>A media file named <tt class="docutils literal">$outdir/Bitcoin: A <span class="pre">Peer-to-Peer</span> Electronic Cash System.epub</tt></li> -<li>... with metadata applied as extended attributes</li> -<li>An rdf-turtle metadata entry in <tt class="docutils literal"><span class="pre">~/.local/share/kitab/idx/bcd99f1ab4155f2a2a362e5b7938a852</span></tt></li> -</ul> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td>The <code>kitab</code> command in the script assumes you have built the <em>kitab binary</em> and made it available in your path.</td></tr> -</tbody> -</table> -</blockquote> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-2" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-2">[2]</a></td><td>the script uses <cite>xmllint</cite> which on archlinux is provided by the <tt class="docutils literal">libxml2</tt> package.</td></tr> -</tbody> -</table> -</blockquote> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/a65e1931616b12b513de414d8a220ee14e85e9cc12165dd27d77773d3e593760.asc b/a65e1931616b12b513de414d8a220ee14e85e9cc12165dd27d77773d3e593760.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NhoACgkQzcvSTdHQ -4AHT/gf+Oi3UdT0nu9HJTV0Bv0nthuiaqnrxXNseEVxdZsVMP5cqUvi53e6+AH/c -Od5CJsgF5YAVZS0pSCVzvCmhzzeAsrXvntDiNawsGMJn9AUNO1xumLKhaU4ZR/8n -H16lXhClcGUAIWSO3F+c92HBe+h2gQlfyDB9/HEnXl2aFvFA+EopifF/oc4zxrzm -ET2X7FTl5gqOtcuPIMvaP2+dzrFvFgRNfR5jlE9y8qfFhIDPdZKCyfiHEqQS0lzN -s4s1NiRf6i0/bje8vozX1HbALN3b1HcCNZk3nyJYjw4FuFKCVGLjjFWTZUL3YMF/ -LMwjTPqHIGwEn0mhJ7bqWlsfoSidxg== -=/rEP ------END PGP SIGNATURE----- diff --git a/c38ce3a51eeaa98f5524cf9902e84ee8ba5d179d6fbe18c49f9707554c896b6e.asc b/c38ce3a51eeaa98f5524cf9902e84ee8ba5d179d6fbe18c49f9707554c896b6e.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzsACgkQzcvSTdHQ -4AEroAf/cwRW5+lTqHl8wud8DdUasDkAb7QRqImVdfMG506e2S6JtG1ImB/g/Y3x -nXxG0m+jzJTVUocG9qzcntkxvIoZ6j4BY5/FY4hia4+jcm0rstNZ+Cu69LhsVA+1 -uM4igcEKFqh8uRI8Znxu3N6HuamLtfFFCon34Jv6hboM50CDfT0FGlCkmuhu9heO -7oF6/zODYlu4giY0AC7z7Mv6SFJRMekNT1jgS2PhcSLyvzmjeveMd6hu+XISWkTL -vYFpyWrkpgwAtqr5G9u82NIzT0C6suCoYrqjq8M3t1Ys2Fqjg6cTSfHKfT3VCiYa -Q/Qa9WN1hIDLOMbsEjgsqPkv5it0XQ== -=pca1 +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AEz7wf/Vyp/u7rYTCJtpVWjYQ5n970LJpAQmpwnBHkg6J9dJ3lkXO1kCTHx1vKS +iJWrqL8Cb6tGi4OSyzI5ZK7OvSvv62TR+8e716sCFFdC3emilMeHKcNc9wWL9Hxq +dPUSnU+QT4POzr5SypuLqwxTPqv58nHZ9xfZ3s0Hrowl0pckXpTWhEkAQXRZ9ecX +i3qJB5bTmcar2NCM1YKDHVGsBOaYfH/cSzU6/DLi/FKKhGFpO7k3gA9klR3X0wVp ++zDONVToJf/mRKzitH85tRslebTLQYHWH/sJacTKZQTb7ZrkY7s/Df1ApoLIspX5 +b19MpqzILE9B6pEunYN9zpX+a9qRLA== +=tKN5 -----END PGP SIGNATURE----- diff --git a/ca197565fb955f2328bcc11540521adebeb2d0f95d6501901516eb76fb25707c b/ca197565fb955f2328bcc11540521adebeb2d0f95d6501901516eb76fb25707c @@ -1,237 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="./theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="./theme/css/syntax.css" /> - <title>man bytes gnu - A portable book metadata exercise</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="./">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li class="active"><a href="./category/archiving.html">Archiving</a></li> - <li><a href="./category/code.html">Code</a></li> - <li><a href="./category/hygiene.html">Hygiene</a></li> - <li><a href="./category/offlining.html">Offlining</a></li> - <li><a href="./pages/identities.html">Identities</a></li> - <li><a href="./pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="./portable-book-metadata.html" rel="bookmark" - title="Permalink to A portable book metadata exercise">A portable book metadata exercise</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-10-01T12:40:00+02:00"> - Sat 01 October 2022 - </time> -in <a class="category" href="./category/archiving.html">archiving</a> - <a href="./tag/hash.html">hash</a> - <a href="./tag/kitab.html">kitab</a> - <a href="./tag/literature.html">literature</a> - <a href="./tag/metadata.html">metadata</a> - <a href="./tag/dublincore.html">dublincore</a> - <a href="./tag/libgen.html">libgen</a> - </div> - - <div class="neighbors meta"> - <ul> - <li> - Previous: <a href="./backup-rsync-duplicity.html"> - Combining duplicity and rsync - </a> - </li> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <p>One of the things I have been working on the last few weeks is a rust application I have dubbed <a class="reference external" href="https://git.defalsify.net/kitab">kitab</a>.</p> -<p>In short, the application makes it easy to extract literary metadata to a separate file structure.</p> -<p>The metadata can in turn be applied as <em>extended attributes</em> recursively on a directory for files that match.</p> -<p>The way it's accomplished it simple: The file name of the metadata is the hex representation of the digest of the file. The same digest is used to match files to metadata when applying it back to the file.</p> -<p>There are two advantages to this:</p> -<ol class="arabic simple"> -<li>The digest of the media file need not be affected by the metadata, i.e. by embedding metadata in the file itself.</li> -<li>You do not need to use the file name to keep record of what a file is.</li> -</ol> -<div class="section" id="yarr-ye-matey-data"> -<h2>Yarr, ye matey-data</h2> -<p>Let's demonstrate with an example.</p> -<p>The fabulous <a class="reference external" href="https://libgen.rs">Library Genesis</a> project has made available an endpoint to retrieve <tt class="docutils literal">bibtex</tt> entries based on the <tt class="docutils literal">md5</tt> hash of the book media file.</p> -<p>A version of the <a class="reference external" href="https://libgen.rs/book/index.php?md5=BCD99F1AB4155F2A2A362E5B7938A852">Bitcoin White Paper</a>, under the <code>md5</code> hash <code>bcd99f1ab4155f2a2a362e5b7938a852</code>, can be found there.</p> -<p>If you download this file using a synchronous download link, the browser will provide you with a filename to go with the download.</p> -<p>However, if you use the torrent alternative, the filename will be the <tt class="docutils literal">md5</tt> hash itself. If you are torrenting a bunch of those files, it quickly becomes a nuisance to distinguish them.</p> -<p>And, of course: In either case there is no guarantee the any metadata comes with the file.</p> -<div class="section" id="inside-the-book"> -<h3>Inside the book</h3> -<p>Kitab (v0.0.2) is able to read metadata from both a bibtex source and xattr entries on a file, as well as its native <a class="reference external" href="https://www.w3.org/TR/turtle/">rdf-turtle</a> format.</p> -<p>In kitab's data store, every media file entity in rdf-turtle is keyed with a <a class="reference external" href="https://www.rfc-editor.org/info/rfc8141">URN</a> specifying a digest for the file.</p> -<p>To see exactly what that looks like, let's download and import the bibtex metadata for the paper <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a>:</p> -<pre class="code bash literal-block"> -<span class="nv">bibtex_file</span><span class="o">=</span><span class="sb">`</span>mktemp<span class="sb">`</span> -<span class="nv">kitab_dir</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> -curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span>BCD99F1AB4155F2A2A362E5B7938A852 -o <span class="nv">$bibtex_file</span> -kitab --store <span class="nv">$kitab_dir</span> import --digest md5:BCD99F1AB4155F2A2A362E5B7938A852 <span class="nv">$bibtex_file</span> -cat <span class="nv">$kitab_dir</span>/* -</pre> -<p>The output of the above should be:</p> -<pre class="code turtle literal-block"> -<span class="nv"><URN:md5:bcd99f1ab4155f2a2a362e5b7938a852></span> <span class="nv"><https://purl.org/dc/terms/title></span> <span class="s">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> -<span class="nv"><https://purl.org/dc/terms/creator></span> <span class="s">"Satoshi Nakamoto"</span> <span class="p">;</span> -<span class="nv"><https://purl.org/dc/terms/type></span> <span class="s">"book"</span> <span class="p">.</span> -</pre> -<p>Now let's say the media file itself has been downloaded to <tt class="docutils literal"><span class="pre">~/.local/share/transmission</span></tt>. We can apply this metadata as extended attributes.</p> -<p>This time we turn on logging to see what's going on:</p> -<pre class="code console literal-block"> -<span class="gp">$ </span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab --store <span class="nv">$kitab_dir</span> apply --digest md5 ~/.local/share/transmission -<span class="go">[2022-10-01T11:14:59Z INFO kitab] have index directory "/tmp/tmp.r0jBm6q4hW" -[2022-10-01T11:14:59Z INFO kitab] using digest type md5 -[2022-10-01T11:14:59Z INFO kitab] apply from path "/home/lash/.local/share/transmission/" -[2022-10-01T11:14:59Z INFO kitab] apply DirEntry("/home/lash/.local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852") -> title "Bitcoin: A Peer-to-Peer Electronic Cash System" author "Satoshi Nakamoto" digest md5:bcd99f1ab4155f2a2a362e5b7938a852 - -</span><span class="gp">$ </span>find ~/.local/share/transmission -type f -regextype sed -regex <span class="s2">".*/[a-f0-9]\{32\}</span>$<span class="s2">"</span> -exec getfattr -d <span class="o">{}</span> <span class="se">\;</span> -<span class="gp"># </span>file: .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 -<span class="go">user.dcterms:creator="Satoshi Nakamoto" -user.dcterms:title="Bitcoin: A Peer-to-Peer Electronic Cash System" -user.dcterms:type="book"</span> -</pre> -</div> -<div class="section" id="let-the-right-one-in"> -<h3>Let the right one in</h3> -<p>Conversely, the metadata can be re-imported directly from the extended attributes. And this time, let's store it both under the <tt class="docutils literal">md5</tt> and the <tt class="docutils literal">sha512</tt> hash:</p> -<pre class="code bash literal-block"> -$ <span class="nv">kitab_dir_new</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> -$ kitab --store <span class="nv">$kitab_dir_new</span> import --digest md5 --digest sha512 .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 -$ find <span class="nv">$kitab_dir_new</span> -type f -exec cat <span class="o">{}</span> <span class="se">\;</span> -/tmp/tmp.B6j41YMmEM/493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792 -<URN:sha512:493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> - <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> - <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> - <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . -/tmp/tmp.B6j41YMmEM/bcd99f1ab4155f2a2a362e5b7938a852 -<URN:md5:bcd99f1ab4155f2a2a362e5b7938a852> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> - <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> - <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> - <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . -</pre> -</div> -</div> -<div class="section" id="level-up"> -<h2>Level up</h2> -<p>Finally, a bash script <a class="footnote-reference" href="#footnote-2" id="footnote-reference-2">[2]</a> example that lets you retrieve and apply metadata for a batch of files found in the directory given as the <em>first positional arg</em>.</p> -<p>This script even renames the files according to the metadata applied.</p> -<pre class="code bash literal-block"> -<span class="ln"> 0 </span><span class="c1"># NOTE! this will only work if your fs supports xattr. -</span><span class="ln"> 1 </span><span class="c1"># That's why we cannot use tmpfs (mktemp) here; tmpfs does not support xattr. -</span><span class="ln"> 2 </span><span class="c1"></span> -<span class="ln"> 3 </span><span class="c1"># directory to copy media files to -</span><span class="ln"> 4 </span><span class="c1"></span><span class="nv">outdir</span><span class="o">=</span>./<span class="k">$(</span>uuidgen<span class="k">)</span> -<span class="ln"> 5 </span>mkdir -vp <span class="nv">$outdir</span> -<span class="ln"> 6 </span> -<span class="ln"> 7 </span><span class="c1"># Input dir is the first positional arg. -</span><span class="ln"> 8 </span><span class="c1"></span><span class="nv">indir</span><span class="o">=</span><span class="nv">$1</span> -<span class="ln"> 9 </span> -<span class="ln">10 </span><span class="nv">IFS</span><span class="o">=</span><span class="s1">$'\n'</span> -<span class="ln">11 </span> -<span class="ln">12 </span><span class="c1"># Retrieve metadata for each file and import it into. -</span><span class="ln">13 </span><span class="c1"># Also copy the media file to the separate output directory. -</span><span class="ln">14 </span><span class="c1"></span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>find <span class="nv">$indir</span> -type f<span class="k">)</span><span class="p">;</span> <span class="k">do</span> -<span class="ln">15 </span> <span class="nv">sum</span><span class="o">=</span><span class="k">$(</span>md5sum <span class="nv">$f</span> <span class="p">|</span> awk <span class="s1">'{print $1;}'</span><span class="k">)</span> -<span class="ln">16 </span> <span class="nb">echo</span> <span class="s2">"downloading metadata for </span><span class="nv">$indir</span><span class="s2">/</span><span class="nv">$f</span><span class="s2">"</span> -<span class="ln">17 </span> <span class="nv">srct</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> -<span class="ln">18 </span> curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span><span class="nv">$sum</span> -o <span class="nv">$srct</span> -<span class="ln">19 </span> <span class="nv">dstt</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> -<span class="ln">20 </span> xmllint --html --xpath <span class="s1">'string(/html/body/textarea[@id="bibtext"])'</span> <span class="nv">$srct</span> > <span class="nv">$dstt</span> -<span class="ln">21 </span> kitab import --digest md5:<span class="nv">$sum</span> <span class="nv">$dstt</span> -<span class="ln">22 </span> cp <span class="nv">$f</span> <span class="nv">$outdir</span>/ -<span class="ln">23 </span><span class="k">done</span> -<span class="ln">24 </span> -<span class="ln">25 </span><span class="c1"># Apply metadata imported from bibtex as xattr for the media files. -</span><span class="ln">26 </span><span class="c1"></span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab apply --digest md5 <span class="nv">$outdir</span>/ -<span class="ln">27 </span> -<span class="ln">28 </span><span class="c1"># Rename the files according to the metadata title and media type. -</span><span class="ln">29 </span><span class="c1"></span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>ls <span class="nv">$outdir</span><span class="k">)</span><span class="p">;</span> <span class="k">do</span> -<span class="ln">30 </span> <span class="nv">title</span><span class="o">=</span><span class="k">$(</span>getfattr --only-values -n user.dcterms:title <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> -<span class="ln">31 </span> -<span class="ln">32 </span> <span class="nv">f_typ</span><span class="o">=</span><span class="k">$(</span>file -b --mime-type <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> -<span class="ln">33 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">""</span> -<span class="ln">34 </span> <span class="k">case</span> <span class="s2">"</span><span class="nv">$f_typ</span><span class="s2">"</span> <span class="k">in</span> -<span class="ln">35 </span> <span class="s2">"application/pdf"</span><span class="o">)</span> -<span class="ln">36 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".pdf"</span> -<span class="ln">37 </span> <span class="p">;;</span> -<span class="ln">38 </span> <span class="s2">"application/epub+zip"</span><span class="o">)</span> -<span class="ln">39 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".epub"</span> -<span class="ln">40 </span> <span class="p">;;</span> -<span class="ln">41 </span> <span class="s2">"application/x-mobipocket-ebook"</span><span class="o">)</span> -<span class="ln">42 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".mobi"</span> -<span class="ln">43 </span> <span class="p">;;</span> -<span class="ln">44 </span> <span class="s2">"text/plain"</span><span class="o">)</span> -<span class="ln">45 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".txt"</span> -<span class="ln">46 </span> <span class="p">;;</span> -<span class="ln">47 </span> <span class="s2">"text/html"</span><span class="o">)</span> -<span class="ln">48 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".html"</span> -<span class="ln">49 </span> <span class="p">;;</span> -<span class="ln">50 </span> *<span class="o">)</span> -<span class="ln">51 </span> ><span class="p">&</span><span class="m">2</span> <span class="nb">echo</span> unhandled mime <span class="nb">type</span> <span class="nv">$f_typ</span> -<span class="ln">52 </span> <span class="nb">exit</span> <span class="m">1</span> -<span class="ln">53 </span> <span class="k">esac</span> -<span class="ln">54 </span> mv -v <span class="nv">$outdir</span>/<span class="nv">$f</span> <span class="nv">$outdir</span>/<span class="si">${</span><span class="nv">title</span><span class="si">}${</span><span class="nv">f_ext</span><span class="si">}</span> -<span class="ln">55 </span><span class="k">done</span> -</pre> -<p>This last example will result in:</p> -<ul class="simple"> -<li>A media file named <tt class="docutils literal">$outdir/Bitcoin: A <span class="pre">Peer-to-Peer</span> Electronic Cash System.epub</tt></li> -<li>... with metadata applied as extended attributes</li> -<li>An rdf-turtle metadata entry in <tt class="docutils literal"><span class="pre">~/.local/share/kitab/idx/bcd99f1ab4155f2a2a362e5b7938a852</span></tt></li> -</ul> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td>The <code>kitab</code> command in the script assumes you have built the <em>kitab binary</em> and made it available in your path.</td></tr> -</tbody> -</table> -</blockquote> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-2" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-2">[2]</a></td><td>the script uses <cite>xmllint</cite> which on archlinux is provided by the <tt class="docutils literal">libxml2</tt> package.</td></tr> -</tbody> -</table> -</blockquote> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/ca197565fb955f2328bcc11540521adebeb2d0f95d6501901516eb76fb25707c.asc b/ca197565fb955f2328bcc11540521adebeb2d0f95d6501901516eb76fb25707c.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzsACgkQzcvSTdHQ -4AGM5gf/Q5lqpvRe+V30rZSz754R8cMIXM9LWiDzp3l3h18JwzMcnKshlnSbUHea -ab0fQdNrCyg62RrCIxi346GcJVJwmGSXaZCkxRZjF5KBSe/8I7s7dE+F0jAL1g0w -TG/BzZl4Lzl7wKDdEIZiZFuS193DgsKb4+4D9sHjAKZRnAJDE82BIJCWnIQyGJmc -mx7teiXOSRzF+LaFcS4nMZJz7muQ1R6832rGEgzg2NxjuCLeNk9shWENf7hl4Kjr -KlPgzvpn1TiBHBVg1hoiBiPWK56Mb3czOvihG3bh9r+Cjzfu6Pn020WKrcS23XQf -prtJwLAxwTeLcfHGRzDAF2H9gOnLMw== -=8hlj ------END PGP SIGNATURE----- diff --git a/dab643d2a647cfd037878b4fd6bd447457b8b568c3992f411350fc88977d4d88.asc b/dab643d2a647cfd037878b4fd6bd447457b8b568c3992f411350fc88977d4d88.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzsACgkQzcvSTdHQ -4AHiYwf/XD/F3/91uk0JT0OLyb3nORWcddkslloyG0a85qJaSPXd1RUZf5/dxYEV -kAVeDsZbf4FOgxoGyjMDTXoLEY+hS3jtgXk0yqdz8sNfcAwdQVHhKOG4nsbPGcOo -smlgbPqecMwGPHG1kcWie8m3+U5p3Et0GLw6jvXTNq1DBphlCU3x+HUJewZNtjig -NFkQLJ0DWohx+KzVO0ARu5Wobi6Hh2LbtqfyFdj5kY8QR4wBf0WdSnxEtHwAkoVp -ffmusNg7z9dtVnUYeaU+Fbt8bSAAy/IfGsjlVbyxH4V0hJ9ewIzpbzUTyUtPy2Ug -NsN3bqZFy6e7mbvmSLUEuM+LnlAx8w== -=qMHh +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AG1qQf9H7slJlzPtU5F8nrl42aWrJvoUnSuU/ZVhZXglUCBcoZWYTJduUP9n+jG ++9yKkVCYqDFqTitGuupRQ1Ih9m6a2Uxw6lhd/K5g96VTvv9EL/d83q+VAQBjawpT +1Eb7q8MhZfEAaSKHBmbncd3Qno1T6jaIfmX2TnS/XstzawVuc4Dez+hCnoHj3aBS +rjP/cI3ON7npmtkDHc873gnytqSjnXcUW2rkP/7qLglC+V30LiqLXIXjbSfNsNu7 +Dld3txfy4Jbh+8lJf7Nt4X9Zsig8vjsfzDmblbfJpWOpQXck9DuoLt+K6UX7Dree +ZXcwi/EJE2UJcUv3tGxnCIgvrgn4Kw== +=OgeR -----END PGP SIGNATURE----- diff --git a/drafts/3a308c92c4aeca24fe79270bbe7769df46ee37fd39864ceaa78de32ee18221a1 b/drafts/3a308c92c4aeca24fe79270bbe7769df46ee37fd39864ceaa78de32ee18221a1 @@ -1,103 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Self-sufficient swarm on qemu</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li class="active"><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/swarm-qemu.html" rel="bookmark" - title="Permalink to Self-sufficient swarm on qemu">Self-sufficient Swarm: Self-sufficient swarm on qemu</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-06-23T12:49:00+02:00"> - Wed 23 June 2021 - </time> -in <a class="category" href="../category/hygiene.html">hygiene</a> - <a href="../tag/swarm.html">swarm</a> - <a href="../tag/golang.html">golang</a> - <a href="../tag/qemu.html">qemu</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="entry-series meta"> -Part 1 from the series "Self-sufficient Swarm" - <ol class="entry-series-parts"> - </ol> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="section" id="base-debian-qemu-install"> -<h2>base debian qemu install</h2> -<div class="highlight"><pre><span></span>dd <span class="k">if</span><span class="o">=</span>/dev/zero <span class="nv">of</span><span class="o">=</span>debootstrap.bin <span class="nv">count</span><span class="o">=</span><span class="m">10485760</span> <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> -mkfs.ext4 debootstrap.bin -mount -o loop debootstrap.bin /mnt -debootstrap --arch<span class="o">=</span>amd64 buster /mnt -</pre></div> -<div class="highlight"><pre><span></span>qemu-system-x86_64 -cdrom /mnt/iso/debian-10.9.0-amd64-xfce-CD-1.iso -hda debian.bin -hdb clef.bin -m 4g --enable-kvm -virtfs local,path<span class="o">=</span>/mnt,id<span class="o">=</span>foo,readonly<span class="o">=</span>on,mount_tag<span class="o">=</span>bar,security_model<span class="o">=</span>passthrough -</pre></div> -<div class="highlight"><pre><span></span>mount -t 9p -o <span class="nv">trans</span><span class="o">=</span>virtio mount_tag /mnt/resource -oversion<span class="o">=</span>9p2000.L,posixacl,msize<span class="o">=</span><span class="m">104857600</span>,cache<span class="o">=</span>loose -</pre></div> -</div> -<div class="section" id="clef-swarm-provisions"> -<h2>clef/swarm provisions</h2> -</div> -<div class="section" id="ethereum-node-provisions"> -<h2>ethereum node provisions</h2> -</div> -<div class="section" id="xdai-requisites"> -<h2>xdai requisites</h2> -</div> -<div class="section" id="mainchain-requisites"> -<h2>mainchain requisites</h2> -</div> -<div class="section" id="orchestration"> -<h2>orchestration</h2> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/3a308c92c4aeca24fe79270bbe7769df46ee37fd39864ceaa78de32ee18221a1.asc b/drafts/3a308c92c4aeca24fe79270bbe7769df46ee37fd39864ceaa78de32ee18221a1.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AGuVwgApqngPYwX2srBDMahq6GRurJfoap49pp0oiaTW/70Y+2uhyYTFkKlEVmA -+DL3xuKdckKjpIV/xExUb2/xlROlyIFb1z6HfvwcGdmQLvqZSYZCV84dHnC7BkEv -+xfirSmhRW7EMERXdECS3Ziuj7QHZfH8LiyDbMs03QDzAxd9D3xX6PLfkAxVDPce -wUVKxFdLrPWCR9FJn6CbWGA0riqewcAAoU5NGq7gfdiK4lluZoglNZ4DPFelAhhN -1A3jpSR2THAkdBRACTZEf8T1STT3Pma0pgAtbkbBXu7zz3K7Cask0OiMWpozVR8G -CjwP6tADPHrbAzjDCdTabugfj+v1xw== -=gsHi ------END PGP SIGNATURE----- diff --git a/drafts/3c756e008d33eb94c704650e80b729e3a4850b1c57e4cc53e55b39de086c89f8 b/drafts/3c756e008d33eb94c704650e80b729e3a4850b1c57e4cc53e55b39de086c89f8 @@ -1,102 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Working with raw qemu partitions</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li class="active"><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/qemu-raw-partitions.html" rel="bookmark" - title="Permalink to Working with raw qemu partitions">Working with raw qemu partitions</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-01-02T12:09:55+01:00"> - Sun 02 January 2022 - </time> -in <a class="category" href="../category/offlining.html">offlining</a> - <a href="../tag/qemu.html">qemu</a> - <a href="../tag/fdisk.html">fdisk</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- code-block: bash - -$ fdisk -l raw.img -$ qemu-image resize raw.img +2G -$ fdisk -l raw.img -Disk raw.img: 4 GiB, 4294967296 bytes, 8388608 sectors -Units: sectors of 1 * 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0x79c2484b - -Device Boot Start End Sectors Size Id Type -raw.img1 * 2048 2193407 2191360 1G 83 Linux -raw.img2 2195454 4192255 1996802 975M 5 Extended -raw.img3 4192256 8388607 4196352 2G 83 Linux -raw.img5 2195456 4192255 1996800 975M 82 Linux swap / Solaris - -Partition table entries are not in disk order. -$ mke2fs -E offset=$(4192256*512) raw.img -$ sudo mount -o loop,offset=$(calc 2048*512),sizelimit=$(calc 2191360*512) /mnt/a -$ sudo mount -o loop,offset=$(calc 4192256*512) /mnt/b -$ sudo umount /mnt/b -$ losetup -f -P raw.img -$ lsblk -no NAME,UUID /dev/loop0 -loop0 -├─loop0p1 34b73576-e8c6-4ffb-a503-a9828639b5e9 -├─loop0p2 -├─loop0p3 ff6235cc-2f72-4551-a3d3-73d8df2e21b9 -└─loop0p5 0255cf3e-b10b-4522-8cfe-9ef8e2fc2d6a -$ echo "UUID=ff6235cc-2f72-4551-a3d3-73d8df2e21b9 /usr ext4 errors=remount-ro 0 2" >> /mnt/a/etc/fstab -$ sudo umount /mnt/a --> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/3c756e008d33eb94c704650e80b729e3a4850b1c57e4cc53e55b39de086c89f8.asc b/drafts/3c756e008d33eb94c704650e80b729e3a4850b1c57e4cc53e55b39de086c89f8.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AFh8wf+LLpNMBphzqWQLBBbnNOViFZmFCnOFBmqzsn9muizGblIBIAau6JVwhEX -vQdhbY2UTQluuSQJfYU85m8iwwMaHlJ8kZl3dx2rcuARRiC4/+vju2B2/TMTZ8xq -YU1MsaE8IfkpTICS7NrJ9SvNl3jX7P+CPHDUCveJ8J43xIgPkZeCyk/yXfBkGRGC -Jy/ZfqGdJkqM2QBcgKt7e9q8O4KIocJyaInOexmfuewlkhWEJVHkmpHsWsQLQhbZ -uA1dwWEYLUevRD8VoVTt8trETAbRf80L73E80vJk1jh/YPbXZLQcvYooDLnL/bo1 -qJ1x7j0OqddkbA/jyVcrFtmxq7+Ikw== -=Nmkn ------END PGP SIGNATURE----- diff --git a/drafts/4595f75a82f5b0a724be1410e99dff5cba3b18604bf0646987621a86515708e6 b/drafts/4595f75a82f5b0a724be1410e99dff5cba3b18604bf0646987621a86515708e6 @@ -1,95 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - The clique extra data secret</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/openethereum-clique-extradata.html" rel="bookmark" - title="Permalink to The clique extra data secret">The clique extra data secret</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-01-24T20:05:00+01:00"> - Mon 24 January 2022 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/rust.html">rust</a> - <a href="../tag/blockchain.html">blockchain</a> - <a href="../tag/openethereum.html">openethereum</a> - <a href="../tag/ethereum.html">ethereum</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- --> -<blockquote> -<p>extradata: 0x536172616675204b61726962752053616e6100000000000000000000000000005C5aB0D602EEF41f82B6fc087A24e61383589C398c6f7b75d90c3b32bdc9b4fcfbb4ad43c853446a2c0c9d3a9590a3349c8e45ce50446bd276cbb99c1f38132cd7e520d6be0ccba78acc59ab50a82f711ff7cb9d00</p> -<p>32 bytes vanity -20 bytes address -65 bytes signature</p> -</blockquote> -<div class="highlight"><pre><span></span><span class="n">ethcore</span><span class="o">/</span><span class="n">src</span><span class="o">/</span><span class="n">engines</span><span class="o">/</span><span class="n">clique</span><span class="o">/</span><span class="k">mod</span><span class="p">.</span><span class="n">rs</span><span class="w"></span> - -<span class="c1">// Protocol constants</span> -<span class="sd">/// Fixed number of extra-data prefix bytes reserved for signer vanity</span> -<span class="k">pub</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">VANITY_LENGTH</span>: <span class="kt">usize</span> <span class="o">=</span><span class="w"> </span><span class="mi">32</span><span class="p">;</span><span class="w"></span> -<span class="sd">/// Fixed number of extra-data suffix bytes reserved for signer signature</span> -<span class="k">pub</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">SIGNATURE_LENGTH</span>: <span class="kt">usize</span> <span class="o">=</span><span class="w"> </span><span class="mi">65</span><span class="p">;</span><span class="w"></span> -</pre></div> -<div class="highlight"><pre><span></span><span class="n">ethcore</span><span class="o">/</span><span class="n">src</span><span class="o">/</span><span class="n">engines</span><span class="o">/</span><span class="n">clique</span><span class="o">/</span><span class="n">util</span><span class="p">.</span><span class="n">rs</span><span class="w"></span> - -<span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">extract_signers</span><span class="p">(</span><span class="n">header</span>: <span class="kp">&</span><span class="nc">Header</span><span class="p">)</span><span class="w"> </span>-> <span class="nb">Result</span><span class="o"><</span><span class="n">BTreeSet</span><span class="o"><</span><span class="n">Address</span><span class="o">></span><span class="p">,</span><span class="w"> </span><span class="n">Error</span><span class="o">></span><span class="w"> </span><span class="p">{</span><span class="w"></span> - -<span class="n">ie</span><span class="w"> </span><span class="n">data</span><span class="p">.</span><span class="n">len</span><span class="p">()</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="n">VANITY_LENGTH</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">SIGNATURE_LENGTH</span><span class="w"> </span><span class="p">{</span><span class="w"></span> -<span class="sd">/// Nonce value for DROP vote | Err(EngineError::CliqueCheckpointNoSigner)?</span> -<span class="k">pub</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">NONCE_DROP_VOTE</span>: <span class="nc">H64</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">H64</span><span class="p">([</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="mi">8</span><span class="p">]);</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">}</span><span class="w"></span> -</pre></div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/4595f75a82f5b0a724be1410e99dff5cba3b18604bf0646987621a86515708e6.asc b/drafts/4595f75a82f5b0a724be1410e99dff5cba3b18604bf0646987621a86515708e6.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AGH2Qf/eJ39z70Z5u73du8SgulgvSpzAFAyv4jtAerRbe7+okiszsQGvoA9F4kx -xO43RRObxOD/kzFPR0hKyhGQEj4v9OAkdkbhiVOX6nhleZwA2aQfCh9BUMvKXJHE -p7P5xXU3hWkjLqHxHK6SjGybZG0WROsL0bxkCpKdEPNGivnoxxKp4el7+YDlJmiP -6kn2mCJKDcjQyZ2aa7pAYPlgPMwKyqOvdsn3aZjktCgOp2TW5igOeh/sSsOJUu7n -WFj8vIhFlN/00JTln35xRjPuxIdpjwSGHrCWXqtXC3V9kA0P53kKwaR30H6YKPDU -Io8nVR5St9FTTAGujSo4lELJnlk70g== -=7A// ------END PGP SIGNATURE----- diff --git a/drafts/5fe95895cc160a284b36ad5c34c8536b2dc2130938305333a52b3d5e03d788a1 b/drafts/5fe95895cc160a284b36ad5c34c8536b2dc2130938305333a52b3d5e03d788a1 @@ -1,77 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Isolating qemu networking from host</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li class="active"><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/qemu-host-fw.html" rel="bookmark" - title="Permalink to Isolating qemu networking from host">Isolating qemu networking from host</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-01-02T13:17:55+01:00"> - Sun 02 January 2022 - </time> -in <a class="category" href="../category/offlining.html">offlining</a> - <a href="../tag/qemu.html">qemu</a> - <a href="../tag/network.html">network</a> - <a href="../tag/iptables.html">iptables</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- code-block: bash - -iptables -N QEMU -iptables -A OUTPUT -o lo -m owner - -gid-owner 1009 -j QEMU -iptables -A QEMU -d 127.0.0.1/32 -j LOG -iptables -A QEMU -d 127.0.0.1/32 -j DROP --> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/5fe95895cc160a284b36ad5c34c8536b2dc2130938305333a52b3d5e03d788a1.asc b/drafts/5fe95895cc160a284b36ad5c34c8536b2dc2130938305333a52b3d5e03d788a1.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AEw8gf/YQrKAmtI05Zrcmxh79Vs1ptMaCTQ9f4mneTvRLn7K/oAOI7tDoN21aiR -tZgDV7ePl7Ngm9+JsfjC81SGj3FWxBbL5KHA0lvCSHP/0FqhVCm39RLasyQkFayF -FHrU061KL/jJzlUOMIh4FxIhlmzkg/c/Q18rSnuvbhs7Sz+DWLcRwg4YDIQvoJuh -Sr/L6QPAQmNpepYr9hq1Dy5t7g2AuRzb0Y3u6aDmOYuHx24JCZ8glm0Cy8eNe58a -L5dKKQmLFwtcsOp23SNPVip8LARmqz8M9W3hyIJuSSOB2twJUt5lKkdMYusK5FGD -YNqM6BAaTk1pvxqNPIL7ueOtlQojvw== -=R2Vh ------END PGP SIGNATURE----- diff --git a/drafts/71324ed671b174ad627270e4397da302430b4aad77b1b0479e2bc251808336a7 b/drafts/71324ed671b174ad627270e4397da302430b4aad77b1b0479e2bc251808336a7 @@ -1,131 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Local npm bundles</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li class="active"><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/docker-offline-5-npm-bundle.html" rel="bookmark" - title="Permalink to Local npm bundles">Offline Docker: Local npm bundles</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-10-22T15:26:00+02:00"> - Fri 22 October 2021 - </time> -in <a class="category" href="../category/offlining.html">offlining</a> - <a href="../tag/docker.html">docker</a> - <a href="../tag/npm.html">npm</a> - <a href="../tag/nodejs.html">nodejs</a> - <a href="../tag/javascript.html">javascript</a> - <a href="../tag/devops.html">devops</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="entry-series meta"> -Part 5 from the series "Offline Docker" - <ol class="entry-series-parts"> - <li>| <a href="docker-offline-1-routing.html" title="The routing to freedom ">Part 1</a></li> - <li>| <a href="docker-offline-2-python.html" title="Local python repository ">Part 2</a></li> - <li>| <a href="docker-offline-3-npm.html" title="Local npm repository ">Part 3</a></li> - </ol> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="highlight"><pre><span></span><span class="go"><Directory "/srv/http/npm"></span> -<span class="go"> DirectoryIndex package.json</span> -<span class="go"> RewriteEngine on</span> -<span class="go"> RewriteRule "^(.+)-\/(.+)$" "/npm/$1$2" [R=301]</span> -<span class="go"></Directory></span> -</pre></div> -<pre class="code python literal-block"> -<span class="kn">import</span> <span class="nn">json</span> -<span class="kn">import</span> <span class="nn">os</span> -<span class="kn">import</span> <span class="nn">urllib.request</span> -<span class="kn">import</span> <span class="nn">urllib.parse</span> -<span class="kn">import</span> <span class="nn">logging</span> - -<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">)</span> -<span class="n">logg</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">()</span> - - -<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'package-lock.json'</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> -<span class="n">j</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> -<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> - -<span class="n">script_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="vm">__file__</span><span class="p">))</span> -<span class="n">output_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">script_dir</span><span class="p">,</span> <span class="s1">'_out'</span><span class="p">)</span> - -<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">j</span><span class="p">[</span><span class="s1">'packages'</span><span class="p">]:</span> - <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="s1">''</span><span class="p">:</span> - <span class="k">continue</span> - <span class="n">url</span> <span class="o">=</span> <span class="n">j</span><span class="p">[</span><span class="s1">'packages'</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="s1">'resolved'</span><span class="p">]</span> - <span class="n">parts</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span> - <span class="n">output_path_package</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">output_dir</span><span class="p">,</span> <span class="n">parts</span><span class="o">.</span><span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span> - <span class="k">try</span><span class="p">:</span> - <span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">)</span> - <span class="n">logg</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'skipping existing </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">))</span> - <span class="k">continue</span> - <span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span> - <span class="k">pass</span> - <span class="n">output_dir_package</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">)</span> - <span class="c1">#print(output_path_package)</span> - <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">output_dir_package</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> - - <span class="n">rq</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span> - <span class="n">c</span> <span class="o">=</span> <span class="n">rq</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> - <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">,</span> <span class="s1">'wb'</span><span class="p">)</span> - <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> - <span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> - <span class="n">logg</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'wrote </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">))</span> -</pre> -<pre class="code bash literal-block"> -find _out -type f -name <span class="s2">"*gz"</span> -exec rename -v <span class="s2">"/-"</span> <span class="s2">""</span> <span class="o">{}</span> <span class="se">\;</span> -</pre> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/71324ed671b174ad627270e4397da302430b4aad77b1b0479e2bc251808336a7.asc b/drafts/71324ed671b174ad627270e4397da302430b4aad77b1b0479e2bc251808336a7.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AGzcAf/cnIlaOoCYtdJJ8Bdp1FcGJ29PLzFwkpJKAPW40hN8jWAYExlBNswe1cW -Feh5nYVoVqdjTVLKLnndJqcuNOKGbIfmJk+1Zx/5P6JwgYxq1FeqKJ73xD/5OFwz -ds1GvUGRqaWZNyvP39YguONfClVZHiOUlOZDyoAtpSpKw2eHNzID0AZpvl7QlwMb -gydWzyBYykexGY/zwAgNQrVS0vKKR1eSk/DQY7s7gp7DoUqAWjyx5ORWVCU7EIiv -DgpAUuxSpw47zqm8zYl/PY3D+fQ+ayoKj8lXYiadDJh3EMJmt5nV7k+w9xVHJbqs -Balq/q7yWLymBwH+3J/hmJrrRsFzag== -=80Zm ------END PGP SIGNATURE----- diff --git a/drafts/9c19cf6e859d24826ea226adc1957b0366371f742f6c57f366dae84bd7358872 b/drafts/9c19cf6e859d24826ea226adc1957b0366371f742f6c57f366dae84bd7358872 @@ -1,87 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Documenting Celery task chains</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/celery-document-graph.html" rel="bookmark" - title="Permalink to Documenting Celery task chains">Documenting Celery task chains</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-04-25T15:00:00+02:00"> - Sun 25 April 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/python.html">python</a> - <a href="../tag/microservices.html">microservices</a> - <a href="../tag/celery.html">celery</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="highlight"><pre><span></span><span class="n">current_app</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> -<span class="s1">'broker_url'</span><span class="p">:</span> <span class="n">broker</span><span class="p">,</span> -<span class="p">})</span> - -<span class="n">result</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'CELERY_RESULT_URL'</span><span class="p">)</span> -<span class="k">if</span> <span class="n">result</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'file'</span><span class="p">:</span> - <span class="n">rq</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkdtemp</span><span class="p">()</span> - <span class="n">current_app</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> - <span class="s1">'result_backend'</span><span class="p">:</span> <span class="s1">'file://</span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">rq</span><span class="p">),</span> - <span class="p">})</span> - <span class="n">logg</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">'celery backend store dir </span><span class="si">{}</span><span class="s1"> created, will NOT be deleted on shutdown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">rq</span><span class="p">))</span> -<span class="k">else</span><span class="p">:</span> - <span class="n">current_app</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> - <span class="s1">'result_backend'</span><span class="p">:</span> <span class="n">result</span><span class="p">,</span> - <span class="p">})</span> -</pre></div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/9c19cf6e859d24826ea226adc1957b0366371f742f6c57f366dae84bd7358872.asc b/drafts/9c19cf6e859d24826ea226adc1957b0366371f742f6c57f366dae84bd7358872.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AFaZggAhMCia83yFSoU9pzLJvVBnQ2jBM3A/s7RNgYRGjW5luR5Wp3rMnIwH9IN -mGcgG3/2YDe9jyqeCbNTPkizzDJ61U1+tDJ9h3Fvl+nW2cGMDOfl8dm67irr82rD -AS/9i5HfAAjNCEHHIFD6YbNbKuPcyp+rBE9bP+LeVjXkaJVx7zdTxbtbln79mN/d -tuOiOQYW2xxkfSbX2Ty7MMlXAJcqMwPWXO2mBzfkAQGK/U9FDcVryFHjtd2T9DHh -YamI9aOSOSq5OVUvCKXlB1xoypaG2NvThFq3XxNlglXrcyOreCaPa83i2Q8E1oIF -67dNJ2CONeO5bDZF1KiM2Di+KqfhRQ== -=EZRB ------END PGP SIGNATURE----- diff --git a/drafts/a357fc904e0f2566fd27b66d233ed0d2f8a343d993fd77de51f64eeb95896b03 b/drafts/a357fc904e0f2566fd27b66d233ed0d2f8a343d993fd77de51f64eeb95896b03 @@ -1,102 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Using Docker with VPN</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li class="active"><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/docker-vpn.html" rel="bookmark" - title="Permalink to Using Docker with VPN">Using Docker with VPN</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-04-21T06:53:00+02:00"> - Wed 21 April 2021 - </time> -in <a class="category" href="../category/hygiene.html">hygiene</a> - <a href="../tag/vpn.html">vpn</a> - <a href="../tag/openvpn.html">openvpn</a> - <a href="../tag/iproute.html">iproute</a> - <a href="../tag/docker.html">docker</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <p>Need to route through the tun interface, which Docker doesn't seem to automatically do.</p> -<div class="highlight"><pre><span></span>$ ip route ls -<span class="o">[</span>...<span class="o">]</span> -<span class="m">10</span>.7.3.0/24 dev tun0 proto kernel scope link src <span class="m">10</span>.7.3.6 -</pre></div> -<pre class="literal-block"> -ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network -</pre> -<p>The simplest solution I have found is to exchange the gateway redirect from the OpenVPN server <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a> and add the VPN interface as the default route.</p> -<pre class="code bash literal-block"> -<span class="ch">#!/bin/sh -</span> -<span class="nv">default_route_vpn_gateway</span><span class="o">=</span><span class="sb">`</span>ip route <span class="p">|</span> awk <span class="s1">'{if ($1 ~ /^0.0.0.0\/1$/) { print $3; }}'</span><span class="sb">`</span> -<span class="nv">route_vpn_gateway</span><span class="o">=</span><span class="si">${</span><span class="nv">VPN_GATEWAY</span><span class="k">:-</span><span class="nv">$default_route_vpn_gateway</span><span class="si">}</span> -<span class="nb">echo</span> <span class="s2">"Adding default route to </span><span class="nv">$route_vpn_gateway</span><span class="s2"> with /0 mask..."</span> -ip route add default via <span class="nv">$route_vpn_gateway</span> - -<span class="nb">echo</span> <span class="s2">"Removing /1 routes..."</span> -ip route del <span class="m">0</span>.0.0.0/1 via <span class="nv">$route_vpn_gateway</span> -ip route del <span class="m">128</span>.0.0.0/1 via <span class="nv">$route_vpn_gateway</span> -</pre> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td><a class="reference external" href="https://stackoverflow.com/a/62333327">https://stackoverflow.com/a/62333327</a></td></tr> -</tbody> -</table> -</blockquote> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/a357fc904e0f2566fd27b66d233ed0d2f8a343d993fd77de51f64eeb95896b03.asc b/drafts/a357fc904e0f2566fd27b66d233ed0d2f8a343d993fd77de51f64eeb95896b03.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AHHTQf/SfGtfecooBksbMYt+IwyqxpmzrZXUPhT/JMG/yWa/I080LmErYFZVNJO -gjUBje7OP2hwG10VVoDVTsCczdv/qUNivlzTlMIqgyVwRY8F1NqxsTIH3z188PXn -c0HlDSEASOQMuNP36Lgp9rgdCQhIBRaORpvt8xwonNcshEfl1P/7Z9pT3pXi0zf0 -0o77OMnaxKUDw30Lj5RkwekDfQ+xg66+JRq9MDwZDZOHcWhr8R50XA+TWQako4Pg -1PotUeLtvhSKJK88lxJTJsm5Ux5PjYKao9TFK1DiAzhPmyEtm6hUK5gveN9tVENh -9LpUYMoTk1UlLEL6JF0cd5lX/2NU4A== -=/s8w ------END PGP SIGNATURE----- diff --git a/drafts/a567d8d38afd23aa934573a7efe197dbca3584dbe519df7c086d7997845d100a b/drafts/a567d8d38afd23aa934573a7efe197dbca3584dbe519df7c086d7997845d100a @@ -1,82 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Debian repository</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li class="active"><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/docker-offline-4-debian.html" rel="bookmark" - title="Permalink to Debian repository">Offline Docker: Debian repository</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-06-23T13:14:00+02:00"> - Wed 23 June 2021 - </time> -in <a class="category" href="../category/offlining.html">offlining</a> - <a href="../tag/docker.html">docker</a> - <a href="../tag/networking.html">networking</a> - <a href="../tag/debian.html">debian</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="entry-series meta"> -Part 4 from the series "Offline Docker" - <ol class="entry-series-parts"> - <li>| <a href="docker-offline-1-routing.html" title="The routing to freedom ">Part 1</a></li> - <li>| <a href="docker-offline-2-python.html" title="Local python repository ">Part 2</a></li> - <li>| <a href="docker-offline-3-npm.html" title="Local npm repository ">Part 3</a></li> - </ol> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- --> -<blockquote> -</blockquote> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/a567d8d38afd23aa934573a7efe197dbca3584dbe519df7c086d7997845d100a.asc b/drafts/a567d8d38afd23aa934573a7efe197dbca3584dbe519df7c086d7997845d100a.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AFZJAf/YOosaMkPFB/Pd5Vfnpg92RiKib2U3hgtDbD5DnBvZ6QjdBwFpcOEWsTb -J/56P1RSH+/vb+0mm3bHO+yPfJZOyq8o0owO0J96y0eQYK7XOfnnbAta0j18pVy2 -BEpdTmrdFe9v5yFgL6bHFn7Z6H4FbC2o6uwhPjPxaynQJhFUt+PR65qGrDuOhxO7 -FXt4KFBC/HaSfxsjgQFWkLz0D4ZEBue976By1P8xdTKtGO+EL8uyAnlWashz59jI -pqRaiWC/6KkGIsZ5XtOw3SAkC/cGLAItMXkgljAfK/6s16yYPZkOdGySzxYRfNH7 -e5oN2jwm88SeDlbJwJsY7/nMGlbWOw== -=+SWE ------END PGP SIGNATURE----- diff --git a/drafts/b67179d704106cc1eecc6089b2a433ed481ec6d543d9f9e5f802c83a1b9367c3 b/drafts/b67179d704106cc1eecc6089b2a433ed481ec6d543d9f9e5f802c83a1b9367c3 @@ -1,313 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - In search of a slim KECCAK dependency</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/keccak-benchmarks.html" rel="bookmark" - title="Permalink to In search of a slim KECCAK dependency">In search of a slim KECCAK dependency</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-04-18T15:01:00+02:00"> - Sun 18 April 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/crypto.html">crypto</a> - <a href="../tag/hash.html">hash</a> - <a href="../tag/keccak.html">keccak</a> - <a href="../tag/sha3.html">sha3</a> - <a href="../tag/python.html">python</a> - <a href="../tag/c.html">c</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="section" id="implementations"> -<h2>Implementations</h2> -<div class="section" id="xkcp"> -<h3>XKCP</h3> -<ul class="simple"> -<li>Site: <a class="reference external" href="https://keccak.team/keccak_specs_summary.html">https://keccak.team/keccak_specs_summary.html</a></li> -<li>Code: <a class="reference external" href="https://github.com/xkcp/xkcp">https://github.com/xkcp/xkcp</a></li> -<li>Git hash: c438ee7b2736726f629da11b7012cffcf6b84fef</li> -</ul> -<pre class="code c literal-block"> -<span class="ln">0 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><XKCP/KeccakHash.h></span><span class="cp"> -</span><span class="ln">1 </span><span class="cp"></span><span class="w"> -</span><span class="ln">2 </span><span class="w"></span><span class="kt">int</span><span class="w"> </span><span class="nf">wrap_keccak</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">bitlen</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">zout</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">3 </span><span class="w"> </span><span class="n">Keccak_HashInstance</span><span class="w"> </span><span class="n">instance</span><span class="p">;</span><span class="w"> -</span><span class="ln">4 </span><span class="w"> </span><span class="n">Keccak_HashInitialize</span><span class="p">(</span><span class="o">&</span><span class="n">instance</span><span class="p">,</span><span class="w"> </span><span class="mi">1088</span><span class="p">,</span><span class="w"> </span><span class="mi">512</span><span class="p">,</span><span class="w"> </span><span class="mi">256</span><span class="p">,</span><span class="w"> </span><span class="mh">0x01</span><span class="p">);</span><span class="w"> -</span><span class="ln">5 </span><span class="w"> </span><span class="n">Keccak_HashUpdate</span><span class="p">(</span><span class="o">&</span><span class="n">instance</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">bitlen</span><span class="p">);</span><span class="w"> -</span><span class="ln">6 </span><span class="w"> </span><span class="n">Keccak_HashFinal</span><span class="p">(</span><span class="o">&</span><span class="n">instance</span><span class="p">,</span><span class="w"> </span><span class="n">zout</span><span class="p">);</span><span class="w"> -</span><span class="ln">7 </span><span class="w"></span><span class="p">}</span> -</pre> -<pre class="code c literal-block"> -<span class="ln"> 0 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><string.h></span><span class="cp"> -</span><span class="ln"> 1 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span><span class="cp"> -</span><span class="ln"> 2 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdlib.h></span><span class="cp"> -</span><span class="ln"> 3 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><time.h></span><span class="cp"> -</span><span class="ln"> 4 </span><span class="cp"></span><span class="w"> -</span><span class="ln"> 5 </span><span class="w"></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><XKCP/KeccakHash.h></span><span class="cp"> -</span><span class="ln"> 6 </span><span class="cp"></span><span class="w"> -</span><span class="ln"> 7 </span><span class="w"></span><span class="cp">#ifndef ROUNDS -</span><span class="ln"> 8 </span><span class="cp">#define ROUNDS 100000 -</span><span class="ln"> 9 </span><span class="cp">#endif -</span><span class="ln">10 </span><span class="cp"></span><span class="w"> -</span><span class="ln">11 </span><span class="w"></span><span class="k">extern</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">wrap_keccak</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">zout</span><span class="p">);</span><span class="w"> -</span><span class="ln">12 </span><span class="w"> -</span><span class="ln">13 </span><span class="w"></span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">14 </span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rounds</span><span class="p">;</span><span class="w"> -</span><span class="ln">15 </span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">delta_sec</span><span class="p">;</span><span class="w"> -</span><span class="ln">16 </span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">delta_nsec</span><span class="p">;</span><span class="w"> -</span><span class="ln">17 </span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">timespec</span><span class="w"> </span><span class="n">start</span><span class="p">;</span><span class="w"> -</span><span class="ln">18 </span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">timespec</span><span class="w"> </span><span class="n">end</span><span class="p">;</span><span class="w"> -</span><span class="ln">19 </span><span class="w"> -</span><span class="ln">20 </span><span class="w"> </span><span class="n">Keccak_HashInstance</span><span class="w"> </span><span class="n">instance</span><span class="p">;</span><span class="w"> -</span><span class="ln">21 </span><span class="w"> -</span><span class="ln">22 </span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span><span class="w"> -</span><span class="ln">23 </span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="sc">'f'</span><span class="p">,</span><span class="w"> </span><span class="sc">'o'</span><span class="p">,</span><span class="w"> </span><span class="sc">'o'</span><span class="p">};</span><span class="w"> -</span><span class="ln">24 </span><span class="w"> -</span><span class="ln">25 </span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span><span class="w"> -</span><span class="ln">26 </span><span class="w"> </span><span class="n">memset</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">256</span><span class="p">);</span><span class="w"> -</span><span class="ln">27 </span><span class="w"> -</span><span class="ln">28 </span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">10000</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">29 </span><span class="w"> </span><span class="n">wrap_keccak</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">);</span><span class="w"> -</span><span class="ln">30 </span><span class="w"> </span><span class="p">}</span><span class="w"> -</span><span class="ln">31 </span><span class="w"> -</span><span class="ln">32 </span><span class="w"> </span><span class="n">clock_gettime</span><span class="p">(</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">start</span><span class="p">);</span><span class="w"> -</span><span class="ln">33 </span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">ROUNDS</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">34 </span><span class="w"> </span><span class="n">wrap_keccak</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">);</span><span class="w"> -</span><span class="ln">35 </span><span class="w"> </span><span class="p">}</span><span class="w"> -</span><span class="ln">36 </span><span class="w"> </span><span class="n">clock_gettime</span><span class="p">(</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">end</span><span class="p">);</span><span class="w"> -</span><span class="ln">37 </span><span class="w"> -</span><span class="ln">38 </span><span class="w"> </span><span class="n">delta_sec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">end</span><span class="p">.</span><span class="n">tv_sec</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start</span><span class="p">.</span><span class="n">tv_sec</span><span class="p">;</span><span class="w"> -</span><span class="ln">39 </span><span class="w"> </span><span class="n">delta_nsec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">end</span><span class="p">.</span><span class="n">tv_nsec</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start</span><span class="p">.</span><span class="n">tv_nsec</span><span class="p">;</span><span class="w"> -</span><span class="ln">40 </span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">delta_nsec</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">41 </span><span class="w"> </span><span class="n">delta_sec</span><span class="o">++</span><span class="p">;</span><span class="w"> -</span><span class="ln">42 </span><span class="w"> </span><span class="n">delta_nsec</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mf">1000000000L</span><span class="p">;</span><span class="w"> -</span><span class="ln">43 </span><span class="w"> </span><span class="p">}</span><span class="w"> -</span><span class="ln">44 </span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"%u.%09u</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">delta_sec</span><span class="p">,</span><span class="w"> </span><span class="n">delta_nsec</span><span class="p">);</span><span class="w"> -</span><span class="ln">45 </span><span class="w"> -</span><span class="ln">46 </span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">32</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">47 </span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"%02x"</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span><span class="w"> -</span><span class="ln">48 </span><span class="w"> </span><span class="p">}</span><span class="w"> -</span><span class="ln">49 </span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> -</span><span class="ln">50 </span><span class="w"></span><span class="p">}</span> -</pre> -</div> -<div class="section" id="keccak-tiny"> -<h3>keccak_tiny</h3> -<ul class="simple"> -<li>Code: <a class="reference external" href="https://github.com/coruus/keccak-tiny">https://github.com/coruus/keccak-tiny</a></li> -<li>Git hash: 64b6647514212b76ae7bca0dea9b7b197d1d8186</li> -</ul> -<p>Needed to export <cite>hash</cite> function symbol, and add to header file.</p> -</div> -<div class="section" id="tiny-sha3"> -<h3>tiny_sha3</h3> -<ul class="simple"> -<li>Code <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a>: <a class="reference external" href="https://github.com/mjosaarinen/tiny_sha3">https://github.com/mjosaarinen/tiny_sha3</a></li> -<li>Git hash: dcbb3192047c2a721f5f851db591871d428036a9</li> -</ul> -<p>Had to change "padding" value in <tt class="docutils literal">sha3.c</tt></p> -<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">142</span></pre></div></td><td class="code"><div><pre><span></span><span class="w"> </span><span class="n">c</span><span class="o">-></span><span class="n">st</span><span class="p">.</span><span class="n">b</span><span class="p">[</span><span class="n">c</span><span class="o">-></span><span class="n">pt</span><span class="p">]</span><span class="w"> </span><span class="o">^=</span><span class="w"> </span><span class="mh">0x01</span><span class="p">;</span><span class="w"></span> -</pre></div></td></tr></table></div> -<div class="highlight"><pre><span></span><span class="n">sha3</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="mi">32</span><span class="p">);</span><span class="w"></span> -</pre></div> -</div> -<div class="section" id="libkeccak"> -<h3>libkeccak</h3> -<ul class="simple"> -<li>Code: <a class="reference external" href="https://github.com/maandree/libkeccak">https://github.com/maandree/libkeccak</a></li> -<li>Git hash: 718b1a6ea1c44bcf15e55d3c265310e1cd9211fa</li> -</ul> -<div class="highlight"><pre><span></span>libkeccak_state_initialise(&state, &spec); -libkeccak_fast_update(&state, msg, 3); -libkeccak_fast_digest(&state, NULL, 0, 0, NULL, buf); -</pre></div> -</div> -</div> -<div class="section" id="results"> -<h2>Results</h2> -<ul class="simple"> -<li>Input: "foo"</li> -<li>Rounds: 100000</li> -</ul> -<!-- :XKCP generic64: - - Time: 0.041101298 - - Executable size: 37768 - - Archive size: 358558 --> -<!-- :keccak-tiny: - - Time: 0.046095483 - - Executable size: 49400 - - Object size: 35544 --> -<!-- :tiny_sha3 [1]_: - - Time: 0.080156921 - - Executable size: 16577 - - Object size: 6712 --> -<!-- :libkeccak: - - Time: 0.200222898 - - Executable size: 50152 - - Archive size: 78680 --> -<table border="1" class="docutils"> -<colgroup> -<col width="32%" /> -<col width="34%" /> -<col width="34%" /> -</colgroup> -<thead valign="bottom"> -<tr><th class="head">Implementation</th> -<th class="head">Execution time</th> -<th class="head">Executable size</th> -</tr> -</thead> -<tbody valign="top"> -<tr><td>XKCP</td> -<td><strong>0.041101298</strong></td> -<td>37768</td> -</tr> -<tr><td>keccak-tiny</td> -<td>0.046095483</td> -<td>49400</td> -</tr> -<tr><td>tiny_sha3</td> -<td>0.080156921</td> -<td><strong>16577</strong></td> -</tr> -<tr><td>libkeccak</td> -<td>0.200222898</td> -<td>50152</td> -</tr> -</tbody> -</table> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td>Author claims it is not suited for production</td></tr> -</tbody> -</table> -</blockquote> -</div> -<div class="section" id="python"> -<h2>Python</h2> -<p>XKCP has a pure-python implementation, but it's hopelessly slow.</p> -<p>Added to <tt class="docutils literal">CompactFIPS202.py</tt>:</p> -<div class="highlight"><pre><span></span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</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">10</span><span class="p">):</span> - <span class="n">a</span> <span class="o">=</span> <span class="n">Keccak</span><span class="p">(</span><span class="mi">1088</span><span class="p">,</span> <span class="mi">512</span><span class="p">,</span> <span class="sa">b</span><span class="s1">'foo'</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mi">32</span><span class="p">)</span> - - <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">):</span> - <span class="n">a</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**</span><span class="n">j</span> - <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock_gettime_ns</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</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="n">a</span><span class="p">):</span> - <span class="n">b</span> <span class="o">=</span> <span class="n">Keccak</span><span class="p">(</span><span class="mi">1088</span><span class="p">,</span> <span class="mi">512</span><span class="p">,</span> <span class="sa">b</span><span class="s1">'foo'</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mi">32</span><span class="p">)</span> - <span class="n">end_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock_gettime_ns</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">)</span> - <span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">end_time</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="mi">10</span><span class="o">**</span><span class="mi">9</span><span class="p">))</span> -</pre></div> -<pre class="literal-block"> -$ python CompactFIPS202.py -10 0.007536721 -100 0.066636149 -1000 0.64519725 -</pre> -<div class="section" id="wrapping-keccak-tiny"> -<h3>Wrapping keccak_tiny</h3> -<p>Implementing <tt class="docutils literal">XKCP</tt> in Python means creating two classes for the state and sponge structs. <tt class="docutils literal">keccak_tiny</tt> is much simpler because it is merely a function call with a couple of char buffers. But with ctypes ends up being very slow, too. <a class="footnote-reference" href="#footnote-2" id="footnote-reference-2">[2]</a></p> -<pre class="code python literal-block"> -<span class="ln"> 0 </span><span class="kn">import</span> <span class="nn">ctypes</span> -<span class="ln"> 1 </span><span class="kn">import</span> <span class="nn">sys</span> -<span class="ln"> 2 </span><span class="kn">import</span> <span class="nn">time</span> -<span class="ln"> 3 </span> -<span class="ln"> 4 </span><span class="n">libkeccak</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">CDLL</span><span class="p">(</span><span class="s1">'libkeccaktiny.so'</span><span class="p">)</span> -<span class="ln"> 5 </span> -<span class="ln"> 6 </span><span class="n">buf</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">pointer</span><span class="p">((</span><span class="n">ctypes</span><span class="o">.</span><span class="n">c_char</span> <span class="o">*</span> <span class="mi">256</span><span class="p">)())</span> -<span class="ln"> 7 </span><span class="n">data</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_string_buffer</span><span class="p">(</span><span class="sa">b</span><span class="s1">'foo'</span><span class="p">)</span> -<span class="ln"> 8 </span> -<span class="ln"> 9 </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">10000</span><span class="p">):</span> -<span class="ln">10 </span> <span class="n">libkeccak</span><span class="o">.</span><span class="n">hash</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">200</span><span class="o">-</span><span class="mi">64</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> -<span class="ln">11 </span> -<span class="ln">12 </span><span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock_gettime_ns</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">)</span> -<span class="ln">13 </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">100000</span><span class="p">):</span> -<span class="ln">14 </span> <span class="n">libkeccak</span><span class="o">.</span><span class="n">hash</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">200</span><span class="o">-</span><span class="mi">64</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> -<span class="ln">15 </span><span class="n">end_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock_gettime_ns</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">)</span> -<span class="ln">16 </span> -<span class="ln">17 </span><span class="nb">print</span><span class="p">((</span><span class="n">end_time</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="mi">10</span><span class="o">**</span><span class="mi">9</span><span class="p">))</span> -<span class="ln">18 </span><span class="nb">print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">contents</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">hex</span><span class="p">())</span> -</pre> -<pre class="literal-block"> -$ gcc -L. -D"memset_s(W,WL,V,OL)=memset(W,V,OL)" -shared keccak-tiny.c -o libkeccaktiny.so -$ LD_LIBRARY_PATH=. python wrap.py -0.95114457 -41b1a0649752af1b28b3dc29a1556eee781e4a4c3a1f7f53f90fa834de098c4d -</pre> -<p>Compare with <tt class="docutils literal">pysha3</tt>:</p> -<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sha3</span> -<span class="n">h</span> <span class="o">=</span> <span class="n">sha3</span><span class="o">.</span><span class="n">keccak_256</span><span class="p">()</span> -<span class="n">h</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="sa">b</span><span class="s1">'foo'</span><span class="p">)</span> -<span class="n">b</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">digest</span><span class="p">()</span> -</pre></div> -<pre class="literal-block"> -0.162829927 -</pre> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-2" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-2">[2]</a></td><td>for some reason when on battery; 1.74030088</td></tr> -</tbody> -</table> -</blockquote> -</div> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/b67179d704106cc1eecc6089b2a433ed481ec6d543d9f9e5f802c83a1b9367c3.asc b/drafts/b67179d704106cc1eecc6089b2a433ed481ec6d543d9f9e5f802c83a1b9367c3.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AEt2gf+JFBSLT5UACVWsggxegSQG4+foS0EIVbPnpyDo6KctfrkAscTLms4xQkC -eP0MSFpFfXjM6d5z+54bIsATga5f5qGaufSkJRPySe6TUadOVV0G0Ke3zwrf1zWw -xOZt+YQg8PeEwvtnzWpy4OAwMejafngDWuSGEVTFE+A9PvrN7pH9Iu7c0QMXNlfM -MKpGPtuUH4LoYENx2bh8tLCExIwKWwPptyPblrJfQcH5AYvtcW/02WNpPMCNujXM -UBDvd1hEApwPTjEfFIS4BbHaPKjwGCy+BwQ6ZZlhvGTRF50WbFOdx2fQosmkEsBO -f5b5w0TkZoYSie55WpUEvaJvNX26wA== -=ufLd ------END PGP SIGNATURE----- diff --git a/drafts/bb7f404e49154a8317c793c21e6de6ae39cc147e039f9f0ff11d15bb15ae441c b/drafts/bb7f404e49154a8317c793c21e6de6ae39cc147e039f9f0ff11d15bb15ae441c @@ -1,76 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Virtualenv with different pythons</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/python-virtualenv-interpreter.html" rel="bookmark" - title="Permalink to Virtualenv with different pythons">Virtualenv with different pythons</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-10-17T15:45:00+02:00"> - Sun 17 October 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/docker.html">docker</a> - <a href="../tag/networking.html">networking</a> - <a href="../tag/iptables.html">iptables</a> - <a href="../tag/iproute.html">iproute</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- (.venv) cic-ussd $ export CPPFLAGS="-I/home/lash/src/ext/python/Python-3.8.6/Include -I/home/lash/src/ext/python/Python-3.8.6" -(.venv) cic-ussd $ export CFLAGS="-I/home/lash/src/ext/python/Python-3.8.6/Include -I/home/lash/src/ext/python/Python-3.8.6" -(.venv) cic-ussd $ pip download - -global-option=build_ext - -global-option "-I/home/lash/src/ext/Python-3.8.6/Include" - -index-url https://pypi.org/simple - -extra-index-url http://localhost/python - -no-binary :all: -d deps/ -r requirements.txt -bcrypt uses cffi, fails with missing header files Python.h and pyconfig.h --> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/bb7f404e49154a8317c793c21e6de6ae39cc147e039f9f0ff11d15bb15ae441c.asc b/drafts/bb7f404e49154a8317c793c21e6de6ae39cc147e039f9f0ff11d15bb15ae441c.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AGocggAgjkiUrLUM9YOGLhCGNWEq88v2U8SF3d7e1CCg5V66FZ4mxIYfdb5YW+b -OLFLQDuKRJn7joPLtIqS7ynNdJ2/DoRCtc1yMXjHuLPkXsaQ+GEgICE1gR/PFiC2 -cb2Hkn/fGcqvqvrTTLk0rWAb2dCveNL20NLIwRknxY94uxdUG4Dlm0P/D5k47Ojs -C4vf0xXwdpCvhiubYeZquBglrFMPhYapkmyJ6fsGmohi37l9OO5v03MggCSziGtI -7bsPd/i2rbgWlkkPJtthet9sbQUZ62XlofBaJKzIlqIIWkjUMuvRMbMzSPP9uWzS -3AMRqcZLyqqK1moNiWuzIurXsAYTyA== -=4rMs ------END PGP SIGNATURE----- diff --git a/drafts/c00ee4bf6cc06399bc6f237a394955ea165b5307f67a8714f16f58944bb12039 b/drafts/c00ee4bf6cc06399bc6f237a394955ea165b5307f67a8714f16f58944bb12039 @@ -1,101 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Dissecting the IPFS API</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/ipfs-api-get.html" rel="bookmark" - title="Permalink to Dissecting the IPFS API">Dissecting the IPFS API</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-05-01T08:40:00+02:00"> - Sat 01 May 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="highlight"><pre><span></span>$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/object/get?arg=QmWajb6k7oT9HVTq5hgnGZqRxzwwA2g7D33MFjzd2nVcXw"</span> -<span class="o">{</span><span class="s2">"Links"</span>:<span class="o">[{</span><span class="s2">"Name"</span>:<span class="s2">""</span>,<span class="s2">"Hash"</span>:<span class="s2">"QmZeEX1hbQtj34TPLdbUwbFtQBGAmanTVUB6HuiTcrLrfQ"</span>,<span class="s2">"Size"</span>:262158<span class="o">}</span>,<span class="o">{</span><span class="s2">"Name"</span>:<span class="s2">""</span>,<span class="s2">"Hash"</span>:<span class="s2">"QmWdaV34ArzVJH2Si9CxS9b5SxCnmU1HMuEXNA137XoV4f"</span>,<span class="s2">"Size"</span>:262158<span class="o">}</span>,<span class="o">{</span><span class="s2">"Name"</span>:<span class="s2">""</span>,<span class="s2">"Hash"</span>:<span class="s2">"QmUgSEJDRj7So3x7n8RaUfiLfcDy5CyqY7btJdm6B7z4Ae"</span>,<span class="s2">"Size"</span>:131390<span class="o">}]</span>,<span class="s2">"Data"</span>:<span class="s2">"\u0008\u0002\u0018\ufffd\ufffd( \ufffd\ufffd\u0010 \ufffd\ufffd\u0010 \ufffd\ufffd\u0008"</span><span class="o">}</span> -</pre></div> -<div class="highlight"><pre><span></span>$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/get?arg=QmZeEX1hbQtj34TPLdbUwbFtQBGAmanTVUB6HuiTcrLrfQ"</span> <span class="p">|</span> hexdump -C -n1024 -<span class="m">00000010</span> 4c <span class="m">64</span> <span class="m">62</span> <span class="m">55</span> <span class="m">77</span> <span class="m">62</span> <span class="m">46</span> <span class="m">74</span> <span class="m">51</span> <span class="m">42</span> <span class="m">47</span> <span class="m">41</span> 6d <span class="m">61</span> 6e <span class="m">54</span> <span class="p">|</span>LdbUwbFtQBGAmanT<span class="p">|</span> -<span class="m">00000020</span> <span class="m">56</span> <span class="m">55</span> <span class="m">42</span> <span class="m">36</span> <span class="m">48</span> <span class="m">75</span> <span class="m">69</span> <span class="m">54</span> <span class="m">63</span> <span class="m">72</span> 4c <span class="m">72</span> <span class="m">66</span> <span class="m">51</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>VUB6HuiTcrLrfQ..<span class="p">|</span> -<span class="m">00000030</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>................<span class="p">|</span> -* -<span class="m">00000060</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">36</span> <span class="m">34</span> <span class="m">34</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="p">|</span>....0000644.0000<span class="p">|</span> -<span class="m">00000070</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="p">|</span><span class="m">000</span>.0000000.0000<span class="p">|</span> -<span class="m">00000080</span> <span class="m">31</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">31</span> <span class="m">34</span> <span class="m">30</span> <span class="m">34</span> <span class="m">36</span> <span class="m">31</span> <span class="m">35</span> <span class="m">33</span> <span class="p">|</span><span class="m">1000000</span>.14046153<span class="p">|</span> -<span class="m">00000090</span> <span class="m">30</span> <span class="m">33</span> <span class="m">36</span> <span class="m">00</span> <span class="m">30</span> <span class="m">31</span> <span class="m">37</span> <span class="m">31</span> <span class="m">37</span> <span class="m">32</span> <span class="m">00</span> <span class="m">20</span> <span class="m">30</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span><span class="m">036</span>.017172. <span class="m">0</span>...<span class="p">|</span> -000000a0 <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>................<span class="p">|</span> -* -<span class="m">00000100</span> <span class="m">00</span> <span class="m">75</span> <span class="m">73</span> <span class="m">74</span> <span class="m">61</span> <span class="m">72</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>.ustar.00.......<span class="p">|</span> -<span class="m">00000110</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>................<span class="p">|</span> -* -<span class="m">00000140</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="p">|</span>.........0000000<span class="p">|</span> -<span class="m">00000150</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>.0000000........<span class="p">|</span> -<span class="m">00000160</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>................<span class="p">|</span> -* -<span class="m">00000200</span> <span class="m">47</span> <span class="m">49</span> <span class="m">46</span> <span class="m">38</span> <span class="m">39</span> <span class="m">61</span> f4 <span class="m">01</span> 7b <span class="m">01</span> f7 fb <span class="m">00</span> <span class="m">94</span> <span class="m">31</span> <span class="m">17</span> <span class="p">|</span>GIF89a..<span class="o">{</span>.....1.<span class="p">|</span> -<span class="m">00000210</span> ac c7 d8 a8 c6 ec d5 <span class="m">70</span> 4b <span class="m">90</span> 8a <span class="m">71</span> e9 <span class="nb">cd</span> a9 c6 <span class="p">|</span>.......pK..q....<span class="p">|</span> -</pre></div> -<div class="highlight"><pre><span></span>$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/get?arg=QmZeEX1hbQtj34TPLdbUwbFtQBGAmanTVUB6HuiTcrLrfQ"</span> <span class="p">|</span> dd <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">skip</span><span class="o">=</span><span class="m">1</span> > pat.gif -$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/get?arg=QmWdaV34ArzVJH2Si9CxS9b5SxCnmU1HMuEXNA137XoV4f"</span> <span class="p">|</span> dd <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">skip</span><span class="o">=</span><span class="m">1</span> >> pat.gif -$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/get?arg=QmUgSEJDRj7So3x7n8RaUfiLfcDy5CyqY7btJdm6B7z4Ae"</span> <span class="p">|</span> dd <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">skip</span><span class="o">=</span><span class="m">1</span> >> pat.gif -</pre></div> -<div class="highlight"><pre><span></span>$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/cat?arg=QmWajb6k7oT9HVTq5hgnGZqRxzwwA2g7D33MFjzd2nVcXw"</span> -o pat2.gif -$ diff pat2.gif pat.gif -$ <span class="nb">echo</span> <span class="nv">$?</span> -<span class="m">0</span> -</pre></div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/c00ee4bf6cc06399bc6f237a394955ea165b5307f67a8714f16f58944bb12039.asc b/drafts/c00ee4bf6cc06399bc6f237a394955ea165b5307f67a8714f16f58944bb12039.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AFosAf9FfUK+e9/lDGjXxqjdQ+OAtVkQCF5FNSEywh7dXpgMmH/jEh8uJOK4jsl -ljapgWAciBM4suKqo23bSvUzmjgQ95EQ5tx1uM4mJjOOLh3p9rFfHA2TFJQK6f3z -XwdxySMc98rSyv5vvNkJGfYG0zS5xEDsZKmszedBfJaR2urqNX85z9L0TGcVbA0J -soI81tdn2N2rCEnR0aMXRDmLjUynSM5pdTdVnEdcpicP4cw2SNnKwRJtetGe3to+ -Thri3iTib5fZN1ffhkuCcTKmZUr1eTHZ/VG+CTcFtBjwUTE6qx1rWBdkbSvJbfo4 -k3IngW9HuzmI0N9BZhQGza57sN+vrg== -=KkyA ------END PGP SIGNATURE----- diff --git a/drafts/celery-document-graph.html b/drafts/celery-document-graph.html @@ -1,87 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Documenting Celery task chains</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/celery-document-graph.html" rel="bookmark" - title="Permalink to Documenting Celery task chains">Documenting Celery task chains</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-04-25T15:00:00+02:00"> - Sun 25 April 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/python.html">python</a> - <a href="../tag/microservices.html">microservices</a> - <a href="../tag/celery.html">celery</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="highlight"><pre><span></span><span class="n">current_app</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> -<span class="s1">'broker_url'</span><span class="p">:</span> <span class="n">broker</span><span class="p">,</span> -<span class="p">})</span> - -<span class="n">result</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'CELERY_RESULT_URL'</span><span class="p">)</span> -<span class="k">if</span> <span class="n">result</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'file'</span><span class="p">:</span> - <span class="n">rq</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkdtemp</span><span class="p">()</span> - <span class="n">current_app</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> - <span class="s1">'result_backend'</span><span class="p">:</span> <span class="s1">'file://</span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">rq</span><span class="p">),</span> - <span class="p">})</span> - <span class="n">logg</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">'celery backend store dir </span><span class="si">{}</span><span class="s1"> created, will NOT be deleted on shutdown'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">rq</span><span class="p">))</span> -<span class="k">else</span><span class="p">:</span> - <span class="n">current_app</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> - <span class="s1">'result_backend'</span><span class="p">:</span> <span class="n">result</span><span class="p">,</span> - <span class="p">})</span> -</pre></div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/celery-document-graph.sha256 b/drafts/celery-document-graph.sha256 @@ -1 +0,0 @@ -9c19cf6e859d24826ea226adc1957b0366371f742f6c57f366dae84bd7358872 celery-document-graph.html -\ No newline at end of file diff --git a/drafts/clortho.html b/drafts/clortho.html @@ -1,92 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Clortho</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/clortho.html" rel="bookmark" - title="Permalink to Clortho">Clortho</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-01-12T15:03:00+01:00"> - Wed 12 January 2022 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/crypto.html">crypto</a> - <a href="../tag/hash.html">hash</a> - <a href="../tag/sha512.html">sha512</a> - <a href="../tag/bash.html">bash</a> - <a href="../tag/cli.html">cli</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <p>Ever since I started using the <a class="reference external" href="https://www.passwordstore.org/">pass</a> CLI as my password manager, I've found myself putting all sorts of stuff in there; usernames, email, urls, crypto addresses, api keys, you name it.</p> -<p>It makes total sense that some of these items are in there. For example, I store the url to a service together with the password, usually accompanied by the username and the email used <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a>. No password recoveries needed.</p> -<p>However, I've also started putting in things like crypto addresses, or even token smart conrtact addresses in there, it seems less of a good fit. One thing is that it spams the password directory. But another more sinister issues is that it's pretty clear for anyone reading the directory what items you are storing data for.</p> -<div class="section" id="hiding-the-key"> -<h2>Hiding the key</h2> -<p>So what if I want to store key/value pairs, and at the same time I want to hide what I am storing?</p> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td>I use a different email for each service I sign up to, and for every other context I have to leave my email for something.</td></tr> -</tbody> -</table> -</blockquote> -<!-- --> -<blockquote> -</blockquote> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/clortho.sha256 b/drafts/clortho.sha256 @@ -1 +0,0 @@ -f0f974f238798182cf17e36c24eb4f94ccfce068a32f310e50dfbf5b5158d5c9 clortho.html -\ No newline at end of file diff --git a/drafts/dfbd350e2938c179b1acba8eec950835b5f17669267b94ea7d559e915831a7f8 b/drafts/dfbd350e2938c179b1acba8eec950835b5f17669267b94ea7d559e915831a7f8 @@ -1,91 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Python pipe args</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/python-pipe-args.html" rel="bookmark" - title="Permalink to Python pipe args">Python pipe args</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-06-09T22:08:00+02:00"> - Wed 09 June 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/python.html">python</a> - <a href="../tag/cli.html">cli</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <pre class="code ini literal-block"> -<span class="na">import sys</span><span class="w"> -</span><span class="na">import select</span><span class="w"> -</span><span class="na">import argparse</span><span class="w"> - - </span><span class="na">def stdincheck():</span><span class="w"> - </span><span class="na">h</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">select.select([sys.stdin], [], [], 0) # 0 = poll, noblock</span><span class="w"> - </span><span class="na">if len(h[0]) > 0:</span><span class="w"> - </span><span class="na">v</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">h[0][0].read()</span><span class="w"> - </span><span class="na">return v.rstrip()</span><span class="w"> - </span><span class="na">return None</span><span class="w"> - - </span><span class="na">argparser</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">argparse.ArgumentParser()</span><span class="w"> - </span><span class="na">argparser.add_argument('val', nargs</span><span class="o">=</span><span class="s">'?', default=stdincheck(), type=str, help='input val')</span><span class="w"> - </span><span class="na">args</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">argparser.parse_args(sys.argv[1:])</span><span class="w"> - - </span><span class="na">if args.val</span><span class="w"> </span><span class="o">=</span><span class="s">= None:</span><span class="w"> - </span><span class="na">argparser.error('value but be specified on stdin or as first positional argument')</span><span class="w"> - - </span><span class="na">print(args.val)</span> -</pre> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/dfbd350e2938c179b1acba8eec950835b5f17669267b94ea7d559e915831a7f8.asc b/drafts/dfbd350e2938c179b1acba8eec950835b5f17669267b94ea7d559e915831a7f8.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AE9wAgAkHAcgLev9Ezzz9lIFHHiq0MmcJ4oCrXTPdus3Q4WqUwnnUKzSaPQ6BzK -THJFOrMxj56PQgoDN6fz5YqV0FmXnktTdhQGSRDjTjbg7gIlw8ZuCV4v7NJb2UYO -iqds5qmLFNGY8tWa6RDpb1WbcrFMCpWBx554n8rwEnQikL9OV22yL4/iaWbtxk5e -q5YyA+HiV48iQyo251xtDOrrXX2Fep7ud7DcyD0W/hYccXscIP7NMTVGOR3xLEs0 -hc2tO+V8MZKlw44lgokCQrw1ihvLLyCSLgkJltbQW2zn9CD00KNUqCNb1edx6hXP -QbsVv7TIijQQkTeNTGo4nOljavZDxA== -=dRrn ------END PGP SIGNATURE----- diff --git a/drafts/docker-offline-4-debian.html b/drafts/docker-offline-4-debian.html @@ -1,82 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Debian repository</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li class="active"><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/docker-offline-4-debian.html" rel="bookmark" - title="Permalink to Debian repository">Offline Docker: Debian repository</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-06-23T13:14:00+02:00"> - Wed 23 June 2021 - </time> -in <a class="category" href="../category/offlining.html">offlining</a> - <a href="../tag/docker.html">docker</a> - <a href="../tag/networking.html">networking</a> - <a href="../tag/debian.html">debian</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="entry-series meta"> -Part 4 from the series "Offline Docker" - <ol class="entry-series-parts"> - <li>| <a href="docker-offline-1-routing.html" title="The routing to freedom ">Part 1</a></li> - <li>| <a href="docker-offline-2-python.html" title="Local python repository ">Part 2</a></li> - <li>| <a href="docker-offline-3-npm.html" title="Local npm repository ">Part 3</a></li> - </ol> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- --> -<blockquote> -</blockquote> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/docker-offline-4-debian.sha256 b/drafts/docker-offline-4-debian.sha256 @@ -1 +0,0 @@ -a567d8d38afd23aa934573a7efe197dbca3584dbe519df7c086d7997845d100a docker-offline-4-debian.html -\ No newline at end of file diff --git a/drafts/docker-offline-5-npm-bundle.html b/drafts/docker-offline-5-npm-bundle.html @@ -1,131 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Local npm bundles</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li class="active"><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/docker-offline-5-npm-bundle.html" rel="bookmark" - title="Permalink to Local npm bundles">Offline Docker: Local npm bundles</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-10-22T15:26:00+02:00"> - Fri 22 October 2021 - </time> -in <a class="category" href="../category/offlining.html">offlining</a> - <a href="../tag/docker.html">docker</a> - <a href="../tag/npm.html">npm</a> - <a href="../tag/nodejs.html">nodejs</a> - <a href="../tag/javascript.html">javascript</a> - <a href="../tag/devops.html">devops</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="entry-series meta"> -Part 5 from the series "Offline Docker" - <ol class="entry-series-parts"> - <li>| <a href="docker-offline-1-routing.html" title="The routing to freedom ">Part 1</a></li> - <li>| <a href="docker-offline-2-python.html" title="Local python repository ">Part 2</a></li> - <li>| <a href="docker-offline-3-npm.html" title="Local npm repository ">Part 3</a></li> - </ol> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="highlight"><pre><span></span><span class="go"><Directory "/srv/http/npm"></span> -<span class="go"> DirectoryIndex package.json</span> -<span class="go"> RewriteEngine on</span> -<span class="go"> RewriteRule "^(.+)-\/(.+)$" "/npm/$1$2" [R=301]</span> -<span class="go"></Directory></span> -</pre></div> -<pre class="code python literal-block"> -<span class="kn">import</span> <span class="nn">json</span> -<span class="kn">import</span> <span class="nn">os</span> -<span class="kn">import</span> <span class="nn">urllib.request</span> -<span class="kn">import</span> <span class="nn">urllib.parse</span> -<span class="kn">import</span> <span class="nn">logging</span> - -<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">)</span> -<span class="n">logg</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">()</span> - - -<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'package-lock.json'</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> -<span class="n">j</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> -<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> - -<span class="n">script_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="vm">__file__</span><span class="p">))</span> -<span class="n">output_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">script_dir</span><span class="p">,</span> <span class="s1">'_out'</span><span class="p">)</span> - -<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">j</span><span class="p">[</span><span class="s1">'packages'</span><span class="p">]:</span> - <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="s1">''</span><span class="p">:</span> - <span class="k">continue</span> - <span class="n">url</span> <span class="o">=</span> <span class="n">j</span><span class="p">[</span><span class="s1">'packages'</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="s1">'resolved'</span><span class="p">]</span> - <span class="n">parts</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span> - <span class="n">output_path_package</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">output_dir</span><span class="p">,</span> <span class="n">parts</span><span class="o">.</span><span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span> - <span class="k">try</span><span class="p">:</span> - <span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">)</span> - <span class="n">logg</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'skipping existing </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">))</span> - <span class="k">continue</span> - <span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span> - <span class="k">pass</span> - <span class="n">output_dir_package</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">)</span> - <span class="c1">#print(output_path_package)</span> - <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">output_dir_package</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> - - <span class="n">rq</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span> - <span class="n">c</span> <span class="o">=</span> <span class="n">rq</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> - <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">,</span> <span class="s1">'wb'</span><span class="p">)</span> - <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> - <span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> - <span class="n">logg</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'wrote </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">output_path_package</span><span class="p">))</span> -</pre> -<pre class="code bash literal-block"> -find _out -type f -name <span class="s2">"*gz"</span> -exec rename -v <span class="s2">"/-"</span> <span class="s2">""</span> <span class="o">{}</span> <span class="se">\;</span> -</pre> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/docker-offline-5-npm-bundle.sha256 b/drafts/docker-offline-5-npm-bundle.sha256 @@ -1 +0,0 @@ -71324ed671b174ad627270e4397da302430b4aad77b1b0479e2bc251808336a7 docker-offline-5-npm-bundle.html -\ No newline at end of file diff --git a/drafts/docker-vpn.html b/drafts/docker-vpn.html @@ -1,102 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Using Docker with VPN</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li class="active"><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/docker-vpn.html" rel="bookmark" - title="Permalink to Using Docker with VPN">Using Docker with VPN</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-04-21T06:53:00+02:00"> - Wed 21 April 2021 - </time> -in <a class="category" href="../category/hygiene.html">hygiene</a> - <a href="../tag/vpn.html">vpn</a> - <a href="../tag/openvpn.html">openvpn</a> - <a href="../tag/iproute.html">iproute</a> - <a href="../tag/docker.html">docker</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <p>Need to route through the tun interface, which Docker doesn't seem to automatically do.</p> -<div class="highlight"><pre><span></span>$ ip route ls -<span class="o">[</span>...<span class="o">]</span> -<span class="m">10</span>.7.3.0/24 dev tun0 proto kernel scope link src <span class="m">10</span>.7.3.6 -</pre></div> -<pre class="literal-block"> -ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network -</pre> -<p>The simplest solution I have found is to exchange the gateway redirect from the OpenVPN server <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a> and add the VPN interface as the default route.</p> -<pre class="code bash literal-block"> -<span class="ch">#!/bin/sh -</span> -<span class="nv">default_route_vpn_gateway</span><span class="o">=</span><span class="sb">`</span>ip route <span class="p">|</span> awk <span class="s1">'{if ($1 ~ /^0.0.0.0\/1$/) { print $3; }}'</span><span class="sb">`</span> -<span class="nv">route_vpn_gateway</span><span class="o">=</span><span class="si">${</span><span class="nv">VPN_GATEWAY</span><span class="k">:-</span><span class="nv">$default_route_vpn_gateway</span><span class="si">}</span> -<span class="nb">echo</span> <span class="s2">"Adding default route to </span><span class="nv">$route_vpn_gateway</span><span class="s2"> with /0 mask..."</span> -ip route add default via <span class="nv">$route_vpn_gateway</span> - -<span class="nb">echo</span> <span class="s2">"Removing /1 routes..."</span> -ip route del <span class="m">0</span>.0.0.0/1 via <span class="nv">$route_vpn_gateway</span> -ip route del <span class="m">128</span>.0.0.0/1 via <span class="nv">$route_vpn_gateway</span> -</pre> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td><a class="reference external" href="https://stackoverflow.com/a/62333327">https://stackoverflow.com/a/62333327</a></td></tr> -</tbody> -</table> -</blockquote> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/docker-vpn.sha256 b/drafts/docker-vpn.sha256 @@ -1 +0,0 @@ -a357fc904e0f2566fd27b66d233ed0d2f8a343d993fd77de51f64eeb95896b03 docker-vpn.html -\ No newline at end of file diff --git a/drafts/f0f974f238798182cf17e36c24eb4f94ccfce068a32f310e50dfbf5b5158d5c9 b/drafts/f0f974f238798182cf17e36c24eb4f94ccfce068a32f310e50dfbf5b5158d5c9 @@ -1,92 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Clortho</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/clortho.html" rel="bookmark" - title="Permalink to Clortho">Clortho</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-01-12T15:03:00+01:00"> - Wed 12 January 2022 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/crypto.html">crypto</a> - <a href="../tag/hash.html">hash</a> - <a href="../tag/sha512.html">sha512</a> - <a href="../tag/bash.html">bash</a> - <a href="../tag/cli.html">cli</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <p>Ever since I started using the <a class="reference external" href="https://www.passwordstore.org/">pass</a> CLI as my password manager, I've found myself putting all sorts of stuff in there; usernames, email, urls, crypto addresses, api keys, you name it.</p> -<p>It makes total sense that some of these items are in there. For example, I store the url to a service together with the password, usually accompanied by the username and the email used <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a>. No password recoveries needed.</p> -<p>However, I've also started putting in things like crypto addresses, or even token smart conrtact addresses in there, it seems less of a good fit. One thing is that it spams the password directory. But another more sinister issues is that it's pretty clear for anyone reading the directory what items you are storing data for.</p> -<div class="section" id="hiding-the-key"> -<h2>Hiding the key</h2> -<p>So what if I want to store key/value pairs, and at the same time I want to hide what I am storing?</p> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td>I use a different email for each service I sign up to, and for every other context I have to leave my email for something.</td></tr> -</tbody> -</table> -</blockquote> -<!-- --> -<blockquote> -</blockquote> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/f0f974f238798182cf17e36c24eb4f94ccfce068a32f310e50dfbf5b5158d5c9.asc b/drafts/f0f974f238798182cf17e36c24eb4f94ccfce068a32f310e50dfbf5b5158d5c9.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AHQsggAnE2WribFOiBDN2fhJkdzTLh9QZPFEtIowlmdsQLbxHjjq3tJQWv9bMPS -g7ENGnBA21UjQy5XqlS1yvbrPpPMA2pBelE8LSS6jNdd4JF7TOq4a6WyEutWJB/D -DcpwSlf5yW3Z0gTxPblSP5LRjY2JQOxSfy8bCl1E3vN3bQAatwwPeHHQQ7pT5dE4 -qRBMz9ZtSupsC79feaqtRgf00SDxf29ZikHQV0pvjzr4148RY8b8w91BqtcfkUS4 -lI94xzKgcw9brexGxvSJrWwKcZxAA2R/njMmCcYpfUiWcnTWIl/CUwvUSFDBFdqS -HwFWxzXf/Nttdf8dPLB7Pm5Eiwt2jA== -=UoFQ ------END PGP SIGNATURE----- diff --git a/drafts/ipfs-api-get.html b/drafts/ipfs-api-get.html @@ -1,101 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Dissecting the IPFS API</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/ipfs-api-get.html" rel="bookmark" - title="Permalink to Dissecting the IPFS API">Dissecting the IPFS API</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-05-01T08:40:00+02:00"> - Sat 01 May 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="highlight"><pre><span></span>$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/object/get?arg=QmWajb6k7oT9HVTq5hgnGZqRxzwwA2g7D33MFjzd2nVcXw"</span> -<span class="o">{</span><span class="s2">"Links"</span>:<span class="o">[{</span><span class="s2">"Name"</span>:<span class="s2">""</span>,<span class="s2">"Hash"</span>:<span class="s2">"QmZeEX1hbQtj34TPLdbUwbFtQBGAmanTVUB6HuiTcrLrfQ"</span>,<span class="s2">"Size"</span>:262158<span class="o">}</span>,<span class="o">{</span><span class="s2">"Name"</span>:<span class="s2">""</span>,<span class="s2">"Hash"</span>:<span class="s2">"QmWdaV34ArzVJH2Si9CxS9b5SxCnmU1HMuEXNA137XoV4f"</span>,<span class="s2">"Size"</span>:262158<span class="o">}</span>,<span class="o">{</span><span class="s2">"Name"</span>:<span class="s2">""</span>,<span class="s2">"Hash"</span>:<span class="s2">"QmUgSEJDRj7So3x7n8RaUfiLfcDy5CyqY7btJdm6B7z4Ae"</span>,<span class="s2">"Size"</span>:131390<span class="o">}]</span>,<span class="s2">"Data"</span>:<span class="s2">"\u0008\u0002\u0018\ufffd\ufffd( \ufffd\ufffd\u0010 \ufffd\ufffd\u0010 \ufffd\ufffd\u0008"</span><span class="o">}</span> -</pre></div> -<div class="highlight"><pre><span></span>$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/get?arg=QmZeEX1hbQtj34TPLdbUwbFtQBGAmanTVUB6HuiTcrLrfQ"</span> <span class="p">|</span> hexdump -C -n1024 -<span class="m">00000010</span> 4c <span class="m">64</span> <span class="m">62</span> <span class="m">55</span> <span class="m">77</span> <span class="m">62</span> <span class="m">46</span> <span class="m">74</span> <span class="m">51</span> <span class="m">42</span> <span class="m">47</span> <span class="m">41</span> 6d <span class="m">61</span> 6e <span class="m">54</span> <span class="p">|</span>LdbUwbFtQBGAmanT<span class="p">|</span> -<span class="m">00000020</span> <span class="m">56</span> <span class="m">55</span> <span class="m">42</span> <span class="m">36</span> <span class="m">48</span> <span class="m">75</span> <span class="m">69</span> <span class="m">54</span> <span class="m">63</span> <span class="m">72</span> 4c <span class="m">72</span> <span class="m">66</span> <span class="m">51</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>VUB6HuiTcrLrfQ..<span class="p">|</span> -<span class="m">00000030</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>................<span class="p">|</span> -* -<span class="m">00000060</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">36</span> <span class="m">34</span> <span class="m">34</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="p">|</span>....0000644.0000<span class="p">|</span> -<span class="m">00000070</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="p">|</span><span class="m">000</span>.0000000.0000<span class="p">|</span> -<span class="m">00000080</span> <span class="m">31</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">31</span> <span class="m">34</span> <span class="m">30</span> <span class="m">34</span> <span class="m">36</span> <span class="m">31</span> <span class="m">35</span> <span class="m">33</span> <span class="p">|</span><span class="m">1000000</span>.14046153<span class="p">|</span> -<span class="m">00000090</span> <span class="m">30</span> <span class="m">33</span> <span class="m">36</span> <span class="m">00</span> <span class="m">30</span> <span class="m">31</span> <span class="m">37</span> <span class="m">31</span> <span class="m">37</span> <span class="m">32</span> <span class="m">00</span> <span class="m">20</span> <span class="m">30</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span><span class="m">036</span>.017172. <span class="m">0</span>...<span class="p">|</span> -000000a0 <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>................<span class="p">|</span> -* -<span class="m">00000100</span> <span class="m">00</span> <span class="m">75</span> <span class="m">73</span> <span class="m">74</span> <span class="m">61</span> <span class="m">72</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>.ustar.00.......<span class="p">|</span> -<span class="m">00000110</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>................<span class="p">|</span> -* -<span class="m">00000140</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="p">|</span>.........0000000<span class="p">|</span> -<span class="m">00000150</span> <span class="m">00</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>.0000000........<span class="p">|</span> -<span class="m">00000160</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="p">|</span>................<span class="p">|</span> -* -<span class="m">00000200</span> <span class="m">47</span> <span class="m">49</span> <span class="m">46</span> <span class="m">38</span> <span class="m">39</span> <span class="m">61</span> f4 <span class="m">01</span> 7b <span class="m">01</span> f7 fb <span class="m">00</span> <span class="m">94</span> <span class="m">31</span> <span class="m">17</span> <span class="p">|</span>GIF89a..<span class="o">{</span>.....1.<span class="p">|</span> -<span class="m">00000210</span> ac c7 d8 a8 c6 ec d5 <span class="m">70</span> 4b <span class="m">90</span> 8a <span class="m">71</span> e9 <span class="nb">cd</span> a9 c6 <span class="p">|</span>.......pK..q....<span class="p">|</span> -</pre></div> -<div class="highlight"><pre><span></span>$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/get?arg=QmZeEX1hbQtj34TPLdbUwbFtQBGAmanTVUB6HuiTcrLrfQ"</span> <span class="p">|</span> dd <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">skip</span><span class="o">=</span><span class="m">1</span> > pat.gif -$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/get?arg=QmWdaV34ArzVJH2Si9CxS9b5SxCnmU1HMuEXNA137XoV4f"</span> <span class="p">|</span> dd <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">skip</span><span class="o">=</span><span class="m">1</span> >> pat.gif -$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/get?arg=QmUgSEJDRj7So3x7n8RaUfiLfcDy5CyqY7btJdm6B7z4Ae"</span> <span class="p">|</span> dd <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">skip</span><span class="o">=</span><span class="m">1</span> >> pat.gif -</pre></div> -<div class="highlight"><pre><span></span>$ curl -X POST <span class="s2">"http://localhost:5001/api/v0/cat?arg=QmWajb6k7oT9HVTq5hgnGZqRxzwwA2g7D33MFjzd2nVcXw"</span> -o pat2.gif -$ diff pat2.gif pat.gif -$ <span class="nb">echo</span> <span class="nv">$?</span> -<span class="m">0</span> -</pre></div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/ipfs-api-get.sha256 b/drafts/ipfs-api-get.sha256 @@ -1 +0,0 @@ -c00ee4bf6cc06399bc6f237a394955ea165b5307f67a8714f16f58944bb12039 ipfs-api-get.html -\ No newline at end of file diff --git a/drafts/keccak-benchmarks.html b/drafts/keccak-benchmarks.html @@ -1,313 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - In search of a slim KECCAK dependency</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/keccak-benchmarks.html" rel="bookmark" - title="Permalink to In search of a slim KECCAK dependency">In search of a slim KECCAK dependency</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-04-18T15:01:00+02:00"> - Sun 18 April 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/crypto.html">crypto</a> - <a href="../tag/hash.html">hash</a> - <a href="../tag/keccak.html">keccak</a> - <a href="../tag/sha3.html">sha3</a> - <a href="../tag/python.html">python</a> - <a href="../tag/c.html">c</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="section" id="implementations"> -<h2>Implementations</h2> -<div class="section" id="xkcp"> -<h3>XKCP</h3> -<ul class="simple"> -<li>Site: <a class="reference external" href="https://keccak.team/keccak_specs_summary.html">https://keccak.team/keccak_specs_summary.html</a></li> -<li>Code: <a class="reference external" href="https://github.com/xkcp/xkcp">https://github.com/xkcp/xkcp</a></li> -<li>Git hash: c438ee7b2736726f629da11b7012cffcf6b84fef</li> -</ul> -<pre class="code c literal-block"> -<span class="ln">0 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><XKCP/KeccakHash.h></span><span class="cp"> -</span><span class="ln">1 </span><span class="cp"></span><span class="w"> -</span><span class="ln">2 </span><span class="w"></span><span class="kt">int</span><span class="w"> </span><span class="nf">wrap_keccak</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">bitlen</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">zout</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">3 </span><span class="w"> </span><span class="n">Keccak_HashInstance</span><span class="w"> </span><span class="n">instance</span><span class="p">;</span><span class="w"> -</span><span class="ln">4 </span><span class="w"> </span><span class="n">Keccak_HashInitialize</span><span class="p">(</span><span class="o">&</span><span class="n">instance</span><span class="p">,</span><span class="w"> </span><span class="mi">1088</span><span class="p">,</span><span class="w"> </span><span class="mi">512</span><span class="p">,</span><span class="w"> </span><span class="mi">256</span><span class="p">,</span><span class="w"> </span><span class="mh">0x01</span><span class="p">);</span><span class="w"> -</span><span class="ln">5 </span><span class="w"> </span><span class="n">Keccak_HashUpdate</span><span class="p">(</span><span class="o">&</span><span class="n">instance</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">bitlen</span><span class="p">);</span><span class="w"> -</span><span class="ln">6 </span><span class="w"> </span><span class="n">Keccak_HashFinal</span><span class="p">(</span><span class="o">&</span><span class="n">instance</span><span class="p">,</span><span class="w"> </span><span class="n">zout</span><span class="p">);</span><span class="w"> -</span><span class="ln">7 </span><span class="w"></span><span class="p">}</span> -</pre> -<pre class="code c literal-block"> -<span class="ln"> 0 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><string.h></span><span class="cp"> -</span><span class="ln"> 1 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span><span class="cp"> -</span><span class="ln"> 2 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdlib.h></span><span class="cp"> -</span><span class="ln"> 3 </span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><time.h></span><span class="cp"> -</span><span class="ln"> 4 </span><span class="cp"></span><span class="w"> -</span><span class="ln"> 5 </span><span class="w"></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><XKCP/KeccakHash.h></span><span class="cp"> -</span><span class="ln"> 6 </span><span class="cp"></span><span class="w"> -</span><span class="ln"> 7 </span><span class="w"></span><span class="cp">#ifndef ROUNDS -</span><span class="ln"> 8 </span><span class="cp">#define ROUNDS 100000 -</span><span class="ln"> 9 </span><span class="cp">#endif -</span><span class="ln">10 </span><span class="cp"></span><span class="w"> -</span><span class="ln">11 </span><span class="w"></span><span class="k">extern</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">wrap_keccak</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">zout</span><span class="p">);</span><span class="w"> -</span><span class="ln">12 </span><span class="w"> -</span><span class="ln">13 </span><span class="w"></span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">14 </span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rounds</span><span class="p">;</span><span class="w"> -</span><span class="ln">15 </span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">delta_sec</span><span class="p">;</span><span class="w"> -</span><span class="ln">16 </span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">delta_nsec</span><span class="p">;</span><span class="w"> -</span><span class="ln">17 </span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">timespec</span><span class="w"> </span><span class="n">start</span><span class="p">;</span><span class="w"> -</span><span class="ln">18 </span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">timespec</span><span class="w"> </span><span class="n">end</span><span class="p">;</span><span class="w"> -</span><span class="ln">19 </span><span class="w"> -</span><span class="ln">20 </span><span class="w"> </span><span class="n">Keccak_HashInstance</span><span class="w"> </span><span class="n">instance</span><span class="p">;</span><span class="w"> -</span><span class="ln">21 </span><span class="w"> -</span><span class="ln">22 </span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span><span class="w"> -</span><span class="ln">23 </span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="sc">'f'</span><span class="p">,</span><span class="w"> </span><span class="sc">'o'</span><span class="p">,</span><span class="w"> </span><span class="sc">'o'</span><span class="p">};</span><span class="w"> -</span><span class="ln">24 </span><span class="w"> -</span><span class="ln">25 </span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span><span class="w"> -</span><span class="ln">26 </span><span class="w"> </span><span class="n">memset</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">256</span><span class="p">);</span><span class="w"> -</span><span class="ln">27 </span><span class="w"> -</span><span class="ln">28 </span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">10000</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">29 </span><span class="w"> </span><span class="n">wrap_keccak</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">);</span><span class="w"> -</span><span class="ln">30 </span><span class="w"> </span><span class="p">}</span><span class="w"> -</span><span class="ln">31 </span><span class="w"> -</span><span class="ln">32 </span><span class="w"> </span><span class="n">clock_gettime</span><span class="p">(</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">start</span><span class="p">);</span><span class="w"> -</span><span class="ln">33 </span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">ROUNDS</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">34 </span><span class="w"> </span><span class="n">wrap_keccak</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">);</span><span class="w"> -</span><span class="ln">35 </span><span class="w"> </span><span class="p">}</span><span class="w"> -</span><span class="ln">36 </span><span class="w"> </span><span class="n">clock_gettime</span><span class="p">(</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">end</span><span class="p">);</span><span class="w"> -</span><span class="ln">37 </span><span class="w"> -</span><span class="ln">38 </span><span class="w"> </span><span class="n">delta_sec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">end</span><span class="p">.</span><span class="n">tv_sec</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start</span><span class="p">.</span><span class="n">tv_sec</span><span class="p">;</span><span class="w"> -</span><span class="ln">39 </span><span class="w"> </span><span class="n">delta_nsec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">end</span><span class="p">.</span><span class="n">tv_nsec</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start</span><span class="p">.</span><span class="n">tv_nsec</span><span class="p">;</span><span class="w"> -</span><span class="ln">40 </span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">delta_nsec</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">41 </span><span class="w"> </span><span class="n">delta_sec</span><span class="o">++</span><span class="p">;</span><span class="w"> -</span><span class="ln">42 </span><span class="w"> </span><span class="n">delta_nsec</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mf">1000000000L</span><span class="p">;</span><span class="w"> -</span><span class="ln">43 </span><span class="w"> </span><span class="p">}</span><span class="w"> -</span><span class="ln">44 </span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"%u.%09u</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">delta_sec</span><span class="p">,</span><span class="w"> </span><span class="n">delta_nsec</span><span class="p">);</span><span class="w"> -</span><span class="ln">45 </span><span class="w"> -</span><span class="ln">46 </span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">32</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> -</span><span class="ln">47 </span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"%02x"</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span><span class="w"> -</span><span class="ln">48 </span><span class="w"> </span><span class="p">}</span><span class="w"> -</span><span class="ln">49 </span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> -</span><span class="ln">50 </span><span class="w"></span><span class="p">}</span> -</pre> -</div> -<div class="section" id="keccak-tiny"> -<h3>keccak_tiny</h3> -<ul class="simple"> -<li>Code: <a class="reference external" href="https://github.com/coruus/keccak-tiny">https://github.com/coruus/keccak-tiny</a></li> -<li>Git hash: 64b6647514212b76ae7bca0dea9b7b197d1d8186</li> -</ul> -<p>Needed to export <cite>hash</cite> function symbol, and add to header file.</p> -</div> -<div class="section" id="tiny-sha3"> -<h3>tiny_sha3</h3> -<ul class="simple"> -<li>Code <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a>: <a class="reference external" href="https://github.com/mjosaarinen/tiny_sha3">https://github.com/mjosaarinen/tiny_sha3</a></li> -<li>Git hash: dcbb3192047c2a721f5f851db591871d428036a9</li> -</ul> -<p>Had to change "padding" value in <tt class="docutils literal">sha3.c</tt></p> -<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">142</span></pre></div></td><td class="code"><div><pre><span></span><span class="w"> </span><span class="n">c</span><span class="o">-></span><span class="n">st</span><span class="p">.</span><span class="n">b</span><span class="p">[</span><span class="n">c</span><span class="o">-></span><span class="n">pt</span><span class="p">]</span><span class="w"> </span><span class="o">^=</span><span class="w"> </span><span class="mh">0x01</span><span class="p">;</span><span class="w"></span> -</pre></div></td></tr></table></div> -<div class="highlight"><pre><span></span><span class="n">sha3</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="mi">32</span><span class="p">);</span><span class="w"></span> -</pre></div> -</div> -<div class="section" id="libkeccak"> -<h3>libkeccak</h3> -<ul class="simple"> -<li>Code: <a class="reference external" href="https://github.com/maandree/libkeccak">https://github.com/maandree/libkeccak</a></li> -<li>Git hash: 718b1a6ea1c44bcf15e55d3c265310e1cd9211fa</li> -</ul> -<div class="highlight"><pre><span></span>libkeccak_state_initialise(&state, &spec); -libkeccak_fast_update(&state, msg, 3); -libkeccak_fast_digest(&state, NULL, 0, 0, NULL, buf); -</pre></div> -</div> -</div> -<div class="section" id="results"> -<h2>Results</h2> -<ul class="simple"> -<li>Input: "foo"</li> -<li>Rounds: 100000</li> -</ul> -<!-- :XKCP generic64: - - Time: 0.041101298 - - Executable size: 37768 - - Archive size: 358558 --> -<!-- :keccak-tiny: - - Time: 0.046095483 - - Executable size: 49400 - - Object size: 35544 --> -<!-- :tiny_sha3 [1]_: - - Time: 0.080156921 - - Executable size: 16577 - - Object size: 6712 --> -<!-- :libkeccak: - - Time: 0.200222898 - - Executable size: 50152 - - Archive size: 78680 --> -<table border="1" class="docutils"> -<colgroup> -<col width="32%" /> -<col width="34%" /> -<col width="34%" /> -</colgroup> -<thead valign="bottom"> -<tr><th class="head">Implementation</th> -<th class="head">Execution time</th> -<th class="head">Executable size</th> -</tr> -</thead> -<tbody valign="top"> -<tr><td>XKCP</td> -<td><strong>0.041101298</strong></td> -<td>37768</td> -</tr> -<tr><td>keccak-tiny</td> -<td>0.046095483</td> -<td>49400</td> -</tr> -<tr><td>tiny_sha3</td> -<td>0.080156921</td> -<td><strong>16577</strong></td> -</tr> -<tr><td>libkeccak</td> -<td>0.200222898</td> -<td>50152</td> -</tr> -</tbody> -</table> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td>Author claims it is not suited for production</td></tr> -</tbody> -</table> -</blockquote> -</div> -<div class="section" id="python"> -<h2>Python</h2> -<p>XKCP has a pure-python implementation, but it's hopelessly slow.</p> -<p>Added to <tt class="docutils literal">CompactFIPS202.py</tt>:</p> -<div class="highlight"><pre><span></span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</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">10</span><span class="p">):</span> - <span class="n">a</span> <span class="o">=</span> <span class="n">Keccak</span><span class="p">(</span><span class="mi">1088</span><span class="p">,</span> <span class="mi">512</span><span class="p">,</span> <span class="sa">b</span><span class="s1">'foo'</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mi">32</span><span class="p">)</span> - - <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">):</span> - <span class="n">a</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**</span><span class="n">j</span> - <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock_gettime_ns</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</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="n">a</span><span class="p">):</span> - <span class="n">b</span> <span class="o">=</span> <span class="n">Keccak</span><span class="p">(</span><span class="mi">1088</span><span class="p">,</span> <span class="mi">512</span><span class="p">,</span> <span class="sa">b</span><span class="s1">'foo'</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mi">32</span><span class="p">)</span> - <span class="n">end_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock_gettime_ns</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">)</span> - <span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">end_time</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="mi">10</span><span class="o">**</span><span class="mi">9</span><span class="p">))</span> -</pre></div> -<pre class="literal-block"> -$ python CompactFIPS202.py -10 0.007536721 -100 0.066636149 -1000 0.64519725 -</pre> -<div class="section" id="wrapping-keccak-tiny"> -<h3>Wrapping keccak_tiny</h3> -<p>Implementing <tt class="docutils literal">XKCP</tt> in Python means creating two classes for the state and sponge structs. <tt class="docutils literal">keccak_tiny</tt> is much simpler because it is merely a function call with a couple of char buffers. But with ctypes ends up being very slow, too. <a class="footnote-reference" href="#footnote-2" id="footnote-reference-2">[2]</a></p> -<pre class="code python literal-block"> -<span class="ln"> 0 </span><span class="kn">import</span> <span class="nn">ctypes</span> -<span class="ln"> 1 </span><span class="kn">import</span> <span class="nn">sys</span> -<span class="ln"> 2 </span><span class="kn">import</span> <span class="nn">time</span> -<span class="ln"> 3 </span> -<span class="ln"> 4 </span><span class="n">libkeccak</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">CDLL</span><span class="p">(</span><span class="s1">'libkeccaktiny.so'</span><span class="p">)</span> -<span class="ln"> 5 </span> -<span class="ln"> 6 </span><span class="n">buf</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">pointer</span><span class="p">((</span><span class="n">ctypes</span><span class="o">.</span><span class="n">c_char</span> <span class="o">*</span> <span class="mi">256</span><span class="p">)())</span> -<span class="ln"> 7 </span><span class="n">data</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_string_buffer</span><span class="p">(</span><span class="sa">b</span><span class="s1">'foo'</span><span class="p">)</span> -<span class="ln"> 8 </span> -<span class="ln"> 9 </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">10000</span><span class="p">):</span> -<span class="ln">10 </span> <span class="n">libkeccak</span><span class="o">.</span><span class="n">hash</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">200</span><span class="o">-</span><span class="mi">64</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> -<span class="ln">11 </span> -<span class="ln">12 </span><span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock_gettime_ns</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">)</span> -<span class="ln">13 </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">100000</span><span class="p">):</span> -<span class="ln">14 </span> <span class="n">libkeccak</span><span class="o">.</span><span class="n">hash</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">200</span><span class="o">-</span><span class="mi">64</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> -<span class="ln">15 </span><span class="n">end_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock_gettime_ns</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">CLOCK_PROCESS_CPUTIME_ID</span><span class="p">)</span> -<span class="ln">16 </span> -<span class="ln">17 </span><span class="nb">print</span><span class="p">((</span><span class="n">end_time</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="mi">10</span><span class="o">**</span><span class="mi">9</span><span class="p">))</span> -<span class="ln">18 </span><span class="nb">print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">contents</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">hex</span><span class="p">())</span> -</pre> -<pre class="literal-block"> -$ gcc -L. -D"memset_s(W,WL,V,OL)=memset(W,V,OL)" -shared keccak-tiny.c -o libkeccaktiny.so -$ LD_LIBRARY_PATH=. python wrap.py -0.95114457 -41b1a0649752af1b28b3dc29a1556eee781e4a4c3a1f7f53f90fa834de098c4d -</pre> -<p>Compare with <tt class="docutils literal">pysha3</tt>:</p> -<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sha3</span> -<span class="n">h</span> <span class="o">=</span> <span class="n">sha3</span><span class="o">.</span><span class="n">keccak_256</span><span class="p">()</span> -<span class="n">h</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="sa">b</span><span class="s1">'foo'</span><span class="p">)</span> -<span class="n">b</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">digest</span><span class="p">()</span> -</pre></div> -<pre class="literal-block"> -0.162829927 -</pre> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-2" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-2">[2]</a></td><td>for some reason when on battery; 1.74030088</td></tr> -</tbody> -</table> -</blockquote> -</div> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/keccak-benchmarks.sha256 b/drafts/keccak-benchmarks.sha256 @@ -1 +0,0 @@ -b67179d704106cc1eecc6089b2a433ed481ec6d543d9f9e5f802c83a1b9367c3 keccak-benchmarks.html -\ No newline at end of file diff --git a/drafts/openethereum-clique-extradata.html b/drafts/openethereum-clique-extradata.html @@ -1,95 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - The clique extra data secret</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/openethereum-clique-extradata.html" rel="bookmark" - title="Permalink to The clique extra data secret">The clique extra data secret</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-01-24T20:05:00+01:00"> - Mon 24 January 2022 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/rust.html">rust</a> - <a href="../tag/blockchain.html">blockchain</a> - <a href="../tag/openethereum.html">openethereum</a> - <a href="../tag/ethereum.html">ethereum</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- --> -<blockquote> -<p>extradata: 0x536172616675204b61726962752053616e6100000000000000000000000000005C5aB0D602EEF41f82B6fc087A24e61383589C398c6f7b75d90c3b32bdc9b4fcfbb4ad43c853446a2c0c9d3a9590a3349c8e45ce50446bd276cbb99c1f38132cd7e520d6be0ccba78acc59ab50a82f711ff7cb9d00</p> -<p>32 bytes vanity -20 bytes address -65 bytes signature</p> -</blockquote> -<div class="highlight"><pre><span></span><span class="n">ethcore</span><span class="o">/</span><span class="n">src</span><span class="o">/</span><span class="n">engines</span><span class="o">/</span><span class="n">clique</span><span class="o">/</span><span class="k">mod</span><span class="p">.</span><span class="n">rs</span><span class="w"></span> - -<span class="c1">// Protocol constants</span> -<span class="sd">/// Fixed number of extra-data prefix bytes reserved for signer vanity</span> -<span class="k">pub</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">VANITY_LENGTH</span>: <span class="kt">usize</span> <span class="o">=</span><span class="w"> </span><span class="mi">32</span><span class="p">;</span><span class="w"></span> -<span class="sd">/// Fixed number of extra-data suffix bytes reserved for signer signature</span> -<span class="k">pub</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">SIGNATURE_LENGTH</span>: <span class="kt">usize</span> <span class="o">=</span><span class="w"> </span><span class="mi">65</span><span class="p">;</span><span class="w"></span> -</pre></div> -<div class="highlight"><pre><span></span><span class="n">ethcore</span><span class="o">/</span><span class="n">src</span><span class="o">/</span><span class="n">engines</span><span class="o">/</span><span class="n">clique</span><span class="o">/</span><span class="n">util</span><span class="p">.</span><span class="n">rs</span><span class="w"></span> - -<span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">extract_signers</span><span class="p">(</span><span class="n">header</span>: <span class="kp">&</span><span class="nc">Header</span><span class="p">)</span><span class="w"> </span>-> <span class="nb">Result</span><span class="o"><</span><span class="n">BTreeSet</span><span class="o"><</span><span class="n">Address</span><span class="o">></span><span class="p">,</span><span class="w"> </span><span class="n">Error</span><span class="o">></span><span class="w"> </span><span class="p">{</span><span class="w"></span> - -<span class="n">ie</span><span class="w"> </span><span class="n">data</span><span class="p">.</span><span class="n">len</span><span class="p">()</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="n">VANITY_LENGTH</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">SIGNATURE_LENGTH</span><span class="w"> </span><span class="p">{</span><span class="w"></span> -<span class="sd">/// Nonce value for DROP vote | Err(EngineError::CliqueCheckpointNoSigner)?</span> -<span class="k">pub</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">NONCE_DROP_VOTE</span>: <span class="nc">H64</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">H64</span><span class="p">([</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="mi">8</span><span class="p">]);</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">}</span><span class="w"></span> -</pre></div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/openethereum-clique-extradata.sha256 b/drafts/openethereum-clique-extradata.sha256 @@ -1 +0,0 @@ -4595f75a82f5b0a724be1410e99dff5cba3b18604bf0646987621a86515708e6 openethereum-clique-extradata.html -\ No newline at end of file diff --git a/drafts/python-pipe-args.html b/drafts/python-pipe-args.html @@ -1,91 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Python pipe args</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/python-pipe-args.html" rel="bookmark" - title="Permalink to Python pipe args">Python pipe args</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-06-09T22:08:00+02:00"> - Wed 09 June 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/python.html">python</a> - <a href="../tag/cli.html">cli</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <pre class="code ini literal-block"> -<span class="na">import sys</span><span class="w"> -</span><span class="na">import select</span><span class="w"> -</span><span class="na">import argparse</span><span class="w"> - - </span><span class="na">def stdincheck():</span><span class="w"> - </span><span class="na">h</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">select.select([sys.stdin], [], [], 0) # 0 = poll, noblock</span><span class="w"> - </span><span class="na">if len(h[0]) > 0:</span><span class="w"> - </span><span class="na">v</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">h[0][0].read()</span><span class="w"> - </span><span class="na">return v.rstrip()</span><span class="w"> - </span><span class="na">return None</span><span class="w"> - - </span><span class="na">argparser</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">argparse.ArgumentParser()</span><span class="w"> - </span><span class="na">argparser.add_argument('val', nargs</span><span class="o">=</span><span class="s">'?', default=stdincheck(), type=str, help='input val')</span><span class="w"> - </span><span class="na">args</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">argparser.parse_args(sys.argv[1:])</span><span class="w"> - - </span><span class="na">if args.val</span><span class="w"> </span><span class="o">=</span><span class="s">= None:</span><span class="w"> - </span><span class="na">argparser.error('value but be specified on stdin or as first positional argument')</span><span class="w"> - - </span><span class="na">print(args.val)</span> -</pre> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/python-pipe-args.sha256 b/drafts/python-pipe-args.sha256 @@ -1 +0,0 @@ -dfbd350e2938c179b1acba8eec950835b5f17669267b94ea7d559e915831a7f8 python-pipe-args.html -\ No newline at end of file diff --git a/drafts/python-virtualenv-interpreter.html b/drafts/python-virtualenv-interpreter.html @@ -1,76 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Virtualenv with different pythons</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li class="active"><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/python-virtualenv-interpreter.html" rel="bookmark" - title="Permalink to Virtualenv with different pythons">Virtualenv with different pythons</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-10-17T15:45:00+02:00"> - Sun 17 October 2021 - </time> -in <a class="category" href="../category/code.html">code</a> - <a href="../tag/docker.html">docker</a> - <a href="../tag/networking.html">networking</a> - <a href="../tag/iptables.html">iptables</a> - <a href="../tag/iproute.html">iproute</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- (.venv) cic-ussd $ export CPPFLAGS="-I/home/lash/src/ext/python/Python-3.8.6/Include -I/home/lash/src/ext/python/Python-3.8.6" -(.venv) cic-ussd $ export CFLAGS="-I/home/lash/src/ext/python/Python-3.8.6/Include -I/home/lash/src/ext/python/Python-3.8.6" -(.venv) cic-ussd $ pip download - -global-option=build_ext - -global-option "-I/home/lash/src/ext/Python-3.8.6/Include" - -index-url https://pypi.org/simple - -extra-index-url http://localhost/python - -no-binary :all: -d deps/ -r requirements.txt -bcrypt uses cffi, fails with missing header files Python.h and pyconfig.h --> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/python-virtualenv-interpreter.sha256 b/drafts/python-virtualenv-interpreter.sha256 @@ -1 +0,0 @@ -bb7f404e49154a8317c793c21e6de6ae39cc147e039f9f0ff11d15bb15ae441c python-virtualenv-interpreter.html -\ No newline at end of file diff --git a/drafts/qemu-host-fw.html b/drafts/qemu-host-fw.html @@ -1,77 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Isolating qemu networking from host</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li class="active"><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/qemu-host-fw.html" rel="bookmark" - title="Permalink to Isolating qemu networking from host">Isolating qemu networking from host</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-01-02T13:17:55+01:00"> - Sun 02 January 2022 - </time> -in <a class="category" href="../category/offlining.html">offlining</a> - <a href="../tag/qemu.html">qemu</a> - <a href="../tag/network.html">network</a> - <a href="../tag/iptables.html">iptables</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- code-block: bash - -iptables -N QEMU -iptables -A OUTPUT -o lo -m owner - -gid-owner 1009 -j QEMU -iptables -A QEMU -d 127.0.0.1/32 -j LOG -iptables -A QEMU -d 127.0.0.1/32 -j DROP --> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/qemu-host-fw.sha256 b/drafts/qemu-host-fw.sha256 @@ -1 +0,0 @@ -5fe95895cc160a284b36ad5c34c8536b2dc2130938305333a52b3d5e03d788a1 qemu-host-fw.html -\ No newline at end of file diff --git a/drafts/qemu-raw-partitions.html b/drafts/qemu-raw-partitions.html @@ -1,102 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Working with raw qemu partitions</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li><a href="../category/hygiene.html">Hygiene</a></li> - <li class="active"><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/qemu-raw-partitions.html" rel="bookmark" - title="Permalink to Working with raw qemu partitions">Working with raw qemu partitions</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-01-02T12:09:55+01:00"> - Sun 02 January 2022 - </time> -in <a class="category" href="../category/offlining.html">offlining</a> - <a href="../tag/qemu.html">qemu</a> - <a href="../tag/fdisk.html">fdisk</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <!-- code-block: bash - -$ fdisk -l raw.img -$ qemu-image resize raw.img +2G -$ fdisk -l raw.img -Disk raw.img: 4 GiB, 4294967296 bytes, 8388608 sectors -Units: sectors of 1 * 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0x79c2484b - -Device Boot Start End Sectors Size Id Type -raw.img1 * 2048 2193407 2191360 1G 83 Linux -raw.img2 2195454 4192255 1996802 975M 5 Extended -raw.img3 4192256 8388607 4196352 2G 83 Linux -raw.img5 2195456 4192255 1996800 975M 82 Linux swap / Solaris - -Partition table entries are not in disk order. -$ mke2fs -E offset=$(4192256*512) raw.img -$ sudo mount -o loop,offset=$(calc 2048*512),sizelimit=$(calc 2191360*512) /mnt/a -$ sudo mount -o loop,offset=$(calc 4192256*512) /mnt/b -$ sudo umount /mnt/b -$ losetup -f -P raw.img -$ lsblk -no NAME,UUID /dev/loop0 -loop0 -├─loop0p1 34b73576-e8c6-4ffb-a503-a9828639b5e9 -├─loop0p2 -├─loop0p3 ff6235cc-2f72-4551-a3d3-73d8df2e21b9 -└─loop0p5 0255cf3e-b10b-4522-8cfe-9ef8e2fc2d6a -$ echo "UUID=ff6235cc-2f72-4551-a3d3-73d8df2e21b9 /usr ext4 errors=remount-ro 0 2" >> /mnt/a/etc/fstab -$ sudo umount /mnt/a --> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/qemu-raw-partitions.sha256 b/drafts/qemu-raw-partitions.sha256 @@ -1 +0,0 @@ -3c756e008d33eb94c704650e80b729e3a4850b1c57e4cc53e55b39de086c89f8 qemu-raw-partitions.html -\ No newline at end of file diff --git a/drafts/swarm-qemu.html b/drafts/swarm-qemu.html @@ -1,103 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="../theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="../theme/css/syntax.css" /> - <title>man bytes gnu - Self-sufficient swarm on qemu</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="../">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li><a href="../category/archiving.html">Archiving</a></li> - <li><a href="../category/code.html">Code</a></li> - <li class="active"><a href="../category/hygiene.html">Hygiene</a></li> - <li><a href="../category/offlining.html">Offlining</a></li> - <li><a href="../pages/identities.html">Identities</a></li> - <li><a href="../pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="../drafts/swarm-qemu.html" rel="bookmark" - title="Permalink to Self-sufficient swarm on qemu">Self-sufficient Swarm: Self-sufficient swarm on qemu</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2021-06-23T12:49:00+02:00"> - Wed 23 June 2021 - </time> -in <a class="category" href="../category/hygiene.html">hygiene</a> - <a href="../tag/swarm.html">swarm</a> - <a href="../tag/golang.html">golang</a> - <a href="../tag/qemu.html">qemu</a> - </div> - - <div class="neighbors meta"> - <ul> - </ul> - </div> - <div class="entry-series meta"> -Part 1 from the series "Self-sufficient Swarm" - <ol class="entry-series-parts"> - </ol> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <div class="section" id="base-debian-qemu-install"> -<h2>base debian qemu install</h2> -<div class="highlight"><pre><span></span>dd <span class="k">if</span><span class="o">=</span>/dev/zero <span class="nv">of</span><span class="o">=</span>debootstrap.bin <span class="nv">count</span><span class="o">=</span><span class="m">10485760</span> <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> -mkfs.ext4 debootstrap.bin -mount -o loop debootstrap.bin /mnt -debootstrap --arch<span class="o">=</span>amd64 buster /mnt -</pre></div> -<div class="highlight"><pre><span></span>qemu-system-x86_64 -cdrom /mnt/iso/debian-10.9.0-amd64-xfce-CD-1.iso -hda debian.bin -hdb clef.bin -m 4g --enable-kvm -virtfs local,path<span class="o">=</span>/mnt,id<span class="o">=</span>foo,readonly<span class="o">=</span>on,mount_tag<span class="o">=</span>bar,security_model<span class="o">=</span>passthrough -</pre></div> -<div class="highlight"><pre><span></span>mount -t 9p -o <span class="nv">trans</span><span class="o">=</span>virtio mount_tag /mnt/resource -oversion<span class="o">=</span>9p2000.L,posixacl,msize<span class="o">=</span><span class="m">104857600</span>,cache<span class="o">=</span>loose -</pre></div> -</div> -<div class="section" id="clef-swarm-provisions"> -<h2>clef/swarm provisions</h2> -</div> -<div class="section" id="ethereum-node-provisions"> -<h2>ethereum node provisions</h2> -</div> -<div class="section" id="xdai-requisites"> -<h2>xdai requisites</h2> -</div> -<div class="section" id="mainchain-requisites"> -<h2>mainchain requisites</h2> -</div> -<div class="section" id="orchestration"> -<h2>orchestration</h2> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/drafts/swarm-qemu.sha256 b/drafts/swarm-qemu.sha256 @@ -1 +0,0 @@ -3a308c92c4aeca24fe79270bbe7769df46ee37fd39864ceaa78de32ee18221a1 swarm-qemu.html -\ No newline at end of file diff --git a/e53d7fec1bc9a9a36625b656b165ab49568a073aa45cb9335a362c443d5771ab b/e53d7fec1bc9a9a36625b656b165ab49568a073aa45cb9335a362c443d5771ab @@ -1,231 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <link rel="stylesheet" type="text/css" href="./theme/css/style.css" /> - <link rel="stylesheet" type="text/css" href="./theme/css/syntax.css" /> - <title>man bytes gnu - A portable book metadata exercise</title> - <meta charset="utf-8" /> - <meta name="generator" content="Pelican" /> - -</head> - -<body id="index" class="home"> - - <header id="banner" class="body"> - <h1>> <a href="./">man bytes gnu</a><span id="cursor">_</span></h1> - </header> - <nav id="menu"> - <ul> - <li class="active"><a href="./category/archiving.html">Archiving</a></li> - <li><a href="./category/code.html">Code</a></li> - <li><a href="./category/hygiene.html">Hygiene</a></li> - <li><a href="./category/offlining.html">Offlining</a></li> - <li><a href="./pages/identities.html">Identities</a></li> - <li><a href="./pages/shares.html">Shares</a></li> - - <li><a href="/tags.html">tags</a></li> - </ul> - <hr/> - </nav><!-- /#menu --> - <header> - <h1 class="entry-title top-body-title"> - <a href="./portable-book-metadata.html" rel="bookmark" - title="Permalink to A portable book metadata exercise">A portable book metadata exercise</a></h1> - - - <div class="category meta"> - Posted -<time class="published" datetime="2022-10-01T12:40:00+02:00"> - Sat 01 October 2022 - </time> -in <a class="category" href="./category/archiving.html">archiving</a> - <a href="./tag/hash.html">hash</a> - <a href="./tag/kitab.html">kitab</a> - <a href="./tag/literature.html">literature</a> - <a href="./tag/metadata.html">metadata</a> - <a href="./tag/dublincore.html">dublincore</a> - <a href="./tag/libgen.html">libgen</a> - </div> - - <div class="neighbors meta"> - <ul> - <li> - Previous: <a href="./backup-rsync-duplicity.html"> - Combining duplicity and rsync - </a> - </li> - </ul> - </div> - <div class="meta"> -<hr/> - </div> -</header> - -<section id="content" class="body"> - <div class="entry-content"> - <p>One of the things I have been working on the last few weeks is a rust application I have dubbed <a class="reference external" href="https://git.defalsify.net/kitab">kitab</a>.</p> -<p>In short, the application makes it easy to extract literary metadata to a separate file structure.</p> -<p>The metadata can in turn be applied as <em>extended attributes</em> recursively on a directory for files that match.</p> -<p>The way it's accomplished it simple: The file name of the metadata is the hex representation of the digest of the file. The same digest is used to match files to metadata when applying it back to the file.</p> -<p>There are two advantages to this:</p> -<ol class="arabic simple"> -<li>The digest of the media file need not be affected by the metadata, i.e. by embedding metadata in the file itself.</li> -<li>You do not need to use the file name to keep record of what a file is.</li> -</ol> -<div class="section" id="yarr-ye-matey-data"> -<h2>Yarr, ye matey-data</h2> -<p>Let's demonstrate with an example.</p> -<p>The fabulous <a class="reference external" href="https://libgen.rs">Library Genesis</a> project has made available an endpoint to retrieve <tt class="docutils literal">bibtex</tt> entries based on the <tt class="docutils literal">md5</tt> hash of the book media file.</p> -<p>A version of the <a class="reference external" href="https://libgen.rs/book/index.php?md5=BCD99F1AB4155F2A2A362E5B7938A852">Bitcoin White Paper</a>, under the <code>md5</code> hash <code>bcd99f1ab4155f2a2a362e5b7938a852</code>, can be found there.</p> -<p>If you download this file using a synchronous download link, the browser will provide you with a filename to go with the download.</p> -<p>However, if you use the torrent alternative, the filename will be the <tt class="docutils literal">md5</tt> hash itself. If you are torrenting a bunch of those files, it quickly becomes a nuisance to distinguish them.</p> -<p>And, of course: In either case there is no guarantee the any metadata comes with the file.</p> -<div class="section" id="inside-the-book"> -<h3>Inside the book</h3> -<p>Kitab (v0.0.2) is able to read metadata from both a bibtex source and xattr entries on a file, as well as its native <a class="reference external" href="https://www.w3.org/TR/turtle/">rdf-turtle</a> format.</p> -<p>In kitab's data store, every media file entity in rdf-turtle is keyed with a <a class="reference external" href="https://www.rfc-editor.org/info/rfc8141">URN</a> specifying a digest for the file.</p> -<p>To see exactly what that looks like, let's download and import the bibtex metadata for the paper <a class="footnote-reference" href="#footnote-1" id="footnote-reference-1">[1]</a>:</p> -<pre class="code bash literal-block"> -<span class="nv">bibtex_file</span><span class="o">=</span><span class="sb">`</span>mktemp<span class="sb">`</span> -<span class="nv">kitab_dir</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> -curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span>BCD99F1AB4155F2A2A362E5B7938A852 -o <span class="nv">$bibtex_file</span> -kitab --store <span class="nv">$kitab_dir</span> import --digest md5:BCD99F1AB4155F2A2A362E5B7938A852 <span class="nv">$bibtex_file</span> -cat <span class="nv">$kitab_dir</span>/* -</pre> -<p>The output of the above should be:</p> -<pre class="code turtle literal-block"> -<span class="nv"><URN:md5:bcd99f1ab4155f2a2a362e5b7938a852></span> <span class="nv"><https://purl.org/dc/terms/title></span> <span class="s">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> -<span class="nv"><https://purl.org/dc/terms/creator></span> <span class="s">"Satoshi Nakamoto"</span> <span class="p">;</span> -<span class="nv"><https://purl.org/dc/terms/type></span> <span class="s">"book"</span> <span class="p">.</span> -</pre> -<p>Now let's say the media file itself has been downloaded to <tt class="docutils literal"><span class="pre">~/.local/share/transmission</span></tt>. We can apply this metadata as extended attributes.</p> -<p>This time we turn on logging to see what's going on:</p> -<pre class="code console literal-block"> -<span class="gp">$ </span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab --store <span class="nv">$kitab_dir</span> apply --digest md5 ~/.local/share/transmission -<span class="go">[2022-10-01T11:14:59Z INFO kitab] have index directory "/tmp/tmp.r0jBm6q4hW" -[2022-10-01T11:14:59Z INFO kitab] using digest type md5 -[2022-10-01T11:14:59Z INFO kitab] apply from path "/home/lash/.local/share/transmission/" -[2022-10-01T11:14:59Z INFO kitab] apply DirEntry("/home/lash/.local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852") -> title "Bitcoin: A Peer-to-Peer Electronic Cash System" author "Satoshi Nakamoto" digest md5:bcd99f1ab4155f2a2a362e5b7938a852 - -</span><span class="gp">$ </span>find ~/.local/share/transmission -type f -regextype sed -regex <span class="s2">".*/[a-f0-9]\{32\}</span>$<span class="s2">"</span> -exec getfattr -d <span class="o">{}</span> <span class="se">\;</span> -<span class="gp"># </span>file: .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 -<span class="go">user.dcterms:creator="Satoshi Nakamoto" -user.dcterms:title="Bitcoin: A Peer-to-Peer Electronic Cash System" -user.dcterms:type="book"</span> -</pre> -</div> -<div class="section" id="let-the-right-one-in"> -<h3>Let the right one in</h3> -<p>Conversely, the metadata can be re-imported directly from the extended attributes. And this time, let's store it both under the <tt class="docutils literal">md5</tt> and the <tt class="docutils literal">sha512</tt> hash:</p> -<pre class="code bash literal-block"> -$ <span class="nv">kitab_dir_new</span><span class="o">=</span><span class="sb">`</span>mktemp -d<span class="sb">`</span> -$ kitab --store <span class="nv">$kitab_dir_new</span> import --digest md5 --digest sha512 .local/share/transmission/bcd99f1ab4155f2a2a362e5b7938a852 -$ find <span class="nv">$kitab_dir_new</span> -type f -exec cat <span class="o">{}</span> <span class="se">\;</span> -/tmp/tmp.B6j41YMmEM/493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792 -<URN:sha512:493f2a720d63156d77187bcd5f0715e4e765a38d616ef47f24e0df817ee6b4f601d47a06ffae10ef1f6ba60bb5d2e99a26318f035f9cd56e30bfe7bcdf64a792> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> - <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> - <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> - <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . -/tmp/tmp.B6j41YMmEM/bcd99f1ab4155f2a2a362e5b7938a852 -<URN:md5:bcd99f1ab4155f2a2a362e5b7938a852> <https://purl.org/dc/terms/title> <span class="s2">"Bitcoin: A Peer-to-Peer Electronic Cash System"</span> <span class="p">;</span> - <https://purl.org/dc/terms/creator> <span class="s2">"Satoshi Nakamoto"</span> <span class="p">;</span> - <https://purl.org/dc/terms/type> <span class="s2">"book"</span> <span class="p">;</span> - <https://purl.org/dc/terms/MediaType> <span class="s2">"application/epub+zip"</span> . -</pre> -</div> -</div> -<div class="section" id="level-up"> -<h2>Level up</h2> -<p>Finally, a bash script <a class="footnote-reference" href="#footnote-2" id="footnote-reference-2">[2]</a> example that lets you retrieve and apply metadata for a batch of files found in the directory given as the <em>first positional arg</em>.</p> -<p>This script even renames the files according to the metadata applied.</p> -<pre class="code bash literal-block"> -<span class="ln"> 0 </span><span class="c1"># NOTE! this will only work if your fs supports xattr. -</span><span class="ln"> 1 </span><span class="c1"># That's why we cannot use tmpfs (mktemp) here; tmpfs does not support xattr. -</span><span class="ln"> 2 </span><span class="c1"></span><span class="nv">outdir</span><span class="o">=</span>./<span class="k">$(</span>uuidgen<span class="k">)</span> -<span class="ln"> 3 </span>mkdir -vp <span class="nv">$outdir</span> -<span class="ln"> 4 </span> -<span class="ln"> 5 </span><span class="c1"># input dir is the first positional arg -</span><span class="ln"> 6 </span><span class="c1"></span><span class="nv">indir</span><span class="o">=</span><span class="nv">$1</span> -<span class="ln"> 7 </span> -<span class="ln"> 8 </span><span class="nv">IFS</span><span class="o">=</span><span class="s1">$'\n'</span> -<span class="ln"> 9 </span> -<span class="ln">10 </span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>find <span class="nv">$indir</span> -type f<span class="k">)</span><span class="p">;</span> <span class="k">do</span> -<span class="ln">11 </span> <span class="nv">sum</span><span class="o">=</span><span class="k">$(</span>md5sum <span class="nv">$f</span> <span class="p">|</span> awk <span class="s1">'{print $1;}'</span><span class="k">)</span> -<span class="ln">12 </span> <span class="nb">echo</span> <span class="s2">"downloading metadata for </span><span class="nv">$indir</span><span class="s2">/</span><span class="nv">$f</span><span class="s2">"</span> -<span class="ln">13 </span> <span class="nv">srct</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> -<span class="ln">14 </span> curl -s -X GET https://libgen.rs/book/bibtex.php?md5<span class="o">=</span><span class="nv">$sum</span> -o <span class="nv">$srct</span> -<span class="ln">15 </span> <span class="nv">dstt</span><span class="o">=</span><span class="k">$(</span>mktemp<span class="k">)</span> -<span class="ln">16 </span> xmllint --html --xpath <span class="s1">'string(/html/body/textarea[@id="bibtext"])'</span> <span class="nv">$srct</span> > <span class="nv">$dstt</span> -<span class="ln">17 </span> kitab import --digest md5:<span class="nv">$sum</span> <span class="nv">$dstt</span> -<span class="ln">18 </span> cp <span class="nv">$f</span> <span class="nv">$outdir</span>/ -<span class="ln">19 </span><span class="k">done</span> -<span class="ln">20 </span> -<span class="ln">21 </span><span class="nv">RUST_LOG</span><span class="o">=</span>info kitab apply --digest md5 <span class="nv">$outdir</span>/ -<span class="ln">22 </span> -<span class="ln">23 </span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>ls <span class="nv">$outdir</span><span class="k">)</span><span class="p">;</span> <span class="k">do</span> -<span class="ln">24 </span> <span class="nv">title</span><span class="o">=</span><span class="k">$(</span>getfattr --only-values -n user.dcterms:title <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> -<span class="ln">25 </span> -<span class="ln">26 </span> <span class="nv">f_typ</span><span class="o">=</span><span class="k">$(</span>file -b --mime-type <span class="nv">$outdir</span>/<span class="nv">$f</span><span class="k">)</span> -<span class="ln">27 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">""</span> -<span class="ln">28 </span> <span class="k">case</span> <span class="s2">"</span><span class="nv">$f_typ</span><span class="s2">"</span> <span class="k">in</span> -<span class="ln">29 </span> <span class="s2">"application/pdf"</span><span class="o">)</span> -<span class="ln">30 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".pdf"</span> -<span class="ln">31 </span> <span class="p">;;</span> -<span class="ln">32 </span> <span class="s2">"application/epub+zip"</span><span class="o">)</span> -<span class="ln">33 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".epub"</span> -<span class="ln">34 </span> <span class="p">;;</span> -<span class="ln">35 </span> <span class="s2">"application/x-mobipocket-ebook"</span><span class="o">)</span> -<span class="ln">36 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".mobi"</span> -<span class="ln">37 </span> <span class="p">;;</span> -<span class="ln">38 </span> <span class="s2">"text/plain"</span><span class="o">)</span> -<span class="ln">39 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".txt"</span> -<span class="ln">40 </span> <span class="p">;;</span> -<span class="ln">41 </span> <span class="s2">"text/html"</span><span class="o">)</span> -<span class="ln">42 </span> <span class="nv">f_ext</span><span class="o">=</span><span class="s2">".html"</span> -<span class="ln">43 </span> <span class="p">;;</span> -<span class="ln">44 </span> *<span class="o">)</span> -<span class="ln">45 </span> ><span class="p">&</span><span class="m">2</span> <span class="nb">echo</span> unhandled mime <span class="nb">type</span> <span class="nv">$f_typ</span> -<span class="ln">46 </span> <span class="nb">exit</span> <span class="m">1</span> -<span class="ln">47 </span> <span class="k">esac</span> -<span class="ln">48 </span> mv -v <span class="nv">$outdir</span>/<span class="nv">$f</span> <span class="nv">$outdir</span>/<span class="si">${</span><span class="nv">title</span><span class="si">}${</span><span class="nv">f_ext</span><span class="si">}</span> -<span class="ln">49 </span><span class="k">done</span> -</pre> -<p>This last example will result in:</p> -<ul class="simple"> -<li>A media file named <tt class="docutils literal">$outdir/Bitcoin: A <span class="pre">Peer-to-Peer</span> Electronic Cash System.epub</tt></li> -<li>... with metadata applied as extended attributes</li> -<li>An rdf-turtle metadata entry in <tt class="docutils literal"><span class="pre">~/.local/share/kitab/idx/bcd99f1ab4155f2a2a362e5b7938a852</span></tt></li> -</ul> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-1" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-1">[1]</a></td><td>The <code>kitab</code> command in the script assumes you have built the <em>kitab binary</em> and made it available in your path.</td></tr> -</tbody> -</table> -</blockquote> -<!-- --> -<blockquote> -<table class="docutils footnote" frame="void" id="footnote-2" rules="none"> -<colgroup><col class="label" /><col /></colgroup> -<tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-2">[2]</a></td><td>the script uses <cite>xmllint</cite> which on archlinux is provided by the <tt class="docutils literal">libxml2</tt> package.</td></tr> -</tbody> -</table> -</blockquote> -</div> - - </div><!-- /.entry-content --> - <footer class="meta"> - </footer> - -</section> - <footer id="contentinfo" class="body"> - <hr/> - <address id="about" class="vcard body"> - Powered by <a title="Pelican is a static site generator" href="https://getpelican.com/">Pelican</a> | <a title="manbytesgnu.com is licensed under Creative Commons Attribution-ShareAlike 4.0 International" href="https://holbrook.no/share/licenses/cc/cc-by-sa-4.0.txt">CC-BY-SA 4.0</a> | <a title="GIT site history since jan 15th 2022" href="https://git.defalsify.org/manbytesgnu_site">Site history</a> | ETH <a href="./images/donate_eth_qr.png" title="Ethereum address for tipping">0x185Cbce7650FF7Ad3B587E26B2877d95568805e3</a> | BTC <a href="./images/donate_btc_qr.png" title="Bitcoin address for tipping">12DnRH9HpJ6cfET2LKHrURn2yZBDfDEwHv</a> - </address><!-- /#about --> - </footer><!-- /#contentinfo --> -</body> -</html> -\ No newline at end of file diff --git a/e53d7fec1bc9a9a36625b656b165ab49568a073aa45cb9335a362c443d5771ab.asc b/e53d7fec1bc9a9a36625b656b165ab49568a073aa45cb9335a362c443d5771ab.asc @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NnsACgkQzcvSTdHQ -4AGIrAf8Cyhpu/S9mHvUrgih4EA7pOgfKDf9KDa7bJn5mYsmlAMsEyn1ZslRiFeh -6muQoPsmg10KwOeDfq1iiDqHaZP+njyXZe4eSfSB0oasMvIH6741nJO43yIUd5A+ -qbOvANN1hS+3ttA9O9EcJL7yDhg1gh9rq4YFZxIDKFJwc5qQRHangI59FrSWF4A6 -JEgYTjmmsgoSvabFgNuHeh6MaBLEX8hqWe6p0Ah5sKqzUaVq3b1RO/IGWmWhmYm1 -wp0xTAtT8r1htCmtU1GkaHkdMmfZfwWyT/3VcDul+EK88JR2v3puizfnvYOuC4ZB -fJOWmwtdySSfB9XXUO6traqXWFpTnA== -=yI19 ------END PGP SIGNATURE----- diff --git a/f72f88a69eb494ae7f8cbf441683bf156bebf44039b25e723d03d5ed44e0c3e4.asc b/f72f88a69eb494ae7f8cbf441683bf156bebf44039b25e723d03d5ed44e0c3e4.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4NzwACgkQzcvSTdHQ -4AGduQgArG+mF1HTd7QwCU+Q2pN5PjDDEBBLJs9cFrVPcIBUyYo2tUOrxYH3JiY5 -BzJbpaKrHws4715WZBgOyLXkMQSiH4bFBFjUJeGJMxQbZ4tjOL5ugm3nflQyRVWU -NaABSo6DX4CmC6nYMV0G/qrDXoULArop060AsIsEApwP5n+4w2Qd5k1aLQ/FKWfW -iKbMyCDJz6fgEtrUg1sJ6G2gS3fzm7HEqaduLF6v+viKv6bLQAzIhnMAeujqADFk -9VyfLG54VKl1j797s0cgLvDt3BxUTFUPozOEHj1MWi/pvc7k+GSeYjBVsJ47SlZG -gOO33lhSWrRY27GEkdplS/sdMkP50A== -=QXdp +iQEzBAABCAAdFiEEWahEpISsESU9Oj6dzcvSTdHQ4AEFAmM4PhwACgkQzcvSTdHQ +4AGKDgf+JgAjRBL6z3URsL6Bq9dXT6+bll98S4a8PuS2K8/ne/L1GdSv3bExwFri +HXaQWYxiCXssHScdhOIU+2WMA2e/if2U45gYA9/oVNFR2Kg/S4YsqK25Pl5Nk3D7 +IbLejnzLYbJsCP5j/H7X8YFCNpj9AW5+bnEZT21NLExUaI+ZN9jjsw1M5cOSQswb +u20dc3nonNHRp/hx5AtDpnRgSnup030sr45MmZQn9SM2ws/4r1JIAWf+ZI8IctTx +hOHaOeRB+i9vZu1ezYdXVsERHI4xVRkiTVcJga+7csauMcCGMBn+bWcRaSl7wvZw +Qngdz7s8kNCwertylkDHD7r4/JxjiA== +=OaEZ -----END PGP SIGNATURE----- diff --git a/portable-book-metadata.html b/portable-book-metadata.html @@ -151,7 +151,7 @@ $ find <span class="nv">$kitab_dir_new</span> -type f -exec cat <span class="o"> <span class="ln"> 9 </span> <span class="ln">10 </span><span class="nv">IFS</span><span class="o">=</span><span class="s1">$'\n'</span> <span class="ln">11 </span> -<span class="ln">12 </span><span class="c1"># Retrieve metadata for each file and import it into. +<span class="ln">12 </span><span class="c1"># Retrieve metadata for each file and import it into the kitab store. </span><span class="ln">13 </span><span class="c1"># Also copy the media file to the separate output directory. </span><span class="ln">14 </span><span class="c1"></span><span class="k">for</span> f <span class="k">in</span> <span class="k">$(</span>find <span class="nv">$indir</span> -type f<span class="k">)</span><span class="p">;</span> <span class="k">do</span> <span class="ln">15 </span> <span class="nv">sum</span><span class="o">=</span><span class="k">$(</span>md5sum <span class="nv">$f</span> <span class="p">|</span> awk <span class="s1">'{print $1;}'</span><span class="k">)</span> @@ -216,7 +216,7 @@ $ find <span class="nv">$kitab_dir_new</span> -type f -exec cat <span class="o"> <table class="docutils footnote" frame="void" id="footnote-2" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#footnote-reference-2">[2]</a></td><td>the script uses <cite>xmllint</cite> which on archlinux is provided by the <tt class="docutils literal">libxml2</tt> package.</td></tr> +<tr><td class="label"><a class="fn-backref" href="#footnote-reference-2">[2]</a></td><td>the script uses <code>xmllint</code> which on archlinux is provided by the <tt class="docutils literal">libxml2</tt> package.</td></tr> </tbody> </table> </blockquote> diff --git a/portable-book-metadata.sha256 b/portable-book-metadata.sha256 @@ -1 +1 @@ -ca197565fb955f2328bcc11540521adebeb2d0f95d6501901516eb76fb25707c portable-book-metadata.html -\ No newline at end of file +37f77922ca667d5ced9d58cdc642bacb89fa428365585bad4aa09a6e9ab67d82 portable-book-metadata.html +\ No newline at end of file