<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: ihucos</title>
    <description>The latest articles on Forem by ihucos (@ihucos).</description>
    <link>https://forem.com/ihucos</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F395118%2F6cb78bd8-38c1-4e87-9dfe-ff1235572539.png</url>
      <title>Forem: ihucos</title>
      <link>https://forem.com/ihucos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ihucos"/>
    <language>en</language>
    <item>
      <title>Tailwind CSS is pretty cool</title>
      <dc:creator>ihucos</dc:creator>
      <pubDate>Sat, 18 Jul 2020 08:24:00 +0000</pubDate>
      <link>https://forem.com/ihucos/tailwind-css-is-pretty-cool-7ka</link>
      <guid>https://forem.com/ihucos/tailwind-css-is-pretty-cool-7ka</guid>
      <description>&lt;p&gt;I am a backend developer with usually only limited love for frontend stuff. Bootstrap did make frontend bearable for me - use the column based layout, stick to the components like tables, cards, buttons, etc and you will be OK. I still sometimes spend hours trying to center something and then using the &lt;code&gt;&amp;lt;center&amp;gt;&lt;/code&gt; tag still not understanding why this marvellous tag was deprecacted for some puristic reasons but you don't care because it's just HTML.&lt;/p&gt;

&lt;p&gt;Anyway, that was my background. I did fiddle with raw CSS before but never came too far with that, it was a too step learning curve and I shot myself constantly in the foot. But now, just one week ago, I started using this Tailwind CSS. It's amazing! It is more low level than Bootstrap and you are not stuck to the given compontents. I can do buttons with different styles instead of just choosing from different colors. Yes, you can overwrite things in bootstrap too, but it feels kind of fighting against it. Development with Tailwind CSS is slower than Bootstrap at first, but you are compensated with the freedom of doing things how you actually want them and achieving something that does not cry "I am made with Bootstrap". It also forced me to finally comprehend new things about CSS instead of just hitting against it until it makes what I want. In any case, use it :-). At least I am happy with it and can recommend :-D&lt;/p&gt;

&lt;p&gt;That is the landing page I did: &lt;a href="https://simple-web-analytics.com"&gt;https://simple-web-analytics.com&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My Project is now Open Source</title>
      <dc:creator>ihucos</dc:creator>
      <pubDate>Tue, 30 Jun 2020 14:40:43 +0000</pubDate>
      <link>https://forem.com/ihucos/my-project-is-now-open-source-53ph</link>
      <guid>https://forem.com/ihucos/my-project-is-now-open-source-53ph</guid>
      <description>&lt;p&gt;I am very happy to announce that the Project I have been silently or not so silently mentioning here on dev.to is now Open Source.&lt;/p&gt;

&lt;p&gt;It took some reasoning for me to decide if to publish the Source Code or not and now I feel naked. The License is AGPL, here is the &lt;a href="https://github.com/ihucos/simple-web-analytics.com"&gt;page on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please allow me to make some obligatory advertising statement about the product here and stay with us for one sentence more. &lt;a href="https://simple-web-analytics.com/"&gt;Simple Web Analytics&lt;/a&gt; is a Free web analytics app that just makes what you would expect from such a product and nothing more or less. That was it.&lt;/p&gt;

&lt;p&gt;Thank you for reading and Goodbye :-)&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>news</category>
    </item>
    <item>
      <title>My dev.to listings experience</title>
      <dc:creator>ihucos</dc:creator>
      <pubDate>Wed, 24 Jun 2020 17:48:53 +0000</pubDate>
      <link>https://forem.com/ihucos/my-dev-to-listings-experience-7bl</link>
      <guid>https://forem.com/ihucos/my-dev-to-listings-experience-7bl</guid>
      <description>&lt;p&gt;After writing &lt;a href="https://dev.to/ihucos"&gt;some posts&lt;/a&gt;, dev.to got me 5 credits, which I spend on &lt;a href="https://dev.to/listings/products/free-web-analytics-1c06"&gt;a listing&lt;/a&gt;. Doing a dev.to listings is simple and fast. &lt;/p&gt;

&lt;p&gt;The results so far:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HaONbTXT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6rofu9fo26wyybq8spu9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HaONbTXT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6rofu9fo26wyybq8spu9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So it's definitely not bad to tell about your pet project, find contributors and so on.&lt;/p&gt;

