<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jakub Olczyk</title><link href="https://jakub.olczyk.info/" rel="alternate"></link><link href="https://jakub.olczyk.info/feeds/all.atom.xml" rel="self"></link><id>https://jakub.olczyk.info/</id><updated>2026-07-03T18:00:00+02:00</updated><subtitle>(ir)regular expressions blog</subtitle><entry><title>Bobomen - letnia zupa ala Ramen</title><link href="https://jakub.olczyk.info/bobomen-letnia-zupa-ala-ramen-pl.html" rel="alternate"></link><published>2026-07-03T18:00:00+02:00</published><updated>2026-07-03T18:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2026-07-03:/bobomen-letnia-zupa-ala-ramen-pl.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Przepis znaleziony na instagramie.&lt;/p&gt;
&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;h4&gt;Na wywar&lt;/h4&gt;
&lt;p&gt;Składniki aromatyczne
(można zastąpić pastą koreańską; powinna pojawić się kiedyś na tym blogu)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 szalotka&lt;/li&gt;
&lt;li&gt;3 ząbki czosnku&lt;/li&gt;
&lt;li&gt;Kawałek imbiru&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Składniki konieczne:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 łyżka oleju sezamowego &lt;/li&gt;
&lt;li&gt;1 łyżka pasty miso&lt;/li&gt;
&lt;li&gt;2 łyżki tahini&lt;/li&gt;
&lt;li&gt;Pół łyżeczki cukru&lt;/li&gt;
&lt;li&gt;Skórka z połowy cytryny (lub trochę więcej do smaku)&lt;/li&gt;
&lt;li&gt;600 ml bulionu warzywnego&lt;/li&gt;
&lt;li&gt;200 g mleczka kokosowego&lt;/li&gt;
&lt;li&gt;Odrobina soku z cytryny&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Do podania:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Ok. 250 g bobu&lt;/li&gt;
&lt;li&gt;Makaron azjatycki - ramen, udon, mie (na co się ma ochotę)&lt;/li&gt;
&lt;li&gt;Jajka&lt;/li&gt;
&lt;li&gt;Dymka&lt;/li&gt;
&lt;li&gt;Olej chilli&lt;/li&gt;
&lt;li&gt;Plaster cytryny &lt;/li&gt;
&lt;li&gt;Opcjonalnie: płatki chilli, odrobina sosu sojowego do smaku&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;p&gt;Makaron, bób, jajka - najlepiej wstawić i ugotować zanim zaczniemy robić wywar.&lt;/p&gt;
&lt;p&gt;Wywar zaczynamy od podsmażenia aromatycznych składników. Następnie dodajemy
składniki konieczne i czekamy aż się chwilę podgotują. Wywar na koniec
blendujemy.&lt;/p&gt;
&lt;p&gt;Podawać w miskach do ramenu - i przybrać składnikami do podania, na koniec zalewając wywarem.&lt;/p&gt;
&lt;p&gt;Smacznego!&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Książki 2026</title><link href="https://jakub.olczyk.info/ksiazki-2026-pl.html" rel="alternate"></link><published>2026-07-02T00:00:00+02:00</published><updated>2026-07-02T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2026-07-02:/ksiazki-2026-pl.html</id><summary type="html"></summary><content type="html">&lt;script src="https://jakub.olczyk.info/theme/sorttable.js"&gt;&lt;/script&gt;&lt;p&gt;Z jakiegoś powodu w poprzednim roku nie było książek które chciałbym polecić. Chyba nie trafiły mi się po prostu odpowiednie tytuły.&lt;/p&gt;
&lt;table border="1" class="sortable docutils"&gt;
&lt;caption&gt;Lista książek 2026&lt;/caption&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Tytuł&lt;/th&gt;
&lt;th class="head"&gt;Autor&lt;/th&gt;
&lt;th class="head"&gt;Notatki&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Łakome&lt;/td&gt;
&lt;td&gt;Małgorzata Lebda&lt;/td&gt;
&lt;td&gt;Ciekawa proza, podobał mi się dość minimalny styl, który jednoczenie pozwalał wyobraźni pracować.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The Society of the Crossed Keys&lt;/td&gt;
&lt;td&gt;Stefan Zweig, Wes Anderson&lt;/td&gt;
&lt;td&gt;Bardzo wciągająca proza Zweiga w wyborze prezentowanym przez Wesa Andersona. Przyjemny sposób na zapoznanie się z twórczością autora, który zainspirował &lt;a class="reference external" href="https://www.imdb.com/title/tt2278388"&gt;The Grand Budapest Hotel&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content><category term="posts"></category><category term="list"></category><category term="recommendation"></category></entry><entry><title>Notes: mise-en-place</title><link href="https://jakub.olczyk.info/notes-mise-en-place.html" rel="alternate"></link><published>2026-06-22T00:00:00+02:00</published><updated>2026-06-22T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2026-06-22:/notes-mise-en-place.html</id><summary type="html"></summary><content type="html">&lt;p&gt;DISCLAIMER: this is not meant to be coherent post. Sorry. Just notes for future
reference. There will probably be some future updates here.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mise.jdx.dev/"&gt;mise-en-place&lt;/a&gt; is a very useful tool when working with projects that utilise different versions of tools. 
To quote the description:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your dev env, already prepped.&lt;/p&gt;
&lt;p&gt;One tool to manage languages, env vars, and tasks per project, reproducibly. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I highly recommend it as it allows for seemless switching between versions.&lt;/p&gt;
&lt;h2&gt;How to have multiple aliases of the same tool available via &lt;code&gt;mise&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;Sometimes when migrating old terraform state files you need to be able to run &lt;code&gt;terraform refresh&lt;/code&gt; with different versions. 
Switching between versions just to run this command is rather painful 
(especially when migrating multiple terragrunt units with separate statefiles; going back and forth with the same tf versions is repetitive and dull…).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;terraform0.12&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mise x terraform@0.12 -- terraform&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;terraform0.13&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mise x terraform@0.13 -- terraform&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;terraform1.8&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mise x terraform@1.8 -- terraform&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="technical"></category><category term="notes"></category><category term="devops"></category><category term="bash"></category><category term="linux"></category></entry><entry><title>Notes: ELK stack</title><link href="https://jakub.olczyk.info/notes-elk-stack.html" rel="alternate"></link><published>2026-02-03T00:00:00+01:00</published><updated>2026-02-03T00:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2026-02-03:/notes-elk-stack.html</id><summary type="html"></summary><content type="html">&lt;p&gt;DISCLAIMER: this is not meant to be coherent post. Sorry. Just notes for future
reference. There will probably be some future updates here.&lt;/p&gt;
&lt;h2&gt;ElasticSearch / OpenSearch index reindexing&lt;/h2&gt;
&lt;p&gt;Sometimes the process of reindexing fails and you're left with partially copied data in the new index. 
It is sometimes more useful to drop it and start again, but when the index is particularly big the sanest option might be 
to just copy the missing data from the source to target.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;POST _reindex?slices=5&amp;amp;wait_for_completion=false
{
  &amp;quot;conflicts&amp;quot;: &amp;quot;proceed&amp;quot;,
  &amp;quot;source&amp;quot;: {
    &amp;quot;index&amp;quot;: &amp;quot;source-2026.10&amp;quot;
  },
  &amp;quot;dest&amp;quot;: {
    &amp;quot;index&amp;quot;: &amp;quot;target-2026.10&amp;quot;,
    &amp;quot;op_type&amp;quot;: &amp;quot;create&amp;quot; 
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/reindex-indices#version-conflicts"&gt;Docs link&lt;/a&gt;&lt;/p&gt;</content><category term="technical"></category><category term="notes"></category><category term="devops"></category><category term="monitoring"></category></entry><entry><title>Notes: Terragrunt</title><link href="https://jakub.olczyk.info/notes-terragrunt.html" rel="alternate"></link><published>2025-03-14T18:20:00+01:00</published><updated>2025-03-14T18:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2025-03-14:/notes-terragrunt.html</id><summary type="html"></summary><content type="html">&lt;p&gt;DISCLAIMER: this is not meant to be coherent post. Sorry. Just notes for future
reference. There will probably be some future updates here.&lt;/p&gt;
&lt;h2&gt;Terragrunt produces error on &lt;code&gt;terragrunt plan&lt;/code&gt; for mocked outputs&lt;/h2&gt;
&lt;p&gt;If you mocked outputs in your terragrunt configuration, you might get an error
when running &lt;code&gt;terragrunt plan&lt;/code&gt; when the output of a dependency have not been yet applied.
This can be dealt with by refreshing the state of the dependency:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# example terragrunt.hcl file

terraform {
  source = &amp;quot;some-module&amp;quot;
}

dependency &amp;quot;vpc&amp;quot; {
  config_path = &amp;quot;../vpc&amp;quot;
  mock_outputs = {
    vpc_name = &amp;quot;my-vpc&amp;quot; # not yet applied
  }
  mock_outputs_allowed_terraform_commands = [&amp;quot;plan&amp;quot;, &amp;quot;apply&amp;quot;]
}

inputs = {
  vpc_id = dependency.vpc.outputs.vpc_name
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This could produce an error like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;28.341&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;terragrunt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hcl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Unsupported&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;attribute&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;does&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;have&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;an&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;attribute&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;named&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vpc_name&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;diagnostic&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;28.341&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Unable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;determine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;underlying&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Terragrunt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;will&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To fix this, you can refresh the state of the dependency:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;terragrunt&lt;span class="w"&gt; &lt;/span&gt;refresh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="technical"></category><category term="notes"></category><category term="terragrunt"></category><category term="devops"></category><category term="terraform"></category></entry><entry><title>Notes: useful shell commands</title><link href="https://jakub.olczyk.info/notes-useful-shell-commands.html" rel="alternate"></link><published>2024-06-03T00:00:00+02:00</published><updated>2024-06-03T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2024-06-03:/notes-useful-shell-commands.html</id><summary type="html">&lt;p&gt;a short reference for future use&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Diffing two directories&lt;/h2&gt;
&lt;p&gt;Useful for when you have some changes that should be copied over to another
directory.&lt;/p&gt;
&lt;p&gt;Options to use:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;       &lt;/span&gt;-q,&lt;span class="w"&gt; &lt;/span&gt;--brief
&lt;span class="w"&gt;              &lt;/span&gt;report&lt;span class="w"&gt; &lt;/span&gt;only&lt;span class="w"&gt; &lt;/span&gt;when&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;differ
&lt;span class="w"&gt;       &lt;/span&gt;-s,&lt;span class="w"&gt; &lt;/span&gt;--report-identical-files
&lt;span class="w"&gt;              &lt;/span&gt;report&lt;span class="w"&gt; &lt;/span&gt;when&lt;span class="w"&gt; &lt;/span&gt;two&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;are&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;same
&lt;span class="w"&gt;       &lt;/span&gt;-r,&lt;span class="w"&gt; &lt;/span&gt;--recursive
&lt;span class="w"&gt;              &lt;/span&gt;recursively&lt;span class="w"&gt; &lt;/span&gt;compare&lt;span class="w"&gt; &lt;/span&gt;any&lt;span class="w"&gt; &lt;/span&gt;subdirectories&lt;span class="w"&gt; &lt;/span&gt;found
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Example&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;diff&lt;span class="w"&gt; &lt;/span&gt;-qsr&lt;span class="w"&gt; &lt;/span&gt;left/&lt;span class="w"&gt; &lt;/span&gt;right/
Only&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;right/:&lt;span class="w"&gt; &lt;/span&gt;anotherfile.txt
Files&lt;span class="w"&gt; &lt;/span&gt;left/file0.txt&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;right/file0.txt&lt;span class="w"&gt; &lt;/span&gt;are&lt;span class="w"&gt; &lt;/span&gt;identical
Files&lt;span class="w"&gt; &lt;/span&gt;left/file.txt&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;right/file.txt&lt;span class="w"&gt; &lt;/span&gt;differ
Only&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;left/:&lt;span class="w"&gt; &lt;/span&gt;secondfile.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Running bash function with &lt;code&gt;xargs&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;I sometime use bash functions as a more complex alias mechanism in Bash. 
It is useful to use them with xargs when passing arguments through a pipe.&lt;/p&gt;
&lt;p&gt;Here's an example of this concept:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;echo_var&lt;span class="o"&gt;(){&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;echo_var&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xargs&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-P&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;echo_var &amp;quot;$@&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;_
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I found this solution on &lt;a href="https://stackoverflow.com/a/77809106/"&gt;StackOverflow&lt;/a&gt;&lt;/p&gt;</content><category term="technical"></category><category term="notes"></category><category term="linux"></category><category term="bash"></category><category term="devops"></category></entry><entry><title>Książki 2024</title><link href="https://jakub.olczyk.info/ksiazki-2024-pl.html" rel="alternate"></link><published>2024-02-22T00:00:00+01:00</published><updated>2024-06-11T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2024-02-22:/ksiazki-2024-pl.html</id><summary type="html"></summary><content type="html">&lt;script src="https://jakub.olczyk.info/theme/sorttable.js"&gt;&lt;/script&gt;&lt;p&gt;Kolejny rok i kolejna lista. Mam nadzieję, że w tym roku uda się przeczytać
jeszcze więcej ciekawych pozycji.&lt;/p&gt;
&lt;table border="1" class="sortable docutils"&gt;
&lt;caption&gt;Lista książek&lt;/caption&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Tytuł&lt;/th&gt;
&lt;th class="head"&gt;Autor&lt;/th&gt;
&lt;th class="head"&gt;Notatki&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;All Systems Red&lt;/td&gt;
&lt;td&gt;Martha Wells&lt;/td&gt;
&lt;td&gt;Start serii o Murderbocie. Niesamowicie wciągająca seria. Tutaj wpisuję w kolejności czytania.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Artificial Condition&lt;/td&gt;
&lt;td&gt;Martha Wells&lt;/td&gt;
&lt;td&gt;Nowelka #2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Rogue Protocol&lt;/td&gt;
&lt;td&gt;Martha Wells&lt;/td&gt;
&lt;td&gt;Nowelka #3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Exit Strategy&lt;/td&gt;
&lt;td&gt;Martha Wells&lt;/td&gt;
&lt;td&gt;Nowelka #4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Network Effect&lt;/td&gt;
&lt;td&gt;Martha Wells&lt;/td&gt;
&lt;td&gt;Pierwsza dłuższa książka w serii. Myślę, że jak skończe to przydałoby się napisać o tym osobny wpis. Dawno nie podobała mi się tak seria SF.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Dune&lt;/td&gt;
&lt;td&gt;Frank Herbert&lt;/td&gt;
&lt;td&gt;Nie trzeba raczej przedstawiać. Zbyt długo mi zeszło, żeby się za tę książkę zabrać. Na szczęście nowa ekranizacja zmotywowała.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Straż! Straż!&lt;/td&gt;
&lt;td&gt;Terry Pratchett&lt;/td&gt;
&lt;td&gt;Bardzo szybkie czytadło na czas letni. Idealne do oderwania myśli od wyrwania zęba mądrości.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ameryka nie istnieje&lt;/td&gt;
&lt;td&gt;Wojciech Orliński&lt;/td&gt;
&lt;td&gt;Dobra książka podsumowująca wpływ popkulury (czy może amerykańskiej propagandy?) i tego jak kreuje wyobrażenia o rzeczywistości.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content><category term="posts"></category><category term="list"></category><category term="recommendation"></category></entry><entry><title>Książki 2023</title><link href="https://jakub.olczyk.info/ksiazki-2023-pl.html" rel="alternate"></link><published>2023-08-28T00:00:00+02:00</published><updated>2023-08-28T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2023-08-28:/ksiazki-2023-pl.html</id><summary type="html"></summary><content type="html">&lt;script src="https://jakub.olczyk.info/theme/sorttable.js"&gt;&lt;/script&gt;&lt;p&gt;Poniżej lista książek, które uważam za wartościowe i przeczytałem w ciągu
długiego roku 2020-2023. Lista pewnie się zaktualizuje jak sięgnę pamięcią do
początku tego &amp;quot;roku&amp;quot; ;)&lt;/p&gt;
&lt;table border="1" class="sortable docutils"&gt;
&lt;caption&gt;Lista książek&lt;/caption&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Tytuł&lt;/th&gt;
&lt;th class="head"&gt;Autor&lt;/th&gt;
&lt;th class="head"&gt;Notatki&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Nic się nie działo. Historia życia mojej babki&lt;/td&gt;
&lt;td&gt;Tomasz S Markiewka&lt;/td&gt;
&lt;td&gt;Bardzo ciekawa historia rodzinna. W tle Wielka Historia i zmiany jakie przynosi.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Taśmy rodzinne&lt;/td&gt;
&lt;td&gt;Maciej Marcisz&lt;/td&gt;
&lt;td&gt;Wciągający debiut. Historia rodziny, jej wzlotów i upadków na przestrzeni transformacji do &amp;quot;teraz&amp;quot;. Czyta się jak autobiografię, choć to fikcja.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The 99% Invisible City: A Field Guide to the Hidden World of Everyday Design&lt;/td&gt;
&lt;td&gt;Roman Mars&lt;/td&gt;
&lt;td&gt;Interesujący zbiór esejów na temat design'u miasta, infrastruktury oraz wszystkiego co zwykle pomijamy, a jednak jest ciekawe, gdy się temu bliżej przyjrzeć.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Seria Lockwood &amp;amp; Co.&lt;/td&gt;
&lt;td&gt;Jonathan Stroud&lt;/td&gt;
&lt;td&gt;Netflix zrobił YA show (którego już nie ma), a chciałem wiedzieć jak to się skończyło :P&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Pańszczyzna. Prawdziwa historia polskiego niewolnictwa&lt;/td&gt;
&lt;td&gt;Kamil Janicki&lt;/td&gt;
&lt;td&gt;Ludowa historia Polski. Bardzo ciekawe, szczególnie w zestawieniu jak wyglądała pańszczyzna na zachodzie.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Life in a Medieval Village&lt;/td&gt;
&lt;td&gt;Frances Gies, Joseph Gies&lt;/td&gt;
&lt;td&gt;Doskonałe uzupełnienie do &amp;quot;Pańszczyzny&amp;quot; Janickiego. Sama w sobie, świetna seria!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Life in a Medieval City&lt;/td&gt;
&lt;td&gt;Frances Gies, Joseph Gies&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content><category term="posts"></category><category term="list"></category><category term="recommendation"></category></entry><entry><title>Korzenne ciasto dyniowe</title><link href="https://jakub.olczyk.info/korzenne-ciasto-dyniowe-pl.html" rel="alternate"></link><published>2023-02-04T18:00:00+01:00</published><updated>2023-02-04T18:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2023-02-04:/korzenne-ciasto-dyniowe-pl.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Źródło: &lt;a href="https://www.allrecipes.com/recipe/235259/vegan-pumpkin-pie-blondies/"&gt;Vegan pumpkin pie blondies&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;480g mąka&lt;/li&gt;
&lt;li&gt;425g puree z dyni&lt;/li&gt;
&lt;li&gt;115g cukier&lt;/li&gt;
&lt;li&gt;55g  brązowy cukier&lt;/li&gt;
&lt;li&gt;1 łyżeczka soda do pieczenia&lt;/li&gt;
&lt;li&gt;1/2 łyżeczka mielonego cynamonu&lt;/li&gt;
&lt;li&gt;1/4 łyżeczki mielonych goździków&lt;/li&gt;
&lt;li&gt;1/4 łyżeczki mielonego imbiru&lt;/li&gt;
&lt;li&gt;1/4 łyżeczki mielonej gałki muszkatołowej&lt;/li&gt;
&lt;li&gt;1/4 łyżeczki soli&lt;/li&gt;
&lt;li&gt;3 1/2 łyżki oleju&lt;/li&gt;
&lt;li&gt;1 łyżka ekstraktu z wanilii&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Włączyć piekarnik na 190 stopni &lt;/li&gt;
&lt;li&gt;Wymieszać wszystkie składniki w misce do uzyskania jednolitej konsystencji&lt;/li&gt;
&lt;li&gt;Piec ok 20-30 minut, aż wykałaczka wbita w środek będzie czysta przy wyjęciu&lt;/li&gt;
&lt;/ol&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Buraczany makaron</title><link href="https://jakub.olczyk.info/buraczany-makaron-pl.html" rel="alternate"></link><published>2020-11-09T18:00:00+01:00</published><updated>2020-11-09T18:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2020-11-09:/buraczany-makaron-pl.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Od Nadiy'i Hussain z BBC&lt;/p&gt;
&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;500g makaronu&lt;/li&gt;
&lt;li&gt;200g ser feta&lt;/li&gt;
&lt;li&gt;20g świeży koperek, drobno pokrojony&lt;/li&gt;
&lt;li&gt;1 łyżka soku z cytryny &lt;/li&gt;
&lt;li&gt;odrobina oliwy, do polania&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Sos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;600g gotowanego buraka, odcedzonego &lt;/li&gt;
&lt;li&gt;100ml oliwy &lt;/li&gt;
&lt;li&gt;1 łyżeczka soli &lt;/li&gt;
&lt;li&gt;4 ząbki czosnku, drobno pokrojonego&lt;/li&gt;
&lt;li&gt;1 duże czerwone chilli (opcjonalnie)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Ugotuj makaron zgodnie z opakowaniem&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;W międzyczasie zrób sos do makaronu. Burak, oliwa, sól, czosnek i chilli do
   blendera. Blendować do czasu otrzymania gładkiej pasty. Pół sosu odłożyć do
   zamrażarki, będzie na następną porcję.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pokruszyć fetę w misce, dodać koperek, polać sokiem z cytryny i wymieszać.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Po ugotowaniu makaronu, odlać wodę i dodać sos buraczany i wymieszać.
   Podzielić na porcje na talerze i oddać wymieszany serek.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dodać oliwy do smaku przed podaniem.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Smacznego!&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Sałatka na winie vel „Sałateńka”</title><link href="https://jakub.olczyk.info/salatka-na-winie-vel-salatenka.html" rel="alternate"></link><published>2020-11-04T18:00:00+01:00</published><updated>2020-11-04T18:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2020-11-04:/salatka-na-winie-vel-salatenka.html</id><summary type="html"></summary><content type="html">&lt;p&gt;Jak sama nazwa wskazuje została zrobiona przypadkiem z tego co się nawinęło. &lt;/p&gt;
&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;p&gt;Zielona masa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1/2 Kapusta pekińska&lt;/li&gt;
&lt;li&gt;1/2 Brokuł&lt;/li&gt;
&lt;li&gt;1 średni świeży ogórek&lt;/li&gt;
&lt;li&gt;1/2 Papryka czerwona&lt;/li&gt;
&lt;li&gt;1 pomidor&lt;/li&gt;
&lt;li&gt;1/2 puszki kukurydzy&lt;/li&gt;
&lt;li&gt;kilka rzodkiewek (do smaku)&lt;/li&gt;
&lt;li&gt;kilka oliwek zielonych (do smaku)&lt;/li&gt;
&lt;li&gt;Koperek (turbo ważny!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1/2 dużego jogurtu&lt;/li&gt;
&lt;li&gt;sól, pieprz kuchenny&lt;/li&gt;
&lt;li&gt;czosnek w proszku&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;p&gt;Pokroić wszystkie składniki z Zielonej Masy, wedle upodobania, sugeruję jednak
jak najdrobniej, zostawiając satysfakcjonujące „bajtsajzowe” kawałki brokuła.
Nie zapomnieć o koperku, który warto drobno posiekać, chyba że ktoś jest fanem,
wtedy można i większe zrobić większe nitki.  Sos zamieszać w osobnym naczyniu
przyprawiając do smaku. Przed podaniem wymieszać z sosem.&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Zielone Pesto</title><link href="https://jakub.olczyk.info/zielone-pesto.html" rel="alternate"></link><published>2020-11-04T18:00:00+01:00</published><updated>2020-11-04T18:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2020-11-04:/zielone-pesto.html</id><summary type="html">&lt;p&gt;nie tylko z bazylii!&lt;/p&gt;</summary><content type="html">&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;prażony słonecznik&lt;/li&gt;
&lt;li&gt;sok z cytryny&lt;/li&gt;
&lt;li&gt;olej&lt;/li&gt;
&lt;li&gt;prażony sezam&lt;/li&gt;
&lt;li&gt;sól&lt;/li&gt;
&lt;li&gt;pieprz&lt;/li&gt;
&lt;li&gt;szpinak / pietruszka / bazylia&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;p&gt;Składniki w zasadzie dodajemy na oko. Aby uzyskać konsystencję zbliżoną do
hummusu można dodać więcej prażonych składników i mniej oleju.&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Kokosanki</title><link href="https://jakub.olczyk.info/kokosanki-pl.html" rel="alternate"></link><published>2020-11-04T17:00:00+01:00</published><updated>2020-11-04T17:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2020-11-04:/kokosanki-pl.html</id><summary type="html">&lt;p&gt;czas około 30min&lt;/p&gt;</summary><content type="html">&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1 kostka masła&lt;/li&gt;
&lt;li&gt;1/2 kostki margaryny&lt;/li&gt;
&lt;li&gt;1 szklanka cukru&lt;/li&gt;
&lt;li&gt;1 kleik ryżowy&lt;/li&gt;
&lt;li&gt;2 łyżki wiórków kokosowych&lt;/li&gt;
&lt;li&gt;4 żółtka jaj&lt;/li&gt;
&lt;li&gt;4 białka jaj&lt;/li&gt;
&lt;li&gt;1 torebka cukru waniliowego&lt;/li&gt;
&lt;li&gt;1 łyżeczka proszku do pieczenia&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;p&gt;Margarynę i masło utrzeć z cukrem, dodać żółtka, wiórki i kleik.
Dodać ubitą pianę z białek, wymieszać i nakładać łyżeczką.
Piec w 160 stopniach Celsjusza ok. 15 minut.&lt;/p&gt;
&lt;p&gt;PS. pamiętaj aby dodać wszystkie składniki!&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Pasztet z cukinii</title><link href="https://jakub.olczyk.info/pasztet-z-cukinii-pl.html" rel="alternate"></link><published>2020-11-04T17:00:00+01:00</published><updated>2020-11-04T17:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2020-11-04:/pasztet-z-cukinii-pl.html</id><summary type="html">&lt;p&gt;czas przygotowania około 1.5h&lt;/p&gt;</summary><content type="html">&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1 duża cukinia&lt;/li&gt;
&lt;li&gt;2 cebule&lt;/li&gt;
&lt;li&gt;2 marchewki&lt;/li&gt;
&lt;li&gt;20 dag sera żółtego&lt;/li&gt;
&lt;li&gt;3 szklanki bułki tartej&lt;/li&gt;
&lt;li&gt;3 jajka&lt;/li&gt;
&lt;li&gt;1/2 szklanki oleju&lt;/li&gt;
&lt;li&gt;natka pietruszki&lt;/li&gt;
&lt;li&gt;przyprawy: sól, pieprz, papryka (wędzona!) i inne do smaku&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;p&gt;Cukinię zetrzeć na grubych oczkach i odcisnąć z wody. Podobnie zetrzeć marchew
i żółty ser. Cebulę skroić na drobną kostkę. Dodać pozostałe składniki i dobrze
wymieszać. Piec w temperaturze 180 stopni (z termoobiegiem) około 1 godziny.&lt;/p&gt;
&lt;p&gt;PS. Bułka tarta jest bardzo-turbo-ważna!&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Notes: Using Packer for Vagrant libvirt boxes</title><link href="https://jakub.olczyk.info/notes-using-packer-for-vagrant-libvirt-boxes.html" rel="alternate"></link><published>2020-07-16T00:00:00+02:00</published><updated>2020-07-16T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2020-07-16:/notes-using-packer-for-vagrant-libvirt-boxes.html</id><summary type="html">&lt;p&gt;a reference for future use &amp;amp; as short description&lt;/p&gt;</summary><content type="html">&lt;h2&gt;What is Packer exactly?&lt;/h2&gt;
&lt;p&gt;There are number of good resources giving the rationale for Packer. Short
answer is tool for automatic building of images. From my perspective the best
overview can be found in the book:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.packerbook.com"&gt;James Turnbull - The Packer Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;which gives the historical insight to the problem of keeping your server space
as homogeneous as it is possible, and how Packer solves some of the pain points
with that.&lt;/p&gt;
&lt;h2&gt;Customizing a Vagrant image for libvirt&lt;/h2&gt;
&lt;p&gt;Among others, Packer has ability to take existing Vagrant box, customize it
using various technologies (shell script, Ansible, Chef, Puppet) and turn into
a new box that fits the needs of the person customizing it.&lt;/p&gt;
&lt;p&gt;Here is a simple template for customizing a CentOS box with inline shell
provisioner.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;builders&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vagrant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;source_path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;centos/7&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;box_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;centos_webserver&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;provider&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;libvirt&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;provisioners&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;shell&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;inline&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sudo yum groupinstall &amp;#39;Basic Web Server&amp;#39; -y&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The result is a new vagrant box inside &lt;code&gt;output-vagrant/&lt;/code&gt; provisioned with
needed software.&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.packer.io/docs"&gt;Packer docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="notes"></category><category term="packer"></category><category term="linux"></category><category term="vagrant"></category><category term="devops"></category></entry><entry><title>Notes: Git</title><link href="https://jakub.olczyk.info/notes-git.html" rel="alternate"></link><published>2019-12-10T10:20:00+01:00</published><updated>2022-12-06T12:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-12-10:/notes-git.html</id><summary type="html">&lt;p&gt;I sometimes (more like all the time) need to work with git repositories. Here is a collection of references to tricks/useful pieces of information that I have learned over the years. The tidbits below might be useful to know, in general.&lt;/p&gt;</summary><content type="html">&lt;p&gt;DISCLAIMER: this is not meant to be coherent post. Sorry. Just notes for future
reference. There will probably be some future updates here.&lt;/p&gt;
&lt;p&gt;I sometimes (more like all the time) need to work with git repositories. Here
is a collection of references to tricks/useful pieces of information that I
have learned over the years. The tidbits below might be useful to know, in
general. They are also things that I don't necessarily use everyday, but needed
at some point in time to solve my problems, and it is by far easier for me to
find them here than to look for them somewhere on the Internet for those
solutions.&lt;/p&gt;
&lt;h2&gt;Git aliases to work with a smile on the face&lt;/h2&gt;
&lt;p&gt;Some of my favourite aliases to have on hand:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[alias]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;lg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;log --graph --abbrev-commit --decorate --format=format:&amp;#39;%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset) --all&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;git lg&lt;/code&gt; command now prints a compact &amp;amp; tree-like structure out of the commit history, like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;a91cf0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lr/no-libnm-glib&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lubomir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rintel&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;\
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eb93480&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VPN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lubomir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rintel&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;98e0166&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lubomir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rintel&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a265457&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Revert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gitlab-ci: add scheduled pipeline to triage inactive issues and MRs&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lubomir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rintel&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a83c45b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bump&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;libnma&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lubomir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rintel&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt;&lt;span class="n"&gt;af29e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;libnm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;glib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lubomir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rintel&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="n"&gt;cfa8b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;intltool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gettext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lubomir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rintel&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;792&lt;/span&gt;&lt;span class="n"&gt;f11a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;some&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;autoconf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lubomir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rintel&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;d1dde6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ChangeLog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lubomir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rintel&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;a78083&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Indonesian&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;translation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Andika&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Triwidada&lt;/span&gt;
&lt;span class="o"&gt;|/&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bc34433&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Polish&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;translation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Piotr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drąg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;&lt;a href="https://nvie.com/posts/a-successful-git-branching-model/"&gt;Good approach to structuring the repository&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the very first things I have learned - "A successful Git branching
model" by Vincent Driessen. Highly recommended read.&lt;/p&gt;
&lt;h2&gt;How to merge a single file on multiple branches&lt;/h2&gt;
&lt;p&gt;Here's the description of the problem - given N release branches (e.g major
supported versions), merge changes from one file without changing irrelevant
information &lt;strong&gt;AND&lt;/strong&gt; without loosing sanity.&lt;/p&gt;
&lt;p&gt;So, for example, after working on some &lt;code&gt;feature-better-schwiftifying&lt;/code&gt; branch,
we can patch the changes to relevant branches (&lt;code&gt;version-{7,8,9}.x&lt;/code&gt;), where we have connected by
diverging code. (I am not saying that this is a &lt;strong&gt;good&lt;/strong&gt; approach to
development. I want to present quite useful feature of Git.)&lt;/p&gt;
&lt;!--- Sources
 * https://stackoverflow.com/questions/449541/how-to-selectively-merge-or-pick-changes-from-another-branch-in-git
--&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git checkout version-8.x
git checkout --patch feature-better-schwiftifying -- schwifty.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After applying merging relevant hunks we can commit the changes on the branch
&lt;code&gt;version-8.x&lt;/code&gt; and move along to other branches.&lt;/p&gt;
&lt;h2&gt;Move wrongly created commits to the right branch&lt;/h2&gt;
&lt;p&gt;Have you commited something only to discover that …&lt;em&gt;sigh&lt;/em&gt;… it was the wrong
branch? Here's an useful snippet to the rescue!&lt;/p&gt;
&lt;!--- Sources:
 * https://stackoverflow.com/questions/1628563/move-the-most-recent-commits-to-a-new-branch-with-git
--&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;newbranch&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;containing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;current&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commits&lt;/span&gt;
&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HEAD&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Move&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commits&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Make&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;know&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;how&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;many&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commits&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;need&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;checkout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;newbranch&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;that&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;still&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;desired&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commits&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;Warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s not safe to do a rebase in newbranch without extra care.&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Squash git commits using rebase&lt;/h2&gt;
&lt;p&gt;Let's say you have a repository with a similar commit history:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lg&lt;/span&gt;

&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0000006&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ago&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Fix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;typo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;template&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bulbulator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Jakub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Olczyk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;HEAD&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;origin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;master&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;master&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fix&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;bulbulator&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0000005&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ago&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tootinator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;changes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bulbulator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Jakub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Olczyk&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0000004&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ago&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;work&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bulbulator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Jakub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Olczyk&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0000003&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;weeks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ago&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Debuzz&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fizz&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Frodo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Baggins&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0000002&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ago&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Foo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;barr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;John&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Wick&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0000001&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;months&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ago&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Init&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Jon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Doe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now you want to squish the first 3 commits. To do that you can use 2 approaches:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git rebase -i HEAD~3 # here we specify the number of commits we want to
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;or&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git rebase -i 0000003
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Later the commits will be squashed via interactive choice presented by git. The usually useful options are &lt;code&gt;pick&lt;/code&gt; and &lt;code&gt;fixup&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Remove commits accidentally carried over from another branch&lt;/h2&gt;
&lt;p&gt;Let's say you mistakenly created a new branch from some other feature branch
instead of &lt;code&gt;main&lt;/code&gt;. You have made some useful commits, and before creating a PR
you realize that you have some commits that are not relevant to the feature you
are working on.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;lg
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000009&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;minutes&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-429&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;validation&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;required&lt;span class="w"&gt; &lt;/span&gt;tags&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;HEAD&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;feat/ISSUE-429&lt;span class="o"&gt;)&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000006&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;days&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-420&lt;span class="w"&gt; &lt;/span&gt;handle&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;API&lt;span class="w"&gt; &lt;/span&gt;endpoints&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;feat/ISSUE-420&lt;span class="o"&gt;)&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000003&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;days&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-420&lt;span class="w"&gt; &lt;/span&gt;remove&lt;span class="w"&gt; &lt;/span&gt;configuration&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;module&lt;span class="w"&gt;  &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000001&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hours&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-404&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;origin/main,&lt;span class="w"&gt; &lt;/span&gt;origin/HEAD,&lt;span class="w"&gt; &lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You then thought that rebasing on &lt;code&gt;main&lt;/code&gt; would be a good idea. However, the situation looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;lg
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000009&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;minutes&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-429&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;validation&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;required&lt;span class="w"&gt; &lt;/span&gt;tags&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;HEAD&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;feat/ISSUE-429&lt;span class="o"&gt;)&lt;/span&gt;
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000006&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;days&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-420&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000003&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;days&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-420&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000002&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hours&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-405&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;origin/main,&lt;span class="w"&gt; &lt;/span&gt;origin/HEAD,&lt;span class="w"&gt; &lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11111115&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;days&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-420&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;feat/ISSUE-420&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11111113&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;days&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-420&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk
&lt;span class="p"&gt;|&lt;/span&gt;/
*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000001&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hours&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ISSUE-404&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Jakub&lt;span class="w"&gt; &lt;/span&gt;Olczyk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To fix this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;rebase&lt;span class="w"&gt; &lt;/span&gt;--onto&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000002&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00000006&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Add changes from specific files from another branch&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;YOURHASH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nv"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;file1&lt;/span&gt;.&lt;span class="nv"&gt;txt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;file2&lt;/span&gt;.&lt;span class="nv"&gt;txt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dir3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dir4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;apply&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nv"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Source: https://stackoverflow.com/a/58556340/4716783&lt;/p&gt;</content><category term="technical"></category><category term="notes"></category><category term="git"></category><category term="programming"></category><category term="bash"></category><category term="linux"></category><category term="devops"></category></entry><entry><title>Workflow for notifications in i3wm</title><link href="https://jakub.olczyk.info/workflow-for-notifications-in-i3wm.html" rel="alternate"></link><published>2019-10-27T20:00:00+01:00</published><updated>2019-10-27T20:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-10-27:/workflow-for-notifications-in-i3wm.html</id><summary type="html">&lt;p&gt;summary of my little productivity booster&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since I am currently brushing up on my Linux skills, I have rediscovered the
usefulness of &lt;code&gt;crond&lt;/code&gt;. I have found a neat little trick that definitely have
been a some sort of productivity booster.&lt;/p&gt;
&lt;p&gt;I have finished setting up a new workstation to fully embrace my favourite way
of doing things -- minimally. I have invested some time to install and
configure i3 with some Gnome3 services. It could work better, but really the
most exciting thing for me is to finally go back to using i3wm day to day for
work (as it is still by far, the most comfortable DE for working with multiple
screens, for me at least, and I have been using it &lt;a href="https://jakub.olczyk.info/i3-jest-swietne.html"&gt;for some time now&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Having that in mind, I have a pretty minimal setup when it comes to
notifications.I tend not to allow any running software to distract me while I
work. Which opens up a great opportunity for having just the notifications that
really matter!&lt;/p&gt;
&lt;h2&gt;Notifications from crontab&lt;/h2&gt;
&lt;p&gt;The key to the trick isn't really clever, but I guess that it might count as
inspiration for others to use it for more sophisticated things. Still, it is -
I think - a good way of showing that the old tools can be used in new ways,
even on desktop.&lt;/p&gt;
&lt;p&gt;My setup involves using &lt;code&gt;zenity&lt;/code&gt; but I guess there are other programs that
could do the job just fine. The tricky part for running &lt;code&gt;zenity&lt;/code&gt; is the fact
that we need to tell it which &lt;code&gt;DISPLAY&lt;/code&gt; we have in mind when showing the
notification. Luckily, there's &lt;code&gt;xrandr&lt;/code&gt; to help here, but in the general case
you would probably want to use the &lt;code&gt;DISPLAY=:0&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;#&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Example&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;that&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;use&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;having&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;breaks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;screen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;more&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;often&lt;/span&gt;
&lt;span class="o"&gt;*/&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;:&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;zenity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nv"&gt;notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nv"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hey! Get a break from the screen :)&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;which, to translate from cron to human, is just saying the text every 45
minutes from 9am up until 4pm.&lt;/p&gt;
&lt;p&gt;Other uses I can think of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;telling the time of the next bus ride home (with appropriate heads-up)&lt;/li&gt;
&lt;li&gt;showing the reminders from to-do list (bonus points, for creating simple
  scripts that would allow for very minimal note taking with reminders
  built-in)&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="linux"></category><category term="bash"></category></entry><entry><title>Gdzie zjeść w Krakowie?</title><link href="https://jakub.olczyk.info/gdzie-zjesc-w-krakowie-pl.html" rel="alternate"></link><published>2019-09-15T20:00:00+02:00</published><updated>2019-09-15T20:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-09-15:/gdzie-zjesc-w-krakowie-pl.html</id><summary type="html">&lt;p&gt;Miejsca z dobrą kuchnią w Krakowie, które polecam.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ostatnie (przypadkowe) polecenie ciekawej pizzerii przyjacielowi uświadomiło
