<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog on Humberto Rocha</title><link>https://humberto.io/blog/</link><description>Recent content in Blog on Humberto Rocha</description><generator>Hugo</generator><language>en</language><atom:link href="https://humberto.io/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Installing HomeAssistant OS in a Proxmox VM</title><link>https://humberto.io/blog/haos-in-proxmox/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/haos-in-proxmox/</guid><description>&lt;p>This is a quick guide that sumarizes the manual deployment setup of Home Assistant OS into a Proxmox VM, all the credits to &lt;a href="https://forum.proxmox.com/threads/guide-install-home-assistant-os-in-a-vm.143251/">this post in the proxmox community&lt;/a>.&lt;/p>
&lt;p>I usually go there every time that I need to go through the setup process but then I also need to remember all the tweaks that I made to it so I wrote this for easy reference.&lt;/p>
&lt;p>Home Assistant OS does not offer a &lt;code>.iso&lt;/code> image that you can just upload at Proxmox interface and then provision your VM with it. So, to get it installed you&amp;rsquo;ll have to make it through the terminal.&lt;/p></description></item><item><title>Mastodon Poll in ActivityPub</title><link>https://humberto.io/blog/mastodon_poll_in_activitypub/</link><pubDate>Mon, 06 Feb 2023 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/mastodon_poll_in_activitypub/</guid><description>&lt;p>I started running my own &lt;a href="https://activitypub.rocks/">ActivityPub&lt;/a> instance with &lt;a href="https://jointakahe.org/">Takahē&lt;/a>.&lt;/p>
&lt;p>I got interested in contributing to the &lt;a href="https://github.com/jointakahe/takahe">project&lt;/a> and one of my first implemented features was the poll support.&lt;/p>
&lt;p>While implementing it I noticed that the informations about this topic were scattered throughout multiple places.&lt;/p>
&lt;p>So, for me to remember how it works, and maybe to help someone looking for the same information I decided to write this article.&lt;/p>
&lt;h2 id="poll-or-question-how-activitypub-handles-it">Poll or Question? How ActivityPub handles it?&lt;/h2>
&lt;p>The first thing we need to know is that ActivityPub does not support Poll as a native type in it&amp;rsquo;s protocol definition.&lt;/p></description></item><item><title>Exploring pygame 5 - Movement and Collision</title><link>https://humberto.io/blog/exploring-pygame-5-movement-and-collision/</link><pubDate>Tue, 10 Sep 2019 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/exploring-pygame-5-movement-and-collision/</guid><description>&lt;p>Movement is part of a large portion of games. When jumping between platforms, shooting against a horde of enemies, piloting a space ship and running through the streets, we are causing movement and interacting with the game environment, applying action and causing reactions.&lt;/p>
&lt;p>This chapter is to describe the basics of moving objects across the screen and their interaction with other elements through collision detection.&lt;/p>
&lt;h2 id="movement">Movement&lt;/h2>
&lt;p>If you are following this series of posts, you already saw an example of movement at the post about &lt;a href="https://humberto.io/pt-br/blog/desbravando-o-pygame-3-game-loop/">the game loop&lt;/a>, where we implemented a ball that moves through the screen bouncing around.&lt;/p></description></item><item><title>Publishing my first Game</title><link>https://humberto.io/blog/publishing-my-first-game/</link><pubDate>Wed, 28 Aug 2019 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/publishing-my-first-game/</guid><description>&lt;p>Games always connected me with technology since the beginning.&lt;/p>
&lt;p>My father and I, we built our first computer (a Pentium 286) and the first thing that I remember to do was to play some DOS games like Prince of Persia and Lunar Lander. I learned a bunch of CLI commands just to play my favorite games.&lt;/p>
&lt;p>The passion for playing and making games followed me as a hobby. I have a &lt;a href="https://humberto.io/tags/pygame/">pygame series of posts&lt;/a> on this blog, where I go through basic concepts of game development trying to explain them to someone who is starting to learn about it.&lt;/p></description></item><item><title>Awesome Libs: pipx</title><link>https://humberto.io/blog/awesome-libs-pipx/</link><pubDate>Thu, 08 Aug 2019 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/awesome-libs-pipx/</guid><description>&lt;p>I&amp;rsquo;m starting this series of posts to give you tips on libraries that can be handy on your day to day as a Developer and also to present libraries I think you should keep on eye on.&lt;/p>
&lt;p>One of the perks of a good Developer is having a proper tool-set available on your belt, and nothing more appropriate to start this series than a library that installs other libraries!&lt;/p>
&lt;p>How many times did you install some Python CLI tool inside of a Python virtualenv? Have you ever updated some tool and broke another library because it relied on a common dependency?&lt;/p></description></item><item><title>TLDR: Generate Django Secret Key</title><link>https://humberto.io/blog/tldr-generate-django-secret-key/</link><pubDate>Fri, 12 Jul 2019 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/tldr-generate-django-secret-key/</guid><description>&lt;p>Raise your hand if you never versioned the Django&amp;rsquo;s &lt;code>SECRET_KEY&lt;/code> at the beginning of a project and needed to generate a new one before going to production.&lt;/p>
&lt;p>This &lt;strong>TLDR&lt;/strong> is a quick reminder of how to generate a secret key locally, without going to some website on the internet to generate it for you.&lt;/p>
&lt;p>Django generates a secret key every time that you create a new project, so this function already exists at its code, and you can access it in this way:&lt;/p></description></item><item><title>Improving the UTM tracking of your website</title><link>https://humberto.io/blog/improving-the-utm-tracking-of-your-website/</link><pubDate>Fri, 14 Sep 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/improving-the-utm-tracking-of-your-website/</guid><description>&lt;p>Recently, I had the opportunity to face a frontend challenge at &lt;a href="https://configr.com/?utm_source=humberto&amp;amp;utm_campaign=post-utm&amp;amp;utm_content=link-intro">Configr&lt;/a>. It consists of improving the tracking rate of the new users who come to the system (a.k.a. leads). More specifically, the tracking rate from the &lt;a href="https://en.wikipedia.org/wiki/UTM_parameters">UTM parameters&lt;/a> of the marketing campaigns.&lt;/p>
&lt;aside class="tip info">
 &lt;strong>TLDR&lt;/strong>: I created a &lt;strong>javascript&lt;/strong> library called &lt;strong>utmkeeper&lt;/strong> that do the job for you, and it&amp;rsquo;s available at &lt;a href="https://github.com/humrochagf/utmkeeper">https://github.com/humrochagf/utmkeeper&lt;/a>.
