<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Luis Alberto Santana</title><link href="https://www.jackboot7.com/" rel="alternate"></link><link href="https://www.jackboot7.com/feeds/all.atom.xml" rel="self"></link><id>https://www.jackboot7.com/</id><updated>2020-07-01T15:00:00-04:00</updated><subtitle>@jackboot7</subtitle><entry><title>Python Tips</title><link href="https://www.jackboot7.com/python-tips.html" rel="alternate"></link><published>2020-07-01T15:00:00-04:00</published><updated>2020-07-01T15:00:00-04:00</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2020-07-01:/python-tips.html</id><summary type="html">&lt;div class="section" id="a-collection-of-small-python-scripts-and-tips"&gt;
&lt;h2&gt;A collection of small Python scripts and tips.&lt;/h2&gt;
&lt;p&gt;This post is based on a &lt;a class="reference external" href="https://twitter.com/jackboot7/status/1243321600507654144"&gt;Twitter thread&lt;/a&gt; I started in April 2020 and works as a centralized way
to read all the tips in an easier format than Twitter's 280 characters.&lt;/p&gt;
&lt;p&gt;Both will be updated frequently.&lt;/p&gt;
&lt;div class="section" id="list-flatten-without-explicit-loops"&gt;
&lt;h3&gt;List Flatten without explicit loops&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Using Itertools' chain&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;itertools&lt;/span&gt;