mi, że warto może podzielić się nieco szerzej wiedzą na temat dobrych miejsc
(subiektywnie), gdzie można coś zjeść/spotkać się ze znajomymi. W przyszłości
pewnie będę aktualizować ten post.&lt;/p&gt;
&lt;h2&gt;Jedzenie&lt;/h2&gt;
&lt;p&gt;W tej sekcji, fajne miejsca, gdzie można coś zjeść (ale niekoniecznie np.
posiedzieć). Nie będe się bardzo rozwodził na ich temat i spłycę każde miejsce
do oceny kosztowności (od $ do $$$$$), jeśli ktoś będzie chciał się tam przejść
to sam oceni, czy mój gust odpowiada własnym upodobaniom :)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pizza Neapolitana Vincenzo Pedone ($$)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=40/50.027600/19.929000"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vege To Tu ($)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.05163/19.94709"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mazaya Falafel ($)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.05785/19.95764"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vegab ($)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.05831/19.94362"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Zacny Burger ($$)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=18/50.03028/19.91173"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Urara Sushi ($$)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.06285/19.93952"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pod Wawelem ($$$)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.05460/19.93935"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dodatkowo - porcje nie do przejedzenia.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tasca Ruczajnik ($$$)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.02649/19.91791"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Alkohol&lt;/h2&gt;
&lt;p&gt;Poniżej lista miejsc, gdzie można napić się czegoś dobrego oraz czasem również
spędzić czas w inny sposób.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KiKa ($)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.04180/19.94061"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dodatkowo to miejsce to kino z atutem, tj. możliwością wypicia kraftowego
  piwa lub dobrego wina.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;R'lyeh ($)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.06715/19.94341"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dodatkowo - masa planszówek do ogrania!&lt;/li&gt;
&lt;li&gt;Dodatkowo - Barman to kultysta rodem z opowieści Lovecrafta&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TEA Time Brewery &amp;amp; Pub ($$)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.05005/19.93648"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Craftownia ($$)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.05048/19.94933"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Zakąski u Ani ($)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.05198/19.94460"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LostBar ($$)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=19/50.06273/19.93413"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dodatkowo - escape room (nie korzystałem)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Kawa/Desery/Lody&lt;/h2&gt;
&lt;p&gt;Miejsca gdzie można napić się kawy lub skosztować dobrych deserów.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fabryka Kwiatów ($)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=20/50.02763/19.92897"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dodatkowo - można kupić kwiaty oraz napić się pysznej kawy zgryzając
  ciastkiem.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kogiel Mogiel ($)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/#map=20/50.02795/19.91978"&gt;POI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="posts"></category><category term="recommendation"></category></entry><entry><title>Automatyzacja pisania własnych `manpage`</title><link href="https://jakub.olczyk.info/automatyzacja-pisania-wlasnych-manpage.html" rel="alternate"></link><published>2019-09-02T10:20:00+02:00</published><updated>2019-09-02T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-09-02:/automatyzacja-pisania-wlasnych-manpage.html</id><summary type="html">&lt;p&gt;pointer do artykułu mojego autorstwa&lt;/p&gt;</summary><content type="html">&lt;p&gt;W ramach pracy zawodowej zdarza mi się pisać artykuły. Poniżej link do mojego
tekstu traktującego o pisaniu własnych &lt;code&gt;manpages&lt;/code&gt;. W ten sposób można też
bardzo łatwo tworzyć notatki na własne potrzeby lub w celach pisania
dokumentacji projektu przewidzianego do pracy w systemach uniksopodobnych.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pl.euro-linux.com/blog/wlasna-dokumentacja-z-wykorzystaniem-man/"&gt;Własna dokumentacja z wykorzystaniem polecenia &lt;code&gt;man&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ponieważ jest kilka rzeczy, które nie zmieściły się w tamtym artykule umieszam
je tutaj na zachętę oraz jako uzupełnienie :)&lt;/p&gt;
&lt;h2&gt;Wypisanie wyszystkich stron manuala z danej sekcji&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;SEKCJA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1p&amp;#39;&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;man&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$SEKCJA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-k&lt;span class="w"&gt; &lt;/span&gt;--regex&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.*&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Krótki opis opcji:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-S&lt;/code&gt; (lub &lt;code&gt;-s&lt;/code&gt;) pozwala na wybranie sekcji, które będą przeszukiwane&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-k&lt;/code&gt; powoduje, że wyjście będzie jak z komendy &lt;code&gt;apropos(1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--regex&lt;/code&gt; będzie dopasowywać linie wyjścia z podanym wzorcem. Tutaj
   korzystamy z &lt;code&gt;.*&lt;/code&gt; co można traktować jako dowolny ciąg znaków. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Po stworzeniu własnej sekcji w ten sposób można łatwo odnaleźć wszystkie
strony, które do niej należą.&lt;/p&gt;
&lt;h2&gt;Otwarcie strony podręcznika w przeglądarce&lt;/h2&gt;
&lt;p&gt;Korzystając ze środowiska na maszynie roboczej, raczej niż na serwerze można 
przeczytać strony podręcznika w formacie HTML w ulubionej przeglądarce.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;man&lt;span class="w"&gt; &lt;/span&gt;-Hfirefox&lt;span class="w"&gt; &lt;/span&gt;1p&lt;span class="w"&gt; &lt;/span&gt;who
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Opcja &lt;code&gt;-H&lt;/code&gt; z nazwą programu, w którym chcemy otworzyć daną stronę pozwala na
wykorzystanie formatu HTML. Ciekawostka, kod źródłowy wygenerowany przez
&lt;code&gt;troff&lt;/code&gt; można sobie otworzyć w terminalu np przez podanie jakiegoś
programu-pagera.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;man&lt;span class="w"&gt; &lt;/span&gt;-H&lt;span class="nv"&gt;$PAGER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;1p&lt;span class="w"&gt; &lt;/span&gt;who
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="technical"></category><category term="linux"></category><category term="centos"></category><category term="link"></category></entry><entry><title>Benchmark opcji JIT w PostgreSQL</title><link href="https://jakub.olczyk.info/benchmark-opcji-jit-w-postgresql-pl.html" rel="alternate"></link><published>2019-08-02T10:20:00+02:00</published><updated>2019-08-02T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-08-02:/benchmark-opcji-jit-w-postgresql-pl.html</id><summary type="html">&lt;p&gt;pointer do artykułu mojego autorstwa&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ponieważ w ramach pracy piszę również artykuły chciałbym się nimi również
podzielić tutaj. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pl.euro-linux.com/blog/benchmark-eurodb-jit-w-postgresql/"&gt;Benchmark - JIT w PostgreSQL 11&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="postgresql"></category><category term="link"></category></entry><entry><title>Magic Wormhole - open source solution for instant filesharing</title><link href="https://jakub.olczyk.info/magic-wormhole-open-source-solution-for-instant-filesharing.html" rel="alternate"></link><published>2019-07-24T20:00:00+02:00</published><updated>2019-07-24T20:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-07-24:/magic-wormhole-open-source-solution-for-instant-filesharing.html</id><summary type="html">&lt;p&gt;quick look at the python app&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recently, I have found out about an awesome way for sharing a file from local
machine to a friend without the need to use any proprietary service.&lt;/p&gt;
&lt;p&gt;The command line program is called… Magic Wormhole, quite fittingly. I found out
about this program reading about the &lt;a href="https://latacora.micro.blog/2019/07/16/the-pgp-problem.html"&gt;problem with PGP&lt;/a&gt;, where it was
listed as an alternative for encrypting data and sending it via e-mail. I have
to say, it gives pretty nice promises about the security:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The wormhole tool uses PAKE “Password-Authenticated Key Exchange”, a family
of cryptographic algorithms that uses a short low-entropy password to
establish a strong high-entropy shared key. This key can then be used to
encrypt data. wormhole uses the SPAKE2 algorithm, due to Abdalla and
Pointcheval.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here's one sentence from that article that really for me better than any
sales pitch ever (emphasis mine):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s easy (for nerds, at least), secure, and fun: we haven’t introduced
wormhole to anyone &lt;strong&gt;who didn’t start gleefully wormholing things immediately
just like we did&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I must say I am one of those people :)&lt;/p&gt;
&lt;h2&gt;External links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/warner/magic-wormhole"&gt;Magic Wormhole source code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://magic-wormhole.readthedocs.io/en/latest/"&gt;docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="recommendation"></category><category term="python"></category></entry><entry><title>Notes: PostgreSQL count rows in schema</title><link href="https://jakub.olczyk.info/notes-postgresql-count-rows-in-schema.html" rel="alternate"></link><published>2019-07-14T00:00:00+02:00</published><updated>2019-07-14T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-07-14:/notes-postgresql-count-rows-in-schema.html</id><summary type="html">&lt;p&gt;a quick note&lt;/p&gt;</summary><content type="html">&lt;p&gt;Sometimes you need to check the number of rows in more than one table. This is
useful when dealing with database migration, for instance, where you need to
check if the data was indeed transfered. Here is solution for counting number
of rows for all tables in particular schema, which is one of the simple
solutions for checking if anything happened.&lt;/p&gt;
&lt;p&gt;Firstly, a helper function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;OR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FUNTION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;int_sql&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;LANGUAGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;plpgsql&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;DECLARE&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;execute&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;into&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will return the numeric value from supplied query. Now the main function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;OR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FUNCTION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;schemat_table_count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;schema_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;LANGUAGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SQL&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;table_row_count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;int_sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;select count(*) from &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="k"&gt;schema_name&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;table_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;BASE TABLE&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;table_schema&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;schema_name&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I hope this might be useful for someone.&lt;/p&gt;</content><category term="technical"></category><category term="postgresql"></category><category term="notes"></category><category term="programming"></category></entry><entry><title>Notes: On MySQL</title><link href="https://jakub.olczyk.info/notes-on-mysql.html" rel="alternate"></link><published>2019-06-11T00:00:00+02:00</published><updated>2019-06-11T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-06-11:/notes-on-mysql.html</id><summary type="html">&lt;p&gt;a short reference with pointers to external docs&lt;/p&gt;</summary><content type="html">&lt;p&gt;DISCLAIMER: this is not meant to be coherent post. Sorry. Just notes for future
reference. As such this post is subject to possible future changes.&lt;/p&gt;
&lt;h2&gt;Logging in after installation&lt;/h2&gt;
&lt;p&gt;Since &lt;code&gt;mysqld&lt;/code&gt; is quite different from Postgres we need to adjust expectations.
When greeted with error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ERROR&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1045&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;28000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Access&lt;span class="w"&gt; &lt;/span&gt;denied&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;@&lt;span class="s1"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;password:&lt;span class="w"&gt; &lt;/span&gt;NO&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;just after installation we need to find the temporary password from the startup
logs, like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;generated&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/var/log/mysqld.log&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="m"&gt;2019&lt;/span&gt;-06-11T08:45:48.773272Z&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;Note&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;A&lt;span class="w"&gt; &lt;/span&gt;temporary&lt;span class="w"&gt; &lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;generated&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;root@localhost:&lt;span class="w"&gt; &lt;/span&gt;hunter2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I see why they might do that I just personally don't like it (info during
installation would be nice).&lt;/p&gt;
&lt;h2&gt;Short memorable password for development&lt;/h2&gt;
&lt;p&gt;As for changing the password after first successful login - first you'll need
to set a secure password. Afterwards you can issue:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;UNINSTALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PLUGIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;validate_password&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- for checking that it&amp;#39;s gone&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PLUGINS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now you can set the password for something concise and fitting for development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning: never do it on production systems!&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Enabling connection from outside&lt;/h2&gt;
&lt;p&gt;You'll need to create a separate user that can be identified from its
connection string (kinda similar to the Postgres approach, but in different
place).&lt;/p&gt;
&lt;p&gt;Connect locally as SU and then:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a.b.c.d&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IDENTIFIED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hunter2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- verify the new user creation&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a.b.c.d&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;G&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That's it -- you'll be able to connect to MySQL from remote host.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning: Not for production use.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Speeding up restore of a dump with InnoDB storage&lt;/h2&gt;
&lt;p&gt;Since the standard practice for restoring the dump file is to simply execute
it, like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;sql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;there's no denying that it is dead simple. Problem starts to show up when the
file size far exceeds one of the toy example realm. This is due to number of
default settings that combined slow down the automated process of inserting
data. In order to gain some speed we can use this snippets before and after
executing the dump.sql file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;--- before.sql&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;OLD_AUTOCOMMIT&lt;/span&gt;&lt;span class="o"&gt;=@@&lt;/span&gt;&lt;span class="n"&gt;AUTOCOMMIT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AUTOCOMMIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;OLD_UNIQUE_CHECKS&lt;/span&gt;&lt;span class="o"&gt;=@@&lt;/span&gt;&lt;span class="n"&gt;UNIQUE_CHECKS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UNIQUE_CHECKS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;OLD_FOREIGN_KEY_CHECKS&lt;/span&gt;&lt;span class="o"&gt;=@@&lt;/span&gt;&lt;span class="n"&gt;FOREIGN_KEY_CHECKS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FOREIGN_KEY_CHECKS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;--- after.sql&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FOREIGN_KEY_CHECKS&lt;/span&gt;&lt;span class="o"&gt;=@&lt;/span&gt;&lt;span class="n"&gt;OLD_FOREIGN_KEY_CHECKS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UNIQUE_CHECKS&lt;/span&gt;&lt;span class="o"&gt;=@&lt;/span&gt;&lt;span class="n"&gt;OLD_UNIQUE_CHECKS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AUTOCOMMIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;OLD_AUTOCOMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Having those files we can simply run this incantation and be over with the
dump:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;before.sql&lt;span class="w"&gt; &lt;/span&gt;dump.sql&lt;span class="w"&gt; &lt;/span&gt;after.sql&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mysql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="technical"></category><category term="mysql"></category><category term="centos"></category><category term="notes"></category></entry><entry><title>Książki 2019</title><link href="https://jakub.olczyk.info/ksiazki-2019-pl.html" rel="alternate"></link><published>2019-06-08T00:00:00+02:00</published><updated>2019-06-08T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-06-08:/ksiazki-2019-pl.html</id><summary type="html"></summary><content type="html">&lt;script src="https://jakub.olczyk.info/theme/sorttable.js"&gt;&lt;/script&gt;&lt;p&gt;Poniżej lista książek, które uważam za wartościowe / przeczytałem i chciałbym
polecić. Lista nie jest w żaden sposób uporządkowana i będzie stopniowo
aktualizowana.&lt;/p&gt;
&lt;table border="1" class="sortable docutils"&gt;
&lt;caption&gt;Lista książek&lt;/caption&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Tytuł&lt;/th&gt;
&lt;th class="head"&gt;Autor&lt;/th&gt;
&lt;th class="head"&gt;Opis/Ocena/Recenzja&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Trylogia Husycka&lt;/td&gt;
&lt;td&gt;Andrzej Sapkowski&lt;/td&gt;
&lt;td&gt;Zupełne zerwanie z konwencją Wiedźmina. Mając to na uwadze,trzeba przyznać, że bardzo dobrze napisana i wciągająca proza.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Hello world. Jak być człowiekiem w epoce maszyn.&lt;/td&gt;
&lt;td&gt;Hannah Fry&lt;/td&gt;
&lt;td&gt;&lt;a class="reference external" href="http://jakub.olczyk.info/recenzja-hello-world.html"&gt;link1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Permakultura Seppa Holtzera.&lt;/td&gt;
&lt;td&gt;Sepp Holtzer&lt;/td&gt;
&lt;td&gt;&lt;a class="reference external" href="https://jakub.olczyk.info/ksiazki-2018.html"&gt;link2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Przewodnik wędrowca. Sztuka odczytywania znaków natury&lt;/td&gt;
&lt;td&gt;Tristan Gooley&lt;/td&gt;
&lt;td&gt;&lt;a class="reference external" href="https://jakub.olczyk.info/ksiazki-2018.html"&gt;link3&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a class="reference external" href="https://www.supernowa.pl/ksiazki.php?p=210"&gt;Martwe dziwki idą do nieba&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Donat Szyller&lt;/td&gt;
&lt;td&gt;Dziwnie odprężająca lektura. Fantasy, gdzie diabeł upija się mlekiem. Zbiór opowiadań, lekki klimat noir. Niezbyt wysokich lotów, lecz zabawne.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Saga o Wiedźminie + opowiadania&lt;/td&gt;
&lt;td&gt;Andrzej Sapkowski&lt;/td&gt;
&lt;td&gt;Nie trzeba nikomu przedstawiać. Czytać, czytać, czytać!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Miasto śniących książek&lt;/td&gt;
&lt;td&gt;Walter Moers&lt;/td&gt;
&lt;td&gt;Historia pewnego smoka, który chce zostać jednym z największych pisarzy. Świetnie napisana książka. Ilustracje rysowane przez autora!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Hobbit, czyli tam i z powrotem.&lt;/td&gt;
&lt;td&gt;J.R.R. Tolkien&lt;/td&gt;
&lt;td&gt;Dlaczego zapraszanie nieznajomych gości na podwieczorek może stać się okazją do przygody.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Silmarillion&lt;/td&gt;
&lt;td&gt;J.R.R. Tolkien&lt;/td&gt;
&lt;td&gt;TODO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Akwarium&lt;/td&gt;
&lt;td&gt;Wiktor Suworow&lt;/td&gt;
&lt;td&gt;Historia GRU, wojskowego wywiadu ZSRR. Dobrze napisana książka, trzyma w napięciu, a jednocześnie pozwalaz spojrzeć na minione realia.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Unix &amp;amp; Linux System Administration Handbook&lt;/td&gt;
&lt;td&gt;Evi Nemeth i in.&lt;/td&gt;
&lt;td&gt;Świetna książka dla każdego zainteresowanego administracją systemami uniksopodobnymi. Szczerze polecam, można się wiele dowiedzieć.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ablsolute OpenBSD: Unix for Practical Paranoid&lt;/td&gt;
&lt;td&gt;Michael W. Lucas&lt;/td&gt;
&lt;td&gt;Bardzo dobrze napisana książka. Ciekawe spojrzenie na świat BSD (przynajmniej z perspektywy użytkownika Linuksa), zachęca do przetestowania OpenBSD.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;No place to hide.&lt;/td&gt;
&lt;td&gt;Glenn Greenwald&lt;/td&gt;
&lt;td&gt;Podtytuł mówi wszystko - „Edward Snowden, the NSA and the U.S. Surveillence State.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Internet. Czas się bać.&lt;/td&gt;
&lt;td&gt;Wojciech Orliński&lt;/td&gt;
&lt;td&gt;Polskie spojrzenie na problem inwigilacji w Internecie. Dobrze się czyta jako uzupełnienie książki o Snowdenie.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Solaris&lt;/td&gt;
&lt;td&gt;Stanisław Lem&lt;/td&gt;
&lt;td&gt;Chyba najlepsza książka na temat kontaktu z obcą cywilizacją i problemami jakie to ze sobą niesie. Przy okazji feels inducing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Obłok Magellana&lt;/td&gt;
&lt;td&gt;Stanisław Lem&lt;/td&gt;
&lt;td&gt;TODO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Limes Inferior&lt;/td&gt;
&lt;td&gt;Janusz Zajdel&lt;/td&gt;
&lt;td&gt;Polecam zacząć od tej książki eksplorację jego twórczości. Ciekawie zawoalowana krytyka ZSRR i PRL w formie Sci-Fi.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Lód&lt;/td&gt;
&lt;td&gt;Jacek Dukaj&lt;/td&gt;
&lt;td&gt;Mogę powiedzieć tylko. Warto przeczytać. Szczególnie mając jakąś styczność z matematyką na poziomie studiów.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Seria „Maze Runner”&lt;/td&gt;
&lt;td&gt;James Dashner&lt;/td&gt;
&lt;td&gt;Całkiem przyjemna seria postapo.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content><category term="posts"></category><category term="list"></category><category term="recommendation"></category></entry><entry><title>Notes: IPsec VPN on Centos with NetworkManager</title><link href="https://jakub.olczyk.info/notes-ipsec-vpn-on-centos-with-networkmanager.html" rel="alternate"></link><published>2019-05-30T00:00:00+02:00</published><updated>2019-05-30T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-05-30:/notes-ipsec-vpn-on-centos-with-networkmanager.html</id><summary type="html">&lt;p&gt;a short reference with pointers to external docs&lt;/p&gt;</summary><content type="html">&lt;p&gt;DISCLAIMER: this is not meant to be coherent post. Sorry. Just notes for future
reference.&lt;/p&gt;
&lt;p&gt;Given that &lt;strong&gt;not&lt;/strong&gt; everybody uses OpenVPN, from time to time there is a need for
other configuration for making the connection. First of all, NetworkManager
implements and supports quite a lot of configurations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NetworkManager-fortisslvpn (releases) Fortinet SSLVPN compatible&lt;/li&gt;
&lt;li&gt;NetworkManager-libreswan (releases) IPsec IKEv1 VPN, Cisco compatible &lt;/li&gt;
&lt;li&gt;NetworkManager-pptp (releases) PPTP, Microsoft compatible &lt;/li&gt;
&lt;li&gt;NetworkManager-openconnect (releases) Cisco AnyConnect, Juniper &lt;/li&gt;
&lt;li&gt;NetworkManager-openvpn (releases) OpenVPN &lt;/li&gt;
&lt;li&gt;NetworkManager-vpnc (releases) IPsec VPN, Cisco compatible &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;taken from the &lt;a href="https://wiki.gnome.org/Projects/NetworkManager/VPN"&gt;NetworkManager VPN page&lt;/a&gt;. For IPsec alone there are 2
officially supported implementations (and there are 3rd party plugins that can
be used as well).&lt;/p&gt;
&lt;p&gt;When using &lt;a href="https://en.wikipedia.org/wiki/IPsec"&gt;IPsec&lt;/a&gt; with the following configuration parameters:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Gateway
Username
User password
Pre-shared key (Group secret)
Local Id (Group Name)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There is a high chance that using installed by default libreswan will be
sufficient. But there is also the chance that you need to change the IKE DH
Group or adjust Perfect Forward Secrecy to use the same DH Group.
In that case:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;yum&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;NetworkManager-vpnc-gnome
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After that the process is "clickable" from the NetworkManager GUI application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add VPN &amp;gt; "Cisco Compatible VPN (vpnc)"&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then fill-in the blanks with the correct connection parameters.&lt;/p&gt;</content><category term="technical"></category><category term="networking"></category><category term="centos"></category><category term="notes"></category></entry><entry><title>Notes: Vagrant box with provisioning</title><link href="https://jakub.olczyk.info/notes-vagrant-box-with-provisioning.html" rel="alternate"></link><published>2019-05-25T00:00:00+02:00</published><updated>2019-05-25T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-05-25:/notes-vagrant-box-with-provisioning.html</id><summary type="html">&lt;p&gt;a short reference with pointers to external docs&lt;/p&gt;</summary><content type="html">&lt;p&gt;DISCLAIMER: this is not meant to be coherent post. Sorry. Just notes for future
reference.&lt;/p&gt;
&lt;p&gt;First of all - simple &lt;code&gt;vagrantfile&lt;/code&gt; with some of my standard choices. &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# -*- mode: ruby -*-&lt;/span&gt;
&lt;span class="c1"&gt;# vi: set ft=ruby&lt;/span&gt;