&lt;p&gt;If you have the credits on your profile and don't know about it, go spend that with something :-)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Demystifying Containers
</title>
      <dc:creator>ihucos</dc:creator>
      <pubDate>Tue, 16 Jun 2020 09:44:50 +0000</pubDate>
      <link>https://forem.com/ihucos/demystifying-containers-109n</link>
      <guid>https://forem.com/ihucos/demystifying-containers-109n</guid>
      <description>&lt;p&gt;Container’s consists of the following not too hard to grasp parts.&lt;/p&gt;

&lt;h1&gt;
  
  
  Chroot
&lt;/h1&gt;

&lt;p&gt;You probably know the chroot program, it’s basically a wrapper to the kernel’s &lt;code&gt;chroot&lt;/code&gt; system call, which prepends a given path to all following path related system calls. Or to quote it’s man page: this call changes an ingredient in the pathname resolution process and does nothing else. If called on a root filesystem - that is all files and directories that make up an operating system - the called process and all it’s future child processes will - in simple terms - think they are on a different linux distribution. In practice most containerization platforms will use the slightly more complex &lt;code&gt;pivot_root&lt;/code&gt; call, which follows the same basic concept.&lt;/p&gt;

&lt;h1&gt;
  
  
  Mountpoints
&lt;/h1&gt;

&lt;p&gt;While chroot changes the root filesystem of the calling process, it does nothing about “special” filesystems like &lt;code&gt;/dev&lt;/code&gt; or &lt;code&gt;/proc&lt;/code&gt;. These have to be set up at gusto by the given containerization platform with the mount system call. You probably already used the corresponding wrapper binary. “Volumes” are accomplished with nothing more than a bind mount.&lt;/p&gt;

&lt;h1&gt;
  
  
  Linux namespaces
&lt;/h1&gt;

&lt;p&gt;With chroot and mountpoints we’d already have something usable but it would still not feel like a seperate operating system. Many resources are still coupled between our primitive “container” in progress and the rest of the system. Linux has an interesting concept to solve this called namespaces. Instead of decoupling an entire process at once to have something like a separate “virtual machine”, with Linux you can fine tune what exactly should get it’s own namespaces. For example: to make &lt;code&gt;top&lt;/code&gt; not show processes from the main system, the PID namespaces is unshared. If it is desired that mount calls inside your container shall not screw up the main system (= parent processes), you’d do that "unsharing" the MOUNT namespace. It is even possible to “fake” being the root user with USER namespaces. Here is a list of &lt;a href="https://en.wikipedia.org/wiki/Linux_namespaces#Namespace_kinds"&gt;available namespaces&lt;/a&gt; that a process can decouple from with the &lt;code&gt;unshare&lt;/code&gt; system call. Linux namespaces is a functionality provided by the linux kernel and not supported by other Unix like operating systems.&lt;/p&gt;

&lt;h1&gt;
  
  
  Isolation
&lt;/h1&gt;

&lt;p&gt;I will not go too deep on this one because it’s not my expertise. But with this three ingredients - Chroot, Mountpoint and Linux namespaces - we already have something that feels like a separate Linux box running on our host operating system. Neat, but making this isolated well enough from a security perspective is another story. An attacker could still “escape” our self baked virtualization quite easily. Chroot for example does not provide any guarantees that a process will stay in it’s chroot compartment. &lt;/p&gt;

&lt;h1&gt;
  
  
  A central repository server
&lt;/h1&gt;

&lt;p&gt;For practical reasons, it would be nice to not need to manually download a new e.G. Ubuntu Operating System from the internet every time we want to use that as our guest system. Good we have our central repository server where we can download whatever we want and upload our own alterations. Oh and of course it has to support layers or overlays, explained in the next section. &lt;/p&gt;

&lt;h1&gt;
  
  
  Overlay Filesystems
&lt;/h1&gt;

&lt;p&gt;A guest system - we don’t have containers yet - like Ubuntu with a lamp stack and some other stuff can easily take a couple of gigabytes of space on the hard drive. While it would be possible to upload, download, copy, delete and conduct other operations on that, it’s impractical. That is why containerization platforms manage root filesystem (all files and directories of an operating system) bit by bit as layers. It’s quite simple actually: multiple files and directories are overlayed on top of each other in order to make up the “complete” view that the user will see. “Special” files are used to signal a deleted file. Another interesting approach to solve this could involve reflinks - provided the used filesystem supports that. As all other interfaces described in this post, Overlay File Systems can also be used separately for whatever other use case. There is a Overlay Filesystem baked in into the kernel named “OverlayFS”. There’s also a fuse based implementation called “fuse-overlayfs”.&lt;/p&gt;