&lt;span class="pgcssn"&gt;test&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;30&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;25&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;35&lt;/span&gt;&lt;span class="pgcssp"&gt;]]&lt;/span&gt;
&lt;span class="pgcssnb"&gt;list&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;itertools&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;chain&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;from_iterable&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;test&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt;  &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;30&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;25&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;35&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;ul class="simple"&gt;
&lt;li&gt;Using &lt;strong&gt;map&lt;/strong&gt; and strings (Suggested by &lt;a class="reference external" href="https://twitter.com/Romestantc/status/1243655980203659265"&gt;&amp;#64;Romestantc&lt;/a&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;test&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt;  &lt;span class="pgcssp"&gt;[[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;30&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;25&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;35&lt;/span&gt;&lt;span class="pgcssp"&gt;]]&lt;/span&gt;
&lt;span class="pgcssnb"&gt;map&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssnb"&gt;int&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;join&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;c&lt;/span&gt; &lt;span class="pgcssk"&gt;for&lt;/span&gt; &lt;span class="pgcssn"&gt;c&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcssn"&gt;test&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssfm"&gt;__str__&lt;/span&gt;&lt;span class="pgcssp"&gt;()&lt;/span&gt; &lt;span class="pgcssk"&gt;if&lt;/span&gt; &lt;span class="pgcssn"&gt;c&lt;/span&gt; &lt;span class="pgcssow"&gt;not&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;[]&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;split&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt; &lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;30&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;25&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;35&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Not pretty in my opinion ;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="count-individual-items-of-any-iterable"&gt;
&lt;h3&gt;Count  individual items of any iterable&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;collections&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;Counter&lt;/span&gt;
&lt;span class="pgcssn"&gt;count&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;Counter&lt;/span&gt;&lt;span class="pgcssp"&gt;([&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;

&lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;count&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssn"&gt;Counter&lt;/span&gt;&lt;span class="pgcssp"&gt;({&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;})&lt;/span&gt;

&lt;span class="pgcssn"&gt;count&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="repeat-a-series-of-values-from-any-iterable"&gt;
&lt;h3&gt;Repeat a series of values from any iterable&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;itertools&lt;/span&gt; &lt;span class="pgcssk"&gt;as&lt;/span&gt; &lt;span class="pgcssnn"&gt;it&lt;/span&gt;

&lt;span class="pgcssn"&gt;data&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;it&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;cycle&lt;/span&gt;&lt;span class="pgcssp"&gt;([&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;

&lt;span class="pgcssk"&gt;for&lt;/span&gt; &lt;span class="pgcssn"&gt;i&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcssnb"&gt;range&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssmi"&gt;10&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
    &lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssnb"&gt;next&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="name-slices-to-reuse-them"&gt;
&lt;h3&gt;Name slices to reuse them&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssc1"&gt;# slice(start, end, step)&lt;/span&gt;

&lt;span class="pgcssn"&gt;STEPTWO&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssnb"&gt;slice&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsskc"&gt;None&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsskc"&gt;None&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;7&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;9&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;

&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssn"&gt;STEPTWO&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;This is the same as:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt;&lt;span class="pgcssp"&gt;[::&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="reverse-any-indexable-collection-that-supports-slices"&gt;
&lt;h3&gt;Reverse any &amp;quot;indexable&amp;quot; collection that supports slices&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssc1"&gt;# slice(None, None, -1) or [::-1]&lt;/span&gt;

&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;7&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;9&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt;&lt;span class="pgcssp"&gt;[::&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;9&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;7&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5 …&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="a-collection-of-small-python-scripts-and-tips"&gt;
&lt;h2&gt;A collection of small Python scripts and tips.&lt;/h2&gt;
&lt;p&gt;This post is based on a &lt;a class="reference external" href="https://twitter.com/jackboot7/status/1243321600507654144"&gt;Twitter thread&lt;/a&gt; I started in April 2020 and works as a centralized way
to read all the tips in an easier format than Twitter's 280 characters.&lt;/p&gt;
&lt;p&gt;Both will be updated frequently.&lt;/p&gt;
&lt;div class="section" id="list-flatten-without-explicit-loops"&gt;
&lt;h3&gt;List Flatten without explicit loops&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Using Itertools' chain&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;itertools&lt;/span&gt;

&lt;span class="pgcssn"&gt;test&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;30&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;25&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;35&lt;/span&gt;&lt;span class="pgcssp"&gt;]]&lt;/span&gt;
&lt;span class="pgcssnb"&gt;list&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;itertools&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;chain&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;from_iterable&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;test&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt;  &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;30&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;25&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;35&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;ul class="simple"&gt;
&lt;li&gt;Using &lt;strong&gt;map&lt;/strong&gt; and strings (Suggested by &lt;a class="reference external" href="https://twitter.com/Romestantc/status/1243655980203659265"&gt;&amp;#64;Romestantc&lt;/a&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;test&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt;  &lt;span class="pgcssp"&gt;[[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;30&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;25&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;35&lt;/span&gt;&lt;span class="pgcssp"&gt;]]&lt;/span&gt;
&lt;span class="pgcssnb"&gt;map&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssnb"&gt;int&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;join&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;c&lt;/span&gt; &lt;span class="pgcssk"&gt;for&lt;/span&gt; &lt;span class="pgcssn"&gt;c&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcssn"&gt;test&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssfm"&gt;__str__&lt;/span&gt;&lt;span class="pgcssp"&gt;()&lt;/span&gt; &lt;span class="pgcssk"&gt;if&lt;/span&gt; &lt;span class="pgcssn"&gt;c&lt;/span&gt; &lt;span class="pgcssow"&gt;not&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;[]&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;split&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt; &lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;30&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;25&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;35&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Not pretty in my opinion ;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="count-individual-items-of-any-iterable"&gt;
&lt;h3&gt;Count  individual items of any iterable&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;collections&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;Counter&lt;/span&gt;
&lt;span class="pgcssn"&gt;count&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;Counter&lt;/span&gt;&lt;span class="pgcssp"&gt;([&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;

&lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;count&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssn"&gt;Counter&lt;/span&gt;&lt;span class="pgcssp"&gt;({&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;})&lt;/span&gt;

&lt;span class="pgcssn"&gt;count&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="repeat-a-series-of-values-from-any-iterable"&gt;
&lt;h3&gt;Repeat a series of values from any iterable&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;itertools&lt;/span&gt; &lt;span class="pgcssk"&gt;as&lt;/span&gt; &lt;span class="pgcssnn"&gt;it&lt;/span&gt;

&lt;span class="pgcssn"&gt;data&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;it&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;cycle&lt;/span&gt;&lt;span class="pgcssp"&gt;([&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;

&lt;span class="pgcssk"&gt;for&lt;/span&gt; &lt;span class="pgcssn"&gt;i&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcssnb"&gt;range&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssmi"&gt;10&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
    &lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssnb"&gt;next&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;span class="pgcssmi"&gt;1&lt;/span&gt;
&lt;span class="pgcssmi"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="name-slices-to-reuse-them"&gt;
&lt;h3&gt;Name slices to reuse them&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssc1"&gt;# slice(start, end, step)&lt;/span&gt;

&lt;span class="pgcssn"&gt;STEPTWO&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssnb"&gt;slice&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsskc"&gt;None&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsskc"&gt;None&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;7&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;9&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;

&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssn"&gt;STEPTWO&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;This is the same as:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt;&lt;span class="pgcssp"&gt;[::&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="reverse-any-indexable-collection-that-supports-slices"&gt;
&lt;h3&gt;Reverse any &amp;quot;indexable&amp;quot; collection that supports slices&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssc1"&gt;# slice(None, None, -1) or [::-1]&lt;/span&gt;

&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;7&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;9&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt;&lt;span class="pgcssp"&gt;[::&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;9&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;7&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="use-array-to-keep-homogeneous-type-of-objects-in-your-lists"&gt;
&lt;h3&gt;Use array to keep homogeneous type of objects in your lists&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;array&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;array&lt;/span&gt;

&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;array&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;i&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;

&lt;span class="pgcssn"&gt;integer_list&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;array&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;i&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssne"&gt;TypeError&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssn"&gt;an&lt;/span&gt; &lt;span class="pgcssn"&gt;integer&lt;/span&gt; &lt;span class="pgcssow"&gt;is&lt;/span&gt; &lt;span class="pgcssn"&gt;required&lt;/span&gt; &lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;got&lt;/span&gt; &lt;span class="pgcssnb"&gt;type&lt;/span&gt; &lt;span class="pgcssnb"&gt;str&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;The constructor of array includes a type code parameter and an optional initial list.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="swap-dictionary-key-values-using-zip"&gt;
&lt;h3&gt;Swap dictionary key-values using &lt;cite&gt;zip&lt;/cite&gt;&lt;/h3&gt;
&lt;p&gt;Using &lt;strong&gt;zip&lt;/strong&gt;:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;data&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;{&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt; &lt;span class="pgcssp"&gt;}&lt;/span&gt;

&lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;items&lt;/span&gt;&lt;span class="pgcssp"&gt;()&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssn"&gt;dict_items&lt;/span&gt;&lt;span class="pgcssp"&gt;([(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;),&lt;/span&gt; &lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;),&lt;/span&gt; &lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;),&lt;/span&gt; &lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;)])&lt;/span&gt;

&lt;span class="pgcssn"&gt;z&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssnb"&gt;zip&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;values&lt;/span&gt;&lt;span class="pgcssp"&gt;(),&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;keys&lt;/span&gt;&lt;span class="pgcssp"&gt;())&lt;/span&gt;

&lt;span class="pgcssnb"&gt;dict&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;z&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt;  &lt;span class="pgcssp"&gt;{&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt; &lt;span class="pgcssp"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Using &lt;strong&gt;dictionary comprehensions&lt;/strong&gt;:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;data&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;{&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt; &lt;span class="pgcssp"&gt;}&lt;/span&gt;

&lt;span class="pgcssp"&gt;{&lt;/span&gt; &lt;span class="pgcssn"&gt;v&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;&lt;span class="pgcssn"&gt;k&lt;/span&gt; &lt;span class="pgcssk"&gt;for&lt;/span&gt; &lt;span class="pgcssn"&gt;k&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;v&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;items&lt;/span&gt;&lt;span class="pgcssp"&gt;()&lt;/span&gt; &lt;span class="pgcssp"&gt;}&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt;  &lt;span class="pgcssp"&gt;{&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt; &lt;span class="pgcssp"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;If there are repeated values, the result will be overwritten, so be careful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="namedtuples-as-lightweight-inmutable-record-like-objects"&gt;
&lt;h3&gt;Namedtuples as lightweight, inmutable, record-like objects&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;collections&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;namedtuple&lt;/span&gt;

&lt;span class="pgcssn"&gt;Person&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;namedtuple&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;Person&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss2"&gt;&amp;quot;name age gender&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcssn"&gt;bob&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;Person&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;30&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss2"&gt;&amp;quot;male&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcssn"&gt;bob&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;age&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssmi"&gt;30&lt;/span&gt;

&lt;span class="pgcssn"&gt;bob&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssmi"&gt;30&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Something similar can be achieved using Dataclasses (for Python 3.8+)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="built-ins-set-and-frozenset-for-unordered-collections-of-hashable-objects"&gt;
&lt;h3&gt;Built-ins set and frozenset for unordered collections of hashable objects&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;A&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssnb"&gt;set&lt;/span&gt;&lt;span class="pgcssp"&gt;([&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;
&lt;span class="pgcssn"&gt;B&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssnb"&gt;set&lt;/span&gt;&lt;span class="pgcssp"&gt;([&lt;/span&gt;&lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;

&lt;span class="pgcssn"&gt;A&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;union&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;B&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;{&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;}&lt;/span&gt;

&lt;span class="pgcssn"&gt;A&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;intersection&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;B&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;{&lt;/span&gt;&lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;}&lt;/span&gt;

&lt;span class="pgcssn"&gt;A&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;symmetric_difference&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;B&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;{&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;frozenset&lt;/strong&gt; has the same interface but returns an inmutable &lt;strong&gt;set&lt;/strong&gt; object.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="itertools-dropwhile-and-takewhile-to-filter-from-an-iterator"&gt;
&lt;h3&gt;Itertools' dropwhile and takewhile to filter from an iterator&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;itertools&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt;  &lt;span class="pgcssn"&gt;dropwhile&lt;/span&gt;

&lt;span class="pgcssn"&gt;numbers&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;

&lt;span class="pgcssn"&gt;f&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssk"&gt;lambda&lt;/span&gt; &lt;span class="pgcssn"&gt;x&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt; &lt;span class="pgcssn"&gt;x&lt;/span&gt; &lt;span class="pgcsso"&gt;&amp;lt;&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;

&lt;span class="pgcssnb"&gt;list&lt;/span&gt; &lt;span class="pgcssp"&gt;(&lt;/span&gt; &lt;span class="pgcssn"&gt;dropwhile&lt;/span&gt; &lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;numbers&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt; &lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt;  &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;takewhile&lt;/strong&gt;  takes the items if &lt;em&gt;True&lt;/em&gt;. The difference with built-in function &lt;strong&gt;filter&lt;/strong&gt;
is that the iteration stops whenever the test-function is false.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;numbers&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;span class="pgcssnb"&gt;list&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;dropwhile&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;numbers&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;

&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;As &lt;a class="reference external" href="https://twitter.com/jgomo3/status/1248023890342920194"&gt;&amp;#64;jgomo3&lt;/a&gt; Observes, one way to think about those functions is that they simply divide a sequence in halves.&lt;/p&gt;
&lt;blockquote&gt;
takewhile gives you the first part.
dropwhile the last part.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="traspose-a-matrix-with-list-comprehensions"&gt;
&lt;h3&gt;Traspose a matrix with List Comprehensions&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;M&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[[&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt;&lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt;
     &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt;&lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt;&lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt;
     &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;7&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt;&lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt;&lt;span class="pgcssmi"&gt;9&lt;/span&gt;&lt;span class="pgcssp"&gt;]]&lt;/span&gt;

&lt;span class="pgcssn"&gt;MT&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;[[&lt;/span&gt;&lt;span class="pgcssn"&gt;row&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssn"&gt;i&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt; &lt;span class="pgcssk"&gt;for&lt;/span&gt; &lt;span class="pgcssn"&gt;row&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcssn"&gt;M&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt; &lt;span class="pgcssk"&gt;for&lt;/span&gt; &lt;span class="pgcssn"&gt;i&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcssnb"&gt;range&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssnb"&gt;len&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;M&lt;/span&gt;&lt;span class="pgcssp"&gt;))]&lt;/span&gt;

&lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;MT&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcssp"&gt;[[&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;7&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;2&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;8&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt;  &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;3&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;9&lt;/span&gt;&lt;span class="pgcssp"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Also, NumPy provides methods to for easier matrix manipulation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="datetime-to-utc"&gt;
&lt;h3&gt;Datetime to UTC&lt;/h3&gt;
&lt;p&gt;To create timezone aware datetimes in Python:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;datetime&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;datetime&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;timezone&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;timedelta&lt;/span&gt;

&lt;span class="pgcssn"&gt;tz&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;timezone&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;timedelta&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;hours&lt;/span&gt;&lt;span class="pgcsso"&gt;=-&lt;/span&gt;&lt;span class="pgcssmi"&gt;6&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;  &lt;span class="pgcssc1"&gt;# UTC-6&lt;/span&gt;
&lt;span class="pgcssn"&gt;local&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;datetime&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssmi"&gt;2020&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;16&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;13&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;tzinfo&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssn"&gt;tz&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcssn"&gt;local&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;isoformat&lt;/span&gt;&lt;span class="pgcssp"&gt;()&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;2020-04-16T13:40:00-06:00&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;datetime&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;datetime&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;timezone&lt;/span&gt;

&lt;span class="pgcssc1"&gt;# assuming `local` is a datetime object&lt;/span&gt;

&lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;local&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;isoformat&lt;/span&gt;&lt;span class="pgcssp"&gt;()&lt;/span&gt; &lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;2020-04-16T13:40:00-06:00&amp;#39;&lt;/span&gt;

&lt;span class="pgcssn"&gt;local_in_utc&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;local&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;astimezone&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;timezone&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;utc&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;local_in_utc&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;isoformat&lt;/span&gt;&lt;span class="pgcssp"&gt;())&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;2020-04-16T19:40:00+00:00&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;You can always use &lt;strong&gt;pytz&lt;/strong&gt; to handle timezones.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;datetime&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;datetime&lt;/span&gt;
&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;pytz&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;timezone&lt;/span&gt;

&lt;span class="pgcssn"&gt;dt&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;datetime&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssmi"&gt;2020&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;16&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;13&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;40&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;tzinfo&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssn"&gt;pytz&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;utc&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;dt&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;isoformat&lt;/span&gt;&lt;span class="pgcssp"&gt;())&lt;/span&gt;
&lt;span class="pgcsso"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;2020-04-16T13:40:00+00:00&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="functools-singledispatch-to-achieve-parametric-polymorphism-in-python"&gt;
&lt;h3&gt;functools.singledispatch  to achieve  parametric polymorphism in Python&lt;/h3&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;functools&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;singledispatch&lt;/span&gt;


&lt;span class="pgcssnd"&gt;@singledispatch&lt;/span&gt;
&lt;span class="pgcssk"&gt;def&lt;/span&gt; &lt;span class="pgcssnf"&gt;process&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;num&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsskc"&gt;None&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
    &lt;span class="pgcssk"&gt;raise&lt;/span&gt; &lt;span class="pgcssne"&gt;NotImplementedError&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;Implement process function.&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcssnd"&gt;@process&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;register&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssnb"&gt;int&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcssk"&gt;def&lt;/span&gt; &lt;span class="pgcssnf"&gt;sub_process&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;num&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
    &lt;span class="pgcssc1"&gt;# processing interger&lt;/span&gt;
    &lt;span class="pgcssk"&gt;return&lt;/span&gt; &lt;span class="pgcsssa"&gt;f&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;Integer &lt;/span&gt;&lt;span class="pgcsssi"&gt;{&lt;/span&gt;&lt;span class="pgcssn"&gt;num&lt;/span&gt;&lt;span class="pgcsssi"&gt;}&lt;/span&gt;&lt;span class="pgcsss2"&gt; has been processed successfully!&amp;quot;&lt;/span&gt;

&lt;span class="pgcssnd"&gt;@process&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;register&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssnb"&gt;float&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcssk"&gt;def&lt;/span&gt; &lt;span class="pgcssnf"&gt;sub_process&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;num&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
    &lt;span class="pgcssc1"&gt;# processing float&lt;/span&gt;
    &lt;span class="pgcssk"&gt;return&lt;/span&gt; &lt;span class="pgcsssa"&gt;f&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;Float &lt;/span&gt;&lt;span class="pgcsssi"&gt;{&lt;/span&gt;&lt;span class="pgcssn"&gt;num&lt;/span&gt;&lt;span class="pgcsssi"&gt;}&lt;/span&gt;&lt;span class="pgcsss2"&gt; has been processed successfully!&amp;quot;&lt;/span&gt;

&lt;span class="pgcssc1"&gt;# use the function&lt;/span&gt;
&lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;process&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssmf"&gt;12.0&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;
&lt;span class="pgcssnb"&gt;print&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;process&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
</content><category term="programming"></category><category term="python"></category><category term="tips"></category><category term="lists"></category><category term="functools"></category><category term="itertools"></category><category term="timezone"></category></entry><entry><title>Recruiting Tips for Recruiters</title><link href="https://www.jackboot7.com/recruiters-tips-recruiters.html" rel="alternate"></link><published>2020-05-13T19:30:00-04:00</published><updated>2020-05-13T19:30:00-04:00</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2020-05-13:/recruiters-tips-recruiters.html</id><summary type="html">&lt;p&gt;Since I started my professional life, several years ago, I've dealt with technical recruiters, that's great, right? I'm able to improve my quality of life, grow in a career path, and pursue interesting projects.&lt;/p&gt;
&lt;p&gt;Unfortunately, my day to day experience with recruiters is not always great, usually, it takes a lot of time to filter interesting offers from less interesting ones. Based on my experience, I'll try and give a few hints on what makes the recruiting/sourcing process more enjoyable for engineers, engineering managers, product managers, and UX specialists, and hopefully with better results for recruiters.&lt;/p&gt;
&lt;p&gt;Instead of ranting about a specific situation on Twitter, I thought it might be useful to describe what &amp;quot;good recruiting&amp;quot; looks like for me.&lt;/p&gt;
&lt;p&gt;Let's start:&lt;/p&gt;
&lt;ol class="arabic" start="0"&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Do your homework&lt;/strong&gt;: most engineers and engineering managers I know maintain some kind of blog, Github profile, or LinkedIn profile. Some engineers give talks at local Meetups. They have invested a lot of time publicly sharing some of their work. It is nice to deal with recruiters that have taken their time reviewing that public information if recruiting is a numbers game, you'll drastically increase your chance of screening the right candidates if you do a little research beforehand. &lt;strong&gt;And... please, please, please, get the name right in your first contact&lt;/strong&gt; you wouldn't believe me how many recruiters call me by another name...&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Be expressive with the job description&lt;/strong&gt;: No, I'm not interested in a position I know nothing about, giving out my number to &amp;quot;know more&amp;quot;, is not practical to anyone. Tell as much as you can about the position, the team, the kind of projects. The more information a possible candidate knows about the position the more interested (or not) they can be about continue the selection process. You want a software engineer to work …&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;Since I started my professional life, several years ago, I've dealt with technical recruiters, that's great, right? I'm able to improve my quality of life, grow in a career path, and pursue interesting projects.&lt;/p&gt;
&lt;p&gt;Unfortunately, my day to day experience with recruiters is not always great, usually, it takes a lot of time to filter interesting offers from less interesting ones. Based on my experience, I'll try and give a few hints on what makes the recruiting/sourcing process more enjoyable for engineers, engineering managers, product managers, and UX specialists, and hopefully with better results for recruiters.&lt;/p&gt;
&lt;p&gt;Instead of ranting about a specific situation on Twitter, I thought it might be useful to describe what &amp;quot;good recruiting&amp;quot; looks like for me.&lt;/p&gt;
&lt;p&gt;Let's start:&lt;/p&gt;
&lt;ol class="arabic" start="0"&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Do your homework&lt;/strong&gt;: most engineers and engineering managers I know maintain some kind of blog, Github profile, or LinkedIn profile. Some engineers give talks at local Meetups. They have invested a lot of time publicly sharing some of their work. It is nice to deal with recruiters that have taken their time reviewing that public information if recruiting is a numbers game, you'll drastically increase your chance of screening the right candidates if you do a little research beforehand. &lt;strong&gt;And... please, please, please, get the name right in your first contact&lt;/strong&gt; you wouldn't believe me how many recruiters call me by another name...&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Be expressive with the job description&lt;/strong&gt;: No, I'm not interested in a position I know nothing about, giving out my number to &amp;quot;know more&amp;quot;, is not practical to anyone. Tell as much as you can about the position, the team, the kind of projects. The more information a possible candidate knows about the position the more interested (or not) they can be about continue the selection process. You want a software engineer to work on the frontend with React in a team of three? Say so. Do you want to fill a management position? Tell about the project, the team, the stakeholders. We all value our time, the more information you can give in your first contacts the better for everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Mention the company you're recruiting for&lt;/strong&gt;: This might sound silly, but unless it is obvious who your employer is, it is important to mention the company that you're recruiting for. People usually want to research the company online. If you &amp;quot;don't reveal&amp;quot; the company you're recruiting for, it looks shady and for most of us that's an automated &amp;quot;no follow&amp;quot;.&lt;/p&gt;
&lt;p&gt;2.1  &lt;strong&gt;What about the phone screen?&lt;/strong&gt; The phone screen comes in &lt;em&gt;after&lt;/em&gt; the candidate is interested in &amp;quot;knowing more&amp;quot; about the position or project, not before. I have received tens of messages from recruiters that demand my phone number before they give me any information about the position they want to fill. If you want to do a quick phone screen, mention it as part of the general information about the position you give in your first contact.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Understand the position you're trying to fill&lt;/strong&gt;: It is a common mistake to ask candidates for +5 years experience in technologies that have existed only for two years or to confuse Java with Javascript. You must understand the position so you can ask the right questions and don't seem clueless to candidates. The more you understand the position, the more questions you can answer... which takes me to the next point.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Be present&lt;/strong&gt;: You must accompany the candidates through the process, just finding a possible candidate is only the first step. Be there to answer the questions the candidate could have about the process, explain the selection process so there are no doubts, and give useful feedback if the candidate is not selected for any reason. Remember, you are the face of the company you work for, a good recruiting experience leaves the candidate excited to work with you. Just don't disappear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Be excited about the project&lt;/strong&gt;: Some recruiters don't show any excitement or interest in the position they're recruiting for... I'm sorry, but if it isn't important to you, why should I be interested?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;What's the compensation package/salary range&lt;/strong&gt;: Let's face it, money is important, people want to know if it is worth it to do a selection process and to invest time in interviews. If you're aware that your compensation package is lower than others, I'm sure the company would have a way to balance that. Don't be obscure with salary ranges.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We could resume all these tips with a simple one &lt;strong&gt;Respect everybody's time&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Is there any other tip you think is important? Let me know in the comments!&lt;/p&gt;
&lt;p&gt;Thanks &lt;a class="reference external" href="https://twitter.com/Cris_Towi"&gt;Chris&lt;/a&gt; for taking your time proofreading this article.&lt;/p&gt;
</content><category term="eng-mgmt"></category><category term="personal"></category><category term="software"></category><category term="engineering"></category><category term="recruiting"></category><category term="tips"></category><category term="hiring"></category><category term="management"></category><category term="sourcing"></category></entry><entry><title>[Debian] Changing Docker's default /var/lib/docker directory</title><link href="https://www.jackboot7.com/moving-docker-default-directory-debian.html" rel="alternate"></link><published>2019-09-10T18:40:00-04:00</published><updated>2019-09-10T18:40:00-04:00</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2019-09-10:/moving-docker-default-directory-debian.html</id><content type="html">&lt;p&gt;By default, Docker storage its files in the &lt;cite&gt;/var/lib/docker&lt;/cite&gt; directory in the file system. If, like me, you're running out of disk space in the default file system, you can quickly change the default directory. This are the steps I followed in Debian 10, it should work with any distro that uses &lt;cite&gt;systemd&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;As superuser, modify the systemd docker startup script. Edit the file &lt;cite&gt;/lib/systemd/system/docker.service&lt;/cite&gt; replacing the &lt;cite&gt;ExecStart&lt;/cite&gt; command:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo vim /var/systemd/system/docker.service
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Change the line:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssnv"&gt;ExecStart&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;/usr/bin/docker daemon -H fd://
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;to&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssnv"&gt;ExecStart&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;/usr/bin/docker daemon -g /new/path -H fd://
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;then stop the service, and be sure that the daemon is completely stopped:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo systemctl stop docker
$ ps -aux &lt;span class="pgcssp"&gt;|&lt;/span&gt; grep -i docker
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;The only output should be the one from &lt;cite&gt;grep&lt;/cite&gt;. Then you can reload the system and -optionally- synchronize your current docker data to the new directory&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo systemctl daemon-reload
$ sudo mkdir /new/path
$ sudo rsync -aqxP /var/lib/docker /new/path
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Your docker installation should be running in the new data directory:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ps -aux &lt;span class="pgcssp"&gt;|&lt;/span&gt; grep -i docker
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;That's it.&lt;/p&gt;
</content><category term="programming"></category><category term="debian"></category><category term="docker"></category><category term="directory"></category><category term="systemd"></category></entry><entry><title>A Quick Guide to Install Spotify in Debian 9.0</title><link href="https://www.jackboot7.com/installing-spotify-debian.html" rel="alternate"></link><published>2017-07-05T09:30:00-04:00</published><updated>2017-07-05T09:30:00-04:00</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2017-07-05:/installing-spotify-debian.html</id><summary type="html">&lt;p&gt;A quick guide of the steps I took to install &lt;em&gt;Spotify version 1.0&lt;/em&gt; in Debian 9.0. First of all, the Spotify team doesn't (officially) support the Linux version, so even if they claim to be compatible with de lastest version of Ubuntu's LTS, it tends to fall behind with the dependencies.&lt;/p&gt;
&lt;p&gt;With a fresh install of Debian, you'll need &lt;em&gt;dirmngr&lt;/em&gt; installed before adding the Spotify repository to your &lt;em&gt;apt&lt;/em&gt; list:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install dirmngr
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;After &lt;em&gt;dirmngr&lt;/em&gt; installation, you'll need to add the Spotify keys and repositories (just check the instructions in the &lt;a class="reference external" href="https://www.spotify.com/mx/download/linux/"&gt;Spotify for Linux&lt;/a&gt; website):&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886
$ &lt;span class="pgcssnb"&gt;echo&lt;/span&gt; deb http://repository.spotify.com stable non-free &lt;span class="pgcssp"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/spotify.list
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;If you follow the instructions at Spotify's website, the installation should be ready with the update and install commands from apt:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt update &lt;span class="pgcsso"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install spotify-client
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;But is a common case that not all the dependencies are up to date between Spotify and Debian, so you'll need to add them &amp;quot;by hand&amp;quot;.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;The following packages have unmet dependencies:
 spotify-client : Depends: libssl1.0.0 but it is not installable
                                  Recommends: libavcodec54 but it is not installable or
                                                          libavcodec-extra-54 but it is not installable
                                  Recommends: libavformat54 but it is not installable
E: Unable to correct problems, you have held broken packages.
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;First you'll have to download the exact same version of the package that Spotify needs, in my case it was &lt;em&gt;libssl1.0.0&lt;/em&gt;, I downloaded it from: &lt;a class="reference external" href="`https://packages.debian.org/jessie/libssl1.0.0`"&gt;https://packages.debian.org/jessie/libssl1.0.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then just install it with apt and try re-installing Spotify:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0 …&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary><content type="html">&lt;p&gt;A quick guide of the steps I took to install &lt;em&gt;Spotify version 1.0&lt;/em&gt; in Debian 9.0. First of all, the Spotify team doesn't (officially) support the Linux version, so even if they claim to be compatible with de lastest version of Ubuntu's LTS, it tends to fall behind with the dependencies.&lt;/p&gt;
&lt;p&gt;With a fresh install of Debian, you'll need &lt;em&gt;dirmngr&lt;/em&gt; installed before adding the Spotify repository to your &lt;em&gt;apt&lt;/em&gt; list:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install dirmngr
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;After &lt;em&gt;dirmngr&lt;/em&gt; installation, you'll need to add the Spotify keys and repositories (just check the instructions in the &lt;a class="reference external" href="https://www.spotify.com/mx/download/linux/"&gt;Spotify for Linux&lt;/a&gt; website):&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886
$ &lt;span class="pgcssnb"&gt;echo&lt;/span&gt; deb http://repository.spotify.com stable non-free &lt;span class="pgcssp"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/spotify.list
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;If you follow the instructions at Spotify's website, the installation should be ready with the update and install commands from apt:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt update &lt;span class="pgcsso"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install spotify-client
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;But is a common case that not all the dependencies are up to date between Spotify and Debian, so you'll need to add them &amp;quot;by hand&amp;quot;.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;The following packages have unmet dependencies:
 spotify-client : Depends: libssl1.0.0 but it is not installable
                                  Recommends: libavcodec54 but it is not installable or
                                                          libavcodec-extra-54 but it is not installable
                                  Recommends: libavformat54 but it is not installable
E: Unable to correct problems, you have held broken packages.
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;First you'll have to download the exact same version of the package that Spotify needs, in my case it was &lt;em&gt;libssl1.0.0&lt;/em&gt;, I downloaded it from: &lt;a class="reference external" href="`https://packages.debian.org/jessie/libssl1.0.0`"&gt;https://packages.debian.org/jessie/libssl1.0.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then just install it with apt and try re-installing Spotify:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb
$ sudo apt install ./libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb  &lt;span class="pgcssc1"&gt;# This can be replaced with sudo dpkg -i ./libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb&lt;/span&gt;
$ sudo apt install spotify-client
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;You should be able to use Spotify in your Debian 9.0 following these steps!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(If you have a premium account, you can use Spotify inside of third party clients such as Clementine in KDE)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="section" id="sources"&gt;
&lt;h2&gt;Sources:&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://community.spotify.com/t5/Desktop-Linux-Windows-Web-Player/Debian-9-higher-versions-dependencies/m-p/1721521#M190484"&gt;Spotify's community forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://wiki.debian.org/spotify"&gt;Debian Wiki for Spotify&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="personal"></category><category term="personal"></category><category term="spotify"></category><category term="debian"></category><category term="music"></category><category term="install"></category><category term="apt"></category></entry><entry><title>Guía rápida de instalación de Spotify en Debian 9.0</title><link href="https://www.jackboot7.com/installing-spotify-debian-es.html" rel="alternate"></link><published>2017-07-05T09:30:00-04:00</published><updated>2017-07-05T09:30:00-04:00</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2017-07-05:/installing-spotify-debian-es.html</id><summary type="html">&lt;p&gt;Una guía rápida de los pasos que tomé para instalar la &lt;em&gt;versión 1.0 de Spotify&lt;/em&gt; en Debian 9.0. Primero que nada, la versión para Linus de Spotify no está soportada oficialmente, entonces, a pesar de que Spotifiy la anuncia como compatible con la última versión LTS de Ubuntu, tiende a quedar atrasada en cuanto a sus dependencias.&lt;/p&gt;
&lt;p&gt;En una instalación limpia de Debian, será necesario tener instalado &lt;em&gt;dirmngr&lt;/em&gt; antes de poder agregar los repositorios de Soptify a tus repositorios &lt;em&gt;apt&lt;/em&gt;:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install dirmngr
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Luego de la instalación de &lt;em&gt;dirmngr&lt;/em&gt;, es necesario agregar las claves y repositorios de Spotify (siguiendo los pasos de la página de instalación de &lt;cite&gt;Spotify para Linux&lt;/cite&gt;):&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886
$ &lt;span class="pgcssnb"&gt;echo&lt;/span&gt; deb http://repository.spotify.com stable non-free &lt;span class="pgcssp"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/spotify.list
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Si sigues las instrucciones en el website de Spotify, la instalación debería terminar con los comandos de &lt;em&gt;update&lt;/em&gt; e &lt;em&gt;install&lt;/em&gt; de apt:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt update &lt;span class="pgcsso"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install spotify-client
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Pero es común que no todas las dependencias estén al día entre Spotify y Debian, entonces habrá que agregarlas &amp;quot;a mano&amp;quot;.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;The following packages have unmet dependencies:
 spotify-client : Depends: libssl1.0.0 but it is not installable
                                  Recommends: libavcodec54 but it is not installable or
                                                          libavcodec-extra-54 but it is not installable
                                  Recommends: libavformat54 but it is not installable
E: Unable to correct problems, you have held broken packages.
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;En primer lugar, deberás descargar la versión exacta del paquete que Spotify necesita, en mi caso era necesario &lt;em&gt;libssl1.0.0&lt;/em&gt;, el cual descargué desde: &lt;a class="reference external" href="`https://packages.debian.org/jessie/libssl1.0.0`"&gt;https://packages.debian.org/jessie/libssl1.0.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Luego, sólo tendrás que instalarlo con apt e intentar instalar Spotity:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ wget http://security.debian.org …&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary><content type="html">&lt;p&gt;Una guía rápida de los pasos que tomé para instalar la &lt;em&gt;versión 1.0 de Spotify&lt;/em&gt; en Debian 9.0. Primero que nada, la versión para Linus de Spotify no está soportada oficialmente, entonces, a pesar de que Spotifiy la anuncia como compatible con la última versión LTS de Ubuntu, tiende a quedar atrasada en cuanto a sus dependencias.&lt;/p&gt;
&lt;p&gt;En una instalación limpia de Debian, será necesario tener instalado &lt;em&gt;dirmngr&lt;/em&gt; antes de poder agregar los repositorios de Soptify a tus repositorios &lt;em&gt;apt&lt;/em&gt;:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install dirmngr
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Luego de la instalación de &lt;em&gt;dirmngr&lt;/em&gt;, es necesario agregar las claves y repositorios de Spotify (siguiendo los pasos de la página de instalación de &lt;cite&gt;Spotify para Linux&lt;/cite&gt;):&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886
$ &lt;span class="pgcssnb"&gt;echo&lt;/span&gt; deb http://repository.spotify.com stable non-free &lt;span class="pgcssp"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/spotify.list
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Si sigues las instrucciones en el website de Spotify, la instalación debería terminar con los comandos de &lt;em&gt;update&lt;/em&gt; e &lt;em&gt;install&lt;/em&gt; de apt:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt update &lt;span class="pgcsso"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install spotify-client
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Pero es común que no todas las dependencias estén al día entre Spotify y Debian, entonces habrá que agregarlas &amp;quot;a mano&amp;quot;.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;The following packages have unmet dependencies:
 spotify-client : Depends: libssl1.0.0 but it is not installable
                                  Recommends: libavcodec54 but it is not installable or
                                                          libavcodec-extra-54 but it is not installable
                                  Recommends: libavformat54 but it is not installable
E: Unable to correct problems, you have held broken packages.
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;En primer lugar, deberás descargar la versión exacta del paquete que Spotify necesita, en mi caso era necesario &lt;em&gt;libssl1.0.0&lt;/em&gt;, el cual descargué desde: &lt;a class="reference external" href="`https://packages.debian.org/jessie/libssl1.0.0`"&gt;https://packages.debian.org/jessie/libssl1.0.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Luego, sólo tendrás que instalarlo con apt e intentar instalar Spotity:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb
$ sudo apt install ./libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb  &lt;span class="pgcssc1"&gt;# This can be replaced with sudo dpkg -i ./libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb&lt;/span&gt;
$ sudo apt install spotify-client
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Deberías poder usar Spotify en tu Debian 9.0 siguiendo estos pasos!&lt;/p&gt;
&lt;p&gt;(Si tienes una cuenta &lt;em&gt;Premium&lt;/em&gt;, puedes usar Spotify en aplicaciones de terceros como Clementine en KDE)&lt;/p&gt;
&lt;div class="section" id="fuentes"&gt;
&lt;h2&gt;Fuentes:&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://community.spotify.com/t5/Desktop-Linux-Windows-Web-Player/Debian-9-higher-versions-dependencies/m-p/1721521#M190484"&gt;Foro de la comunidad de Spotify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://wiki.debian.org/spotify"&gt;Debian Wiki para Spotify&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="personal"></category><category term="personal"></category><category term="spotify"></category><category term="debian"></category><category term="music"></category><category term="install"></category><category term="apt"></category></entry><entry><title>A Farewell to a Great Company</title><link href="https://www.jackboot7.com/farewell-posma-group.html" rel="alternate"></link><published>2016-11-08T09:30:00-04:00</published><updated>2016-11-08T09:30:00-04:00</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2016-11-08:/farewell-posma-group.html</id><content type="html">&lt;p&gt;This month marks my final month as a CTO/Lead at &lt;a class="reference external" href="http://www.posmagroup.com/"&gt;Posma Group&lt;/a&gt;. It's been six years of ups and downs, working in varied and interesting projects, but most of all, working with amazing people, both coworkers and clients. In six years, we went from just the 3 cofounders to a team of 20+ between two offices, working in lots of different projects.&lt;/p&gt;
&lt;p&gt;Thanks to all the people who helped me grow and learn along the way. It was a great experience in so many ways.&lt;/p&gt;
&lt;p&gt;I wish all the luck to Jorge and Oscar in their aim to keep growing the company and the great team of Posma Group. I'm sure we'll work together in some project, sometime in the future!&lt;/p&gt;
&lt;p&gt;Now, let's see what comes next!&lt;/p&gt;
&lt;img alt="Posma Group 2016" class="align-center" src="https://www.jackboot7.com/images/posma_group_2016.jpg" style="width: 750px; height: 354px;" /&gt;
</content><category term="personal"></category><category term="personal"></category><category term="work"></category><category term="posma"></category><category term="posma group"></category><category term="career"></category></entry><entry><title>Visualizing Tweets During Election Weekend</title><link href="https://www.jackboot7.com/visualizing-tweets.html" rel="alternate"></link><published>2015-12-10T09:30:00-05:30</published><updated>2015-12-15T18:04:00-05:30</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2015-12-10:/visualizing-tweets.html</id><summary type="html">&lt;p&gt;On Sunday (Dec. 06) parliamentary elections were held in Venzuela. I took the opportunity to fetch some data from Twitter's public stream and use graphics to show what was happening in &amp;quot;&lt;cite&gt;social media&lt;/cite&gt;&amp;quot; during that day. To achieve this I relied in the Python programming language.&lt;/p&gt;
&lt;div class="section" id="the-data"&gt;
&lt;h2&gt;&lt;a class="reference internal" href="#the-data"&gt;The Data&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I decided to monitor all geolocalized tweets with my home city (Caracas) as origin over a period of five days, two days before the elections, the election day, and two days after it.&lt;/p&gt;
&lt;p&gt;To fetch the data, I used the &lt;a class="reference external" href="https://pypi.python.org/pypi/twython/"&gt;Twython&lt;/a&gt; library since I've worked with it before. Therefore, it should be easy to setup a quick script to fetch the data and save it in a text file.&lt;/p&gt;
&lt;p&gt;Once the &lt;cite&gt;API&lt;/cite&gt; and &lt;cite&gt;OAUTH&lt;/cite&gt; keys are correctly following &lt;a class="reference external" href="http://twython.readthedocs.org/en/latest/usage/starting_out.html"&gt;Twython's documentation&lt;/a&gt;, the next step is to fetch the data originating in certain location, passing it as a parameter to the streaming API. Twitter uses a set of bounding boxes to track the location of a tweet and only geolocated Tweets falling within the requested bounding boxes will be included.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;json&lt;/span&gt;&lt;span class="pgcsso"&gt;,&lt;/span&gt; &lt;span class="pgcssnn"&gt;os&lt;/span&gt;
&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;twython&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;TwythonStreamer&lt;/span&gt;

&lt;span class="pgcssn"&gt;caracas_location&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcsss2"&gt;&amp;quot;-67.017225,10.419554,-66.778716,10.52006&amp;quot;&lt;/span&gt;

&lt;span class="pgcssk"&gt;class&lt;/span&gt; &lt;span class="pgcssnc"&gt;MyStreamer&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;TwythonStreamer&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
    &lt;span class="pgcssk"&gt;def&lt;/span&gt; &lt;span class="pgcssnf"&gt;on_success&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssbp"&gt;self&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
        &lt;span class="pgcssk"&gt;if&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;coordinates&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt; &lt;span class="pgcssow"&gt;is&lt;/span&gt; &lt;span class="pgcssow"&gt;not&lt;/span&gt; &lt;span class="pgcsskc"&gt;None&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
            &lt;span class="pgcssk"&gt;with&lt;/span&gt; &lt;span class="pgcssnb"&gt;open&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;tweets.txt&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt; &lt;span class="pgcssk"&gt;as&lt;/span&gt; &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
                &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;write&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;json&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;dumps&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;
                &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;write&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="pgcssse"&gt;\n&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

    &lt;span class="pgcssk"&gt;def&lt;/span&gt; &lt;span class="pgcssnf"&gt;on_error&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssbp"&gt;self&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;status_code&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
        &lt;span class="pgcssk"&gt;with&lt;/span&gt; &lt;span class="pgcssnb"&gt;open&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;errors.txt&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt; &lt;span class="pgcssk"&gt;as&lt;/span&gt; &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
            &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;write&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;error: &lt;/span&gt;&lt;span class="pgcsssi"&gt;{0}&lt;/span&gt;&lt;span class="pgcsss1"&gt;: &lt;/span&gt;&lt;span class="pgcsssi"&gt;{1}&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;format&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;status_code&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;



&lt;span class="pgcssn"&gt;stream&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;MyStreamer&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;environ&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;APP_KEY&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;environ&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;APP_SECRET&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt;
                        &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;environ&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;OAUTH_TOKEN&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;environ&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;OAUTH_TOKEN_SECRET&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;

&lt;span class="pgcssn"&gt;stream&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;statuses&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;filter&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;locations&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssn"&gt;caracas_location&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Since I just wanted to fetch geolocalized tweets, I checked for the existance of the &lt;cite&gt;coordinates&lt;/cite&gt; entity in the …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;On Sunday (Dec. 06) parliamentary elections were held in Venzuela. I took the opportunity to fetch some data from Twitter's public stream and use graphics to show what was happening in &amp;quot;&lt;cite&gt;social media&lt;/cite&gt;&amp;quot; during that day. To achieve this I relied in the Python programming language.&lt;/p&gt;
&lt;div class="section" id="the-data"&gt;
&lt;h2&gt;&lt;a class="reference internal" href="#the-data"&gt;The Data&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I decided to monitor all geolocalized tweets with my home city (Caracas) as origin over a period of five days, two days before the elections, the election day, and two days after it.&lt;/p&gt;
&lt;p&gt;To fetch the data, I used the &lt;a class="reference external" href="https://pypi.python.org/pypi/twython/"&gt;Twython&lt;/a&gt; library since I've worked with it before. Therefore, it should be easy to setup a quick script to fetch the data and save it in a text file.&lt;/p&gt;
&lt;p&gt;Once the &lt;cite&gt;API&lt;/cite&gt; and &lt;cite&gt;OAUTH&lt;/cite&gt; keys are correctly following &lt;a class="reference external" href="http://twython.readthedocs.org/en/latest/usage/starting_out.html"&gt;Twython's documentation&lt;/a&gt;, the next step is to fetch the data originating in certain location, passing it as a parameter to the streaming API. Twitter uses a set of bounding boxes to track the location of a tweet and only geolocated Tweets falling within the requested bounding boxes will be included.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;json&lt;/span&gt;&lt;span class="pgcsso"&gt;,&lt;/span&gt; &lt;span class="pgcssnn"&gt;os&lt;/span&gt;
&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;twython&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;TwythonStreamer&lt;/span&gt;

&lt;span class="pgcssn"&gt;caracas_location&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcsss2"&gt;&amp;quot;-67.017225,10.419554,-66.778716,10.52006&amp;quot;&lt;/span&gt;

&lt;span class="pgcssk"&gt;class&lt;/span&gt; &lt;span class="pgcssnc"&gt;MyStreamer&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;TwythonStreamer&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
    &lt;span class="pgcssk"&gt;def&lt;/span&gt; &lt;span class="pgcssnf"&gt;on_success&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssbp"&gt;self&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
        &lt;span class="pgcssk"&gt;if&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;coordinates&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt; &lt;span class="pgcssow"&gt;is&lt;/span&gt; &lt;span class="pgcssow"&gt;not&lt;/span&gt; &lt;span class="pgcsskc"&gt;None&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
            &lt;span class="pgcssk"&gt;with&lt;/span&gt; &lt;span class="pgcssnb"&gt;open&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;tweets.txt&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt; &lt;span class="pgcssk"&gt;as&lt;/span&gt; &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
                &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;write&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;json&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;dumps&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;
                &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;write&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="pgcssse"&gt;\n&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

    &lt;span class="pgcssk"&gt;def&lt;/span&gt; &lt;span class="pgcssnf"&gt;on_error&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssbp"&gt;self&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;status_code&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
        &lt;span class="pgcssk"&gt;with&lt;/span&gt; &lt;span class="pgcssnb"&gt;open&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;errors.txt&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt; &lt;span class="pgcssk"&gt;as&lt;/span&gt; &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
            &lt;span class="pgcssn"&gt;f&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;write&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;error: &lt;/span&gt;&lt;span class="pgcsssi"&gt;{0}&lt;/span&gt;&lt;span class="pgcsss1"&gt;: &lt;/span&gt;&lt;span class="pgcsssi"&gt;{1}&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;format&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;status_code&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;



&lt;span class="pgcssn"&gt;stream&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;MyStreamer&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;environ&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;APP_KEY&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;environ&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;APP_SECRET&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt;
                        &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;environ&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;OAUTH_TOKEN&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;environ&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;OAUTH_TOKEN_SECRET&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;])&lt;/span&gt;

&lt;span class="pgcssn"&gt;stream&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;statuses&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;filter&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;locations&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssn"&gt;caracas_location&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Since I just wanted to fetch geolocalized tweets, I checked for the existance of the &lt;cite&gt;coordinates&lt;/cite&gt; entity in the Tweet object and only save the tweets with geolocation data (lat/long). After running the script for a few days I have around of ~50,000 tweets to play with.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="visualizing-the-data"&gt;
&lt;h2&gt;&lt;a class="reference internal" href="#visualizing-the-data"&gt;Visualizing the Data&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="where-were-the-tweets-located"&gt;
&lt;h3&gt;&lt;a class="reference internal" href="#where-were-the-tweets-located"&gt;Where were the tweets located?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The first that I wanted to do with the data was to see what was the origin of the tweets during that period. I decided to use a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Heat_map"&gt;heatmap&lt;/a&gt; on top of a geographical map of the city. To do it, I used the development version of the &lt;a class="reference external" href="http://folium.readthedocs.org/en/latest/"&gt;Folium&lt;/a&gt; library, which implement mapping in Python on top of &lt;cite&gt;Leafleat.js&lt;/cite&gt; and its plugins.&lt;/p&gt;
&lt;img alt="Heatmap" class="align-center" src="https://www.jackboot7.com/images/heatmap.jpeg" style="width: 750px; height: 450px;" /&gt;
&lt;p&gt;Click here to see an interactive &lt;a class="reference external" href="https://www.jackboot7.com/files/heatmap.html"&gt;full version&lt;/a&gt; of the heatmap (&lt;strong&gt;Warning&lt;/strong&gt; big file!)&lt;/p&gt;
&lt;p&gt;The code used to generate the heatmap, once I've read the text file into a list named &lt;cite&gt;data&lt;/cite&gt; is as simple as:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Creating a map centered in Caracas (&lt;cite&gt;10.497084, -66.8854171&lt;/cite&gt;).&lt;/li&gt;
&lt;li&gt;Add each data point to the map using the &lt;cite&gt;add_children&lt;/cite&gt; method.&lt;/li&gt;
&lt;li&gt;Writing the html file.&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;folium&lt;/span&gt;
&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;folium&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;plugins&lt;/span&gt;

&lt;span class="pgcssc1"&gt;# Create a heatmap with the data.&lt;/span&gt;
&lt;span class="pgcssn"&gt;heatmap_map&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;folium&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;Map&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;location&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmf"&gt;10.497084&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsso"&gt;-&lt;/span&gt;&lt;span class="pgcssmf"&gt;66.8854171&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssn"&gt;zoom_start&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssmi"&gt;12&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcssn"&gt;heatmap_map&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;add_children&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;plugins&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;HeatMap&lt;/span&gt;&lt;span class="pgcssp"&gt;([[&lt;/span&gt;&lt;span class="pgcssn"&gt;t&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;1&lt;/span&gt;&lt;span class="pgcssp"&gt;],&lt;/span&gt; &lt;span class="pgcssn"&gt;t&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;]]&lt;/span&gt; &lt;span class="pgcssk"&gt;for&lt;/span&gt; &lt;span class="pgcssn"&gt;t&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcssn"&gt;tweet&lt;/span&gt;&lt;span class="pgcssp"&gt;[&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;coordinates&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;][&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;coordinates&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt; &lt;span class="pgcssk"&gt;for&lt;/span&gt; &lt;span class="pgcssn"&gt;tweet&lt;/span&gt; &lt;span class="pgcssow"&gt;in&lt;/span&gt; &lt;span class="pgcssn"&gt;data&lt;/span&gt;&lt;span class="pgcssp"&gt;]]))&lt;/span&gt;
&lt;span class="pgcssn"&gt;heatmap_map&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;save&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;heatmap.html&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Twitter coordinates are formated as &lt;cite&gt;geoJSON&lt;/cite&gt; that is: longitude first, and then latitude. The code swaps them to add &lt;cite&gt;(lat, long)&lt;/cite&gt; points to the map.&lt;/p&gt;
&lt;p&gt;In the heatmap, we can clearly see the parks and protected areas in Caracas with zero activity. The same way, there is a lot less activiy in &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Caricuao"&gt;Caricuao&lt;/a&gt;, than in the rest of the city. That would be an expected result in the parks and protected areas, but since Caricuao is a large neighborhood the results are clearly interesting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="how-does-activity-look"&gt;
&lt;h3&gt;&lt;a class="reference internal" href="#how-does-activity-look"&gt;How does activity look?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;So, there's a heatmap of the location of the tweets, but how can we represent the activity over the five days?&lt;/p&gt;
&lt;p&gt;I thought that a calendar type chart, such as the one that shows the contributions activity on &lt;a class="reference external" href="https://github.com"&gt;Github&lt;/a&gt; profiles, was an interesting way to represent the data visually. Grouping the tweets by day and hours in cells, and increasing the intensity of the cell depending on the total amount of tweets during that moment.&lt;/p&gt;
&lt;p&gt;To achieve this, I decided to use &lt;a class="reference external" href="http://matplotlib.org"&gt;matplotlib&lt;/a&gt; as the plotting library, insted of using a Javascript based library such as &lt;cite&gt;D3.js&lt;/cite&gt;.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;matplotlib&lt;/span&gt;
&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="pgcssk"&gt;as&lt;/span&gt; &lt;span class="pgcssnn"&gt;plt&lt;/span&gt;
&lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;matplotlib.ticker&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssn"&gt;FuncFormatter&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;MaxNLocator&lt;/span&gt;

&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;numpy&lt;/span&gt; &lt;span class="pgcssk"&gt;as&lt;/span&gt; &lt;span class="pgcssnn"&gt;np&lt;/span&gt;

&lt;span class="pgcssc1"&gt;#&lt;/span&gt;
&lt;span class="pgcssc1"&gt;# Load the dataset into a nested list with the `Date` and the `hour` data&lt;/span&gt;
&lt;span class="pgcssc1"&gt;#&lt;/span&gt;

&lt;span class="pgcssn"&gt;fig&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;ax&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;plt&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;subplots&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;figsize&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssmi"&gt;10&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssmi"&gt;4&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;
&lt;span class="pgcssn"&gt;image&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;np&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;array&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;data_array&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcssn"&gt;cax&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;ax&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;imshow&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;image&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;cmap&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssn"&gt;plt&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;cm&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;magma&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;interpolation&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;nearest&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcssc1"&gt;#&lt;/span&gt;
&lt;span class="pgcssc1"&gt;# Add some parameters for the ticks&lt;/span&gt;
&lt;span class="pgcssc1"&gt;#&lt;/span&gt;

&lt;span class="pgcssc1"&gt;# Add colorbar/legend&lt;/span&gt;
&lt;span class="pgcssn"&gt;cbar&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;fig&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;colorbar&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;cax&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;orientation&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;horizontal&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcssn"&gt;plt&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;subplots_adjust&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;wspace&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcssn"&gt;hspace&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcssmi"&gt;5&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcssn"&gt;plt&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;savefig&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;tweet_frequency_heatmap.png&amp;quot;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;With some visual adjustments such as adding labels to the ticks, I've got the graphic I wanted.&lt;/p&gt;
&lt;img alt="Tweets by hour" class="align-center" src="https://www.jackboot7.com/images/tweet_frequency_heatmap.png" style="width: 800px; height: 320px;" /&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: The lack of tweets during the morning of December 4, is due the absence of data in that period.&lt;/p&gt;
&lt;p&gt;As expected, after midnight, when most people are sleeping, the amount of tweets is very close to zero in normal days (Dec 04, Dec 05, Dec 08). On the election day, the graph shows above &amp;quot;normal&amp;quot; activity, and we can see the exact moment when the results of the election were announced on national TV. Between 12 a.m and 2 a.m. of Dec. 07 the amount of tweets in Caracas duplicated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More visualizations coming soon!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="tools"&gt;
&lt;h2&gt;&lt;a class="reference internal" href="#tools"&gt;Tools&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This little project was used to research and learn the basics of the tooling available to represent data visually (graphs, charts, maps, etc.) some of the tools researched were:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://matplotlib.org"&gt;Matplotlib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://folium.readthedocs.org/en/latest/"&gt;Folium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://pypi.python.org/pypi/mplleaflet/0.0.5"&gt;mplleaflet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://plot.ly/"&gt;Plotly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://leafletjs.com"&gt;leaflet.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can check the Python wiki for a &lt;a class="reference external" href="https://wiki.python.org/moin/NumericAndScientific/Plotting"&gt;comprehensive list&lt;/a&gt; of libraries and resources for plotting data.&lt;/p&gt;
&lt;/div&gt;
</content><category term="programming"></category><category term="data"></category><category term="tweets"></category><category term="twitter"></category><category term="elections"></category><category term="visualize"></category><category term="folium"></category><category term="python"></category><category term="matplotlib"></category><category term="pylab"></category></entry><entry><title>Quick tip: Adding Variables to env in a Virtualenv (for development purpose)</title><link href="https://www.jackboot7.com/virtualenv-add-vars-to-env.html" rel="alternate"></link><published>2015-07-16T13:40:00-05:30</published><updated>2015-07-16T13:40:00-05:30</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2015-07-16:/virtualenv-add-vars-to-env.html</id><content type="html">&lt;p&gt;If you're working with third party APIs, you might find code like &lt;cite&gt;YOUR_SECRET_KEY=&amp;quot;some secret api key&amp;quot;&lt;/cite&gt; in your source code, this is a bad practices for a lot of reasons (security, source code sharing, etc). Instead, the recommended way to manage this kind of situation is to add the value as a enviroment variable, and read it in your code with something like this:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;os&lt;/span&gt;
&lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;environ&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;get&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcsss1"&gt;&amp;#39;YOUR_SECRET_KEY&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;So, how do you avoid to add the variable to the enviroment each time you do some coding? If you're working with virtualenv you simply add it in the &lt;cite&gt;env/bin/activate&lt;/cite&gt; script:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssnv"&gt;YOUR_SECRET_KEY&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;some secret api key&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnb"&gt;export&lt;/span&gt; YOUR_SECRET_KEY
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</content><category term="programming"></category><category term="python"></category><category term="enviroment"></category><category term="virtualenv"></category><category term="export"></category><category term="bash"></category></entry><entry><title>Debian (development tips)</title><link href="https://www.jackboot7.com/debian-development-tips.html" rel="alternate"></link><published>2014-12-13T11:58:00-05:30</published><updated>2015-10-29T16:38:00-05:30</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2014-12-13:/debian-development-tips.html</id><summary type="html">&lt;p&gt;These are some extra steps that I've found necessary when starting development in a recently-installed Debian machine.&lt;/p&gt;
&lt;div class="section" id="jpeg-support-in-pil-and-pillow"&gt;
&lt;h2&gt;Jpeg support in PIL and pillow.&lt;/h2&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install libjpeg libjpeg-dev libfreetype6 libfreetype6-dev zlib1g-dev
$ sudo ln -s /usr/lib/&lt;span class="pgcsssb"&gt;`&lt;/span&gt;uname -i&lt;span class="pgcsssb"&gt;`&lt;/span&gt;-linux-gnu/libfreetype.so /usr/lib/
$ sudo ln -s /usr/lib/&lt;span class="pgcsssb"&gt;`&lt;/span&gt;uname -i&lt;span class="pgcsssb"&gt;`&lt;/span&gt;-linux-gnu/libjpeg.so /usr/lib/
$ sudo ln -s /usr/lib/&lt;span class="pgcsssb"&gt;`&lt;/span&gt;uname -i&lt;span class="pgcsssb"&gt;`&lt;/span&gt;-linux-gnu/libz.so /usr/lib/
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="installing-lxml-in-python-debian-based"&gt;
&lt;h2&gt;Installing lxml in Python (Debian  based).&lt;/h2&gt;
&lt;p&gt;If you're getting the &lt;strong&gt;&amp;quot;fatal error: libxml/xmlversion.h: No such file or directory&amp;quot;&lt;/strong&gt; error, just install the following development files:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install python-dev libxml2-dev libxslt1-dev
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="problems-with-matplotlib-and-freetype"&gt;
&lt;h2&gt;Problems with 'matplotlib' and freetype.&lt;/h2&gt;
&lt;p&gt;If you're having problems installing matplotlib in a Python virtualenv, and are getting the &lt;em&gt;'freetype missing'&lt;/em&gt; error, you sould install the development files for freetype, and (in most cases) rebuild the python dependencies for matplotlib.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get  -u install libfreetype6-dev
$ sudo apt-get build-dep python-matplotlib
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;After that, you can just use pip normally to install matplotlib&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install matplotlib
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;PS. I know of cases where you have to update &lt;em&gt;python-virtualenv&lt;/em&gt; and &lt;em&gt;python-pip&lt;/em&gt; after you use build-dep. Just apt-get upgrade your installation.
Today I learned about the 'pydoc' command from Python.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problems-with-locale"&gt;
&lt;h2&gt;Problems with locale&lt;/h2&gt;
&lt;p&gt;In some machines I've found problems when setting locales from Python.  First check the results of running&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ locale
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;In my case is:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssnv"&gt;LANG&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;es_VE.UTF-8
&lt;span class="pgcssnv"&gt;LANGUAGE&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;es_VE:es
&lt;span class="pgcssnv"&gt;LC_CTYPE&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_NUMERIC&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_TIME&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_COLLATE&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_MONETARY&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_MESSAGES&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_PAPER&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_NAME&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_ADDRESS&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_TELEPHONE&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_MEASUREMENT&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_IDENTIFICATION&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_ALL&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Then use:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;locale&lt;/span&gt;

&lt;span class="pgcssk"&gt;try&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
    &lt;span class="pgcssn"&gt;locale&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;setlocale&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;locale …&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;These are some extra steps that I've found necessary when starting development in a recently-installed Debian machine.&lt;/p&gt;
&lt;div class="section" id="jpeg-support-in-pil-and-pillow"&gt;
&lt;h2&gt;Jpeg support in PIL and pillow.&lt;/h2&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install libjpeg libjpeg-dev libfreetype6 libfreetype6-dev zlib1g-dev
$ sudo ln -s /usr/lib/&lt;span class="pgcsssb"&gt;`&lt;/span&gt;uname -i&lt;span class="pgcsssb"&gt;`&lt;/span&gt;-linux-gnu/libfreetype.so /usr/lib/
$ sudo ln -s /usr/lib/&lt;span class="pgcsssb"&gt;`&lt;/span&gt;uname -i&lt;span class="pgcsssb"&gt;`&lt;/span&gt;-linux-gnu/libjpeg.so /usr/lib/
$ sudo ln -s /usr/lib/&lt;span class="pgcsssb"&gt;`&lt;/span&gt;uname -i&lt;span class="pgcsssb"&gt;`&lt;/span&gt;-linux-gnu/libz.so /usr/lib/
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="installing-lxml-in-python-debian-based"&gt;
&lt;h2&gt;Installing lxml in Python (Debian  based).&lt;/h2&gt;
&lt;p&gt;If you're getting the &lt;strong&gt;&amp;quot;fatal error: libxml/xmlversion.h: No such file or directory&amp;quot;&lt;/strong&gt; error, just install the following development files:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install python-dev libxml2-dev libxslt1-dev
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="problems-with-matplotlib-and-freetype"&gt;
&lt;h2&gt;Problems with 'matplotlib' and freetype.&lt;/h2&gt;
&lt;p&gt;If you're having problems installing matplotlib in a Python virtualenv, and are getting the &lt;em&gt;'freetype missing'&lt;/em&gt; error, you sould install the development files for freetype, and (in most cases) rebuild the python dependencies for matplotlib.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get  -u install libfreetype6-dev
$ sudo apt-get build-dep python-matplotlib
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;After that, you can just use pip normally to install matplotlib&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install matplotlib
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;PS. I know of cases where you have to update &lt;em&gt;python-virtualenv&lt;/em&gt; and &lt;em&gt;python-pip&lt;/em&gt; after you use build-dep. Just apt-get upgrade your installation.
Today I learned about the 'pydoc' command from Python.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problems-with-locale"&gt;
&lt;h2&gt;Problems with locale&lt;/h2&gt;
&lt;p&gt;In some machines I've found problems when setting locales from Python.  First check the results of running&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ locale
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;In my case is:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssnv"&gt;LANG&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;es_VE.UTF-8
&lt;span class="pgcssnv"&gt;LANGUAGE&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;es_VE:es
&lt;span class="pgcssnv"&gt;LC_CTYPE&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_NUMERIC&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_TIME&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_COLLATE&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_MONETARY&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_MESSAGES&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_PAPER&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_NAME&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_ADDRESS&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_TELEPHONE&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_MEASUREMENT&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_IDENTIFICATION&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;&lt;span class="pgcsss2"&gt;&amp;quot;es_VE.UTF-8&amp;quot;&lt;/span&gt;
&lt;span class="pgcssnv"&gt;LC_ALL&lt;/span&gt;&lt;span class="pgcsso"&gt;=&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Then use:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;locale&lt;/span&gt;

&lt;span class="pgcssk"&gt;try&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
    &lt;span class="pgcssn"&gt;locale&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;setlocale&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;locale&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;LC_ALL&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;es_VE.utf-8&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;span class="pgcssk"&gt;except&lt;/span&gt; &lt;span class="pgcssn"&gt;locale&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;Error&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
    &lt;span class="pgcssk"&gt;raise&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Change es_VE.UTF-8 for yours.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="creating-postgresql-roles"&gt;
&lt;h2&gt;Creating postgresql roles&lt;/h2&gt;
&lt;p&gt;This one is not just for Debian based systems, but for PostgreSQL, giving privileges to a specific user in your Database Server is really simple:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;CREATE USER user_name WITH PASSWORD &lt;span class="pgcsss1"&gt;&amp;#39;userpasswd&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;;&lt;/span&gt;

CREATE DATABASE new_database&lt;span class="pgcssp"&gt;;&lt;/span&gt;

GRANT ALL PRIVILEGES ON DATABASE new_database to user_name&lt;span class="pgcssp"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="local-dependencies-for-scipy"&gt;
&lt;h2&gt;Local dependencies for scipy&lt;/h2&gt;
&lt;p&gt;Before you're able to build &lt;cite&gt;scipy&lt;/cite&gt; using &lt;cite&gt;pip install&lt;/cite&gt;, you'll need to have some dependencies installed.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get -u install libatlas-base-dev libatlas-dev liblapack-dev libblas-dev
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;You'll also need a Fortran compiler installed.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get -u install gfortran
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
</content><category term="programming"></category><category term="debian"></category><category term="help"></category><category term="documentation"></category><category term="libraries"></category><category term="pil"></category><category term="libjpeg"></category><category term="locale"></category><category term="matplotlib"></category><category term="libxml"></category><category term="ubuntu"></category><category term="freetype"></category><category term="postgresql"></category><category term="database"></category><category term="scipy"></category></entry><entry><title>A Simple Django Project Layout</title><link href="https://www.jackboot7.com/simply-django-project-layout.html" rel="alternate"></link><published>2012-03-12T10:00:00-05:30</published><updated>2014-12-12T13:30:00-05:30</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2012-03-12:/simply-django-project-layout.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; This article was originally written when Django version was 1.4. Since this article was published I made changes based on the new features of Django. You can see some of them in this repository: &lt;a class="reference external" href="https://github.com/jackboot7/django-project-template"&gt;https://github.com/jackboot7/django-project-template.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is short entry on how I organize my Django projects, in a way that will be easy to deploy to a production server. This is not meant to be a full tutorial on Django, but just to document the way I layout my Django applications. I consider this layout a work in progress, as each day I learn something new that I can integrate into my project's layout. Anyway, I hope someone else can find this entry useful.&lt;/p&gt;
&lt;p&gt;For most of my small/pet/side projects, I use a simple server schema, working only with a local development machine and a production server, I know that is a good practice to use a staging server with the same setup as the production server, but for small projects I found this unnecessary.&lt;/p&gt;
&lt;div class="section" id="project-layout"&gt;
&lt;h2&gt;Project Layout&lt;/h2&gt;
&lt;p&gt;First, let me show you the layout of most of my projects:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssp"&gt;|&lt;/span&gt; - project_domain_name/
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - .gitignore &lt;span class="pgcsso"&gt;(&lt;/span&gt;.hgignore &lt;span class="pgcsso"&gt;)&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - requirements.pip
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - env/                       &lt;span class="pgcssc1"&gt;# Virtual enviroment.&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - var/
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - server_config/             &lt;span class="pgcssc1"&gt;# Server configuration files.&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - nginx.conf
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - uwsgi.ini
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - server_logs/               &lt;span class="pgcssc1"&gt;# Server logs.&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - errors.log
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - access.log
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - project_dir/               &lt;span class="pgcssc1"&gt;# Django project. Most of the time I name it &amp;#39;webapp&amp;#39;&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - apps/                    &lt;span class="pgcssc1"&gt;# Application apps.&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - templates/
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - static/
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - manage.py
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - urls.py
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - settings.py
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - local_settings.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="ignored-files"&gt;
&lt;h2&gt;Ignored files&lt;/h2&gt;
&lt;p&gt;Some of this files and dirs are meant to be ignored by the control version system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*local_settings.py*&lt;/strong&gt;, for every local development machine, there should be a local settings file, this is where you put all the local development settings such as …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; This article was originally written when Django version was 1.4. Since this article was published I made changes based on the new features of Django. You can see some of them in this repository: &lt;a class="reference external" href="https://github.com/jackboot7/django-project-template"&gt;https://github.com/jackboot7/django-project-template.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is short entry on how I organize my Django projects, in a way that will be easy to deploy to a production server. This is not meant to be a full tutorial on Django, but just to document the way I layout my Django applications. I consider this layout a work in progress, as each day I learn something new that I can integrate into my project's layout. Anyway, I hope someone else can find this entry useful.&lt;/p&gt;
&lt;p&gt;For most of my small/pet/side projects, I use a simple server schema, working only with a local development machine and a production server, I know that is a good practice to use a staging server with the same setup as the production server, but for small projects I found this unnecessary.&lt;/p&gt;
&lt;div class="section" id="project-layout"&gt;
&lt;h2&gt;Project Layout&lt;/h2&gt;
&lt;p&gt;First, let me show you the layout of most of my projects:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssp"&gt;|&lt;/span&gt; - project_domain_name/
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - .gitignore &lt;span class="pgcsso"&gt;(&lt;/span&gt;.hgignore &lt;span class="pgcsso"&gt;)&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - requirements.pip
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - env/                       &lt;span class="pgcssc1"&gt;# Virtual enviroment.&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - var/
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - server_config/             &lt;span class="pgcssc1"&gt;# Server configuration files.&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - nginx.conf
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - uwsgi.ini
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - server_logs/               &lt;span class="pgcssc1"&gt;# Server logs.&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - errors.log
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - access.log
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - project_dir/               &lt;span class="pgcssc1"&gt;# Django project. Most of the time I name it &amp;#39;webapp&amp;#39;&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - apps/                    &lt;span class="pgcssc1"&gt;# Application apps.&lt;/span&gt;
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - templates/
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - static/
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - manage.py
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - urls.py
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - settings.py
&lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; &lt;span class="pgcssp"&gt;|&lt;/span&gt; - local_settings.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="ignored-files"&gt;
&lt;h2&gt;Ignored files&lt;/h2&gt;
&lt;p&gt;Some of this files and dirs are meant to be ignored by the control version system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*local_settings.py*&lt;/strong&gt;, for every local development machine, there should be a local settings file, this is where you put all the local development settings such as database config, or additional apps such as south or django-extensions.&lt;/p&gt;
&lt;p&gt;I use &lt;strong&gt;*env/*&lt;/strong&gt; as a directory to install the virtual enviroment, in case you're using virtualenvwrapper you won't need to have this in your project directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*var/*&lt;/strong&gt; is a place to put everything related to the project in runtime, such as sqlite database files, or generated files from compass or coffeescript. Just like the local settings, this directory its supposed to be different for every local development machine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="settings-and-local-settings"&gt;
&lt;h2&gt;Settings and Local Settings&lt;/h2&gt;
&lt;p&gt;As you can see, I use two separate settings files, that way I can keep my production settings on my version control repository, and do daily work with the local settings of my development machine.&lt;/p&gt;
&lt;p&gt;At the end of the settings.py file I import the local_settings module, in which I overwrite or add any specific setting that differ from the production one.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssk"&gt;try&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
    &lt;span class="pgcsskn"&gt;from&lt;/span&gt; &lt;span class="pgcssnn"&gt;local_settings&lt;/span&gt; &lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcsso"&gt;*&lt;/span&gt;
&lt;span class="pgcssk"&gt;except&lt;/span&gt; &lt;span class="pgcssne"&gt;ImportError&lt;/span&gt;&lt;span class="pgcssp"&gt;:&lt;/span&gt;
        &lt;span class="pgcssk"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;This way the deployment process is easier from the application's setup point of view.&lt;/p&gt;
&lt;div class="section" id="paths"&gt;
&lt;h3&gt;Paths&lt;/h3&gt;
&lt;p&gt;The paths on my settings' file are defined using the os module. Even if this isn't the standard way to define paths, I find this useful as it makes easier to work with a project in different machines (local and production, more than one developer on the same project).&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcsskn"&gt;import&lt;/span&gt; &lt;span class="pgcssnn"&gt;os&lt;/span&gt;

&lt;span class="pgcssn"&gt;SITE_ROOT&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;path&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;dirname&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;path&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;realpath&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssvm"&gt;__file__&lt;/span&gt;&lt;span class="pgcssp"&gt;))&lt;/span&gt;
&lt;span class="pgcssn"&gt;PROJECT_DIR&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;path&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;split&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;SITE_ROOT&lt;/span&gt;&lt;span class="pgcssp"&gt;)[&lt;/span&gt;&lt;span class="pgcssmi"&gt;0&lt;/span&gt;&lt;span class="pgcssp"&gt;]&lt;/span&gt;
&lt;span class="pgcssn"&gt;VAR_ROOT&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;path&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;join&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;PROJECT_DIR&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;var&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;

&lt;span class="pgcssk"&gt;if&lt;/span&gt; &lt;span class="pgcssow"&gt;not&lt;/span&gt; &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;path&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;exists&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;VAR_ROOT&lt;/span&gt;&lt;span class="pgcssp"&gt;):&lt;/span&gt;
    &lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;mkdir&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;VAR_ROOT&lt;/span&gt;&lt;span class="pgcssp"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;If we add this on the top of the setting file, we can later use these names to define standard variables such as &lt;strong&gt;*TEMPLATE_DIRS*&lt;/strong&gt; or &lt;strong&gt;*STATICFILES_DIR*&lt;/strong&gt;, like this:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="pgcssn"&gt;STATICFILES_DIRS&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;path&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;join&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;SITE_ROOT&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;static&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;),)&lt;/span&gt;
&lt;span class="pgcssn"&gt;TEMPLATE_DIRS&lt;/span&gt; &lt;span class="pgcsso"&gt;=&lt;/span&gt; &lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;os&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;path&lt;/span&gt;&lt;span class="pgcsso"&gt;.&lt;/span&gt;&lt;span class="pgcssn"&gt;join&lt;/span&gt;&lt;span class="pgcssp"&gt;(&lt;/span&gt;&lt;span class="pgcssn"&gt;SITE_ROOT&lt;/span&gt;&lt;span class="pgcssp"&gt;,&lt;/span&gt; &lt;span class="pgcsss1"&gt;&amp;#39;templates&amp;#39;&lt;/span&gt;&lt;span class="pgcssp"&gt;),)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;And so on with every absolute path that I have to define in my settings file.&lt;/p&gt;
&lt;p&gt;This is a very simple layout for Django projects, but I've found that as simple as it is, it's still very powerful. In my github you can find a sample of this layout, feel free to fork it and improve it!&lt;/p&gt;
&lt;p&gt;I always find interesting how other people have different standards and use different techniques to setup their own projects, that's why I really like to recommend Django Sites, which is a repository of django-based sites along with source code.&lt;/p&gt;
&lt;p&gt;How do you layout your Django applications? Do you have any recommendation?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="programming"></category><category term="django"></category><category term="documentation"></category><category term="layout"></category><category term="projects"></category><category term="python"></category><category term="settings"></category><category term="simple"></category></entry><entry><title>Python Audio Tools</title><link href="https://www.jackboot7.com/python-audio-tools.html" rel="alternate"></link><published>2012-02-15T11:04:00-05:30</published><updated>2014-12-12T13:30:00-05:30</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2012-02-15:/python-audio-tools.html</id><content type="html">&lt;p&gt;Some days ago, I started to work on a web application that requires to encode audio wave files (.wav) into three other formats, being: MP3, Flac and M4A. That encoding will run in its own Celery task.&lt;/p&gt;
&lt;p&gt;One thing I knew for certain is that I wouldn't be running commands such as lame or flac directly.&lt;/p&gt;
&lt;p&gt;Since the project is being written in Python, I though it would be nice to use a library to do all the encoding directly in Python code, without calling any external program..&lt;/p&gt;
&lt;p&gt;If you're going to write an audio related application in Python, I recommend a visit to the &lt;a class="reference external" href="http://wiki.python.org/moin/Audio"&gt;audio section&lt;/a&gt; in the Python wiki, where you can find all the audio related modules that are available for Python.&lt;/p&gt;
&lt;p&gt;I decided to use the API from &lt;a class="reference external" href="http://audiotools.sourceforge.net/"&gt;Python Audio Tools&lt;/a&gt;, which is a very complete library to do audio manipulation. In the backend, it uses lame, flac and other commands to do the enconding of the files, but I won't have to run those commands directly.&lt;/p&gt;
&lt;p&gt;So far, I'm very happy with the results I've got using audiotools, since it deals with metadata for the audio files (ID3v2 tagging, et al.) and it can even embed artwork into the files (if the format support such metadata).&lt;/p&gt;
&lt;p&gt;I wrote a small Python script to show a basic use of this library, if you want, you can check it out on &lt;a class="reference external" href="https://github.com/jackboot7/python-audiotools-test"&gt;my githhub repo&lt;/a&gt;. I'll be adding a little more functionality to it as soon as I got some free time.&lt;/p&gt;
</content><category term="programming"></category><category term="api"></category><category term="audio"></category><category term="audiotools"></category><category term="code"></category><category term="conversion"></category><category term="convert"></category><category term="encoding"></category><category term="example"></category><category term="flac"></category><category term="lame"></category><category term="m4a"></category><category term="mp3"></category><category term="programming"></category><category term="python"></category></entry><entry><title>(Local) Online Python Documentation</title><link href="https://www.jackboot7.com/pydoc.html" rel="alternate"></link><published>2010-10-15T11:38:00-05:30</published><updated>2015-12-09T11:12:00-05:30</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2010-10-15:/pydoc.html</id><content type="html">&lt;p&gt;Today I learned about the &lt;cite&gt;pydoc&lt;/cite&gt; command from Python. Even if you're offline you can access the standard library documentation running from a local copy using the command mentioned above.&lt;/p&gt;
&lt;p&gt;Simply introduce this command in your terminal:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pydoc -p &lt;span class="pgcssm"&gt;8000&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Then you can go to &lt;a class="reference external" href="http://localhost:8000"&gt;http://locahost:8000&lt;/a&gt;. This way you can browse the documentation for all your installed Python modules in the same way you'd use the 'help' command from the Python CLI.&lt;/p&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="http://docs.python.org/library/pydoc.html"&gt;http://docs.python.org/library/pydoc.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] &lt;a class="reference external" href="http://pydoc.org/"&gt;http://pydoc.org/&lt;/a&gt;&lt;/p&gt;
</content><category term="programming"></category><category term="python"></category><category term="help"></category><category term="documentation"></category></entry><entry><title>Documentación de Python en línea (Local)</title><link href="https://www.jackboot7.com/pydoc-es.html" rel="alternate"></link><published>2010-10-15T11:38:00-05:30</published><updated>2015-12-09T11:12:00-05:30</updated><author><name>Luis Alberto Santana</name></author><id>tag:www.jackboot7.com,2010-10-15:/pydoc-es.html</id><content type="html">&lt;p&gt;Hoy aprendí sobre el comando &lt;cite&gt;pydoc&lt;/cite&gt; de Python. Incluso estando fuera de línea, puedes tener acceso a toda la documentación de la biblioteca estándar de Python a partir de una copia local.&lt;/p&gt;
&lt;p&gt;Para usarlo, simplemente debes ejecutar el comando en tu terminal:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pydoc -p &lt;span class="pgcssm"&gt;8000&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Entonces podrás ir a &lt;a class="reference external" href="http://localhost:8000"&gt;http://locahost:8000&lt;/a&gt;  y navegar la documentación de todos los módulos instalados localmente  del mismo modo que lo harías usando la función &lt;cite&gt;help&lt;/cite&gt; del intérprete de Python.&lt;/p&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="http://docs.python.org/library/pydoc.html"&gt;http://docs.python.org/library/pydoc.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] &lt;a class="reference external" href="http://pydoc.org/"&gt;http://pydoc.org/&lt;/a&gt;&lt;/p&gt;
</content><category term="programming"></category><category term="python"></category><category term="help"></category><category term="documentation"></category></entry></feed>