&lt;span class="no"&gt;Vagrant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;centos/7&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;synced_folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/vagrant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rsync&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;builder-&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="mi"&gt;999&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;libvirt&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;vb&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;vb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;vb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provision&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;shell&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sudo yum install -y epel-release&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provision&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;shell&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sudo yum update -y&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For the sake of simplicity I am using the &lt;code&gt;inline&lt;/code&gt; version of &lt;a href="https://www.vagrantup.com/docs/provisioning/shell.html"&gt;&lt;code&gt;shell&lt;/code&gt;&lt;/a&gt;
provisioner. Plus, you can clearly see (without opening any other file) what is
going to happen when you run &lt;code&gt;vagrant up&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When there is more work to do I like to use &lt;a href="https://www.vagrantup.com/docs/provisioning/ansible.html"&gt;Ansible&lt;/a&gt; as provisioner. This
makes it easier for more complex setups, but there is always option for using a
script file (also inline!) for the &lt;code&gt;shell&lt;/code&gt; provisioner.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# -*- mode: ruby -*-&lt;/span&gt;
&lt;span class="c1"&gt;# vi: set ft=ruby&lt;/span&gt;

&lt;span class="vg"&gt;$script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="dl"&gt;SCRIPT&lt;/span&gt;
&lt;span class="sh"&gt;echo -n &amp;quot;Update the box...&amp;quot;&lt;/span&gt;
&lt;span class="sh"&gt;sudo yum install -y epel-release &amp;amp;&amp;gt; /dev/null&lt;/span&gt;
&lt;span class="sh"&gt;sudo yum update -y &amp;amp;&amp;gt;/dev/null&lt;/span&gt;
&lt;span class="sh"&gt;echo &amp;quot;Done!&amp;quot;&lt;/span&gt;
&lt;span class="dl"&gt;SCRIPT&lt;/span&gt;