&lt;h1&gt;
  
  
  A build language
&lt;/h1&gt;

&lt;p&gt;Last but not least a big part of containerization platforms is to let users build their own root filesystems in order to distribute or deploy them. A simple shell script would most probably not honor the layers and other “special” features like build time arguments or volumes.  &lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Voilà, this is how to create a containerization platform. From my understanding all this described parts are already available since decades. But together it makes something special. That being said, please don’t try to build your own containerization platform over the weekend. It’s highly addictive and of course will take longer than you think. Here is what I came up with, it’s called &lt;a href="https://github.com/ihucos/plash/"&gt;plash&lt;/a&gt; :-)&lt;/p&gt;

</description>
      <category>devops</category>
      <category>linux</category>
      <category>container</category>
    </item>
    <item>
      <title>Web Analytics Comparison Table</title>
      <dc:creator>ihucos</dc:creator>
      <pubDate>Mon, 15 Jun 2020 11:40:44 +0000</pubDate>
      <link>https://forem.com/ihucos/web-analytics-comparison-table-1g94</link>
      <guid>https://forem.com/ihucos/web-analytics-comparison-table-1g94</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Payment&lt;/th&gt;
&lt;th&gt;Min Monthly Payment&lt;/th&gt;
&lt;th&gt;Script Size&lt;/th&gt;
&lt;th&gt;Session Tracking&lt;/th&gt;
&lt;th&gt;Open Source&lt;/th&gt;
&lt;th&gt;Claims "GDPR Compliant"&lt;/th&gt;
&lt;th&gt;Comment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://analytics.google.com"&gt;Google Analytics&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;73kb&lt;/td&gt;
&lt;td&gt;Cookie based session&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;The most used.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://simple-web-analytics.com/"&gt;Simple Web Analytics&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;0kb&lt;/td&gt;
&lt;td&gt;HTTP Cache based&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Fastest setup. No external script.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://goatcounter.com"&gt;GoatCounter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Freemium&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;2.5kb&lt;/td&gt;
&lt;td&gt;Elaborate hashed IP based session&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;Detailed per page access.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://gs.statcounter.com/"&gt;StatCounter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Freemium&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;35kb&lt;/td&gt;
&lt;td&gt;Cookie based session&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Your data is statistically evaluated.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://splitbee.io"&gt;Splitbee&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Freemium (Steep pricing)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;8kb&lt;/td&gt;
&lt;td&gt;Cookie based session&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Specialized in A/B testing with all common features.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://kindmetrics.io/"&gt;Kindmetrics&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Paid but currently free Beta&lt;/td&gt;
&lt;td&gt;6€&lt;/td&gt;
&lt;td&gt;2kb&lt;/td&gt;
&lt;td&gt;Hashed IP based session&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;Straightforward Interface. Still Beta.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://plausible.io/"&gt;Plausible&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;6$&lt;/td&gt;
&lt;td&gt;4kb&lt;/td&gt;
&lt;td&gt;Hashed IP based session&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;Clean Interface.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://get.gaug.es/"&gt;Gauges&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;6$&lt;/td&gt;
&lt;td&gt;4kb&lt;/td&gt;
&lt;td&gt;Cookie based session&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Seems alrighty. But I got daily unsubscribable mails.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://usefathom.com/"&gt;Fathom&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;14$&lt;/td&gt;
&lt;td&gt;7kb&lt;/td&gt;
&lt;td&gt;Hashed IP based session&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;Good overview with bad color contrast.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://matomo.org/"&gt;Matamo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;19$&lt;/td&gt;
&lt;td&gt;84kb&lt;/td&gt;
&lt;td&gt;Cookie based session&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Most advanced open source solution.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://simpleanalytics.com/"&gt;Simple Analytics&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;19$&lt;/td&gt;
&lt;td&gt;4kb&lt;/td&gt;
&lt;td&gt;Inspects the referrer&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;Best overview, I like the clean interface.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Left Out&lt;/th&gt;
&lt;th&gt;Reason.&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clicky&lt;/td&gt;
&lt;td&gt;Not able to use the user interface.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWStats&lt;/td&gt;
&lt;td&gt;Log based.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;W3Perl&lt;/td&gt;
&lt;td&gt;Log based.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GoAccess&lt;/td&gt;
&lt;td&gt;Log based (and looks nice).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yandex Metrica&lt;/td&gt;
&lt;td&gt;[...] we process huge amount of anonymous data on users' behavior [...]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Web Analytics&lt;/td&gt;
&lt;td&gt;Only self hosting is supported, no service offering.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KISSmetrics&lt;/td&gt;
&lt;td&gt;For enterprise cosumters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Etracker&lt;/td&gt;
&lt;td&gt;Webdesign does not awaken my trust (personal opinion).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adobe Analytics&lt;/td&gt;
&lt;td&gt;I belive enterprise focused. User Interface looks convoluted.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mint&lt;/td&gt;
&lt;td&gt;Officially discountinued.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Woopra&lt;/td&gt;
&lt;td&gt;Looks like it's for an enterprise audience.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chiffre&lt;/td&gt;
&lt;td&gt;Not launched yet.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  Notes
&lt;/h1&gt;

