<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>La maruja digital</title><link>http://pierdelacabeza.com/maruja/</link><description>Las recetas de mi vida electrónica</description><atom:link href="http://pierdelacabeza.com/maruja/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Tue, 17 Mar 2026 23:42:40 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Comparing permissions in two Google Cloud IAM roles</title><link>http://pierdelacabeza.com/maruja/posts/comparing-permissions-in-two-google-cloud-iam-roles/</link><dc:creator>Andor</dc:creator><description>&lt;p&gt;Sometimes you have to compare two Google Cloud IAM roles, and if they have lots of permissions assigned, it can be difficult (or tedious) to find the differences.&lt;/p&gt;
&lt;p&gt;We can do it super quick and obvious thanks to the semantic diff used by our friend &lt;a href="https://github.com/homeport/dyff"&gt;dyff&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We'll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;gcloud&lt;/code&gt; CLI tool (configured and logged in, of course)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/homeport/dyff"&gt;dyff&lt;/a&gt; (you can do it with &lt;code&gt;diff&lt;/code&gt; but it's uglier)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;SOURCE_ROLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'roles/dataproc.admin'&lt;/span&gt;
&lt;span class="nv"&gt;DESTINATION_ROLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'roles/dataproc.editor'&lt;/span&gt;
dyff&lt;span class="w"&gt; &lt;/span&gt;between&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;gcloud&lt;span class="w"&gt; &lt;/span&gt;iam&lt;span class="w"&gt; &lt;/span&gt;roles&lt;span class="w"&gt; &lt;/span&gt;describe&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SOURCE_ROLE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--format&lt;span class="o"&gt;=&lt;/span&gt;yaml&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;gcloud&lt;span class="w"&gt; &lt;/span&gt;iam&lt;span class="w"&gt; &lt;/span&gt;roles&lt;span class="w"&gt; &lt;/span&gt;describe&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DESTINATION_ROLE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--format&lt;span class="o"&gt;=&lt;/span&gt;yaml&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That will give us this output (but in pretty highlighted colors) in our terminal:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;     _        __  __
   &lt;span class="ge"&gt;_| |_&lt;/span&gt;   &lt;span class="ge"&gt;_ / _&lt;/span&gt;|/ &lt;span class="ge"&gt;_|  between /dev/fd/13&lt;/span&gt;