&lt;/aside>

&lt;aside class="tip info">
 &lt;strong>UPDATE (September 21, 2018)&lt;/strong> Post updated to cover the &lt;strong>0.3&lt;/strong> version of &lt;strong>utmkeeper&lt;/strong>.
&lt;/aside>

&lt;h2 id="utm">UTM&lt;/h2>
&lt;p>The acronym &lt;strong>UTM&lt;/strong> came from &lt;strong>Urchin&lt;/strong> which was an analytics software made to measure how effective a marketing campaign was, by using the parameters of the &lt;strong>U&lt;/strong>rchin &lt;strong>T&lt;/strong>raffic &lt;strong>M&lt;/strong>odule to accomplish that. Later, &lt;strong>Google&lt;/strong> started to support these parameters, and right after &lt;strong>Facebook&lt;/strong>, and eventually, these parameters became famous as a standard tool to measure the effectiveness of marketing campaigns across the internet.&lt;/p></description></item><item><title>TLDR: Write and Read Unicode from files with Python 2 and 3</title><link>https://humberto.io/blog/tldr-write-and-read-unicode-from-files-with-python-2-and-3/</link><pubDate>Thu, 23 Aug 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/tldr-write-and-read-unicode-from-files-with-python-2-and-3/</guid><description>&lt;p>Chatting with a friend, &lt;a href="https://twitter.com/queirozMario21">Mário Sérgio&lt;/a>, about problems that happen when you migrate your codebase from Python versions, I came out with the idea of writing this &lt;strong>TLDR&lt;/strong>.&lt;/p>
&lt;p>I hope it can help someone that is trying to work with texts that contain &lt;a href="https://en.wikipedia.org/wiki/Unicode">Unicode&lt;/a> characters that don&amp;rsquo;t fall back into the &lt;a href="https://en.wikipedia.org/wiki/ASCII">ASCII&lt;/a> table like other than the roman alphabet and &lt;a href="https://en.wikipedia.org/wiki/Emoji">emoji&lt;/a>.&lt;/p>
&lt;p>On Python 2 there&amp;rsquo;s no distinction between &lt;strong>byte&lt;/strong> and &lt;strong>string&lt;/strong>. It leads us to eventually not correctly encode/decode the data when we deal with input and output. That kind of mistake can cause runtime errors like that:&lt;/p></description></item><item><title>Sending and receiving emails with Python</title><link>https://humberto.io/blog/sending-and-receiving-emails-with-python/</link><pubDate>Fri, 10 Aug 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/sending-and-receiving-emails-with-python/</guid><description>&lt;p>Someday, during the Python Tuesdays event at &lt;a href="https://calango.club/">Calango Hacker Club&lt;/a>, one of the participants came with a question on how to automate its email reading process at Gmail categorizing their messages into something that could be important and something that is not. That question motivated me looking after how to that, and then into this post that maybe can help someone that is trying to do something similar with Python.&lt;/p>
&lt;p>&lt;img src="https://humberto.io/blog/sending-and-receiving-emails-with-python/assets/python-mail.png" alt="python email">&lt;/p></description></item><item><title>TLDR: Python Dev Dependencies on Ubuntu</title><link>https://humberto.io/blog/tldr-python-dev-dependencies-on-ubuntu/</link><pubDate>Tue, 19 Jun 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/tldr-python-dev-dependencies-on-ubuntu/</guid><description>&lt;p>Some libraries aren&amp;rsquo;t 100% packaged Python code, some of them are &lt;strong>bindings&lt;/strong> to external libraries. They offer a Python interface so you can call them inside your code. On these cases, we need to install them previously at the system so the python package can work.&lt;/p>
&lt;p>When that happens, we get this kind of error:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To solve errors like that, you need to install the external library, and the system configures everything to you. However, if you work with multiple Python versions managed by &lt;a href="https://github.com/pyenv/pyenv">pyenv&lt;/a>, you have to rebuild all python versions every time that you remember to install a new dependency.&lt;/p></description></item><item><title>TLDR: Setting mutable objects at Django Model Field default</title><link>https://humberto.io/blog/tldr-setting-mutable-objects-at-django-model-field-default/</link><pubDate>Wed, 25 Apr 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/tldr-setting-mutable-objects-at-django-model-field-default/</guid><description>&lt;p>This post it the result of a &lt;strong>bug&lt;/strong> that haunted me for three months until I finally could isolate the error properly, and get to the root of the issue.&lt;/p>
&lt;aside class="tip warning">
 &lt;strong>Disclaimer:&lt;/strong> this information exists at the &lt;a href="https://docs.djangoproject.com/en/2.2/ref/models/fields/#default">Django&lt;/a> docs, however strengthening the importance of this info is vital to prevent people to spend a lot of time with this kind of bug.