&lt;p&gt;If I forgot something, write it in the comments so I can update it. The sorting is by ascending price, with free services on top. This listing was carefully researched by me and it took quite some time actually. Being the author of Simple Web Analytics I wanted to get an overview of the market, especially on free of charge services, here there are really only a handful of alternatives. Although the comparison table does track if services claim to be "GDPR Compatible", that information has to be taken with some grains of salts. In my personal opinion services that do not use any kind of session at all (Simple Analytics and Simple Web Analytics) are the more privacy friendly. Next comes - in my opinion - GoatCounter, which puts a lot of effort in making something session based &lt;a href="https://github.com/zgoat/goatcounter/blob/master/docs/sessions.markdown#goatcounters-solution"&gt;being more privacy friendly&lt;/a&gt;. A service that I actually do want to highlight due to a great overview with only one glance is Simple Analytics. Although strictly comparing features it is quite expensive and tracking unique users &lt;a href="https://docs.simpleanalytics.com/uniques#how-it-works"&gt;by inspecting the referrer&lt;/a&gt; I find very elegant also from a privacy perspective, I'd love to know which accuracy can be achieved with this method. I hope this gives an overview of existing Web Analytics services, let me know in the comments if I forgot something.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Avoiding Cookie Banners</title>
      <dc:creator>ihucos</dc:creator>
      <pubDate>Tue, 09 Jun 2020 09:01:13 +0000</pubDate>
      <link>https://forem.com/ihucos/avoiding-cookie-banners-1edn</link>
      <guid>https://forem.com/ihucos/avoiding-cookie-banners-1edn</guid>
      <description>&lt;p&gt;One thing I was researching for is a Web Analytics solutions - preferably free - that does not require any consent of it's users. I really want to archive a sane and clutter free user experience on my web projects. The attention span of users today is - a number in my head right now - 5 seconds. It already takes 2 seconds for a consent banner to load on your users browser and for the user to fully get over the distraction that there is something directly asking for its attention. After that there are only 3 seconds left to the user to decide if she is staying on that site or not. So in my opinion consent banners are really, really expensive. They eat up one of the most important resources: User attention.&lt;/p&gt;