&lt;span class="no"&gt;Vagrant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;centos/7&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;synced_folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/vagrant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rsync&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;builder-&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="mi"&gt;999&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;libvirt&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;vb&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;vb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;vb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provision&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;shell&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;$script&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We still have everything in one place, which might be desirable when there's
little need for mental context switching between files. There's also the
possibility for using the &lt;a href="https://www.vagrantup.com/docs/provisioning/shell.html#external-script"&gt;external script&lt;/a&gt;. This is useful when porting
something existing (like some configuration management that's not yet in
Ansible) for development under Vagrant.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provision&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;shell&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Bonus points for ability to use URI here (e.g. raw file in GitHub).&lt;/p&gt;</content><category term="technical"></category><category term="ansible"></category><category term="vagrant"></category></entry><entry><title>Notes: Rebuiling RPM packages with mock</title><link href="https://jakub.olczyk.info/notes-rebuiling-rpm-packages-with-mock.html" rel="alternate"></link><published>2019-05-22T00:00:00+02:00</published><updated>2020-04-08T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-05-22:/notes-rebuiling-rpm-packages-with-mock.html</id><summary type="html">&lt;p&gt;a short reference with pointers to external docs&lt;/p&gt;</summary><content type="html">&lt;p&gt;DISCLAIMER: this is not meant to be coherent post. Sorry. Just notes for future
reference.&lt;/p&gt;
&lt;p&gt;Given a source RPM package in order to rebuild it I use following tools. For
detailed description about what and why I suggest looking at the &lt;a href="https://rpm-packaging-guide.github.io/"&gt;RPM Packaging
Guide&lt;/a&gt; first (really nice resource for first-time packagers!). &lt;/p&gt;
&lt;p&gt;Installing needed tools on Centos 7 (and other RHEL derivatives, btw RHEL8
shouldn't change this) would look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;yum&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;epel-release
sudo&lt;span class="w"&gt; &lt;/span&gt;yum&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;rpm-build&lt;span class="w"&gt; &lt;/span&gt;rpmdevtools&lt;span class="w"&gt; &lt;/span&gt;mock&lt;span class="w"&gt; &lt;/span&gt;yum-utils
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now for standard rebuiling we need to setup the correct directory structure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;rpmdev-setuptreeo
$&lt;span class="w"&gt; &lt;/span&gt;tree&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/rpmbuild
/home/vagrant/rpmbuild/
&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;BUILD
&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;RPMS
&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;SOURCES
&lt;span class="p"&gt;|&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;SPECS
&lt;span class="sb"&gt;`&lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;SRPMS

&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;directories,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;files
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now when we have a source package we need to unpack it in correct
subdirectiories, if the package is called &lt;code&gt;llvm3.9-3.9.1-7.el7.src.rpm&lt;/code&gt; then
command looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rpm&lt;span class="w"&gt; &lt;/span&gt;--install&lt;span class="w"&gt; &lt;/span&gt;llvm3.9-3.9.1-7.el7.src.rpm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will put all files in correct places for you. Note: no need for superuser
privilages (unless you're building as root, but that is discouraged).&lt;/p&gt;
&lt;p&gt;Next step is to take care of the dependencies for the package we are building:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;yum-builddep&lt;span class="w"&gt; &lt;/span&gt;~/rpmbuild/SPECS/llvm3.9.spec
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now for a rebuild:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rpmbuild&lt;span class="w"&gt; &lt;/span&gt;-ba&lt;span class="w"&gt; &lt;/span&gt;~/rpmbuild/SPECS/llvm3.9.spec
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If it doesn't work try installing &lt;code&gt;@buildsys-build&lt;/code&gt;. This will install all
needed compilers and standard (in terms of C/C++) build tools.&lt;/p&gt;
&lt;h2&gt;Building with &lt;code&gt;mock&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Now, we want to be able to build the package without worrying that we have not
specified some build dependency in the specfile. &lt;code&gt;mock&lt;/code&gt; comes to the rescue!&lt;/p&gt;
&lt;p&gt;In order to build something with &lt;code&gt;mock&lt;/code&gt; we need to have the SRPM. With the
above &lt;code&gt;rpmbuild&lt;/code&gt; command we get the file as well, but if you want to just
create the SRPM from scratch run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rpmbuild&lt;span class="w"&gt; &lt;/span&gt;-bs&lt;span class="w"&gt; &lt;/span&gt;~/rpmbuild/SPECS/llvm3.9.spec
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;.src.rpm&lt;/code&gt; will be in the &lt;code&gt;~/rpmbuild/SRPMS/&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;For building with mock the user that will be running the command needs to be in
the &lt;code&gt;mock&lt;/code&gt; group. To add current user we simply can:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;usermod&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;mock&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now, we need a session where the user is in fact recognized as part of the
group. Supposedly, this is the solution in some environments (I couldn't make
it work with graphical session)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;newgrp&lt;span class="w"&gt; &lt;/span&gt;-
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ok. Here we can start actually building. &lt;code&gt;mock&lt;/code&gt; needs to know what evironment
it is supposed to 'emulate' or rather - recreate. Under &lt;code&gt;/etc/mock/&lt;/code&gt; you can
find a plethora of different configurations (mostly, Fedora and EPEL for
different versions). You can work out the syntax from different sources.&lt;/p&gt;
&lt;p&gt;Building now is as simple as running:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mock&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$CONFIG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--rebuild&lt;span class="w"&gt; &lt;/span&gt;package.src.rpm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;where you specify the &lt;code&gt;CONFIG&lt;/code&gt; for the package to be built with.&lt;/p&gt;
&lt;h3&gt;Setting builder hostname&lt;/h3&gt;
&lt;p&gt;Supposedly, setting a macro we can change the hostname of the building machine&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# here CONFIG points to something in /etc/mock e.g. epel-7-x86_64&lt;/span&gt;
&lt;span class="nv"&gt;CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;epel-7-x86_64
mock&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$CONFIG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-D&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_buildhost NAME&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package-1.0-1.el7.x86_64.src.rpm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;More useful info in &lt;a href="https://github.com/rpm-software-management/mock/blob/devel/mock/etc/mock/site-defaults.cfg"&gt;site-defaults.cfg from the mock repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Other way is to have a custom mock.cfg (note, Python-like syntax):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;config_opts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hostname&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;my.own.hostname&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There are some packages that will misbehave though. See &lt;a href="#"&gt;mysql-community&lt;/a&gt;. But I
guess that's the exception from the rule.&lt;/p&gt;
&lt;h2&gt;Other useful resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marcin.juszkiewicz.com.pl/2016/04/19/my-workflow-for-building-big-sets-of-rpm-packages/"&gt;Marcin Juszkiewicz, Workflow for building sets of RPM packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marcin.juszkiewicz.com.pl/2016/04/15/how-to-speed-up-mock/"&gt;Marcin Juszkiewicz, How to speed up mock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.packagecloud.io/eng/2015/05/11/building-rpm-packages-with-mock/"&gt;PackageCloud, Building with Mock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://giovannitorres.me/how-to-setup-an-rpm-build-environment-on-centos-6.html"&gt;Giovanni Torres, How to Setup an RPM Build Environment on CentOS 6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://giovannitorres.me/how-to-setup-an-rpm-signing-key.html"&gt;Giovanni Torres, How to Setup an RPM Signing Key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://giovannitorres.me/how-to-build-rpms-collectd-example.html"&gt;Giovanni Torres, How to Build RPMs - Collectd Example &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://giovannitorres.me/signing-rpms.html"&gt;Giovanni Torres, Signing RPMs &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="rpm"></category><category term="mock"></category><category term="centos"></category><category term="notes"></category></entry><entry><title>Recenzja: Hello world. Jak pozostać człowiekiem w świecie maszyn</title><link href="https://jakub.olczyk.info/recenzja-hello-world-jak-pozostac-czlowiekiem-w-swiecie-maszyn-pl.html" rel="alternate"></link><published>2019-05-09T23:20:00+02:00</published><updated>2019-05-09T23:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-05-09:/recenzja-hello-world-jak-pozostac-czlowiekiem-w-swiecie-maszyn-pl.html</id><summary type="html">&lt;p&gt;krótka rekomendacja książkowa&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wpadła mi w ręce ostatnio książka napisana przez znaną m.in. z kanału
&lt;a href="https://www.youtube.com/user/numberphile/search?query=Hannah"&gt;Numberphile na YouTube&lt;/a&gt; - &lt;a href="http://www.hannahfry.co.uk/"&gt;Hannę Fry&lt;/a&gt; o dźwięcznym tytule „Hello world. Jak
pozostać człowiekiem w świecie maszyn”.&lt;/p&gt;
&lt;p&gt;Na wstępie - jestem bardzo zadowolony z wersji elektronicznej, którą miałem
przyjemność czytać. Polskie wydanie (razem z doborem czcionek) wydaje mi się
być na całkiem wysokim poziomie. Cenię również fakt, iż można kupić książkę bez
DRM -- jest to dla mnie naprawdę bardzo dużym plusem.&lt;/p&gt;
&lt;p&gt;Przechodząc jednak do treści - myślę, że jest to jedna z ciekawszych książek na
rynku, które traktują o (potencjalnych) negatywnych skutkach rozwoju
technologicznego i jednocześnie są literaturą faktu (w opozycji do
antyutopijnych Sci-Fi). Książka jest upstrzona wielką ilością odnośników do
różnych źródeł (co się chwali!) - od prac naukowych, do filmów na YouTube.&lt;/p&gt;
&lt;p&gt;Serdecznie polecam ją wszystkim myślącym, że dzisiejsze algorytmy i szybkie
komputery (w szczególności &lt;em&gt;sztuczna&lt;/em&gt; inteligencja) jest panaceum na wszelkie
problemy naszego świata lub traktują technologię bez rozsądnej dozy
sceptycyzmu. Przykłady z takich dziedzin jak medycyna (czy można automatycznie
rozpoznać czy ktoś ma raka?) czy sądownictwo (jaką wysokość kary zastosować?)
doskonale dociskają śrubę racjonalnego i sceptycznego myślenia, zmuszając do
zastanowienia się nad zasadnością wykorzystania algorytmów (czy faktycznie
prowadzi to do polepszenia życia?).&lt;/p&gt;
&lt;p&gt;Serdecznie polecam. Argumentem dla zabieganych może być to, że książka ma
raptem 200 stron. Idealna na deszczowe niedzielne popołudnie.&lt;/p&gt;</content><category term="posts"></category><category term="recommendation"></category></entry><entry><title>Cherrytree - great open source note taking app</title><link href="https://jakub.olczyk.info/cherrytree-great-open-source-note-taking-app.html" rel="alternate"></link><published>2019-04-27T20:00:00+02:00</published><updated>2019-04-27T20:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-04-27:/cherrytree-great-open-source-note-taking-app.html</id><summary type="html">&lt;p&gt;A brief look at the note taking application&lt;/p&gt;</summary><content type="html">&lt;p&gt;When I first started using open source software I was amazed at the nearly
endless possibilities - there was &lt;strong&gt;a lot&lt;/strong&gt; of very useful code that could be
used no questions asked! Now being used to this state of affairs (after all I
use FLOSS &lt;em&gt;daily&lt;/em&gt; for almost 6 years now...) I still sometimes stumble upon a 
new great application and I am still amazed!&lt;/p&gt;
&lt;p&gt;This time it is &lt;strong&gt;cherrytree&lt;/strong&gt; a hierarchical note taking application. The
interface is very minimal, which is a plus in my book, but still the idea
behind this program is really powerful, yet simple. While creating your notes
you can organize them in a tree. So each logical piece will be a branch (which
can be a page full of text) and you can create links to different parts of the
tree as well as to external resources. Moreover you can use simple formatting
for text clarity, insert images as well as code snippets.&lt;/p&gt;
&lt;p&gt;I must say - for tree-structured personal documentation this is a great
productivity booster. I really regret not finding this program while I was
still studying.  It would've been very useful then.&lt;/p&gt;
&lt;p&gt;I hope this short description might be useful to somebody out there, here are
links to the project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.giuspen.com/cherrytree/"&gt;Official project website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.giuspen.com/cherrytree/#features"&gt;List of all features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/giuspen/cherrytree"&gt;Cherrytree Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="recommendation"></category></entry><entry><title>Generacja danych testowych w PostgreSQL</title><link href="https://jakub.olczyk.info/generacja-danych-testowych-w-postgresql-pl.html" rel="alternate"></link><published>2019-04-02T10:20:00+02:00</published><updated>2019-04-02T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-04-02:/generacja-danych-testowych-w-postgresql-pl.html</id><summary type="html">&lt;p&gt;pointer do artykułu mojego autorstwa&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ponieważ w ramach pracy piszę również artykuły chciałbym się nimi również
podzielić tutaj. Tekst o generowaniu danych losowych, którymi można wypełnić
tablice w PostgreSQL można znaleźć na blogu Eurolinuksa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pl.euro-linux.com/blog/generowanie-danych-losowych-dla-postgresql/"&gt;Generowanie danych losowych w PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="postgresql"></category><category term="link"></category></entry><entry><title>Adding hard disk to Lenovo Yoga 300-11IBY</title><link href="https://jakub.olczyk.info/adding-hard-disk-to-lenovo-yoga-300-11iby.html" rel="alternate"></link><published>2019-03-09T20:00:00+01:00</published><updated>2019-03-09T20:00:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-03-09:/adding-hard-disk-to-lenovo-yoga-300-11iby.html</id><summary type="html">&lt;p&gt;a short guide for anyone who wants to modify their Lenovo Yoga 300-11&lt;/p&gt;</summary><content type="html">&lt;p&gt;First, let me introduce the machine. This is a very cheap laptop, definitely from
the lower end of Lenovo Yoga series. This doesn't mean that it is not a damn
good and usable machine. Here are the specs in the original configuration that
it came to me (as found on the &lt;a href="https://www.lenovo.com/us/en/consumer-notebook/lenovo-yoga/essential/Yoga-300-11/p/88YG3000595"&gt;manufacturer website&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal storage: 32GB eMMC&lt;/li&gt;
&lt;li&gt;Display: 1366x768 11.6" capacitive-type multi-touch, supports 10-point&lt;/li&gt;
&lt;li&gt;Hinge: 360° rotation, four modes: Laptop, tent, stand and tablet&lt;/li&gt;
&lt;li&gt;CPU: Intel Celeron N2840 @ 2.16GHz&lt;/li&gt;
&lt;li&gt;RAM: 2GB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see it only had 32GB eMMC internal memory and given the 360 degree
display and low powered, passive cooling cpu it could be taken as a tablet
with physical keyboard rather than a laptop :)&lt;/p&gt;
&lt;h3&gt;Running Linux on Yoga 300&lt;/h3&gt;
&lt;p&gt;I had it for a year and it worked marvelously running Debian. Of course, not
all of the hardware was working, from the top of my head:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the screen didn't reorient itself with changes in position (accelerometer
  isn't supported?)&lt;/li&gt;
&lt;li&gt;there was no way to map the key that would allow to disable the physical
  keyboard in order to use it as a tablet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yet overall this was a very decent configuration for writing, browsing the web
&amp;amp; as an occasional movie player. The performance compared with the Windows 10
that came preloaded strongly favoured the Free OS. &lt;/p&gt;
&lt;p&gt;The default graphical environment on Debian -- Gnome 3 that supported (not in
all cases) usage of onscreen keyboard was already faster then the bloated
operating system from Microsoft. But loading this machine with lightweight XFCE
was a godsend for increase in usability of this laptop and truly showed where
the open source software shines. Without the bloat the machine turned into a
comfortable and fast everyday laptop.&lt;/p&gt;
&lt;h3&gt;The problem with eMMC internal storage&lt;/h3&gt;
&lt;p&gt;This unfortunately ended when the eMMC seemed to be failing and I needed to
find some better disk to use with this machine. Fortunately, as it turns out
there is a possibility of adding a disk. Because failing eMMC that is soldiered
on to the motherboard would require significantly more electronics knowledge
than I posses.&lt;/p&gt;
&lt;p&gt;Everything started with after one update when the system simply wouldn't boot.
Fortunately, all of the files could be recovered with a live USB distro and a
storage card.&lt;/p&gt;
&lt;p&gt;Now to tackle the problem I needed to order the "New Lenovo Yoga 300 flex
3-1120 3 1120 HDD Hard Drive Caddy Bracket + HDD Cable" from eBay, which to
translate from keyword to plain English is a SATA cable that fit into the
motherboard as well as brackets for holding the disk down. The price wasn't
very good as I had to pay ~36$ for those small parts. But that is still cheaper
than buying a new laptop.&lt;/p&gt;
&lt;p&gt;Then I looked for a disk. Since this machine was working fine on 32GB
previously I didn't look for something big. In the end I settled on a 120GB
Crucial SSD. It's worth noting that it needed to be a 7mm thick since there
isn't a lot of room in the chassis of this laptop (this was another ~25$).&lt;/p&gt;
&lt;p&gt;Assembly was very easy. I found a video that really helped me along the way -
you can find it here:&lt;/p&gt;
&lt;p&gt;https://www.youtube.com/watch?v=FdZbZUdJgog&lt;/p&gt;
&lt;p&gt;This is not exactly my configuration since there is a proper disk there but it
certainly helped me to figure out how to position the disk inside.&lt;/p&gt;
&lt;h3&gt;Installing new system&lt;/h3&gt;
&lt;p&gt;Unfortunately, installing Debian on the SSD wasn't feasible for me. I blame the
UEFI weirdness. After several failed attempts with different setting for UEFI I
gave up and loaded a Fedora XFCE spin on my USB to see if it would work.&lt;/p&gt;
&lt;p&gt;The installation went smoothly. It notified me that installation of grub
failed, which irritated me a bit. With resignation I allowed the installation
process to continue, thinking - that I'll sort out the issue afterwards.&lt;/p&gt;
&lt;p&gt;Fortunately after reboot the UEFI found the system on SSD and booted. Finally I
can claim partial victory, but I need to pay close attention to the next
updates to see if it can potentially mess with UEFI again.&lt;/p&gt;
&lt;p&gt;I hope this helps anyone who might want to upgrade their machine or has UEFI
related problems with Linux.&lt;/p&gt;</content><category term="technical"></category><category term="hardware"></category></entry><entry><title>Konfiguracja psql do własnych potrzeb poprzez psqlrc</title><link href="https://jakub.olczyk.info/konfiguracja-psql-do-wlasnych-potrzeb-poprzez-psqlrc-pl.html" rel="alternate"></link><published>2019-02-07T10:20:00+01:00</published><updated>2019-02-07T10:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2019-02-07:/konfiguracja-psql-do-wlasnych-potrzeb-poprzez-psqlrc-pl.html</id><summary type="html">&lt;p&gt;pointer do artykułu mojego autorstwa&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ponieważ w ramach pracy piszę również artykuły chciałbym się nimi również
podzielić tutaj. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pl.euro-linux.com/blog/tips-tricks-poradnik-psql-cz-iii/"&gt;Poradnik psql cz. III - dostosowanie konfiguracji z psqlrc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="postgresql"></category><category term="link"></category></entry><entry><title>Czeskie świąteczne ciasto orzechowe wg Babci Wiesi</title><link href="https://jakub.olczyk.info/czeskie-swiateczne-ciasto-orzechowe-wg-babci-wiesi-pl.html" rel="alternate"></link><published>2018-12-20T16:20:00+01:00</published><updated>2018-12-20T16:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-12-20:/czeskie-swiateczne-ciasto-orzechowe-wg-babci-wiesi-pl.html</id><summary type="html">&lt;p&gt;Ciasto, bez którego nie ma świąt u mnie w domu&lt;/p&gt;</summary><content type="html">&lt;p&gt;Co roku na każde święta zawsze przygotowujemy ciasto czeskie, które moja Babcia
dostała od koleżanki, kiedy przez pewien czas mieszkała i pracowała za naszą
południową granicą. Być może zagości i na innych stołach w tym roku?&lt;/p&gt;
&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;h4&gt;na ciasto&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;migdały 250 g&lt;/li&gt;
&lt;li&gt;orzechy włoskie 400 g&lt;/li&gt;
&lt;li&gt;orzechy laskowe 400 g&lt;/li&gt;
&lt;li&gt;masło 200 g&lt;/li&gt;
&lt;li&gt;cukier puder 200 g&lt;/li&gt;
&lt;li&gt;7 białek z jajek&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;na polewę&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;cukier puder 400 g&lt;/li&gt;
&lt;li&gt;1-2 cytryny (na sok)&lt;/li&gt;
&lt;li&gt;7 żółtek z jajek&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sposób przygotowania&lt;/h3&gt;
&lt;p&gt;Ustawić piec na 170 stopni Celsjusza, żeby zdążył się nagrzać. Orzechy i
migdały zmielić dość drobno (ale niekoniecznie na mąkę). Masło utrzeć z cukrem
do gładkiej masy. Połączyć suche składniki z masą na jednolitą całość.
Ubić białka na pianę i delikatnie połączyć z masą orzechową.&lt;/p&gt;
&lt;p&gt;Teraz można wyłożyć masę do formy (wyłożoną papierem do pieczenia, albo
wysmarowanym masłem i obsypaną bułką tartą). Piec przez 45 minut, sprawdzając
patykiem czy dalej jest wilgotne w środku. W razie potrzeby piec aż patyczek
będzie suchy. &lt;/p&gt;
&lt;p&gt;Istotna przestroga od Babci - „Pilnujemy temperatury i czasu!” :)&lt;/p&gt;
&lt;p&gt;W międzyczasie robimy polewę - żółtka z jajek utrzeć z cukrem na gęstą pianę.
Dolać sok z cytryny. Polewa ma być gęsta, w razie potrzeby dodać cukru, żeby
zgęstniała. &lt;/p&gt;
&lt;p&gt;Oblewamy ciasto jak troszkę przestygnie (nie musi być zimne), żeby polewa
czasem w nie nie wsiąknęła.&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Gulasz</title><link href="https://jakub.olczyk.info/gulasz-pl.html" rel="alternate"></link><published>2018-10-25T22:20:00+02:00</published><updated>2018-10-25T22:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-10-25:/gulasz-pl.html</id><summary type="html">&lt;p&gt;czas około 3.5h&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bazą do mojego przepisu jest gulasz znaleziony na &lt;a href="https://www.kwestiasmaku.com/przepis/gulasz-wegierski"&gt;blogu Kwestia Smaku&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1 kg mięsa wieprzowego&lt;/li&gt;
&lt;li&gt;1 duża papryka czerwona&lt;/li&gt;
&lt;li&gt;1 duża cebula&lt;/li&gt;
&lt;li&gt;1 szklanka wina (czerwone wytrawne najlepsze)&lt;/li&gt;
&lt;li&gt;ok. 10 pieczarek (te ciemno brunatne zdecydowanie lepsze niż zwykłe białe)&lt;/li&gt;
&lt;li&gt;4 łyżeczki mielonej papryki (SŁODKIEJ!)&lt;/li&gt;
&lt;li&gt;ok. 500 ml rosołu warzywnego&lt;/li&gt;
&lt;li&gt;2 łyżki sosu sojowego (ja miałem jakiś o dodatkowo grzybowym posmaku i zapachu)&lt;/li&gt;
&lt;li&gt;2 listki laurowe&lt;/li&gt;
&lt;li&gt;2 ziela angielskie&lt;/li&gt;
&lt;li&gt;ząbek czosnku (opcjonalnie)&lt;/li&gt;
&lt;li&gt;2-3 łyżki mąki&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;p&gt;Mięso pokroić w kostkę (dobrze od tego zacząć, wiem z doświadczenia). Cebulę
oraz paprykę również pokroić - na piórka oraz w kostkę.&lt;/p&gt;
&lt;p&gt;W dużym garnku (będziemy do niego po kolei wrzucać wszystko) na oleju
podsmażamy cebulę do zeszklenia. Następnie wrzucamy tam pokrojoną paprykę.
Wszystko maksymalnie 5 min.&lt;/p&gt;
&lt;p&gt;W tym samym czasie na patelni obsmażamy kawałki mięska. Doprawiamy je solą oraz
pieprzem (polecam cytrynowy lub ziołowy). Kiedy wszystko nam się zetnie
dolewamy ok 1/3 szklanki wina i pozwalamy mu wyparować z patelni na większym
ogniu. Następnie wrzucamy mięsko do cebuli i papryki.&lt;/p&gt;
&lt;p&gt;Teraz do garnka lecą przyprawy - papryka w proszku (w zasadzie czosnek
granulowany/w ząbku też by się nadał, w tym drugim przypadku istotne aby go
rozgnieść płazem noża) oraz bulion do którego dodajemy sosu sojowego. Możemy
podnieść temperaturę, żeby zaczęło nam się wszystko gotować.&lt;/p&gt;
&lt;p&gt;W tym czasie na patelni po mięsie będziemy jeszcze smażyć pieczarki. Ja lubię
je kroić na duże ale cienkie plasterki (tak żeby zostawić kształt pieczarki,
ale w kostkę też będzie smacznie). Kiedy nam się pięknie przypieką wrzucamy je
do garnka, skręcamy pod nim ogień i dusimy całość przez 1.5 godziny.&lt;/p&gt;
&lt;p&gt;Zostaje kwestia zasmażki, żeby zagęścić gulasz - mąkę podsmażyć na patelni (z
masłem lub na sucho), do zbrązowienia. Następnie wrzucić do garnka i mieszając
doprowadzić sos do wrzenia. Powinien się dobrze zagęścić.&lt;/p&gt;
&lt;p&gt;Proponuję podać gulasz z puree ziemniaczanym oraz ogórkami kiszonymi.&lt;/p&gt;
&lt;p&gt;Smacznego!&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Linux as a daily driver</title><link href="https://jakub.olczyk.info/linux-as-a-daily-driver.html" rel="alternate"></link><published>2018-08-06T19:20:00+02:00</published><updated>2018-08-06T19:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-08-06:/linux-as-a-daily-driver.html</id><summary type="html">&lt;p&gt;My thoughts about spreading the word about FLOSS to non-technical people&lt;/p&gt;</summary><content type="html">&lt;p&gt;I think that after the year in which I have convinced my SO to use Debian as
her daily driver on her laptop I can call it a success. At least partially.&lt;/p&gt;
&lt;p&gt;In this year I think that I have grown more humble as I have witnessed many
times her explaining the differences between Linux and Windows world to people
that really don't care about technology beyond using it as a tool or a cool
gimmick that is sometimes useful (think your grandparents or typical
arts/history/humanities students). I could never do this better than her. I
really wish I could. &lt;/p&gt;
&lt;p&gt;But this really comes through after my explanations that are for the most part
- in-depth but sometimes missing the spots where the depth is &lt;em&gt;really&lt;/em&gt; needed.&lt;/p&gt;
&lt;p&gt;And the biggest mistake I've made is that I didn't show how to install
software. Apart from showing Synaptics GUI for APT and hoping that it'll be
enough. But the UX and discoverability in that program is utter garbage - I
stopped using it (in favour of commandline) really soon after starting my
journey through Linuxland.&lt;/p&gt;
&lt;p&gt;Only recently I found out about a better program to show to people that aren't
really inclined on reading tons of documentation just to find that you cannot
simply install Photoshop downloaded from the Internet on your machine running
Linux - which is the case in Windows world.&lt;/p&gt;
&lt;p&gt;In Mint there is a simple &lt;code&gt;mintinstall&lt;/code&gt; package that is part of that distro -
that has quite pleasant interface and an OK discoverability of the
possibilities that lay in repositories - just one click away! Too bad I cannot
simply install it on Debian (or any other distro)&lt;/p&gt;
&lt;p&gt;Here we have &lt;code&gt;gnome-software&lt;/code&gt;, which is a really cool application in itself but
I find it lacking in at least two ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it is tied to the GNOME 3&lt;/li&gt;
&lt;li&gt;it seems that the integration runs &lt;em&gt;really&lt;/em&gt; deep, which might be confusing
  for some of the potential users I have in mind (using other desktop
    environment e.g. XFCE and installing Gnome Shell extensions isn't really
    compatible; but the extensions are listed as possible packages to install)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Considering my options I am thinking that it would be really cool to have an
application that is distro-/environment-/package manager- agnostic, that could
be used as a go-to application for users new to the Linux world that wouldn't
necessarily be an app store in the way Ubuntu Software Center is.&lt;/p&gt;
&lt;p&gt;So I started thinking about my dream "app store for linux" which would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;community curated&lt;/li&gt;
&lt;li&gt;aimed towards new users mainly, BUT also at veterans who want to find
  replacements for some proprietary/windows applications&lt;/li&gt;
&lt;li&gt;can be used offline&lt;/li&gt;
&lt;li&gt;offers integration with the distro package manager (or points to simple
  installation guides / makes out-of-distro installation possible)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And I think that the basic version of such app could be possible / easy to
implement. I hope that a day will come when I'll be able to use it.&lt;/p&gt;</content><category term="technical"></category><category term="linux"></category></entry><entry><title>Książki 2018</title><link href="https://jakub.olczyk.info/ksiazki-2018-pl.html" rel="alternate"></link><published>2018-07-25T20:00:00+02:00</published><updated>2018-07-25T20:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-07-25:/ksiazki-2018-pl.html</id><summary type="html">&lt;p&gt;Lista godnych polecenia książek, które przeczytałem w 2018 roku.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;&lt;a href="http://lubimyczytac.pl/ksiazka/254524/permakultura-seppa-holzera"&gt;Permakultura Seppa Holzera&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Świetna książka nie tylko dla posiadaczy ogrodów! Myślę, że nieźle przedstawia
zagadnienia ekologicznego podejścia do uprawy roślin. I przez ekologiczne mam
na myśli faktycznie badanie procesów w naturalnych ekosystemach!&lt;/p&gt;
&lt;p&gt;Fenomenalnie napisana i okraszona bardzo dobrymi grafikami. Świetnie się czyta
i przy okazji dowiaduje bardzo przydatnych informacji dotyczących uprawy roślin
jadalnych. Myślę, że każdy powinien to przeczytać, a szczególnie osoby
prowadzące gospodarkę rolną (na mała czy dużą skalę).&lt;/p&gt;
&lt;p&gt;Małym minusem jak dla mnie są niektóre odniesienia do "medycyny alternatywnej"
pokroju homeopatii, acz nie jest to książka napisana przez lekarza tylko
rolnika i tyczy się hodowli roślin i zwierząt. Domyślam się więc, że opisy
medycznych własności niektórych roślin należy traktować z odpowiednią dozą
rezerwy. Niemniej bardzo wartościowa książka.&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://lubimyczytac.pl/ksiazka/4685745/przewodnik-wedrowca-sztuka-odczytywania-znakow-natury"&gt;Przewodnik wędrowca. Sztuka odczytywania znaków natury - Tristan Gooley&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bardzo ciekawa książka! Całe Wydawnictwo Otwarte staje się dla mnie źródłem
bardzo wciągających odkryć czytelniczych - dla przykładu &lt;a href="http://lubimyczytac.pl/ksiazka/312354/sekretne-zycie-drzew"&gt;Sekretne życie
drzew&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Książka w dużej mierze traktuje o ćwiczeniu umiejętności obserwacji oraz
wyciągania z nich informacji dotyczących kierunków świata a także na przykład
niedawnej i dawnej przeszłości, jakości gleby i wielu innych.&lt;/p&gt;
&lt;p&gt;Największym zaskoczeniem dla mnie było, że bardzo szybko po przeczytaniu
każdego rozdziału mogłem znaleźć w moim otoczeniu pojawiające się w książce
przykłady różnych naturalnych drogowskazów.&lt;/p&gt;
&lt;p&gt;Koło mojego wydziału jest spory nieużytek, który przez dłuższy czas był
zarośnięty samosiejkami, a także kilkoma większymi krzewami. Teren został
zaorany, a drzewa wycięte. Kilka tygodni później pojawiło się bardzo dużo
łąkowych roślin i przede wszystkim maki! Maki, które najczęściej pojawiają się
w miejscach, gdzie niedawno miało miejsce oranie i wszelkie grzebanie w ziemi.
Książka wspomina również pola makowe z I i II wojny światowej, gdzie ze względu
na działania wojenne (pociski) wyrosło ich bardzo dużo i przeszył do
świadomości kulturowej(vide:&lt;a href="https://pl.wikipedia.org/wiki/Czerwone_maki_na_Monte_Cassino"&gt;Czerwone Maki na Monte
Cassino&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Przykładów z książki można mnożyć na pęczki - bardzo godna polecenia.&lt;/p&gt;
&lt;p&gt;Niestety, styl pisania jest dla mnie nieco ciężki i potrzebowałem sporo oddechu
pomiędzy poszczególnymi posiedzeniami. Być może jest to kwestia upakowania
dużej dawki informacji w każdym rozdziale - a może troszkę nieprzystępny
(przynajmniej dla mnie) sposób podziału treści? Niemniej polecam.&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://lubimyczytac.pl/ksiazka/56392/jesienna-gaweda"&gt;Jesienna gawęda - Ignacy Trzewiczek&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Zbiór tekstów dotyczących grania w papierowe RPG - Warhammera. W latach '90
robiło furorę w polskim światku graczy. Postanowiłem uzupełnić swoją
biblioteczkę o tę właśnie książkę.&lt;/p&gt;
&lt;p&gt;Muszę przyznać, że znałem dość dobrze treść tej książki przed kupnem. Mimo
wszystko uważam, że warto przeczytać i się ustosunkować - czy faktycznie
fatalistyczny sposób prowadzenia sesji w Warmłotka jest dobrym pomysłem. &lt;/p&gt;
&lt;p&gt;Domyślam się, że nie jest to książka dla wszystkich, ale mimo wszystko polecam.
Lekkie pióro + ciekawe przemyślenia, a później sensowna krytyka on-line
zdecydowanie poszerzy horyzonty każdego fana RPG a może nawet fana Fantasy?&lt;/p&gt;
&lt;p&gt;Z powiązanych książek jest jeszcze &lt;a href="https://polakpotrafi.pl/projekt/mistrzowanie-rpg"&gt;Mistrzowanie
RPG&lt;/a&gt;, co do której mam
mieszane uczucia, ale chyba dość dobrze przedstawia większy zakres możliwości
sposobów rozgrywki RPG. &lt;/p&gt;
&lt;h2&gt;&lt;a href="http://lubimyczytac.pl/ksiazka/5077/fundacja"&gt;Fundacja Isaac Asimov&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kudos dla &lt;a href="https://cezary.drak.me/"&gt;cmd&lt;/a&gt; za pokazanie mi tej książki (w
zasadzie całej serii). Bardzo sensowne Sci-Fi. Dalej jestem w trakcie czytania
serii, ale muszę przyznać, że już pierwszy tom jest bardzo dobrze napisaną
książką. Tematyka statystycznego przewidywania przyszłości
(&lt;a href="https://pl.wikipedia.org/wiki/Psychohistoria_(fantastyka_naukowa)"&gt;psychohistoria&lt;/a&gt;)
jest niesamowicie aktualna w dzisiejszym świecie (vide: &lt;a href="https://www.youtube.com/watch?v=lCjspXB5F4A"&gt;The Mathematics of
Crime and Terrorism (YouTube)&lt;/a&gt; ).&lt;/p&gt;</content><category term="posts"></category><category term="recommendation"></category><category term="list"></category></entry><entry><title>Obserwacja przyrodnicza</title><link href="https://jakub.olczyk.info/obserwacja-przyrodnicza-pl.html" rel="alternate"></link><published>2018-04-20T10:20:00+02:00</published><updated>2018-04-20T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-04-20:/obserwacja-przyrodnicza-pl.html</id><summary type="html">&lt;p&gt;dykteryjka na temat gawrona i motyla&lt;/p&gt;</summary><content type="html">&lt;p&gt;Idąc na uczelnię zobaczyłem dość niezwykły obrazek. &lt;/p&gt;
&lt;p&gt;Ogromny gawron, który gonił małego motyla, przy okazji wydając dźwięki zbliżone
do postękiwania z niezadowolenia. Wielkie czarne ptaszysko goniło małego owada
starając się go złapać lecz ten ciągle mu uciekał, tak, że dziób ciągle chwytał
pustkę.&lt;/p&gt;
&lt;p&gt;Najbardziej interesującą dla mnie sprawą jest to, że te ptaki zdają się być w
tym co robią bardzo „ludzkie”. Gawron goniąc motyla wydawał dźwięki zbliżone do
przeklinania pod nosem kiedy coś się nie uda. Doprawdy zabawna scenka --
widzieć ptaka, który zachowuje się jak każdy z nas, kiedy się coś nie udaje.&lt;/p&gt;
&lt;p&gt;Najwyraźniej frustracja jest uniwersalnym uczuciem - nie tylko domeną
człowieka.&lt;/p&gt;</content><category term="posts"></category></entry><entry><title>Warzywa na balkonie - podsumowanie sezonu 2017</title><link href="https://jakub.olczyk.info/warzywa-na-balkonie-podsumowanie-sezonu-2017.html" rel="alternate"></link><published>2018-04-15T18:20:00+02:00</published><updated>2018-04-15T18:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-04-15:/warzywa-na-balkonie-podsumowanie-sezonu-2017.html</id><summary type="html">&lt;p&gt;czyli głównie - jak hodować pomidory koktajlowe na balkonie&lt;/p&gt;</summary><content type="html">&lt;p&gt;Dość długo się zastanawiałem jak ugryźć ten post. Chyba ze 3 miesiące walczyłem
ze sobą zastanawiając się czy w ogóle powinienem coś na ten temat napisać. W
końcu ani nie jestem ekspertem, ani nie wiem co robię, nie wiem też czy
cokolwiek co robiłem miało jakikolwiek sens. Niemniej idea posiadania własnego
ogródka i jedzenia warzyw, które wyrosły przez pielęgnację roślin własnymi
rękami zawładnęła sporą częścią mojego wolnego czasu w zeszłym roku. Toteż,
chociaż dla siebie, postanowiłem zapisać do czego te moje ręce wsadziłem i jak
to było z każdą z moich upraw.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Uwaga&lt;/em&gt; w większości odnoszę się tutaj do dat zdjęć, za pomocą których
skrupulatnie starałem się uwieczniać postępy poszczególnych roślinek.&lt;/p&gt;
&lt;h3&gt;Początek upraw - zdaje się że koniec kwietnia / początek maja&lt;/h3&gt;
&lt;p&gt;Wszystko zaczęło się nieco wcześniej, ale pierwsze sukcesy odnieśliśmy właśnie
wtedy. Patrząc z perspektywy czasu już bym tego wcale tak nie zrobił, ale cóż…
W jednym kontenerku zasadziliśmy - pomidora koktajlowego, estragon, jarmuż oraz
miętę. Pomysł oczywiście był taki, żeby jak już coś wyrośnie przesadzić do
osobnych doniczek. Próbowaliśmy też z innymi roślinami - truskawką, papryką
karłowatą, niestety nie udało się im przetrwać do końca. Truskawka nam nie
wykiełkowała, a następnie całe skupienie przeszło na inne uprawy.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Początek upraw - rozsada w jednym kontenerze" src="/media/garden/smaller-0.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Przesadzanie rozsady&lt;/h3&gt;
&lt;p&gt;Kiedy nam już wszystko jako tako wyrosło rozsadziliśmy poplątane ze sobą
roślinki do osobnych kontenerków. Zioła pozostały w „rozsadniku”, ponieważ
wydawało się to nie być bardzo złym pomysłem. Później, kiedy pojawiły się u nas
mszyce na balkonie musieliśmy się pozbyć całkiem tych ziół, bo tam się robactwa
zalęgło najwięcej.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Rozsadzone sadzonki - zioła w oryginalnym kontenerku" src="/media/garden/smaller-1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Na tamten moment - 6 czerwca - mieliśmy 6 pomidorów w osobnych doniczkach.
Teraz jak o tym myślę to prawdopodobnie od razu posadziłbym je do największych
docelowych doniczek i co najważniejsze przykrył je ziemią aż do pierwszych
listków. Pomidor ma to do siebie, że wypuszcza korzenie z łodygi kiedy poczuje
że ma ku temu powody (jak np. wkopanie głębiej), a dałoby to im większą
stabilność w późniejszym okresie kiedy cała roślina ugina się pod ciężarem
owoców.&lt;/p&gt;
&lt;h3&gt;Głównie pomidory&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Zalążki kwiatostanów na pomidorach" src="/media/garden/smaller-2.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pierwszy pomidor, który zaczął nam rosnąć na krzaczku" src="/media/garden/smaller-4.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Następne zdjęcia mam z 22 czerwca - wtedy też zaczęły się pojawiać pierwsze
zalążki kwiatostanów na pomidorach. 24 czerwca postanowiłem zrobić zdjęcie
poglądowe i widać faktycznie, że pomidory się bardzo ładnie rozrosły i pokryły
liśćmi. Inne uprawy - jarmuż nadal ładnie rósł, wypuszczając piękne liście.
Pierwsze owoce zaczęły się pojawiać 1 lipca, pięć dni później były już całkiem
spore i było ich coraz więcej! Wszystko wydawało się iść w dobrym kierunku,
zostawiliśmy ogródek sam sobie 21 lipca, kiedy jechaliśmy na wakacje na
tydzień.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Rozrośnięte pomidorki" src="/media/garden/smaller-3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Dopiero po powrocie okazało się że jarmuż został „zainfekowany”… przez motyle!
Przed wyjazdem widzieliśmy kilka bielinków na balkonie, niestety, jak się
okazało później, zostawiły nam prezenty w postaci jajeczek (?) larw następnego
pokolenia. Ponieważ jarmuż w zasadzie jest rodzajem sałaty (czy może kapusty)
nadawał się doskonale na pożywkę dla młodych gąsienic bielinka. Tydzień
wystarczył żeby z jarmużu nie zostało nic.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Czerwieniące owoce pomidora" src="/media/garden/smaller-5.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Pierwszego dnia sierpnia najstarsze owoce na pomidorach zaczęły się czerwienić!
Idealnie wtedy kiedy potrzebowaliśmy jakichś dobrych wiadomości z ogrodu po
stracie części upraw. W między czasie papryka, która sobie zdecydowanie słabiej
radziła dostała nowe doniczki, co przyspieszyło wzrost.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Przesadzone papryki" src="/media/garden/smaller-6.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Pierwsze zbiory&lt;/h3&gt;
&lt;p&gt;Czwartego sierpnia mogliśmy w końcu skosztować owoców wyhodowanych własnymi
rękami! Chyba z niecierpliwości zerwaliśmy jak tylko w całości były czerwone
(więc nie jestem pewny czy nie urosły by nam jeszcze odrobinę). Były jednak
bardzo pyszne i zdecydowanie warte zachodu jaki jest potrzebny podczas
doglądania ogródka!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wrześniowe zdjęcie owoców na krzaku pomidora" src="/media/garden/smaller-7.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Następne zdjęcia mam z początku września - gdzie widać ogromne, w porównaniu do
poprzednich zdjęć, owoce! Krzaki uginały się mocno pod ciężarem i ilością
owoców, które wypuściły. Na temat samych pomidorów i wszelkich ciekawostek i
spostrzeżeń będę jeszcze pisać w przyszłości, więc tutaj nie będę wchodzić w
szczegóły. Papryka wypuszcza w tym samym okresie kwiaty, niestety - jak
większość upraw jest atakowana przez mszyce. Po przemyśleniu chyba właśnie z
tego powodu nie udało nam się doczekać wyprodukowania przez roślinkę papryki.
W tym roku na pewno będę się starać walczyć skuteczniej z wszelkim robactwem,
mam nadzieję, że metodami organicznymi, aczkolwiek być może trzeba będzie uciec
się do silniejszych metod chemicznych. Miejmy nadzieję, że do tego nie dojdzie.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Kwitnąca papryka" src="/media/garden/smaller-8.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Podsumowanie&lt;/h3&gt;
&lt;p&gt;W tym sezonie zdecydowanie będziemy się starać korzystać z nauczek wynikających
z błędów, które popełnialiśmy. Już przy wysiewie będziemy mądrzejsi i
skorzystamy z sadzarki (to chyba jest poprawne określenie), by później przy
przesadzaniu nie robić szkód dla systemu korzeniowego młodych roślinek. Ochrona
przed owadami to również będzie wyzwanie, ale może duża ilość lawendy (która ma
działanie odstraszające) wystarczy? Czas pokaże, na pewno, prędzej czy później
znajdzie się też coś na ten temat tutaj na blogu.&lt;/p&gt;</content><category term="hobby"></category><category term="gardening"></category></entry><entry><title>Installing Devuan Jessie on Thinkpad x220</title><link href="https://jakub.olczyk.info/installing-devuan-jessie-on-thinkpad-x220.html" rel="alternate"></link><published>2018-04-11T11:50:00+02:00</published><updated>2018-04-11T11:50:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-04-11:/installing-devuan-jessie-on-thinkpad-x220.html</id><summary type="html">&lt;p&gt;a short guide to combating the quirks of my machine&lt;/p&gt;</summary><content type="html">&lt;p&gt;First of all there are plenty of resources that can be found scattered around
many corners of the Internet, so I won't repeat the stuff I found here. This
post is to make my life easier (should I ever wish to reinstall my machine,
let's cross fingers it will not happen due to hardware failure. Remember about
backups!) so I decided to leave here some of the articles and what not I found
during the setup of my machine after installing Devuan Jessie. (Yay for &lt;a href="https://devuan.org/os/init-freedom/"&gt;init
freedom&lt;/a&gt;!).&lt;/p&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;p&gt;The images can be easily found on &lt;a href="https://devuan.org/index.html#download"&gt;the project website&lt;/a&gt;. I have played
around with a live CD to check how the system feels as it was my first
installation of this distro - but I would recommend getting the good ol'
netinstall ISO if you are familiar with the Debian family of operating systems. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: there is a &lt;a href="https://files.devuan.org/devuan_jessie/desktop-live/README.txt"&gt;fun ISO&lt;/a&gt; where you can play with the system (add
packages and what not) and then install the system with your changes on the
hard drive later &lt;em&gt;OR&lt;/em&gt; make your own ISO to install on some other machines for
example. I think this is pretty cool.&lt;/p&gt;
&lt;p&gt;For x220 you need to get the EFI ISO so I did just that. I used the plain old
Debian-like installer (I didn't use the graphical one, but it is also
available). &lt;a href="https://devuan.org/os/documentation/dev1fanboy/"&gt;The process is very similar to standard Debian
installation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There isn't much to it - Devuan is really nice system that isn't much more
complicated then its predecessor (at least for me there is evolutionary
hierarchy between them).&lt;/p&gt;
&lt;h3&gt;Customization and fixing some hardware issues&lt;/h3&gt;
&lt;p&gt;The only major problem so far for me was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;getting the battery configuration up and running&lt;/li&gt;
&lt;li&gt;fixing a problem with the wireless card that I got with the machine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For completeness I'll put the other problems in this paragraph. For me the only
problems (easily fixed I suppose) are connected to the suspend / hibernation
process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When I close the lid nothing happens (suspend should take place) &lt;/li&gt;
&lt;li&gt;When I use the ThinkPad special key for suspend nothing happens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As I don't leave my laptop running when I don't use it I don't think
I'll try to fix those soon. &lt;/p&gt;
&lt;h4&gt;Battery&lt;/h4&gt;
&lt;p&gt;In the past I have destroyed one battery (alright, maybe more than one!) by not
paying attention to my laptop's configuration. Happily, for Thinkpads there is
a lot of options to optimise battery life. &lt;/p&gt;
&lt;p&gt;In this particular case I suggest &lt;a href="https://wiki.archlinux.org/index.php/Lenovo_ThinkPad_X220#Battery"&gt;following the instructions on
ArchWiki&lt;/a&gt;. To give you an idea about what we need to install -
there's a bunch of nice packages that allow the kernel access to awesome
hardware features Thinkpads offer (by which I mean controlling the thresholds
when to start and when to stop charging the battery and other cool stuff that
makes sure we can make the most of the energy stored in the cells):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# apt-get install acpi-call-dkms tp-smapi-dkms tlp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then we need to configure those accordingly. Here are some useful links on how
to do that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ix.io/iwM"&gt;http://ix.io/iwM&lt;/a&gt; TLP config for battery life&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/index.php?title=Power_management"&gt;https://wiki.archlinux.org/index.php?title=Power_management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html"&gt;http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using powertop to troubleshoot problems with the software that might use too
much battery is always a good idea. It can also measure current power
consumption in Watts, so it is a nice idea to check it before and after
tweaking.&lt;/p&gt;
&lt;h4&gt;Wireless card&lt;/h4&gt;
&lt;p&gt;For some reason the card that I have:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="m"&gt;03&lt;/span&gt;:00.0&lt;span class="w"&gt; &lt;/span&gt;Network&lt;span class="w"&gt; &lt;/span&gt;controller:&lt;span class="w"&gt; &lt;/span&gt;Intel&lt;span class="w"&gt; &lt;/span&gt;Corporation&lt;span class="w"&gt; &lt;/span&gt;Centrino&lt;span class="w"&gt; &lt;/span&gt;Advanced-N&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6205&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;Taylor&lt;span class="w"&gt; &lt;/span&gt;Peak&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;rev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;34&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;didn't want to connect to any WiFi and even if it did it would soon drop the
connection never to reconnect again. Here is the clue for what's wrong taken
from the output of &lt;code&gt;dmesg&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[ 1022.122547] iwlwifi 0000:03:00.0: Error sending REPLY_SCAN_ABORT_CMD: time out after 2000ms.
[ 1022.122560] iwlwifi 0000:03:00.0: Current CMD queue read_ptr 28 write_ptr 29
[ 1022.122627] iwlwifi 0000:03:00.0: Loaded firmware version: 18.168.6.1
[ 1022.122743] iwlwifi 0000:03:00.0: Microcode SW error detected.  Restarting 0x2000000.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I was trying to find some neat solution for this problem. And I have stumbled
upon some pretty old thread on a forum somewhere (I have lost the link) talking
about the problem being fixed in later version of the kernel. Since the default
kernel in Devuan Jessie is 3.16 I needed to upgrade the kernel somehow.
Luckily, this isn't very hard (and doesn't seem to break things, at least for
me) because we can install a kernel from backports.&lt;/p&gt;
&lt;h5&gt;Upgrading kernel from backports&lt;/h5&gt;
&lt;p&gt;I have found a great article for &lt;a href="http://jensd.be/818/linux/install-a-newer-kernel-in-debian-9-stretch-stable"&gt;how to install a newer kernel from backports
in Debian&lt;/a&gt;. I recommend checking it out. As for Devuan there isn't
much difference in Jessie. One thing (due to the nature of the problem with
the network card) we have to change the &lt;code&gt;sources.list&lt;/code&gt; to include the
&lt;code&gt;non-free&lt;/code&gt; repo (unfortunately) as well in order to update the
&lt;code&gt;firmware-iwlwifi&lt;/code&gt; package that was the most probable culprit:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# echo &amp;quot;deb http://auto.mirror.devuan.org/merged jessie-backports main contrib non-free&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/backports.list&lt;/span&gt;
&lt;span class="c1"&gt;# echo &amp;quot;deb-src http://auto.mirror.devuan.org/merged jessie-backports main contrib non-free&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/backports.list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Later as the article suggests we need to perform&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# apt-get update&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;in order to get the newer packages in the local cache and later upgrade the
packages to their backports counterparts by issuing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# apt-get -t jessie-backports upgrade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For me this did the trick and updated both the kernel and the firmware of the
card, fixing the issue with this equipment.&lt;/p&gt;
&lt;p&gt;And this brings us the end of this article. Not everything has been covered
here but I hope this helps someone apart from me ;)&lt;/p&gt;
&lt;h3&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/index.php/EFISTUB"&gt;https://wiki.archlinux.org/index.php/EFISTUB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/index.php/Lenovo_ThinkPad_X220"&gt;https://wiki.archlinux.org/index.php/Lenovo_ThinkPad_X220&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thinkpad-scripts.readthedocs.io/en/latest"&gt;https://thinkpad-scripts.readthedocs.io/en/latest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://natalian.org/2011/11/10/Thinkpad_X220/"&gt;https://natalian.org/2011/11/10/Thinkpad_X220/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.jamiek.it/2011/10/arch-linux-on-thinkpad-x220.html"&gt;http://blog.jamiek.it/2011/10/arch-linux-on-thinkpad-x220.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="hardware"></category><category term="linux"></category></entry><entry><title>Using Vim's built-in spellchecker</title><link href="https://jakub.olczyk.info/using-vims-built-in-spellchecker.html" rel="alternate"></link><published>2018-03-27T20:48:00+02:00</published><updated>2018-03-27T20:48:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-03-27:/using-vims-built-in-spellchecker.html</id><summary type="html">&lt;p&gt;or how to use Vim for something else then writing code&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recently, I have took some time to evaluate my workflow when using Vim and I
started to wonder if I really need to use the &lt;code&gt;aspell&lt;/code&gt; command for checking the
spelling of the article?&lt;/p&gt;
&lt;p&gt;The answer is - of course not!&lt;/p&gt;
&lt;p&gt;Vim - being the awesome editor it is - has a built-in spellchecker. I have just
never reflected on the idea of using the editor itself for the task. I think
that my error can be more widespread, so here is the quick guide for enabling
the spellchecker.&lt;/p&gt;
&lt;p&gt;First of all, I recommend looking at the &lt;a href="http://vimdoc.sourceforge.net/htmldoc/spell.html#spell"&gt;documentation&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;:help spell
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(First thing to note is that this is strictly a Vim feature - sorry, Vi users).
But if you are lazy (or don't want to look at the docs) here is the basic modus operandi.&lt;/p&gt;
&lt;h3&gt;What to do&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Enable spell&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    :setlocal spell 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Set the language that the text is written in &lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    :setlocal spellang=en
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And that's it - now using the command &lt;code&gt;]s&lt;/code&gt; and &lt;code&gt;[s&lt;/code&gt; you can jump between the
words with bad spelling. If you wish to get advice on the spelling - having
cursor on the word press &lt;code&gt;z=&lt;/code&gt; to get a list of possible spellings.&lt;/p&gt;
&lt;p&gt;This isn't perfect, we can do better, of course. We can setup Vim to visually
show us where the badly spelled words are - like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;:highlight SpellBad cterm=underline ctermfg=red
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And now the wrong words will be colored red and underlined. (Side note: when
using GVim you can &lt;a href="http://vimdoc.sourceforge.net/htmldoc/syntax.html#undercurl"&gt;set the &lt;code&gt;cterm&lt;/code&gt; to &lt;code&gt;undercurl&lt;/code&gt;&lt;/a&gt; to achieve an effect similar
to most word processors).&lt;/p&gt;
&lt;p&gt;I hope this was somewhat interesting and useful to read. There are more the
this 'subsystem' in Vim - I strongly recommend digging through the
documentation.&lt;/p&gt;</content><category term="technical"></category><category term="vim"></category><category term="programming"></category></entry><entry><title>Jak zrobić jogurt w domu?</title><link href="https://jakub.olczyk.info/jak-zrobic-jogurt-w-domu-pl.html" rel="alternate"></link><published>2018-03-21T21:20:00+01:00</published><updated>2018-03-21T21:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-03-21:/jak-zrobic-jogurt-w-domu-pl.html</id><summary type="html">&lt;p&gt;czyli sposób na przyoszczędzenie i fajną zabawę z fermentacją&lt;/p&gt;</summary><content type="html">&lt;p&gt;Coś mnie tknęło i po zobaczeniu &lt;a href="https://www.youtube.com/watch?v=3ur9OPStm_4"&gt;filmu Clive'a na temat urządzenia do
wytwarzania jogurtu&lt;/a&gt; postanowiłem zrobić to samo w domu, ponieważ
proces wydaje się być banalnie prosty!&lt;/p&gt;
&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;mleko 3.2% UHT (najtłustsze najlepsze) 1 litr&lt;/li&gt;
&lt;li&gt;jogurt zawierający żywe kultury bakterii&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;p&gt;Potrzebne nam będą pojemniki fermentacyjne. Ja skorzystałem z 4 słoików, w
których idealnie zmieścił się litr mleka. Odkażamy pokrywki wrzątkiem,
pojemniki się odkażą przy okazji ogrzewania mleka. Do podgrzania mleka można
wykorzystać dwa sposoby:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;W garnku, który znajduje się w drugim garnku z wodą (&lt;em&gt;double boiler&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;W mikrofalówce&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ja skorzystałem z drugiej opcji i zagrzałem mleko bezpośrednio w słoju do
fermentacji. Dzięki temu odkaziłem również pojemnik.&lt;/p&gt;
&lt;p&gt;Po zagrzaniu mleka jogurt z bakteriami należy wyciągnąć z lodówki, żeby
znajdujące się tam mikroby „się obudziły” poprzez podniesienie temperatury z
lodówkowej do pokojowej.&lt;/p&gt;
&lt;p&gt;Mleko w tym czasie ma się ostudzić przynajmniej do temperatury 40-46 stopni
Celsjusza. Wtedy można dodać do każdego słoika 2 łyżeczki kupionego jogurtu.
Następnie należy inkubować mleko w temperaturze zbliżonej do temperatury ciała
(36-38 stopni). Ja przeniosłem słoiki w pobliże kaloryfera lekko odkręconego,
ale można też skorzystać z innych metod. Istnieją na przykład specjalne
inkubatory (takie jak w linkowanym filmie). Można również skorzystać z torby
termicznej/lodówki turystycznej, do której wrzucimy jeszcze jakieś źródło
ciepła (słoik z wodą o temperaturze 80-90 stopni).&lt;/p&gt;
&lt;p&gt;Fermentujemy nasz produkt do osiągnięcia przez niego jogurtowej konsystencji
lub pożądanych walorów smakowych (Clive w filmie mówi o czasie 8 godzin).&lt;/p&gt;
&lt;p&gt;Mój jogurt był gotowy w nieco późniejszym czasie - na noc wyłączyłem kaloryfer
(o czym nie wiedziałem, bo najwyraźniej 2 oznacza przestań grzać). Potem
ustawiłem niskie grzanie i poszedłem do pracy. Jak wróciłem miałem już gotowy
jogurt, który wystarczy włożyć do lodówki lub od razu zjeść :)&lt;/p&gt;</content><category term="hobby"></category><category term="fermentation"></category></entry><entry><title>Adding comments to Pelican</title><link href="https://jakub.olczyk.info/adding-comments-to-pelican.html" rel="alternate"></link><published>2018-03-19T20:20:00+01:00</published><updated>2018-03-19T20:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-03-19:/adding-comments-to-pelican.html</id><summary type="html">&lt;p&gt;What to consider when dealing with comments on static site&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have said it before - I love using Pelican for writing my blog! Yet there is
this one missing piece in writing a statically generated blog - the commenting
system.&lt;/p&gt;
&lt;p&gt;I mean yes - &lt;a href="https://disqus.com/"&gt;there&lt;/a&gt; &lt;a href="https://schnack.cool/"&gt;are&lt;/a&gt; &lt;a href="https://jimpick.com/2016/05/05/introducing-lambda-comments/"&gt;solutions&lt;/a&gt; to this
problem. Still, I feel that none of them are fully satisfying.&lt;/p&gt;
&lt;p&gt;In case of Pelican, there are ready-to-go plugins that make the experience of
adding the possibility to comment a breeze. And there is one particular
solution that looks very promising to me. Namely, the &lt;a href="https://github.com/Scheirle/pelican_comment_system"&gt;Pelican Comment
System&lt;/a&gt;, which uses good old e-mail to 'post' the comment. That needs
later processing, which of course, can be automated. But adding a form that is
similar looking to the standard one found in any CMS with all of the fields
already in place needs to use JavaScript. And I would like to avoid using this
piece of technology here.&lt;/p&gt;
&lt;p&gt;I have been using that plugin for my blog in the past but not any more due to
the loss of previous configuration (remember to always make &lt;em&gt;recoverable&lt;/em&gt;
backups! Learn from my mistakes!) but now I don't feel like setting it up
again.&lt;/p&gt;
&lt;p&gt;Yet, I think I come up with decent idea to encourage discussion via mail
without the hassle needed for setting up the plugin. And here it is - for all
of you, Pelican users! &lt;/p&gt;
&lt;p&gt;It is one file that you could &lt;code&gt;include&lt;/code&gt; in your &lt;code&gt;article.html&lt;/code&gt; template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;hr&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;comments-section&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;comments-button&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mailto:jon.doe@example.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Send me feedback via e-mail!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On click visitors' browser should try to start their e-mail client. One neat
thing is that you can prefill &lt;code&gt;subject&lt;/code&gt; as well as &lt;code&gt;body&lt;/code&gt; for them with Pelican
variables like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;hr&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;comments-section&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;comments-button&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mailto:jon.doe@example.com?subject=Blog%20comment:{{ article.name }}&amp;amp;body=Hi%20Jon!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Send me feedback via e-mail&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For each article this part will then be generated with appropriate article name.
I think this might be quite useful for some people, so use this 'hack' freely.
Happy writing with Pelican!&lt;/p&gt;</content><category term="technical"></category></entry><entry><title>Monit plugin for checking APT updates on Debian</title><link href="https://jakub.olczyk.info/monit-plugin-for-checking-apt-updates-on-debian.html" rel="alternate"></link><published>2018-03-19T18:50:00+01:00</published><updated>2018-03-19T18:50:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-03-19:/monit-plugin-for-checking-apt-updates-on-debian.html</id><summary type="html">&lt;p&gt;Useful Perl script inspired by the NagiOS plugin&lt;/p&gt;</summary><content type="html">&lt;p&gt;It has been at least 2 years since I have been using &lt;a href="https://mmonit.com/monit/"&gt;Monit&lt;/a&gt; for active
monitoring my VPS and I must say I think this is a really good solution for
anybody that wants&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;something that Just Works&amp;trade;&lt;/li&gt;
&lt;li&gt;something that doesn't use that much resources&lt;/li&gt;
&lt;li&gt;generally does one thing and does it well&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For me Monit fits perfectly well in that criteria. And it has the ability to
adapt to ones needs. I mean just look at the &lt;a href="https://mmonit.com/wiki/Monit/ConfigurationExamples"&gt;documentation examples&lt;/a&gt;!&lt;/p&gt;
&lt;h3&gt;My 'plugin'&lt;/h3&gt;
&lt;p&gt;So as I was reading the docs I found out that there possibly is no script for
checking if the system is up-to-date. Having security in mind I have checked
what the script from Nagios does to accomplish this task. Turns out that's just
good ol' Perl script parsing the output of &lt;code&gt;apt-get&lt;/code&gt; calls.&lt;/p&gt;
&lt;p&gt;Then I thought - I can do that myself and maybe even add some features I need.
Thus, my 'plugin' (script) for parsing &lt;code&gt;apt-get&lt;/code&gt; emerged. It can be found on my
&lt;a href="https://github.com/jakub-olczyk/monit-check-debian-updates"&gt;GitHub as monit-check-debian-updates&lt;/a&gt;.
Now that I think of it - the script should be named YAAPS or something - which
stands of course for - Yet Another APT Parsing Script.&lt;/p&gt;
&lt;p&gt;Currently you only can add a configuration that looks like this (or similar)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;program&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;apt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;updates&lt;/span&gt;.&lt;span class="nv"&gt;pl&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;alert&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;But in the future there should be more to it. Or not. Depends on my enthusiasm
to add the missing features. I am posting in hope that someone finds this
script kinda useful.&lt;/p&gt;</content><category term="technical"></category><category term="recommendation"></category><category term="programming"></category><category term="perl"></category></entry><entry><title>Domowe medaliony warzywne jak z Ikei</title><link href="https://jakub.olczyk.info/domowe-medaliony-warzywne-jak-z-ikei-pl.html" rel="alternate"></link><published>2018-02-17T19:20:00+01:00</published><updated>2018-02-17T19:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-02-17:/domowe-medaliony-warzywne-jak-z-ikei-pl.html</id><summary type="html">&lt;p&gt;Całkiem prosty przepis na 12 medalionów warzywnych&lt;/p&gt;</summary><content type="html">&lt;p&gt;Dzisiaj pokusiliśmy się na zrobienie własnoręcznie medalionów warzywnych.
Okazuje się, że można bardzo szybko sobie odtworzyć przepis z Ikei na
&lt;a href="http://www.ikea.com/pl/pl/catalog/products/40212482/"&gt;grönsakskaka&lt;/a&gt;. Znalazłem &lt;a href="https://www.szczesliva.pl/moj-przepis-na-pyyyszne-medaliony-warzywne-z-ikea-mmm/"&gt;przepis w sieci, na którym
się wzorowałem&lt;/a&gt;, ale jak to zwykle bywa został on dostosowany do naszych
upodobań ;)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Gotowe medaliony" src="/media/cooking/medaliony_1.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;4 ziemniaki (średnie)&lt;/li&gt;
&lt;li&gt;1 brokuł (średni)&lt;/li&gt;
&lt;li&gt;1 cebula &lt;/li&gt;
&lt;li&gt;2 jajka&lt;/li&gt;
&lt;li&gt;2 łyżki śmietany (gęstej)&lt;/li&gt;
&lt;li&gt;ok. 150g sera (np Gouda)&lt;/li&gt;
&lt;li&gt;3 pieczarki&lt;/li&gt;
&lt;li&gt;4-5 łyżki kukurydzy&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sposób przygotowania&lt;/h3&gt;
&lt;p&gt;Najsamprzód należy - ziemniaki pokroić w kostkę (drobniejsza raczej lepsza) i
do osolonego wrzątku, gotujemy 10 min, brokuł też pokroić na mniejsze kawałki i
gotować przez 4-5 minut. &lt;/p&gt;
&lt;p&gt;W międzyczasie - serek zetrzeć na większych oczkach, cebulę pokroić w kostkę.
Pieczarki pokroić na drobne kawałki i przesmażyć. Piekarnik nastawić na 180
stopni, żeby zdążył się zagrzać.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Składniki w misce" src="/media/cooking/medaliony_2.jpg"&gt;
&lt;img alt="Składniki wymieszane" src="/media/cooking/medaliony_3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Następnie do miski wrzucamy wszystkie składniki - dodajemy do tego śmietanę i
wbijamy jajka. Teraz należy wszystko dokładnie wymieszać, a następnie
przerzucić na tackę do muffinek (względnie domyślam się, że można by też zrobić
„kopczyki” na blasze i powinno to dać radę). Tackę dobrze jest zawczasu
wysmarować masłem.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pieczenie" src="/media/cooking/medaliony_4.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Pieczemy je około 25 minut, w każdym razie dopóki się nam dobrze nie zarumienią
od góry.&lt;/p&gt;
&lt;p&gt;Protip - żeby je wyciągnąć z tacki dobrze jest odkleić nożem od ścianek a
następnie wyciągnąć medalion łyżką.&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Numerologia w PKP</title><link href="https://jakub.olczyk.info/numerologia-w-pkp-pl.html" rel="alternate"></link><published>2018-02-16T16:20:00+01:00</published><updated>2018-02-16T16:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-02-16:/numerologia-w-pkp-pl.html</id><summary type="html">&lt;p&gt;Błędy w numeracji pociągów Intercity i jak znaleźć dogodne miejsce w pociągu&lt;/p&gt;</summary><content type="html">&lt;p&gt;Zawsze miałem pociąg do kolei. Jakoś chyba tak ujawniają się tradycje rodzinne
poprzez mój dość romatyczny stosunek do podróży właśnie tym środkiem
transportu. Zawsze lubiłem przyglądać się jak za oknem uciekaja świat i muszę
przyznać, że bardzo przyjemnie czytało mi się &lt;a href="https://pl.wikipedia.org/wiki/Stefan_Grabi%C5%84ski"&gt;kolejowe opowiadania grozy z
międzywojnia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nie zmienia to oczywiście faktu, że nie jestem ślepy na wszelkie absurdy oraz
niedociągnięcia obecnego stanu rzeczy jaki jest na kolei, ale nie będę na ten
temat schodził, bo nie ma sensu dodawać do postu tagu &lt;code&gt;rant&lt;/code&gt; ;)&lt;/p&gt;
&lt;p&gt;Niemniej zaintrygowało mnie mocno dlaczego (i czy czasem nie jest to &lt;a href="https://pl.wikipedia.org/wiki/Off_by_one"&gt;znany
wszystkim informatykom „błąd o jeden”&lt;/a&gt;) kiedy kupuję bilet przez
system elektroniczny PKP dostaję inny numer pociągu niż numeracja z jaką mogę
się spotkać na dworcu, co kluczowe, zawsze różniąca się o jedną jednostkę.&lt;/p&gt;
&lt;p&gt;Spójrzmy na przykład z biletu oraz korespondujący plakat z dworca (&lt;em&gt;bilet
odpowiada starszej wersji rozkładu, stąd rozbieżność w godzinach&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Część biletu z zaznaczonym numerem pociągu" src="/media/pkp-bilet.png"&gt;
&lt;img alt="Ten sam pociąg z innym numerem na plakacie" src="/media/pkp-plakat.png"&gt;&lt;/p&gt;
&lt;p&gt;Być może zaskoczeniem dla niektórych może być fakt, że można sobie sprawdzić z
jakiego peronu odjeżdża dany pociąg bez (czasem długiej) wycieczki na dworzec.
Dla mnie znalezienie tego na stronach PKP było objawieniem, więc link do
&lt;a href="https://portalpasazera.pl/Plakaty"&gt;wyszukiwarki plakatów z rozkładami, gdzie można znaleźć peron, z którego
odjeżdża pociąg&lt;/a&gt; pozostawiam w tym paragrafie.&lt;/p&gt;
&lt;p&gt;Niemniej po spędzeniu podróży z Krakowa do Rzeszowa na bezowocnym poszukiwaniu
odpowiedzi na nurtujące mnie pytanie - co tu się dzieje? Zostawiam ten post bez
odpowiedzi. Może ktoś mnie oświeci?&lt;/p&gt;
&lt;h2&gt;Bonus - numeracja miejsc w przedziale&lt;/h2&gt;
&lt;p&gt;Przy okazji szperając na temat numeracji pociągów znalazłem taki ciekawy &lt;a href="https://plus.google.com/116459039951553721711/posts/GgCa2yJRHqY"&gt;post
z G+ opublikowany w 2012 roku&lt;/a&gt; (który dla potomności wklejam tutaj w
niezmienionej formie):&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3&gt;Jak siedzieć koło siebie, czyli numeracja miejsc w wagonach bezprzedziałowych Intercity&lt;/h3&gt;
&lt;p&gt;Miejsca w wagonach Intercity są numerowane od 1 do 6 w wagonach z
przedziałami i od 1 do 8 w wagonach bezprzedziałowych. Dlatego nie istnieją
miejsca z końcówkami 9 i 0.&lt;/p&gt;
&lt;p&gt;Jeśli chcesz dwa bilety koło siebie - nie jest to prosta sprawa. Panie w
kasie na ogół nie mają pojęcia jakie miejsca sprzedać i regularnie widzę
zdziwionych pasażerów, którzy chcieli obok a siedzą po przeciwnych stronach
korytarza.&lt;/p&gt;
&lt;p&gt;Przyda się ściąga:&lt;/p&gt;
&lt;p&gt;Miejsca kończące się na 1 i 3, oraz, 5 i 7, oraz 6 i 4 oraz 8 i 2 - siedzą
parami obok siebie. 1 i 3 oraz 5 i 7 to jeden rząd.&lt;/p&gt;
&lt;p&gt;Jeśli chcesz siedzieć od okna to numery 5 i 6 oraz 1 i 2 są dla Ciebie.&lt;/p&gt;
&lt;p&gt;Dlaczego nie polecam siadania od okna?
- śmietnik ogranicza miejsce na nogi
- czasem zamiast okna jest ściana a nie okno, zresztą wtedy jest super, bo...
- pod oknami jest klimatyzacja, która wieje na twarz - przeziębienie murowane,
- w zimie dodatkowo ogrzewanie przygrzewa łokcie
- często wieszak wypada nad głową, jeśli ktoś wiesza płaszcze lub kurtki - to siedzącemu przy oknie bimbają całą drogę.&lt;/p&gt;
&lt;p&gt;Cały problem ze zrozumieniem położenia miejsc względem siebie w wagonie
bezprzedziałowym ma zapewne podłoże historyczne. Przeprowadziłem mały
research. Wychodząc od wagonów z przedziałami układ wygląda tak:&lt;/p&gt;
&lt;p&gt;[okno] 16 14 12 [drzwi]&lt;/p&gt;
&lt;p&gt;[okno] 15 13 11 [drzwi]&lt;/p&gt;
&lt;p&gt;Istnieją też wagony przedziałowe, ośmioosobowe. Zapewne powstały później (co
by potwierdzała ta analiza). Ich układ wygląda tak:&lt;/p&gt;
&lt;p&gt;[okno] 16 14 18 12 [drzwi]&lt;/p&gt;
&lt;p&gt;[okno] 15 17 13 11 [drzwi]&lt;/p&gt;
&lt;p&gt;No i tutaj mamy rozwiązanie zagadki dziwacznej numeracji w obecnych wagonach
bezprzedziałowych. Jakiś pokręcony umysł, wstawił dodatkowe dwa miejsca,
totalnie bez logiki. Szczególnie chodzi o miejsce 18. Możliwe, że nie chcieli
zamieniać numerów od okna i drzwii, stąd potrzeba wstawienia ich w środek (co
już jest małym absurdem). Ale czemu 18 trafiło po skosie a nie naprzeciwko?
Stąd już prosta droga do obecnej numeracji w bezprzedziałówkach. Wystarczy&lt;/p&gt;
&lt;p&gt;korytarz wstawić w środek i mamy kolejny absurd polskich kolei.&lt;/p&gt;
&lt;p&gt;36 34 38 32&lt;/p&gt;
&lt;p&gt;35 37 33 31&lt;/p&gt;
&lt;p&gt;26 24 28 22&lt;/p&gt;
&lt;p&gt;25 27 23 21&lt;/p&gt;
&lt;p&gt;16 14 18 12&lt;/p&gt;
&lt;p&gt;15 17 13 11
&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="posts"></category></entry><entry><title>Protokół iteracyjny w Pythonie</title><link href="https://jakub.olczyk.info/protokol-iteracyjny-w-pythonie-pl.html" rel="alternate"></link><published>2018-01-27T10:20:00+01:00</published><updated>2018-01-27T10:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-01-27:/protokol-iteracyjny-w-pythonie-pl.html</id><summary type="html">&lt;p&gt;Jak ciekawie podejść do pisania BFS'a w Pythonie przy pomocy protokołu iteracyjnego&lt;/p&gt;</summary><content type="html">&lt;p&gt;Python jest językiem, do którego mam bardzo ambiwalentny stosunek. Z jednej
strony bardzo mi się podoba to, w jaki sposób się w nim pisze, z drugiej widzę w
nim pewne założenia które zupełnie mi nie odpowiadają (powiedzmy, że nie
jestem największym fanem programowania obiektowego). Nie można mu jednak
zarzucić tego, że jest brzydki lub &lt;a href="https://en.wikipedia.org/wiki/Write-only_language"&gt;mało czytelny&lt;/a&gt; (co często ma miejsce w
przypadku Perla, w którym również zdarza mi się programować). &lt;/p&gt;
&lt;p&gt;Jedna z rzeczy, która w Pythonie mi się bardzo podoba to możliwość
zdefiniowania, &lt;a href="https://docs.python.org/2/library/stdtypes.html#iterator-types"&gt;w jaki sposób będziemy iterować&lt;/a&gt; po klasie,
którą sami tworzymy.&lt;/p&gt;
&lt;p&gt;Weźmy na przykład strukturę, która nie jest liniowa, w tym przypadku niech to
będzie graf: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Przyjmijmy, że mamy graf który w przybliżeniu wygląda tak&lt;/span&gt;
&lt;span class="c1"&gt;# &lt;/span&gt;
&lt;span class="c1"&gt;#     A          E&lt;/span&gt;
&lt;span class="c1"&gt;#    / \        /&lt;/span&gt;
&lt;span class="c1"&gt;#   /   \      /&lt;/span&gt;
&lt;span class="c1"&gt;#  B-----C----D-----F&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Tłumacząc to na kod można by otrzymać taki zapis  &lt;/span&gt;

&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;F&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;])&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Są różne sposoby przechodzenia przez wszystkie wierzchołki grafu, na przykład
przeszukiwanie wszerz (&lt;a href="https://pl.wikipedia.org/wiki/Przeszukiwanie_wszerz"&gt;Breadth-First Search&lt;/a&gt;) czy przeszukiwanie w głąb
(&lt;a href="https://pl.wikipedia.org/wiki/Przeszukiwanie_w_g%C5%82%C4%85b"&gt;Depth-First Search&lt;/a&gt;) oba podejścia mają swoje zady i walety, są również
podstawą dla innych bardziej złożonych algorytmów (np. przy rozwiązywaniu
&lt;a href="https://pl.wikipedia.org/wiki/Problem_maksymalnego_przep%C5%82ywu"&gt;problemu maksymalnego przepływu&lt;/a&gt;) dlatego wspaniale by było napisać
po prostu coś takiego:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bfs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;

&lt;span class="c1"&gt;# skutkuje wypisaniem&lt;/span&gt;
&lt;span class="c1"&gt;# 0 A&lt;/span&gt;
&lt;span class="c1"&gt;# 1 B&lt;/span&gt;
&lt;span class="c1"&gt;# 2 C&lt;/span&gt;
&lt;span class="c1"&gt;# 3 D&lt;/span&gt;
&lt;span class="c1"&gt;# 4 E&lt;/span&gt;
&lt;span class="c1"&gt;# 5 F&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;a następnie skupić się na implementacji szczegółów innych rozwiązań&lt;/p&gt;
&lt;p&gt;I Python nam na to pozwala! &lt;/p&gt;
&lt;p&gt;Trzeba jedynie zdefiniować iterator, który będzie przechodzić przez wierzchołki
grafu w odpowiedni sposób.&lt;/p&gt;
&lt;h3&gt;Pisanie iteratora&lt;/h3&gt;
&lt;p&gt;Po pierwsze, trzeba by zdefiniować klasę reprezentującą graf. Załóżmy, że mamy
już to zrobione (możemy mieć macierz albo listy przyległości). W takim wypadku
będziemy mieć zdefiniowaną (jak w przykładzie powyżej) następującą metodę
zwracającą iterator, który będzie przechodzić przez graf zaczynając od
konkretnego wierzchołka (&lt;code&gt;start&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bfs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# utwórz i zwróć obiekt iteratora &lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_bfs_iterator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Iterator musi przechowywać obecny stan iteracji (pozwala na odwołanie się do
bierzącego elementu) oraz posiadać wiedzę o tym, w jaki sposób przejść do
następnego elementu z kolekcji. Można powiedzieć, że jest to uogólnione pojęcie
wskaźnika.&lt;/p&gt;
&lt;p&gt;Spróbujmy to napisać zgodnie z wymaganiami Pythona, które wyglądają
następujaco:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The iterator objects themselves are required to support the following two
methods, which together form the iterator protocol:&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;iterator.__iter__()&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Return the iterator object itself. This is required to allow both containers
and iterators to be used with the &lt;code&gt;for&lt;/code&gt; and &lt;code&gt;in&lt;/code&gt; statements. This method
corresponds to the tp_iter slot of the type structure for Python objects in
the Python/C API.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;iterator.next()&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Return the next item from the container. If there are no further items, raise
the StopIteration exception. This method corresponds to the tp_iternext slot
of the type structure for Python objects in the Python/C API.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Zdefiniujmy klasę następująco:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_bfs_iterator&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_v&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="c1"&gt;# musimy zapisać gdzieś &lt;/span&gt;
                          &lt;span class="c1"&gt;# odwiedzone wierzchołki&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fifo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deque&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fifo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# dodajemy element od&lt;/span&gt;
                                  &lt;span class="c1"&gt;# którego będziemy zaczynać&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;W celu zapisania, które wierzchołki odwiedziliśmy posłużę się tutaj słownikiem.
W ten sposób będziemy mogli skorzystać z szybszego dostępu do elementów
słownika, co przyspieszy wykonanie przy korzystaniu z pythonowego &lt;code&gt;in&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Zdefiniujmy, więc pierwszą metodę potrzebną do protokołu iteracyjnego Pythona
(uwaga, brak wybuchów).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__iter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Teraz zaimplementujemy BFS w metodzie &lt;code&gt;next&lt;/code&gt; uwzględniając wymogi Pythona:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fifo&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;vertex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fifo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popleft&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;vertex&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# Zapamiętujemy wierzchołek, który odwiedzamy&lt;/span&gt;
                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
                &lt;span class="c1"&gt;# dodajemy jego sąsiadów &lt;/span&gt;
                &lt;span class="c1"&gt;# jako kolejnych do odwiedzenia&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adj_list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fifo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;StopIteration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;vertex&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Kiedy dodajemy sąsiadów do kolejki odwołujemy się do wewnętrznej listy (dwu
wymiarowej) przyległości dla wierzchołka, który teraz odwiedzamy, w tym wypadku
nazwałem ją &lt;code&gt;adj_list&lt;/code&gt;. Równie dobrze mogłaby to być metoda, która zwraca
przylegające wierzchołki, gdyby implementacja grafu polegała na macierzy.&lt;/p&gt;
&lt;p&gt;I w tym momencie skończyliśmy naszą pracę! Mamy iterator, dzięki któremu możemy
przejść po grafie przy użyciu wbudowanego, pythonowego &lt;code&gt;for&lt;/code&gt;a.&lt;/p&gt;
&lt;p&gt;Zachęcam do napisania również DFSa w takiej formie jako ćwiczenie ;) &lt;/p&gt;
&lt;p&gt;A także do przejrzenia &lt;a href="https://github.com/jakub-olczyk/graph.py"&gt;mojej implementacji grafu na GitHubie&lt;/a&gt;, gdzie
napisałem oba iteratory. Wszelkie uwagi do tekstu, jak i do samej implementacji
mile widziane (jak zawsze zachęcam do skorzystania z poczty elektronicznej).&lt;/p&gt;</content><category term="technical"></category><category term="programming"></category><category term="python"></category></entry><entry><title>Studencka maca/placki z mąki/biedapizza</title><link href="https://jakub.olczyk.info/studencka-macaplacki-z-makibiedapizza.html" rel="alternate"></link><published>2018-01-12T10:20:00+01:00</published><updated>2018-01-12T10:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2018-01-12:/studencka-macaplacki-z-makibiedapizza.html</id><summary type="html">&lt;p&gt;Prosty i szybki przepis na dwa placuszki, czas przygotowania ~ 20-25min (z krojeniem dodatków i zapiekaniem serka)&lt;/p&gt;</summary><content type="html">&lt;p&gt;Okej, znów świeci słońce (chyba, że jest zima - wtedy słońce wstaje dopiero
koło południa na jakieś 15 minut i znów ma wszystkich i wszystko w du…żym
poważaniu), więc jest rano. Trzeba coś zjeść na szybko, bo do pracy/na
uczelnię… itp. &lt;/p&gt;
&lt;p&gt;Ale cóż to! Znów nie ma chleba, żeby zjeść kromkę, a w lodówce zostały jakieś
inne składniki, które najlepiej pasowałyby na kanapce?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Worry not!&lt;/em&gt; Ale tylko jeśli masz mąkę i wodę! Będziemy robić bieda-pizzę!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Gotowe placki" src="/media/cooking/maca_tasty.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Składniki na &lt;a href="https://pl.wikipedia.org/wiki/Maca"&gt;macę&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1-2 szklanki mąki (zależy od tego jak bardzo jest się głodnym)&lt;/li&gt;
&lt;li&gt;0.5-1 szklanki wody&lt;/li&gt;
&lt;li&gt;odrobina oleju roślinnego&lt;/li&gt;
&lt;li&gt;opcjonalnie przyprawy (sól, pieprz)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Przygotowanie&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Krok 1" src="/media/cooking/maca_1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Wysyp mąkę na stolnicę (względnie płaską {czystą!} powierzchnię) tak aby
powstał ładny kopczyk, w którym można zrobić kraterek na wodę. Następnie
umiejętnie, żeby się nie upaćkać mąką ani wodą, postaraj się połączyć oba te
składniki. &lt;em&gt;Protip&lt;/em&gt;: wodę dodawaj powoli i po troszeczce (zwróć uwagę jak
bardzo zdrobniłem to słowo!). Ciasto należy wyrobić -- to jest rozgniatać na
płasko a następnie zawijać do kulki i tak w koło Macieju… Aż zacznie
przypominać ciasto na pizze - czyli jednolitą masę bez grudek (w zasadzie jak
plastelina).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Krok 2" src="/media/cooking/maca_2.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Kiedy ciasto zacznie się lepić do ręki i wszelkie grudki się już połączą w
jedną kulkę warto się zastanowić czy nie dodać jeszcze wody. Chcemy osiągnąć
konsystencję miękkiej plasteliny (bo z taką da się coś zrobić jeśli pamiętasz z
przedszkola). A gdy jest za mało wody ciasto nie daje się za bardzo ugnieść na
płasko. Dodawanie wody spowoduje, że bedzie się lepić dość mocno (i ślizgać),
ale cierpliwie ugniatając otrzymamy nagrodę w postaci masy, którą da się
formować.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Krok 3" src="/media/cooking/maca_3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Teraz należy kulkę, którą mamy w dłoni podzielić na dwie mniejsze i rozwałkować
na cieniutki placek. W między czasie powinniśmy już rozgrzać olej na patelni,
tak, że kiedy wrzucimy na nią placek powinno nam troszkę zaskwierczeć.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Krok 4" src="/media/cooking/maca_4.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Placki smażymy do momentu aż zrobią się rumiane po obu stronach. I gotowe!&lt;/p&gt;
&lt;p&gt;Teraz czas na dodanie sosów, serów, szynków, warzywków i innych przysmaków coby
sobie tym prostym daniem jak najlepiej dogodzić.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Inny sposób podania" src="/media/cooking/maca.jpg"&gt;&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>Kurczak pieczony w sosie miodowo-piwnym z warzywami</title><link href="https://jakub.olczyk.info/kurczak-pieczony-w-sosie-miodowo-piwnym-z-warzywami-pl.html" rel="alternate"></link><published>2017-01-15T10:20:00+01:00</published><updated>2017-01-15T10:20:00+01:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2017-01-15:/kurczak-pieczony-w-sosie-miodowo-piwnym-z-warzywami-pl.html</id><summary type="html">&lt;p&gt;przepis na 2 osoby, czas przygotowania (z pieczeniem) około 1.5h&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Przykładowy sposób podania kurczaka" src="/media/cooking/kurczak.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Składniki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2 nogi z kurczaka&lt;/li&gt;
&lt;li&gt;2 marchewki (duże)&lt;/li&gt;
&lt;li&gt;2 ziemniaki (większe)&lt;/li&gt;
&lt;li&gt;pół puszki zielonego groszku&lt;/li&gt;
&lt;li&gt;1 piwo&lt;/li&gt;
&lt;li&gt;4 łyżki miodu&lt;/li&gt;
&lt;li&gt;przyprawa do kurczaka (ziołowa będzie niezła)&lt;/li&gt;
&lt;li&gt;przyprawa do ziemniaków&lt;/li&gt;
&lt;li&gt;papryka (najlepiej wędzona)&lt;/li&gt;
&lt;li&gt;4 łyżki oleju (sezamowy jest niezły)&lt;/li&gt;
&lt;li&gt;sól&lt;/li&gt;
&lt;li&gt;pieprz&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sposób przygotowania&lt;/h3&gt;
&lt;p&gt;Najlepiej zacząć od przygotowania kurczaka, ale żeby do tego przejść
należy sporządzić roztwór, w którym będziemy go moczyć.&lt;/p&gt;
&lt;p&gt;Do miski wlewamy nasz olej, następnie dodajemy około 100ml piwa i
dorzucamy tam miód, następnie około 2-3 łyżeczki przyprawy do kurczaka
(jeśli jest ziołowa, dodajemy tyle samo papryki), następnie sól i pieprz
do smaku. Wszystko trzeba porządnie wymieszać do momentu kiedy rozrobią
się grudki miodu.&lt;/p&gt;
&lt;p&gt;Umyte nogi wrzucamy i porządnie nacieramy naszym specyfikiem. Najlepiej
zostawić teraz mięso w lodówce żeby się troszkę przegryzło (wystarczy
jakieś 20min, ale 3 godziny i więcej prawdopodobnie polepszyłyby smak).&lt;/p&gt;
&lt;p&gt;Teraz czas na warzywa - obieramy ze skórki i kroimy w dość grube plastry
(około 8-10mm). Rozkładamy na blasze do pieczenia i posypujemy przyprawą
do ziemniaków.&lt;/p&gt;
&lt;p&gt;Wyciągamy kurczaka i kładziemy go na warzywach. "Sos", który nam został
należy równomiernie rozprowadzić po wszystkich warzywach i mięsie.&lt;/p&gt;
&lt;p&gt;Mięso piec w 180 stopniach przez około 60 min pamiętając o podlewaniu
pozostałym piwem (połowę można wypić, bo nie potrzeba go aż tak wiele)
oraz sosem, który wytworzy się podczas pieczenia co około 10-15 min.&lt;/p&gt;
&lt;p&gt;Smacznego!&lt;/p&gt;</content><category term="hobby"></category><category term="cooking"></category></entry><entry><title>newsbeuter - RSS for YouTube and more</title><link href="https://jakub.olczyk.info/newsbeuter-rss-for-youtube-and-more.html" rel="alternate"></link><published>2016-10-14T00:00:00+02:00</published><updated>2016-10-14T00:00:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2016-10-14:/newsbeuter-rss-for-youtube-and-more.html</id><summary type="html">&lt;p&gt;My thoughts on the commandline RSS reader and tips for multimedia content&lt;/p&gt;</summary><content type="html">&lt;p&gt;Turns out I have been using newsbeuter as my go-to
&lt;a href="https://en.wikipedia.org/wiki/RSS"&gt;RSS&lt;/a&gt; reader for a year now. I used
Liferea in the past and frankly I was satisfied with the experience but…
(there are always some buts!) I realized what a memory hog that program
was. With that mindset I switched to
&lt;a href="https://www.newsbeuter.org/"&gt;newsbeuter&lt;/a&gt; and I don't plan on going
back! It fits my workflow quite nicely and moreover it tends to do one
job and does it well! You can pipe articles to other commands (very UNIX
approach) and it proves to be useful.&lt;/p&gt;
&lt;h1&gt;Podcasts, web comics and video streams in RSS&lt;/h1&gt;
&lt;p&gt;RSS nowadays is more about media than textual content (which is sort of
sad) but it still is useful for syndication. And newsbeuter is great for
managing large number of feeds. Despite being based in terminal you can
still experience videos or listen to podcasts using the magic of the
pipe command and your favourite player. Let's take a closer look at how
it works using YouTube channel feeds as an example.&lt;/p&gt;
&lt;h1&gt;Getting RSS feed for YouTube channel&lt;/h1&gt;
&lt;p&gt;You can use this address:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;    https://www.youtube.com/feeds/videos.xml?user=USERNAME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;you just need to change the &lt;code&gt;USERNAME&lt;/code&gt; to the part of URL of desired
channel. So if the channel URL is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    https://www.youtube.com/user/everyframeapainting
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;you use the last part for feed address - like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;    https://www.youtube.com/feeds/videos.xml?user=everyframeapainting&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Unfortunately, I couldn't manage to get it working with channels that do
not have username. (If you know how to do that please tell me how! ;) )&lt;/p&gt;
&lt;p&gt;Now we can use the pipe command in newsbeuter - &lt;code&gt;|&lt;/code&gt;. Since &lt;code&gt;mpv&lt;/code&gt; (the
video player that I like) needs video address as its argument for
playing online media I made simple one line wrapper for extracting
YouTube video links (it should be more general for playing from
different feeds but I just wanted to make simple proof-of-concept). You
can use, distribute and modify it freely as
&lt;a href="https://en.wikipedia.org/wiki/Beerware"&gt;Beerware&lt;/a&gt; ;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#!&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bash&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;jakub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;olczyk&lt;/span&gt;&lt;span class="nv"&gt;@openmailbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wrote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;stuff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;retain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;can&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;whatever&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fuck&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;stuff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;And&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;we&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;meet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;some&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;day&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;think&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;stuff&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;worth&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;can&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;buy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;beer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Jakub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Olczyk&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;grep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;awk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{print $2;}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xargs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mpv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I hope this points into the right direction for making your own scripts
to work with newsbeuter. Not needing web browser (read &lt;em&gt;memory hog&lt;/em&gt;) to
get the content I like is liberating for me. As well as watching video
without Flash plugins and tracking JavaScript.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Here for historic purposes is the only comment on this post&lt;/p&gt;
&lt;h4&gt;&lt;a href="http://cmd.ovh"&gt;cmd&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Posted on Sun 12 February 2017&lt;/p&gt;
&lt;p&gt;I think you already told me that you figured it out by yourself, but the
blogpost hasn't been updated yet, so I'm gonna put it here.&lt;/p&gt;
&lt;p&gt;When the channel has no user it must have channel id (I think it's also
the case with usernamed channels, so this method would be more
universal). When you find out channel id, simply put it in link below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;    https://www.youtube.com/feeds/videos.xml?channel_id=CHANNELID&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Also I had it figured while looking for rss for quite neat channel, so
here it is as example (and if anyone would like to check it out):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;    https://www.youtube.com/feeds/videos.xml?channel_id=UCBe0hmL6KkKU9tgQsobXB2g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="technical"></category><category term="recommendation"></category><category term="linux"></category><category term="bash"></category></entry><entry><title>i3 jest świetne!</title><link href="https://jakub.olczyk.info/i3-jest-swietne-pl.html" rel="alternate"></link><published>2016-07-06T10:20:00+02:00</published><updated>2016-07-06T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2016-07-06:/i3-jest-swietne-pl.html</id><summary type="html">&lt;p&gt;Po co komu zintegrowanie środowisko graficzne? Przecież jest i3!&lt;/p&gt;</summary><content type="html">&lt;p&gt;W trakcie sesji zacząłem robić to co każdy student - unikać nauki jak
tylko się da, więc postanowiłem w końcu przerzucić się na tiling window
managera - i3wm. Myślałem, że konfiguracja zajmie mi nie wiadomo ile
czasu… ale byłem w błędzie!&lt;/p&gt;
&lt;p&gt;Konfiguracja, którą dostajemy &lt;em&gt;out-of-box&lt;/em&gt; jest świetna, dodatkowo samo
czytanie jej również nie jest uciążliwe. Być może niektóre domyślne
ustawienia czy bindingi nie są najtrafniejsze, ale mimo wszystko jest to
bardzo przyjazne środowisko dla kogoś, kto i tak większość czasu spędza
w terminalu.&lt;/p&gt;
&lt;p&gt;Dodatkowo mogę polecić to środowisko dla każdego, kto chce spróbować
czegoś innego niż standardowy Gnome czy KDE. Na laptopie nie jestem w
stanie wyobrazić sobie już niczego innego, bo nie trzeba ściągać rąk z
klawiatury i sięgać po mysz zbyt często (jak dla mnie na plus, ale &lt;em&gt;de
gustibus&lt;/em&gt;… Z jakiegoś dziwnego powodu ludzie korzystają z MacOSX).&lt;/p&gt;
&lt;p&gt;A teraz troszkę szczegółów, które wymagały usprawnienia. (Plik
konfiguracyjny najprawdobodobniej można znaleźć w
&lt;code&gt;~/.config/i3/config&lt;/code&gt;).&lt;/p&gt;
&lt;h2&gt;Zmiana &lt;code&gt;alt&lt;/code&gt; na &lt;code&gt;super&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Pierwsza rzecz, która rzuca się w oczy. Alt jest jak dla mnie dziwnym
wyborem, ponieważ sporo aplikacji z niego korzysta, więc przemapowanie
go na tzw. &lt;code&gt;super&lt;/code&gt; było dla mnie oczywiste (dla niewtajemniczonych
będzie to windows key).&lt;/p&gt;
&lt;p&gt;&lt;img alt="i3 układ klawiszy" src="https://i3wm.org/docs/keyboard-layer2.png"&gt;&lt;/p&gt;
&lt;p&gt;Zgodnie z dokumentacją należy zamienić wszystkie wystąpienia &lt;code&gt;Mod1&lt;/code&gt; na
&lt;code&gt;Mod4&lt;/code&gt;, aby osiągnąć takie zachowanie. W Vimie wystarczy wydać takie
zaklęcie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    :%s/Mod1/Mod4/g
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dla pewności można jeszcze dorzucić na koniec &lt;code&gt;c&lt;/code&gt;, żeby interaktywnie
sprawdzić każde dopasowanie, ale ja nie miałem żadnych problemów.&lt;/p&gt;
&lt;h2&gt;Korzystanie z powiadomień aktywności w obszarach roboczych&lt;/h2&gt;
&lt;p&gt;Niesamowicie pomocny okazał się być
&lt;a href="http://atsutane.de/blog/2013/05/14/irssi-screen-urxvt-the-urgency-hint/"&gt;artykuł&lt;/a&gt;
dotyczący skonfigurowania &lt;code&gt;irssi&lt;/code&gt; w takie sposób, aby w przypadku
wysłania wiadomości workspace, w którym znajduje się otwarte okno z
programem, pojawiało się podświetlenie na czerwono, które ma zwrócić
uwagę na ten workspace.&lt;/p&gt;
&lt;p&gt;Nie będę się tutaj niepotrzebnie rozpisywać po prostu zachęcam do
skonfigurowania sobie w ten sposób &lt;code&gt;urxvt&lt;/code&gt; oraz &lt;code&gt;irssi&lt;/code&gt; - zdecydowanie
ułatwia korzystanie z IRC :).&lt;/p&gt;
&lt;p&gt;W każdym razie takie ustawienie pozwala na skonfigurowanie swojej
powłoki w taki sposób, aby długo wykonujące się polecenia również
powiadamiały o swoim zakończeniu.&lt;/p&gt;
&lt;p&gt;W przypadku Basha można napisać na przykład taką prostą funkcję:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    function urgency_hint_i3 () {
        echo -e &amp;#39;\a&amp;#39;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aby wszystko działało jak należy wystarczy dodać wywołanie tej funkcji
do zmiennej &lt;code&gt;PS1&lt;/code&gt; określającej co ma sie wyświetlić jako zachętka
powłoki.&lt;/p&gt;
&lt;p&gt;U mnie wygląda ona następująco:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\u@\h:[\w]: \$?\$(urgency_hint_i3)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;\$ &amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Co daje taki efekt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;jakub&lt;/span&gt;&lt;span class="nv"&gt;@jotunheimr&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;~&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I w przypadku gdy nie znajduję się w danym workspace'ie dostaję taką
wskazówkę:&lt;/p&gt;
&lt;p&gt;&lt;img alt="i3 jak wygląda hint" src="http://i.imgur.com/HgMQjA9.png"&gt;&lt;/p&gt;
&lt;p&gt;Jak dla mnie jest to &lt;em&gt;booster&lt;/em&gt; jak chodzi o produktywność ;) Może komuś
się to przyda.&lt;/p&gt;</content><category term="technical"></category><category term="recommendation"></category></entry><entry><title>LibreCMC - client mode na TP-Link TL-WR841N</title><link href="https://jakub.olczyk.info/librecmc-client-mode-na-tp-link-tl-wr841n-pl.html" rel="alternate"></link><published>2016-07-05T10:20:00+02:00</published><updated>2016-07-05T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2016-07-05:/librecmc-client-mode-na-tp-link-tl-wr841n-pl.html</id><summary type="html">&lt;p&gt;konfiguracja routera z LibreCMC jako klient w celu doprowadzenia internetu na piętro&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ostatnio udało mi się kupić dość tanio (za 20PLN to nic się nie kupi, a
za flaszkę wódki można router! :) ) bardzo fajny model TP-Linka, a
dokładnie TL-WR841N. Oczywiście, zainteresowałem się nim z powodu jego
możliwości - jest na liście wspieranych urządzeń OpenWRT oraz…
&lt;a href="https://librecmc.org/librecmc/home"&gt;libreCMC&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;LibreCMC to projekt, który dąży do stworzenia dystrybucji, która
pozbawiona jest &lt;a href="https://pl.wikipedia.org/wiki/Blob_binarny"&gt;binarnych blobów&lt;/a&gt; (więc mamy router,
który w pełni korzysta z wolnego oprogramowania). A ponadto pozwala na
dostęp do niesamowitych możliwości, których nie daje nam producent
urządzenia.&lt;/p&gt;
&lt;h1&gt;Konfiguracja Client Mode Wireless&lt;/h1&gt;
&lt;p&gt;Będę korzystać z &lt;a href="https://en.wikipedia.org/wiki/Network_address_translation"&gt;NAT&lt;/a&gt; - a
konkretnie z ustawień domyślnych w &lt;code&gt;/etc/config/firewall&lt;/code&gt; (dokładnie
masquerading). Wynika to z tego, że nie mam dostępu do routera, z którym
się łączę. Istnieje możliwość wyznaczenia tras między sieciami, ale
wtedy trzeba skonfigurować oba routery.&lt;/p&gt;
&lt;p&gt;W zasadzie różnica jest taka, że hosty za moją siecią nie będą widoczne
dla innych podłączonych do sieci, z którą ma się łączyć moja sieć.
Poniżej topografia, którą chcę osiągnąć:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;                                     &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ESSID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Moja&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sieć&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;przez&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LAN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Ethernet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WAN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;172.16.0.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;--------------&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;192.168.1.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;--------------&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ISP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Zakładając świeżą instalację libreCMC (w moim przypadku wersja 1.3.2
Elegant Eleanor) będziemy musieli edytować następujące pliki:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/config/network&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/config/wireless&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Przygotowanie do konfiguracji&lt;/h2&gt;
&lt;p&gt;Zanim cokolwiek zaczniemy potrzeba nam się połączyć z routerem. W webgui
trzeba ustawić połączenie przez &lt;code&gt;ssh&lt;/code&gt; oraz &lt;em&gt;nowy adres dla podsieci&lt;/em&gt;.
Druga część jest bardzo istotna, ponieważ nie chcemy mieć kolizji z
siecią, do której mamy się połączyć.&lt;/p&gt;
&lt;p&gt;Po połączeniu się z routerem przez SSH musimy włączyć i ustawić radio w
station mode (aby móc zobaczyć sieci znajdujące się w pobliżu).
Wystarczy wywołać następujące polecenia z konta roota:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;del&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wireless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@wifi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disabled&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;del&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wireless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@wifi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;iface&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wireless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@wifi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;iface&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sta&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;commit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wireless&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;wifi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Co się dzieję po kolei:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;z konfiguracji wireless usuwamy opcję &lt;em&gt;disable 1&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;ustawiamy opcję &lt;em&gt;mode&lt;/em&gt; na &lt;em&gt;station&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;zapisujemy zmiany&lt;/li&gt;
&lt;li&gt;włączamy radio za pomocą &lt;code&gt;wifi&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Informacje o dostępnych sieciach&lt;/h2&gt;
&lt;p&gt;Potrzebujemy znaleźć ustawienia naszej sieci dla przykładu niech to
będzie &lt;code&gt;HUE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Jeśli możemy wydajemy polecenie &lt;code&gt;iwlist scan&lt;/code&gt; powinno wyrzucić coś co
wygląda jak :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    &lt;span class="s s-Atom"&gt;root@libreCMC&lt;/span&gt;&lt;span class="o"&gt;:~&lt;/span&gt;&lt;span class="s s-Atom"&gt;#&lt;/span&gt; &lt;span class="s s-Atom"&gt;iwlist&lt;/span&gt; &lt;span class="s s-Atom"&gt;scan&lt;/span&gt;
    &lt;span class="s s-Atom"&gt;wlan0&lt;/span&gt;       &lt;span class="nv"&gt;Scan&lt;/span&gt; &lt;span class="s s-Atom"&gt;completed&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
              &lt;span class="nv"&gt;Cell&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;Address&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;E&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="nv"&gt;F&lt;/span&gt;
                        &lt;span class="nv"&gt;ESSID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;HUE&amp;quot;&lt;/span&gt;
                        &lt;span class="nv"&gt;Mode&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Managed&lt;/span&gt;
                        &lt;span class="nv"&gt;Channel&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;
                        &lt;span class="nv"&gt;Quality&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;  &lt;span class="nv"&gt;Signal&lt;/span&gt; &lt;span class="s s-Atom"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt; &lt;span class="s s-Atom"&gt;dBm&lt;/span&gt;  &lt;span class="nv"&gt;Noise&lt;/span&gt; &lt;span class="s s-Atom"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;92&lt;/span&gt; &lt;span class="s s-Atom"&gt;dBm&lt;/span&gt;
                        &lt;span class="nv"&gt;IE&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;IEEE&lt;/span&gt; &lt;span class="mf"&gt;802.11&lt;/span&gt;&lt;span class="s s-Atom"&gt;i&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;WPA2&lt;/span&gt; &lt;span class="nv"&gt;Version&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                            &lt;span class="nv"&gt;Group&lt;/span&gt; &lt;span class="nv"&gt;Cipher&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;TKIP&lt;/span&gt;
                            &lt;span class="nv"&gt;Pairwise&lt;/span&gt; &lt;span class="nv"&gt;Ciphers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;TKIP&lt;/span&gt; &lt;span class="nv"&gt;CCMP&lt;/span&gt;
                            &lt;span class="nv"&gt;Authentication&lt;/span&gt; &lt;span class="nv"&gt;Suites&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;PSK&lt;/span&gt;
                           &lt;span class="nv"&gt;Preauthentication&lt;/span&gt; &lt;span class="nv"&gt;Supported&lt;/span&gt;
                        &lt;span class="nv"&gt;IE&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;WPA&lt;/span&gt; &lt;span class="nv"&gt;Version&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                            &lt;span class="nv"&gt;Group&lt;/span&gt; &lt;span class="nv"&gt;Cipher&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;TKIP&lt;/span&gt;
                            &lt;span class="nv"&gt;Pairwise&lt;/span&gt; &lt;span class="nv"&gt;Ciphers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;TKIP&lt;/span&gt; &lt;span class="nv"&gt;CCMP&lt;/span&gt;
                            &lt;span class="nv"&gt;Authentication&lt;/span&gt; &lt;span class="nv"&gt;Suites&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;PSK&lt;/span&gt;
                        &lt;span class="nv"&gt;Encryption&lt;/span&gt; &lt;span class="s s-Atom"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;on&lt;/span&gt;
                        &lt;span class="nv"&gt;Bit&lt;/span&gt; &lt;span class="nv"&gt;Rates&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;
                                  &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;
                                  &lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;54&lt;/span&gt; &lt;span class="nv"&gt;Mb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ja musiałem skorzystać z &lt;code&gt;iw&lt;/code&gt;, żeby nie przedzierać się przez wszystkie
możliwe sieci polecam sobie przefiltrować output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    iw wlan0 scan | grep -A 50 -B 8 HUE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Wyrzuca to coś co wygląda następująco:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;BSS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wlan0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;associated&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;TSF&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8390318242&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;usec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2462&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;beacon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TUs&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;capability&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ESS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Privacy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SpectrumMgmt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ShortSlotTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x0511&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;62.00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dBm&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Information&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Probe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;SSID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HUE&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Supported&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;5.5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;11.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;24.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;36.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;54.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;DS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Indoor&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Outdoor&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Channels&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dBm&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Power&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;constraint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dB&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;TPC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dBm&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;ERP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Barker_Preamble_Mode&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;ERP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;D4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Barker_Preamble_Mode&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;RSN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TKIP&lt;/span&gt;
&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Pairwise&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ciphers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CCMP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TKIP&lt;/span&gt;
&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;suites&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PSK&lt;/span&gt;
&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PTKSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;RC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;GTKSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;RC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x000c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Extended&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;supported&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;6.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;9.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;12.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;48.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;HT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x18bc&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;HT20&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;SM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Power&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Save&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;disabled&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;RX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Greenfield&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;RX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HT20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SGI&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;TX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STBC&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;No&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STBC&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;Max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AMSDU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7935&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;DSSS&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;CCK&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HT40&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Maximum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AMPDU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;65535&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x003&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Minimum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AMPDU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;usec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;HT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MCS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;indexes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;supported&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;HT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MCS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;indexes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;undefined&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;HT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Konfiguracja&lt;/h2&gt;
&lt;p&gt;Po pierwsze zmiany w &lt;code&gt;/etc/config/network&lt;/code&gt; - należy wykomentować/usunąć
wszelkie linijki zawierające &lt;code&gt;ifname&lt;/code&gt; w sekcji 'wan'.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    config interface &amp;#39;wan&amp;#39;
        #ifname ...
        option proto    &amp;#39;dhcp&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Po drugie zmiany w &lt;code&gt;/etc/config/wireless&lt;/code&gt; - należy znaleźć sekcję
&lt;code&gt;wifi-iface&lt;/code&gt; i wyedytować w niej opcję &lt;code&gt;network&lt;/code&gt; tak żeby wskazywała na
interfejs WAN, opcję &lt;code&gt;mode&lt;/code&gt; w tryb station oraz zmienić &lt;code&gt;ssid&lt;/code&gt; i
&lt;code&gt;encryption&lt;/code&gt; tak, żeby zgadzały się z siecią, z którą chcemy się
połączyć.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    config &amp;#39;wifi-iface&amp;#39;
            option &amp;#39;device&amp;#39;     &amp;#39;wlan0&amp;#39;
            option &amp;#39;network&amp;#39;    &amp;#39;wan&amp;#39;
            option &amp;#39;mode&amp;#39;       &amp;#39;sta&amp;#39;
            option &amp;#39;ssid&amp;#39;       &amp;#39;HUE&amp;#39;
            option &amp;#39;encryption&amp;#39; &amp;#39;psk2&amp;#39;
            option &amp;#39;key&amp;#39;        &amp;#39;hasło_do_wifi&amp;#39; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nie pozostaje nic innego jak tylko zastosować zmiany:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    ifup wan
    wifi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I cieszyć się działającą siecią :)&lt;/p&gt;
&lt;h1&gt;Źródła&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.openwrt.org/doc/howto/clientmode"&gt;OpenWRT Wiki - Client Mode Wireless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.openwrt.org/doc/recipes/routedclient#usingmasquerade"&gt;OpenWRT Wiki - Routed Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.openwrt.org/doc/uci/firewall"&gt;OpenWRT Wiki - Firewall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="hardware"></category><category term="linux"></category></entry><entry><title>Informatyka Europejczyka - czego uczy nas podręcznik do szkoły średniej?</title><link href="https://jakub.olczyk.info/informatyka-europejczyka-czego-uczy-nas-podrecznik-do-szkoly-sredniej-pl.html" rel="alternate"></link><published>2015-09-12T10:20:00+02:00</published><updated>2015-09-12T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2015-09-12:/informatyka-europejczyka-czego-uczy-nas-podrecznik-do-szkoly-sredniej-pl.html</id><summary type="html">&lt;p&gt;(Krytyczna) recenzja podręcznika do szkoły średniej&lt;/p&gt;</summary><content type="html">&lt;p&gt;Miałem okazję ostatnio przyjrzeć się jednej książce, z której w liceum
lub technikum mieliby się uczyć przyszli "prości użytkownicy komputera"
(i nie mam tutaj bynajmniej na myśli niczego złego, każdy z nas czasem
jest prostym użytkownikiem -- ja dla przykładu zawsze będę &lt;em&gt;prostym
użytkownikiem samochodu&lt;/em&gt;, ponieważ nie mam zielonego pojęcia w jaki
sposób zbudowany jest silnik). Muszę przyznać, że &lt;strong&gt;jestem przerażony
tym, co można z takiej pozycji wyczytać&lt;/strong&gt;. Wiem co prawda, że
egzemplarz, który mi wpadł w ręce jest z roku 2012,kiedy to jeszcze nie
wiedzieliśmy o skali &lt;a href="https://en.wikipedia.org/wiki/List_of_government_mass_surveillance_projects"&gt;masowej inwigilacji w Internecie prowadzonej przez
organy rządowe wielu
państw&lt;/a&gt;,
jednak już wtedy było wiadomo jak duża jest skala szpiegowania przez
prywatne firmy&lt;a href="http://www.nytimes.com/2007/11/01/technology/01Privacy.html?pagewanted=2&amp;amp;_r=2"&gt;(jako ilustracja może posłużyć ten artykuł z 2007
roku)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Żeby była pełna jasność, podam jeszcze raz informacje bibliograficzne
"recenzowanej" książki :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Autor&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Jaros&lt;/span&gt;ł&lt;span class="nv"&gt;aw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Sk&lt;/span&gt;ł&lt;span class="nv"&gt;odowski&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Informatyka&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Europejczyka&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Zakres&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;podstawowy&lt;/span&gt;.
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Podr&lt;/span&gt;ę&lt;span class="nv"&gt;cznik&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;szk&lt;/span&gt;ół&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ponadgimnazjalnych&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Rok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;wydania&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2012&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Wydawca&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Helion&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Dobór treści&lt;/h3&gt;
&lt;p&gt;Myślę, że większość podręczników w dzisiejszych czasach najbardziej
traci właśnie już na stracie przy samym doborze materiału, który chce
przedstawić uczniom. A już nic mnie bardziej nie denerwuje niż to, że
serwuje się w książce, która ma być wstępem do dalszych poszukiwań tylko
jeden punkt widzenia – a mianowicie zamykanie młodych ludzi w siatce
korporacyjnego oprogramowania. Pozwolę sobie zacytować kilka zdań ze
wstępu:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Podręcznik ten powstał z myślą o (...) uczniach polskich szkół,
mających przyjemność korzystania na lekcjach informatyki z komputerów
z oprogramowaniem Windows 7.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To znaczy, że jeśli ktoś nie korzysta z oprogramowania M\$ to niczego
nie dowie się z tej książki.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nie przyzwyczajaj się do konkretnych programów i ich "guziczkologii".
Porównuj różne aplikacje tego samego typu i dostępne w nich funkcje.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nie miałbym się do czego przyczepić, gdyby nie fakt, że książka nie
świeci w tym wypadku przykładem i nie porównuje różnych dostępnych
opcji.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Płyta dołączona do podręcznika stanowi jego integralną część i zawiera
obszerne rozszerzenie treści zawartych w książce (...) na płycie
znajdziesz także to, czego nie udało się zmieścić w podręczniku.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Niesamowicie denerwuje mnie to ostatnie stwierdzenie. &lt;strong&gt;W podręczniku
zawsze można zmieścić wszystko to, co jest ważne&lt;/strong&gt;. Wystarczy chcieć i
na przykład nie dodawać bezsensownych ciekawostek czy też zabierać
miejsce na tekst, który się tam znajdować nie powinien ( znów chodzi mi
tu o dobór treści) , czy też ilustracje, które nie ilustrują zupełnie
nic. Dla przykładu (pomińmy treść merytoryczną, bo pewnie i z nią można
by dyskutować)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(...) odrębną gałęzią informatyki jest technologia informacyjna,
inaczej teleinformatyka (...) stanowi swego rodzaju połączenie
informatyki i telekomunikacji (rysunek 1.3)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Poniżej moje przybliżone odtworzenie rysunku 1.3 za pomocą znaków ASCII.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;+-------------+&lt;/span&gt;&lt;span class="c"&gt;          &lt;/span&gt;&lt;span class="nb"&gt;+-------------+&lt;/span&gt;
&lt;span class="c"&gt;    | informatyka |          | komunikacja |&lt;/span&gt;
&lt;span class="c"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;+-------------+&lt;/span&gt;&lt;span class="c"&gt;          &lt;/span&gt;&lt;span class="nb"&gt;+-------------+&lt;/span&gt;
&lt;span class="c"&gt;                \             /&lt;/span&gt;
&lt;span class="c"&gt;          &lt;/span&gt;&lt;span class="nb"&gt;+--------------------------+&lt;/span&gt;
&lt;span class="c"&gt;          | technologia informacyjna |&lt;/span&gt;
&lt;span class="c"&gt;          &lt;/span&gt;&lt;span class="nb"&gt;+--------------------------+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Takie "obrazowe" ilustracje nie są niczym niespotykanym w dzisiejszych
podręcznikach, a w książkach z przed 20-30 lat są nie do pomyślenia. W
dzisiejszych czasach książki, z których korzysta się w szkołach cierpią
na wielki problem związany z &lt;strong&gt;przerostem formy nad treścią&lt;/strong&gt;. Dodatkowo
informacje, które faktycznie powinny się tam znaleźć i o których
powinniśmy rozmawiać na lekcjach informatyki, bo nie służą jedynie temu,
żeby ten przedmiot sprowadzić do kursu obsługi programów biurowych,
trafiają do ramki z "Ciekawostkami".&lt;/p&gt;
&lt;p&gt;Przykład, który znajdujemy w okolicach paragrafu zatytułowanego &lt;em&gt;"Jakie
są konsekwencje łatwego dostępu do informacji"&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Administracja USA pracuje nad nowymi regulacjami prawnymi
umożliwiającymi służbom rządowym kontrolę użytkowników sieci. Politycy
żądają, aby wszystkie serwisy internetowe, które pozwalają na
komunikowanie się -- w tym portale takie jak Facebook oraz
komunikatory typu Skype -- tak zmodyfikowały swoje oprogramowanie, by
służby miały dostęp do danych o ich użytkownikach. Nowe prawo ma też
umożliwić szybkie przechwytywanie i rozszyfrowywanie na przykładu
zakodowanych e-maili.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;W treści paragrafu nie można znaleźć nawet jednego odniesienia do tej
"ciekawostki", o której jak wiemy z tego co opublikował Snowden można
powiedzieć tyle, że jest przestarzała, bo już w 2012 roku to, o czym
jest tam napisane, miało miejsce od dobrych kilku lat. I nie trzeba było
do tego "nowego prawa", to które weszło w życie w imię walki z
terroryzmem zupełnie wystarczyło do takiej inwigilacji. W ćwiczeniach do
rozdziału znajduje się propozycja przeprowadzenia na zajęciach debaty na
temat, cytuję, "cenzury Internetu" (rozumiem, że odnosi się to do
ciekawostki). Z własnego doświadczenia jako ucznia wiem, że ta forma
zajęć się zwyczajnie nie sprawdza. Sztuczne dzielenie ludzi na grupy
"za" i "przeciw" jedynie przekłada się na to, że uczniowie mają w nosie
podany temat. Gdyby udało się przeprowadzić dyskusję w tej kwestii w
klasie, to w moim odczuciu miałoby to dużo większą wartość. Szczególnie,
gdy nauczyciel umiałby ją przeprowadzić w taki sposób, żeby dotrzeć do
uczniów i dotknąć wszystkich ważnych problemów.&lt;/p&gt;
&lt;p&gt;Pierwsze "spotkanie", bo tak tutaj nazywają się rozdziały, miało
dotyczyć informacji. Zdaję sobie sprawę z tego, że nie jest to pojęcie
zarezerwowane dla informatyki, ale jednak myślę, że można by je raczej
przedstawić z takiej perspektywy na lekcjach, a o innych znaczeniach
tylko wspomnieć. Bardzo podobał mi się dobór materiału na studiach na
Wstępie do Informatyki, gdzie również omawialiśmy podobne zagadnienia.
Czytając tę książkę trudno mi nie pomyśleć, że ten rozdział to tylko
zapychacz, gdzie przedstawiono jakieś piramidy zdobywania wiedzy i inne
mało istotne i nieścisłe treści niezwiązane z informatyką na tyle by
zajmowały aż tyle miejsca w podręczniku. Jest tutaj jakiś ogólny wstęp,
ale wiele pojęć, które są trudniejsze, chyba pozostawia się
niezdefiniowanymi (np. heurystyka), po to żeby każdy mógł sobie poszukać
informacji na ich temat w Internecie, a jest to temat następnego
"spotkania".&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;"Jak sprytnie 'guglać'"&lt;/em&gt; -- czyli korporacyjna nowomowa&lt;/h3&gt;
&lt;p&gt;Cały rozdział traktuje o tym jak wyszukiwać informacje w sieci. Jest to
taki kurs umiejętnego korzystania z wyszukiwarki Google. Mnie się
wydaje, że to są materiały, które powinny trafić na płytę przy
poprzednim rozdziale o informacji. Owszem, wypada o tym wspomnieć, że
można dodać pewne ograniczenia do zapytań i np. otrzymać wyniki
dotyczące odpowiedniego okresu w historii, ale &lt;strong&gt;czy nie jest
ważniejsze, żeby wspomnieć o tym, że od dawna &lt;a href="https://en.wikipedia.org/wiki/Filter_bubble"&gt;różne osoby przy wpisaniu
tego samego zapytania do Google otrzymają różne
wyniki&lt;/a&gt;?&lt;/strong&gt; I porozmawiać na
temat tego jak bardzo jest to niekorzystne w dzisiejszych czasach, bo
ludzie o odmiennych poglądach zamykają się we "własnym świecie", w
którym wszyscy myślą tak samo. I nie jest tak, że Google jako jedyny
wprowadza &lt;em&gt;personalized searches&lt;/em&gt;, bo to samo jest z tym co pojawia się
w strumieniach aktywności znajomych na portalach społecznościowych,
gdzie jest większa szansa na to, by zobaczyć wpis znajomego o podobnych
poglądach. &lt;strong&gt;Zaczyna brakować miejsca na dyskusję w Internecie, chyba
warto porozmawiać o tym na lekcjach informatyki&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Algorytmika po łebkach i informacje na temat dyskutowania&lt;/h3&gt;
&lt;p&gt;Następny rozdział "Rozwiązywanie problemów" rozpoczyna opis tego czym
jest algorytmika, ale w mojej ocenie nie robi tego zbyt przekonująco.
Dodatkowo muszę przyznać, że z tego co rozumiem więcej w tym rozdziale
szeroko pojętej humanistyki niż nauk ścisłych, do których informatyka
się przecież zalicza. Spójrzmy na przykład na ten fragment:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pierwsze algorytmy obmyślała ponad 100 lat temu córka lorda Byrona --
Ada.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nie chcę tutaj wychodzić na osobę bardzo czepliwą, ale to jest &lt;strong&gt;poważny
błąd merytoryczny!&lt;/strong&gt; Pierwsze algorytmy opisywał przecież
&lt;a href="https://www.britannica.com/biography/al-Khwarizmi"&gt;al-Chuwarizmi&lt;/a&gt;! Nie
dość, że wymyślił algebrę to jeszcze opisał pierwsze sposoby
rozwiązywania równań liniowych i kwadratowych, które algorytmami
przecież są. Notabene, to właśnie &lt;strong&gt;od jego nazwiska w wersji
zlatynizowanej pochodzi samo słowo algorytm&lt;/strong&gt;. Wcześniej od Ady był też
Euklides ze swoim &lt;a href="https://www.britannica.com/topic/Euclidean-algorithm"&gt;algorytmem wyznaczania największego wspólnego
dzielnika&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Napotkane sytuacje problemowe możemy próbować zaklasyfikować pod
względem liczby rozwiązań:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;konwergencyjne&lt;/strong&gt; -- mają jedno rozwiązanie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dywergencyjne&lt;/strong&gt; -- mają więcej niż jedno rozwiązanie&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Trudno było mi się odnieść do tego fragmentu, ponieważ nigdy się z tą
klasyfikacją nie spotkałem w kontekście informatycznym. Owszem są na
przykład funkcje, które są zbieżne (konwergencja - zbieżność), ale nie
widziałem nigdy tego słowa użytego w taki sposób. Z pomocą przyszedł
Internet, który podpowiedział, że są to &lt;a href="http://www.kognitywistyka.net/encyklopedia/myslenie.html#klasyfikacja"&gt;podziały z psychologii i
kognitywistyki&lt;/a&gt;.
Zero powiązania z algorytmiką.&lt;/p&gt;
&lt;p&gt;Następnie mamy dość sporo informacji na temat rozwiązywania problemów,
ale znów mam wrażenie jakbym czytał książkę do psychologii. Nie są to
metody informatyczne, tego jestem pewien. &lt;strong&gt;Nie twierdzę, że umiejętność
prowadzenia dyskusji oraz omawiania problemów za pomocą burzy mózgów nie
jest potrzebna. Nie jest to jednak w żaden sposób związane z
&lt;a href="http://issi.uz.zgora.pl/pl/didactic/ao/tpi/tpi03.pdf"&gt;algorytmicznym rozwiązywaniem
problemów&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span id="korespondencja"&gt;Korespondencja internetowa&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Jest to standardowy tekst opisujący możliwości poczty internetowej.
Brakuje jednak kilku istotnych informacji. Wydaje mi się, że przydałoby
się opowiedzieć nieco więcej na tematy związane z netykietą (&lt;a href="http://www.gazeta.tv/plej/29,107457,11595738,114927,video.html?embed=0&amp;amp;autoplay=1"&gt;oraz
poprawnością
językową&lt;/a&gt;)
i wyraźnie poświęcić im osobny akapit. Dodatkowo wybitnie razi mnie
polecanie korzystania z takiej czy innej konkretnej usługi. W tym
wypadku z maila oferowanego przez Google.&lt;/p&gt;
&lt;p&gt;Myślę, że szczególny nacisk powinno się też położyć na &lt;strong&gt;czytanie
warunków użytkowania danej usługi internetowej&lt;/strong&gt;. Weźmy sobie za
przykład politykę prywatności w Gmailu zachwalanym przez podręcznik :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nasze automatyczne systemy analizują treść &lt;strong&gt;(w tym wiadomości
e-mail)&lt;/strong&gt; w celu oferowania spersonalizowanych funkcji usług, takich
jak wyniki wyszukiwania, reklamy indywidualne i wykrywanie spamu oraz
złośliwego oprogramowania.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To jest kolejny temat do dyskusji związaną ze świadomym dobieraniem
usług, ponieważ w innym miejscu w polityce prywatności firmy z Mountain
View można znaleźć takie stwierdzenia:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(...) prosimy o podanie danych osobowych, takich jak imię i nazwisko,
adres e-mail, numer telefonu czy numer karty kredytowej. Będziemy je
przechowywać z danymi konta. &lt;strong&gt;Jeśli użytkownik chce w pełni
wykorzystać oferowane przez nas funkcje udostępniania treści, jest
również proszony o utworzenie publicznego profilu Google zawierającego
m.in. jego imię i nazwisko oraz zdjęcie&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Trzeba się zastanowić czy chcemy jakiejś zagranicznej firmie możliwość
rozpoznawania nas na każdym kroku. Dość istotne jest to, że nie jest to
firma, która działa według jurysdykcji europejskiej. Trzeba mieć na
uwadze fakt, że w USA nie ma takiego systemu ochrony danych osobowych
jaki istnieje w krajach Europy (po więcej informacji odsyłam do książki
"&lt;em&gt;Internet. Czas się bać&lt;/em&gt;" W. Orlińskiego). Dodatkowo wypadałoby pewnie
wspomnieć o tym, że &lt;strong&gt;komunikacja za pośrednictwem poczty elektronicznej
nie polega na przesyłaniu listów&lt;/strong&gt; tj. &lt;strong&gt;wiadomości zabezpieczonych w
tradycyjnej poczcie przez kopertę&lt;/strong&gt; tylko, idąc tym torem, &lt;strong&gt;co najwyżej
pocztówek, których treść jest dostępna dla każdego w czasie przesyłania
wiadomości&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Brak informacji na temat możliwości kryptograficznych jakie są dostępne
dla każdego (pakiet &lt;a href="https://www.gnupg.org"&gt;GnuPG&lt;/a&gt; implementujący
OpenPGP dla przykładu) to chyba jedna z poważniejszych wad tej książki.&lt;/p&gt;
&lt;h3&gt;Podsumowanie&lt;/h3&gt;
&lt;p&gt;Nie będę się już dłużej rozwodził nad treścią tej książki, bo wiele z
tematów to zwykły kurs obsługi komputera. Martwi mnie też niestety fakt,
że &lt;strong&gt;brakuje w tej w niej prawdziwej bibliografii opartej o inne
książki, najlepiej podręczniki akademickie&lt;/strong&gt;(&lt;a href="https://web.archive.org/web/20090206185258/http://www.jacek234.yoyo.pl/strona2.html"&gt;czy tę stronę można uznać
za
bibliografię?&lt;/a&gt;),
no i oczywiście odniesień do nich w odpowiednich miejscach. W wielu
miejscach brakowało mi możliwości dodania, jak w Wikipedii, znacznika
&lt;em&gt;[citation needed]&lt;/em&gt;. Nie wiem czy w wydaniu drugim coś się zmieniło w
stosunku do tego co ja miałem okazję przeczytać. Mam oczywiście
nadzieję, że tak jest, ale sam przeszedłem przez liceum i, niestety
dopiero od niedawna, zdaję sobie sprawę z tego jak słabej jakości są
teraz podręczniki na rynku. Cieszyć może mnie może fakt, że nie znam
jeszcze żadnego nauczyciela informatyki, który by wymagał kupowania
książki do informatyki (nikt w moim otoczeniu w liceum nie był do tego
zmuszany), bo w mojej ocenie byłaby to strata pieniędzy. &lt;a href="http://helion.pl/autorzy/jaroslaw-sklodowski,jarskl.htm"&gt;Zostawiam ten
link do notki o autorze do własnego
przemyślenia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dodatkowo w sprawie podręczników w ogóle -- &lt;strong&gt;wszędzie widać tylko opisy
mówiące o ładnym układzie strony i pięknych grafikach, brakuje jednak
informacji o tym czy treść jest najwyższej jakości&lt;/strong&gt;. Mam w domu kilka
podręczników z lat '60, '70 i '80 (co prawda do innych przedmiotów niż
informatyka) i muszę przyznać, że widać dużą różnicę w tym jak wyglądały
podręczniki kiedyś, a jak wyglądają teraz. Jedna książka do fizyki
wielkości zeszytu B5 i grubości ok. 4 cm. myślę, że spokojnie
wystarczała na 3-4 lata technikum, teraz trudno się obyć bez corocznego
wypadu do księgarni po nową książkę, która starcza na rok, a i tak jest
bardzo uboga w treść. Coś poszło w zdecydowanie złym kierunku.&lt;/p&gt;</content><category term="posts"></category><category term="edukacja"></category><category term="recenzja"></category></entry><entry><title>Bash - przydatne konstrukcje</title><link href="https://jakub.olczyk.info/bash-przydatne-konstrukcje-pl.html" rel="alternate"></link><published>2015-07-16T10:20:00+02:00</published><updated>2015-07-16T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2015-07-16:/bash-przydatne-konstrukcje-pl.html</id><summary type="html">&lt;p&gt;Jak włączyć coś jak perlowy 'strict mode' w Bashu?&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ostatnio stwierdziłem, że dobrze by było odświeżyć porządnie swoją
wiedzę z zakresu pisania skryptów w powłoce tekstowej. Stwierdziłem, że
ilość przydatnych informacji, które znalazłem jest dostatecznie duża,
żeby napisać na ten temat posta lub może zacząć jakąś serię postów na
ten temat. Nie ma lepszego sposobu na nauczenie się nowych rzeczy niż
przez uczenie na ich temat innych (a w przypadku bloga pewnie siebie za
jakiś czas). Do dzieła!&lt;/p&gt;
&lt;h1&gt;Bashowy &lt;em&gt;strict mode&lt;/em&gt;?&lt;/h1&gt;
&lt;p&gt;Dość często porównuje się różne języki skryptowe i muszę przyznać, że
perlowa zasada dodawania&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    use strict;
    use warnings;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;do dłuższych skryptów jest bardzo sensownym pomysłem, bo zaoszczędza
masę czasu na debugowanie niedziałających skryptów. I okazuje się, że w
Bashu przy odrobinie kreatywności jesteśmy osiągnąć podobny efekt.
Wystarczy, żeby na początku skryptu dodać takie linijki :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    set -euo pipefail
    IFS=$&amp;#39;\n\t&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nie jest to odpowiednik jeden do jeden perlowego zachowania, ale i tak
jest to coś o czym powinien wiedzieć każdy kto chce nauczyć się pisać
porządne skrypty systemowe. A teraz co dokładnie robią poszczególne
opcje, które tutaj włączamy? (&lt;a href="https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin"&gt;Zachęcam do przejrzenia odpowiedniej
strony z podręcznika dotyczącego
Basha&lt;/a&gt;)
Po pierwsze można by to rozbić na poszczególne polecenia:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    set -e 
    set -u
    set -o pipefail
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Flaga &lt;code&gt;-e&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Włączenie tej flagi powoduje, że każda komenda w skrypcie, która zwróci
wartość inną niż zero spowoduje jego zatrzymanie. Zmienia to działanie
interpretera na to, które jest bliższe działaniu innych języków
skryptowych jak na przykład Python. Jest to opcja, której raczej nie
włączymy wpisując polecenia "z palca" w terminal, ale jest niesamowicie
przydatna, gdy chcemy napisać jakiś dłuższy skrypt.&lt;/p&gt;
&lt;h3&gt;Flaga &lt;code&gt;-u&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Dzięki niej odwołanie się do wcześnej niezadeklarowanej zmiennej jest
traktowane jako błąd i powoduje natychmiastowe zakończenie wykonywania
skryptu. Problemy związane z literówkami przy włączeniu tej opcji są
bardzo szybkie do wychwycenia i naprawienia. Jest to dość podobne do
skorzystania z &lt;code&gt;use strict 'vars'&lt;/code&gt; w Perlu. Naprawdę pozwala na
uniknięcie wielu niedogodności.&lt;/p&gt;
&lt;h3&gt;set -o pipefail&lt;/h3&gt;
&lt;p&gt;Flaga &lt;code&gt;-o&lt;/code&gt; pozwala na włączenie opcji za pomocą jej nazwy w tym wypadku
jest to &lt;code&gt;pipefail&lt;/code&gt;, która odkrywa wszelkie błędy, które mogą się pojawić
w potokach, a nie będą widoczne na pierwszy rzut oka. Posłużę się tutaj
przykładem ze źródła tej informacji.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    $ grep jakis-tekst /nieistniejacy/plik | sort
    grep: /nieistniejacy/plik: No such file or directory
    $ echo $?
    0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Jak widać w zmiennej &lt;code&gt;$?&lt;/code&gt; znajduje się wartość zwróconą przez &lt;code&gt;sort&lt;/code&gt;,
który pomimo, że dostał pusty string do posortowania traktuje go jako
poprawne dane wejściowe. Nie jest to zachowanie, które pasuje do
skryptów powłoki, ale bez wątpienia wystarcza przy normalnym pracowniu z
terminalem.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    $ set -o pipefail
    $ grep jakis-tekst /nieistniejacy/plik | sort
    grep: /nieistniejacy/plik: No such file or directory
    $ echo $?
    2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Zmienna IFS&lt;/h3&gt;
&lt;p&gt;Zgodnie z tym co można znaleźć na stronach &lt;code&gt;man&lt;/code&gt;a dotyczących Basha:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IFS&lt;/strong&gt; The Internal Field Separator that is used for word splitting
after expansion and to split lines into words with the read builtin
command. The default value is ``\ \t\n''.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dlaczego go zmieniać? Pomaga to w zmianie sposobu w jaki Bash będzie
iterować po listach zmiennych. Jest to dość pomocne szczególnie, gdy
spojrzy się na skrypt, który mógłby dla przykładu robić coś z plikami,
których nazwy podawałoby się przy wywołaniu.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;#&lt;span class="o"&gt;!/&lt;/span&gt;&lt;span class="nv"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;bash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$@&lt;span class="c1"&gt;; do&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Removing $arg&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Bez zmiany IFS wywołanie tego skryptu z argumentami mogłoby skutkować
pomyłką w ich interpretacji:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    $ ./skrypt.sh test-file &amp;#39;Mission Impossible.webm&amp;#39;
    Removing test-file
    Removing Mission
    Removing Impossible.webm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Więcej informacji na temat działania Basha po takich zmianach można
znaleźć w oryginalnym artykule, do którego link znajduje się na końcu
tego posta.&lt;/p&gt;
&lt;h2&gt;Źródła&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Aaron Maxwell, &lt;a href="http://redsymbol.net/articles/unofficial-bash-strict-mode/"&gt;&lt;em&gt;Use the Unofficial Bash Strict Mode (Unless You Looove Debugging)&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="technical"></category><category term="programming"></category><category term="bash"></category></entry><entry><title>What happened?</title><link href="https://jakub.olczyk.info/what-happened-pl.html" rel="alternate"></link><published>2015-06-28T10:20:00+02:00</published><updated>2015-06-28T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2015-06-28:/what-happened-pl.html</id><summary type="html">&lt;p&gt;Strumień świadomości na temat stanu Internetu&lt;/p&gt;</summary><content type="html">&lt;p&gt;Jestem dzieckiem ery, w której dostęp do Internetu jest tak oczywisty,
że w momencie, w którym dostęp do niego staje się ograniczony komputer
zaczyna być urządzeniem niemal bezużytecznym (nie jestem w tym
osamotniony, vide &lt;a href="https://pl.wikipedia.org/wiki/Prawo_Metcalfe%27a"&gt;Prawo
Metcalfe'a&lt;/a&gt;). Jednakże
im dłużej studiuję informatykę tym bardziej zaczynam żałować, że nie
urodziłem się wcześniej, w bardziej pionierskich czasach (przynajmniej z
perspektywy naszego kraju), kiedy Internet jeszcze był czymś
niezrozumiałym, trudnym i przede wszystkim drogim. Mam wrażenie, że
tamte czasy były zdecydowanie lepsze.&lt;/p&gt;
&lt;p&gt;Najważniejsze jak dla mnie jest to, że przeciętny użytkownik był
zdecydowanie lepiej przystosowany do kultury, która zdążyła się wtedy
wykształcić i całej związanej z nią netykiety. Kiedy pojawiał się ktoś
nowy dość szybko &lt;a href="http://www.catb.org/~esr/faqs/smart-questions.html"&gt;był uczony przez innych
użytkowników&lt;/a&gt; w jaki
sposób należy się zachowywać w Internecie, bo trzeba przyznać, że
względna anonimowość jaką dawał wtedy Internet wyzwalała wszelkie
niedobre strony ludzkiej natury.&lt;/p&gt;
&lt;p&gt;Tamte czasy minęły już, jak się zdaje, bezpowrotnie. Teraz Internetem
rządzi jedynie pieniądz oraz wielkie korporacje, które IMHO są
odpowiedzialne za niesamowite zgłupienie użytkowników sieci. W
niektórych krajach dalekiej Azji &lt;a href="http://elitedaily.com/news/technology/millions-people-dont-realize-facebook-part-internet/930519/"&gt;ludzie nie wiedzą, że korzystając z
pewnego portalu społecznościowego korzystają z
Internetu&lt;/a&gt;,
ponadto powstaje coraz więcej komercyjnych (bo niestety nie można nazwać
tego inaczej) &lt;a href="http://qz.com/385821/poor-internet-for-poor-people-why-facebooks-internet-org-amounts-to-economic-racism/"&gt;projektów, które mają na celu udostępnienie jedynie
pewnego wycinka internetowej
rzeczywistości&lt;/a&gt;
dla ludzi i to takiego, w którym ci ludzie są produktem i korzyści,
które będą ich udziałem są nieporównywalnie mniejsze od tych, które będą
generować dla firm biorących udział w tym projekcie (&lt;a href="http://www.businessinsider.com/how-does-facebook-make-money-2010-5?op=1"&gt;zbieranie
informacji o użytkownikach w celu sprzedaży ich w ten lub innych sposób
reklamodawcom&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ludzie powinni zacząć zdawać sobię sprawę z tego, że obecnie nie zostało
już nic z tego czym Internet był kiedyś. Teraz jest to narzędzie masowej
inwigilacji, czy to &lt;a href="https://www.eff.org/nsa-spying"&gt;ze strony rządów&lt;/a&gt;,
czy też &lt;a href="http://www.computerworld.com/article/2551008/networking/what-google-knows-about-you.html"&gt;ze strony prywatnych
podmiotów&lt;/a&gt;.
Niewiele zostało z radosnej, utopijnej wizji, gdzie jest to miejsce
spotkań zwykłych ludzi z całego świata, którzy mogą podzielić się
własnymi doświadczeniami i nauczyć czegoś nowego na temat świata.&lt;/p&gt;
&lt;p&gt;Powinniśmy uczyć teraz jak z rozwagą i dystansem podchodzić do tego co
znajduje się w sieci. Na szczęście &lt;a href="http://cyfrowa-wyprawka.org/"&gt;pojawiają się już też inicjatywy,
które mają na celu uzupełnienie tych
braków&lt;/a&gt; wśród wszystkich użytkowników, ale
szczególnie wśród tych najmłodszych. Otwartym jednak pozostaje pytanie o
to czy jest szansa na &lt;a href="https://youtu.be/XEVlyP4_11M?t=961"&gt;wzbudzenie jakiegokolwiek zainteresowania tym
tematem wśród przeciętnych ludzi&lt;/a&gt;,
którzy na codzień nie zastanawiają się nad prywatnością czy tym na co
się zgadzają klikając na przycisk "akceptuję warunki licencji", kiedy
coś instalują na komórce (swoją drogą Fundacja Nowoczesna Polska i
Ministerstwo Cyfryzacji &lt;a href="https://nowoczesnapolska.org.pl/2015/01/22/mobilne-bezpieczenstwo/"&gt;wypuściły aplikację służącą do uświadamiania do
jakich treści mają prawo poszczególne aplikacje na
telefonie&lt;/a&gt;)
lub komputerze.&lt;/p&gt;
&lt;p&gt;Ludzie, dla których te sprawy są istotne powinni częściej znajdować się
w mediach, trudno jest usłyszeć o wielu organizacjach, które prowadzą
taką działalność, a mamy ich w naszym kraju całkiem dużo i myślę, że
warto tutaj wymienić choć kilka:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://panoptykon.pl"&gt;Fundacja Panoptykon&lt;/a&gt; : działają zgodnie z
    ideą "kontrolujmy kontrolujących"&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nowoczesnapolska.org.pl/"&gt;Fundacja Nowoczesna Polska&lt;/a&gt; :
    uświadamianie użytkowników odnośnie technologii informatycznych z
    naciskiem na edukację&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cybsecurity.org"&gt;Fundacja Bezpieczna Cyberprzestrzeń&lt;/a&gt; :
    działania na rzecz poprawy bezpieczeństwa w Internecie&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fwioo.pl"&gt;Fundacja Wolnego i Otwartego Oprogramowania&lt;/a&gt; :
    promują korzystanie z wolnego oprogramowania&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Warto wspierać te organizacje chociażby przez przesyłanie znajomym
odpowiednich materiałów, które one publikują. Uświadamianie jest wpisane
chyba we wszystkie statuty tych fundacji, a to jest pierwszy krok do
tego, żeby Internet znów mógł zacząć przypominać bezpieczne miejsce, w
którym może odbywać się prywatna wymiana myśli.&lt;/p&gt;
&lt;h5&gt;Materiały dla zainteresowanych&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://edukacjamedialna.edu.pl/media/chunks/attachment/poradnik-bezpieczenstwa-mobilnego.pdf"&gt;Poradnik bezpieczeństwa mobilnego
    (pdf)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://panoptykon.org/sites/panoptykon.org/files/infografiki/co_wie_moj_telefon.png"&gt;Co wie o mnie mój telefon?
    (infografika)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://panoptykon.org/sites/panoptykon.org/files/infografiki/prywatnosc_w_sieci.jpg"&gt;Prywatność w sieci: odzyskaj kontrolę
    (inforgrafika)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dug.net.pl/tekst/239/jak_dbac_o_swoja_prywatnosc___nie_tylko_w_sieci/"&gt;Jak zadbać o swoją prywatność? (w kontekście
    Debiana)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://panoptykon.org/file/2705/download?token=YgpCBN7D"&gt;Szyfrowane: co i dlaczego warto zabezpieczać?
    (inforgrafika)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</content><category term="posts"></category><category term="internet"></category><category term="rant"></category></entry><entry><title>cal i calendar w jednym</title><link href="https://jakub.olczyk.info/cal-i-calendar-w-jednym-pl.html" rel="alternate"></link><published>2015-06-01T10:20:00+02:00</published><updated>2015-06-01T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2015-06-01:/cal-i-calendar-w-jednym-pl.html</id><summary type="html">&lt;p&gt;Czyli zabawy z Perlem i pisaniem wrappera na polecenia Linuxowe&lt;/p&gt;</summary><content type="html">&lt;p&gt;Od jakiegoś czasu chciałem sobie jakoś sprytnie połączyć w jedno
dostępne w większości dystrybucji GNU/Linuxa programy &lt;code&gt;cal&lt;/code&gt; oraz
&lt;code&gt;calendar&lt;/code&gt;, które w mojej ocenie są niesamowicie dobrymi rozwiązaniami
terminarzowymi, z których można korzystać w terminalu, szczególnie, gdy
dorzuci się je do swojego &lt;code&gt;.bashrc&lt;/code&gt; tak, żeby przy każdym włączeniu
terminala pełniły rolę przypominajki o ważnych terminach.&lt;/p&gt;
&lt;p&gt;Dla mnie jednak jest w tym mały problem, a mianowicie output z takich
poleceń jest dość pokaźny. Wolałbym to mieć w bardziej skondensowanej
formie, szczególnie, że obecnie częściej mamy do czynienia z ekranami o
większej szerokości niż wysokości. Dla przykładu output takiego
polecenia:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    $ cal; calendar
       Czerwiec 2015      
    ni po wt śr cz pi so  
        1  2  3  4  5  6  
     7  8  9 10 11 12 13  
    14 15 16 17 18 19 20  
    21 22 23 24 25 26 27  
    28 29 30

    Jun 02  Non-Profit status of SPI approved, 1999
    Jun 02  First issue of Computerworld, 1967
    Jun 03  Debian&amp;#39;s Diversity Statement ratified, 2012
    Jun 05  Debian GNU/Linux 1.3 alias ``bo&amp;#39;&amp;#39; released, 1997
    Jun 06  Debian GNU/Linux 3.1 alias ``sarge&amp;#39;&amp;#39; released, 2005
    Jun 06  Incorporation of Software in the Public Interest completed, 1997
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Jak widać jest to dość długie, a po prawej stronie outputu z &lt;code&gt;cal&lt;/code&gt;a jest
całkiem sporo miejsca. Jak więc połączyć wyniki obu programów w jakiś
miły sposób? Podejść może być wiele, dla mnie wygodnie było sklepać w
tym wypadku prosty skrypt w Perlu (dodatkowo ciekawostka, ale jest to
&lt;a href="http://raid6.com.au/~onlyjob/posts/arena/"&gt;język skrojony na potrzeby przetwarzania tekstu&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Moje rozwiązanie tego problemu pewnie bardzo odkrywcze nie jest. Pewnie
można by też napisać to krócej. Jeszcze sobie nad tym pomedytuje, ale
tak wygląda moje rozwiązanie sklepane na kolanie w Perlu.&lt;/p&gt;
&lt;h4&gt;EDIT 2015-06-04&lt;/h4&gt;
&lt;p&gt;Zgodnie z komentarzem od Brainfuck usunąłem funkcję &lt;code&gt;split&lt;/code&gt; z kodu w
miejscach, gdzie przypisujemy wyjście z zewnętrznych programów. Kontekst
listowy w tym wypadku załatwia nam sprawę i wrzuca każdą linię osobno w
tablicę. Konteksty to zdecydowanie piękna rzecz w Perlu.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;#!/usr/bin/perl&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# author : Jakub Olczyk &amp;lt;jakub.olczyk@openmailbox.org&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# date   : 2015-06-01&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# license: GPLv3+&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;feature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;say&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;@cal_output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="sb"&gt;`cal`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;@calendar_output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="sb"&gt;`calendar`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;@output&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;each&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;@cal_output&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;chomp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;$output&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\t&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$calendar_output&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sr"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;$&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;say&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@output&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Jak na razie wydaje mi się, że taki skrypcik skutecznie będzie spełniał
swoje zadanie.&lt;/p&gt;
&lt;p&gt;Przykładowy output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;       Czerwiec 2015        Jun 02  Non-Profit status of SPI approved, 1999
    ni po wt śr cz pi so    Jun 02  First issue of Computerworld, 1967
        1  2  3  4  5  6  
     7  8  9 10 11 12 13  
    14 15 16 17 18 19 20  
    21 22 23 24 25 26 27  
    28 29 30
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Oczywiście, w tym skrypcie przyjmuję założenie, że nie chcemy mieć
więcej informacji z &lt;code&gt;calendar&lt;/code&gt; niż ilość linii, które wypluwa &lt;code&gt;cal&lt;/code&gt;.&lt;/p&gt;</content><category term="technical"></category><category term="programming"></category><category term="perl"></category></entry><entry><title>#service blog restart</title><link href="https://jakub.olczyk.info/service-blog-restart-pl.html" rel="alternate"></link><published>2015-05-12T10:20:00+02:00</published><updated>2015-05-12T10:20:00+02:00</updated><author><name>Jakub Olczyk</name></author><id>tag:jakub.olczyk.info,2015-05-12:/service-blog-restart-pl.html</id><summary type="html">&lt;p&gt;Pisanie bloga od nowa przy użyciu Pelicana, czyli czemu Wordpress jest nie dla mnie&lt;/p&gt;</summary><content type="html">&lt;p&gt;Od jakiegoś czasu myślałem o tym, żeby porzucić wszelkie rozbudowane
CMS, które w dużym stopniu wydawały mi się uciążliwe oraz niesamowicie
przeciążone, a już w żadnej mierze nie pasowały do mojego stylu pracy
nad tekstem (trzeba przyznać, że edycja tekstu w Vimie to jest coś co
zmienia człowieka na zawsze). Z tego też powodu zacząłem szukać jakiegoś
rozwiązania mojego problemu z Wordpressem i innym podobnymi do niego
rozwiązaniami.&lt;/p&gt;
&lt;h3&gt;W czym tkwi problem?&lt;/h3&gt;
&lt;p&gt;Poza dość banalnym argumentem jakim jest wygoda pracy moje obawy przed
korzystaniem z rozwiązań typu Wordpress, Joomla itd wiązały się przede
wszystkim z bezpieczeństwem. Jeśli do tego dorzuci się jeszcze własne
lenistwo, to można chyba się zacząć domyślać czemu zainteresowało mnie
statyczne serwowanie stron.&lt;/p&gt;
&lt;p&gt;No więc jaka jest różnica pomiędzy na przykład Wordpressem a generatorem
statycznych stron?&lt;/p&gt;
&lt;p&gt;W przypadku Wordpressa nasz serwer będzie potrzebował jakiejś bazy
danych, interpretera PHP, no i oczywiście serwera HTTP. Jak widać jest
to dość dużo usług jak na jedną maszynę, co może się wiązać z kilkoma
wektorami ataku, gdyby komuś bardzo zależało na dostępie do takiego
serwera.&lt;/p&gt;
&lt;p&gt;No ale co się dzieje, gdy ktoś wchodzi na naszą stronę? Skrypt w PHP
dynamicznie połączy treści napisane przez nas z szablonami strony, które
wszystkie siedzą sobie gdzieś w bazie danych lub w jakimś katalogu. No i
dopiero taki output, który się ze sobą pokleił leci do przeglądarki,
która wysłała zapytanie o treść.&lt;/p&gt;
&lt;p&gt;Z kolei to z co ja proponuje to przeprowadzenie tego procesu raz przy
dodawaniu treści do strony. Prawda jest taka, że kiedy coś już się
napisze na bloga, to raczej nie będziemy tego zmieniać już bardzo
często. Dlaczego też nie napisać naszego artykułu w jakimś lepszym do
czytania i edytowania formacie? Ja bardzo sobie cenię możliwości
formatowania jakie daje Markdown i cieszę się gdy mogę pisać w moim
ulubionym edytorze tekstu - Vim. Nie jestem przywiązany do tego, co
oferuje mi CMS.&lt;/p&gt;
&lt;p&gt;Przy pisaniu bloga za pomocą statycznej generacji jedyne co potrzeba to
oczywiście silnik generatora u siebie na komputerze, gdzie będziemy
pisać artykuł, edytor tekstu i sposób na wrzucenie naszej treści na
serwer www. Cały proces według mnie jest równie prosty co korzystanie z
Wordpressa czy Joomli, a dodatkowo pozwala mi na większą kontrolę tego
co się dzieje.&lt;/p&gt;
&lt;h3&gt;Mój wybór - Pelican&lt;/h3&gt;
&lt;p&gt;Nie jest to może najbardziej składny i dokładny opis static site
generatorów, ale myślę, że widać tutaj powody, które mną kierowały.
Jeśli kogoś zainteresował ten temat to polecam sobie wyszukać w
DuckDuckGo &lt;code&gt;static site generators&lt;/code&gt; i na pewno będą tam wszystkie
przydatne informacje.&lt;/p&gt;
&lt;p&gt;Ja sam korzystam z &lt;a href="https://getpelican.com"&gt;Pelicana&lt;/a&gt; jest to dla mnie
najlepsze rozwiązanie, bo przede wszystkim jest napisany w Pythonie,
którego chcę się uczyć (i którego składnia jest mi bliższa niż np.
składnia Ruby). Na dokładkę mam już kilka aplikacji w systemie, które z
niego korzystają więc instalując nie musiałem dociągać dużej ilości
nowych paczek (kolejny plus).&lt;/p&gt;
&lt;p&gt;Zainteresowanym polecam zajrzeć na :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.staticgen.com/pelican"&gt;Static Gen o Pelicanie &lt;em&gt;można tam poczytać o innych
    genereatorach&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/getpelican/pelican"&gt;GitHub projektu Pelican&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.getpelican.com"&gt;Dokumentacja Pelicana&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="posts"></category><category term="blog"></category></entry></feed>