&lt;/aside>

&lt;p>One of the core parameters of a Django &lt;strong>Model field&lt;/strong> is the &lt;strong>default&lt;/strong>. It sets the value of the &lt;strong>Field&lt;/strong> when you don&amp;rsquo;t pass a value to it at the &lt;strong>Model&lt;/strong> instance creation. The default parameter can receive a &lt;strong>value&lt;/strong> or a &lt;strong>callable&lt;/strong>, and callable are functions or any object that implements the &lt;code>__call__&lt;/code> method.&lt;/p></description></item><item><title>JWT Authentication with Angular and Django</title><link>https://humberto.io/blog/jwt-authentication-with-angular-and-django/</link><pubDate>Sun, 15 Apr 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/jwt-authentication-with-angular-and-django/</guid><description>&lt;p>Almost every system that runs on the internet and stores user data has an authentication layer. With the API architecture becoming popular nowadays, the complexity of the authentication layer also grew.&lt;/p>
&lt;p>This post was made to explain the authentication process between a frontend written in &lt;strong>Angular 6&lt;/strong> and a backend written in &lt;strong>Django 2&lt;/strong> using the architecture proposed on my previous post &lt;a href="https://humberto.io/blog/separating-frontend-from-backend-with-angular-and-django/">&amp;ldquo;Separating Frontend from Backend with Angular and Django&amp;rdquo;&lt;/a>.&lt;/p>
&lt;p>The repositories with this post code are:&lt;/p></description></item><item><title>TLDR: How to Publish to PyPI</title><link>https://humberto.io/blog/tldr-how-to-publish-to-pypi/</link><pubDate>Mon, 05 Mar 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/tldr-how-to-publish-to-pypi/</guid><description>&lt;p>Have you ever asked yourself how to publish your Python package, so you can install it using &lt;a href="https://pypi.python.org/pypi/pip">pip&lt;/a>? It is less complex than it seems, and anyone can do it.&lt;/p>
&lt;p>The first step is to create an account on the &lt;a href="https://pypi.python.org/pypi">Python Package Index (PyPI)&lt;/a> were all Python packages are registered.&lt;/p>
&lt;p>After that, you need to create a file called &lt;code>setup.py&lt;/code> on the root folder of the Python code that you will publish with the following content, changing the values were is needed:&lt;/p></description></item><item><title>TLDR: Running commands at multiple hosts with Fabric</title><link>https://humberto.io/blog/tldr-running-commands-at-multiple-hosts-with-fabric/</link><pubDate>Sat, 17 Feb 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/tldr-running-commands-at-multiple-hosts-with-fabric/</guid><description>&lt;p>Recently someones asked me how to perform a connection to a server to run the command &lt;code>df -h&lt;/code> using ssh to display the disk usage of the machine. After a quick chat, I discovered that the question was more than just a single check to a server. It was to extend that to multiple servers.&lt;/p>
&lt;p>The answer to the question was quick and came with a &amp;ldquo;click&amp;rdquo;. How about to document these quick tips at the blog? It can help someone and also help me to remind me how to do something if I need it in the future. With that in mind, I created this series of posts that I kindly baptized as &lt;strong>TLDR&lt;/strong> the abbreviation for &lt;strong>T&lt;/strong>oo &lt;strong>L&lt;/strong>ong ** D**idn&amp;rsquo;t &lt;strong>R&lt;/strong>ead.&lt;/p></description></item><item><title>Separating Frontend from Backend with Angular and Django</title><link>https://humberto.io/blog/separating-frontend-from-backend-with-angular-and-django/</link><pubDate>Tue, 13 Feb 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/separating-frontend-from-backend-with-angular-and-django/</guid><description>&lt;p>At web development, things evolve and grow in complexity faster than we can follow. That old way of creating websites where the pages were built only with HTML and if you had to change something you had to go through many pages changing the same thing is something rare nowadays. Now, even to create static websites, we use tools to optimize our work.&lt;/p>
&lt;p>On the last years, we had an increase in javascript frameworks and an excellent evolution on the frontend as a whole. These new technologies have their tools and pipelines that makes harder to a single system to deliver both frontend and backend.&lt;/p></description></item><item><title>Exploring pygame 4 - Game of Life</title><link>https://humberto.io/blog/exploring-pygame-4-game-of-life/</link><pubDate>Sun, 27 Aug 2017 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/exploring-pygame-4-game-of-life/</guid><description>&lt;p>A while ago, I made a post on &lt;a href="https://humberto.io/blog/coding-dojo-101/">how to organize a coding dojo&lt;/a> that was published right after the Python DF community anniversary dojo where I prepared a challenge to create the &lt;a href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">game of life&lt;/a> from John Horton Conway.&lt;/p>
&lt;p>To let the challenge more dynamic, I prepared a graphic simulator using pygame so everyone could see the code running visually. The simulator uses all the concepts that we saw on the last posts of this series.&lt;/p></description></item><item><title>Exploring pygame 3 - Game Loop</title><link>https://humberto.io/blog/exploring-pygame-3-game-loop/</link><pubDate>Thu, 24 Aug 2017 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/exploring-pygame-3-game-loop/</guid><description>&lt;p>Now that we learned how to draw on the screen (&lt;a href="https://humberto.io/blog/exploring-pygame-2-drawing-on-screen/">previous post&lt;/a>) would be good that our game keeps running until someone closes it, and to do that we will use one of the basic concepts of game development with is the Game Loop.&lt;/p>
&lt;h2 id="concept">Concept&lt;/h2>
&lt;p>The concept of loop is something very common at computing, it is nothing but a sequence of actions and decision makings that repeats inside on a cycle. At a &lt;strong>low level&lt;/strong>, we have the CPU that works in cycles of arithmetic operations managed by the &lt;strong>clock rate&lt;/strong>, at &lt;strong>Operating Systems&lt;/strong> there is a &lt;strong>loop&lt;/strong> that manages the time that each process have with the CPU and that check for user inputs, and at &lt;strong>web servers&lt;/strong> we use a &lt;strong>loop&lt;/strong> to check if someone made a request to a page that will be processed and returned as response. With games, it shouldn&amp;rsquo;t be different.&lt;/p></description></item><item><title>Exploring pygame 2 - Drawing on Screen</title><link>https://humberto.io/blog/exploring-pygame-2-drawing-on-screen/</link><pubDate>Fri, 03 Feb 2017 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/exploring-pygame-2-drawing-on-screen/</guid><description>&lt;p>During a game lifetime, we are constantly drawing on the screen. Now that we learned how to create a program with pygame it&amp;rsquo;s time to start to draw.&lt;/p>
&lt;h2 id="drawing-axis">Drawing axis&lt;/h2>
&lt;p>Going back to math classes at high school we were introduced to the &lt;a href="https://en.wikipedia.org/wiki/Cartesian_coordinate_system">Cartesian coordinate system&lt;/a>. It is basically one bidimensional plane oriented by the axis &lt;strong>x&lt;/strong> and &lt;strong>y&lt;/strong> where the &lt;strong>x&lt;/strong> values grow from left to right while &lt;strong>y&lt;/strong> grows from bottom to top:&lt;/p></description></item><item><title>Exploring pygame 1 - Discovering the library</title><link>https://humberto.io/blog/exploring-pygame-1-discovering-the-library/</link><pubDate>Sun, 15 Jan 2017 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/exploring-pygame-1-discovering-the-library/</guid><description>&lt;p>Game development is one of the most common reasons to start to study programming. With me it was not different, despite not following the game developer path, this was always a field that caught my attention.&lt;/p>
&lt;p>I&amp;rsquo;m creating this series of posts to learn more about the game development basics and to share my discoveries with everyone. I&amp;rsquo;ll use the &lt;a href="http://www.pygame.org/">pygame&lt;/a> library as tool and I will start by the most basic principles of game development until the creation of a single player &lt;strong>pong like&lt;/strong> game.&lt;/p></description></item><item><title>Coding Dojo 101</title><link>https://humberto.io/blog/coding-dojo-101/</link><pubDate>Fri, 02 Dec 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/coding-dojo-101/</guid><description>&lt;p>My first &lt;strong>Coding Dojo&lt;/strong> happened right after my first contact with the &lt;strong>Python&lt;/strong> language at college. A classmate (&lt;a href="https://github.com/ravishi">Dirley&lt;/a>) that had back from &lt;strong>Python Brasil&lt;/strong> conference where he discovered the concept of Coding Dojo and was excited to put that to practice. That was a really fun day and probably the most important moment that started a spark on me to learn more about Python.&lt;/p>
&lt;p>In the same way as that brought me to Python and after to the community, Coding Dojo can be an entry door to a lot of people to programming.&lt;/p></description></item><item><title>Free Software or Open Source?</title><link>https://humberto.io/blog/free-software-or-open-source/</link><pubDate>Wed, 25 May 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/free-software-or-open-source/</guid><description>&lt;p>Recently I participated in a discussion at the &lt;a href="https://telegram.me/grupydf">Grupy-DF Telegram Comunity group&lt;/a> about how to explain the differences between &lt;strong>Open Source&lt;/strong> and &lt;strong>Free Software&lt;/strong> to non tech people and during that discussion I realized that on every try to create a simple answer we create more doubts about it.&lt;/p>
&lt;p>So to try answer that question i posted here my toughs on this question.&lt;/p>
&lt;h2 id="free-software">Free Software&lt;/h2>
&lt;p>The &lt;strong>Free Software&lt;/strong> is a term used when we are talking about computer programs that follow the concepts of freedom and community. They are compiled on 4 essential freedoms defined by the Free Software Foundation (FSF) that you can read more about at their &lt;a href="http://www.gnu.org/philosophy/free-sw.en.html">official website&lt;/a>.&lt;/p></description></item><item><title>Publishing at GitHub Pages with Pelican and Travis-CI</title><link>https://humberto.io/blog/publishing-at-github-pages-with-pelican-and-travis-ci/</link><pubDate>Thu, 05 May 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/publishing-at-github-pages-with-pelican-and-travis-ci/</guid><description>&lt;p>&lt;strong>First published at&lt;/strong>: &lt;a href="http://df.python.org.br/blog/github-pages-com-pelican-e-travis-ci">df.python.org.br/blog/github-pages-com-pelican-e-travis-ci&lt;/a>&lt;/p>
&lt;p>I&amp;rsquo;m making this post to help everyone who want to create their first website at &lt;a href="http://pages.github.com">GitHub Pages&lt;/a> using &lt;a href="http://blog.getpelican.com">Pelican&lt;/a> to create the pages and &lt;a href="https://travis-ci.org">Travis-CI&lt;/a> to automate the task of static page generation and publishing.&lt;/p>
&lt;p>This guide assumes that the reader have an account at &lt;a href="http://github.com">GitHub&lt;/a> and Travis-CI and have familiarity with the Python environment. The version of Pelican used at this post was 3.6.&lt;/p>
&lt;aside class="tip info">
 The images have a little of Portuguese due to the original language publication