&lt;p&gt;This is not a defenitive list but comments on (preferably free) Web Analytics that could possibly be used without consent banners.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;a href="https://analytics.google.com/analytics/web/"&gt;Google Analytics&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;The first product you think of when you hear about Web Analytics is Google Analytics. While you can at least disable cookies on Google Analytics with some efforts, the devil is in the details. So I will not go into that and just unfairly state that Google will always be Google. I actually did not manage to definitively find out how exactly to use Google Analytics without a consent banner or if this is possible at all. But I want to list it here because it is still today one of the obvious choices to consider.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;a href="https://plausible.io/"&gt;Plausible&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;While it is not a Free product, it at first sight seems quite interesting to me and claims on the front page "No cookie banners or GDPR/CCPA consent needed". It is open source, has a public road map and I actually do like the product itself. At first sight this product clearly seems to be the solution to avoid a cookie banner. Well I am afraid not. I am no lawyer and will only present apparently contradictory information from Plausible and another source and also ask Plausible to clarify after publishing this post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://piwik.pro/blog/benefits-data-pseudonymization-anonymization-gdpr/"&gt;Here is a really good article&lt;/a&gt;. According to that source, asking for consent is only needed if you are only collection anonymized data. &lt;strong&gt;For pseudonymized data you still need consent&lt;/strong&gt;. To quote the linked Article&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In layman’s terms, the main difference is that while pseudonymous data still allows for some form of re-identification, anonymous data can’t be re-identified. That’s why the former is still considered personal data, while the latter isn’t.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While Plausible has good explanations of it's internal workings it is actually quite nice that we can transparently look directly into the source code: On each Pageview, there is a &lt;code&gt;user_id&lt;/code&gt; saved to the database as attribute of an &lt;code&gt;event&lt;/code&gt; &lt;a href="https://github.com/plausible/plausible/blob/20ab045b9cd0b6d08e02fc4e4b966e6841976555/lib/plausible_web/controllers/api/external_controller.ex#L52"&gt;here&lt;/a&gt;. &lt;a href="https://github.com/plausible/plausible/blob/20ab045b9cd0b6d08e02fc4e4b966e6841976555/lib/plausible_web/controllers/api/external_controller.ex#L97"&gt;The user id is a hash of the user's ip with her user agent and the website domain&lt;/a&gt;. &lt;a href="https://plausible.io/data-policy#how-we-count-unique-users-without-cookies"&gt;That is also explained in plain words here&lt;/a&gt;. There possibly may lie other consequences in saving the hashed ip address but for this blog post my interpretation and claim is the following: This does not qualify as anomyzation, it’s pseudonimization and therefore a consent banner is still needed when using this product. I hope Plausible can clarify on this and if applicable, remove all corresponding claims about it's product.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;a href="https://simple-web-analytics.com/"&gt;Simple Web Analytics&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;After not finding anything Free with no cookie banner needed and not wanting to somehow figure out how exactly Google Analytics can fit the bill, I really just wrote my own analytics service and this is it. One of the biggest differences to other products is that it is really only a bunch of counters for the date, browser, country and so on. There are no cookies and no sessions (user ids) at all. I still do not claim that it is "GDPR compliant" anywhere at this point in time due to the complexity of the topic.&lt;/p&gt;

&lt;p&gt;I conclusion this is the comparison of three products that could possibly fit the requirement of Web Analytics without a consent banner - and that preferably free of charge. Maybe only partly satisfying and I hope the internet and me will gain more clarity about the DSGVO with some time but I hope, I could clarify some points. I'd be happy to discuss more trough the comments!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Install any package with ZPKG</title>
      <dc:creator>ihucos</dc:creator>
      <pubDate>Fri, 05 Jun 2020 13:13:27 +0000</pubDate>
      <link>https://forem.com/ihucos/install-any-package-with-zpkg-1e44</link>
      <guid>https://forem.com/ihucos/install-any-package-with-zpkg-1e44</guid>
      <description>&lt;p&gt;There is a really cool (meta) package manager I wrote. Usually you are kind of bound to specific package managers depending on your Linux distribution of choice. With ZPKG you can just use any package manager on any Linux distribution. It is still alpha/beta but already works fairly well. Let's take a look.&lt;/p&gt;

&lt;p&gt;Let's take the exemplary use case that you are on Ubuntu Linux and want to do some quick image editing with Gimp. You totally could install that with &lt;code&gt;apt&lt;/code&gt; or &lt;code&gt;snap&lt;/code&gt;, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apt-get install gimp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;While that is the "official" way of doing that and apt does a fairly good job, there are still some things I don't like so much.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have to use the root user. I personally try to avoid that.&lt;/li&gt;
&lt;li&gt;The package integrates into the system and e.G. creates new users, installs services, configuration files etc. That could be desired, but causes "bloat" on the whole system.&lt;/li&gt;
&lt;li&gt;Ubuntu packages are stable, but sometimes a little outdated (imho) in comparison to other distributions.&lt;/li&gt;
&lt;li&gt;I find apt slow in comparison to e.G. &lt;code&gt;apk&lt;/code&gt; from alpine. Big packages can take up quite some time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So what I do in that specific use case of just quickly wanting Gimp to edit an image or so without putting too much weight on my global system installation, is to use ZPKG. Let's takes a look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zpkg add gimp --from alpine:edge --apk gimp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Or a shorter less explicit invocation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zpkg add -A gimp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;br&gt;
Make sure you have this directory in your PATH: &lt;code&gt;$HOME/.local/bin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And voilà you can type gimp in any terminal in order to use it. Interestingly the whole installation is on your home folder and completely independent from the Linux Distribution or it's libc implementation. So you could do things like share your home folder across multiple Linux Distributions and still use the same programs.&lt;/p&gt;

&lt;p&gt;Another thing that I think is pretty nice, is that with zpkg you can also package other packages. Let me explain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ zpkg package gimp gimp.zpkg  # that is the "gimp" we just installed
Install package locally:
tar -xf gimp.zpkg -C ~/.local 