&lt;span class="ge"&gt; / _&lt;/span&gt;' | | | | |_| |_       and /dev/fd/14
| (_| | |_| |  &lt;span class="ge"&gt;_|  _&lt;/span&gt;|
 \__,_|\__, |_| |_|   returned four differences
        |___/

description
  ± value change
    &lt;span class="k"&gt;-&lt;/span&gt; Full control of Dataproc resources.
    + Full control of Dataproc resources. Allows viewing all networks.

includedPermissions
  &lt;span class="k"&gt;-&lt;/span&gt; ten list entries removed:
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.autoscalingPolicies.getIamPolicy
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.autoscalingPolicies.setIamPolicy
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.clusters.getIamPolicy
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.clusters.setIamPolicy
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.jobs.getIamPolicy
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.jobs.setIamPolicy
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.operations.getIamPolicy
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.operations.setIamPolicy
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.workflowTemplates.getIamPolicy
    &lt;span class="k"&gt;-&lt;/span&gt; dataproc.workflowTemplates.setIamPolicy

name
  ± value change
    &lt;span class="k"&gt;-&lt;/span&gt; roles/dataproc.admin
    + roles/dataproc.editor

title
  ± value change
    &lt;span class="k"&gt;-&lt;/span&gt; Dataproc Administrator
    + Dataproc Editor
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We could use different options like &lt;code&gt;-b&lt;/code&gt; to remove the fancy dyff header, or &lt;code&gt;-o&lt;/code&gt; to change the format, for example to GitHub diff, and get syntax highlighting in some places:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;dyff&lt;span class="w"&gt; &lt;/span&gt;between&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;github&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;gcloud&lt;span class="w"&gt; &lt;/span&gt;iam&lt;span class="w"&gt; &lt;/span&gt;roles&lt;span class="w"&gt; &lt;/span&gt;describe&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SOURCE_ROLE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--format&lt;span class="o"&gt;=&lt;/span&gt;yaml&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;gcloud&lt;span class="w"&gt; &lt;/span&gt;iam&lt;span class="w"&gt; &lt;/span&gt;roles&lt;span class="w"&gt; &lt;/span&gt;describe&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DESTINATION_ROLE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--format&lt;span class="o"&gt;=&lt;/span&gt;yaml&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Output:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;SOURCE_ROLE='roles/dataproc.admin'
DESTINATION_ROLE='roles/dataproc.editor'
&lt;span class="gu"&gt;@@ description @@&lt;/span&gt;
&lt;span class="gs"&gt;! ± value change&lt;/span&gt;
&lt;span class="gd"&gt;- Full control of Dataproc resources.&lt;/span&gt;
&lt;span class="gi"&gt;+ Full control of Dataproc resources. Allows viewing all networks.&lt;/span&gt;

&lt;span class="gu"&gt;@@ includedPermissions @@&lt;/span&gt;
&lt;span class="gs"&gt;! - ten list entries removed:&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.autoscalingPolicies.getIamPolicy&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.autoscalingPolicies.setIamPolicy&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.clusters.getIamPolicy&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.clusters.setIamPolicy&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.jobs.getIamPolicy&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.jobs.setIamPolicy&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.operations.getIamPolicy&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.operations.setIamPolicy&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.workflowTemplates.getIamPolicy&lt;/span&gt;
&lt;span class="gd"&gt;- - dataproc.workflowTemplates.setIamPolicy&lt;/span&gt;

&lt;span class="gu"&gt;@@ name @@&lt;/span&gt;
&lt;span class="gs"&gt;! ± value change&lt;/span&gt;
&lt;span class="gd"&gt;- roles/dataproc.admin&lt;/span&gt;
&lt;span class="gi"&gt;+ roles/dataproc.editor&lt;/span&gt;

&lt;span class="gu"&gt;@@ title @@&lt;/span&gt;
&lt;span class="gs"&gt;! ± value change&lt;/span&gt;
&lt;span class="gd"&gt;- Dataproc Administrator&lt;/span&gt;
&lt;span class="gi"&gt;+ Dataproc Editor&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Check the options for more fun:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;dyff&lt;span class="w"&gt; &lt;/span&gt;between&lt;span class="w"&gt; &lt;/span&gt;--help
&lt;/pre&gt;&lt;/div&gt;</description><category>google cloud</category><category>iam</category><guid>http://pierdelacabeza.com/maruja/posts/comparing-permissions-in-two-google-cloud-iam-roles/</guid><pubDate>Wed, 14 Jan 2026 11:45:20 GMT</pubDate></item><item><title>Android private DNS in Hisense (and other) phones with adb</title><link>http://pierdelacabeza.com/maruja/posts/android-private-dns-in-hisense-and-other-phones-with-adb/</link><dc:creator>Andor</dc:creator><description>&lt;p&gt;I got a new Hisense A5 phone (pretty interesting, it has an eInk screen), but it has a lot of extra apps that seem to track and phone home, contacting to &lt;cite&gt;qq&lt;/cite&gt;, &lt;cite&gt;taobao&lt;/cite&gt; or &lt;cite&gt;baidu&lt;/cite&gt; domains.&lt;/p&gt;
&lt;p&gt;I disabled a bunch of them, but I still saw some connections, so I decided to kill two birds with one stone, and set fixed DNS servers to NextDNS and filter all tracking and unwanted domains.&lt;/p&gt;
&lt;p&gt;Since Android 9 you can set a global "Private DNS" (DNS-over-TLS) to force DNS requests to go there, but I've found Hisense removed that option from their ROM (that seems to be called Vision). I don't know if I should be paranoid and think about China government intervention, or it's just the company trying to force you into their tracking and ads, but I wanted to change that option.&lt;/p&gt;
&lt;p&gt;But seems that, although that option is not visible, it's still in the underlying Android system, so you can set it up with adb, even without root.&lt;/p&gt;
&lt;p&gt;To do that, first get your phone ready to use adb:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Enable developer mode (Normally you would click several times in "Kernel Version" in your "About phone" section in settings)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable USB debug in your phone (In a newly activated "Developer options" menu around your settings)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect to your computer through a usb cable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install &lt;cite&gt;adb&lt;/cite&gt;, i.e. with the Debian package of the same name ;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run &lt;cite&gt;adb devices&lt;/cite&gt; to verify you can connect to your device, and check your phone for confirmation dialogs&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, to set the dns, for example, with Cloudflare's DNS over TLS, run this two commands:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_5fe127f162574f639b0f9d5151cb36b6-1" name="rest_code_5fe127f162574f639b0f9d5151cb36b6-1" href="http://pierdelacabeza.com/maruja/posts/android-private-dns-in-hisense-and-other-phones-with-adb/#rest_code_5fe127f162574f639b0f9d5151cb36b6-1"&gt;&lt;/a&gt;adb shell settings put global private_dns_mode hostname
&lt;a id="rest_code_5fe127f162574f639b0f9d5151cb36b6-2" name="rest_code_5fe127f162574f639b0f9d5151cb36b6-2" href="http://pierdelacabeza.com/maruja/posts/android-private-dns-in-hisense-and-other-phones-with-adb/#rest_code_5fe127f162574f639b0f9d5151cb36b6-2"&gt;&lt;/a&gt;adb shell settings put global private_dns_specifier cloudflare-dns.com
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To disable:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_6f4f9ebdd243456a9db450f00f9dfada-1" name="rest_code_6f4f9ebdd243456a9db450f00f9dfada-1" href="http://pierdelacabeza.com/maruja/posts/android-private-dns-in-hisense-and-other-phones-with-adb/#rest_code_6f4f9ebdd243456a9db450f00f9dfada-1"&gt;&lt;/a&gt;adb shell settings put global private_dns_mode off
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In my case, I use NextDNS with a custom configuration, and instead of &lt;cite&gt;cloudflare-dns.com&lt;/cite&gt; I use something like &lt;cite&gt;xxxxx.dns.nextdns.io&lt;/cite&gt;.&lt;/p&gt;</description><category>android</category><category>dns</category><category>hisense</category><guid>http://pierdelacabeza.com/maruja/posts/android-private-dns-in-hisense-and-other-phones-with-adb/</guid><pubDate>Thu, 07 Oct 2021 20:07:31 GMT</pubDate></item><item><title>Locating packages installed with apt in your bash history</title><link>http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/</link><dc:creator>Andor</dc:creator><description>&lt;p&gt;So, I'm backing up my computer for reinstall, and I need a list of what packages I've installed so I can install them again.&lt;/p&gt;
&lt;p&gt;I could do it dumping &lt;cite&gt;dpkg --get-selections&lt;/cite&gt;, but I don't want to mess with packages status (installed, uninstalled, pending), and just reinstall exactly the pacakges I installed manually.&lt;/p&gt;
&lt;p&gt;So, I need:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Listing all packages I've installed with apt or apt-get on my history&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cutting all the junk and leaving only the name of the packages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: Finding if those packages are still installed. Maybe I uninstalled them later!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;WARNING&lt;/strong&gt;: This is a quick and dirty recipe, take a look and test the individual commands before using it!&lt;/p&gt;
&lt;p&gt;So this is the recipe I used:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code bash"&gt;&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-1" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-1" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;history&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-2" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-2" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"apt install|apt-get install"&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-3" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-3" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-4" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-4" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;tr&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-5" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-5" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;-&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-6" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-6" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;tr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\n"&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-7" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-7" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;sort&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-8" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-8" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;uniq&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-9" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-9" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-9"&gt;&lt;/a&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-10" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-10" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-10"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-11" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-11" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-12" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-12" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-13" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-13" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-13"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;a id="rest_code_a43e4734511b4dcba81486cfdba28d8d-14" name="rest_code_a43e4734511b4dcba81486cfdba28d8d-14" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_a43e4734511b4dcba81486cfdba28d8d-14"&gt;&lt;/a&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You might need to modify the &lt;cite&gt;-f 5-&lt;/cite&gt; to &lt;cite&gt;-f 6-&lt;/cite&gt; if you use &lt;cite&gt;sudo&lt;/cite&gt; to install.&lt;/p&gt;
&lt;p&gt;You can pipe that into a file and then reinstall like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code bash"&gt;&lt;a id="rest_code_773a380c9ff94f64b9cd2c1c42ae6011-1" name="rest_code_773a380c9ff94f64b9cd2c1c42ae6011-1" href="http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/#rest_code_773a380c9ff94f64b9cd2c1c42ae6011-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;packages.txt&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And add that output to an &lt;cite&gt;apt install&lt;/cite&gt; command.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;</description><category>bash apt debian</category><guid>http://pierdelacabeza.com/maruja/posts/locating-packages-installed-with-apt-in-your-bash-history/</guid><pubDate>Wed, 07 Aug 2019 13:45:04 GMT</pubDate></item><item><title>MySQL / MariaDB: Creating new UTF database</title><link>http://pierdelacabeza.com/maruja/posts/mysql-mariadb-creating-new-utf-database/</link><dc:creator>Andor</dc:creator><description>&lt;p&gt;So, as I never remember how to create a proper UTF8 database in MySQL/MariaDB, one that won't have any problem with unicode and emojis, I'll leave it here for the future:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code MySQL"&gt;&lt;a id="rest_code_c1ada73ef02d4a3ab10c15c2efcc4196-1" name="rest_code_c1ada73ef02d4a3ab10c15c2efcc4196-1" href="http://pierdelacabeza.com/maruja/posts/mysql-mariadb-creating-new-utf-database/#rest_code_c1ada73ef02d4a3ab10c15c2efcc4196-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DATABASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;CHARACTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;utf8mb4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;COLLATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;utf8mb4_unicode_ci&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><category>mysql</category><guid>http://pierdelacabeza.com/maruja/posts/mysql-mariadb-creating-new-utf-database/</guid><pubDate>Mon, 29 Jul 2019 19:54:50 GMT</pubDate></item><item><title>Duplicating/cloning an arduino chip using an "Arduino as ISP" and avrdude</title><link>http://pierdelacabeza.com/maruja/posts/duplicatingcloning-an-arduino-chip-using-an-arduino-as-isp-and-avrdude/</link><dc:creator>Andor</dc:creator><description>&lt;p&gt;So today I had to write several ATtiny85 with a small silly program I wrote years ago to control LED lighting via PWN, but the source was nowhere to be found.
I could rewrite it in an afternoon, but my arduino is kind of rusty so I decided to clone an already written ATtiny85 I had around using my &lt;a class="reference external" href="https://www.tindie.com/products/CT3/arduino-as-isp-shield-atmega3281284-attiny85/"&gt;Arduino as ISP bought from CT3&lt;/a&gt; I used for projects that didn't need a full arduino board.&lt;/p&gt;
&lt;p&gt;Requirements:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;An Arduino as ISP board (not necessarily the one I use)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;avrdude installed&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of the actions you'll run might need root permission if you've not configured serial access for your user, or if you have a newer kernel that controls access to &lt;code class="docutils literal"&gt;dmesg&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;First, I connect my Arduino as ISP and check the port it's been assigned:&lt;/p&gt;
&lt;pre class="literal-block"&gt;~# dmesg|tail -n 10
[  179.219531] usb 2-3.4: reset high-speed USB device number 6 using xhci_hcd
[ 4137.875481] usb 9-4: new full-speed USB device number 2 using ohci-pci
[ 4138.064654] usb 9-4: New USB device found, idVendor=2a03, idProduct=0043
[ 4138.064661] usb 9-4: New USB device strings: Mfr=1, Product=2, SerialNumber=220
[ 4138.064665] usb 9-4: Product: Arduino Uno
[ 4138.064669] usb 9-4: Manufacturer: Arduino Srl
[ 4138.064673] usb 9-4: SerialNumber: 85439303333351E02292
[ 4138.102738] cdc_acm 9-4:1.0: ttyACM0: USB ACM device
[ 4138.103861] usbcore: registered new interface driver cdc_acm
[ 4138.103865] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters&lt;/pre&gt;
&lt;p&gt;So, &lt;code class="docutils literal"&gt;ttyACM0&lt;/code&gt;, fine!&lt;/p&gt;
&lt;p&gt;Then, we put the chip we wanna read on our ISP and read it with &lt;code class="docutils literal"&gt;avrdude&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;~# avrdude -p t85 -P /dev/ttyACM0 -c avrisp -b 19200 -U flash:r:flash.bin:r
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
avrdude: Device signature = 0x1e930b (probably t85)
avrdude: reading flash memory:
Reading | ################################################## | 100% 5.89s
avrdude: writing output file "flash.bin"
avrdude: safemode: Fuses OK (E:FF, H:DF, L:62)
avrdude done.  Thank you.&lt;/pre&gt;
&lt;p&gt;Sounds about right! We've read the chip and written its contents to &lt;code class="docutils literal"&gt;flash.bin&lt;/code&gt;. Let's swap the chip for the new empty one and write it:&lt;/p&gt;
&lt;pre class="literal-block"&gt;~# avrdude -p t85 -P /dev/ttyACM0 -c avrisp -b 19200 -U flash:w:flash.bin
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
avrdude: Device signature = 0x1e930b (probably t85)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
         avrdude: erasing chip
         avrdude: reading input file "flash.bin"
         avrdude: input file flash.bin auto detected as raw binary
         avrdude: writing flash (1280 bytes):
         Writing | ################################################## | 100% 1.83s
         avrdude: 1280 bytes of flash written
         avrdude: verifying flash memory against flash.bin:
         avrdude: load data flash data from input file flash.bin:
         avrdude: input file flash.bin auto detected as raw binary
         avrdude: input file flash.bin contains 1280 bytes
         avrdude: reading on-chip flash data:
         Reading | ################################################## | 100% 0.93s
         avrdude: verifying ...
         avrdude: 1280 bytes of flash verified
         avrdude: safemode: Fuses OK (E:FF, H:DF, L:62)
         avrdude done.  Thank you.&lt;/pre&gt;
&lt;p&gt;Great! You're good to go! :D&lt;/p&gt;</description><category>arduino</category><category>atmega</category><category>attiny</category><category>avrdude</category><guid>http://pierdelacabeza.com/maruja/posts/duplicatingcloning-an-arduino-chip-using-an-arduino-as-isp-and-avrdude/</guid><pubDate>Thu, 29 Mar 2018 12:53:37 GMT</pubDate></item><item><title>Switching to Nikola</title><link>http://pierdelacabeza.com/maruja/posts/switching-to-nikola/</link><dc:creator>Andor</dc:creator><description>&lt;p&gt;So here we are, testing Nikola on nginx. Will it blend?&lt;/p&gt;</description><category>nikola</category><guid>http://pierdelacabeza.com/maruja/posts/switching-to-nikola/</guid><pubDate>Thu, 07 Apr 2016 11:59:18 GMT</pubDate></item><item><title>Flash no ha muerto [ójala]</title><link>http://pierdelacabeza.com/maruja/posts/flash-no-ha-muerto-ojala/</link><dc:creator>Andor</dc:creator><description>&lt;p&gt;No, Flash no ha muerto. Sólo ha cambiado de nombre.&lt;/p&gt;
&lt;p&gt;Ya he visto unas cuantas veces publicado hoy que Flash ha muerto, especialmente en ‘redes de blogs’, esos espacios de escritura a destajo y falta de información contrastada. Ya me gustaría que se acabara con Flash, siendo &lt;a class="reference external" href="https://heimdalsecurity.com/blog/java-biggest-security-hole-your-computer/"&gt;uno de los problemas de seguridad&lt;/a&gt; &lt;a class="reference external" href="https://heimdalsecurity.com/blog/adobe-flash-vulnerabilities-security-risks/"&gt;más comunes en los equipos de escritorio&lt;/a&gt;. Mis ordenadores nuevo ya no tienen Flash instalado. Too bad.&lt;/p&gt;
&lt;p&gt;Sí, es cierto que dicen que van a apoyar la pproducción en formato HTML5, pero ni siquiera se han terminado de leer &lt;a class="reference external" href="http://blogs.adobe.com/conversations/2015/11/flash-html5-and-open-web-standards.html"&gt;la breve nota de prensa&lt;/a&gt; que claramente dice “… while continuing to support the creation of Flash content…” “…Flash continues to be used in key categories like web gaming and premium video, where new standards have yet to fully mature…” “…Adobe is committed to working with industry partners,[…], to help ensure the ongoing compatibility and security of Flash content”.&lt;/p&gt;
&lt;p&gt;Algunos &lt;a class="reference external" href="https://thestack.com/world/2015/12/01/adobe-kills-the-flash-name-after-twenty-years/"&gt;se han molestado un poquito más en hacerlo mejor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En fin. Al menos está un poquito más cerca de su defunción. Espero.&lt;/p&gt;</description><guid>http://pierdelacabeza.com/maruja/posts/flash-no-ha-muerto-ojala/</guid><pubDate>Wed, 02 Dec 2015 12:27:49 GMT</pubDate></item><item><title>Waldorf nw1 specs leaked on web</title><link>http://pierdelacabeza.com/maruja/posts/waldorf-nw1-specs-leaked-on-web/</link><dc:creator>Andor</dc:creator><description>&lt;div&gt;&lt;a class="reference external image-reference" href="http://pierdelacabeza.com/maruja/images/nw_1_front.jpg"&gt;
&lt;img alt="/images/nw_1_front.thumbnail.jpg" src="http://pierdelacabeza.com/maruja/images/nw_1_front.thumbnail.jpg"&gt;
&lt;/a&gt;
&lt;p&gt;Today we’ve seen a short video about some of the new releases expected for Waldorf, probably for NAMM 2015. Everybody seemed curious and surprised about the new eurorack module nw1 on video, so I’ve been tinkering around Waldorf web page until I’ve found, hidden, the link with the specs:&lt;/p&gt;
&lt;p&gt;Specifications:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;21st century advanced wavetable engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cyclic wavetable scanning with modulatable position and travel speed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Control of spectral envelope independent of pitch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adjustable periodicity up to noisy reproduction&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Classic Waldorf wavetables included&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrated speech synthesizer for wavetables&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User-recordable wavetables&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://pierdelacabeza.com/maruja/posts/waldorf-nw1-specs-leaked-on-web/"&gt; click to read the rest of the article …&lt;/a&gt; (1 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>eurorack</category><category>music</category><category>waldorf</category><guid>http://pierdelacabeza.com/maruja/posts/waldorf-nw1-specs-leaked-on-web/</guid><pubDate>Tue, 20 Jan 2015 13:15:53 GMT</pubDate></item><item><title>LibreOffice Impress missing sidebar icons on Linux Mint</title><link>http://pierdelacabeza.com/maruja/posts/libreoffice-impress-missing-sidebar-icons-on-linux-mint/</link><dc:creator>Andor</dc:creator><description>&lt;p&gt;I’ve noticed after several Mint updates my sidebar icons on Impress were missing, that is, blank. The fix is super easy, you just need to install the package libreoffice-style-tango:&lt;/p&gt;
&lt;pre class="literal-block"&gt;sudo apt-get install libreoffice-style-tango&lt;/pre&gt;
&lt;p&gt;And that’s all!&lt;/p&gt;
&lt;p&gt;You can check, just to be sure, on the menu Tools/options/View, which style is selected.&lt;/p&gt;
&lt;p&gt;Go!&lt;/p&gt;</description><category>libreoffice</category><category>tango</category><guid>http://pierdelacabeza.com/maruja/posts/libreoffice-impress-missing-sidebar-icons-on-linux-mint/</guid><pubDate>Mon, 03 Nov 2014 13:30:49 GMT</pubDate></item><item><title>Upgrading Proxmox without a subscription</title><link>http://pierdelacabeza.com/maruja/posts/upgrading-proxmox-without-a-subscription/</link><dc:creator>Andor</dc:creator><description>&lt;p&gt;Now, to update Proxmox to the latest versions you need a paid subscription. I don’t mind, it’s a way of supporting their business and they still allow you to download their latest version on an ISO to download.&lt;/p&gt;
&lt;p&gt;The subscription is fairly cheap for a production site and their support, AFAIK, is fast.&lt;/p&gt;
&lt;p&gt;I have paid subscriptions for my production servers, but I have several testing and development ones I don’t need it, but I would like to update, every once in a while, to newer versions without reinstalling. So the answer is easy: update with the Proxmox ISO.&lt;/p&gt;
&lt;p&gt;Backup first!&lt;/p&gt;
&lt;p&gt;– Download the latest Proxmox ISO
– Mount it on the system as a loop fs:&lt;/p&gt;
&lt;pre class="literal-block"&gt;mount proxmox-ve_3.3.iso /mnt -oloop&lt;/pre&gt;
&lt;p&gt;– Edit your &lt;code class="docutils literal"&gt;/etc/apt/sources.list&lt;/code&gt; and add this line:&lt;/p&gt;
&lt;pre class="literal-block"&gt;deb file:///mnt squeeze pve&lt;/pre&gt;
&lt;p&gt;– Update your apt:&lt;/p&gt;
&lt;pre class="literal-block"&gt;apt-get update&lt;/pre&gt;
&lt;p&gt;– Do dist-upgrade:&lt;/p&gt;
&lt;pre class="literal-block"&gt;apt-get dist-upgrade&lt;/pre&gt;
&lt;p&gt;– Comment the line you added on &lt;code class="docutils literal"&gt;/etc/apt/sources.list&lt;/code&gt;, reboot, and you’re good to go!&lt;/p&gt;</description><category>debian</category><category>linux</category><category>proxmox</category><category>vm</category><guid>http://pierdelacabeza.com/maruja/posts/upgrading-proxmox-without-a-subscription/</guid><pubDate>Wed, 08 Oct 2014 13:35:34 GMT</pubDate></item></channel></rss>