&lt;/aside>

&lt;h2 id="github-pages">GitHub Pages&lt;/h2>
&lt;p>GitHub Pages is a feature of GitHub that enables its users to host static content (html, css, js and images) and publish on a &lt;strong>github.io&lt;/strong> subdomain or even to assign it to a custom domain.&lt;/p></description></item><item><title>Django Generic ManyToMany Relations</title><link>https://humberto.io/blog/django-generic-manytomany-relations/</link><pubDate>Fri, 29 Apr 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/django-generic-manytomany-relations/</guid><description>&lt;p>Django&amp;rsquo;s official documentation nicely covers its generic relationship functionality when you have to make an &lt;strong>OneToMany&lt;/strong> (one-to-many or &lt;strong>1:N&lt;/strong>) relation, but when you need to implement a generic &lt;strong>ManyToMany&lt;/strong> (many-to-many or &lt;strong>N:N&lt;/strong>) relation, there is not much documentation about it.&lt;/p>
&lt;p>I recently had to implement an &lt;strong>N:N&lt;/strong> with a generic side, and discovered a library called &lt;a href="http://django-gm2m.readthedocs.io/en/stable/index.html">django-gm2m&lt;/a> that was very useful to me in this task, and I will describe here giving tips on how to make this implementation and how to avoid possible headaches.&lt;/p></description></item><item><title>Static Websites with Lektor</title><link>https://humberto.io/blog/static-websites-with-lektor/</link><pubDate>Sat, 23 Apr 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/static-websites-with-lektor/</guid><description>&lt;p>Theres about 4 years that I try to start a blog and during that time I created some for the community but never my own.&lt;/p>
&lt;p>Using publishing tools like WordPress the problem was the difficulty of customizing it and the amount of tooling that I would never use, plus it&amp;rsquo;s not &lt;strong>Python&lt;/strong>.&lt;/p>
&lt;p>Then I discovered &lt;a href="https://pages.github.com">GitHub Pages&lt;/a>, and at the same time &lt;a href="http://blog.getpelican.com">Pelican&lt;/a> by indication of &lt;a href="http://mindbending.org/pt">Magnun Leno&lt;/a> and I started to do a lot things with it.&lt;/p></description></item><item><title>Hello World!</title><link>https://humberto.io/blog/hello-world/</link><pubDate>Thu, 21 Apr 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/blog/hello-world/</guid><description>&lt;p>Hello everyone,&lt;/p>
&lt;p>This is my first post at this blog, here I will talk about Python, technology, open source, the universe and everything.&lt;/p>
&lt;p>I created this blog with focus on consolidate my knowledge, and eventually to help someone with my thoughts.&lt;/p>
&lt;p>Without further ado, keep watching for the next posts&amp;hellip;&lt;/p></description></item></channel></rss>