Install package globally:
tar -xf gimp.zpkg -C /usr/local

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ZPKG itself is distributed as a zpkg package, so this is how to actually install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -Lf https://github.com/ihucos/zpkg/releases/download/0.2.4/zpkg.zpkg | tar -xJf - -C ~/.local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So in other words, with ZPKG you can also create packages, that are completely distribution agnostic.&lt;/p&gt;

&lt;p&gt;Of course you can also do stuff like upgrading installed packages, removing them, and so on. Check it out :-)&lt;/p&gt;

&lt;p&gt;The implementation details include overlay filesystem, user namespaces, hard links and other interesting topics that I will hopefully follow up on more posts :-)&lt;/p&gt;

&lt;p&gt;Here is the website and the GitHub page&lt;br&gt;
&lt;a href="http://zpkg.plash.io/"&gt;http://zpkg.plash.io/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/ihucos/zpkg"&gt;https://github.com/ihucos/zpkg&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The cost of parsing http</title>
      <dc:creator>ihucos</dc:creator>
      <pubDate>Tue, 02 Jun 2020 15:54:16 +0000</pubDate>
      <link>https://forem.com/ihucos/the-cost-of-parsing-http-1e1l</link>
      <guid>https://forem.com/ihucos/the-cost-of-parsing-http-1e1l</guid>
      <description>&lt;p&gt;When creating &lt;a href="https://simple-web-analytics.com/"&gt;Simple Web Analytics&lt;/a&gt; I tried to be able to scale from the beginning. Coming from the Python world one thing I hear a lot is "The database is the bottleneck". But for that specific use case that turned out to not be true. Apparently, my application code seemed not to weight in into how many requests per second the server can handle so much. And in the end &lt;strong&gt;I had to switch to go&lt;/strong&gt; to be able to accomplish what I find acceptable results.&lt;/p&gt;

&lt;p&gt;Let me explain and compare numbers. With a hello world flask application and gunicorn I can get &lt;strong&gt;3343.95 trans/sec&lt;/strong&gt;. Trying an  asynchronous (gevent.pywsgi) based wsgi to http adapter did not help, here the numbers are something like 1003.65 trans/sec. Now let's throw golang into the comparison. Before boring you too much I will do an really completely unfair comparison and jump straight to this number &lt;strong&gt;8765.15 trans/sec. That is also including the whole application code.&lt;/strong&gt; And now just for completeness here is my unperfect measurement of what a simple hello world in golang can do: 12465.77 trans/sec.&lt;/p&gt;

&lt;p&gt;In conclusion for my specific use case - doing optimized queries on a redis database - the bottleneck is clearly handling the http requests and not the application code. I wonder what exactly takes so long (in comparison with the application code). Is it parsing HTTP, is it handling the sockets, is it something else? Id' like to know!&lt;/p&gt;

</description>
      <category>python</category>
      <category>go</category>
      <category>serverless</category>
      <category>benchmarks</category>
    </item>
    <item>
      <title>Web Analytics for pet projects</title>
      <dc:creator>ihucos</dc:creator>
      <pubDate>Mon, 25 May 2020 18:13:00 +0000</pubDate>
      <link>https://forem.com/ihucos/web-analytics-for-your-pet-projects-2n82</link>
      <guid>https://forem.com/ihucos/web-analytics-for-your-pet-projects-2n82</guid>
      <description>&lt;p&gt;Some time ago I just used Google Analytics for my pet projects. But now with the DSGVO I don't know exactly how that is supposed to work. After some reading about that I came to the following conclusion: We need some quick and dirty way to just have basic tracking of users in web projects.&lt;/p&gt;

&lt;p&gt;So here it is, a Cookieless, Free (&lt;em&gt;not&lt;/em&gt; Freemium) service to track users. There is no user id assigned to traffic and I don't save IP addresses. Does this make it "DSGVO-Compliant"? I honestly don't know, but think it's pretty cool: &lt;a href="https://simple-web-analytics.com/"&gt;https://simple-web-analytics.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The server is written in Go, there's some vanilla JavaScript and Bootstrap on the frontend, also Chart.js. And the database is redis. On my Cheap 5 Dollar Linode VPS it can handle ~ 2000 requests per second to track users. There is geolocation, referrer and top pages tracking and everything you would expect. HTTP Caching is used to ensure every user only (mostly) hits the server once per day per site being tracked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://simple-web-analytics.com/"&gt;Check it out&lt;/a&gt; :-)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>go</category>
      <category>html</category>
    </item>
  </channel>
</rss>
