# rss_item

guid: http://thequickblog.com/?p=559
author: Django Tutorial For Beginners with How To Troubleshoot Errors
feedurl: https://www.djangoproject.com/rss/community/blogs/
title:
[Django Rest Framework] Build Your First REST API with Python Django Rest Framework. (CRUD Operation)

url:
http://thequickblog.com/restapi-with-python-djangorestframework/?utm_source=rss&utm_medium=rss&utm_campaign=restapi-with-python-djangorestframework

content:
Django REST framework is a powerful and flexible toolkit for building Web APIs. Some reasons you might want to use REST framework: The Web browsable API is a huge usability win for your developers. Authentication policies including packages for OAuth1a and OAuth2. Serialization that supports both ORM and non-ORM data sources. Customizable all the way down &#8211; just use regular function-based views if you don&#8217;t need the more powerful features. Extensive


guid: https://www.untangled.dev/2020/06/06/docker-django-local-dev
title: Docker & Django Local Development
author: Untangled Development
url: https://www.untangled.dev/2020/06/06/docker-django-local-dev/
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<p>At the end of this post you will have:</p>

<ol>
  <li>Set up Docker locally on your dev box.</li>
  <li>Run Django in a Docker container on the same dev box.</li>
  <li>Put a breakpoint and debugged the code!</li>
</ol>

<h2 id="pre-reqs">Pre-reqs</h2>

<ul>
  <li>Docker installed locally. For the purposes of this proof-of-concept, I used <a href="https://www.docker.com/products/docker-desktop">Docker Desktop</a>.</li>
</ul>

<h2 id="minimal-docker-setup">Minimal Docker Setup</h2>

<p>Our minimal docker setup will:</p>

<ul>
  <li>run a relational database: Postgres</li>
  <li>directly run <code class="language-plaintext highlighter-rouge">runserver</code> command, which is what should be done for debugging purposes</li>
</ul>

<p>Our minimal docker setup will <em>not</em>:</p>

<ul>
  <li>run a webserver, such as Nginx</li>
  <li>run <code class="language-plaintext highlighter-rouge">gunicorn</code> or <code class="language-plaintext highlighter-rouge">uwsgi</code> as a <a href="https://stackoverflow.com/a/10127465/1211429">glue</a> between the framework (Django code) and the webserver</li>
</ul>

<p>Since the objective is <a href="/2020/05/30/why-docker-local-development/">local development with Docker</a> neither are needed.</p>

<h2 id="minimal-docker-understanding">Minimal Docker Understanding</h2>

<p>If some Docker concepts are still not clear to you, do not worry. I have to search for new stuff myself all the time.</p>

<p>When I started, I found this article really helpful: <a href="https://vsupalov.com/6-docker-basics/">6 Docker Basics You Should Completely Grasp When Getting Started</a>. This article explains the differences and the relationship between:</p>

<ul>
  <li>Containers</li>
  <li>Images</li>
  <li>Dockerfiles</li>
  <li>Volumes</li>
  <li>Port Forwarding</li>
  <li>Docker compose</li>
</ul>

<p>A lifesaver if you’re confused with the barrage of new Docker jargon. In this post we’ll be setting up:</p>

<ul>
  <li>one <code class="language-plaintext highlighter-rouge">Dockerfile</code>,</li>
  <li>one Docker compose file, or <code class="language-plaintext highlighter-rouge">docker-compose.yml</code></li>
</ul>

<h2 id="set-up-the-django-project-locally">Set up the Django project locally</h2>

<h3 id="dockerfile">Dockerfile</h3>

<p>Add a <code class="language-plaintext highlighter-rouge">Dockerfile</code> in your Django project root with these contents:</p>

<figure class="highlight"><pre><code class="language-text" data-lang="text"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="code"><pre>FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
</pre></td></tr></tbody></table></code></pre></figure>

<p>Let’s decompose this <code class="language-plaintext highlighter-rouge">Dockerfile</code>.</p>

<p>In line 1 picks an image: <code class="language-plaintext highlighter-rouge">FROM python:3</code> instructs Docker to start with the <code class="language-plaintext highlighter-rouge">python:3</code> image. It’s common to see the “alpine” version for Python images. Alpine Linux is much smaller than most distribution base images, and leads to slimmer images in general. You can read more Python images and image variants about this <a href="https://hub.docker.com/_/python">here</a>.</p>

<p>Line 2 sets environment variable <code class="language-plaintext highlighter-rouge">PYTHONUNBUFFERED</code> to <code class="language-plaintext highlighter-rouge">1</code>. What is this? Normally, if you have a process piping data into your application, the terminal may buffer the data. The terminal keeps data in a reservoir until a size limit or a certain character (generally a newline or EOF) is reached. At that point it dumps the entire chunk of data into your application all at once. Same for output data and error data (<code class="language-plaintext highlighter-rouge">stdout</code> and <code class="language-plaintext highlighter-rouge">stderr</code>). This option asks the terminal not to use buffering. More detail on this option <a href="https://www.reddit.com/r/learnpython/comments/5ebkq6/what_does_pythonunbuffered1_do/dabf9bh/">here</a>.</p>

<p>The remaining instructions in lines 3-7:</p>
<ul>
  <li>create a <code class="language-plaintext highlighter-rouge">/code</code> directory at root level</li>
  <li>copies <code class="language-plaintext highlighter-rouge">requirements.txt</code> into it</li>
  <li>installs python packages (no virtualenv needed in the container to begin with)</li>
  <li>copies the full project directory into it</li>
</ul>

<p>So the <code class="language-plaintext highlighter-rouge">Dockerfile</code> above:</p>

<ol>
  <li>selects a base image for us</li>
  <li>configures it for us to run things on top of it by installing required packages and copying over our Django project code</li>
</ol>

<p>Neat!</p>

<p>Q: So how do we run this container?</p>

<p>A: We’ll use <code class="language-plaintext highlighter-rouge">docker-compose</code>.</p>

<p>Q: But the container above runs only Django. Don’t we need a container for Postgres?</p>

<p>A: We do not need to configure a Postgres container as Docker provides a <a href="https://hub.docker.com/_/postgres">docker image for Postgres</a> which we can just start up.</p>

<p>Q: Shall we write a shell script and execute a docker process on our local machine for both containers?</p>

<p>A: No. Docker provides <code class="language-plaintext highlighter-rouge">docker-compose</code> to prevent us from ending up at shell scripts hell.</p>

<h3 id="docker-compose">Docker compose</h3>

<p>The big advantage of a <code class="language-plaintext highlighter-rouge">docker-compose.yml</code> file is that it’s very readable.</p>

<p>Add this <code class="language-plaintext highlighter-rouge">docker-compose.yml</code> file in your Django project directory:</p>

<figure class="highlight"><pre><code class="language-text" data-lang="text"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre>version: '1'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=djangodb
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    container_name: django_web
    environment:
      - DATABASE_URL
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
</pre></td></tr></tbody></table></code></pre></figure>

<p>We have two “services”, <code class="language-plaintext highlighter-rouge">db</code> and <code class="language-plaintext highlighter-rouge">web</code>.</p>

<p><code class="language-plaintext highlighter-rouge">db</code> service runs the Postgres process inside a container which uses the <code class="language-plaintext highlighter-rouge">postgres</code> image.</p>

<p>The <code class="language-plaintext highlighter-rouge">POSTGRES_DB</code>, <code class="language-plaintext highlighter-rouge">POSTGRES_USER</code> and <code class="language-plaintext highlighter-rouge">POSTGRES_PASSWORD</code> are hardcoded in the <code class="language-plaintext highlighter-rouge">docker-compose.yml</code>. You can however configure them to use <a href="`https://docs.docker.com/compose/environment-variables/">environment variables</a> using a <code class="language-plaintext highlighter-rouge">.env</code> or <code class="language-plaintext highlighter-rouge">.envrc</code> file. This IMHO is not worth the effort if you’re doing this only for local testing.</p>

<p><code class="language-plaintext highlighter-rouge">web</code> service runs the <code class="language-plaintext highlighter-rouge">manage.py runserver</code> process inside the aptly named <code class="language-plaintext highlighter-rouge">django_web</code> container.</p>

<p>The instruction <code class="language-plaintext highlighter-rouge">build: .</code> tells Docker compose to use the <code class="language-plaintext highlighter-rouge">Dockerfile</code> located in this same directory to run the <code class="language-plaintext highlighter-rouge">web</code> service. It will run the service “within” the <code class="language-plaintext highlighter-rouge">django_web</code> container. Docs on <code class="language-plaintext highlighter-rouge">build</code> <a href="https://docs.docker.com/compose/compose-file/#build">here</a>.</p>

<p>The <code class="language-plaintext highlighter-rouge">command</code> runs Django’s <code class="language-plaintext highlighter-rouge">runserver</code> command and exposes it at the container’s port <code class="language-plaintext highlighter-rouge">8000</code>.</p>

<p>The <code class="language-plaintext highlighter-rouge">container_name</code> is a custom name you can append for clarity’s sake. We’ll see its effect when we run things in the next section.</p>

<p><code class="language-plaintext highlighter-rouge">environment</code> allows you to reuse environment variables from the host machine. More info on <a href="(/2020/05/31/django-environment-variables/)">managing environment variables for your Django project</a>. In this case <code class="language-plaintext highlighter-rouge">DATABASE_URL</code> environment variable is being reused.</p>

<p><code class="language-plaintext highlighter-rouge">volumes</code> is used to “mount” host paths. The basic usage in our context is the “share” the code on our machine with that on the <code class="language-plaintext highlighter-rouge">django_web</code> service container. Docs <a href="https://docs.docker.com/compose/compose-file/#volumes">here</a>.</p>

<p>Finally:</p>

<ul>
  <li>Lines 18-19 map the host machine’s port <code class="language-plaintext highlighter-rouge">8000</code> with the container’s port <code class="language-plaintext highlighter-rouge">8000</code>.</li>
  <li>Lines 20-21 enforce the <code class="language-plaintext highlighter-rouge">web</code> container dependency on the <code class="language-plaintext highlighter-rouge">db</code> container.</li>
</ul>

<p>Enough explanation! Let’s run things!</p>

<h2 id="make-it-run-on-your-local-docker-container">Make it run on your local Docker container</h2>

<p><em>Make sure your Docker Desktop is running.</em></p>

<p>Run <code class="language-plaintext highlighter-rouge">docker ps</code>, to list containers. Assuming you haven’t started any other containers, you shouldn’t see any. Your output should be the below:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
</code></pre></div></div>

<p>Run the below command to start the two containers as per your <code class="language-plaintext highlighter-rouge">docker-compose.yml</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker-compose up
</code></pre></div></div>

<p>The terminal output should end with the usual output of the Django <code class="language-plaintext highlighter-rouge">runserver</code> command:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>web_1  | Watching for file changes with StatReloader
web_1  | Performing system checks...
web_1  | 
web_1  | System check identified no issues (0 silenced).
web_1  | June 06, 2020 - 10:24:43
web_1  | Django version 3.0.6, using settings 'imgclicker.settings'
web_1  | Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.
</code></pre></div></div>

<p>Running <code class="language-plaintext highlighter-rouge">docker ps</code> now should show two containers:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
91f53455ce25        django_web          "python manage.py ru…"   59 seconds ago      Up 58 seconds       0.0.0.0:8000-&gt;8000/tcp   django_web
45b3091c0c62        postgres            "docker-entrypoint.s…"   59 seconds ago      Up 58 seconds       5432/tcp                 djangotest_db_1
</code></pre></div></div>

<p>Note that the output of the <code class="language-plaintext highlighter-rouge">NAMES</code> above depends on the name of the project’s directory. For example, since the <code class="language-plaintext highlighter-rouge">db</code> service container does not have a name, the resulting comtainer name is <code class="language-plaintext highlighter-rouge">djangtest_db1</code> because the project directory is <code class="language-plaintext highlighter-rouge">djangotest</code>.</p>

<p>In another terminal window/tab, log onto the “db” docker container:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker-compose exec db sh
</code></pre></div></div>

<p>Once logged in, open <code class="language-plaintext highlighter-rouge">psql</code> as user <code class="language-plaintext highlighter-rouge">postgres</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>su - postgres -c psql
</code></pre></div></div>

<p>And create the database:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CREATE DATABASE djangodb OWNER postgres;
</code></pre></div></div>

<p>Exit both <code class="language-plaintext highlighter-rouge">psql</code> and the <code class="language-plaintext highlighter-rouge">db</code> docker container.</p>

<p>Enter the web container:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker-compose exec web sh
</code></pre></div></div>

<p>Once logged in run:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./manage.py migrate
./manage.py createsuperuser
</code></pre></div></div>

<p>Refresh the site at <code class="language-plaintext highlighter-rouge">http://localhost:8000/admin/</code> and log in with the superuser you just created.</p>

<p>You can exit the <code class="language-plaintext highlighter-rouge">web</code> container. Let’s put a breakpoint.</p>

<h2 id="debug-time">Debug time!</h2>

<p class="message">Stop the previous <code class="language-plaintext highlighter-rouge">web</code> service before going on.</p>

<p>Hit the command to stop the process as you would with your local Django <code class="language-plaintext highlighter-rouge">runserver</code> process.</p>

<p>After doing so, running <code class="language-plaintext highlighter-rouge">docker ps</code> should should only show the <code class="language-plaintext highlighter-rouge">db</code> service running.</p>

<p>Update the code and put a breakpoint in one of your views. I used the IPython debugger <a href="https://pypi.org/project/ipdb/">ipdb</a>.</p>

<h3 id="rebuild-the-web-container">Rebuild the <code class="language-plaintext highlighter-rouge">web</code> container</h3>

<p>After changing the code, run the below to rebuild the <code class="language-plaintext highlighter-rouge">web</code> container, including dependencies:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker-compose up -d --no-deps --build web
</code></pre></div></div>

<p>Let’s decompose the above <code class="language-plaintext highlighter-rouge">docker-compose up</code> <a href="https://docs.docker.com/compose/reference/up/">command</a>:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">-d</code> or <code class="language-plaintext highlighter-rouge">--detach</code> means “Detached mode”, to run containers in the background</li>
  <li><code class="language-plaintext highlighter-rouge">--no-deps</code> instructs <code class="language-plaintext highlighter-rouge">docker-compose up</code> to not start linked services</li>
  <li><code class="language-plaintext highlighter-rouge">--build</code> instructs <code class="language-plaintext highlighter-rouge">docker-compose up</code> to build any required images before starting containers</li>
  <li><code class="language-plaintext highlighter-rouge">web</code> is the service for which I’m running <code class="language-plaintext highlighter-rouge">docker-compose up</code></li>
</ul>

<h3 id="debug">Debug!</h3>

<p>To debug using <code class="language-plaintext highlighter-rouge">ipdb</code>, use <code class="language-plaintext highlighter-rouge">docker-compose run</code>, docs <a href="https://docs.docker.com/compose/reference/run/">here</a>.</p>

<p>The flag <code class="language-plaintext highlighter-rouge">--service-ports web</code> makes the service <code class="language-plaintext highlighter-rouge">web</code> expose the necessary ports to be able debug:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker-compose run --service-ports web
</code></pre></div></div>

<p>If you run <code class="language-plaintext highlighter-rouge">docker ps</code> you should see that your <code class="language-plaintext highlighter-rouge">web</code> service is back up and running.</p>

<p>Access the URL where that would stop execution at your breakpoint. Since I’ve put my breakpoint at the home page, I see the terminal output below:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>System check identified no issues (0 silenced).
June 06, 2020 - 10:51:15
Django version 3.0.6, using settings 'imgclicker.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
&gt; /code/items/views.py(15)get_context_data()
     13         context = super().get_context_data(**kwargs)
     14         import ipdb; ipdb.set_trace()
---&gt; 15         return context

ipdb&gt; self.request                                                                                                                                                                                                                                            
&lt;WSGIRequest: GET '/'&gt;
</code></pre></div></div>

<p>Note that <code class="language-plaintext highlighter-rouge">/code/items/views.py</code> is the location of the module on the container, not on your local dev box.</p>

<p>Which means… that’s it, you’re debugging code running in your Docker service!</p>

<h2 id="conclusion">Conclusion</h2>

<p>This tutorial is aimed at getting you started and show you the basics. I provided pointers along the way if you want to dive deeper.</p>

<p>It doesn’t intend to show you all that can be done with Docker. Far from it.</p>

<p>The “tech ops” landscape is continuously changing. And I’m confident that many commands (or their arguments) will become outdated in no time.</p>

<p>I referred to this <a href="https://gist.github.com/katylava/3559c29160573488a7bbccb474b55356">gist</a> by Github user <a href="https://gist.github.com/katylava">katylava</a> to build the “docker structure” for this Django project. That helped a lot.</p>


guid: https://startcodingnow.com/?p=279
title: Lack of Volume Persistence in kartoza/postgis Docker Container
author: Start Coding now
url: https://startcodingnow.com/volume-persistence-in-kartoza-postgis-docker-container/
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
I have been working on a Django project that needs maps integration. I looked into using GeoDjango, but needed to upgrade my current Postgresql database to add PostGIS.&#8230;


guid: https://adamj.eu/tech/2020/06/08/check-multiple-tables-are-empty-in-sql
title: How to Check Multiple Tables Are Empty in SQL
author: Adam’s Tech Blog
url: https://adamj.eu/tech/2020/06/08/check-multiple-tables-are-empty-in-sql/
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<p>I encountered this problem recently for a <a href="https://code.djangoproject.com/ticket/31276">Django ticket</a> for speeding up part of Django’s test runner.
We have a list of tables to truncate.
How can we figure out which are already empty, so we can skip issuing a somewhat costly <code class="highlighter-rouge">TRUNCATE TABLE</code> on them?
You might think the database could skip <code class="highlighter-rouge">TRUNCATE TABLE</code> on empty tables, but it normally does work beyond removing the rows such as resetting auto-increment counters.
In MySQL, <code class="highlighter-rouge">TRUNCATE TABLE</code> is even <a href="https://dev.mysql.com/doc/refman/8.0/en/truncate-table.html">equivalent to <code class="highlighter-rouge">DROP TABLE</code> and <code class="highlighter-rouge">CREATE TABLE</code></a>, which requires removing and creating the table file on disk.</p>

<p>You might think the easiest way to find out which tables are empty would be to count the rows in each table:</p>

<figure class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">mariadb</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">&gt;</span> <span class="k">SELECT</span> <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">table1</span><span class="p">;</span>
<span class="o">+</span><span class="c1">----------+</span>
<span class="o">|</span> <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">----------+</span>
<span class="o">|</span>      <span class="mi">123</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">----------+</span>
<span class="mi">1</span> <span class="k">row</span> <span class="k">in</span> <span class="k">set</span> <span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="mi">002</span> <span class="n">sec</span><span class="p">)</span>

<span class="n">mariadb</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">&gt;</span> <span class="k">SELECT</span> <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">table2</span><span class="p">;</span>
<span class="o">+</span><span class="c1">----------+</span>
<span class="o">|</span> <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">----------+</span>
<span class="o">|</span>        <span class="mi">0</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">----------+</span>
<span class="mi">1</span> <span class="k">row</span> <span class="k">in</span> <span class="k">set</span> <span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="mi">001</span> <span class="n">sec</span><span class="p">)</span></code></pre></figure>

<p>This works, but it’s slow.
Database systems don’t keep a counter of the number of rows in each table, because the overhead to keep it consistent with transactions would be too high.
Therefore a <code class="highlighter-rouge">COUNT(*)</code> means touching every individual row, obtaining read locks on each of them.</p>

<p>Since we only care about seeing if the table is empty, if we find at least one row we know it’s not.
Therefore we can instead query for a single row:</p>

<figure class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">mariadb</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">id</span> <span class="k">FROM</span> <span class="n">table1</span> <span class="k">LIMIT</span> <span class="mi">1</span><span class="p">;</span>
<span class="o">+</span><span class="c1">------+</span>
<span class="o">|</span> <span class="n">id</span>   <span class="o">|</span>
<span class="o">+</span><span class="c1">------+</span>
<span class="o">|</span> <span class="mi">1234</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">------+</span>
<span class="mi">1</span> <span class="k">row</span> <span class="k">in</span> <span class="k">set</span> <span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="mi">000</span> <span class="n">sec</span><span class="p">)</span>

<span class="n">mariadb</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">id</span> <span class="k">FROM</span> <span class="n">table2</span> <span class="k">LIMIT</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">Empty</span> <span class="k">set</span> <span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="mi">000</span> <span class="n">sec</span><span class="p">)</span></code></pre></figure>

<p>This query returns an empty result set if the table is empty, or a single ID an arbitrary row otherwise.</p>

<p>We don’t care about the ID itself.
We can therefore select a static value instead:</p>

<figure class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">mariadb</span> <span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">&gt;</span> <span class="k">SELECT</span> <span class="mi">1</span> <span class="k">as</span> <span class="n">non_empty</span> <span class="k">FROM</span> <span class="n">table1</span> <span class="k">LIMIT</span> <span class="mi">1</span><span class="p">;</span>
<span class="o">+</span><span class="c1">-----------+</span>
<span class="o">|</span> <span class="n">non_empty</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">-----------+</span>
<span class="o">|</span>         <span class="mi">1</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">-----------+</span>
<span class="mi">1</span> <span class="k">row</span> <span class="k">in</span> <span class="k">set</span> <span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="mi">001</span> <span class="n">sec</span><span class="p">)</span>

<span class="n">mariadb</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="o">&gt;</span> <span class="k">SELECT</span> <span class="mi">1</span> <span class="k">as</span> <span class="n">non_empty</span> <span class="k">FROM</span> <span class="n">table2</span> <span class="k">LIMIT</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">Empty</span> <span class="k">set</span> <span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="mi">000</span> <span class="n">sec</span><span class="p">)</span></code></pre></figure>

<p>This query again returns an empty result set if the table is empty, or <code class="highlighter-rouge">1</code> if not.</p>

<p>We can use this technique against multiple tables at once using SQL’s <code class="highlighter-rouge">UNION</code> clause.
By selecting the table names as our static values, under the same column name, the combined result set will be a list of the non-empty tables:</p>

<figure class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">mariadb</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span><span class="o">&gt;</span> <span class="p">(</span><span class="k">SELECT</span> <span class="s1">'table1'</span> <span class="k">as</span> <span class="n">non_empty_tables</span> <span class="k">FROM</span> <span class="n">table1</span> <span class="k">LIMIT</span> <span class="mi">1</span><span class="p">)</span>
    <span class="o">-&gt;</span> <span class="k">UNION</span> <span class="p">(</span><span class="k">SELECT</span> <span class="s1">'table2'</span> <span class="k">as</span> <span class="n">non_empty_tables</span> <span class="k">FROM</span> <span class="n">table2</span> <span class="k">LIMIT</span> <span class="mi">1</span><span class="p">);</span>
<span class="o">+</span><span class="c1">------------------+</span>
<span class="o">|</span> <span class="n">non_empty_tables</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">------------------+</span>
<span class="o">|</span> <span class="n">table1</span>           <span class="o">|</span>
<span class="o">+</span><span class="c1">------------------+</span>
<span class="mi">1</span> <span class="k">row</span> <span class="k">in</span> <span class="k">set</span> <span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="mi">000</span> <span class="n">sec</span><span class="p">)</span></code></pre></figure>

<p>You can <code class="highlighter-rouge">UNION</code> many such queries together - databases tend to have a limit on query length or opened tables, but it’s quite high.</p>

<p>And this is the fastest way I can think of for checking which tables in a list are empty, accurately.</p>

<h2 id="what-about-information_schema">What about INFORMATION_SCHEMA?</h2>

<p>I should mention <code class="highlighter-rouge">INFORMATION_SCHEMA.TABLES</code>, the <a href="https://en.wikipedia.org/wiki/Information_schema">information schema</a> metadata table-of-tables.
In theory this is the right place to ask meta-level questions about your tables, including which ones are empty.</p>

<p>On MariaDB/MySQL, this <a href="https://mariadb.com/kb/en/information-schema-tables-table/">includes a <code class="highlighter-rouge">table_rows</code> column</a> that you could use to check which tables are empty.
Unfortunately it’s only an estimate, so you might get false positives or negatives.
Other databases have similar estimates, such as <a href="https://stackoverflow.com/questions/12479677/sql-server-count-is-slow">SQL Server’s <code class="highlighter-rouge">sys.partitions.rows</code></a>, but I believe they all carry risks of false positives and negatives.</p>

<h2 id="fin">Fin</h2>

<p>Hope this helps,</p>

<p>—Adam</p>


guid: https://learndjango.com/tutorials/hello-world-5-different-ways
title: Hello, World 5 Different Ways
author: LearnDjango.com
url: https://learndjango.com/tutorials/hello-world-5-different-ways
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
Django is a "batteries-included" framework that comes with built-in scaffolding provided by the `startproject` command and the general concepts of apps. But, actually, Django provides incredible flexibility if desired around …


guid: 20e9cc9d-832c-4aa9-92fa-1cac214d8ff1
title: Python Crash Course - Eric Matthes
author: DjangoChat
url: https://djangochat.com/episodes/python-crash-course-eric-matthes-qYaxaRwG
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<ul><li>Python Crash Course, Second Edition Book <a href="https://nostarch.com/pythoncrashcourse2e">https://nostarch.com/pythoncrashcourse2e</a></li><li>Python Crash Course website <a href="https://ehmatthes.github.io/pcc_2e/">https://ehmatthes.github.io/pcc_2e/</a></li><li>Python Crash Course Cheat Sheets <a href="https://ehmatthes.github.io/pcc_2e/cheat_sheets/cheat_sheets/">https://ehmatthes.github.io/pcc_2e/cheat_sheets/cheat_sheets/</a></li><li>Python Flash Cards <a href="https://nostarch.com/pythonflashcards">https://nostarch.com/pythonflashcards</a></li><li><a href="https://learndjango.com/tutorials/hello-world-5-different-ways">Django Homepage 5 Different Ways</a></li><li>DjangoCon 2019 - Using Django as a Micro-Framework by Carlton Gibson <a href="https://youtu.be/w9cYEovduWI">https://youtu.be/w9cYEovduWI</a></li><li>Django Microframework Github repo <a href="https://github.com/wsvincent/django-microframework">https://github.com/wsvincent/django-microframework</a></li></ul>


guid: https://adamj.eu/tech/2020/06/11/avoid-hardcoding-ids-in-your-tests
title: Avoid Hardcoding ID's in Your Tests
author: Adam’s Tech Blog
url: https://adamj.eu/tech/2020/06/11/avoid-hardcoding-ids-in-your-tests/
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<p>This is a test anti-pattern I’ve seen creep in on many Django test suites.
I know of several large projects where it became a <em>major</em> undertaking to undo it.
The good news is it’s easy to avoid adding it when you first write your tests. 🙂</p>

<p>Take this test:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="kn">from</span> <span class="nn">http</span> <span class="kn">import</span> <span class="n">HTTPStatus</span>

<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>

<span class="kn">from</span> <span class="nn">example.core.models</span> <span class="kn">import</span> <span class="n">Book</span>


<span class="k">class</span> <span class="nc">BookViewTests</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">test_view</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">book</span> <span class="o">=</span> <span class="n">Book</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">"Meditations"</span><span class="p">)</span>

        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">"/books/1/"</span><span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">HTTPStatus</span><span class="o">.</span><span class="n">OK</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">assertContains</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="p">,</span> <span class="n">book</span><span class="o">.</span><span class="n">title</span><span class="p">)</span></code></pre></figure>

<p>It creates a book object in the database, retrieves the associated page, and checks the response looks correct.</p>

<p>In all likelihood this test will pass, at least initially.
The test database should be empty at the start, the database will assign the new book ID 1, and when the test fetches the URL “/books/1/” the view finds the correct book.</p>

<p>Unfortunately, many potential changes to the project will break the ID = 1 assumption.
For example, if you create some “default books” in a <code class="highlighter-rouge">post_migrate</code> signal handler (as I <a href="/tech/2019/08/07/how-to-add-database-modifications-beyond-migrations-to-your-django-project/">covered previously</a>), the book in the test will be given a different ID.
Also, whilst databases tend to be predictable, they often don’t guarantee that future versions or configuration changes won’t ever affect ID generation.</p>

<h2 id="the-fix">The Fix</h2>

<p>The fix is relatively straightforward: stop hardcoding the ID in the URL, and instead template it.
Python 3.6’s f-strings make this fluent.
The above test would only need changing where it fetches the response:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">f</span><span class="s">"/books/{book.id}/"</span><span class="p">)</span></code></pre></figure>

<p>This change is straightforward, and it clarifies where the number in the URL comes from.</p>

<h2 id="other-forms">Other Forms</h2>

<p>This problem is also not specific to Django, <code class="highlighter-rouge">Model</code>s, or <code class="highlighter-rouge">AutoField</code>s.
It can appear anywhere that you use a data generator in your tests, when you predict its output unnecessarily.
For example:</p>

<ul>
  <li>other fields’ defaults.</li>
  <li>other database libraries such as SQL Alchemy.</li>
  <li>other kinds of data store.</li>
</ul>

<p>Keep an eye out for it.</p>

<h2 id="preventative-measures">Preventative Measures</h2>

<p>You can guard against this problem by making your <code class="highlighter-rouge">AutoField</code> ID’s less predictable, each starting at a higher number than 1.
Using a different, large offset for each table can also prevent bugs where you mix up ID’s between models, or mix up list indices and ID’s.</p>

<p>I first saw this recommendation in the Phabricator team’s blog post <a href="https://secure.phabricator.com/book/phabflavor/article/things_you_should_do_now/#start-ids-at-a-gigantic-number">Things You Should Do Now</a>.</p>

<p>You can change a table’s ID offset with an <code class="highlighter-rouge">ALTER</code> query.
The SQL is database specific:</p>

<ul>
  <li>On MariaDB/MySQL, <a href="https://mariadb.com/kb/en/auto_increment/#setting-or-changing-the-auto_increment-value">it’s <code class="highlighter-rouge">ALTER TABLE ... AUTO_INCREMENT=n</code></a>.</li>
  <li>On PostgreSQL, <a href="https://www.postgresql.org/docs/current/sql-altersequence.html">it’s <code class="highlighter-rouge">ALTER SEQUENCE ... RESTART WITH n</code></a>.
You’ll need to figure out the sequence names for the tables though.</li>
  <li>On SQLite, I’m not sure - it looks a bit hairy.
The best source I found was <a href="https://stackoverflow.com/a/26332544/1427135">this Stack Overflow post</a> which covers changing some internal tables.</li>
  <li>On Oracle, you’re on your own.
I haven’t even researched it :)</li>
</ul>

<p>If you want to do this for tests only, you can do it in a custom test runner.
There you can override Django’s default test database creation and add extra behaviour.
For example, for MariaDB/MySQL, and presuming you only have one database:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c1"># example/test/runner.py
</span><span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span>

<span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">connection</span>
<span class="kn">from</span> <span class="nn">django.test.runner</span> <span class="kn">import</span> <span class="n">DiscoverRunner</span>


<span class="k">class</span> <span class="nc">ExampleTestRunner</span><span class="p">(</span><span class="n">DiscoverRunner</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">setup_databases</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="n">databases</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">setup_databases</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
        <span class="k">with</span> <span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span> <span class="k">as</span> <span class="n">cursor</span><span class="p">:</span>
            <span class="n">table_names</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">introspection</span><span class="o">.</span><span class="n">django_table_names</span><span class="p">(</span>
                <span class="n">only_existing</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">include_views</span><span class="o">=</span><span class="bp">False</span>
            <span class="p">)</span>
            <span class="k">for</span> <span class="n">table_name</span> <span class="ow">in</span> <span class="n">table_names</span><span class="p">:</span>
                <span class="n">quoted_name</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">quote_name</span><span class="p">(</span><span class="n">table_name</span><span class="p">)</span>
                <span class="n">start</span> <span class="o">=</span> <span class="n">randint</span><span class="p">(</span><span class="mi">1_000</span><span class="p">,</span> <span class="mi">10_000</span><span class="p">)</span>
                <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
                    <span class="n">f</span><span class="s">"ALTER TABLE {quoted_name} AUTO_INCREMENT={start}"</span>
                <span class="p">)</span>
        <span class="k">return</span> <span class="n">databases</span></code></pre></figure>

<p>You can use this runner by setting the <a href="https://docs.djangoproject.com/en/3.0/ref/settings/#std:setting-TEST_RUNNER"><code class="highlighter-rouge">TEST_RUNNER</code> setting</a>:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="n">TEST_RUNNER</span> <span class="o">=</span> <span class="s">"example.test.runner.ExampleTestRunner"</span></code></pre></figure>

<p>Notes on the implementation:</p>

<ul>
  <li>
    <p>It uses the undocumented <code class="highlighter-rouge">introspection.django_table_names()</code> method to get the list of tables.
Although a simple method, this might change between Django versions (tested on version 3.0).</p>
  </li>
  <li>
    <p>For each table, a random offset is generated with <code class="highlighter-rouge">randint()</code>.
This is then used in an <code class="highlighter-rouge">ALTER TABLE ... AUTO_INCREMENT=</code> query.
The query doesn’t use the normal SQL escaping because the table name is already escaped with <code class="highlighter-rouge">quote_name()</code>, and <code class="highlighter-rouge">start</code> will only be an integer.</p>
  </li>
</ul>

<h2 id="fin">Fin</h2>

<p>I hope this helps you avoid and prevent this common test issue,</p>

<p>—Adam</p>


guid: https://www.mattlayman.com/building-saas/view-from-start-to-finish/
title: A View From Start To Finish - Building SaaS #60
author: Matt Layman's Website
url: https://www.mattlayman.com/building-saas/view-from-start-to-finish/
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
In this episode, I created a view to add students from beginning to the end. I used Error Driven Development to guide what I needed to do next to make the view, then wrote tests, and finished it all off by writing the template code.
At the start of the episode, I gave a quick overview of the models in my application and which models I planned to focus on for the stream.


guid: https://django-news.com/issues/27
title: Django News - Virtual DjangoCon Europe - Jun 12th 2020
author: Django News
url: https://django-news.com/issues/27
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<h3>News</h3>
      
        <h4><a href="https://cur.at/rXrYoit?m=rss">DjangoCon Europe 2020 goes virtual</a></h4>
        <blockquote><p>The virtual conference will take place on September 18-19 (Friday and Saturday).</p></blockquote>
          <p><a href="https://cur.at/rXrYoit?m=rss">djangocon.eu</a></p>
      
        <h4><a href="https://cur.at/mzJvVf7?m=rss">Django Forum - Tailwind CSS Advice</a></h4>
        <p>The Django Forum is a great place to ask Django-specific questions and hear from the experts. This thread was on Tailwind and Jeff responded. We encourage everyone to give the Forum a shot!</p>
          <p><a href="https://cur.at/mzJvVf7?m=rss">djangoproject.com</a></p>
      <h3>Articles</h3>
      
        <h4><a href="https://cur.at/lnk4M4j?m=rss">Stop Using datetime.now!</a></h4>
        <p>A look at time and practical dependency injection in Python &amp; Django.</p>
          <p><a href="https://cur.at/lnk4M4j?m=rss">hakibenita.com</a></p>
      
        <h4><a href="https://cur.at/wDC7mhE?m=rss">Python Crash Course - Recommended Django Resources</a></h4>
        <p>A curated list of Django resources from the author of <em>Python Crash Course</em>.</p>
          <p><a href="https://cur.at/wDC7mhE?m=rss">github.io</a></p>
      
        <h4><a href="https://cur.at/3WxJYdX?m=rss">Django&#39;s Git flow</a></h4>
        <p>The author, Sage Abdullah, was a 2019 Google Summer of Code student and here writes on how Django uses git with the official codebase.</p>
          <p><a href="https://cur.at/3WxJYdX?m=rss">laymonage.com</a></p>
      
        <h4><a href="https://cur.at/xZt51ES?m=rss">Avoid Hardcoding ID&#39;s in Your Tests</a></h4>
        <p>An elegant way to prevent a common Django testing issue.</p>
          <p><a href="https://cur.at/xZt51ES?m=rss">adamj.eu</a></p>
      <h3>Sponsored Link</h3>
          <a rel="nofollow" href="https://cur.at/LSKQLd9?m=rss"><img title="Two Scoops of Django 3.x: Best Practices for the Django Web Framework" alt="" width="420" src="https://dxj7eshgz03ln.cloudfront.net/production/link/image/546537/original_ratio_medium_c402b977-8ae9-4629-8d49-af41b5fb5f12.jpg" /></a>

        <h4><a href="https://cur.at/LSKQLd9?m=rss">Two Scoops of Django 3.x: Best Practices for the Django Web Framework</a></h4>
        <p>The long-awaited update covers various tips, tricks, patterns, code snippets, and techniques of Django best practices.</p>
          <p><a href="https://cur.at/LSKQLd9?m=rss">feldroy.com</a></p>
      <h3>Podcasts</h3>
      
        <h4><a href="https://cur.at/aadNFfw?m=rss">Django Chat #67 - Python Crash Course with Eric Matthes</a></h4>
        <p>Eric is the author of <em>Python Crash Course</em>, the bestselling Python book in the world. We discuss his background as a high school teacher, attending PyCon for the first time, and his current projects.</p>
          <p><a href="https://cur.at/aadNFfw?m=rss">djangochat.com</a></p>
      <h3>Tutorials</h3>
      
        <h4><a href="https://cur.at/svXmWxX?m=rss">Django Stripe Tutorial</a></h4>
        <p>Learn how to configure a new Django website from scratch to accept one-time payments with Stripe Checkout.</p>
          <p><a href="https://cur.at/svXmWxX?m=rss">testdriven.io</a></p>
      
        <h4><a href="https://cur.at/zWTz0yj?m=rss">Django Channels and React: a match made in heaven</a></h4>
        <p>How to consume a websockets backend powered by Django Channels with a React and Zurb Foundation frontend.</p>
          <p><a href="https://cur.at/zWTz0yj?m=rss">fullstackdjango.com</a></p>
      
        <h4><a href="https://cur.at/4nv0LPE?m=rss">Hello, World 5 Different Ways</a></h4>
        <p>A Django homepage implemented five different ways.</p>
          <p><a href="https://cur.at/4nv0LPE?m=rss">learndjango.com</a></p>
      
        <h4><a href="https://cur.at/2ZJkI1E?m=rss">Using Graphene to setup GraphQL queries with Django</a></h4>
        <p>How to use GraphQL with Django to set up a schema and a single endpoint for all your data, using graphene and graphene_django.</p>
          <p><a href="https://cur.at/2ZJkI1E?m=rss">bitsacm.in</a></p>
      <h3>Projects</h3>
      
        <h4><a href="https://cur.at/GK7tDVJ?m=rss">aaugustin/django-sequences</a></h4>
        <p>Generate gapless sequences of integer values.</p>
          <p><a href="https://cur.at/GK7tDVJ?m=rss">github.com</a></p>
      
        <h4><a href="https://cur.at/P0vr5wq?m=rss">Official Python website</a></h4>
        <p>The official python.org website is written in Django and open-source!</p>
          <p><a href="https://cur.at/P0vr5wq?m=rss">github.com</a></p>
      <h3>Events</h3>
      
        <h4><a href="https://cur.at/dkDm5O8?m=rss">Python Web Conf 2020</a></h4>
        <p>While not strictly Django, Python Web Conf 2002 is next week and has several Django talks and tutorials.</p>
          <p><a href="https://cur.at/dkDm5O8?m=rss">pythonwebconf.com</a></p>
      <h3>Shameless Plugs</h3>
      
        <h4><a href="https://cur.at/Prgz0mv?m=rss">LearnDjango.com - Free tutorials and premium books</a></h4>
        <p></p>
          <p><a href="https://cur.at/Prgz0mv?m=rss">learndjango.com</a></p>
  <hr>
  <p>
    This RSS feed is published on
    <a href="https://django-news.com/">https://django-news.com/</a>.
    You can also subscribe
    <a href="https://django-news.com/#cta-newsletter">via email</a>.
  </p>


guid: https://www.pyscoop.com/?p=433
title: Write JSON APIs In Pure Django For Beginners
author: Gaurav Jain
feedurl: https://www.djangoproject.com/rss/community/blogs/
url:
https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners/?utm_source=rss&utm_medium=rss&utm_campaign=write-json-apis-in-pure-django-for-beginners

content:
<div style='display:none;' class='shareaholic-canvas' data-app='share_buttons' data-title='Write JSON APIs In Pure Django For Beginners' data-link='https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners/' data-summary='Learn how to build JSON based RESTful APIs using Django without using DjangoRestFramework.' data-app-id-name='category_above_content'></div>
<p>In this tutorial, we are going to build a few JSON based CRUD(Create, Read, Update, Delete) APIs in Django without using any additional library such as DjangoRestFramework or Tastypie. This tutorial will be posted in two parts-<br>&#8211; <a href="https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners/">Writing JSON APIs In Pure Django For Beginners &#8211; Part 1</a><br>&#8211; <a rel="noreferrer noopener" href="https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners-part-2/" target="_blank">Writing JSON APIs In Pure Django For Beginners &#8211; Part 2</a></p>



<h2>Install &amp; Setup</h2>



<p><strong>1.  Install Django</strong></p>



<p><em>This tutorial is based on Python3.7 and Django 3.0. So please make sure you have Python3.7 or later and Django 3.0 or later installed in your system</em>.</p>



<p>Install pip <a rel="noreferrer noopener" href="https://pip.pypa.io/en/stable/installing/" target="_blank">from here</a> if you haven&#8217;t already, skip otherwise. Once pip installed, you can install Django using pip. (you might need to run the command with sudo if you are not using virtualenv)</p>



<pre class="wp-block-code"><code class="">gaurav@gaurav$ pip install django==3.0</code></pre>



<p>You can also <em><a rel="noreferrer noopener" href="https://docs.djangoproject.com/en/dev/topics/install/" target="_blank">Follow the detailed installation instructions here</a></em> if you face any issue.</p>



<p><strong>2. Create and setup the project</strong></p>



<p>First, we need to set up the project. For that, you can simply follow the below instructions to get everything ready. </p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">gaurav@gaurav$ django-admin startproject pyscoop
gaurav@gaurav$ cd pyscoop
gaurav@gaurav$ python manage.py startapp myapp
gaurav@gaurav$ python manage.py migrate</code></pre>



<pre class="wp-block-code"><code lang="bash" class="language-bash">  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK</code></pre>



<pre class="wp-block-code"><code lang="bash" class="language-bash">gaurav@gaurav$ pyscoop python manage.py createsuperuser
Username (leave blank to use 'gaurav.jain'):
Email address:
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.</code></pre>



<pre class="wp-block-code"><code lang="bash" class="language-bash">gaurav@gaurav$ python manage.py runserver</code></pre>



<pre class="wp-block-code"><code lang="bash" class="language-bash">Watching for file changes with StatReloader
Performing system checks…

System check identified no issues (0 silenced).
June 12, 2020 - 06:51:26
Django version 3.0.6, using settings 'pyscoop.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.</code></pre>



<p>Visit: <a href="http://127.0.0.1:8000/admin/" target="_blank" rel="noreferrer noopener">http://127.0.0.1:8000/admin/</a> and login with the superuser credentials that you created above. </p>



<figure class="wp-block-image size-large"><img src="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-10.53.07-AM-1024x354.png" alt="" class="wp-image-437" srcset="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-10.53.07-AM-1024x354.png 1024w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-10.53.07-AM-300x104.png 300w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-10.53.07-AM-768x266.png 768w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-10.53.07-AM-1536x532.png 1536w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-10.53.07-AM-640x222.png 640w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-10.53.07-AM.png 1924w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>If you are able to see this page that means the initial setup is successfully completed. Now, we can jump straight on writing APIs.</p>



<p>Take a moment to understand couple of things we did here.</p>



<ul><li>Created a basic Django project structure using standard commands provided by Django</li><li>Created Table in the database for existing migrations that comes with Django. This will create <strong>user</strong>, <strong>auth</strong>, <strong>session</strong>, <strong>admin</strong> and <strong>contenttypes</strong> table in the database. Note that we never provided the database information in the project. in that case, Django by default creates an SQLite database file in the project root directory with the name <strong>db.sqlite3</strong>. In a real-world application, you would be using MySQL, PostgreSQL or other production-grade SQL database. for the sake of this tutorial and to keep it simple, we&#8217;ll use SQLite DB. If you want to change the database, you can do so by updating the <strong>DATABASES</strong> variable in <strong>pyscoop/settings.py</strong> file. <a href="https://docs.djangoproject.com/en/dev/ref/settings/#databases" target="_blank" rel="noreferrer noopener">Read more about DB settings here</a>.</li><li>Then Created a superuser to access the Admin page to see the inserted data in the database. you can also use other SQL GUI clients to see the data. </li><li>Finally started the local server on a default port 8000 and accessed admin page to verify the setup.</li></ul>



<h2>2. Writing a simple API</h2>



<p>Lets first write a simple API that gives us a hardcoded JSON response. Once we are familiar with that, we&#8217;ll write API that actually gets the data from the DataBase. Further, we&#8217;ll write API to update/delete the data in the database as well. Let&#8217;s begin!</p>



<p>Go ahead and open the <strong>mpapp/views.py</strong> file and copy the below code.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from django.http import JsonResponse

def my_api_view(request):
    data = {
        'name': request.user.username,  # username of current logged-in user, otherwise Anonymous
        'url': 'https://www.pyscoop.com/',
        'skills': ['Python', 'Django'],
    }
    return JsonResponse(data)</code></pre>



<p>We created a view(function) which accept the request parameter and return the response. Inside the view, we created a dictionary object that we want to return and passed this dictionary to JsonResponse class provided by Django. <br>Next step is to create a URL/endpoint that we can use to access this view. To do that we create a new file called <strong>urls.py</strong> inside the <strong>myapp</strong> directory. Copy the below code in the file <strong>myapp/urls.py</strong>.</p>



<pre title="" class="wp-block-code"><code lang="python" class="language-python">from django.urls import path

from .views import my_api_view

urlpatterns = [
    path('awesome-api/', my_api_view),
]</code></pre>



<p>We imported the view created in the first step. We also created a URL path and pointed to the view we just imported. Simply this means whenever someone visit <strong>/awesome-api/</strong> it will execute the <strong>my_api_view</strong> function. However, as you get an in-depth understanding of the Django you will find out that there are number of middlewares gets hit before the view when you hit the URL but we don&#8217;t have to worry about that in this tutorial.</p>



<p>The last thing that we want to do that is to tell Django to register the URL we just created and for that we need to include the URL file that we just created above. Open the file pyscoop/urls.py and you will see there are already admin URLs imported. Remove all the lines and copy the below code.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls'))
]</code></pre>



<p>We added 1 line <strong>path(&#8221;, include(&#8216;myapp.urls&#8217;))</strong> in the urlpatterns list after the admin url.</p>



<p>Now visit the URL <a href="http://127.0.0.1:8000/awesome_api/" target="_blank" rel="noreferrer noopener">http://127.0.0.1:8000/awesome_api/</a> in your browser, you should be able to see the content similar to below.</p>



<pre class="wp-block-code"><code lang="json" class="language-json">{
  "name": "gaurav.jain",
  "url": "https://www.pyscoop.com/",
  "skills": [
    "Python",
    "Django"
  ]
}</code></pre>



<p>If you are not logged in then you will see empty value in the name field. You can use curl to identify the request headers. open and new tab on the terminal and execute <strong>curl -i http://127.0.0.1:8000/awesome_api/</strong>, you should be able to see similar content as below.  </p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">gaurav@gaurav$ curl -i http://127.0.0.1:8000/awesome_api/
HTTP/1.1 200 OK
Date: Fri, 12 Jun 2020 08:00:29 GMT
Server: WSGIServer/0.2 CPython/3.7.4
Content-Type: application/json
X-Frame-Options: DENY
Content-Length: 79
Vary: Cookie
X-Content-Type-Options: nosniff

{"name": "gaurav.jain", "url": "https://www.pyscoop.com/", "skills": ["Python", "Django"]}</code></pre>



<p>if you look closely you will see the value of <strong>Content-Type</strong> header which is <strong>application/json</strong>.</p>



<p>Congratulations! You just created your first JSON API using Django.</p>



<p>This is the simplest approach you can take to build an API using a function. This makes sense when you have APIs with minimal logic but in reality, APIs are much more complex and writing all the logic in the view function become cumbersome. To overcome, to a certain extent, we can use <a rel="noreferrer noopener" href="https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/" target="_blank">Class based View</a>. For example, if we want to write the same API using Class based view, we can write &#8211; </p>



<pre class="wp-block-code"><code lang="python" class="language-python">from django.views import View

class MyAPIView(View):
    def get(self, request):
        data = {
            'name': request.user.username,  # username of current logged-in user, otherwise Anonymous
            'url': 'https://www.pyscoop.com/',
            'skills': ['Python', 'Django'],
        }

        return JsonResponse(data)</code></pre>



<p>And in the <strong>myapp/urls.py</strong>, we&#8217;ll use </p>



<pre class="wp-block-code"><code lang="python" class="language-python">from django.urls import path

from .views import MyAPIView

urlpatterns = [
    path('awesome_api/', MyAPIView.as_view()),
]</code></pre>



<p>You might be saying &#8220;<em><span class="has-inline-color has-primary-color">but this is more complicated than the one we created earlier</span>&#8220;</em>. I agree, Surely it looks, but don&#8217;t forget, that was just a dumb API which always returns the almost same response. In a real application using class based view can save you much more time and headache. A class based view has some advantages over a function-based view. We won&#8217;t go into those details, you can see the pros/cons <a rel="noreferrer noopener" href="https://stackoverflow.com/questions/14788181/class-based-views-vs-function-based-views" target="_blank">here</a>.</p>



<p>Let&#8217;s move ahead and build a dynamic API to get a more clear picture.</p>



<h2>3. Writing a dynamic API</h2>



<p>Let&#8217;s create a simple table for Book with three columns- title, author &amp; price. In Django, this is done in 3 steps.<br>1. Create/Update models.<br>2. Create migration file for created/updated model in the above line<br>3. Apply the migration to reflect changes at the database level.</p>



<p>Let&#8217;s go through each step one by one. <br>1) Copy the below content in the <strong>myapp/models.py</strong></p>



<pre class="wp-block-code"><code lang="python" class="language-python">from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.CharField(max_length=127)
    price = models.IntegerField()</code></pre>



<p>In <strong>pyscoop/settings.py</strong> file, find the variable <strong>INSTALLED_APPS</strong> and append <strong>myapp</strong> to the list as below. This is required for migration.</p>



<pre class="wp-block-code"><code lang="python" class="language-python"># Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]</code></pre>



<p>2) Create a migration file for newly created Book model.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">gaurav@gaurav$ python manage.py makemigrations myapp</code></pre>



<p>This will create a file <strong>myapp/migrations/0001_initial.py</strong> which Django use to create or update database.</p>



<p>3) Apply the migration</p>



<pre class="wp-block-code"><code lang="python" class="language-python">gaurav@gaurav$ python manage.py migrate</code></pre>



<p>4) This step is not necessary but to manage book data from the admin page, we need to register the Book model with the admin. Add below code in the <strong>myapp/admin.py</strong> file.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from django.contrib import admin
from .models import Book

admin.site.register(Book)</code></pre>



<p>Now, if start the server again using <strong>python manage.py runserver</strong> and visit the admin page <a href="http://127.0.0.1:8000/admin/" target="_blank" rel="noreferrer noopener">http://127.0.0.1:8000/admin/</a>. You should be able to see the Books section. If you click on this, you will find 0 books there, thats because we haven&#8217;t created any book yet so let&#8217;s do that first. Add a new book by clicking <strong>ADD BOOK</strong> button, Fill in the details and Save it.</p>



<figure class="wp-block-image size-large"><img src="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-2.57.22-PM-1024x302.png" alt="" class="wp-image-448" srcset="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-2.57.22-PM-1024x302.png 1024w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-2.57.22-PM-300x88.png 300w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-2.57.22-PM-768x226.png 768w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-2.57.22-PM-1536x453.png 1536w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-2.57.22-PM-2048x604.png 2048w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-2.57.22-PM-640x189.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Similarly, add another book from the Admin page. At this point we should have 2 book objects in the database, we can verify this by visiting <a rel="noreferrer noopener" href="http://127.0.0.1:8000/admin/myapp/book/" target="_blank">http://127.0.0.1:8000/admin/myapp/book/</a> page.</p>



<p>Time to write an API which returns all the book from the database.</p>



<p>Add below code in the <strong>myapp/views.py </strong>file just below the code you have written previously.</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">from .models import Book

class BookView(View):
    def get(self, request):
        books_count = Book.objects.count()  # TOTAL books in the database
        books = Book.objects.all()  # Get all book objects from the database

        data = {
            'books': books,
            'count': books_count,
        }
        return JsonResponse(data)</code></pre>



<p>And as you remember, earlier in this tutorial, we created a URL path to attach with a view. We are going to do the same with the new view <strong>BookView</strong>. Open the <strong>myapp/urls.py</strong> file and replace the previous code with below code.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from django.urls import path

from .views import MyAPIView, BookView  # Note the import of `BookView` view

urlpatterns = [
    path('awesome_api/', MyAPIView.as_view()),
    path('books/', BookView.as_view()),
]</code></pre>



<p>If you call the API <a rel="noreferrer noopener" href="http://127.0.0.1:8000/books/" target="_blank">http://127.0.0.1:8000/books/</a>, you will get an Error saying <em><span class="has-inline-color has-dark-gray-color">Object of type QuerySet is not JSON serializable</span></em>. That&#8217;s because we are trying to send the book objects directly without serializing them. There are many ways to serialize Django object or a queryset. Some of them are &#8211;</p>



<ol><li>Manually serialize the object fields individually and prepare the response data.</li><li>Use inbuilt serializer to serialize the object.</li><li>Use third-party libraries such as <a rel="noreferrer noopener" href="https://www.django-rest-framework.org/" target="_blank">DjangoRestFramework</a>.</li></ol>



<p>Since we want to do everything in Pure Django, we&#8217;ll not talk about the 3rd option.</p>



<ol><li><strong>Manually Serialize the object.</strong></li></ol>



<pre class="wp-block-code"><code lang="python" class="language-python">class BookView(View):
    def get(self, request):
        books_count = Book.objects.count()  # TOTAL books in the database
        books = Book.objects.all()  # Get all book objects from the database

        books_serialized_data = []  # to store serialized data
        for book in books:
            books_serialized_data.append({
                'book_title': book.title,
                'author_name': book.author,
                'book_price': book.price,
            })

        data = {
            'books': books_serialized_data,
            'count': books_count,
        }
        return JsonResponse(data)</code></pre>



<p>Add this code to your view and visit the URL (<a rel="noreferrer noopener" href="http://127.0.0.1:8000/books/" target="_blank">http://127.0.0.1:8000/books/</a>) again, you should be able to see the below response.</p>



<pre class="wp-block-code"><code lang="json" class="language-json">{
    "books": [
        {
            "book_title": "Book title 1",
            "author_name": "Book author",
            "book_price": 100
        },
        {
            "book_title": "Book title 2",
            "author_name": "Book author 2",
            "book_price": 120
        }
    ],
    "count": 2
}</code></pre>



<p>This can be tedious if you have large tables and your views can get messy. You can also use <strong>value_list</strong> method on the queryset to get rid of manually serializing data but that may not be sufficient for the applications which have complex relations between tables.</p>



<p><strong>2. Using inbuilt serializer</strong></p>



<pre class="wp-block-code"><code lang="python" class="language-python">from django.core.serializers import serialize  # import serializer from django 

class BookView(View):
    def get(self, request):
        books_count = Book.objects.count()  # TOTAL books in the database
        books = Book.objects.all()  # Get all book objects from the database

        # Provide the serialize type such as python, json, xml, yaml, etc.
        # Here we are using 'python' because JsonResponse will automatically convert it to 'json'
        books_serialized_data = serialize('python', books)

        data = {
            'books': books_serialized_data,
            'count': books_count,
        }
        return JsonResponse(data)</code></pre>



<p>And that&#8217;s it! Visit the API(<a rel="noreferrer noopener" href="http://127.0.0.1:8000/books/" target="_blank">http://127.0.0.1:8000/books/</a>) again.</p>



<pre class="wp-block-code"><code lang="json" class="language-json">{
    "books": [
        {
            "model": "myapp.book",
            "pk": 1,
            "fields": {
                "title": "Book title 1",
                "author": "Book author",
                "price": 100
            }
        },
        {
            "model": "myapp.book",
            "pk": 2,
            "fields": {
                "title": "Book title 2",
                "author": "Book author 2",
                "price": 120
            }
        }
    ],
    "count": 2
}</code></pre>



<p>But the problem is it comes with extra fields that we might not want to expose to users. You can definitely customize the serialized data by removing those fields. I encourage you to play with this and customize the data as per your wish. This can be a good exercise for you to get familiar with Django.<br>You can read more about this <a rel="noreferrer noopener" href="https://docs.djangoproject.com/en/3.0/topics/serialization/" target="_blank">here</a> and <a rel="noreferrer noopener" href="https://stackoverflow.com/questions/9403120/getting-django-to-serialize-objects-without-the-fields-field" target="_blank">here.</a></p>



<p>Great! At this point we have our GET api ready which returns all the book data. </p>



<p><em>Note that in a production application you have to take care of <a rel="noreferrer noopener" href="https://docs.djangoproject.com/en/dev/topics/pagination/" target="_blank">pagination</a>, <a rel="noreferrer noopener" href="https://docs.djangoproject.com/en/dev/topics/auth/default/#authentication-in-web-requests" target="_blank">authentication</a>, <a href="https://docs.djangoproject.com/en/3.0/topics/pagination/"></a><a rel="noreferrer noopener" href="https://docs.djangoproject.com/en/dev/topics/auth/default/#permissions-and-authorization" target="_blank">permissions-and-authorization</a>, etc. This tutorial is for an absolute beginner, so you don&#8217;t need to worry about these.</em></p>



<p>That&#8217;s all for this post. In the next part, we&#8217;ll be exploring POST, PUT, DELETE APIs.</p>
<div style='display:none;' class='shareaholic-canvas' data-app='share_buttons' data-title='Write JSON APIs In Pure Django For Beginners' data-link='https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners/' data-summary='Learn how to build JSON based RESTful APIs using Django without using DjangoRestFramework.' data-app-id-name='category_below_content'></div><div style='display:none;' class='shareaholic-canvas' data-app='recommendations' data-title='Write JSON APIs In Pure Django For Beginners' data-link='https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners/' data-summary='Learn how to build JSON based RESTful APIs using Django without using DjangoRestFramework.' data-app-id-name='category_below_content'></div><p>The post <a rel="nofollow" href="https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners/">Write JSON APIs In Pure Django For Beginners</a> appeared first on <a rel="nofollow" href="https://www.pyscoop.com">Gaurav Jain</a>.</p>


guid: https://www.pyscoop.com/?p=470
title: Write JSON APIs In Pure Django For Beginners – Part 2
author: Gaurav Jain
feedurl: https://www.djangoproject.com/rss/community/blogs/
url:
https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners-part-2/?utm_source=rss&utm_medium=rss&utm_campaign=write-json-apis-in-pure-django-for-beginners-part-2

content:
<div style='display:none;' class='shareaholic-canvas' data-app='share_buttons' data-title='Write JSON APIs In Pure Django For Beginners - Part 2' data-link='https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners-part-2/' data-app-id-name='category_above_content'></div>
<p><span class="has-inline-color has-black-color">This is the 2nd part of the previous <a rel="noreferrer noopener" href="https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners/" target="_blank">post</a>.</span></p>



<p>To continue with the tutorial, we need to install an API client such as <a rel="noreferrer noopener" href="https://www.postman.com/downloads/" target="_blank">Postman</a>. This makes our life easier while developing APIs. After installation, try to execute the <strong><a href="http://127.0.0.1:8000/books/" target="_blank" rel="noreferrer noopener">get all books</a></strong> API we created in the previous part.</p>



<figure class="wp-block-image size-large"><img src="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-6.50.43-PM-1024x553.png" alt="" class="wp-image-474" srcset="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-6.50.43-PM-1024x553.png 1024w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-6.50.43-PM-300x162.png 300w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-6.50.43-PM-768x415.png 768w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-6.50.43-PM-1536x829.png 1536w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-6.50.43-PM-2048x1106.png 2048w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-12-at-6.50.43-PM-640x345.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>You can see the response we observed previously. For <strong>GET</strong> APIs it doesn&#8217;t make much difference but for POST, PUT, DELETE APIs it&#8217;s quite convenient to use Postman. We are going to build these APIs and will be using Postman for debugging and testing purpose.</p>



<p><em>If  you are not familiar with these HTTP verbs, I strongly advise you to read about these <a href="https://www.w3schools.com/tags/ref_httpmethods.asp">here</a> or <a rel="noreferrer noopener" href="https://www.restapitutorial.com/lessons/httpmethods.html" target="_blank">here</a></em></p>



<p>Alright, let&#8217;s begin with POST API. But before that, let&#8217;s recap how does <strong>BookView</strong> class look like from the previous part.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">class BookView(View):
    def get(self, request):
        books_count = Book.objects.count()  # TOTAL books in the database
        books = Book.objects.all()  # Get all book objects from the database
        books_serialized_data = serialize('python', books)
        data = {
            'books': books_serialized_data,
            'count': books_count,
        }
        return JsonResponse(data)</code></pre>



<p>This view just supports the GET method. To support the POST method, we have to add another method called post in this View.  We also have to apply CSRF exempt decorator on the class. This is not recommended on a production application. I have explained about CSRF in <a rel="noreferrer noopener" href="https://www.pyscoop.com/security-in-the-django-application/#csrf" target="_blank">this post</a>. Copy the below code in your class. I have removed the lines from <strong>get</strong> method to keep this class short but you can simply copy other changes.</p>



<h2> POST API</h2>



<pre class="wp-block-code"><code class="">from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt

@method_decorator(csrf_exempt, name='dispatch')
class BookView(View):
    def get(self, request):
        ...

    def post(self, request):
        data = {'message': 'This is a POST request'}
        return JsonResponse(data)</code></pre>



<p>This time no need to change in the <strong>urls.py</strong> file. Open Postman and hit the API using the POST type as shown in the below image.</p>



<figure class="wp-block-image size-large"><img src="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-13-at-5.51.04-PM-1024x359.png" alt="" class="wp-image-485" srcset="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-13-at-5.51.04-PM-1024x359.png 1024w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-13-at-5.51.04-PM-300x105.png 300w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-13-at-5.51.04-PM-768x269.png 768w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-13-at-5.51.04-PM-1536x538.png 1536w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-13-at-5.51.04-PM-2048x717.png 2048w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-13-at-5.51.04-PM-640x224.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Great! This means the setup works. Now we can modify the post method to accept book data from the user and create book objects.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">import json

@method_decorator(csrf_exempt, name='dispatch')
class BookView(View):

    ...

    def post(self, request):
        post_body = json.loads(request.body)   # don't forget to import json

        book_title = post_body.get('title')
        book_author = post_body.get('author')
        price = post_body.get('price')

        book_data = {
            'title': book_title,
            'author': book_author,
            'price': price,
        }

        book_obj = Book.objects.create(**book_data)
        data = {
            'message': f'New book object has been created with id {book_obj.id}'
        }
        return JsonResponse(data, status=201)</code></pre>



<p>This view accepts 3 fields in the JSON body, those are- title, author and price and then save into database using <strong>Book.objects.create</strong>. Go ahead and hit the API using Postman.</p>



<p><span style="color:#0d709a" class="has-inline-color">Select <strong>raw</strong> option in <strong>body</strong> tab on Postman. and from the dropdown select <strong>JSON</strong> (right to GraphQL).</span></p>



<figure class="wp-block-image size-large"><img src="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.30.56-AM-1024x556.png" alt="" class="wp-image-492" srcset="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.30.56-AM-1024x556.png 1024w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.30.56-AM-300x163.png 300w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.30.56-AM-768x417.png 768w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.30.56-AM-1536x834.png 1536w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.30.56-AM-2048x1112.png 2048w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.30.56-AM-640x347.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Now you can verify this by opening admin page <a rel="noreferrer noopener" href="http://127.0.0.1:8000/admin/myapp/book/" target="_blank">http://127.0.0.1:8000/admin/myapp/book/</a>. you should be able to see the newly created book object. </p>



<p>This is a naive implementation. ideally, you should be handling all the fields and return the response accordingly.<br>for e.g if the user doesn&#8217;t provide any of these 3 fields, you should return <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#400" target="_blank">400 <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#400" target="_blank">BAD REQUEST</a></a> with the appropriate message.  Also, if you see the above image carefully, you&#8217;ll see the status is <span class="has-inline-color has-black-color"><a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#201" target="_blank">201 Created</a></span> because we passed that explicitly in the <strong>JsonResponse</strong>, Default is <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#200" target="_blank">200 OK</a>.</p>



<h2>PUT API</h2>



<p>Imagine a scenario when you have to update the price of a book that already exists in your database. How would you do that? Commonly, PUT APIs are used in such a scenario where you have to update existing data. Let&#8217;s implement PUT API and try to update a price for a book. </p>



<p>We need to create a new view as well as a new URL pattern. Unlike GET or POST we simply used <strong>/books/</strong>. But now we are going to work on an existing data, so we need to provide a unique identifier in the request to identify those objects and Update or delete them accordingly. In our example, a unique identifier would be <strong><a rel="noreferrer noopener" href="https://docs.djangoproject.com/en/dev/topics/db/models/#automatic-primary-key-fields" target="_blank">id</a></strong>.<br>Copy the below code in <strong>myapp/views.py</strong>.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">@method_decorator(csrf_exempt, name='dispatch')
class BookUpdateDeleteView(View):

    def put(self, request, book_id):  # extra url parameter book_id is manadaotry
        book = Book.objects.get(id=book_id)

        put_body = json.loads(request.body)
        book.price = put_body.get('price')
        book.save()

        data = {
            'message': f'Price of the book {book_id} has been updated'
        }
        return JsonResponse(data)</code></pre>



<p>and in the <strong>myapp/urls.py</strong>, add a path for this view. After adding this, you should have 3 path objects in the urlpatterns list. Don&#8217;t forget to import <strong>BookUpdateDeleteView</strong>.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from .views import MyAPIView, BookView, BookUpdateDeleteView  

urlpatterns = [
    path('awesome_api/', MyAPIView.as_view()),
    path('books/', BookView.as_view()),
    path('books/&lt;int:book_id>/', BookUpdateDeleteView.as_view()),
]</code></pre>



<p>Let&#8217;s understand what is happening here. We create a new view class <strong>BookUpdateDeleteView</strong> and created a method called <strong>put</strong> inside the class. An important thing to note here is, <strong>put</strong> method is expecting one more parameter which is <strong>book_id</strong>. This parameter should exactly be the same as we specified in the path<br>e.g. <strong>path(&#8216;books/&lt;int:book_id>/&#8217;, BookUpdateDeleteView.as_view())</strong>. This path translate to <br><strong>/books/1/</strong>, <strong>/books/37/</strong>, etc. Alright, Let&#8217;s try it out in the Postman. We want to change the price of the first book which is currently 100. New price should be, let&#8217; say, 83.  Select the PUT method type as we did for POST, use the URL <strong>http://127.0.0.1:8000/books/2/</strong> and then provide the price in JSON body.</p>



<figure class="wp-block-image size-large"><img src="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.55.11-AM-1024x551.png" alt="" class="wp-image-494" srcset="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.55.11-AM-1024x551.png 1024w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.55.11-AM-300x161.png 300w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.55.11-AM-768x413.png 768w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.55.11-AM-1536x827.png 1536w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.55.11-AM-2048x1102.png 2048w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-11.55.11-AM-640x344.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>If you open admin page <a href="http://127.0.0.1:8000/admin/myapp/book/1/change/">http://127.0.0.1:8000/admin/myapp/book/1/change/</a>, you should be able to see the new price. </p>



<h2>DELETE API</h2>



<p>Delete API is similar to PUT API. We create a method called <strong>delete</strong> in the view class. This method expects two parameters(<strong>request</strong> and <strong>book_id) </strong>similar to the<strong> put</strong> method. We simply get the book object from the database based on the provided book_id in the URL. and delete the object.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">@method_decorator(csrf_exempt, name='dispatch')
class BookUpdateDeleteView(View):

    def put(self, request, book_id):
        ...

    def delete(self, request, book_id):
        book = Book.objects.get(id=book_id) # get the object from DB
        book.delete()  # delete the entry
        # you can also combine these 2 statements: Book.objects.get(id=book_id).delete()

        data = {
            'message': f'Book object with id {book_id} has been deleted'
        }
        return JsonResponse(data)</code></pre>



<p>Let&#8217;s delete the 2nd book object from the database Open the Postman, select DELETE method from the dropdown, use URL <strong>http://127.0.0.1:8000/books/2/</strong>, hit Send button. </p>



<figure class="wp-block-image size-large"><img src="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-12.06.00-PM-1024x489.png" alt="" class="wp-image-499" srcset="https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-12.06.00-PM-1024x489.png 1024w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-12.06.00-PM-300x143.png 300w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-12.06.00-PM-768x367.png 768w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-12.06.00-PM-1536x734.png 1536w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-12.06.00-PM-2048x978.png 2048w, https://www.pyscoop.com/wp-content/uploads/2020/06/Screen-Shot-2020-06-14-at-12.06.00-PM-640x306.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Visit the GET API <a rel="noreferrer noopener" href="http://127.0.0.1:8000/books/" target="_blank">http://127.0.0.1:8000/books/</a> again, and you should not be to see the deleted entry. You can also visit the <a href="http://127.0.0.1:8000/admin/myapp/book/" target="_blank" rel="noreferrer noopener">admin page</a> to see available entries.</p>



<p>Congratulations! You are now equipped with all basic knowledge required for API building and ready to take on the world. 😎 <br>You can find the code for views and URLs <a rel="noreferrer noopener" href="https://gist.github.com/gjain0/70419bcdad6950565ad71dd2839d12c1" target="_blank">here</a>. </p>
<div style='display:none;' class='shareaholic-canvas' data-app='share_buttons' data-title='Write JSON APIs In Pure Django For Beginners - Part 2' data-link='https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners-part-2/' data-app-id-name='category_below_content'></div><div style='display:none;' class='shareaholic-canvas' data-app='recommendations' data-title='Write JSON APIs In Pure Django For Beginners - Part 2' data-link='https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners-part-2/' data-app-id-name='category_below_content'></div><p>The post <a rel="nofollow" href="https://www.pyscoop.com/write-json-apis-in-pure-django-for-beginners-part-2/">Write JSON APIs In Pure Django For Beginners &#8211; Part 2</a> appeared first on <a rel="nofollow" href="https://www.pyscoop.com">Gaurav Jain</a>.</p>


guid: https://adamj.eu/tech/2020/06/15/how-to-unit-test-a-django-form
title: How to Unit Test a Django Form
author: Adam’s Tech Blog
url: https://adamj.eu/tech/2020/06/15/how-to-unit-test-a-django-form/
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<p class="message">
    This post is an adapted extract from my book <a href="https://gumroad.com/l/suydt">Speed Up Your Django Tests</a>, available now.
</p>

<p><a href="https://docs.djangoproject.com/en/3.0/topics/testing/tools/#the-test-client">Django’s test client</a> is really useful for writing integration tests for your project.
It’s great because it has a simple API for testing your application similarly to how a web browser would interact with it.
Unfortunately it can be slow, because each call creates a request, passes it through all your middleware, view, maybe a template, then the response comes back through the same layers.</p>

<p>The <strong>Test Structure</strong> chapter of <strong>Speed Up Your Django Tests</strong> includes a section on rewriting integration tests that use the test client as unit tests.
This rewriting makes them faster and more accurate.
Here’s one example rewriting some integration tests for a form as unit tests.</p>

<p>Forms are a great example of a component that can be easily unit tested.
They accept a dictionary of values, validate it, and return either errors or cleaned data.</p>

<p>For an example, take this form:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>

<span class="kn">from</span> <span class="nn">example.core.models</span> <span class="kn">import</span> <span class="n">Book</span>


<span class="k">class</span> <span class="nc">AddBookForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">ModelForm</span><span class="p">):</span>
    <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
        <span class="n">model</span> <span class="o">=</span> <span class="n">Book</span>
        <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s">"title"</span><span class="p">]</span>

    <span class="k">def</span> <span class="nf">clean_title</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">title</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s">"title"</span><span class="p">]</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">title</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">title</span>

        <span class="k">if</span> <span class="ow">not</span> <span class="n">title</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">isupper</span><span class="p">():</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_error</span><span class="p">(</span><span class="s">"title"</span><span class="p">,</span> <span class="s">"Should start with an uppercase letter"</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">title</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s">"."</span><span class="p">):</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_error</span><span class="p">(</span><span class="s">"title"</span><span class="p">,</span> <span class="s">"Should not end with a full stop"</span><span class="p">)</span>

        <span class="k">if</span> <span class="s">"&amp;"</span> <span class="ow">in</span> <span class="n">title</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_error</span><span class="p">(</span><span class="s">"title"</span><span class="p">,</span> <span class="s">"Use 'and' instead of '&amp;'"</span><span class="p">)</span>

        <span class="k">return</span> <span class="n">title</span></code></pre></figure>

<p>It has a few validation steps for the <code class="highlighter-rouge">title</code> field that we’d like to test in isolation.</p>

<p>For reference, here’s the corresponding view:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">redirect</span><span class="p">,</span> <span class="n">render</span>

<span class="kn">from</span> <span class="nn">example.core.forms</span> <span class="kn">import</span> <span class="n">AddBookForm</span>


<span class="k">def</span> <span class="nf">add_book</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s">"POST"</span><span class="p">:</span>
        <span class="n">form</span> <span class="o">=</span> <span class="n">AddBookForm</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span>
            <span class="n">form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
            <span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="s">"/books/"</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">form</span> <span class="o">=</span> <span class="n">AddBookForm</span><span class="p">()</span>
    <span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s">"add_book.html"</span><span class="p">,</span> <span class="p">{</span><span class="s">"form"</span><span class="p">:</span> <span class="n">form</span><span class="p">})</span></code></pre></figure>

<h2 id="integration-tests">Integration Tests</h2>

<p>You can write integration tests for the form with the test client, checking for error messages in the responses’ HTML:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="kn">from</span> <span class="nn">http</span> <span class="kn">import</span> <span class="n">HTTPStatus</span>

<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>


<span class="k">class</span> <span class="nc">AddBookFormTests</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">test_title_starting_lowercase</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
            <span class="s">"/books/add/"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">"title"</span><span class="p">:</span> <span class="s">"a lowercase title"</span><span class="p">}</span>
        <span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">HTTPStatus</span><span class="o">.</span><span class="n">OK</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">assertContains</span><span class="p">(</span>
            <span class="n">response</span><span class="p">,</span> <span class="s">"Should start with an uppercase letter"</span><span class="p">,</span> <span class="n">html</span><span class="o">=</span><span class="bp">True</span>
        <span class="p">)</span>

    <span class="k">def</span> <span class="nf">test_title_ending_full_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
            <span class="s">"/books/add/"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">"title"</span><span class="p">:</span> <span class="s">"A stopped title."</span><span class="p">}</span>
        <span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">HTTPStatus</span><span class="o">.</span><span class="n">OK</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">assertContains</span><span class="p">(</span>
            <span class="n">response</span><span class="p">,</span> <span class="s">"Should not end with a full stop"</span><span class="p">,</span> <span class="n">html</span><span class="o">=</span><span class="bp">True</span>
        <span class="p">)</span>

    <span class="k">def</span> <span class="nf">test_title_with_ampersand</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
            <span class="s">"/books/add/"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">"title"</span><span class="p">:</span> <span class="s">"Dombey &amp; Son"</span><span class="p">}</span>
        <span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">HTTPStatus</span><span class="o">.</span><span class="n">OK</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">assertContains</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="s">"Use 'and' instead of '&amp;'"</span><span class="p">,</span> <span class="n">html</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span></code></pre></figure>

<p>These tests work, but they have two flaws.</p>

<p>First, they have all of that integration test overhead.
To check these error messages, we don’t really care about the details of HTTP or HTML.
But here we have to check HTTP status codes and parse HTML with <code class="highlighter-rouge">assertContains(..., html=True)</code> in every test.</p>

<p>Second, they’re imprecise.
The <code class="highlighter-rouge">assertContains()</code> calls check for error messages <em>somewhere</em> in the output, rather than directly related to the <code class="highlighter-rouge">title</code> field.
If we had two fields with similar validation logic, these tests could accidentally pass because we used bad test data for the other field.
We could rewrite the tests to inspect for a more precise HTML string, but that would couple them further to the details of form rendering.</p>

<h2 id="unit-tests">Unit Tests</h2>

<p>You can instead test the form directly:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>

<span class="kn">from</span> <span class="nn">example.core.forms</span> <span class="kn">import</span> <span class="n">AddBookForm</span>


<span class="k">class</span> <span class="nc">AddBookFormTests</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">test_title_starting_lowercase</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">form</span> <span class="o">=</span> <span class="n">AddBookForm</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">"title"</span><span class="p">:</span> <span class="s">"a lowercase title"</span><span class="p">})</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
            <span class="n">form</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="s">"title"</span><span class="p">],</span> <span class="p">[</span><span class="s">"Should start with an uppercase letter"</span><span class="p">]</span>
        <span class="p">)</span>

    <span class="k">def</span> <span class="nf">test_title_ending_full_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">form</span> <span class="o">=</span> <span class="n">AddBookForm</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">"title"</span><span class="p">:</span> <span class="s">"A stopped title."</span><span class="p">})</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
            <span class="n">form</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="s">"title"</span><span class="p">],</span> <span class="p">[</span><span class="s">"Should not end with a full stop"</span><span class="p">]</span>
        <span class="p">)</span>

    <span class="k">def</span> <span class="nf">test_title_with_ampersand</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">form</span> <span class="o">=</span> <span class="n">AddBookForm</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">"title"</span><span class="p">:</span> <span class="s">"Dombey &amp; Son"</span><span class="p">})</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">form</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="s">"title"</span><span class="p">],</span> <span class="p">[</span><span class="s">"Use 'and' instead of '&amp;'"</span><span class="p">])</span></code></pre></figure>

<p>These tests correct the two flaws.
They’re faster because they simply pass in and read out dictionaries, with no need to touch anything related to HTTP or HTML.
And they’re more precise because they directly inspect the errors for “title,” ignoring the other fields.</p>

<p>Note you’d still want to have <em>some</em> integration tests, to check that the view, form, and template work together:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="kn">from</span> <span class="nn">http</span> <span class="kn">import</span> <span class="n">HTTPStatus</span>

<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>


<span class="k">class</span> <span class="nc">AddBookViewTests</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">test_get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">"/books/add/"</span><span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">HTTPStatus</span><span class="o">.</span><span class="n">OK</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">assertContains</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="s">"&lt;h1&gt;Add Book&lt;/h1&gt;"</span><span class="p">,</span> <span class="n">html</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">test_post_success</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
            <span class="s">"/books/add/"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">"title"</span><span class="p">:</span> <span class="s">"Dombey and Son"</span><span class="p">}</span>
        <span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">HTTPStatus</span><span class="o">.</span><span class="n">FOUND</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="s">"Location"</span><span class="p">],</span> <span class="s">"/books/"</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">test_post_error</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
            <span class="s">"/books/add/"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">"title"</span><span class="p">:</span> <span class="s">"Dombey &amp; Son"</span><span class="p">}</span>
        <span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">HTTPStatus</span><span class="o">.</span><span class="n">OK</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">assertContains</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="s">"Use 'and' instead of '&amp;'"</span><span class="p">,</span> <span class="n">html</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span></code></pre></figure>

<p>Given that the form is already fully tested, these view tests are sufficient as they provide full coverage of the only three paths through the view.</p>

<h2 id="fin">Fin</h2>

<p>I hope this helps you write faster, more targeted tests,</p>

<p>—Adam</p>


title: Django A/B testing with Google Optimize
author: Findwork.dev blog
feedurl: https://www.djangoproject.com/rss/community/blogs/
guid:
https://findwork.dev/blog/django-b-testing-google-optimize/?utm_source=rss&utm_medium=blog&utm_campaign=101

url:
https://findwork.dev/blog/django-b-testing-google-optimize/?utm_source=rss&utm_medium=blog&utm_campaign=101

content:
A/B testing is a great way to decide what path your product should take. Create two variations, collect data points and see which variation is better. It will help you in understanding your users and their needs. Google Optimize is a tool that simplifies A/B testing by managing variant weights, targeting rules, provides analytics and integrates with other Google product as Google Adwords and Google Analytics.

There are two ways to run A/B tests: client-side and server-side. Client-side A/B tests with Google Optimize executes javascript in browser based on the changes you would like (style changes, positioning of elements etc.), it is fairly limited. In server-side A/B tests there are no limitations, you can write any code you'd like which will display different application versions based on the session's active experiment variant.

## The Google Optimize basics

When a user visits your site and an experiment is active he will be given an experiment variant which is stored in a cookie called `_gaexp.` The cookie can have the following content `GAX1.2.MD68BlrXQfKh-W8zrkEVPA.18361.1` and it contains multiple values where each value is divided by dots. There are two key values for server-side A/B testing. Firstly, the experiment ID which in the example is `MD68BlrXQfKh-W8zrkEVPA`. Secondly, the experiment variant for the session which is the last integer, which in this case is `1`.

When multiple experiments are active the experiments will be separated by an exclamation marks as in the following `_gaexp` cookie `GAX1.2.3x8_BbSCREyqtWm1H1OUrQ.18166.1!7IXTpXmLRzKwfU-Eilh_0Q.18166.0`. You can extract two experiments from the cookie, `3x8_BbSCREyqtWm1H1OUrQ` with the variant `1` and `7IXTpXmLRzKwfU-Eilh_0Q` with the variant `0`.

## Usage in Django

We can parse a `ga_exp` cookie with this code snippet:

```python
ga_exp = self.request.COOKIES.get("_gaexp")

parts = ga_exp.split(".")
experiments_part = ".".join(parts[2:])
experiments = experiments_part.split("!")
for experiment_str in experiments:
    experiment_parts = experiment_str.split(".")
    experiment_id = experiment_parts[0]
    variation_id = int(experiment_parts[2])
    experiment_variations[experiment_id] = variation_id
```

The snippet separates the cookie by Google Optimize's delimiters which are dots(`.`) for different values and exclamation marks(`!`) to separate experiments. We will then store the experiment variant for each experiment in a dict. Then we can render various templates based on which experiment variants are active for the current session:

```python
def get_template_names(self):
    experiments.get("my_experiment_cookie_id", None)
        if variant == "1":
            return ["jobs/xyz_new.html"]
        return ["jobs/xyz_old.html"]
```

I've created a [Django package](https://github.com/adinhodovic/django-google-optimize) that will simplify this and which also adds a middleware and experiment management in the Django-admin, which makes it possible to start, stop and pause experiments through the Django admin. It also simplifies local testing of experiment variants. I use the package at [Findwork](https://findwork.dev) to A/B test UI/UX changes. Next up, I'll walk you through how to setup an experiment in Google Optimize and how to render various application versions based on the session's experiment variant using the package.

## Using Django-google-optimize to run A/B tests

To get started with `django-google-optimize` install the package with pip:

`pip install django-google-optimize`

Add the application to installed Django applications:

```py
DJANGO_APPS = [
    ...
    "django_google_optimize",
    ...
]
```

I've added a middleware which makes the experiment variant easily accessible both in templates and views so you'll need to add the middleware in you `settings.py`:

```py
MIDDLEWARE = [
    ...
    "django_google_optimize.middleware.google_optimize",
    ...
]
```

Now run the migrations `./manage.py migrate` and the setup is complete.

### Creating a Google Optimize experiment

Head over to [Google Optimize](https://optimize.google.com) and create your first experiment. By default you'll have one variant which is the original variant and then you can add as many variants as you would like for the A/B test. Each variant will be given an index based on the order you added the variants, the original variant has always the index 0:

![Experiment variants](https://i.imgur.com/12cwfcL.png)

Next we'll set goals for the A/B test but you need to link your Google Analytics property with Google Optimize to set goals and measure the success of your A/B test. If you do not have Google Analytics added to your site, [django-analytical](https://github.com/jazzband/django-analytical) provides easy integration. When Google Analytics is linked you can add goals to the experiment which are either system default goals(e.g bounce rate or page views) or your own defined goals. There is a limit of 3 goals, where only one of them is a primary goal and it will determine the success of the experiment, the other two will be visually displayed in the Google Optimize experiment report. All other user defined goals and system goals will be visible in **Google Analytics** and they will be tied individually to each experiment, this again is only visually displayed and does not determine the success of the experiment.

Below is an experiment with two system goals and a goal I've defined for [Findwork](https://findwork.dev) which measures how many users have subscribed to job emailing list:

![Experiment goals](https://i.imgur.com/sho96WN.png)

Variants and goals are required to start the experiment but Google Optimize provides more options as audience targeting (with Google Ads and Google Analytics integration), variant weights, traffic allocation and more. If you are already using Google's products as Google Analytics and Adwords, then Google Optimize is great!

### Adding an experiment in the Django-admin

We can now head over to the Django-admin to add our experiment. When adding an experiment only the experiment ID is required and when it is added a middleware will add the experiments and their variants to a context variable called `google_optimize`. The experiments will be accessible in both views and templates(the [request context processor](https://docs.djangoproject.com/en/3.0/ref/templates/api/#django-template-context-processors-request) needs to be added for the context to be accessible in templates) in the `request.google_optimize.<experiment_id>` object. However, referring to the experiment by ID in your Django templates and views will make it hard to grasp what experiment that specific ID refers to. Therefore, you can add aliases for the experiments and variants which will make your code much more readable. Below is an example of the differences:

Without an Google Experiment alias you will have to reference your experiment by ID:

```python
{% if request.google_optimize.3x8_BbSCREyqtWm1H1OUrQ == 0 %}
{% include "jobs/xyz_new.html" %}
{% endif %}
```

Instead of by experiment alias:

```python
{% if request.google_optimize.redesign_landing_page == 0 %}
{% include "jobs/xyz_new.html" %}
{% endif %}
```

Without an variant alias you will have to reference your variant by index as:

```python
{% if request.google_optimize.redesign_landing_page == 0 %}
{% include "jobs/xyz_new.html" %}
{% endif %}
```

Instead of by variant alias:

```python
{% if request.google_optimize.redesign_landing_page == "New Background Color" %}
{% include "jobs/xyz_new.html" %}
{% endif %}
```

For the examples above the following Google Experiment object has been added:

![Google Experiment Object](https://i.imgur.com/bgWeETC.png)

### Local Development

To test the various variants you can either add the `_gaexp` cookie or manage the active variant in the Django-admin. For each browser you can either via plugins or developer tools adjust the `_gaexp` cookie and test each variant by changing the variant index in the session's cookie. For example in the cookie `GAX1.2.MD68BlrXQfKh-W8zrkEVPA.18361.1` you can adjust the last integer `1` to the variant index you would like to test. Alternatively, `django-google-optimize` provides for each experiment an experiment cookie object which can be used to set the active variant. In an experiment's Django admin panel you can add a cookie as in the image below:

![Experiment cookie](https://i.imgur.com/bIqFv5A.png)

Set it to active and it will override or add the variant chosen, otherwise the session's cookie will be used. The experiment cookie only works in `DEBUG` mode as Google will set the cookie in production and we would not want to override it.

### Usage

As shown previously you can use `django-google-optimize` in templates as below:

```python
{% if request.google_optimize.redesign_landing_page == "New Background Color" %}
{% include "jobs/xyz_new.html" %}
{% endif %}
```

To use the package in views and display two different templates based on the experiment variant:

```python
def get_template_names(self):
    variant = request.google_optimize.get("redesign_landing_page", None)
    if variant == "New Background Color":
        return ["jobs/xyz_new.html"]
    return ["jobs/xyz_old.html"]
```

Adjusting the queryset in a view based on the experiment variant:

```python
def get_queryset(self):
    variant = self.request.google_optimize.get("redesign_landing_page", None)

    if variant == "New Background Color":
        qs = qs.exclude(design__contains="old")
```

### Results

Google Optimize will continuously report results on the experiment with both a probability for a variant to be better and the modelled improvement percentage. The experiment needs to run at least for two weeks for it to report a clear leader and to let you know that you can end the experiment. Although, there will be daily updates on the experiments progress, where you'll have all insights you'll need to end the experiment whenever you would like. At the top of the reporting page there will be a link to a Google Analytics dashboard for the experiment as seen below in the image:

![Google Analytics](https://i.imgur.com/yDBZv1C.png)

The final result of the experiment will be displayed as in the image below. The image displays an overview on how well each experiment variant performed in regards to the experiment goals set:

![Final report](https://i.imgur.com/V3Pecdu.png)

The above examples was ended early with few sessions which makes it difficult to pinpoint an exact modelled improvement of a variant. If you would like concrete results before concluding an experiment, it needs to run longer than 14 days as in the above examples.

## Summary

Google Optimize integrates well with Google Analytics making it easy to analyze each A/B variant in depth. This makes it easy to understand your users and their needs and develop the application according to them. The package Django-google-optimize aims for simplifying running A/B tests with Google Optimize. Also, the Django admin is just amazing and can serve so many purposes, and in this case you can pause, start and remove the experiment directly from the admin panel.

The project can be found on [Github](https://github.com/adinhodovic/django-google-optimize).

The package is published on [PyPI](https://pypi.org/project/django-google-optimize/).

Documentation is available at [read the docs](https://django-google-optimize.readthedocs.io/en/latest).


guid: https://www.willmcgugan.com/blog/tech/post/richer-django-logging/
title: Richer Django logging
author: Will McGugan
url: https://www.willmcgugan.com/blog/tech/post/richer-django-logging/
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<p>I recently tested Rich logging with a Django project and the results were good. Here's what it looks like:</p>
<div><a></a>
 <img src="https://media.moyaproject.com/willmcgugan/uploads/thumbnails/techblog/8cc094f6-af31-11ea-9060-f23c91845b44.png/8cc094f6-af31-11ea-9060-f23c91845b44png.lg.3.jpeg" title="rich.png"> 
<figcaption>
<div>© 2020 Will McGugan</div>


<p>A Django app with Rich logging</p>


</figcaption>


</div>
<p>Note the file and line at the right hand of the terminal which shows were the log function was called. If your terminal supports hyperlinks, you can click that link to open the file!</p>
<p>For reference, here's what it looks like without Rich logging.</p>
<div><a></a>
 <img src="https://media.moyaproject.com/willmcgugan/uploads/thumbnails/techblog/8cafc86a-af31-11ea-a9bc-f23c91845b44.png/8cafc86a-af31-11ea-a9bc-f23c91845b44png.lg.3.jpeg" title="django.png"> 
<figcaption>
<div>© 2020 Will McGugan</div>


<p>A Django app without Rich logging</p>


</figcaption>


</div>
<p>This is the default <a href="https://github.com/willmcgugan/rich/blob/master/rich/logging.py#L15">RichHandler</a> class in <a href="https://github.com/willmcgugan/rich">Rich</a>. It would be possible to do a little more customization for Django logs. Maybe highlight 5xx in red, for example.</p>
<p>To add this to your Django project, <code>pip install rich</code> then configure the console to use <code>"rich.logging.RichHandler"</code> rather than StreamHandler.</p>
<pre><code class="language-python">LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {"rich": {"datefmt": "[%X]"}},
    "handlers": {
        "console": {
            "class": "rich.logging.RichHandler",
            "formatter": "rich",
            "level": "DEBUG",
        }
    },
    "loggers": {"django": {"handlers": ["console"]}},
}
</code></pre>
<p>The process is much the same for any project. See the documentation for the Rich <a href="https://rich.readthedocs.io/en/latest/logging.html">logging handler</a> for details.</p>


guid: https://learndjango.com/tutorials/django-custom-user-model
title: Django Custom User Model
author: LearnDjango.com
url: https://learndjango.com/tutorials/django-custom-user-model
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
Django ships with a built-in [User model](https://docs.djangoproject.com/en/3.0/ref/contrib/auth/#django.contrib.auth.models.User) for authentication, however the [official Django documentation](https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project) *highly recommends* using a custom user model for new projects. The reason is if you want …


guid: fd8146cd-080a-4128-8636-5b58cf3031f1
title: Modern Django Development - Jeff Triplett
author: DjangoChat
url: https://djangochat.com/episodes/docker-tailwind-and-more-jeff-triplett-t52RtC68
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<ul><li><a href="https://jefftriplett.com">Jeff Triplett personal site</a></li><li><a href="https://www.python.org/psf/">Python Software Foundation</a></li><li><a href="https://jefftriplett.com/django-release-cycle/">Django Release Cycle</a> </li><li><a href="https://www.revsys.com">REVSYS</a></li><li><a href="https://django-news.com">Django News Newsletter</a></li><li><a href="https://github.com/wsvincent/awesome-django">awesome-django</a></li><li><a href="https://www.defna.org">DEFNA</a></li><li><a href="https://tailwindcss.com/">Tailwind CSS</a> </li></ul>


guid: https://www.mattlayman.com/building-saas/hackathon-app/
title: Hackathon App - Building SaaS #61
author: Matt Layman's Website
url: https://www.mattlayman.com/building-saas/hackathon-app/
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
In this episode, we took a break from the regular app to work on an app for a local hackathon that I&rsquo;m participating in. My team is building a mobile web app for the homeless around Frederick, MD. In this stream, we cranked through some modeling, admin building, a couple of pages, tests, and templates! We got a lot done!
The virtual hackathon running in Frederick is split into multiple teams serving three different community groups around Frederick county.


guid: https://django-news.com/issues/28
title: Django News - No DjangoCon US this year ☹ - Jun 19th 2020
author: Django News
url: https://django-news.com/issues/28
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<h3>News</h3>
      
        <h4><a href="https://cur.at/WYkocXn?m=rss">DjangoCon US 2020 is Canceled</a></h4>
        <p>After 12 consecutive years of DjangoCons in the United States, we’ve decided to cancel DjangoCon US 2020.</p>
          <p><a href="https://cur.at/WYkocXn?m=rss">djangoproject.com</a></p>
      
        <h4><a href="https://cur.at/AIVUmZn?m=rss">Django 3.1 Beta 1 Released</a></h4>
        <p>Django 3.1 beta 1 is now available. It represents the second stage in the 3.1 release cycle and is an opportunity for you to try out the changes coming in Django 3.1.</p>
          <p><a href="https://cur.at/AIVUmZn?m=rss">djangoproject.com</a></p>
      
        <h4><a href="https://cur.at/JQif9uN?m=rss">Wagtail Space US 2020 – Call For Proposals</a></h4>
        <p>The Wagtail Space US CFP deadline is open until July 1, 2020.</p>
          <p><a href="https://cur.at/JQif9uN?m=rss">google.com</a></p>
      
        <h4><a href="https://cur.at/AqMBF6E?m=rss">2020 Python Software Foundation Board of Directors Election Results</a></h4>
        <p>The 2020 Python Software Foundation Board of Directors election has concluded. See the results!</p>
          <p><a href="https://cur.at/AqMBF6E?m=rss">blogspot.com</a></p>
      <h3>Articles</h3>
      
        <h4><a href="https://cur.at/ltvYWED?m=rss">Postgres websearch in Django 3.1</a></h4>
        <p>Django 3.1 includes a new Postgres SearchQuery feature that allows human-formatted search queries.</p>
          <p><a href="https://cur.at/ltvYWED?m=rss">jamesturk.net</a></p>
      
        <h4><a href="https://cur.at/mD0gYoi?m=rss">Optimizing Django ORM Queries</a></h4>
        <p>If you love optimization articles where they present SQL queries next to Django ORM calls, then you are in for a treat.</p>
          <p><a href="https://cur.at/mD0gYoi?m=rss">schegel.net</a></p>
      
        <h4><a href="https://cur.at/SGHjEB1?m=rss">Use Pathlib in Your Django Settings File</a></h4>
        <p>Get a jump on Django 3.1 and switch to <code>pathlib</code> in your projects.</p>
          <p><a href="https://cur.at/SGHjEB1?m=rss">adamj.eu</a></p>
      
        <h4><a href="https://cur.at/HxRN32Y?m=rss">How I manage multiple development environments in my Django workflow using Docker compose</a></h4>
        <p>A practical Docker Compose overview for how to handle both development and production docker-compose.yml and environment settings.</p>
          <p><a href="https://cur.at/HxRN32Y?m=rss">rogs.me</a></p>
      
        <h4><a href="https://cur.at/3bZJMLv?m=rss">Richer Django Logging</a></h4>
        <p>A nice intro to Rich logging which you won't want to miss.</p>
          <p><a href="https://cur.at/3bZJMLv?m=rss">willmcgugan.com</a></p>
      <h3>Sponsored Link</h3>
          <a rel="nofollow" href="https://cur.at/UBrHB0G?m=rss"><img title="Two Scoops of Django 3.x: Best Practices for the Django Web Framework" alt="" width="420" src="https://dxj7eshgz03ln.cloudfront.net/production/link/image/546538/original_ratio_medium_5dabcc21-06fd-4b75-8609-88d60613257b.jpg" /></a>

        <h4><a href="https://cur.at/UBrHB0G?m=rss">Two Scoops of Django 3.x: Best Practices for the Django Web Framework</a></h4>
        <p>The long-awaited update covers various tips, tricks, patterns, code snippets, and techniques of Django best practices.</p>
          <p><a href="https://cur.at/UBrHB0G?m=rss">feldroy.com</a></p>
      <h3>Advocacy and Mentorship</h3>
      
        <h4><a href="https://cur.at/UCb5QE6?m=rss">Tupu - Free mentorship for women and minorities in tech</a></h4>
        <blockquote><p>Tupu is a non-profit initiative to offer free mentorship to women, people of color, and other underrepresented groups in the tech industry</p></blockquote>
          <p><a href="https://cur.at/UCb5QE6?m=rss">tupu.io</a></p>
      <h3>Projects</h3>
      
        <h4><a href="https://cur.at/bpZaQCa?m=rss">GaretJax/django-click</a></h4>
        <p>This release fixes issues with newer versions of Click.</p>
          <p><a href="https://cur.at/bpZaQCa?m=rss">github.com</a></p>
      
        <h4><a href="https://cur.at/3x2bWPg?m=rss">NyanKiyoshi/pytest-django-queries</a></h4>
        <blockquote><p>Generate performance reports from your Django database performance tests.</p></blockquote>
          <p><a href="https://cur.at/3x2bWPg?m=rss">github.com</a></p>
      
        <h4><a href="https://cur.at/9Y0W9BR?m=rss">RealmTeam/django-rest-framework-social-oauth2: python-social-auth and oauth2 support for django-rest-framework</a></h4>
        <p></p>
          <p><a href="https://cur.at/9Y0W9BR?m=rss">github.com</a></p>
      
        <h4><a href="https://cur.at/roOifFH?m=rss">sloria/environs</a></h4>
        <p>Simplified environment variable parsing</p>
          <p><a href="https://cur.at/roOifFH?m=rss">github.com</a></p>
      <h3>Events</h3>
      
        <h4><a href="https://cur.at/ZJXyxmv?m=rss">DjangoCon Australia returns for the 8th time and opens CFP</a></h4>
        <p>DjangoCon Australia is September 4th and will be virtual this year!</p>
          <p><a href="https://cur.at/ZJXyxmv?m=rss">djangoproject.com</a></p>
      
        <h4><a href="https://cur.at/xduaMUj?m=rss">Wagtail Space US 2020</a></h4>
        <p>Wagtail Space US 2020 returns July 30th through August 1st.</p>

<blockquote><p>Wagtail Space US will comprise talks, training, and a sprint. The event is free, although we invite corporate participants to consider sponsorship.</p></blockquote>
          <p><a href="https://cur.at/xduaMUj?m=rss">wagtail.space</a></p>
      
        <h4><a href="https://cur.at/WDhL7Xs?m=rss">Announcing PyGotham TV</a></h4>
        <p>PyGotham is going virtual this year with PyGotham TV. 📺</p>
          <p><a href="https://cur.at/WDhL7Xs?m=rss">pygotham.tv</a></p>
      <h3>Shameless Plugs</h3>
      
        <h4><a href="https://cur.at/gv12LMB?m=rss">LearnDjango.com - Free tutorials and premium books</a></h4>
        <p></p>
          <p><a href="https://cur.at/gv12LMB?m=rss">learndjango.com</a></p>
  <hr>
  <p>
    This RSS feed is published on
    <a href="https://django-news.com/">https://django-news.com/</a>.
    You can also subscribe
    <a href="https://django-news.com/#cta-newsletter">via email</a>.
  </p>


guid: tag:mattsegal.dev,2020-06-21:/restore-django-local-database.html
title: How to pull production data into your local Postgres database
author: Matt Segal Dev Blog
url: https://mattsegal.dev/restore-django-local-database.html
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<p>Sometimes you want to write a feature for your Django app that requires a lot of structured data that already exists in production. This happened to me recently: I needed to create a reporting tool for internal business users. The problem was that I didn't have much data in my …</p>


guid: https://learndjango.com/tutorials/how-learn-django
title: How to Learn Django (2020)
author: LearnDjango.com
url: https://learndjango.com/tutorials/how-learn-django
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
As a “batteries-included” web framework, Django comes with a host of built-in features and a correspondingly steep learning curve for newcomers. In this post, I discuss what you need to …


guid: http://eatsomecode.com/setup-django-on-mac-in-2020
title: Setup Django on Mac in 2020
author: Eat Some Code
url: http://eatsomecode.com/setup-django-on-mac-in-2020
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
<p>There are many ways to setup Django on MacOS. Here is how to get started while keeping the flexibility to have projects in different versions of <a href="https://www.djangoproject.com/" target="_blank">Django</a> and different versions of <a href="https://www.python.org/" target="_blank">Python</a> too.</p>


guid: https://testdriven.io/blog/django-lets-encrypt/
title: Securing a Containerized Django Application with Let's Encrypt
author: TestDriven.io Blog
url: https://testdriven.io/blog/django-lets-encrypt/
feedurl: https://www.djangoproject.com/rss/community/blogs/
content:
In this tutorial, we'll look at how to secure a containerized Django app running behind an HTTPS Nginx proxy with Let's Encrypt SSL certificates.


guid: https://blog.rogs.me/2019/03/15/de-google-my-life-part-1-of-_-tu-_-why-how/
title: De-Google my life - Part 1 of ¯ (ツ)_/¯: Why? How?
url: https://blog.rogs.me/2019/03/15/de-google-my-life-part-1-of-_-tu-_-why-how/
feedurl: https://blog.rogs.me/index.xml
content:
Hi everyone! I&rsquo;m here with my first project of the year. It is almost done, but I think it is time to start documenting everything.
One day I was hanging out with my girlfriend looking for trips to japan online and found myself bombarded by ads that were disturbingly specific. We realized at the moment that Google knows A LOT of us, and we were not happy about that. With my tech knowledge, I knew that there were a lot of alternatives to Google, but first I needed to answer a bigger question:


guid: https://blog.rogs.me/2019/03/22/de-google-my-life-part-2-of-_-tu-_-servers-and-emails/
title: De-Google my life - Part 2 of ¯ (ツ)_/¯: Servers and Emails
url: https://blog.rogs.me/2019/03/22/de-google-my-life-part-2-of-_-tu-_-servers-and-emails/
feedurl: https://blog.rogs.me/index.xml
content:
Hello everyone! Welcome to the second post of this blog series that aims to de-google my life as much as possible. If you haven&rsquo;t read the first one, you should definitely check it out. On this delivery we&rsquo;ll focus more on code and configurations so I promise you it won&rsquo;t be as boring :)
Servers configuration As I mentioned on the previous post, I&rsquo;ll be using two servers that are going to be configured almost the same, so I&rsquo;m going to explain it only one time.


guid: https://blog.rogs.me/2019/03/29/de-google-my-life-part-3-of-_-tu-_-nextcloud-collabora/
title: De-Google my life - Part 3 of ¯ (ツ)_/¯: Nextcloud & Collabora
url: https://blog.rogs.me/2019/03/29/de-google-my-life-part-3-of-_-tu-_-nextcloud-collabora/
feedurl: https://blog.rogs.me/index.xml
content:
Hello everyone! Welcome to the third post of my blogseries &ldquo;De-Google my life&rdquo;. If you haven&rsquo;t read the other ones you definitely should! (Part 1, Part 2). Today we are moving forward with one of the most important apps I&rsquo;m running on my servers: Nextcloud. A big part of my Google usage was Google Drive (and all it&rsquo;s derivate apps). With Nextcloud I was looking to replace:
 Docs Drive Photos Contacts Calendar Notes Tasks More (?


guid: https://blog.rogs.me/2019/11/20/de-google-my-life-part-4-of-_-tu-_-dokuwiki-ghost/
title: De-Google my life - Part 4 of ¯ (ツ)_/¯: Dokuwiki & Ghost
url: https://blog.rogs.me/2019/11/20/de-google-my-life-part-4-of-_-tu-_-dokuwiki-ghost/
feedurl: https://blog.rogs.me/index.xml
content:
Hello everyone! Welcome to the fourth post of my blogseries &ldquo;De-Google my life&rdquo;. If you haven&rsquo;t read the other ones you definitely should! (Part 1, Part 2, Part 3).
First of all, sorry for the long wait. I had a couple of IRL things to take care of (we will discuss those in further posts, I promise ( ͡° ͜ʖ ͡°)), but now I have plenty of time to work on more blog posts and other projects.


guid: https://blog.rogs.me/2019/11/27/de-google-my-life-part-5-of-_-tu-_-backups/
title: De-Google my life - Part 5 of ¯ (ツ)_/¯: Backups
url: https://blog.rogs.me/2019/11/27/de-google-my-life-part-5-of-_-tu-_-backups/
feedurl: https://blog.rogs.me/index.xml
content:
Hello everyone! Welcome to the fifth post of my blog series &ldquo;De-Google my life&rdquo;. If you haven&rsquo;t read the other ones you definitely should! (Part 1, Part 2, Part 3, Part 4).
At this point, our server is up and running and everything is working 100% fine, but we can&rsquo;t always trust that. We need a way to securely backup everything in a place where we can restore quickly if needed.


guid: https://blog.rogs.me/2020/02/17/how-to-search-in-a-huge-table-on-django-admin/
title: How to search in a huge table on Django admin
url: https://blog.rogs.me/2020/02/17/how-to-search-in-a-huge-table-on-django-admin/
feedurl: https://blog.rogs.me/index.xml
content:
Hello everyone!
We all know that the Django admin is a super cool tool for Django. You can check your models, and add/edit/delete records from the tables. If you are familiar with Django, I&rsquo;m sure you already know about it.
I was given a task: Our client wanted to search in a table by one field. It seems easy enough, right? Well, the tricky part is that the table has 523.


guid: https://blog.rogs.me/2020/04/my-mom-was-always-right-rant-on-social-media/
title: My mom was always right | Rant on social media
url: https://blog.rogs.me/2020/04/my-mom-was-always-right-rant-on-social-media/
feedurl: https://blog.rogs.me/index.xml
content:
My mom always hated social media. My bother and I always made fun of her because she was always late to all the news. Her main reason against social media was &ldquo;why would I want everyone to know what I&rsquo;m doing? And why should I care what they are doing?&rdquo;. I didn&rsquo;t understand at the time, but now I do.
I remember when I was 13 years old social media started ramping up.


guid: https://blog.rogs.me/2020/04/secure-your-django-api-from-ddos-attacks-with-nginx-and-fail2ban/
title: Secure your Django API from DDoS attacks with NGINX and fail2ban
url: https://blog.rogs.me/2020/04/secure-your-django-api-from-ddos-attacks-with-nginx-and-fail2ban/
feedurl: https://blog.rogs.me/index.xml
content:
Hello everyone!
Last week our Django API, hosted on an Amazon EC2 server was attacked by a botnet farm, which took our services down for almost the entire weekend. I’m not going to lie, it was a very stressful situation, but at the same time we learned a lot about how to secure our server from future DDoS attacks.
For our solution we are using the rate-limiting functionality from NGINX and fail2ban, a program that bans external APIs when they break a certain set of rules.


title: How I manage multiple development environments in my Django workflow using Docker compose
feedurl: https://blog.rogs.me/index.xml
guid:
https://blog.rogs.me/2020/05/how-i-manage-multiple-development-environments-in-my-django-workflow-using-docker-compose/

url:
https://blog.rogs.me/2020/05/how-i-manage-multiple-development-environments-in-my-django-workflow-using-docker-compose/

content:
Hi everyone!
Last week I was searching how to manage multiple development environments with the same docker-compose configuration for my Django workflow. I needed to manage a development and a production environment, so this is what I did.
Some descriptions on my data:
 I had around 20 env vars, but some of them where shared among environments. I wanted to do it with as little impact as possible.  First, docker-compose help command The first thing I did was run a simple docker-compose --help, and it returned this:


guid: https://blog.rogs.me/2020/05/de-google-my-blog-how-to-blog-in-2020-without-google/
title: De-Google my blog - How to blog in 2020 without Google
url: https://blog.rogs.me/2020/05/de-google-my-blog-how-to-blog-in-2020-without-google/
feedurl: https://blog.rogs.me/index.xml
content:
Hi everyone!
Right now I have Google almost completely out of my life, but some of the top commentaries of my posts in /r/degoogle and /r/selfhosted were &ldquo;Your blog still uses google for resources lol&rdquo;, so I needed to change that.
Shame.
In my old blog, the features that used Google where:
 Disquss comments The Ghost theme  Before we begin, I want to let you know that all these fixes have been applied, so you are currently experiencing the final result.


guid: https://blog.rogs.me/2020/06/how-to-search-google-without-using-google-the-self-hosted-way/
title: How to search Google without using Google, the self-hosted way
url: https://blog.rogs.me/2020/06/how-to-search-google-without-using-google-the-self-hosted-way/
feedurl: https://blog.rogs.me/index.xml
content:
Hello everyone!
Last week I was talking with a friend and he was complaining about how Google knows everything about us, so I took the chance to recommend some degoogled alternatives: I sent him my blog, recommended DuckDuckGo, Nextcloud, Protonmail, etc. He really liked my suggestions and promised to try DuckDuckGo. A couple of days later he came to me a little defeated, because he didn&rsquo;t like the search results on DuckDuckGo and felt bad going back to Google.


guid: https://xkcd.com/2319/
title: Large Number Formats
url: https://xkcd.com/2319/
feedurl: https://xkcd.com/atom.xml
content:
<img src="https://imgs.xkcd.com/comics/large_number_formats.png" title="10^13.4024: A person who has come back to numbers after a journey deep into some random theoretical field" alt="10^13.4024: A person who has come back to numbers after a journey deep into some random theoretical field" />


guid: https://xkcd.com/2320/
title: Millennium Problems
url: https://xkcd.com/2320/
feedurl: https://xkcd.com/atom.xml
content:
<img src="https://imgs.xkcd.com/comics/millennium_problems.png" title="The hard part about opening a hole in the proof of the Poincaré conjecture is that Grigori Perelman will come out of retirement to try to fix it by drawing a loop around the hole and contracting it to a point." alt="The hard part about opening a hole in the proof of the Poincaré conjecture is that Grigori Perelman will come out of retirement to try to fix it by drawing a loop around the hole and contracting it to a point." />


guid: https://xkcd.com/2321/
title: Low-Background Metal
url: https://xkcd.com/2321/
feedurl: https://xkcd.com/atom.xml
content:
<img src="https://imgs.xkcd.com/comics/low_background_metal.png" title="The only effect on the history books were a few confusing accounts of something called 'Greek fire.'" alt="The only effect on the history books were a few confusing accounts of something called 'Greek fire.'" />


guid: https://xkcd.com/2322/
title: ISO Paper Size Golden Spiral
url: https://xkcd.com/2322/
feedurl: https://xkcd.com/atom.xml
content:
<img src="https://imgs.xkcd.com/comics/iso_paper_size_golden_spiral.png" title="The ISO 216 standard ratio is cos(45°), but American letter paper is 8.5x11 because it uses radians, and 11/8.5 = pi/4." alt="The ISO 216 standard ratio is cos(45°), but American letter paper is 8.5x11 because it uses radians, and 11/8.5 = pi/4." />


guid: https://lunduke.com/posts/2020-04-19-a/
title: Lunduke and Friends - April 18th, 2020
url: https://lunduke.com/posts/2020-04-19-a/
feedurl: https://lunduke.com/index.xml
content:
This episode of Lunduke &amp; Friends was recorded live on April 18th, 2020. You can grab the recording a bunch of different ways:
YouTube - LBRY - Audio Podcast RSS
This time, I'm joined by two exceptionally awesome nerds:
  Chris Titus (Chris Titus Tech on YouTube)
  Matt Hartley (veteran Linux Journalist)
  Some topics included:
  Lunduke and his Toshiba Libretto DOS laptop.
  Hartley and his TI-99 joystick.


guid: https://lunduke.com/posts/2020-04-20-a/
title: How to get computers made 40 years apart talking to each other
url: https://lunduke.com/posts/2020-04-20-a/
feedurl: https://lunduke.com/index.xml
content:
Hypothetical:
You've got two computers you need to move files between. Software, saved games, documents&hellip; whatever the type of files, you've got &lsquo;em on one computer. And you need to get them to another one.
Just one wrinkle &ndash; one of those computers was made in 2020 (let's say a laptop runnning Linux or Windows 10)&hellip; and the other was produced four decades earlier (let's say an old Apple II).


guid: https://lunduke.com/posts/2020-04-21/
title: Mark Shuttleworth in 2016: 'Ubuntu keeps GNU/Linux relevant'
url: https://lunduke.com/posts/2020-04-21/
feedurl: https://lunduke.com/index.xml
content:
Back in April of 2016 I held a short email interview with the founder and head honcho of Canonical, Mark Shuttleworth. I am re-publishing it here, at The Lunduke Journal, as&hellip; well&hellip; I find the answers&hellip; interesting. And worth preserving.
 This is certainly not a hard-hitting, no-holds-barred sort of interview.
Just a casual chat to hear about Ubuntu from the guy that started it and hopefully, in the process, let us all get to know him a little better.


guid: https://lunduke.com/posts/2020-04-29/
title: Lunduke and Friends - April 25th, 2020
url: https://lunduke.com/posts/2020-04-29/
feedurl: https://lunduke.com/index.xml
content:
This episode of Lunduke &amp; Friends was recorded live on April 25th, 2020. You can grab the recording a bunch of different ways:
YouTube - LBRY - Audio Podcast RSS
This time, I'm joined by three super duper awesome nerds:
  Chris Titus (Chris Titus Tech on YouTube)
  Matt Hartley (veteran Linux Journalist)
  Gardiner Bryant (The Linux Gamer on YouTube)
  Some topics include: Flatpak, Snapy, AppImage, Open Broadcaster Software (OBS), Linux v Windows for live streaming, Linux Audio (Jack, PulseAudio, ALSA, Bluetooth), Windows users coming to Linux, Windows 95 and 98, SystemD, Upstart, Crontab, new Ubuntu release, failed Canonical projects, Microsoft buying Canonical or SUSE, ISDN, DSL, Virtual Reality, VIM, and lots of other Linux-y, Nerdy stuff.


guid: https://lunduke.com/posts/2020-04-29-b/
title: Lunduke's Computer Hardware - 2020 Edition
url: https://lunduke.com/posts/2020-04-29-b/
feedurl: https://lunduke.com/index.xml
content:
The computer hardware I use, on a daiy basis, changes from year to year. Not simply because I pick up new, faster, shinier gear&hellip; often these changes revolve more around aging, &ldquo;retro&rdquo; computing equipment. Over time, I refine my workflow &ndash; focusing in on the types of software and hardware I most enjoy working with.
Sometimes that's new gear. Sometimes old. Sometimes really old.
With that in mind, I thought it would be fun (at least for me) to catalogue exactly what hardware (and corresponding software) I use &ndash; on a regular basis &ndash; in my work and personal life.


guid: https://lunduke.com/posts/2020-05-01-b/
title: Computer Joke of the Day - May 1, 2020
url: https://lunduke.com/posts/2020-05-01-b/
feedurl: https://lunduke.com/index.xml
content:
A RAID member disk walks into a bar.
  Bartender asks, &ldquo;What’s wrong?&rdquo;
  &ldquo;Parity error.&rdquo;
  &ldquo;Yeah, you look a bit off.&rdquo;
 I've heard this joke for who-knows-how-many years now. No clue who wrote it, originally. It's FOSS published it in 2017. SwiftOnSecurity tweeted it in 2015 (and mentioned having heard it years prior). If you know of the original author, shoot me a line.


guid: https://lunduke.com/posts/2020-05-01-c/
title: Dad Joke of the Day - May 1, 2020
url: https://lunduke.com/posts/2020-05-01-c/
feedurl: https://lunduke.com/index.xml
content:
As I handed my Dad his 50th birthday card, he looked at me &ndash; tears in his eyes &ndash; and said, “You know&hellip; one would have been enough.”
 I don't recall where I first saw this one. In looking around, the joke seemed to emerge during 2018 &ndash; posted by a number of sources (including this Reddit post). If anyone knows the author, let me know. It's a good one.


guid: https://lunduke.com/posts/2020-05-01-d/
title: Dartmouth Time Sharing System and BASIC - This Day in Computer History - May 1, 1964
url: https://lunduke.com/posts/2020-05-01-d/
feedurl: https://lunduke.com/index.xml
content:
Nowadays we all have our own computer (or computers, plural). But back in the 1960s? Not so much.
That all changed on May 1st, 1964.
At 4am, on that fateful Friday, the first large scale Time Sharing computer system was launched &ndash; The Dartmouth Time Sharing System (DTSS).
Yes. One of the most significant computing systems in history was launched on a Friday. At 4am. I mean it's not &ldquo;5pm on a Friday&rdquo;&hellip; but, yikes.


guid: https://lunduke.com/posts/2020-05-02/
title: House of Lunduke BBS Off-Line for Massive Overhaul
url: https://lunduke.com/posts/2020-05-02/
feedurl: https://lunduke.com/index.xml
content:
Just a quick note to all users of the House of Lunduke BBS!
The BBS is Off-Line while I do some massive changes to the board.
  Moving to a completely different (dedicated) computer to act as the BBS server. Different hardware, different Operating System.
  Changing to use completely different BBS software, as well.
  Many changed (new) features. Totally different look.
  Say good-by to the Main Menu ANSI that has, more or less unchanged, adorned the system for the last 10 years.


guid: https://lunduke.com/posts/2020-05-02-b/
title: Microsoft Mouse and Notepad - This Day in Computer History - May 2, 1983
url: https://lunduke.com/posts/2020-05-02-b/
feedurl: https://lunduke.com/index.xml
content:
On May 2nd, 1983, Microsoft intruduced a new piece of hardware &ndash; demoed with a new piece of software.
Both of which would go on to acheive near legendary status among computer users around the world.
The Microsoft Mouse&hellip; and Notepad.
This first Microsoft Mouse, nicknamed &ldquo;The Green Eyed Monster&rdquo; (for the two big green buttons on the front), sold for $195 and required a bus interface card &ndash; 9 and 25-pin serial port support would arrive later.


guid: https://lunduke.com/posts/2020-05-03/
title: The First Spam E-Mail - This Day in Computer History - May 3, 1978
url: https://lunduke.com/posts/2020-05-03/
feedurl: https://lunduke.com/index.xml
content:
On May 3rd, 1978&hellip; the very first Spam E-Mail (or just &ldquo;email&rdquo; for you young whipersnappers) was sent.
It was sent by a man working in marketing for Digital Equipment Corporation &ndash; specifically to promote the DECSYSTEM-20.
Some interesting factoids about this first spam:
  The email account this was sent from was &ldquo;THUERK at DEC-MARLBORO&rdquo;. Note that this was back before &ldquo;.COM&rdquo; and other top level domain names. We're talking old-school ARPANET, here.


guid: https://lunduke.com/posts/2020-05-03-b/
title: Computer Joke of the Day - May 3, 2020
url: https://lunduke.com/posts/2020-05-03-b/
feedurl: https://lunduke.com/index.xml
content:
I started a band called &ldquo;999 Megabytes&rdquo;.
  &hellip; we still haven’t gotten a gig.
 Haven't the slightest clue who originally wrote this little gem. Been bouncing around the Internet for at least the last 5 or 6 years.
====
The articles here at the Lunduke Journal are often also available as a Video episode and Audio Podcast.
Ways to watch the show: LBRY, YouTube
Ways to listen to the show: RSS Podcast, iTunes, Google Play Music, Spotify


guid: https://lunduke.com/posts/2020-05-04/
title: ILOVEYOU worm infects 10+ Million PCs - This Day in Computer History - May 4, 2000
url: https://lunduke.com/posts/2020-05-04/
feedurl: https://lunduke.com/index.xml
content:
On May 4th, 2000, at 11:29AM&hellip; the following email was sent out.
Known as the &ldquo;ILOVEYOU&rdquo; virus, this email contained a single file attachment with the file name of &ldquo;LOVE-LETTER-FOR-YOU.txt.vbs&rdquo; &ndash; a VBScript file.
When opened, on a Windows PC with the default settings, this VBScript ran and performed the following actions:
  Makes multiple copies of itself &ndash; including in the Windows and Windows System directories with official looking names like MSKernel32.


guid: https://lunduke.com/posts/2020-05-04-b/
title: Computer Joke of the Day - CIA Director Edition
url: https://lunduke.com/posts/2020-05-04-b/
feedurl: https://lunduke.com/index.xml
content:
This joke is, I kid you not, a direct quote from a speech by CIA Director David H. Petraeus in 2012.
 I recalled the story of the four engineers driving home from one of our partner startups in Silicon Valley &ndash; a mechanical engineer, a chemical engineer, an electrical engineer, and a computer engineer. And, sure enough, while heading up the West Valley Freeway, their car broke down.
  They of course immediately sought to determine the cause, and the mechanical engineer naturally said, “Sounds to me as if the pistons have seized.


guid: https://lunduke.com/posts/2020-05-04-c/
title: Linux Sucks 2020 - Premiering May 28th, 2020
url: https://lunduke.com/posts/2020-05-04-c/
feedurl: https://lunduke.com/index.xml
content:
Thursday, May 28th, at 7pm (Pacific) I will be unveiling the biggest, baddest, most ridiculous show I can possibly put on while stuck inside my house.
Linux Sucks 2020  Join grumpy old man, Bryan Lunduke, as he gives Linux a piece of his mind. A long overdue, well deserved tongue lashing. We're not talking about some minor slap on the wrist here. No, sir. As a wise man once said, &ldquo;This is going to suck more than anything has sucked before.


guid: https://lunduke.com/posts/2020-05-06/
title: EDSAC ran its first program - This Day in Computer History - May 6, 1949
url: https://lunduke.com/posts/2020-05-06/
feedurl: https://lunduke.com/index.xml
content:
On May 6th, in the year 1949, the EDSAC &ndash; the second computer ever built to use electronic, digital stored programs &ndash; ran its very first program.
 Maurice Wilkes (left), designer of the EDSAC, in front of the completed computer. Photo credit: University of Cambridge.
 The EDSAC (which stands for Electronic Delay Storage Automatic Calculator) is an absolutely fascinating machine. Here's the specifications for what is, arguably, one of the most important computers the world has ever seen.


guid: https://lunduke.com/posts/2020-05-07/
title: Computer Joke of the Day - Octal Edition
url: https://lunduke.com/posts/2020-05-07/
feedurl: https://lunduke.com/index.xml
content:
Why are computer programmers always getting Halloween confused with Christmas?
  Because Oct 31 equals Dec 25.
 No idea who originally wrote that joke. But anyone who makes an octal reference in a joke is a-ok with me.
 
The Lunduke Journal is made possible, in part, through the support of Linode. Want awesome Linux cloud hosting while supporting The Lunduke Journal in the process? Check out Linode.


guid: https://lunduke.com/posts/2020-05-08/
title: The Netiquette 2020 Project
url: https://lunduke.com/posts/2020-05-08/
feedurl: https://lunduke.com/index.xml
content:
The original 1995 Netiquette document (published by Sally Hambridge) was a critical piece of Internet culture during the mid to late 1990s (and even into the early 2000s).
At the time, new users were rapidly discovering the Internet and all of the various services it offered. But most of those users were unaware of both the usage of the systems and the expected cultural norms around them.
Netiquette provided a simple, easy to reference set of minimum guidelines for utlizing Internet systems &ndash; focused on communication platforms.


guid: https://lunduke.com/posts/2020-05-08-b/
title: Is Linux Marketshare Rising? (Spoiler: It's Actually Dropping)
url: https://lunduke.com/posts/2020-05-08-b/
feedurl: https://lunduke.com/index.xml
content:
Multiple Linux and tech news outlets have, this week, reported that Linux marketshare has doubled over the last month &ndash; from 1.36% to 2.87%.
Linux markeshare doubling! In a single month! That's huge news!
&hellip; If it's true. Let's dig into the hard numbers to find out, for sure.
First, it should be noted that these numbers are all based on the monthly web browser usage reports from NetMarketshare.com.
To make this easier to analyze, below is the last roughly 5 years of results (one year intervals) for Linux, Windows, and MacOS using NetMarketshare's numbers.


guid: https://lunduke.com/posts/2020-05-11/
title: Comic: Knock, Knock
url: https://lunduke.com/posts/2020-05-11/
feedurl: https://lunduke.com/index.xml
content:
The Lunduke Journal is made possible, in part, through the support of Linode. Want awesome Linux cloud hosting while supporting The Lunduke Journal in the process? Check out Linode.
You can also check out the &ldquo;Support The Lunduke Journal&rdquo; page for a variety of ways you can help directly support the good, nerdy articles, podcasts, and videos we produce.


guid: https://lunduke.com/posts/2020-05-12/
title: Comic: The Great UDP Joke
url: https://lunduke.com/posts/2020-05-12/
feedurl: https://lunduke.com/index.xml
content:
I know, I know. It's an old one. But I had to do it. Was tempted to add a bunch of variations of that last panel, with Carl going slowly insane. Managed to stop myself. Will power.
 
The Lunduke Journal is made possible, in part, through the support of Linode. Want awesome Linux cloud hosting while supporting The Lunduke Journal in the process? Check out Linode.
You can also check out the &ldquo;Support The Lunduke Journal&rdquo; page for a variety of ways you can help directly support the good, nerdy articles, podcasts, and videos we produce.


guid: https://lunduke.com/posts/2020-05-12-b/
title: Comic: Munich and Linux
url: https://lunduke.com/posts/2020-05-12-b/
feedurl: https://lunduke.com/index.xml
content:
Skeptical Lunduke is skeptical.
 
The Lunduke Journal is made possible, in part, through the support of Linode. Want awesome Linux cloud hosting while supporting The Lunduke Journal in the process? Check out Linode.
You can also check out the &ldquo;Support The Lunduke Journal&rdquo; page for a variety of ways you can help directly support the good, nerdy articles, podcasts, and videos we produce.


guid: https://lunduke.com/posts/2020-05-13-b/
title: Indie Makers Using Single-Board Computers
url: https://lunduke.com/posts/2020-05-13-b/
feedurl: https://lunduke.com/index.xml
content:
The following article was originally published in the March, 2019 issue of Linux Journal magazine. With the closing of Linux Journal by the parent company, this piece is being re-published here to preserve the work and ensure it is accessible in the future.
 Possibly the most amazing thing, to me, about single board computers (SBCs) is that they allow small teams of people (and even lone individuals) to create new gadgets using not much more than SBCs and 3D printers.


guid: https://lunduke.com/posts/2020-05-15-b/
title: Lunduke and Friends - May 9, 2020 - Parts 1 and 2
url: https://lunduke.com/posts/2020-05-15-b/
feedurl: https://lunduke.com/index.xml
content:
Every Saturday, at 9pm Pacific (currently over on the Lunduke YouTube Channel), a bunch of Lunduke's nerdiest friends gather &ndash; with live stream and a community chat room &ndash; to talk about nerdy things.
A chance to socialize &ndash; with each other, and with all the chat room folks out on the Inter-tubes &ndash; and have a few good laughs while we talk about whatever the heck we all decide to talk about (with questions supplied by all of you).


guid: https://lunduke.com/posts/2020-05-18/
title: Lunduke and Friends - May 16, 2020 - Part 1
url: https://lunduke.com/posts/2020-05-18/
feedurl: https://lunduke.com/index.xml
content:
Every Saturday, at 9pm Pacific (currently over on the Lunduke YouTube Channel), a bunch of Lunduke's nerdiest friends gather &ndash; with live stream and a community chat room &ndash; to talk about nerdy things.
View on LBRY or YouTube or listen on the Podcast.
This weeks nerds:
 Chris Titus (Linux-y YouTuber) Matt Hartley (veteran Linux journalist) Gardiner Bryant (TLG) Also Lunduke  Topics include: Pulling an Office Space, dumb YouTube comments, Titus goes into the outside world and reports back, Dad Jokes, SteamOS, DRM and Video Games, Linux adoption, and the direction of Linux.


guid: https://lunduke.com/posts/2020-05-20/
title: Lunduke and Friends - May 16, 2020 - Part 2
url: https://lunduke.com/posts/2020-05-20/
feedurl: https://lunduke.com/index.xml
content:
Topics include: Applications vs websites, how much time each of us spends on our phones, what makes a something a REAL computer, monetizing open source software, the fragility of some models of monetization, truly open companies, credit cards are stupid, are Linux fans paranoid cheapskates, dial up modems are neat, Linux and kernel bloat, if Linux is not an option anymore&hellip; what Operating System do we run? Also, dad jokes.


guid: https://lunduke.com/posts/2020-05-22/
title: Study: Android Users Are The Most Unhappy
url: https://lunduke.com/posts/2020-05-22/
feedurl: https://lunduke.com/index.xml
content:
How does the Operating System you use impact your overall level of happiness?
Considering the amount of time each of us spends &ndash; every day &ndash; interacting with our various computing devices (from desktop PCs to cell phones), it would be interesting to understand the impact that any given system may (or may not) have on how happy (or unhappy) we are.
Unfortunately, until now, there really hasn't been any detailed, publicly available information on the topic.


guid: https://lunduke.com/posts/2020-05-20-b/
title: Linux Sucks 2019 - The Lost Recordings
url: https://lunduke.com/posts/2020-05-20-b/
feedurl: https://lunduke.com/index.xml
content:
The Great Trainwrek In 2019, I did a live show called &ldquo;Linux Sucks: In Space&quot;. (The most recent installment of the Linux Sucks series, which has been viewed millions of times over the last few years.)
That 2019 show was a total trainwreck. In nearly every conceivable way.
 Significant portions of the video were lost. The entire slide deck was lost (seriously). I had two of my kids with me (3 and 8) as my wife was at home with our newborn &ndash; and my 3 year old managed to get into several portions of the video (and audio)&hellip; being as I don't want to publish widely distributed video of my kids, those chunks became totally unusable.


guid: https://lunduke.com/posts/2020-05-22-b/
title: Comic: The Unsigned, 8-Bit Genie
url: https://lunduke.com/posts/2020-05-22-b/
feedurl: https://lunduke.com/index.xml
content:
This is really a combination of a couple SysAdmin / Programmer jokes. The old &ldquo;use sudo to tell someone to do something&rdquo; bit, finished off with an unsigned integer joke (which I've seen variations on floating around for a while, like this one). Not sure who really originated either. Though the &ldquo;sudo do this&rdquo; one probably has been around about as long as the sudo command itself.
 
The Lunduke Journal is made possible, in part, through the support of Linode.


guid: https://lunduke.com/posts/2020-05-28/
title: Linux Sucks 2020 is live!
url: https://lunduke.com/posts/2020-05-28/
feedurl: https://lunduke.com/index.xml
content:
Linux Sucks 2020 has been released and is freely available to all! You can watch Linux Sucks 2020, right now, the following ways:
  Straight from the LBRY.tv website
  Even better, you can install the LBRY application to download and play the DRM-Free video
  Or, if you really must, you can watch via YouTube.
  This is the first installment of the Linux Sucks series to be filmed without a live audience.


guid: https://lunduke.com/posts/2020-06-01/
title: Lunduke and Friends - May 30, 2020 - Part 1
url: https://lunduke.com/posts/2020-06-01/
feedurl: https://lunduke.com/index.xml
content:
Topics include: Kentucky (the state), Hot Pockets, LBRY, YouTube, Trying to ignore the outside world, GTK, Qt, Uncomfortable office chairs, The 8GB Raspberry Pi 4 as a desktop computer, Our favorite text editors (vi, emacs, nano, etc.), Best simple laptop for writing, Distraction-free computing, Our favorite CPUs (Intel, AMD, ARM, Cyrix, 68k, etc.), Putting Linux on computers that weren't meant to run Linux (like older Macintoshes - Yellowdog Linux), also dad jokes.


guid: https://lunduke.com/posts/2020-06-04/
title: Lunduke and Friends - May 30, 2020 - Part 2
url: https://lunduke.com/posts/2020-06-04/
feedurl: https://lunduke.com/index.xml
content:
Topics include: What Rick and Morty character would we be, Lunduke is a prude, What Star Trek character would each of us be, Galaxy Quest is awesome, When Lunduke met George Takei, Stuff about space travel, DirectX on Windows Subsystem for Linux, Dad jokes, Suspense, De-Googling an Android phone, F-Droid, Cryptocurrencies, Taco Bell, being sleepy and trying to not think about the outside world.
View on LBRY or YouTube or listen on the Podcast.


guid: https://lunduke.com/posts/2020-06-05-b/
title: Comic: The Web Developer Gets a Raise
url: https://lunduke.com/posts/2020-06-05-b/
feedurl: https://lunduke.com/index.xml
content:
The Lunduke Journal is made possible, in part, through the support of Linode. Want awesome Linux cloud hosting while supporting The Lunduke Journal in the process? Check out Linode. Right now Linode is offering $60 in hosting credits which expire after 60 days. That's crazy awesome. $60 bucks of hosting goes a surprisingly long way.
You can also check out the &ldquo;Support The Lunduke Journal&rdquo; page for a variety of ways you can help directly support the good, nerdy articles, podcasts, and videos we produce.


guid: https://lunduke.com/posts/2020-06-08/
title: Lunduke and Friends - June 6, 2020 - Part 1
url: https://lunduke.com/posts/2020-06-08/
feedurl: https://lunduke.com/index.xml
content:
Topics include: Real-time deepfake videos on Linux, Command and Conquer remaster, AA batteries with USB ports, laptop batteries should be removable, intentionally electrocuting ourselves as kids in the 1980s, dumb things we did with BB guns, lawn darts, throwing rocks at each other for fun, buying old electronics off E-Bay, the TI 99/4A resurgence, Amiga or Atari Falcon, Stuff we've made with a 3D Printer, and lots of dad jokes.


guid: https://lunduke.com/posts/2020-06-10-b/
title: Comic: Count Dracula and C
url: https://lunduke.com/posts/2020-06-10-b/
feedurl: https://lunduke.com/index.xml
content:
Want to get Lunduke Journal Comics a week early? Subscribers get, among other perks, every comic one week before the public.
 
The Lunduke Journal is made possible, in part, through the support of Linode. Want awesome Linux cloud hosting while supporting The Lunduke Journal in the process? Check out Linode. Right now Linode is offering $60 in hosting credits which expire after 60 days. That's crazy awesome. $60 bucks of hosting goes a surprisingly long way.


guid: https://lunduke.com/posts/2020-06-13/
title: The House of Lunduke BBS is back On-Line!
url: https://lunduke.com/posts/2020-06-13/
feedurl: https://lunduke.com/index.xml
content:
Good news! The House of Lunduke BBS is back On-Line!
I had taken the BBS Off-Line in order to make a number of big changes &ndash; and add some new features that I'd personally been wanting to try out for a long time.
In the end, the new BBS sofware I wanted to use turned out to have significant limitations for how I wanted to use it. Thus, many of my grand plans had to be abandoned.


guid: https://lunduke.com/posts/2020-06-10/
title: Lunduke and Friends - June 13, 2020 - Part 1
url: https://lunduke.com/posts/2020-06-10/
feedurl: https://lunduke.com/index.xml
content:
Topics include: The upcoming Bill and Ted 3, does SSHing into a Linux box from an iPad count as using Linux, RC trucks, cheap video capture HDMI to USB devices, having an emotional attachment to a computer, torturing our computers, Haiku Beta 2 is pretty sweet, using Qubes OS, Dragons Lair, virus on a floppy disk, connecting to a telnet BBS from a DVD player, and dad jokes.
View on LBRY or YouTube or listen on the Podcast.


guid: https://lunduke.com/posts/2020-06-17/
title: Lunduke and Friends - June 13, 2020 - Part 2
url: https://lunduke.com/posts/2020-06-17/
feedurl: https://lunduke.com/index.xml
content:
Topics include: What computer had the best version of Elite, What happened to l33t speak, the toilet chair from Idiocracy, Who would make the best mayor in Sim City 2000, screensavers are cool, real game consoles vs emulators, running a BBS on a Raspberry Pi, Gary Kildall vs Bill Gates, computer pranks, Space Quest on a CGA hand-held computer, what is our favorite platformer of all time&hellip; also dad jokes.


guid: https://lunduke.com/posts/2020-06-17-b/
title: Bigotry in the Tech Industry Sucks
url: https://lunduke.com/posts/2020-06-17-b/
feedurl: https://lunduke.com/index.xml
content:
You can watch the companion video to this article on LBRY or YouTube, or listen to the audio podcast (links on the left).
 Racism sucks. Sexism sucks. Heck, any type of bigotry and hatred sucks.
I stand pretty firm on that. And, I think it's a safe bet, that most of you out there feel the same.
I would posit that the bigotry problem, within the Tech industry (and possibly the rest of the world&hellip; though the Tech industry is where I'm focusing, as that is the area I know the best), goes far beyond racism and sexism.


guid: https://lunduke.com/posts/2020-06-19/
title: Comic: Dungeons & Dragons & Privilege
url: https://lunduke.com/posts/2020-06-19/
feedurl: https://lunduke.com/index.xml
content:
This is actually a real thing. Not a joke. Totally for realsies.
 
The Lunduke Journal is made possible, in part, through the support of Linode. Want awesome Linux cloud hosting while supporting The Lunduke Journal in the process? Check out Linode. Right now Linode is offering $60 in hosting credits which expire after 60 days. That's crazy awesome. $60 bucks of hosting goes a surprisingly long way.
You can also check out the &ldquo;Support The Lunduke Journal&rdquo; page for a variety of ways you can help directly support the good, nerdy articles, podcasts, and videos we produce.


guid: https://lunduke.com/pages/support/
title: Why You Should Subscribe To The Lunduke Journal
url: https://lunduke.com/pages/support/
feedurl: https://lunduke.com/index.xml
content:
Subscribing via Patreon or Locals is a handy, convenient way to help support The Lunduke Journal.
In addition to some seriously warm, fuzzy feelings, subscribers to The Lunduke Journal (on both Locals and Patreon) also get the following benefits:
Weekly Exclusive Lunduke Podcast Once each week, Lunduke records an audio show just for the subscribers. Casual. Nerdy. Unscripted. Fun.
You won't find these episodes on YouTube, LBRY, or the public podcast feed.


guid: https://lunduke.com/posts/2020-06-22/
title: Children's Book: Linux for Hank
url: https://lunduke.com/posts/2020-06-22/
feedurl: https://lunduke.com/index.xml
content:
Back in 2013, I wrote a children's book for my daughter.
A book about Linux&hellip; that I could read to a 2 year old. I called it &ldquo;Linux for Hank.&rdquo;
The digital version (in both PDF and CBZ formats &ndash; DRM free, naturally) is available as a perk for everyone who subscribes to The Lunduke Journal either via Patreon or Locals.
 Step 1) Subscribe via Patreon or Locals.
  Step 2) Download the DRM-Free version of &ldquo;Linux for Hank&rdquo; from either Locals or Patreon.


guid: http://theoatmeal.com/comics/before_after_quarantine
title: Before and after quarantine
author: Matthew Inman
url: http://theoatmeal.com/comics/before_after_quarantine
feedurl: http://feeds.feedburner.com/oatmealfeed
content:
<a href="http://theoatmeal.com/comics/before_after_quarantine"><img width="600" src="https://s3.amazonaws.com/theoatmeal-img/thumbnails/before_after_quarantine_big.png" alt="Before and after quarantine" class="border0" /></a><p>Breakfast, lunch, dinner.</p><a href="http://theoatmeal.com/comics/before_after_quarantine">View on my website</a><br /><br />


guid: http://theoatmeal.com/comics/rookie
title: Step aside, rookie.
author: Matthew Inman
url: http://theoatmeal.com/comics/rookie
feedurl: http://feeds.feedburner.com/oatmealfeed
content:
<a href="http://theoatmeal.com/comics/rookie"><img width="600" src="https://s3.amazonaws.com/theoatmeal-img/thumbnails/rookie_big.png" alt="Step aside, rookie." class="border0" /></a><p>Fight fire with fire.</p><a href="http://theoatmeal.com/comics/rookie">View on my website</a><br /><br />


guid: http://theoatmeal.com/comics/slowfast
title: Slowfast
author: Matthew Inman
url: http://theoatmeal.com/comics/slowfast
feedurl: http://feeds.feedburner.com/oatmealfeed
content:
<a href="http://theoatmeal.com/comics/slowfast"><img width="600" src="https://s3.amazonaws.com/theoatmeal-img/thumbnails/slowfast_big.png" alt="Slowfast" class="border0" /></a><p>A comic about being tired and also full of energy.</p><a href="http://theoatmeal.com/comics/slowfast">View on my website</a><br /><br />


guid: http://theoatmeal.com/comics/plunge
title: Plunge
author: Matthew Inman
url: http://theoatmeal.com/comics/plunge
feedurl: http://feeds.feedburner.com/oatmealfeed
content:
<a href="http://theoatmeal.com/comics/plunge"><img width="600" src="https://s3.amazonaws.com/theoatmeal-img/thumbnails/plunge_big.png" alt="Plunge" class="border0" /></a><p>A comic about books</p><a href="http://theoatmeal.com/comics/plunge">View on my website</a><br /><br />


guid: http://theoatmeal.com/comics/finishing_project
title: Finishing a project
author: Matthew Inman
url: http://theoatmeal.com/comics/finishing_project
feedurl: http://feeds.feedburner.com/oatmealfeed
content:
<a href="http://theoatmeal.com/comics/finishing_project"><img width="600" src="https://s3.amazonaws.com/theoatmeal-img/thumbnails/finishing_project_big.png" alt="Finishing a project" class="border0" /></a><p>A comic about cheetahs and tricycles.</p><a href="http://theoatmeal.com/comics/finishing_project">View on my website</a><br /><br />


guid: http://theoatmeal.com/comics/reincarnation
title: When I die
author: Matthew Inman
url: http://theoatmeal.com/comics/reincarnation
feedurl: http://feeds.feedburner.com/oatmealfeed
content:
<a href="http://theoatmeal.com/comics/reincarnation"><img width="600" src="https://s3.amazonaws.com/theoatmeal-img/thumbnails/reincarnation_big.png" alt="When I die" class="border0" /></a><p>Reincatnation.</p><a href="http://theoatmeal.com/comics/reincarnation">View on my website</a><br /><br />


guid: http://theoatmeal.com/comics/vibes
title: Vibes
author: Matthew Inman
url: http://theoatmeal.com/comics/vibes
feedurl: http://feeds.feedburner.com/oatmealfeed
content:
<a href="http://theoatmeal.com/comics/vibes"><img width="600" src="https://s3.amazonaws.com/theoatmeal-img/thumbnails/vibes_big.png" alt="Vibes" class="border0" /></a><p>A comic about positivity. </p><a href="http://theoatmeal.com/comics/vibes">View on my website</a><br /><br />


guid: http://theoatmeal.com/comics/boredom_overeating
title: Boredom + Overeating
author: Matthew Inman
url: http://theoatmeal.com/comics/boredom_overeating
feedurl: http://feeds.feedburner.com/oatmealfeed
content:
<a href="http://theoatmeal.com/comics/boredom_overeating"><img width="600" src="https://s3.amazonaws.com/theoatmeal-img/thumbnails/boredom_overeating_big.png" alt="Boredom + Overeating" class="border0" /></a><p>A comic about friendship.</p><a href="http://theoatmeal.com/comics/boredom_overeating">View on my website</a><br /><br />


guid: http://theoatmeal.com/comics/oracle_compliments
title: I have a hard time taking compliments
author: Matthew Inman
url: http://theoatmeal.com/comics/oracle_compliments
feedurl: http://feeds.feedburner.com/oatmealfeed
content:
<a href="http://theoatmeal.com/comics/oracle_compliments"><img width="600" src="https://s3.amazonaws.com/theoatmeal-img/thumbnails/oracle_compliments_big.png" alt="I have a hard time taking compliments" class="border0" /></a><p>A comic about taking compliments.</p><a href="http://theoatmeal.com/comics/oracle_compliments">View on my website</a><br /><br />


guid: https://djangogigs.com//gigs/senior-backend-developer-python-django-bambus-io/
title: Senior Backend Developer (Python/Django)
author: Django Gigs
url: https://djangogigs.com//gigs/senior-backend-developer-python-django-bambus-io/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<p><strong>Vienna, Austria </strong></p>
<p><em>On-Site</em></p>
<p>In this job, you’ll be improving the structure and robustness of our customer-facing web application as well as adding a host of new features, ranging from API integrations to security features. You will be managing development cycles, maintaining our products, and keeping customer data secure. The core technologies for this role include <strong>Django</strong> and <strong>PostgreSQL</strong>.</p><p></p><p>As an ideal candidate, you will have previously played a significant role in the development of a large-scale web application and have extensive experience with Django and some Javascript experience (not required!). Feel free to apply if you have other relevant skills and experience that you think may make you a valuable member of our team.</p><p></p>Requirements<ul><li>Hands-on attitude and personal initiative</li><li>At least 5 years of agile development experience</li><li>Previous project management responsibilities</li><li>Desire to grow and learn</li><li>Self-starter and able to operate in a dynamic environment</li><li>Ability to work on multiple projects concurrently</li><li>Creative mindset and ready to try and learn new methods</li><li>Fluent in German AND/OR English</li></ul><p></p><p><strong><em>Not required (but a plus)</em></strong></p><ul><li><em>Particular interest in security and working with financial data</em></li><li><em>Experience with test automation: unit/integration/functional testing</em></li><li><em>Experience with CI/CD processes</em></li><li><em>Familiarity with or interest in DevOps (Terraform)</em></li></ul><p></p>We offer<ul><li>The opportunity to build a revolutionary platform</li><li>A dynamic multinational team without hierarchies</li><li>The opportunity for you to grow with Bambus</li><li>A sunny and modern office</li></ul><p></p><p>Additional information</p><ul><li>Start: Immediately</li><li>Location: Vienna (we're not recruiting remotely for this position, but we're open to cover relocation costs)</li><li>Language requirements: German AND/OR English</li></ul><p></p><p>Bambus enables home-owners to act like professional investors. Real estate assets should give their owners financial freedom and flexibility, rather than limit their options. Our approach to asset-backed lending will fundamentally change the way home-owners manage their property. </p><p></p><p>We're funded, growing and look forward to receiving your application.</p>


guid: http://djangojobs.net/jobs/922/full-stack-developer-mfd-wanted-fifty2-technology-gmbh/
title: Full Stack Developer (m/f/d) - WANTED
author: Djangojobs.Net
url: http://djangojobs.net/jobs/922/full-stack-developer-mfd-wanted-fifty2-technology-gmbh/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<h4>We at FIFTY2 Technology GmbH love great technical products. With our software, customers can test and optimize the functionality of their product ideas quickly and cost-effectively. Our simulation and visualization software, PreonLab, is used worldwide by leading producers in the automotive, machine and household appliance industries. PreonLab convinces our customers with its unique performance in calculation and extraordinary efficiency in use.</h4>
<h4><strong>// Your Responsibilities:</strong></h4>
<ul>
<li>Developing new features for our innovative web application that helps users manage and evaluate simulations</li>
<li>Improving and extending the communication between the backend and the high-performance computers</li>
<li>Designing appealing and easy-to-use Web UIs</li>
<li>Optimization of the application for mobile devices</li>
</ul>
<h4><strong>// This is YOU:</strong></h4>
<ul>
<li>Successfully completed studies in computer science or another comparable qualification</li>
<li>Good knowledge of Python, web frameworks (Django), web development, databases as well as Celery characterize you</li>
<li>Agile software development is your passion</li>
<li>Formulating and ensuring best practices, testing and code standards are no problems for you</li>
</ul>
<h4><strong>// What we promise:</strong></h4>
<ul>
<li>Collaboration in our growing agile team of experienced software developers with an open mindset</li>
<li>Friendly working atmosphere</li>
<li>Personal and technical advancement every day</li>
<li>Permanent employment at fair conditions</li>
<li>Full-time, part-time or home office: We support you in designing your work according to your needs</li>
<li>Bike-leasing, table soccer, smoothies, hackathons</li>
</ul>
<p>Interested? We are looking forward to your application at jobs@fifty2.eu!</p>
<h3><strong>About us</strong></h3>
<p>Creating software is an art, and an effective team of artists can do magic. At FIFTY2, we support each other in every situation. We embrace innovative ideas, take risks and see failures as an integral part of success and growth.</p>
<h4>// Become a Preoneer.</h4>
<p>We strongly encourage YOU to bring in your own ideas, participate in decisions and be part of the development. We empower each other to bring unique perspectives and work experiences to the team. A great team of skilled developers is waiting for you to code, discuss, sharing food, laugh and kicker.</p>
<h4>// Usable. Reliable. Efficient.</h4>
<p>Our software PreonLab with the meshless PREON technology is the result of many years of research with one goal: Finding a new approach for fluid simulation that allows for physically accurate simulations in unprecedented resolutions. PreonLab enables engineers to tackle hydrodynamic problems by giving better answers with less time and costs. It makes engineering more creative, innovative and efficient than ever before. </p>
<h4>// Our Story.</h4>
<p>Founded in 2015 at the computer science institute of Freiburg University, we are now a successful spin-off with well known international customers. With our software, customers can test and optimize the functionality of their product ideas quickly and cost-effectively. Our simulation and visualization software, PreonLab, is used worldwide by leading producers in the automotive, machine and household appliance industries.</p>


guid: https://landing.jobs/at/valispace/front-end-developer-angularjs-in-lisbon
title: Front-end Developer (AngularJS)
author: Landing.jobs
url: https://landing.jobs/at/valispace/front-end-developer-angularjs-in-lisbon
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/b4f9d2ac0c2f1c4b512cdec3a137f44eb0cfdcfe/small.png?1535536162" /><div class="offer-info">At Valispace (Full-time), in Lisbon, Portugal<br />Salary: €25.000 - €55.000<br />Expires at: 2020-06-03</div><div class="role-description"><p></p><p><strong>At Valispace we are developing the "GitHub for hardware":<br></strong><br></p><p>Do you want to see Mars colonies, underwater data centers and self-flying taxis come to life soon? Valispace is a collaborative engineering software that enables hardware engineers to build the products of the future. Instead of mailing design files back and forth and copy-pasting information across documentation, we allow multidisciplinary teams to collaborate with a single source of truth of engineering data.<br><br></p><p>Today, engineering teams already develop satellites, rockets and space stations with Valispace, but our fast-paced international team won’t stop until we have conquered all complex engineering verticals. Want to join the ride?<br><br></p><p>You will join our international team that is currently migrating our system to Angular. With an open-minded environment, we value teamwork, provide flexibility and we are looking forward to hearing your ideas and opinions. <br> </p><p><strong>At Valispace you will:<br></strong><br></p><ul>
<li>Work in a dynamic startup environment.</li>
<li>Take responsibility from day one.</li>
<li>Be a fundamental part of an amazing team. </li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><p><strong> You are the perfect match, because you:<br></strong><br></p><ul>
<li>Want to provide the best experience for the user to achieve their goals, by understanding their needs and interactions with our platform, validating designs with A/B testing and other similar methods.</li>
<li>Have a keen eye for design and details.</li>
<li>Have experience in Angular 8 or another front-end framework.</li>
<li>Have a strong foundation in HTML5, SCSS/LASS.</li>
<li>Have a good understanding of flex layout and material design.</li>
</ul>
</div></section><section><h1>Nice to have</h1><div class="nice-to-have"><p>Extra points: REST, Django, Python.</p>
</div></section><section><h1>Perks</h1><div class="perks"><ul>
<li>Flexible working hours</li>
<li>Work in our office in central sunny Lisbon</li>
<li>Private Health Insurance</li>
<li>Meal subsidy</li>
<li>Work from home when needed </li>
</ul>
</div></section>


guid: https://landing.jobs/at/valispace/full-stack-developer-python-in-lisbon
title: Full-stack Developer (Python)
author: Landing.jobs
url: https://landing.jobs/at/valispace/full-stack-developer-python-in-lisbon
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/b4f9d2ac0c2f1c4b512cdec3a137f44eb0cfdcfe/small.png?1535536162" /><div class="offer-info">At Valispace (Full-time), in Lisbon, Portugal<br />Salary: €25.000 - €55.000<br />Expires at: 2020-06-03</div><div class="role-description"><p></p><p> <strong>At Valispace we accelerate the path to the future:<br></strong><br></p><p>Do you want to see Mars colonies, underwater data centers and self-flying taxis come to life soon? Valispace is a collaborative engineering software that enables hardware engineers to build the products of the future. Instead of mailing design files back and forth and copy-pasting information across documentation, we allow multidisciplinary teams to collaborate with a single source of truth of engineering data.<br><br></p><p>Today teams already develop satellites, rockets and space stations with Valispace, but our fast-paced international team won’t stop until we have conquered all complex engineering verticals. Want to join the ride?<br><br></p><p>You will join our international team that is creating new features in Django/Python while improving, testing and optimizing our current platform. With an open-minded environment, we value teamwork, provide flexibility and we are looking forward to hearing your ideas and opinions. <br> </p><p><br data-mce-bogus="1"></p><p><strong>At Valispace you will: </strong>Work in a dynamic startup environment.<strong><br></strong></p><ul>
<li>Take responsibility from day one.</li>
<li>Be a fundamental part of an amazing team.</li>
<li>Have room to create and innovate.</li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p><strong>You are the perfect match, because you:<br></strong><br></p><ul>
<li>Want to provide the best experience for the user to achieve their goals, by understanding their needs and interactions with our platform.</li>
<li>Design and develop scalable cloud-based software and RESTful APIs.</li>
<li>Have at least 3 years of experience in the development of systems and applications in Django/Python or other similar frameworks.</li>
<li>Have a strong foundation in HTML5, SCSS/LASS.</li>
</ul><p><br><br><strong>Extra points: REST, Docker, AWS, Angular. <br></strong><br></p>
</div></section><section><h1>Nice to have</h1><div class="nice-to-have"><p><strong>Extra points: </strong>REST, Docker, AWS, Angular. </p>
</div></section><section><h1>Perks</h1><div class="perks"><ul>
<li>Flexible working hours</li>
<li>Work in our office in central sunny Lisbon</li>
<li>Private Health Insurance</li>
<li>Meal subsidy</li>
<li>Work from home when needed </li>
</ul>
</div></section>


guid: https://landing.jobs/at/valispace/full-stack-developer-in-lisbon-2020-3-9
title: Full-stack Developer
author: Landing.jobs
url: https://landing.jobs/at/valispace/full-stack-developer-in-lisbon-2020-3-9
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/b4f9d2ac0c2f1c4b512cdec3a137f44eb0cfdcfe/small.png?1535536162" /><div class="offer-info">At Valispace (Full-time), in Lisbon, Portugal<br />Salary: €25.000 - €55.000<br />Expires at: 2020-06-03</div><div class="role-description"><p></p><p></p><p> <strong>At Valispace we accelerate the path to the future:<br></strong><br></p><p></p><p>Do you want to see Mars colonies, underwater data centers and self-flying taxis come to life soon? Valispace is a collaborative engineering software that enables hardware engineers to build the products of the future. Instead of mailing design files back and forth and copy-pasting information across documentation, we allow multidisciplinary teams to collaborate with a single source of truth of engineering data.<br><br></p><p></p><p>Today teams already develop satellites, rockets and space stations with Valispace, but our fast-paced international team won’t stop until we have conquered all complex engineering verticals. Want to join the ride?<br><br></p><p></p><p>You will join our international team that is creating new features in Django/Python while improving, testing and optimizing our current platform. With an open-minded environment, we value teamwork, provide flexibility and we are looking forward to hearing your ideas and opinions. <br>  <br></p><p></p><p><strong>At Valispace you will: </strong>Work in a dynamic startup environment.<strong><br></strong></p><ul>
<li>Take responsibility from day one.</li>
<li>Be a fundamental part of an amazing team.</li>
<li>Have room to create and innovate.</li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><p><strong>You are the perfect match, because you:<br></strong><br></p><ul>
<li>Want to provide the best experience for the user to achieve their goals, by understanding their needs and interactions with our platform.</li>
<li>Design and develop scalable cloud-based software and RESTful APIs.</li>
<li>Have at least 3 years of experience in the development of systems and applications in Django/Python or other similar frameworks.</li>
<li>Have a strong foundation in HTML5, SCSS/LASS.</li>
</ul><p></p><p><br></p>
</div></section><section><h1>Nice to have</h1><div class="nice-to-have"><p><strong>Extra points: </strong>REST, Docker, AWS, Angular. </p>
</div></section><section><h1>Perks</h1><div class="perks"><ul>
<li>Flexible working hours</li>
<li>Work in our office in central sunny Lisbon</li>
<li>Private Health Insurance</li>
<li>Meal subsidy</li>
<li>Work from home when needed </li>
</ul>
</div></section>


guid: https://djangogigs.com//gigs/purl-platform-lofgren/
title: PURL Platform
author: Django Gigs
url: https://djangogigs.com//gigs/purl-platform-lofgren/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<p><strong>, United States </strong></p>
<p><em>100% Remote</em></p>
<p>I want to re-build a platform we built over ten years ago. It is a marketing campaign platform using personal URLs to track and report.</p><p></p><p>Phase 1 is pretty straightforward. We need this piece done May 1, 2020. Phase 2 will come after that, but is not on an timeline yet. Basically we are creating marketing campaigns using personal URLs that we send to the prospect in a physical (snail mail) piece.</p><p></p><p>TARGET LIST</p><p>We get a target list from the client, we upload the target list into the database, the database creates unique URL_IDs for each target, which we can append to the custom domain name for the campaign to land on a personalized website. The format is typically www.CampaignDomainName.com/JohnSmith unless, of course, there are two John Smiths. Then we have it try SmithJohn, JSmith, John_Smith, John.Smith, until we're out of options in that campaign and have to start appending numbers to it.</p><p></p><p>The typical fields in a target list are: First, Last, Title, Formal Company Name, Casual Company Name, Email Address, Phone Number, Physical Address 1, Physical Address 2, City, State, Zip Code, Segment, Assigned Sales Rep, Assigned Sales Rep Email, Assigned Sales Rep Mobile and URL_ID. Then we have Custom Fields that we use in the copy to further customize the website. For example, we might say "Hello, [First]. We know you're doing great things at [Casual Company Name]. There are almost always exciting things going on in the [Custom1] department!" where "Custom1" is "accounting," or "sales" or "IT" and so on.</p><p></p><p>SITELET(campaign-specific website)</p><p>So, each target in the target list has his/her own version of the campaign website, which is pulling in that target's variables on any given page on the campaign website, as demonstrated in the paragraph above.</p><p></p><p>You'll need to create a way for us to send you a zipped up static website (HTML, CSS, JavaScript, images) and have you integrate it into the platform with the variables pulling in from the database. In Phase 1, the website will be roughly 8-10 pages and the entire user process will be linear, with only a "next" button to lead them to the next page. Then there is a form on the last page that the user can complete that provides updated contact information and requests to learn more. That form can't overwrite the exiting target record, because sometimes they'll put "not telling you" or something in there and we don't want to lose the original information.</p><p></p><p>TRACKING</p><p>When a user goes through the site, we want to know the following things:</p><p></p><p>John Smith landed on Page 1 at this time, this date</p><p>John Smith landed on Page 2, at this time, this date</p><p>John Smith landed on Page 3, at this time, this date</p><p>...and so on.</p><p>John Smith completed and submitted the contact form, at this time, this date</p><p></p><p>NOTIFICATIONS</p><p>When a user hits Page 1, we want to send out an email (and maybe SMS) notification to the Assigned Sales Rep in that target's record. The notification will typically include things like:</p><p></p><p>--</p><p>Original Contact Name: John Smith</p><p>Original Contact Title: Vice President of Sales</p><p>Original Contact Company: Acme</p><p>Original Contact Phone: 123-555-1212</p><p>Original Contact Email:</p><p></p><p>John Smith first visited the website on [date] at [time].</p><p>John Smith last visited the website on [date] at [time].</p><p>John Smith got to Page 6 before leaving the website.</p><p></p><p>Submitted Contact Name: John Smith</p><p>Submitted Contact Title: VP Sales</p><p>Submitted Contact Phone: 321-555-1214</p><p>Submitted Contact Email: jsmith@acme.com</p><p>Submitted Preferred Contact Method: Email</p><p>--</p><p></p><p>We classify users into four buckets:</p><p>1) Visitor - hit Page 1</p><p>2) Value Prop - hit Page X of the site (this changes per campaign, but it is always the page after the user sees the logo of the client as the logo is usually not on the first 3-4 pages)</p><p>3) Warm - hit the Form Page (doesn't matter if they completed the form or not)</p><p>4) Hot - Completed the Form; Landed on the Confirmation Page (the last page)</p><p></p><p>We want to be able to tell the assigned salesperson that the target is just a Visitor, or a Value Prop, or a Warm or a Hot. So we have four different notifications that go to the assigned salesperson (this is because there is more information to provide for Hot than Warm, more information to provide for Warm than Value Prop, and more information to provide for Value Prop than Visitor.</p><p></p><p>These notifications are a little more complex than they look, because we don't want to overwhelm the client with notifications for each and every page. Frankly, we really just need to notify them when the user leaves the site. We used to solve that by having a delay on each notification that checked to see if the user got to the next milestone before sending. For example:</p><p></p><p>1) User lands on Page 1; "Visitor" Notification is teed up; Hold for X minutes.</p><p>2) X minutes pass; Check to see if "Warm" Notification has been teed up; If so, cancel "Visitor" Notification. If not, send "Visitor" Notification</p><p>3) User lands on Page 5 (example); "Warm" Notification is teed up; Hold for Y minutes.</p><p>4) Y minutes pass; Check to see if "Hot" Notification has gone out; If no, send "Warm" Notification; If so, cancel "Warm" Notification.</p><p></p><p>There may be a slicker way to handle this after all this time, but the goal is to really only have the salesperson receive one notification as quickly as possible to the time the user is on his/her website.</p><p></p><p>So you'll need a place for us to define the notification templates, which will also pull variables from the list.</p><p></p><p>REPORTING</p><p>We basically want to see everything we can and we'd like to be able to slice and dice the data based on whatever we want. I am hoping that by now there are reporting packages that make this a little less custom than it was when we did this before.</p><p></p><p>Here is some of the terminology we use:</p><p>Target - a prospect of our client's that is in the target list</p><p>Invited - in the target list and has been sent a mail piece</p><p>Batch # - we send out the mailers in "batches" so we can measure the direct mail piece's effectiveness before blowing our load. The other reason we do this is so as not to overwhelm the client with too many responses. We "slow drip" the mailers out.</p><p></p><p>"Invited" has to have some sort of trigger that says "these have been mailed," because we may have a list of 2,000 people but we're sending them out in batches over time and we don't want to mess up the reporting with false "invited" numbers. We would put a "Batch" number in the spreadsheet and then we would "activate" the Batch as we sent that batch out.</p><p></p><p>Things I know we'll need to see in the reporting section of the campaign's admin:</p><p>* Total number of Invited (only those activated), Visitor, Value Prop, Warm and Hot</p><p>* Percentage of Visitors from Invited (activated), Value Prop out of Invited, Value Prop out of Visitor, Warm out of Invited, Warm out of Value Prop, Warm out of Visitor, Hot out of Invited, Hot out of Value Prop, Hot out of Warm, Page 2 out of Page 1, Page 3 out of Page 2, and so on... (and obviously the number of pages varies from campaign to campaign, so we have to denote which pages are defined as "Value Prop" and "Warm," though "Warm" is always the second to last page).</p><p>* We need to be able to view it by All Segments, and by Individual Segments. We need to be able to view it by Date Range.</p><p>* We will often make changes to the site based on the performance of it along the way. So, we need a way to say "on this date, we made this change, which makes it Version 2" and then we need to be able to see the performance based on the Version or Date of Change. I want to be able to say "when we launched, we had 30% convert to Warm. We then made these changes and our Warm conversion raised up to 50%." For example.</p><p></p><p>I have a few videos that explain the old platform, which I will send you if you would like more information.</p>


guid: https://landing.jobs/at/creative-group-nl/senior-python-developer-in-amsterdam-2020
title: Senior Python Developer
author: Landing.jobs
url: https://landing.jobs/at/creative-group-nl/senior-python-developer-in-amsterdam-2020
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/d0c68689d88d4d0009dfb7c37ed35dae86615a53/small.png?1539010977" /><div class="offer-info">At Creative Group (Full-time), in Amsterdam, Netherlands<br />Expires at: 2020-06-10</div><div class="role-description"><p></p><p><strong>For our HQ in Amsterdam we are looking for you to join as our new senior Python developer. You will be in charge of guiding the team through the world of Python. As our main expert on Python you will help develop our fraud prevention systems. This is a greenfield project that will enable you to become the lead in our fraud prevention for digital value products. Can you recite the Python Philosophy in your sleep? Then keep reading!</strong><br> </p><p><strong>Your contribution to our mission</strong><br>Your mission, should you choose to accept it, is to start developing our fraud prevention system.It should be able to handle 60k orders a day on a big data set for programmatically detection. In a later stage we will use Machine Learning.<br>You will also become our primary advisor on Python. Part of your responsibilities will be to educate your team members on the Python Philosophy and of course be hands-on coding the new fraud prevention system. Your new team will consist of 3 developers that have experience with (mainly) PHP and a PO.<br><br>In order to become successful at Creative Group you will need to have a pragmatic approach to solving problems. An e-commerce background is a very big plus in our book. Sounds like an amazing opportunity, right? Check the full list below and hit the apply button now! </p><h4><strong>Your tasks will include things like</strong></h4><ul>
<li>Advice on Python/Django challenges</li>
<li>Participate in the design of the fraud prevention system</li>
<li>Write Python/Django code on the fraud prevention system</li>
<li>Educate your team members about Python and the Philosophy behind it</li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><h4><strong>You have...</strong></h4><ul>
<li>Solid (&gt;5 years) experience with Python and Django. </li>
<li>No problem explaining and implementing OOP and SOLID </li>
<li>Good soft skills, can communicate clearly with your team </li>
</ul>
</div></section><section><h1>Nice to have</h1><div class="nice-to-have"><p></p><p><strong>It's nice if you also have some extra skills such as...</strong></p><ul>
<li>Hands-on experience with PHP</li>
<li>Experience with data engineering</li>
<li>Building fraud prevention systems</li>
<li>Know-how about Apache Spark </li>
</ul>
</div></section><section><h1>Perks</h1><div class="perks"><p></p><h4><strong>We will offer you...</strong></h4><ul>
<li>30 days vacation to enjoy</li>
<li>The best relocation package in Amsterdam!</li>
<li>Budget &amp; time for your personal growth plan, conferences, and events</li>
<li>Macbook Pro (13" or 15") + noise-canceling headset</li>
<li>Good compensation and contribution to the pension scheme</li>
<li>Refactor your body with our weekly Bootcamps &amp; Yoga</li>
<li>Free Dutch courses together with your colleagues</li>
<li>Free lunch &amp; snacks (vegetarian &amp; vegan options included)</li>
<li>A multicultural environment with 100 colleagues and over 24 different nationalities and growing</li>
</ul>
</div></section>


guid: https://djangogigs.com//gigs/python-django-engineer-united-states/
title: Python / Django Engineer
author: Django Gigs
url: https://djangogigs.com//gigs/python-django-engineer-united-states/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<p><strong>, United States </strong></p>
<p><em>100% Remote</em></p>
<p>SilverCloud is being used by over 240 organizations globally to support the mental health needs of their end users/patients. </p><p>We are looking for a commercially experienced mid to senior level Software Engineer to join our engineering team. You will be involved in the evolution of our products for our US customer base.</p><p></p><p><strong>SilverCloud will support you to: </strong></p><ul><li>Work closely with Product Management, Customer Success and Customer Support to identify technical solutions to customer pain points. (Figure out what they want and what we can build)</li><li>Provide scoping estimates and plan project objectives, functional requirements, technical specifications. (Plan it)</li><li>Develop and maintain efficient, usable, well-constructed and documented program code in a timely manner whilst conforming to best practice standards. (Build it)</li><li>Ensure that SilverCloud's products are developed in a secure, scalable and maintainable manner in line with our Secure Software Development Lifecycle policies. (Build it well)</li></ul>


guid: https://landing.jobs/at/travelperk/software-engineer-in-barcelona-2020
title: Software Engineer
author: Landing.jobs
url: https://landing.jobs/at/travelperk/software-engineer-in-barcelona-2020
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/74eca09a69fa50cdd4f09a08656de0cfe70d7169/small.png?1489069493" /><div class="offer-info">At TravelPerk (Full-time), in Barcelona, Spain<br />Expires at: 2020-07-21</div><div class="role-description"><p></p><p>Are you a Software Engineer with extensive programming experience? Is your code fast, efficient and reliable? Do you particularly enjoy working with amazing people, having fun at work and building something awesome? If so, let’s talk!</p><p>TravelPerk is building a next-generation platform to take the pain out of booking and managing business travel. Join a team of good and talented people from 30+ countries who have come together in Barcelona to reinvent the concept of business travel and how it’s done. Backed by the same investors as Slack, Twitter and Trello, we have the resources to accelerate growth and build something truly amazing.</p><p>We encourage our team to take initiative, suggest new ideas and pursue them. As owners, every permanent employee receives company stock options from day one. If you join our product team, you will work on a day-to-day basis to design, architect and implement our product. You can discover our stack <a href="https://bit.ly/travelperk-stack" target="_blank" rel="noopener noreferrer" data-mce-href="https://bit.ly/travelperk-stack">here</a>, but we’re not looking for stack experts. We’re looking for smart people who can bring in the best tools and processes to get the job done. Read more about culture and what it takes to be a part of the engineering team behind Europe’s fastest growing SaaS startup from our VP of Engineering in this <a href="https://thoughts.travelperk.com/how-to-make-an-impact-in-barcelona-with-the-travelperk-engineering-team-dc65398649fa?utm_source=job-sescription&amp;utm_medium=social%20&amp;utm_campaign=job-vp-engineering-blog" target="_blank" rel="noopener noreferrer" data-mce-href="https://thoughts.travelperk.com/how-to-make-an-impact-in-barcelona-with-the-travelperk-engineering-team-dc65398649fa?utm_source=job-sescription&amp;utm_medium=social%20&amp;utm_campaign=job-vp-engineering-blog">link</a>.</p><p>As a <strong>Software Engineer</strong> at TravelPerk, you will be involved in several challenges:</p><ul>
<li>Product development in <strong>Python/Django and React</strong> of a travel-related web-based product</li>
<li>Integrations between our product to 3rd party APIs</li>
<li>Architecture design, implementation, and testing </li>
</ul><p><img src="https://assets.landing.jobs/cms-assets/files/1318/original/group-pic-big.jpg" data-mce-src="https://assets.landing.jobs/cms-assets/files/1318/original/group-pic-big.jpg"></p>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><ul>
<li>"Product Engineering" mindset</li>
<li>Relevant experience in similar roles building technically complex products <strong>in any web programming language</strong>
</li>
<li>Experience at server-side, client-side or Full-stack development. Your final role within the team will depend on your skills</li>
<li>Experience writing highly efficient asynchronous code</li>
<li>Obsession for quality and testing</li>
<li>Eager to learn new technologies and frameworks</li>
<li>Strong English communication skills. No prior knowledge of Spanish is required</li>
<li>Experience working in an Agile environment with strong attention to a well-documented code, unit testing, and continuous integration </li>
</ul><p><img src="https://assets.landing.jobs/cms-assets/files/575/original/img_6934_7201.png" data-mce-src="https://assets.landing.jobs/cms-assets/files/575/original/img_6934_7201.png"></p>
</div></section><section><h1>Nice to have</h1><div class="nice-to-have"><p></p><ul>
<li>Experience in the travel industry</li>
<li>DevOps experience with the AWS suite or similar</li>
<li>Experience working in high-performing development teams</li>
<li>You are someone who likes to build stuff (we really like people who maintain/contribute to open source projects) </li>
</ul><p><img src="https://assets.landing.jobs/cms-assets/files/1319/original/team-garden-big-a94a2b.jpg" data-mce-src="https://assets.landing.jobs/cms-assets/files/1319/original/team-garden-big-a94a2b.jpg"></p>
</div></section><section><h1>Benefits & Perks</h1><div class="perks"><p></p><ul>
<li>Beautiful office with different spaces for every mood</li>
<li>Competitive compensation including stock options in the company</li>
<li>Generous vacation time and flexible working hours</li>
<li>Healthcare benefits: private health scheme, wellness programs, yoga, meditation, gym allowance</li>
<li>Free Spanish classes</li>
<li>Finest gear and anything you need to do your best work</li>
<li>Fully stocked kitchen loaded with healthy food, fresh fruit, snacks, coffee &amp; beverages</li>
<li>Have a direct impact by helping to crack one of the world's biggest unsolved business problems affecting over 300,000 travelers every day</li>
<li>Rub shoulders with brilliant people who have been-there-done-that</li>
<li>Own, shape and develop your career within a fast-growing startup; TravelPerk is growing over 30% month over month</li>
<li>Having fun is part of our DNA. We work hard and never give up. And we love to do so with a smile on our face </li>
</ul><p><img src="https://assets.landing.jobs/cms-assets/files/1320/original/tk-coffee-big.jpg" data-mce-src="https://assets.landing.jobs/cms-assets/files/1320/original/tk-coffee-big.jpg"></p>
</div></section>


guid: https://landing.jobs/at/travelperk/senior-software-engineer-in-barcelona-2020-4
title: Senior Software Engineer
author: Landing.jobs
url: https://landing.jobs/at/travelperk/senior-software-engineer-in-barcelona-2020-4
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/74eca09a69fa50cdd4f09a08656de0cfe70d7169/small.png?1489069493" /><div class="offer-info">At TravelPerk (Full-time), in Barcelona, Spain<br />Expires at: 2020-07-21</div><div class="role-description"><p></p><p>Are you a Senior Software Engineer with extensive programming experience? Is your code fast, efficient and reliable? Do you particularly enjoy working with amazing people, having fun at work and building something awesome? If so, let’s talk!</p><p>TravelPerk is building a next-generation platform to take the pain out of booking and managing business travel. Join a team of good and talented people from 30+ countries who have come together in Barcelona to reinvent the concept of business travel and how it’s done. Backed by the same investors as Slack, Twitter and Trello, we have the resources to accelerate growth and build something truly amazing.</p><p>We encourage our team to take initiative, suggest new ideas and pursue them. As owners, every permanent employee receives company stock options from day one. If you join our product team, you will work on a day-to-day basis to design, architect and implement our product. You can discover our stack <a href="https://bit.ly/travelperk-stack" target="_blank" rel="noopener noreferrer" data-mce-href="https://bit.ly/travelperk-stack">here</a>, but we’re not looking for stack experts.</p><p>We’re looking for smart people who can bring in the best tools and processes to get the job done. Read more about culture and what it takes to be a part of the engineering team behind Europe’s fastest growing SaaS startup from our VP of Engineering in this <a href="https://thoughts.travelperk.com/how-to-make-an-impact-in-barcelona-with-the-travelperk-engineering-team-dc65398649fa?utm_source=job-sescription&amp;utm_medium=social%20&amp;utm_campaign=job-vp-engineering-blog" target="_blank" rel="noopener noreferrer" data-mce-href="https://thoughts.travelperk.com/how-to-make-an-impact-in-barcelona-with-the-travelperk-engineering-team-dc65398649fa?utm_source=job-sescription&amp;utm_medium=social%20&amp;utm_campaign=job-vp-engineering-blog">link</a>.</p><p>As a <strong>Senior Software Engineer</strong> at TravelPerk, you will be involved in several challenges:</p><ul>
<li>Product development in <strong>Python/Django and React</strong> of a travel-related web-based product</li>
<li>Integrations between our product to 3rd party APIs</li>
<li>Architecture design, implementation, and testing</li>
<li>Mentor, coach, and train other colleagues as a domain expert </li>
</ul><p><img src="https://assets.landing.jobs/cms-assets/files/1318/original/group-pic-big.jpg" data-mce-src="https://assets.landing.jobs/cms-assets/files/1318/original/group-pic-big.jpg"></p>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><ul>
<li>"Product Engineering" mindset</li>
<li>Extensive experience in similar roles building technically complex products <strong>in any of the following web programming languages: Python, Django or React </strong>
</li>
<li>At least 5 years of experience</li>
<li>Expert level both at server-side and at client-side development</li>
<li>Experience writing highly efficient asynchronous code</li>
<li>Obsession for quality and testing </li>
<li>Eager to learn new technologies and frameworks</li>
<li>Strong English communication skills. No prior knowledge of Spanish is required</li>
<li>Experience working in an Agile environment with strong attention to a well-documented code, unit testing, and continuous integration</li>
</ul><p><img src="https://assets.landing.jobs/cms-assets/files/575/original/img_6934_7201.png" data-mce-src="https://assets.landing.jobs/cms-assets/files/575/original/img_6934_7201.png"></p>
</div></section><section><h1>Nice to have</h1><div class="nice-to-have"><p></p><ul>
<li>Experience in the travel industry</li>
<li>DevOps experience with the AWS suite or similar</li>
<li>Experience working in high-performing development teams</li>
<li>You are someone who likes to build stuff (we really like people who maintain/contribute to open source projects) </li>
</ul><p><img src="https://assets.landing.jobs/cms-assets/files/1319/original/team-garden-big-a94a2b.jpg" data-mce-src="https://assets.landing.jobs/cms-assets/files/1319/original/team-garden-big-a94a2b.jpg"></p>
</div></section><section><h1>Benefits & Perks</h1><div class="perks"><p></p><ul>
<li>Beautiful office with different spaces for every mood</li>
<li>Competitive compensation including stock options in the company</li>
<li>Generous vacation time and flexible working hours</li>
<li>Healthcare benefits: private health scheme, wellness programs, yoga, meditation, gym allowance</li>
<li>Free Spanish classes</li>
<li>Finest gear and anything you need to do your best work</li>
<li>Fully stocked kitchen loaded with healthy food, fresh fruit, snacks, coffee &amp; beverages</li>
<li>Have a direct impact by helping to crack one of the world's biggest unsolved business problems affecting over 300,000 travelers every day</li>
<li>Rub shoulders with brilliant people who have been-there-done-that</li>
<li>Own, shape and develop your career within a fast-growing startup; TravelPerk is growing over 30% month over month</li>
<li>Having fun is part of our DNA. We work hard and never give up. And we love to do so with a smile on our face </li>
</ul><p><img src="https://assets.landing.jobs/cms-assets/files/1320/original/tk-coffee-big.jpg" data-mce-src="https://assets.landing.jobs/cms-assets/files/1320/original/tk-coffee-big.jpg"></p>
</div></section>


guid: https://djangogigs.com//gigs/backend-developer-nous-wissensmanagement-gmbh-4e5aqs/
title: Backend Developer
author: Django Gigs
url: https://djangogigs.com//gigs/backend-developer-nous-wissensmanagement-gmbh-4e5aqs/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<p><strong>Wien, Österreich </strong></p>
<p><em>Flexible</em></p>
<p>Senior Web Backend Developer</p><p></p><p>Do you see yourself as a member of a multinational team shaping the way people will communicate in the future? Seize the opportunity to revolutionize the digital world while enjoying what you do. NOUS is an expanding business headquartered in Vienna Austria, with branch ofﬁces in Denver (USA) and Dubai (UAE), and ranks among the leading providers in the field of mobile guides and media-based education. We have provided tailor-made concepts with innovative technology for over 200 projects of differing sizes along with various focuses realized with museums and cultural organizations as well as big brands worldwide. NOUS advises institutions and companies on adapting their educational role to bring them inline with this ever more digital world and develops multimedia, intuitive end-user and streaming applications on the web and other platforms. Be part of it!</p><p></p><p><strong>Your tasks</strong></p><p>As senior web backend developer at NOUS you</p><ul><li>work on backend development of challenging projects with our web team,</li><li>further develop programming environment and enhance continuous integration/delivery,</li><li>are responsible for software architecture, requirements and estimates, and</li><li>support our project managers and other team members with concepts, specifications, and documentation.</li></ul><p></p><p><strong>Your profile</strong></p><p>We are looking for you if you</p><ul><li>have extended working experience with back-end development having done projects in Python, Django,</li><li>have knowledge in the area of DevOps – preferably in configuration of Linux Systems, and automated software deployments,</li><li>bring several years of experience with databases (PostgreSQL, ideally also NoSQL),</li><li>ideally have English and German language skills and</li><li>love challenges.</li></ul><p></p><p><strong>Our offer</strong></p><p>We offer a position with varied and challenging tasks in a young and dynamic team and the possibility to do something meaningful. Loving technology we will provide you with cutting-edge gadgets. We are ﬂexible if you are - going on staff or long-term freelancing. Salary is negotiable – as full time employee (38,5 hours/week) we offer at least EUR 37.590,00 per year before taxes.</p><p></p><p>Start: as soon as possible</p><p></p><p><strong>Apply now!</strong></p><p>Email your CV, a covering letter stating your salary expectations and examples of published work or links to Github/Stackoverﬂow proﬁles to Claudia Schallert, jobs@nousdigital.net.</p>


guid: http://djangojobs.net/jobs/931/python-language-specialist-build-engineer-activestate/
title: Python Language Specialist - Build Engineer
author: Djangojobs.Net
url: http://djangojobs.net/jobs/931/python-language-specialist-build-engineer-activestate/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<p><strong>Job Description</strong></p>
<p>ActiveState Platform - made by developers for developers! We are reinventing build engineering with an on-demand SaaS Platform and CLI tool that lets developers automate the building of any runtime environment using any open source language ecosystem on any platform. In Beta right now, we support Python and Perl and we're hiring to add more languages and packages! We’re building an ambitious language distribution platform so that no engineer ever has to suffer dependency hell again, and we need your help maintaining Python 2 past its End of Life!</p>
<p><strong>What You’ll Be Doing</strong></p>
<p>You are a Python specialist with deep knowledge of Python internals including the C core. You will help maintain Python 2 now that the Python community has officially planned to end support for it. Work will include addressing security issues when identified, back porting applicable patches to the Python interpreter from Python 3 to 2 when possible.</p>
<p>Our day to day work practices are centered around GitHub, pull requests, code review, CI for testing, and agile development with Pivotal Tracker as our project management tool. We’re always looking to improve our practices and we expect you to help us to do so.</p>
<p>We like to use open source software whenever possible, and we also like to contribute back to the open source ecosystem. We embrace open sourcing both libraries and tools developed in-house as long as those are not mission-critical code.</p>
<p><strong>Restrictions</strong>
- Telecommuting is OK
- Agencies are OK</p>
<p><strong>Requirements</strong></p>
<p>Deep understanding of the Python 2 codebase
Excellent written and spoken skills, both technical and non-technical. You’ll need to work closely with your developer teammates, as well as be able to have coherent conversations with people from QA, sales, marketing, and other parts of the company.
A willingness to engage in the process of defining our work through conversations with product management, other engineering teams, and the rest of the company.
Assets</p>
<p>If you have experience with any of the following please make sure to highlight it in your cover letter:</p>
<ul>
<li>You are a maintainer, contributor to the core Python code base or have a popular Python based - Open Source project. We make special accommodations to help you maintain those activities.</li>
<li>Experience working on a build system.</li>
<li>Agile processes, including breaking large projects up into smaller stories, estimation, working in branches (GitHub Flow), code review, and CI.</li>
<li>C or C++ code and debugging compiler issues across platforms.
Perl, Python, Tcl, or PHP, especially an understanding of their respective language communities and their toolchains.</li>
<li>Big iron operating systems including Solaris, AIX, and HP-UX.</li>
<li>Build tools such as make, autotools, bazel, etc.</li>
</ul>
<p><strong>About the Company</strong></p>
<p>ActiveState has a collaborative, respectful, and professional culture. We’re all about working together to find the best solutions, and making sure that the experience of doing so is positive for everyone involved.</p>
<p>Our company is a team of 50+ and growing, with 2/3rds of the positions in technical roles including software development and QA. We maintain a set of core, overlapping hours, but we’re flexible with specific start and end times and are understanding about appointments and life events.</p>
<p>For more about working at ActiveState and our Glassdoor rating go to: www.activestate.com/careers</p>


guid: https://landing.jobs/at/switch/full-stack-engineer-in-porto-2020
title: Full-stack Engineer
author: Landing.jobs
url: https://landing.jobs/at/switch/full-stack-engineer-in-porto-2020
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/53a3ab125243ce0943da82b971fce9dcdeea7672/small.png?1498059740" /><div class="offer-info">At Switch (Full-time), in Porto, Portugal<br />Salary: €24.500 - €35.000<br />Expires at: 2020-08-03</div><div class="role-description"><p></p><div>If you are a talented and passionate developer, not afraid of stepping out of your comfort zone, yearning to learn with the best, and have a giant impact... We have a challenge for you. <br><br>At Switch, we have the challenge to build a product that it’s huge and must be scalable to match the most use cases possible. Furthermore, it also needs to be reliable to process millions of transactions for some of the largest online businesses in the world, complying with extremely critical security rules.<br><br><strong>Your role: <br></strong><br>
</div><ul>
<li>Develop new features, services, and apps across our platform;</li>
<li>Manage integrations with different payment stakeholders;</li>
<li>Improve our infrastructure orchestration, monitoring, and logging;</li>
<li>Ensure high-availability across all systems;</li>
<li>Work with our stack: Microservices, Docker, Consul, Ansible, Event Sourcing, PostgreSQL, MongoDB, Python, Django, Node.js, Angular, React. </li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><ul>
<li>At least 2 years of working experience in software development with Django or similar web framework;</li>
<li>Excellent knowledge in RESTful APIs;</li>
<li>Experienced in working with PostgreSQL, MongoDB and/or Redis;</li>
<li>Docker-based scalable infrastructure;</li>
<li>Good verbal and written English skills. </li>
</ul><div><br></div><div><br></div><div><br></div>
</div></section><section><h1>Benefits & Perks</h1><div class="perks"><p></p><ul>
<li>Work with people passionate about solving high complex tech challenges;</li>
<li>Impact on the product and culture;</li>
<li>Modern technologies and low tech debt:</li>
<li>Progress fast! We promote ownership, doesn’t matter years of experience nor age;</li>
<li>Flexible environment and work-life balance - as well as a good team environment;</li>
<li>The Switch Kit: Macbook Pro and others;</li>
<li>Health insurance with a dental plan;</li>
<li>Spotify and Netflix;</li>
<li>Daily transportation Braga &lt;&gt; Porto Office for someone who lives in Braga. </li>
</ul><div><br></div><div><br></div>
</div></section>


guid: https://landing.jobs/at/switch/full-stack-engineer-in-lisbon-2020-5
title: Full-stack Engineer
author: Landing.jobs
url: https://landing.jobs/at/switch/full-stack-engineer-in-lisbon-2020-5
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/53a3ab125243ce0943da82b971fce9dcdeea7672/small.png?1498059740" /><div class="offer-info">At Switch (Full-time), in Lisbon, Portugal<br />Salary: €24.500 - €35.000<br />Expires at: 2020-08-03</div><div class="role-description"><p></p><div>If you are a talented and passionate developer, not afraid of stepping out of your comfort zone, yearning to learn with the best, and have a giant impact... We have a challenge for you. <br><br>At Switch, we have the challenge to build a product that it’s huge and must be scalable to match the most use cases possible. Furthermore, it also needs to be reliable to process millions of transactions for some of the largest online businesses in the world, complying with extremely critical security rules.<br><br><strong>Your role: <br></strong><br>
</div><ul>
<li>Develop new features, services, and apps across our platform</li>
<li>Manage integrations with different payment stakeholders</li>
<li>Improve our infrastructure orchestration, monitoring, and logging</li>
<li>Ensure high-availability across all systems</li>
<li>Work with our stack: Microservices, Docker, Consul, Ansible, Event Sourcing, PostgreSQL, MongoDB, Python, Django, Node.js, Angular, React</li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><ul>
<li>At least 2 years of working experience in software development with Django or similar web framework</li>
<li>Excellent knowledge in RESTful APIs</li>
<li>Experienced in working with PostgreSQL, MongoDB and/or Redis</li>
<li>Docker-based scalable infrastructure</li>
<li>Good verbal and written English skills</li>
</ul><div><br></div><div><br></div><div><br></div>
</div></section><section><h1>Benefits & Perks</h1><div class="perks"><p></p><ul>
<li>Work with people passionate about solving high complex tech challenges;</li>
<li>Impact on the product and culture;</li>
<li>Modern technologies and low tech debt;</li>
<li>Progress fast! We promote ownership, doesn’t matter years of experience nor age;</li>
<li>Flexible environment and work-life balance - as well as a good team environment;</li>
<li>The Switch Kit: Macbook Pro and others;</li>
<li>Health insurance with a dental plan;</li>
<li>Spotify and Netflix. </li>
</ul><p><br></p>
</div></section>


guid: https://landing.jobs/at/valispace/front-end-developer-in-lisbon-2020-5
title: Front-end Developer
author: Landing.jobs
url: https://landing.jobs/at/valispace/front-end-developer-in-lisbon-2020-5
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/b4f9d2ac0c2f1c4b512cdec3a137f44eb0cfdcfe/small.png?1535536162" /><div class="offer-info">At Valispace (Full-time), in Lisbon, Portugal<br />Salary: €25.000 - €55.000<br />Expires at: 2020-08-05</div><div class="role-description"><p></p><div>
<strong>At Valispace we are developing the "GitHub for hardware":<br><br></strong><br>
</div><div>Do you want to see Mars colonies, underwater data centers and self-flying taxis come to life soon? Valispace is a collaborative engineering software that enables hardware engineers to build the products of the future. Instead of mailing design files back and forth and copy-pasting information across documentation, we allow multidisciplinary teams to collaborate with a single source of truth of engineering data.<br><br><br>
</div><div>Today, engineering teams already develop satellites, rockets and space stations with Valispace, but our fast-paced international team won’t stop until we have conquered all complex engineering verticals. Want to join the ride?<br><br><br>
</div><div>You will join our international team that is currently migrating our system to Angular. With an open-minded environment, we value teamwork, provide flexibility and we are looking forward to hearing your ideas and opinions. <br> <br><br>
</div><div>
<strong>At Valispace you will:<br><br></strong><br>
</div><ul>
<li>Work in a dynamic startup environment.</li>
<li>Take responsibility from day one.</li>
<li>Be a fundamental part of an amazing team. </li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><div>
<strong> You are the perfect match, because you:<br><br></strong><br>
</div><ul>
<li>Want to provide the best experience for the user to achieve their goals, by understanding their needs and interactions with our platform, validating designs with A/B testing and other similar methods.</li>
<li>Have a keen eye for design and details.</li>
<li>Have experience in Angular 8 or another front-end framework.</li>
<li>Have a strong foundation in HTML5, SCSS/LASS.</li>
<li>Have a good understanding of flex layout and material design.</li>
</ul>
</div></section><section><h1>Nice to have</h1><div class="nice-to-have"><div>Extra points: REST, Django, Python.<br><br>
</div>
</div></section><section><h1>Benefits & Perks</h1><div class="perks"><p></p><ul>
<li>Flexible working hours</li>
<li>Work in our office in central sunny Lisbon</li>
<li>Private Health Insurance</li>
<li>Meal subsidy</li>
<li>Work from home when needed </li>
</ul><div><br></div>
</div></section>


guid: https://landing.jobs/at/valispace/full-stack-developer-in-lisbon-2020-5
title: Full-stack Developer
author: Landing.jobs
url: https://landing.jobs/at/valispace/full-stack-developer-in-lisbon-2020-5
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/b4f9d2ac0c2f1c4b512cdec3a137f44eb0cfdcfe/small.png?1535536162" /><div class="offer-info">At Valispace (Full-time), in Lisbon, Portugal<br />Salary: €25.000 - €55.000<br />Expires at: 2020-08-05</div><div class="role-description"><div> <strong>At Valispace we accelerate the path to the future:<br><br></strong><br>
</div><div><br></div><div>Do you want to see Mars colonies, underwater data centers and self-flying taxis come to life soon? Valispace is a collaborative engineering software that enables hardware engineers to build the products of the future. Instead of mailing design files back and forth and copy-pasting information across documentation, we allow multidisciplinary teams to collaborate with a single source of truth of engineering data.<br><br><br>
</div><div><br></div><div>Today teams already develop satellites, rockets and space stations with Valispace, but our fast-paced international team won’t stop until we have conquered all complex engineering verticals. Want to join the ride?<br><br><br>
</div><div><br></div><div>You will join our international team that is creating new features in Django/Python while improving, testing and optimizing our current platform. With an open-minded environment, we value teamwork, provide flexibility and we are looking forward to hearing your ideas and opinions. <br>  <br><br>
</div><div><br></div><div>
<strong>At Valispace you will: </strong>Work in a dynamic startup environment.<strong><br><br></strong><br>
</div><ul>
<li>Take responsibility from day one.</li>
<li>Be a fundamental part of an amazing team.</li>
<li>Have room to create and innovate.</li>
</ul><div><br></div>
</div><section><h1>Main requirements</h1><div class="requirements"><div>
<strong>You are the perfect match, because you:<br><br></strong><br>
</div><ul>
<li>Want to provide the best experience for the user to achieve their goals, by understanding their needs and interactions with our platform.</li>
<li>Design and develop scalable cloud-based software and RESTful APIs.</li>
<li>Have at least 3 years of experience in the development of systems and applications in Django/Python or other similar frameworks.</li>
<li>Have a strong foundation in HTML5, SCSS/LASS.</li>
</ul><div><br></div><div><br></div><div><br></div>
</div></section><section><h1>Nice to have</h1><div class="nice-to-have"><div>
<strong>Extra points: </strong>REST, Docker, AWS, Angular. <br><br>
</div>
</div></section><section><h1>Benefits & Perks</h1><div class="perks"><p></p><ul>
<li>Flexible working hours</li>
<li>Work in our office in central sunny Lisbon</li>
<li>Private Health Insurance</li>
<li>Meal subsidy</li>
<li>Work from home when needed </li>
</ul><div><br></div>
</div></section>


guid: http://djangojobs.net/jobs/932/senior-software-engineer-core-services-rivian/
title: Senior Software Engineer - Core Services
author: Djangojobs.Net
url: http://djangojobs.net/jobs/932/senior-software-engineer-core-services-rivian/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<h2>Job Title</h2>
<p>Senior Software Engineer - Core Services</p>
<h2>Job Description</h2>
<p>Rivian's Digital Commerce Team is responsible for the end-to-end implementation of the digital experience outside the vehicle (e.g. vehicle configurator, payment gateway, vehicle delivery management, service scheduling) across web, mobile app and in-store. To that end, we are developing a world-class commerce platform that will make learning about and purchasing electric adventure vehicles intuitive, seamless and fun. We are seeking Senior Software Engineers to build the core services of the digital commerce platform that power all of Rivian's digital commerce experiences.</p>
<h2>About the work:</h2>
<p>Build highly functional microservices based on the latest AWS serverless paradigms using Python, Lambda, and DynamoDB. Coordinate across multiple upstream and downstream internal teams to design APIs that meet a complex and diverse set of requirements. Help build everything, from scratch, that a car company needs to operate.</p>
<h2>Restrictions</h2>
<ul>
<li>No telecommuting</li>
<li>No Agencies Please</li>
</ul>
<h2>Requirements</h2>
<p>8+ years of relevant industry experience, with 2+ years of building enterprise grade systems. Experience building distributed systems. Comfortable navigating trade-offs to bring the right data structure and algorithms to the problem. Dedicated to unit and integration testing. Experience developing API's with the care that they deserve. Experience and familiarity with cloud native architecture, development, and deployment practices. Experience building e-commerce and/or payments systems a plus. Bachelor's degree in Computer Science, Engineering or a related technology field.</p>
<h2>About the Company</h2>
<p>Rivian is on a mission to keep the world adventurous forever. This goes for the emissions-free Electric Adventure Vehicles we build, and the curious, courageous souls we seek to attract. As a company, we constantly challenge what's possible, never simply accepting what has always been done. We reframe old problems, seek new solutions and operate comfortably in areas that are unknown. Our backgrounds are diverse, but our team shares a love of the outdoors and a desire to protect it for future generations. We operate development centers in Plymouth, MI, Irvine CA and San Jose, CA, and Surrey, England, as well as a manufacturing facility in Normal, Illinois.</p>


guid: https://djangogigs.com//gigs/backend-software-engineer-python-go-stream-io/
title: Backend Software Engineer (Python/Go)
author: Django Gigs
url: https://djangogigs.com//gigs/backend-software-engineer-python-go-stream-io/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<p><strong>Amsterdam, Netherlands </strong></p>
<p><em>On-Site</em></p>
<p>We are looking for a backend software engineer to join our development in Amsterdam. Job duties will include working on Stream's core API technology as well as designing and building high-performance software.</p><p></p><p><strong>What you will be doing</strong></p><p>Most of your day will be dedicated to software design, research, and coding. On typical projects, you will have a lot of freedom and you will be paired with another team member. Our team is made up of very experienced engineers, some with more than 10 years of experience. By working together you will learn from each other along the way. You will have an enormous impact on making our API service faster, more scalable and more flexible.</p><p></p><p><strong>The work</strong></p><p>Working at Stream, you will add new features to the service and find ways to make the existing ones perform orders of magnitude faster. Our customers have millions of users; they use Stream for mission critical features such as showing content and exposing core functionality of their application. Building stable and reliable software is not just an option: as a member of the development team, you will design and write state-of-the-art software, follow best practices, measure everything and be responsible for deployment to production. You will also spend part of your time talking to our customers and help them to use Stream in their app.</p><p></p><p><strong>The challenges</strong></p><ul><li>Distributed databases: we built our own data store for feeds and for chat</li><li>Real-time messaging</li><li>High performance: our API responses are in the 10ms range</li><li>High scalability: we use sharding, master-master, and master-slave to ensure scalability</li><li>High availability: our entire infrastructure is designed and operated to survive entire datacenter crashes</li><li>Multi-region: we deploy our service on 4 different continents</li></ul><p></p><p><strong>Our tech stack</strong></p><p>At Stream we use a wide collection of technologies to offer highly optimized and available features to our customers. Over the years we have experimented with different programming languages, frameworks, databases, and libraries. Here is a short list of the technology that we currently use. Do not worry if you do not master them all or if you do not see your favorite tool or language, you will have the chance to be exposed to most and to convince us to expand the list:</p><p></p><ul><li>Go, gRPC, RocksDB, Python</li><li>Postgresql, RabbitMQ</li><li>AWS, Puppet, CloudFormation</li><li>Grafana, Graphite, ELK, Jaeger</li><li>Redis, Memcached</li></ul><p></p><p><strong>What we have to offer you</strong></p><p>Stream employees enjoy some of the best benefits in the industry:</p><ul><li>A competitive salary</li><li>Company equity</li><li>A team of exceptional engineers</li><li>Healthy team lunches</li><li>Plenty of snacks and fancy coffee/teas</li><li>An office in the heart of Amsterdam</li><li>The possibility to visit our office in Boulder, CO</li><li>The opportunity and support to attend and/or present to industry-related conferences and meetups</li><li>The chance to work on OSS projects</li></ul><p></p><p><strong>Our culture</strong></p><p>Stream has a casual social culture, our team is diverse and we all have different backgrounds. Our Amsterdam team is very focused: you will see us heads down coding or drawing complex charts on whiteboards, until we pop up to have a chat or play merciless games of ping pong.</p><p>Our talented developers are highly technical and collaborative, which makes Stream a great place to learn and improve your skills. When it comes to software engineering our culture is oriented towards ownership and quality: our goal is to deliver stable software.</p><p>If you are interested in becoming a part of what we do, apply now!</p>


guid: http://djangojobs.net/jobs/933/software-engineer-site-reliability-engineering-sre-microsoft/
title: Software Engineer - Site Reliability Engineering (SRE)
author: Djangojobs.Net
url: http://djangojobs.net/jobs/933/software-engineer-site-reliability-engineering-sre-microsoft/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<h2>Software Engineer - Site Reliability Engineering (SRE)</h2>
<p>At Microsoft, our mission is to empower every person and every organisation on the planet to achieve more. As a member of our engineering team, you will play an integral part in making that happen, navigating us into the future and impacting the lives of people all around the world.</p>
<p>Software Engineers and Site Reliability Engineers are Microsoft Future Navigators</p>
<p>Microsoft has been a leading company in computing for decades. We are a global operation, relied on by governments, utilities, schools, and co-operatives to deliver the things they need to work, every day. </p>
<p>In order to make this work for our customers, we need continual effort to make that delivery reliable. In order to drive reliability, we need you -- someone who already is, or is interested in becoming, a Site Reliability Engineer (also known as SRE). </p>
<p>SREs are people who take engineering-based approaches to solve operations problems: we like infrastructure, we like seeing how big complicated things work, and most importantly, we gain great satisfaction from making it better. We have backgrounds in lots of things -- of course, Computer Science, System Administration, Networking, Mathematics, and Engineering generally, but you can also find folks who've worked in Physics, Chemistry, Biology, Statistics, and even English. </p>
<p>SREs build, monitor, and maintain the systems and infrastructure that ensure our customers can quickly access their data and run workloads whenever and wherever they need to. We identify service problems and areas for improvement, and we follow up by fixing those problems. Our work is key to the success of many of the Microsoft services you'll have heard of, and a number you haven't. There are very few bits of Microsoft which aren't touched by SREs in some way or other. 
SREs come in two kinds: SRE-SWE (people with a software engineering background), and SRE-SE (people with a systems engineering background). </p>
<p>SREs with a software engineering background can come from industry and academia. Their distinguishing feature is their inclination to, and demonstrated competence in, working with software. An SRE-SWE could be successful in perhaps any software team, but typically has an interest in infrastructure, scale, performance, or the behaviour of distributed systems generally. Since how software is written determines the behaviour of a system generally, often in subtle or initially misunderstood ways, an SRE-SWE cares deeply about software quality and how software is constructed. Release processes, safe deployments, measuring performance, and similar concerns beyond pure functionality are important to SREs and are relevant to improving reliability. If this resonates with you, we'd like to talk. </p>
<h2>Responsibilities</h2>
<p>The scale of our operations is enormous. Microsoft's products and services are overwhelmingly consumed online, and billions of people use them every day. We need people who enjoy analyzing complicated problems, coming up with creative solutions, working in focused teams to build things no-one has thought of before, all in the service of production reliability. 
If you are excited by this type of challenge, and you love to work in groups of people who are similarly excited, come join us. We value the input of people who aren't afraid to be learning all the time, who celebrate mistakes because they show the way forward, and those who are happy to continuously improve. We strongly believe that diverse experiences and backgrounds, and an environment where everyone can feel safe to contribute their own insights in a data-driven, objective, but the supportive way is the key to making the best workplace possible, and the best workplace makes the best products and services. Not only is it the smart thing, it's the right thing. </p>
<h2>Responsibilities will include:</h2>
<ul>
<li>Communicate effectively and partner well with other disciplines of the project team to deliver high quality solutions from ideas to production code</li>
<li>Write clean and thorough design documents and code that exemplify quality, simplicity, and maintainability</li>
<li>Be a mentor for the software lifecycle process</li>
<li>Design systems that prioritize the customer perspective and experience</li>
<li>Quickly adapt and apply new technologies, tools, methods, and processes from both internal and external sources</li>
<li>Design and influence design, implementation, and architectural direction</li>
<li>Drive architectural consolidation and simplification</li>
<li>Exemplify the Microsoft values of leveraging the work of others and helping others be successful through your behaviors and actions</li>
</ul>
<h2>We would like to talk to you if you:</h2>
<ul>
<li>Are interested in distributed systems and working with high scale services.</li>
<li>Like to work in a fast-moving environment and you aren't afraid to change things to make them better.</li>
<li>Enjoy new technological challenges and solving hard problems.</li>
<li>Believe that a team working well together is truly smarter than the single smartest person on that team.</li>
<li>Aspire to grow as a person, as a teammate, and as an engineer. </li>
</ul>
<h2>Qualifications</h2>
<p>We try not to have too many formal qualifications, since mindset and demonstrated ability are more important, but previous successful candidates have often had some or all of the following: </p>
<ul>
<li>Background in Computer Science equivalent to a B.Sc.</li>
<li>5+ years of software development: automation-related experience valued in particular. Scripting languages such as bash, python, and PowerShell, or compiled languages such as C, C# and Go are most relevant but others are acceptable.</li>
<li>Awareness of, and ability to reason about, modern software &amp; systems architectures, including load-balancing, queueing, caching, distributed systems failure modes generally, microservices, and so on. </li>
<li>Associated troubleshooting skills, including the ability to follow RPC call-chains across arbitrary network steps. Consequent understanding of monitoring in distributed systems.</li>
<li>Deep understanding of operating system level concepts such as processes, memory allocation, and the network stack; understanding of how applications are affected by the above, and ability to debug same.</li>
<li>Experience with working in a team, including co-ordinating large projects, communicating well, and exercising initiative when presented with problems.</li>
<li>Generally speaking, practical experience running large scale online systems is always an advantage. </li>
</ul>
<p>Microsoft is an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to age, ancestry, color, family or medical care leave, gender identity or expression, genetic information, marital status, medical condition, national origin, physical or mental disability, political affiliation, protected veteran status, race, religion, sex (including pregnancy), sexual orientation, or any other characteristic protected by applicable laws, regulations and ordinances. </p>
<p>Benefits/perks listed below may vary depending on the nature of your employment with Microsoft and the country where you work.</p>
<p>PIEjobsDublin
MicrosoftSREJobs</p>
<h2>Benefits and Perks</h2>
<ul>
<li>Industry leading healthcare</li>
<li>Savings and investments</li>
<li>Giving programs</li>
<li>Educational resources</li>
<li>Maternity and paternity leave</li>
<li>Opportunities to network and connect</li>
<li>Discounts on products and services</li>
<li>Generous time away</li>
</ul>
<h2>Interested in this position?</h2>
<p>See "How to Apply Section" below</p>


guid: http://djangojobs.net/jobs/934/backend-developer-python-go-stream/
title: Backend Developer (Python / Go)
author: Djangojobs.Net
url: http://djangojobs.net/jobs/934/backend-developer-python-go-stream/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<p>We are looking for a Backend Software Engineer to join our development team in Amsterdam. Job duties will include working on Stream's core API technology as well as designing and building high-performance software.</p>
<p>For this position professional experience with Go is not required, you will have the chance to learn it while working on Go projects. You can read more about our switch from Python to Go for our API infrastructure here: https://getstream.io/blog/switched-python-go/</p>
<p><strong>What you will be doing</strong></p>
<p>Most of your day will be dedicated to software design, research, and coding. On typical projects, you will have a lot of freedom and you will be paired with another team member. Our team is made up of very experienced engineers, some with more than 10 years of experience. By working together you will learn from each other along the way. You will have an enormous impact on making our API service faster, more scalable and more flexible.</p>
<p>You will add new features to the service and find ways to make the existing ones perform orders of magnitude faster. Our customers have millions of users; they use Stream for mission critical features such as showing content and exposing core functionality of their application. Building stable and reliable software is not just an option: as a member of the development team, you will design and write state-of-the-art software, follow best practices, measure everything and be responsible for deployment to production. You will also spend part of your time talking to our customers and help them to use Stream in their app.</p>
<p><strong>The challenges</strong></p>
<ul>
<li>Distributed databases: we built our own data store for feeds and for chat</li>
<li>Real-time messaging</li>
<li>High performance: our API responses are in the 10ms range</li>
<li>High scalability: we use sharding, master-master, and master-slave to ensure scalability</li>
<li>High availability: our entire infrastructure is designed and operated to survive entire datacenter crashes</li>
<li>Multi-region: we deploy our service on 4 different continents</li>
</ul>
<p><strong>Our tech stack</strong></p>
<p>At Stream we use a wide collection of technologies to offer highly optimized and available features to our customers. Over the years we have experimented with different programming languages, frameworks, databases, and libraries. Here is a short list of the technology that we currently use. Do not worry if you do not master them all or if you do not see your favorite tool or language, you will have the chance to be exposed to most and to convince us to expand the list:</p>
<ul>
<li>Go, gRPC, RocksDB, Python</li>
<li>Postgresql, RabbitMQ</li>
<li>AWS, Puppet, CloudFormation</li>
<li>Grafana, Graphite, ELK, Jaeger</li>
<li>Redis, Memcached</li>
</ul>
<p><strong>What we have to offer you</strong></p>
<p>Stream employees enjoy some of the best benefits in the industry:</p>
<ul>
<li>A competitive salary</li>
<li>Company equity</li>
<li>A team of exceptional engineers</li>
<li>Healthy team lunches</li>
<li>Plenty of snacks and fancy coffee/teas</li>
<li>An office in the heart of Amsterdam</li>
<li>The possibility to visit our office in Boulder, CO</li>
<li>The opportunity and support to attend and/or present to industry-related conferences and meetups</li>
<li>The chance to work on OSS projects</li>
</ul>
<p><strong>Our culture</strong></p>
<p>Stream has a casual social culture, our team is diverse and we all have different backgrounds. Our Amsterdam team is very focused: you will see us heads down coding or drawing complex charts on whiteboards, until we pop up to have a chat or play merciless games of ping pong.</p>
<p>Our talented developers are highly technical and collaborative, which makes Stream a great place to learn and improve your skills. When it comes to software engineering our culture is oriented towards ownership and quality: our goal is to deliver stable software.</p>
<p>If you are interested in becoming a part of what we do, apply now!</p>


guid: https://landing.jobs/at/jumia/senior-java-developer-in-porto-2020
title: Senior Java Developer
author: Landing.jobs
url: https://landing.jobs/at/jumia/senior-java-developer-in-porto-2020
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/7011aa65f7c73506b4313895b4e44b9fb22b4c57/small.jpg?1525854192" /><div class="offer-info">At JUMIA (Permanent), in Porto, Portugal<br />Expires at: 2020-08-23</div><div class="role-description"><ul>
<li>Be part of an agile team that develops smart logistics solutions on a service-oriented architecture using state-of-the-art technologies</li>
<li>Work closely with a multidisciplinary team (Developers, DevOps, QA engineers, Product Owners) oriented to continuous delivery</li>
<li>Work across the entire product life cycle: concept, design, development, deployment, testing, release, support</li>
<li>Write module, well-organized code.</li>
<li>Construct and verify (unit test) software components to meet design specifications</li>
<li>Take ownership for your code to be qualitatively high and you will support your colleagues in code reviews.</li>
<li>Integration of user-facing elements developed by front-end developers</li>
<li>Build efficient, testable, and reusable modules</li>
<li>Rapidly fix bugs and solve problems </li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><ul>
<li>Excellent knowledge in Data Structure and Algorithms</li>
<li>7+ years of experience in Java/J2EE development with Spring framework</li>
<li>Strong experience with Maven</li>
<li>Strong experience with ORM (Hibernate) and SQL (MySQL, PostgreSQL)</li>
<li>A strong sense for code quality, following/defining coding guidelines and experience with Unit-Testing and SonarQube</li>
<li>Experience working with a large code-base and version systems, ideally GIT</li>
</ul><div><br></div><div><br></div>
</div></section><section><h1>Benefits & Perks</h1><div class="perks"><p></p><ul>
<li>A unique experience in an entrepreneurial, yet structured environment</li>
<li>The opportunity to become part of a highly professional and dynamic team working around the world</li>
<li>An unparalleled personal and professional growth as our longer-term objective is to train the next generation of leaders for our future internet ventures</li>
</ul><p>Please send your CV in English. CV in other languages will not be considered.</p><p> </p>
</div></section>


guid: https://landing.jobs/at/typeform/lead-python-engineer
title: Lead Python Engineer
author: Landing.jobs
url: https://landing.jobs/at/typeform/lead-python-engineer
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/74dc3b40d73860511175b5d6c42e400444ba9ca1/small.png?1570458560" /><div class="offer-info">At Typeform (Permanent), in Barcelona, Spain<br />Expires at: 2020-09-02</div><div class="role-description"><p></p><div><br></div><ul>
<li>Manage the development team, assisting and mentoring to ensure good standards, consistent productivity levels and that projects are delivered on time and on budget.</li>
<li>You’ll be managing your own workload as well as the teams, so you’ll need excellent organisational skills with a methodical and logical approach.</li>
<li>Participate in hands-on work to produce modern good &amp; optimal solutions.</li>
<li>Continue with the development of the VideoAsk product.</li>
<li>Ensure the latest technologies, tools and methodologies are evaluated and adopted where relevant.</li>
<li>Work with your team to produce and meet roadmap deadlines</li>
<li>Building a strong team culture where developers feel valued and empowered to meet their full potential.</li>
<li>Work closely with Product design and Product Managers.</li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><div><br></div><ul>
<li>Minimum of 8+ years of experience </li>
<li>Technology never stands still so you’ll need a passion for improvement and the ability to adapt and learn new skills (as well as teach them!).</li>
<li>Previous experience with <strong>React.js </strong>, <strong>Python &amp; Django </strong>is essential.</li>
<li>You’ll need to demonstrate previous experience of leading a team and more importantly talk about how you were able to motivate and develop them into top performers.</li>
<li>Strong decision-making skills, capable of making informed decisions with due care and consideration.</li>
<li>Well-developed communication and interpersonal skills, for effective collaboration with clients and team members.</li>
<li>Know about solid principles, has experience with testing, and can define this. Can work with test development and is familiar and/or has experience taking a Monolith application and shaping it to a micro-service/serverless architecture</li>
<li>Coming from a Fullstack background, you don't need to be an expert in everything.</li>
<li>Foundations: good architectural principles, experience working with agile.. </li>
</ul>
</div></section><section><h1>Benefits & Perks</h1><div class="perks"><p></p><ul>
<li>Flexible working hours. </li>
<li>Unlimited holidays (being 23 days/calendar year the official, mandatory ones). </li>
<li>Daily lunch catered in the office - organic, seasonal and locally sourced food only! Worth €2,500 a year. </li>
<li>€1,000 annual Learning and Development budget to help you grow professionally. </li>
<li>Private health insurance through Cigna, worth €600 per year. </li>
<li>Access to a broad range of gyms and studios in Barcelona, at a cost of €10 per month to you, worth €80 per month. </li>
<li> State-of-the-art tech to help you get the job done. </li>
<li>Fresh, seasons and organic fruit to get your day started right. </li>
<li>Language courses (English, Spanish &amp; Catalan), fully paid by Typeform. </li>
<li>Open office space, including our infamous Barception and amazing terrace!</li>
<li> Amazing selection of coffee, tea, juices, smoothies and beer served by our baristas! </li>
<li>Typeform in-house library! </li>
<li>Unique Typeform activities, team-building and offsite events. </li>
</ul><div><br></div>
</div></section>


guid: https://landing.jobs/at/typeform/senior-python-engineer-in-barcelona-2020
title: Senior Python Engineer
author: Landing.jobs
url: https://landing.jobs/at/typeform/senior-python-engineer-in-barcelona-2020
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<img class="logo" src="https://assets.landing.jobs/attachments/companies/logos/74dc3b40d73860511175b5d6c42e400444ba9ca1/small.png?1570458560" /><div class="offer-info">At Typeform (Permanent), in Barcelona, Spain<br />Salary: €45.000 - €55.000<br />Expires at: 2020-09-02</div><div class="role-description"><p></p><div><br></div><ul>
<li>Get busy with the end-to-end lifecycle of features, from concept to deployment.</li>
<li>Contribute to technical and architectural decision-making and shape the future of a new product.</li>
<li>Grow—use your annual learning budget to take courses and go to conferences. There’ll be plenty of other opportunities for advancement, such as mentoring, internal talks and workshops.</li>
</ul>
</div><section><h1>Main requirements</h1><div class="requirements"><p></p><ul>
<li>You’ve got experience working on dynamic products that are ever-changing and evolving rapidly. If you are freelancing at the moment, we also want to hear from you.</li>
<li>You take ownership and feel responsible for the product as a whole. You don’t mind getting your hands dirty and even at time work with some legacy code.</li>
<li>You’re comfortable picking up new stacks and choosing the right tool to get the job done. Even better, you’re comfortable with not just one but several technologies from our stack: Python/Django, React, WebRTC, video processing &amp; NLP</li>
<li>Beyond backend, you’re interested in a variety of front end technologies, like Javascript, CSS, React, etc.</li>
<li>You’re a fast learner and not afraid of new challenges.</li>
<li>You’re familiar with some of the best practices of writing software, like unit and integration testing. You understand that quality is everyone’s responsibility.</li>
<li>You can work in an English-speaking environment.</li>
<li>You’re an empathetic person with a big appetite for success.</li>
<li>You show maturity in tradeoffs, make sound decisions, and plan well.</li>
</ul><div><br></div>
</div></section><section><h1>Benefits & Perks</h1><div class="perks"><ul>
<li>Flexible working hours. </li>
<li>Unlimited holidays (being 23 days/calendar year the official, mandatory ones). </li>
<li>Daily lunch catered in the office - organic, seasonal and locally sourced food only! Worth €2,500 a year. </li>
<li>€1,000 annual Learning and Development budget to help you grow professionally. </li>
<li>Private health insurance through Cigna, worth €600 per year. </li>
<li>Access to a broad range of gyms and studios in Barcelona, at a cost of €10 per month to you, worth €80 per month. </li>
<li> State-of-the-art tech to help you get the job done. </li>
<li>Fresh, seasons and organic fruit to get your day started right. </li>
<li>Language courses (English, Spanish &amp; Catalan), fully paid by Typeform. </li>
<li>Open office space, including our infamous Barception and amazing terrace!</li>
<li> Amazing selection of coffee, tea, juices, smoothies and beer served by our baristas! </li>
<li>Typeform in-house library! </li>
<li>Unique Typeform activities, team-building and offsite events. </li>
</ul>
</div></section>


guid: https://djangogigs.com//gigs/front-end-development-of-except-eco-except-integrated-sustainabil/
title: Front-end development of Except.eco
author: Django Gigs
url: https://djangogigs.com//gigs/front-end-development-of-except-eco-except-integrated-sustainabil/
feedurl: https://www.djangoproject.com/rss/community/jobs/
content:
<p><strong>Utrecht, Netherlands </strong></p>
<p><em>100% Remote</em></p>
<p>Dear Django developers,</p><p></p><p>we're in need of an experienced Frontend / Django developer for a one-time development project for Except.eco. This entails the (re)development of the front end of the except.eco website, and a partial migration of data from the current except.nl website. Except.eco runs on the Wagtail Django CMS framework. There are a few small minor back-end items to resolve as well.</p><p></p><p>There is a current front-end that has been half-developed by a previous developer on Except.ECO. We have the new front-end design ready as documentation. The new design is the same in main structure (menu, items, etc), it is only different in design and the items on the main landing pages.</p><p></p><p>Tasks to be performed:</p><ul><li>Front end HTML/CSS + limited JS (~15 templates / pages)</li><li>Support in migration of data from Except.NL to Except.ECO (news, knowledge, services)</li><li>Fixes of some bugs in current implementation</li><li>301 Rerouting of all Except.nl pages to Except.eco pages</li></ul><p></p><p>Important:</p><ul><li>Both English and Dutch pages should work</li><li>Implementation of design is expected to be done with great attention to detail</li></ul><p></p><p>Time estimations:</p><ul><li>We estimate the work involved to be around 10 days. We hope to finalize this in ~3 weeks.</li><li>We hope to start in 1 week</li></ul><p></p><p>How to respond:</p><ul><li>State your cost and time estimate</li><li>Show us a portfolio and some links to websites developed by you</li></ul>


guid: how-we-migrated-to-turbolinks-without-breaking-javascript-honeybadger-developer-blog-2020-6-17-15
title: How We Migrated To Turbolinks Without Breaking Javascript - Honeybadger Developer Blog
author: Pinboard
url: https://www.honeybadger.io/blog/turbolinks/
feedurl: https://www.djangoproject.com/rss/community/links/
content:
These requirements are easy to meet in your JavaScript. However, they can be harder to meet with third-party libraries. For example, Bootstrap's modals break if Turbolinks caches them in their "open" state.

We can work around the modal problem, by manually tidying the DOM before the page is cached. Below, we remove any open bootstrap modals from the DOM.


guid: https://django-lessons.com/lesson/lesson-49-formsets-action
title: Formsets in Action
author: Django Lessons
url: https://django-lessons.com/lesson/lesson-49-formsets-action
feedurl: https://www.djangoproject.com/rss/community/links/
content:
<p>In this lesson you will see a very practical use-case for forms-sets. Also I will briefly introduce allauth authentication plugin.</p>


guid: python-web-conf-2020-2020-6-18-12
title: Python Web Conf 2020
author: Pinboard
url: https://2020.pythonwebconf.com/
feedurl: https://www.djangoproject.com/rss/community/links/
content:
Opening remarks #pwc2020 by ⁦@calvinhp⁩ ! Coolest virtual event platform  by ⁦@sixfeetup⁩  Talks Day 1 kicking off #Plone #python #Django


guid: optimizing-django-orm-queries-roschegel-rocio-s-blog-about-programming--2020-6-19-15
title: Optimizing Django ORM Queries :: roschegel — Rocio's blog about programming.
author: Pinboard
url: http://schegel.net/posts/optimizing-django-orm-queries/
feedurl: https://www.djangoproject.com/rss/community/links/
content:
<blockquote>guess when we will need to use a related table, so it won’t do JOINs for us when we need them.
</blockquote>


guid: django-data-browser-pypi-2020-6-19-19
title: django-data-browser · PyPI
author: Pinboard
url: https://pypi.org/project/django-data-browser/
feedurl: https://www.djangoproject.com/rss/community/links/
content:
<blockquote>A Django app for interactive user friendly browsing of a Django projects DB.</blockquote>


guid: best-django-drf-open-source-projects-to-read-django-2020-6-20-22
title: Best Django/ DRF open source projects to read? : django
author: Pinboard
url: https://www.reddit.com/r/django/comments/hco6an/best_django_drf_open_source_projects_to_read/
feedurl: https://www.djangoproject.com/rss/community/links/
content:
<blockquote>I like reading code from the best of the best just to see how other people are doing things and solving the same problems I run into. I've read...</blockquote>


guid: how-should-i-design-this-celery-solution-django-2020-6-20-22
title: How should I design this Celery solution? : django
author: Pinboard
url: https://www.reddit.com/r/django/comments/hc8hyv/how_should_i_design_this_celery_solution/
feedurl: https://www.djangoproject.com/rss/community/links/
content:
<blockquote>I have an app which uses celery extensively to interact with an appliance. The remote appliance does all sorts of things like taking screenshots...</blockquote>


author: Pinboard
feedurl: https://www.djangoproject.com/rss/community/links/
guid:
how-i-manage-multiple-development-environments-in-my-django-workflow-using-docker-compose-rogs-blog-2020-6-21-13

title:
How I manage multiple development environments in my Django workflow using Docker compose // rogs | Blog

url:
https://blog.rogs.me/2020/05/how-i-manage-multiple-development-environments-in-my-django-workflow-using-docker-compose/

content:
I'm not sure if this is how I want to do things on DigitalOcean, but this article was recommended on https://django-news.com/issues/28?#start


guid: https://blog.3xpl0its.xyz/2020/05/improving-my-backup-solution/
title: Improving My Backup Solution
url: https://blog.3xpl0its.xyz/2020/05/improving-my-backup-solution/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
For quite a while now, I&rsquo;ve been a user of Syncthing. It is a peer-to-peer file synchronisation program that can synchronise files in real time. It has been an amazing application that makes up for a large part my workflow, and it has also allowed me to ditch cloud providers like Google Drive and Dropbox.


guid: https://blog.3xpl0its.xyz/2020/05/making-use-of-the-ssh-config/
title: Making Use of the SSH Config
url: https://blog.3xpl0its.xyz/2020/05/making-use-of-the-ssh-config/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
As of 2 days ago, I had been relying on my own memory, bash history and my password manager to get the IPs of servers that I need to SSH in to.


guid: https://blog.3xpl0its.xyz/2020/05/upload-a-static-file-server/
title: Upload - A Static File Server
url: https://blog.3xpl0its.xyz/2020/05/upload-a-static-file-server/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
Back in June of last year, I felt the need to have a static file server. My reasoning behind wanting one was that I didn&rsquo;t want to hand over the control of my data to large corporations.


guid: https://blog.3xpl0its.xyz/2020/06/migrating-from-traefik-to-caddy/
title: Migrating From Traefik to Caddy
url: https://blog.3xpl0its.xyz/2020/06/migrating-from-traefik-to-caddy/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
So for approximately 2 years now, Traefik had been my go-to reverse proxy and load balancer for all my projects due to it working so well with Docker.
But first, what is Traefik?


guid: https://blog.3xpl0its.xyz/2020/06/streaming-from-minio-to-mpv/
title: Streaming From MinIO to MPV
url: https://blog.3xpl0its.xyz/2020/06/streaming-from-minio-to-mpv/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
If you&rsquo;ve been reading my blog recently, you will find that I run a self-hosted instance of MinIO. At the moment, I have two instances. One to serve all my media such as Movies and TV shows, and then another one that acts as an off-site backup.


guid: https://blog.3xpl0its.xyz/2020/06/hosting-a-static-site-with-minio/
title: Hosting a Static Site With MinIO
url: https://blog.3xpl0its.xyz/2020/06/hosting-a-static-site-with-minio/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
I&rsquo;ve been wanting to have a bit more of a play with MinIO. The other day I managed to start streaming from my instance just by using a quick script I threw together, but now I want to get into the realm of hosting static websites with it.


guid: https://blog.3xpl0its.xyz/2020/06/sharing-files-through-minio/
title: Sharing Files Through MinIO
url: https://blog.3xpl0its.xyz/2020/06/sharing-files-through-minio/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
Yes, I know - another MinIO post&hellip; I promise I&rsquo;ll ease off on them soon. 😂
A few weeks ago, I wrote a post about a static file server I had written called Upload.


guid: https://blog.3xpl0its.xyz/2020/06/updating-my-solokey/
title: Updating My SoloKey
url: https://blog.3xpl0its.xyz/2020/06/updating-my-solokey/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
Its been a few months since I first purchased my SoloKey. The version I have right now is the Solo Tap (USB-A + NFC). I haven&rsquo;t tested the NFC part yet, so I&rsquo;m not sure if that functionality is actually working.


guid: https://blog.3xpl0its.xyz/2020/06/enabling-2fa-on-my-servers-over-ssh/
title: Enabling 2FA on my Servers over SSH
url: https://blog.3xpl0its.xyz/2020/06/enabling-2fa-on-my-servers-over-ssh/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
I recently came across something really cool - enabling two-factor authentication on a remote server when using SSH. It makes use of Google&rsquo;s PAM Module, which some of you may frown upon because it is developed by Google, but it is entirely open source.


guid: https://blog.3xpl0its.xyz/2020/06/configuring-wi-fi-with-connman/
title: Configuring Wi-Fi With ConnMan
url: https://blog.3xpl0its.xyz/2020/06/configuring-wi-fi-with-connman/
feedurl: https://blog.3xpl0its.xyz/index.xml
content:
On my Void Linux machines, it can sometimes be problematic to connect to a Wi-Fi network. I&rsquo;m also not a fan of wpa_supplicant, so I went after an alternative, which happens to be ConnMan.


guid: https://www.bbc.co.uk/news/world-latin-america-53021248
title: Coronavirus: How pandemic turned political in Brazil
url: https://www.bbc.co.uk/news/world-latin-america-53021248
feedurl: http://feeds.bbci.co.uk/news/world/latin_america/rss.xml
content:
Brazil now has the world's second-highest coronavirus death toll but the peak may still be weeks away.


guid: https://www.bbc.co.uk/news/world-53055220
title: Rethink: Pope Francis warns poor have become part of landscape
url: https://www.bbc.co.uk/news/world-53055220
feedurl: http://feeds.bbci.co.uk/news/world/latin_america/rss.xml
content:
Pope Francis laments the "hypocrisy" of certain politicians in one of a series of essays for the BBC.


guid: https://www.bbc.co.uk/news/world-53131529
title: 'To the Windrush generation I would say thank you'
url: https://www.bbc.co.uk/news/world-53131529
feedurl: http://feeds.bbci.co.uk/news/world/latin_america/rss.xml
content:
This is the story of BBC reporter Shamaan Freeman-Powell’s family – where siblings grew up thousands of miles apart, living very different lives.


guid: https://www.bbc.co.uk/news/uk-43808007
title: Windrush: Who exactly was on board?
url: https://www.bbc.co.uk/news/uk-43808007
feedurl: http://feeds.bbci.co.uk/news/world/latin_america/rss.xml
content:
The Empire Windrush ship arrived in England on 21 June 1948 carrying hundreds of passengers from the Caribbean, among others. What do we know about them?


guid: https://www.bbc.co.uk/news/world-latin-america-53099553
title: Brazil corruption: Police arrest ex-aide to Jair Bolsonaro's son Flávio
url: https://www.bbc.co.uk/news/world-latin-america-53099553
feedurl: http://feeds.bbci.co.uk/news/world/latin_america/rss.xml
content:
An ex-aide to the president's son is arrested - the latest development in a growing political drama.


guid: https://www.bbc.co.uk/news/world-latin-america-53136200
title: Mexican city of Celaya rocked by cartel violence
url: https://www.bbc.co.uk/news/world-latin-america-53136200
feedurl: http://feeds.bbci.co.uk/news/world/latin_america/rss.xml
content:
Twenty-six people have been arrested after clashes between the Santa Rosa de Lima cartel and police.


guid: https://www.bbc.co.uk/news/world-latin-america-53132225
title: Coronavirus: Brazil becomes second country to pass 50,000 deaths
url: https://www.bbc.co.uk/news/world-latin-america-53132225
feedurl: http://feeds.bbci.co.uk/news/world/latin_america/rss.xml
content:
Growing political unrest adds to Brazil's woes, days after confirming over a million Covid-19 cases.


guid: https://www.bbc.co.uk/news/world-us-canada-53087410
title: Rayshard Brooks widow: 'I felt everything that he felt'
url: https://www.bbc.co.uk/news/world-us-canada-53087410
feedurl: http://feeds.bbci.co.uk/news/video_and_audio/world/rss.xml
content:
The widow of Rayshard Brooks gives her reaction as the district attorney shares details of the death.


guid: https://www.bbc.co.uk/news/world-us-canada-53095887
title: What is Juneteenth day? What you need to know about a historic holiday
url: https://www.bbc.co.uk/news/world-us-canada-53095887
feedurl: http://feeds.bbci.co.uk/news/video_and_audio/world/rss.xml
content:
The historic holiday, which celebrates the official end of slavery in the US, has taken on renewed significance this year.


guid: https://www.bbc.co.uk/news/science-environment-53114340
title: What has Greta Thunberg been doing in lockdown?
url: https://www.bbc.co.uk/news/science-environment-53114340
feedurl: http://feeds.bbci.co.uk/news/video_and_audio/world/rss.xml
content:
The Swedish environmental activist spoke to the BBC about how she's been spending the last few months.


guid: https://www.bbc.co.uk/news/world-asia-india-53104044
title: India coronavirus: The stranded sailor yet to meet his daughter
url: https://www.bbc.co.uk/news/world-asia-india-53104044
feedurl: http://feeds.bbci.co.uk/news/video_and_audio/world/rss.xml
content:
Indian sailor Abhiram Oak has been stuck on his ship with little hope of replacement due to Covid-19.


guid: https://www.bbc.co.uk/news/world-us-canada-53117035
title: Juneteenth: 'This is such a change in history'
url: https://www.bbc.co.uk/news/world-us-canada-53117035
feedurl: http://feeds.bbci.co.uk/news/video_and_audio/world/rss.xml
content:
Millions across the US are celebrating Juneteenth, which marks the official end of slavery in the country.


guid: https://www.bbc.co.uk/news/world-us-canada-53119974
title: America trying to 'rule the world', says Russian spy chief
url: https://www.bbc.co.uk/news/world-us-canada-53119974
feedurl: http://feeds.bbci.co.uk/news/video_and_audio/world/rss.xml
content:
In an exclusive interview with the BBC, the head of Russia’s Foreign Intelligence Service discusses the growing tension with the West.


guid: https://www.bbc.co.uk/news/world-53031803
title: Ethiopian maids dumped outside Beirut embassy
url: https://www.bbc.co.uk/news/world-53031803
feedurl: http://feeds.bbci.co.uk/news/video_and_audio/world/rss.xml
content:
Domestic workers have been left homeless and unpaid amid an ongoing economic crisis in Lebanon, heightened by the coronavirus pandemic.


guid: https://www.bbc.co.uk/news/business-53109531
title: Arianna Huffington: 'Take time to recharge'
url: https://www.bbc.co.uk/news/business-53109531
feedurl: http://feeds.bbci.co.uk/news/video_and_audio/world/rss.xml
content:
The author and founder of Thrive Global says companies need a new leadership playbook during the virus.


guid: https://lukesmith.xyz/2019.html#stream-with-kris-occhipinti
title: Stream with Kris Occhipinti
url: https://lukesmith.xyz/2019.html#stream-with-kris-occhipinti
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Me and <a href="https://filmsbykris.com">Kris Occhipinti</a> are doing a stream around now. <a href="https://www.youtube.com/watch?v=njkfK4iq9N8">Here's the link!</a></p>


guid: https://lukesmith.xyz/2019.html#technology-meme-review-stream
title: Technology meme review stream
url: https://lukesmith.xyz/2019.html#technology-meme-review-stream
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>A the (potentially last) one of my streams before leaving my stable internet connection, I'll be doing a stream with <a href="https://www.youtube.com/channel/UCZrrEuHiQjN2CUo84g5tk7w">tripcode!Q/7</a>.</p>

<p>We will be leafing through a folder of technology memes are reviewing and responding to them.</p>

<p>Don't even ask, I'm not uploading them!</p>


guid: https://lukesmith.xyz/2019.html#lukes-digest-mid-may
title: Luke's Digest: Mid May
url: https://lukesmith.xyz/2019.html#lukes-digest-mid-may
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Here's a brief list of updates in case you missed them:</p>

<ul>
	<li><a href="https://www.youtube.com/watch?v=UnbmwxYi18I">"Bash is Bloated!"</a>: What's the difference between bash and POSIX sh and why is important for everyone serious about scripting and systems administration?</li>
	<li>/g/eaboos are SEETHING: cringe and blue-pilled Boomer defends known NSA honeypot systemd: <a href="https://www.youtube.com/watch?v=IglXPVJ98t0">first video in the woods</a>, <a href="https://www.youtube.com/watch?v=_ljfOCiP0XM">second more detailed video indoors</a>.</li>
	<li><a href="https://www.youtube.com/watch?v=2ClckQzJTlk">How to bind keys in Linux univerrsally, independent of your WM/DE.</a> This is the first (public) video I've ever recorded in dwm. (<a href="https://patreon.com/lukesmith">Boomer patrons</a> will have access to the true first...</a>)</li>
	<li>I did a meme review live stream with <a href="https://www.youtube.com/channel/UCZrrEuHiQjN2CUo84g5tk7w">tripcode!Q/7</a>; Parts <a href="https://www.youtube.com/watch?v=3srWoHZ9hU8">1</a> and <a href="https://www.youtube.com/watch?v=yn1hL5SKvgU">2</a></li>
	<li>In other news, <a href="https://www.youtube.com/watch?v=9ayb1-4jeBw">YouTube retroactively marks <em>every</em> post with the word "cuck" in it as spam</a>. I've had to manually approve hundreds of comments from years ago dabbing on Wordcucks... The change is still ongoing and more and more comments are being flagged as spam.</li>
</ul>

<p>In other news, I've deleted the section on my <a href="https://lukesmith.xyz/programs.html">programs page</a> on my website talking about why I don't use dwm...</a>


guid: https://lukesmith.xyz/2019.html#larbs-is-going-throught-significant-changes
title: LARBS is going throught significant changes
url: https://lukesmith.xyz/2019.html#larbs-is-going-throught-significant-changes
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I'm making significant changes to my dotfiles repos and LARBS, so I wanted to give people a heads up about it.
It's possible (probable?) that there will be some breakage (now and soon) because there are a lot of moving pieces that have moved around.
Here are the changes coming soon:</p>

<ul>
	<li>There will be a new version of LARBS, which will eventually be the default if everything works smoothly.
		I will maintain the current version for Arch Linux using i3-gaps, but I will be adding another version for <strong>Void Linux that runs dwm</strong>.
	</li>
	<li>Reflecting some of the movements to mutal compatibility I moved keybinds from the main i3 config to <code>~/.config/sxhkd/sxhkdrc</code> (<a href="https://www.youtube.com/watch?v=2ClckQzJTlk">as I discussed in my video today</a>) and moved some startup scripts to <code>~/.xinitrc</code>.</li>
	<li><code>~/.scripts/</code> in the repo is now <code>~/.local/bin/</code> to be XDG compliant and save you one extra element in your home directory.</li>
	<li>I've moved things around in <a href="https://github.com/lukesmithxyz/larbs">the LARBS repository</a> as well, and this could interfere with the <a href="https://larbs.xyz">LARBS website</a> and how it redirects requests, but everything seems to be in order.</li>
</ul>

<p>So every one of these developments bode well, but all can cause temporary breakage!
If you run into a problem install LARBS, you will not be bothering me to email it to me.
I would appreciate people to test it if you have a spare machine/VM as well, but I'm a little burdened right now.
I'll be testing in a bit.</p>

<p>Note that the Void Linux/dwm version of LARBS is not supposed to be working yet. I'm still on the basic level with that. The Arch/i3 version hopefully should be still fine though.</p>


guid: https://lukesmith.xyz/2019.html#possible-mail-downage-today
title: Possible mail downage today
url: https://lukesmith.xyz/2019.html#possible-mail-downage-today
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I'm messing around with my email setup today, so there's a possibility that if you sent me a mail today, it might get lost. Be aware.
Everything should be back to normal by tomorrrow.</p>


guid: https://lukesmith.xyz/2019.html#email-is-still-down
title: Email is still down
url: https://lukesmith.xyz/2019.html#email-is-still-down
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>My email adjustments are lasting longer than expected. Right now, if you send an email to me, it will be sucked up into oblivion without an error message.</p>

<p>I am, as you may be able to guess, moving to a new (personal) email server. For a part of late yesterday everything was finally working, but there are some other components I'm working to add in that will again, make my email inaccessible.
As anyone who has done a mail server before knows, there are a lot of annoying moving pieces that go into one, some I'm making sure that everything is just as I need it.</p>

<p>I'll give a public blog post when I'm done with everything just in case someone needs something. If you really need to contact me, you can contact me via my University of Arizona email (lukesmith@email.arizona.edu).</p>


guid: https://lukesmith.xyz/2019.html#a-script-that-automatically-sets-up-your-personal-mail-server
title: A script that automatically sets up your personal mail server
url: https://lukesmith.xyz/2019.html#a-script-that-automatically-sets-up-your-personal-mail-server
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>My email should be back in commission as I've fully worked the kinks out of my new personal email server.</p>

<p>I have at least something to show for it that might be useful to people.</p>

<p>Long story short, after running into some nagging problems getting all the pieces to come together, I wrote a script in parallel that configured a Debian email server from the vanilla install with all the settings a normal human would need for personal email use.
It installs and configures Postfix (SMTP), Dovecot (IMAP), Spam Assassin and OpenKDIM (so you don't get spammed yourself).
Check it out on Github:</p>

<p><a href="https://github.com/LukeSmithxyz/emailwiz">https://github.com/LukeSmithxyz/emailwiz</a></p>

<p>So now my email is working and in the end, I configured it without manually editing a single file!</p>

<p>Check the readme, but I encourage you to follow the steps and try it out on your own server if you've been looking to host your own email.
The requirements are listed.
I might do a video on this, maybe even tomorrow, so if anyone wants to get ahead of the curve and try it out and see if it works, feel free to give me feedback.</p>

<p>I suspect it will work on Ubuntu as well, but I don't have a server to try it out on.
Even if it doesn't I'll be adding more documentation and comments to the script to make it a useful instructional to read.</p>

<p>Work with mutt-wizard obviously too and that's my new email setup.</p>


guid: https://lukesmith.xyz/2019.html#you-have-1-unread-mail-from-the-unaboomers-cabin
title: You have 1 unread mail from the Unaboomer's cabin
url: https://lukesmith.xyz/2019.html#you-have-1-unread-mail-from-the-unaboomers-cabin
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>As I said in <a href="https://www.youtube.com/watch?v=UWpf4ZSAHBo">my most recent video several days ago</a>, I am moving (and now am completing moving) into a very rural place to a house/putative homestead which has due to memes been colloquially referred to as "the Unaboomer's Cabin". As I always say, it's not a cabin, but a full house, but this does mean pretty significant lifestyle changes for me and a new page for the channel as well. As I said in the video, I might not be able to easily upload videos for a short while until I get settled, but here are some updates:</p>

<ul>
	<li>I've moved my stuff to the house and am now going through a life's worth of papers, tools, books, furniture and everything else trying to decorate my house. In addition to my own stuff, there's a lot of furniture and other accouterments that came with the house and there is even more that my dad has been keeping in a nearby shed for extra storage. I'm collocating and organizing all of this</li>
	<li>I have more room than I've ever had, as you would hope. I have three (or depending on how you count four) bedrooms, one of which I'll be using as an office/studio. It will be nice for insomnia's sake to keep my electronics (which are internetless anyway) away from being a distraction in bed!</li>
	<li>I also have lots of land that I need to fully assess. My relative who lived here before didn't have so much of a garden, but did plant and maintain several useful plants (although some I don't even know!). There are definitely unattended grape plants/vines and some fruit-bearing trees.?</li>
	<li>It will be a day or two more before I'm done sorting all my stuff indoors and in the garage/workshop, but after that, the priority is making a garden. Many, including many of you suggested using raised beds, and I think I've decided to try them. It might be late to plant some things, but the growing season this far south is long, so I'll be consulting with some of my growing guides and people around for best practices.</li>
	<li>My internet is truly bad! I haven't even tried to upload videos yet, but text-based and (small) image based browsing is okay. Videos will buffer and will take a bit with youtube-dl. Luckily, I've designed my computer usage over minimizing bandwidth use for a day like this, but I still need to upload videos. I'll figure out the best way to do this soon. I also am going to need to get into the crawlspace to run an ethernet cord to my new office.</li>
	<li>I get no cell service in my house, and am further thinking of getting rid of my cell phone forever. There are other providers with better coverage here though, but I think I might go max-Boomer and just get a landline which obviously is infinitely more reliable.</li>
	<li>It was sad leaving my friends in Statesboro, but I will be going back at some point soon (there of course are things I left behind ;-) and other chores to do). It is nice all the things I do avoid here: like Zoomers blasting that Kanye/Lil Pump song every night at the club across the street. Won't miss that.</p>
</ul>

<p>More updates and a video soon! I'm answering email a little more consistently now though due to the better workflow I have here though. I only have logged on maybe once or twice today though just for a bit because I'm still very busy.</p>


guid: https://lukesmith.xyz/2019.html#new-crypto-currency-addresses
title: New crypto currency addresses
url: https://lukesmith.xyz/2019.html#new-crypto-currency-addresses
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>As a note, I've changed by cryptocurrency donation addresses. You can see them on <a href="https://lukesmith.xyz/donate.html#crypto">my crypto donation page</a>, but in short, they're now:</p>

<ul>
	<li>Bitcoin: 39Z2PRPXCiB7eFWQJPaoWChbAgmjmZYKRC</li>
	<li>Ethereum: 0x2f3D63580028b618f3204F01d156AB6A3E3470dB</li>
	<li>Litecoin: MSzeXUaBTAEdf6YEFK8NuFGcbbUvRqugUD</li>
</ul>

<p>There are QR codes on <a href="https://lukesmith.xyz/donate.html#crypto">the donate page</a> as well if you want to scan them visually.</p>

<p>I was just changing wallets for some optimization reasons. I've never bought any crypto myself, but I have accepted donations with it, but only a small handful.
It was a little surprising to check them to see a significant rally: last time I checked several months ago, all my crypto wallets totalled to maybe $50, now they're $250+.
We'll see how long that lasts though.
</p>

<p>
Either way, if you think crypto is going to rally or fall or do nothing, feel free to donate at any of the above addresses.
If you want to donate with another currency, just say so and I'll add an address.
I might list out a lot of them on that page in a bit because I do have other addresses, but I just haven't used them yet.
</p>

<p>
More big news soon though...
Been working on some new projects, one of which I mentioned on Patreon earlier.
</p>


guid: https://lukesmith.xyz/2019.html#the-stallman-stuff-is-cringe
title: The Stallman stuff is cringe.
url: https://lukesmith.xyz/2019.html#the-stallman-stuff-is-cringe
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>
I put up <a href="https://www.youtube.com/watch?v=FWV3eC3Dr1Y">a new video</a> here about the Richard Stallman silliness.
It probably means the end of the FSF in multiple tangible ways, although I suspect the organization will live on.
If you know my view on things, I doubt it will seriously change things for better or worse.
</p>

<p>
As I say in the video, people who out of one mouth whine about the "SJW" takeover of technology, but have also have piled on Stallman are hypocritical.
I don't really have any sympathy for Stallman either.
If you live by leftist degeneracy, they'll be coming for you too eventually, and I'll be lolling.
Stallman is just another guy who tried to "be reasonable" with people who are motivated singularly by <em>winning</em> and <em>getting what they want</em> in the public socio-political theater rather than by honesty and thinking things through.
</p>


guid: https://lukesmith.xyz/2019.html#video-on-the-zsh-or-z-shell-whatever-the-z-stands-for
title: Video on the zsh or z shell, whatever the z stands for...
url: https://lukesmith.xyz/2019.html#video-on-the-zsh-or-z-shell-whatever-the-z-stands-for
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>New video on zsh, as many have long requested.
<a href="https://www.youtube.com/watch?v=eLEo4OQ-cuQ">Watch/download it here.</a>
</p>

<p>
<a href="https://gist.githubusercontent.com/LukeSmithxyz/e62f26e55ea8b0ed41a65912fbebbe52/raw/2a93cca1ea82cecfc2bd6dcd2eff700a95c7581e/zshrc">Get my current zshrc here.</a>
</p>

<p>I talk about some unique features of zsh that make it preferrable to bash (syntax highlighting and coloring, better tab completion), but also <a href="https://www.youtube.com/watch?v=C2a7jJTh3kU">fish</a> and other shells.
</p>


guid: https://lukesmith.xyz/2019.html#little-neomutt-fix-for-muttwizard-users
title: Little neomutt fix for mutt-wizard users
url: https://lukesmith.xyz/2019.html#little-neomutt-fix-for-muttwizard-users
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>A recent update to neomutt is causing a warning message when neomutt is opened if you have used my <a href="https://github.com/LukeSmithxyz/mutt-wizard">mutt-wizard</a> to set up your mail.
I've already pushed a change that will fix it for new accounts, but you will have to manually make a change for accounts you have already added.</a>

<p>You should be able to fix the problem on installed accounts by running this:</p>

<pre><code>sed -i "s/^mailboxes =\w* =\\+ /mailboxes /" ~/.config/mutt/accounts/*</code></pre>

<p>The issue is that mutt-wizard has historically added "fake" mailboxes to mutt to make the account name appear in the corner of mutt.
Due to an update, this is no longer possible. The above line deleted all those fake mailboxes in your config files. GNU utilities required.</p>


guid: https://lukesmith.xyz/2019.html#im-back-6-new-videos-out-and-more-coming
title: I'm back! 6 new videos out and more coming...
url: https://lukesmith.xyz/2019.html#im-back-6-new-videos-out-and-more-coming
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I took advantage of my weeklong Thanksgiving break to get back in the loop of making some videos I've meant to for a while.
In case you're too intelligent to use YouTube's subscribe feature, I'll link them all here.</p>

<p>Oh course, you can follow my YouTube feed directly with your RSS feed reader (i.e. without having to use YouTube subscription) via the url: <code>https://www.youtube.com/feeds/videos.xml?channel_id=UC2eYFnH61tmytImy1mTYvhA</code>, but you knew that already ;).</p>

<ul>
	<li><a href="https://www.youtube.com/watch?v=ACeQjDPOdDY">I DISAVOW the "Boomer" Meme (&amp; LARBS Updates</a></li>
	<li><a href="https://www.youtube.com/watch?v=GUQx72j9Q3Y">HELP! LINUX NERDS keep BULLYING ME!!!</a></li>
	<li><a href="https://www.youtube.com/watch?v=mH1GGI2Jpbs">Doing some real-world work in VIM!</a></li>
	<li><a href="https://www.youtube.com/watch?v=mxA9Gyyu6Rg">Old ThinkPads are Computing Perfection (don't @ me)</a></li>
	<li><a href="https://www.youtube.com/watch?v=50p0Ao06cD0">Truly Great Black Friday for a Boomer Consoomer!</a></li>
	<li><a href="https://www.youtube.com/watch?v=82NBMvx6vFY">Only Linux Brainlets CAT into GREP!!!</a></li>
</ul>

<p>I'll have more coming soon. K, keep yourself posted.</p>


guid: https://lukesmith.xyz/2019.html#two-more-videos-and-important-larbs-problem
title: Two more videos and important LARBS problem
url: https://lukesmith.xyz/2019.html#two-more-videos-and-important-larbs-problem
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I've put up two more videos in the past two days:</p>

<ul>
	<li><a href="https://www.youtube.com/watch?v=hMSByvFHOro">Terminal vs. Bash vs. Command line vs. Prompt</a></li>
	<li><a href="https://www.youtube.com/watch?v=3NJIj47Tusw">"Keep Politics out of Technology!" t. Boomer</a></li>
</ul>

<p>Also, I've been unable to fix LARBS installs in the past several days for general business reasons and I need to test some things with respect to fonts.
The main emoji font used by LARBS, ttf-symbola, has had its license changed and that is an upstream problem I need to find an alternative for.
This is especially a problem because if unicode characters aren't rendering correctly, st especially has a tendency to crash when rendering them.
If you install LARBS, run into this kind of problem and want to fix it, you'll have to find an alternative font yourself until I get the chance to find a permanent solution.</p>


guid: https://lukesmith.xyz/2019.html#im-thinking-about-using-bspwm
title: I'm thinking about using bspwm
url: https://lukesmith.xyz/2019.html#im-thinking-about-using-bspwm
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Well my anprim internet just ruined another upload of a 3GB video... ;-) So I might as well give this little update to RSS/blog followers before I'm able to upload vids from a more stable location.</p>

<p>As I've said before, I saw thinking of making LARBS compatible with both i3-gaps and dwm.
Both of them have their advantages: i3 is much more easy for newbs (and non-newbs, and non-weebs for that matter) to customize, while dwm's master and slave layout is pretty hard for me to give up despite the fact that its default statusbar is atrocious and comes with the non-unfounded fragility of some suckless applications.</p>

<p>On a whim, I decided to play around with bspwm over this weekend, and I've got to say that it has a lot of both... or really, it is so customizable that it can be extended to both.</p>

<p>
If you don't know anything about bspwm,
I'll direct you to <a href="https://www.youtube.com/watch?v=jLZbk1-wwVA">a video by Wolfgang on bspwm, specifically comparing it with i3</a>
(Although my informants tell me he is a GNOME-cuck or something nowadays or something ;-)&mdash;maybe I should try that?)
</p>

<p>bspwm, unlike i3 and dwm is just a raw window manager (WM): it does not even have a unique status bar or keybinding system: you are expected to use a modular bar of your own choosing and a binding program like sxhkd to map what you need.</p>

<p>My setup is modular enough, in that I already have sxhkd for most my binds, including many scripts and even statusbar scripts that the change-over has been pretty quick.
If I feel like bspwm is more stable and can get everything I want from i3 and everything I want for dwm, I might use it for good.
</p>

<p>I've also dusted off the old polybar config, which I had barely modified before... and I've begun to add new modules, like those I made for i3blocks (which again is a pretty simple process due to the modularity of both).
People always liked polybar more and many have been asking for it back, despite the fact that I did a post earlier this year or so on why I had stopped using it for LARBS' sake.</p>


guid: https://lukesmith.xyz/2019.html#merry-christmas-to-all-and-a-vid-from-the-archives
title: Merry Christmas to all and a vid from the archives
url: https://lukesmith.xyz/2019.html#merry-christmas-to-all-and-a-vid-from-the-archives
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I've been on break for a while and am with family (and without my microphone and equipment), so I won't be putting out a video until after Christmas.</p>



<p>
If you want to consoom some classic Luke Smith products in your downtime, YouTube, as is randomly does, has been re-recommending <a href="https://www.youtube.com/watch?v=kiMcX3Fa2Us">the video I put out quite some time ago on my experience living 2 full years without internet at home</a>.
Come to think of it, I recommend you to watch it if you haven't, or haven't in a while.
It touches on some themes we've been talking about recently on the channel.</p>

<p>
Another older video you might want to see if you haven't is <a href="https://www.youtube.com/watch?v=YjbyDU0WzYI">this one, on "upcummies" and the effects of social media</a>.
</p>

<p>Anyway, I'm in Atlanta and will be back home probably the day after Christmas.</p>

<p>Merry Christmas to all, even (especially) to <a href="https://github.com/microsoft/vscode/issues/87268">the haters and losers</a>!</p>


guid: https://lukesmith.xyz/2020.html#new-video-on-new-books
title: New video on new books
url: https://lukesmith.xyz/2020.html#new-video-on-new-books
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I did <a href="https://www.youtube.com/watch?v=X9cBFNbihFU">a video covering every book I got in 2019</a>.</p>

<p>Check it out, as
some people often ask me what kind of books I tend to get.</p>

<p>You can also check out
<a href="https://lukesmith.xyz/library.html">my library page</a>
at my website for a full inventory of my library if you have interest in that.</p>


title: New/old episode of Not Related! out: Every scientific paper you've read is wrong
feedurl: https://lukesmith.xyz/rss.xml
guid:
https://lukesmith.xyz/2020.html#newold-episode-of-not-related-out-every-scientific-paper-youve-read-is-wrong

url:
https://lukesmith.xyz/2020.html#newold-episode-of-not-related-out-every-scientific-paper-youve-read-is-wrong

content:
<p>That's only slightly a hyperbole.</p>

<p>I'm thinking about bringing back the podcast; it's probably the only old content I get <em>constant</em> requests to bring back. I'm already compiling stuff for a few new episodes for Season 2, which might actually include some joint episodes with people you may or may not know... We'll see!</p>

<p>Anyway, I finally finished and put up an episode I did in a stream months ago:
<a href="https://traffic.libsyn.com/secure/notrelated/S01E08_-_The_Flaws_of_Academic_Statistics_the_Null_Ritual.mp3">The Flaws of Academic Statistics: the Null Ritual</a> which you can see
<a href="https://www.youtube.com/watch?v=an0RFLzJ5Yo&list=PL-p5XmQHB_JQTeUxtGBI7sHCOOuY4qT-B&index=2&t=0s">on YouTube</a> as well.
This episode is talks about some of the fundamental and acknowledged issues in how statistics is used in nearly all sciences.
Nearly every science paper you've heard of in the popular press and in academia is built on flawed statistical footing.
</p>

<p><a href="https://notrelated.xyz/rss">Add the podcast's RSS feed to your RSS reader!</a> You can also go to the podcast's webpage <a href="https://notrelated.xyz">https://notrelated.xyz</a> to get links to other services to get the episodes from (Spotify and Google if for some reason you do that stuff (just use RSS)).</p>


guid: https://lukesmith.xyz/2020.html#big-fix-for-the-stsuckless-crashonemoji-error
title: Big fix for the st/suckless 'Crash-On-Emoji' error
url: https://lukesmith.xyz/2020.html#big-fix-for-the-stsuckless-crashonemoji-error
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Suckless software has long been burdened by a peculiar error that causes crashes whenever trying to load a colored emoji.
This has meant extreme annoyance for me and confusion for people who use my dotfiles.
The only band-aid for this error has been just installing a font with good unicode coverage and hoping that monospace fonts dare not to print out colored emojis, and making a fontconfig that keeps it that way.</p>

<p>Recently, however, a fix has been posted to the AUR in the <code>libxft-bgra</code> package, which will hopefully become part of the Xft upstream soon.
This will avoid the error, and allows unpatched st to view colored emojis without a problem.</p>

<p>I do a video on this <a href="https://www.youtube.com/watch?v=f9qNXV01yzg">here</a>.</p>

<p>For those who use my dotfiles, update <em>everything</em>: the st build, the dwmblocks build if you use it, the dotfiles, etc. and install <code>libxft-bgra</code>.
I had variously patched software to avoid these problems, but those patches have now been reverted to allow color emojis if you want them.</p>


guid: https://lukesmith.xyz/2020.html#ill-be-at-linuxfest-southeast-june-1214-in-charlotte-nc
title: I'll be at Linuxfest Southeast June 12-14 in Charlotte, NC
url: https://lukesmith.xyz/2020.html#ill-be-at-linuxfest-southeast-june-1214-in-charlotte-nc
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I'll be at Linuxfest Southeast June 12-14, 2020 in Charlotte, NC. (<a href="https://www.youtube.com/watch?v=A6JXNZQwoYE">vid</a>).
I'll probably be making some presentations as well.
Although I missed the 2019 conference, I had gone in 2018 and it was a good experience.
</p>

<p>If you're in the region, I recommend you come.
I'll be commuting from a distance, but I expect it will be worth it.
I met a lot of subscribers in 2018 (and there were many more who were too awkward to come up and greet me 😉).
</p>

<p>Anyway, check out their website at <a href="https://southeastlinuxfest.org/">southeastlinuxfest.org</a>.
I don't think they've opened sing-up for attendence, but I expect it to be in a month or so.</p>

<p>By the way, if you want to see my talk at the 2018 Linuxfest <a href="https://www.youtube.com/watch?v=PnCXJn2cRf4">the link is here: Linux Is the Wild West! And let it be that way!</a>.</p>


guid: https://lukesmith.xyz/2020.html#what-should-be-the-default-browser-for-larbs
title: What should be the default browser for LARBS?
url: https://lukesmith.xyz/2020.html#what-should-be-the-default-browser-for-larbs
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I'll probably record a video on this tomorrow, but I might as well ask my blog audience first, <b>What should be the default web browser in LARBS?</b></p>

<p>Right now it's Brave, since that's what I do and it comes with a lot of features I consider basic already built in.
The problem with nearly all web browsers is that it's pretty hard and annoying to put together "dotfiles" for them, a default profile that has sensible defaults.
</p>

<p>
Brave is especially nice because it comes with add-ons that block adds, redirect to HTTPS and add Tor and torrenting capabilities.
But while sometimes Brave will prompt the user on first run for their preferred start engine, on some systems after running LARBS, it will just assume Google, which I absolutely want to avoid.
</p>

<p>I'm sure you all have the agency to change your search engine to something more sensible, most use DuckduckGo (I prefer Searx), but when it comes to the default, the sileny majority is going to continue with the default idly, and I don't want to set them on the wrong path.
Why even use Linux if you're just going to send everything straight to Google anyways?
</p>

<h2>Possible browsers</h2>

<ul>
<li>Brave &ndash; Again, great defaults, but Google might end up as the default search engine.</li>
<li>Ungoogled-chromium &ndash; Possibly the safest bet, no cringe branding or bad policies, but it doesn't look like it has any search engine by default... That will be a big annoyance to novices.</li>
<li>Palemoon &ndash; Manjaro i3 uses it, fast, good-looking, but it has an incestuous development team which has made... odd choices (`~/.moonchild productions/` makes me want to kms whenever I `ls -a`), but okay on privacy (weird startup screen, but could be worse). Bad/limited add-ons/extensions.</li>
<li>Icecat &ndash; I'll admit it, two years, Icecat was absolutely unusable on pretty much all sites, but it looks like it's evened most everything out. Probably the best browser for raw privacy, but still probably the least usable since users have to keep in mind if they need to turn some script blocker off for a site, etc.</li>
<li>qutebrowser &ndash; I haven't used it in years and I don't know if I want to get back into figuring it out for the third time, lol. I don't know where it is nowadays, but if I'm making normies use it, it's going to have to be able to play YouTube videos and without 400% CPU usage. qutebrowser does have the _massive_ advantage of __actually having dotfiles__ so I can easily change defaults.</li>
<li>Waterfox &ndash; Well, a better form of Firefox on most fronts, but Bing is the default search engine.</li>
</ul>

<h2>Premptive 'no' to the following</h2>
<ul>
<li>surf &ndash; Too much work for an individual, let alone managing one build to rule them all. There are cool suckless things you can do with it, but it's also just slow.</li>
<li>Browsers I'm not familiar with (uzbl, luakit). I hear they're really cool, but for me to install it on other peoples' computers, I need to be organicly familiar with it. You'd have to convince me to use them individually first.</li>
</ul>

<p>I'll also say, and I had never heard this take until I did my video on Brave, I obviously have no qualms about using a chromium-based browser. Apparently there are people out there who have the idea that source code is just magically evil if it was written by Google, even if it is 100% free and open source and well-audited.
Anyway, share your opinions! What did I miss?</p>

<p>Email me what you think at <a href="mailto:luke@lukesmith.xyz">luke@lukesmith.xyz</a> and you might influence me before I record the video tomorrow morning.</p>


guid: https://lukesmith.xyz/2020.html#font-gone-crazy-in-larbs
title: Font gone crazy in LARBS?
url: https://lukesmith.xyz/2020.html#font-gone-crazy-in-larbs
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>An Arch update to <code>ttf-inconsolata</code> has temporarily broken the font.
If you're a member of an Arch forum or IRC, I recommend notifying them/the developer of this.
I don't have an account there.</p>

<p>
Since Inconsolata is the default monospace in LARBS, I've been getting a lot of emails as to how to fix or patch this.
Just change your default monospace font in <code>~/.config/fontconfig/fonts.conf</code> to another install monospace font.
If you don't know what monospace fonts you have installed, list them with <code>fc-list | grep -i mono</code>.
See our Github issue.
</p>

<p><a href="https://github.com/LukeSmithxyz/LARBS/issues/186">https://github.com/LukeSmithxyz/LARBS/issues/186</a></p>


guid: https://lukesmith.xyz/2020.html#lincucks-fest-has-been-canceled
title: Lincucks Fest has been canceled!
url: https://lukesmith.xyz/2020.html#lincucks-fest-has-been-canceled
feedurl: https://lukesmith.xyz/rss.xml
content:
<P>Although I said around a month ago that I would be in Charlotte this year for Southeast Linuxfest, it looks like they have decided to cancel it! Sad!</p>

<p>If the world continues existence until 2021, I will still probably plan on going then.</p>


guid: https://lukesmith.xyz/2020.html#check-out-my-dwm-and-dwmblocks-builds-and-say-goodbye-to-i3
title: Check out my dwm and dwmblocks builds (and say goodbye to i3)!
url: https://lukesmith.xyz/2020.html#check-out-my-dwm-and-dwmblocks-builds-and-say-goodbye-to-i3
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Firstly, I haven't actually really been updating my website and blog, maybe I will with some personal stuff that doesn't warrant a Boomer-Rant or two.</p>

<p>Anyway, after literally a year of using it, I've finally got a dwm build that I'm pretty happy with, <a href="https://github.com/LukeSmithxyz/dwm">get it here</a>, and I also have <a href="https://github.com/LukeSmithxyz/dwmblocks">a build of dwmblocks</a> which is a modular status bar which now basically has all the features of i3blocks for i3.</p>

<p>I encourage my blog/RSS-reading elite to check them out first to find any obvious lacunae before I do a video on them.</p>

<p>dwm is a way better experience than i3. I'll do a video on why I've been so happy with it.
I know I just said I've been playing around with it for <em>a year</em>, but really I've always had a good build, now it's just notable enough to talk about.</p>

<p>Here are some traits/features:</p>

<ul>
	<li>The LARBS/dwm manual in pdf form is now actually just built into the dwm build. Just press <code>super+F1</code> when in dwm. You'll need zathura installed with a pdf module for it to appear.</li>
	<li>The statusbar now has color characters/emoji due to the libxft fix out there. Great! I always hated fontawesome...</li>
	<li>The statusbar is clickable now thanks to a streamlined version of the statuscmd patch by Daniel Bylinka &lt;daniel.bylinka@gmail.com&gt;. He actually contacted me himself suggesting the patch (which I was aware of), but quickly responded to my feedback, producing two new patches for dwm and dwmblocks (<a href="https://gist.github.com/danbyl/54f7c1d57fc6507242a95b71c3d8fdea">here</a>).</li>
	<li>I'm making the binds both usable and "logical" in a way. Maybe I'll mention this in the video. I'm also trying to add new binds by slimming down unnecessary ones.</li>
	<li>I've added only those layouts that I actually find most useful. There are a lot of meme-tier layouts on dwm which might be interesting, but I think are so practical. I've settled on 8 (bound to four keys) that I like, but I might slim that down or replace them if I find even better ones. I also have the fullscreen mode as well.</li>
	<li>Xresources/pywal compatibility</li>
	<li>A million other little things: gaps, a scrachpad, sticky windows... etc. etc.</li>
</ul>

<p>Note that you will absolutely want to install <code>libxft-bgra</code> from the AUR to be able to run my build, since it allows color characters. If you aren't using an Arch distro, just install one and then get it from the AUR!</p>

<p>You'll also need the <a href="https://github.com/LukeSmithxyz/voidrice/tree/master/.local/bin/statusbar">my statusbar scripts</a> for them to appear in the bar. These are the same that are used for i3blocks and as I said, they are just as clickable.</p>


guid: https://lukesmith.xyz/2020.html#new-website-setup-also-a-statusbar-module-for-network-traffic
title: New website setup, also a statusbar module for network traffic
url: https://lukesmith.xyz/2020.html#new-website-setup-also-a-statusbar-module-for-network-traffic
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I've actually decided to change my website's index page, <a href="https://lukesmith.xyz">check it out</a>.
I made it a bit more autobiographical and visual. Maybe I missed something important? Feel free to remind me.
</p>

<p>
There are images on the mainpage now, which means a little more bandwith used, but it's nowhere close to the odious things that soydevs do with massive 8MB background images.
Even a really slow internet like mine should be able to load it all in a fraction of a second.
</p>

<p>I want to move step-by-step back to the old simple days of the early internet, where personal webpages were actual webpages, not two lines of links to social media profiles over off-white bacgrounds and massive javascript to make sure the site load sufficiently slowly. Sooner or later, I'm going to make a LARBS-like thing for setting up a VPS with a good weserver. Already did it for an <a href="https://github.com/lukesmithxyz/emailwiz">email server</a>.</p>

<p>I haven't wanted to upload videos recently. I don't fake it.
I will want to overview in a video all of the chages and features I've integrrated into dwm, but I'm not totally sure that I'm all the way done.
Most of the binds on the middle and lower rows under the left hand I'm just not sure about!</p>

<p>By the way, yesterday or so I add an optional <a href="https://github.com/LukeSmithxyz/voidrice/blob/master/.local/bin/statusbar/nettraf">network traffic module</a> to my statusbar scripts.
I think I wrote it about as efficiently as it could be written (and no dependencies), but I was knew to figuring out how RX/TX info appears in a Unix system.
Check it out and see if it can be improved.
</p>

<p>
Also, I'm thinking about, since I can make it clickable, adding some kind of network monitoring TUI program, ideally one that either gives visual information about network traffic over time, <em>or</em> (maybe better if it's done well) an application that lists connections made to different sites/IP addresses.
If anyone has any recommendations, let me know,
</p>

<p>EDIT: Oh and by the way, if my website looks funky right now, refresh your browser's cache (specifically of the stylesheet (style.css) on my site).</p>


guid: https://lukesmith.xyz/2020.html#why-do-i-so-rarely-talk-about-politics-on-my-channel
title: Why do I so rarely talk about politics on my channel?
url: https://lukesmith.xyz/2020.html#why-do-i-so-rarely-talk-about-politics-on-my-channel
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>
It's not a huge secret that I'm somewhere in the high echelons of the red-pill, however you define it.
I'll openly talk about pretty any topic that people organically bring up in streams, or that I'm asked about, but I've never really made any kind of political content on my channel, aside from jokes and memes.
That might be surprising because especially three years ago before the mass-bans and algoritm tampering, right wing political channels were a dime-a-dozen and an easily way to get views.
<b>There are two main reasons</b> I never took part.
Arguably "fear of being ZUCCed from YouTube" could be a possible third, but I have a kind intransigence that makes me relish me being banned.
I'm also pretty tired of YouTube, and am increasingly questioning if using it is even a reasonable compromise...
</p>

<p>
So why do I not do political videos?
Why do I not have a set list of deep facts that will blow you away and red-pill you?
The two reasons:
</p>

<ul>
	<li>Reason one: 道可道，非常道。名可名，非常名。</li>
	<li>Reason two: You will need politics less than you think.</li>
</ul>

<p>Okay, reason one there is just the first line of the Daode Jing.
The Daode Jing is the basic book of Daoism (Taoism), and <em>Dao</em> (literally "Way") is an amorphous concept in Chinese thought that could be crudely comparable to Western concepts of "natural order/law" or maybe even "spontaneous order."
<b>"Sounds gay,"</b> you say.
So what does this famous first line mean and how is it relevant to why I don't talk about how to get red-pilled?
I <em>would</em> say it's hard to translate, but even saying that would sound even more pretentious as if I actually know classical Chinese as a native language, but here's a rendering.
</p>

<blockquote><em>The <em>Dao</em> (way) that you can follow isn't the true eternal <em>Dao</em>. A name that you speak, isn't its true name.</em></blockquote>

<p>An aside, it should be a capital offense to translate classical Chinese.
It is so perfect and terse and everything autisitically limited to four elegant syllables that it's just criminal to mutilate it into another language, but we'll forgive it this time.</p>

<p>So what do I mean by quoting this?
I mean that the journey to getting red-pilled is not something that can be explained.
If I could just explain it, tell it to you, it wouldn't be the true story.
It is a varied, and in each case, personal journey, that one goes on.
</p>

<p>
Although you've been lied to, it's not the lies that's the problem.
As an adult, you can a lot of the times tell when the media is manipulating you, especially in the last past decade it's gotten so obvious even a Boomer could see it.
But what you don't see is how when you were lied to (or told selective truths) as a child, you didn't have the same BS-detector, and that allowed a lot of deep-seated impressions about the world to be formed.
So a lot of people who don't believe anything the media says now (rightly) are still mind-cucked.
They accept the programming and differ on the details.
</p>

<p>
I will give you this hint.
Basically all of your programmed emotional responses are your enemies.
There was an old Moldbug blog post where he talked about even far after "awaking from his dogmatic slumber," he still was surprised that if he saw a group of Nazi LARPers, he would reflexively have a pang of emotional stress, but if he saw Stalinist LARPers, he wouldn't have the same kind of emotional reaction.
I think everyone raised in the West has that same programmed reaction.
You might know with your head that the communist death count is supposed to be higher and the suppression wider, but it doesn't click because you weren't made sensitive to it.
</p>

<p>
A good heuristic is whenever you see one of these emotional responses, especially an emotional response to a political term: democracy, equality, racism, feminism, literally all of them actually, <strong>your Pavlovian conditioning is telling you to avoid an intellectual area specifically because it is the ideological weak spot of the background propaganda of modernism.</strong>
If it was not a weak spot, there would be no harm in you being allowed to calmly investigate it.
People's thoughts are regulated in liberal democracy not by laws, but by psychological programming that goes off when someone is tempted to evaluate an idea they're not supposed to.
Okay, actually I guess in Europe they're regulated by that and laws, and it's coming to America very, very soon now.
</p>

<p>
All of this is to say that breaking out of this programming is not so much of an issue of me or anyone else explaining a series of facts to you.
道可道，非常道。
That's what Laozi said.
As cringe as it sounds, it is primarily a battle against yourself, or at least the part of yourself that has eaten up the tacit assumptions of modernism.
<strong>Before you own the libs, you must own yourself.</strong>
Laozi said that too.
</p>

<p>
In case quoting classical Chinese and talking in floating, general terms isn't getting across, I'll say that getting red-pilled is sort of mystical... literally.
Of course, "mystical" in the old, original Greek sense.
A "mystic" in Greek is just a synonym for an "initiate."
Many cultic religions of two millennia ago where like modern Freemasonry: not a ideology one could just go and read about on Wikipedia, but one where people were slowly initiated in the thought and mindset of the religion over time.
While people were born into Paganism, they were <em>initiated</em> into Gnosticism, Hermeticism or even early Christianity.
The only difference is that you are being initiated <em>out</em> of the cultural bubble of modernism.
Into what? It can vary person to person, experience to experience.
You'll always be in some bubble, so don't be arrogant, but you will be out of the big bubble that's going to pop everywhere and is dominated by liberal cat-ladies, professors, sanctimonious NGO-members and journalists.
</p>

<p>
All of this is to say that it is simply impossible for me to provide you direct direction.
Even direction might sound stupid before or after.
Maybe I can lay out some random disorganized recommendations.
</p>

<ul>
	<li>
Years ago as young college student, I remember reading <a href="https://www.ebay.com/sch/steven+pinker+blank+slate">Steven Pinker's <em>Blank Slate</em></a> (<a href="http://gen.lib.rus.ec/search.php?req=blank+slate+steven+pinker">dl</a>) and thinking I was finally red-pilled.
Now I think Steven Pinker is a moron (that book and only that book of his is good, the rest is beyond garbage).
I've actually met many people for whom this book was the first step away from basic boomer-tier progressivism.
I suspect that Pinker almost regrets writing this book because he's actually very basic in politics.
He wrote it back before the elite recognized any threat of a resurgence of energy on the right.
	</li>
	<li>
I think everyone knows that <a href="https://lukesmith.xyz/files/unabomber.pdf">Uncle Ted's manifesto</a> is another favorite on my channel.
I never read it until long after I needed it, but since it's a meme now I should recommend it explicitly.
	</li>
	<li>
		If you're prepped for harder stuff <a href="https://radishmag.wordpress.com/archive/">Radishmag</a> has it. This one <em>tries</em> to evoke that programmed emotional response in a devilish way, but it might be exactly the next step with plenty of actual original sources on historical articles to follow up with.
	</li>
	<li>
		Everything <a href="https://www.ebay.com/sch/nassim%20taleb">Nassim Taleb</a> has written is good.
		He might be the only living author worth reading now in fact, which isn't saying <em>that</em> much considering our age, but Taleb is pretty based and has attracted a constellation of non-retarded people who employ the very useful concepts he's popularized: antifragile, Lindy, buttercuck... (okay maybe the last one he didn't coin himself, but I'm buttercucked and proud).
		Read his books before you even look up videos of him or shadow him on social media.
		His books are lucid, but you won't get it based on mere social media.
		He also has no patience for brainlets.
	</li>
</ul>

<p>
Also, you can be red-pilled too quickly and end up like that guy in the Matrix who looks like me and betrays his friends so he can be put back in the matrix to have nice juicy steaks again.
Did he make an appearance in Runescape as well?
</p>

<p>Anyway, I wrote more of this than I thought I was going to, and <strong>I never got to reason two!</strong>
I'll write it tomorrow after church.
You can read it once you get back from church providing it isn't banned where you live.</p>

<p>
Speaking of church, for those interested in early Christian theology, or frankly Greek philosophy generally, notice how similar 名 <em>name/word</em> "m&iacute;ng" in the Chinese above is equivalent to <em>logos</em>.
In fact, 名 is even used both in the particular sense "the name that you speak" as I render it, and in the universal abstract sense of <em>logos</em>.
This pun, which doesn't exist in English without some explanation, does exist in both classical Chinese and Greek.
More on that later.
</p>


guid: https://lukesmith.xyz/2020.html#politics-matters-most-to-slaves
title: Politics matters most to slaves.
url: https://lukesmith.xyz/2020.html#politics-matters-most-to-slaves
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Now onto the second point I didn't get to <a href="https://lukesmith.xyz/2020.html#why-do-i-so-rarely-talk-about-politics-on-my-channel">in my post yesterday</a>: politics only matters so much when you're a slave. Or as I put it there, "You will need politics less than you think."</p>

<p>
That is to say that if you live in a city where your every action is watched, if you use proprietary software and communicate only via social media services, if you have no marketable skills because you have some inert degree and questionably productive and definitely replaceable job and a large company, you need politics quite a great deal.
</p>

<p>
Your entire existence in the system is based on being a good boy within the established boundaries of what is deemed by the mass media to be socio-politically appropriate.
<em>Maybe</em> you've gone into debt, but you <em>definitely</em> rely the whole "system" for all the basics.
If you don't think you do, just ask yourself whether your life has changed for the better after the Coronachan Panic of 2020.
</p>

<p>
What's the alternative?
Well, <a href="https://www.youtube.com/watch?v=LRVmfx4EWI0">boomer rants viewers might see some of this coming</a>...
</p>

<p>
The fact of the matter is that both the daily ins-and-outs of politics and the overarching trends of politics matter very little the more independent your are of the system.
Earlier, I always mumbled about how conservaboomers seemed a little too apathetic about the cultural changes being forced on them.
This social engineering still is the most serious problem in all technologically-complex mass-media societies, but I must admit for people who choose personal independence and independence for their families and local communities, it is much less of a problem.
</p>

<p>
When I was plugged into the system, minorly red-pilled and generally peeved because I actually paid attention to the media as something other than to laugh at, I found the idea of Political "Exit" pretty cucky.
How much sense does it make to leave the "political process" altogether?
Sounds like giving up.
</p>

<p>
It sounds like giving up because the "political process" is something internal to the media system at large.
That's why even when the political process does something the media doesn't like (like electing the Orange Boomer, for example), its actions are immediately rendered inert by fakery.
</p>

<p>
The actual solution is creating and participating in organic society, which still very much exists outside the purview of the media and NGOs and the like.
People still need plumbers.
No one is going to fire a plumber because he says trannies are mentally ill men in dresses&mdash;otherwise there'd be no plumbers. Or electricians, or builders or anyone who actually does anything productive.
It'd just be HR, journalists and professors left...
and some open source developers who write more codes of conducts than they do software.
Do you think they'll be able to feed you?
</p>

<p>
Exiting the system is actually the opposite of surrender.
Why would you think the solution is something like voting or even "owning the libs" or something publicly advertised as a solution?
The actual solution is building an alternative.
Or maybe <em>rebuilding</em> the alternative.
</p>

<p>
Do you really want to make your boss rich if you think he'd turn around and betray you because of a media witchhunt?
It's better for you to be doxxed and fired now rather than wait 20 years for it, getting more ensconced in the insanity.
Start becoming more independent now.
</p>

<p>
A lot of people LARP about what they're going to do when they take over "the system" by revolution.
Revolution, the idea of abrupt enforced change, however, is fundamentally their idea and if you buy it, you're going to keep running your head into a wall.
</p>

<p>
Being independent, living out of the city and the Matrix, however, is simultaneously like transporting yourself back in time to when things were saner, but at the same time, transporting yourself into the future where "the system" has already collapsed and we're already rebuilding.
Be a part of it now rather than later.
</p>


guid: https://lukesmith.xyz/2020.html#new-video-showcase-of-my-dwm-build
title: New video showcase of my dwm build
url: https://lukesmith.xyz/2020.html#new-video-showcase-of-my-dwm-build
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I haven't been using my RSS feed to annouce videos recently, but I feel like I should be... 🤔</p>

<p>Anyway, I've released a video showcasing dwm <a href="https://www.youtube.com/watch?v=xnREqY-oyzM">here</a>. If you're reading this post right as I'm releasing it, it's been set as a premiere on YouTube to release at the top of the hour.</p>

<p>The title is naturally self-aware clickbait, the video is just a brief, updated explanation of the logic of dwm, similar to my original video a year or so ago on it, albeit catered to my build.</p>

<p>I also go into some of the stuff I've added recently that make it a drop in improvement over my old i3 dotfiles.</p>

<p>The dwm build is <a href="https://github.com/lukesmithxyz/dwm">here</a>, the status bar, which I'll do an idividual video on later is
<a href="https://github.com/lukesmithxyz/dwmblocks">here</a>, and remeber that you'll need to install <code>libxft-bgra</code> for it to render color characters without crashing.</p>


guid: https://lukesmith.xyz/2020.html#the-advantages-of-dwmblocks
title: The advantages of dwmblocks...
url: https://lukesmith.xyz/2020.html#the-advantages-of-dwmblocks
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Just put up a video on <a href="https://www.youtube.com/watch?v=UP2QpHmcgyk">dwmblocks</a> which I've been using for a statusbar for a while now.</p>

<p>Get the build <a href="https://github.com/lukesmithxyz/dwmblocks">here</a>.</p>

<p>It has probably three main advantages over other paradigms for doing statusbars, especially in dwm:</p>

<ul>
	<li>It is fully modular and can use independent scripts.</li>
	<li>It doesn't just constantly update: while you can tell a module to update every 5 seconds, you can also tell it only to rerun a script when the program receives and external signal.</li>
	<li>It's clickable. I have each modular run different commands, programs, help panes, etc. for each kind of click.</li>
</ul>

<p>On the last point, you can pretty arbitrarily add in new click sequences in your dwm build as well.
I mention in the video that I have it so if I hold shift while left clicking, the an instance of vim with the module script opens up so you can edit it.</p>


guid: https://lukesmith.xyz/2020.html#ripping-and-spliting-and-tagging-audiobooks-and-albums-from-youtube
title: Ripping and spliting and tagging audiobooks and albums from YouTube
url: https://lukesmith.xyz/2020.html#ripping-and-spliting-and-tagging-audiobooks-and-albums-from-youtube
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Check out my <a href="https://github.com/LukeSmithxyz/voidrice/tree/master/.local/bin">scripts folder</a> for two new uploads today (although I made them quite a bit ago).</p>

<p>First is <code>tag</code>, a simple wrapper for <code>opustags</code> and <code>vorbiscomment</code> that gives a easier interface for manually tagging .opus and .ogg files.</p>

<p>More notable, however is <code>booksplit</code>, which uses the script above to take a long audio file and a list of timecodes and automatically splits that file up into tracks/chapter files.</p>

<p>I use this when I can only find some audio content on YouTube and want to convert it to typical music files for listening offline, all with appropriate tags.</p>

<p>I just put up a video on all of this <a href="https://www.youtube.com/watch?v=z_CcQhbwINU">here</a>.</p>


guid: https://lukesmith.xyz/2020.html#a-full-commentary-on-vim-while-lets-playing-vimtutor
title: A full commentary on vim while 'let's playing' vimtutor!
url: https://lukesmith.xyz/2020.html#a-full-commentary-on-vim-while-lets-playing-vimtutor
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>At the top of the next hour, I'll be releasing <a href="https://www.youtube.com/watch?v=d8XtNXutVto">a full-length video commentary and instructional on vim</a>.
I decided to record this yesterday somewhat flippantly: I got through the entirety of vimtutor adding extra information and tips along with commentary.
The whole thing ended up being one cut and slighty longer than an hour!
I'm releasing it as a premiere.</p>

<p>Note also I did a video yesterday talking about <a href="https://www.youtube.com/watch?v=f5UEuWMlqRI">the ever-expanding ways</a> you can be monitored with cell phones and software.</p>


guid: https://lukesmith.xyz/2020.html#full-timecodes-for-the-vimtutor-lets-play
title: Full timecodes for the Vimtutor 'Let's Play'
url: https://lukesmith.xyz/2020.html#full-timecodes-for-the-vimtutor-lets-play
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>The YouTube premiere for <a href="https://www.youtube.com/watch?v=d8XtNXutVto">the Vimtutor Let's Play</a> just ended successfully.
It's a long vid, so if you want to see something specific, I made timecodes which I'll put here, but if you go to the video above, they'll be clickable in the description.</p>

<pre><code>0:00 Vim Diesel Let's Play Introduction
0:46 Playing stupid in movement/WASD for gamers!
1:46 Soydevs learn to exit vim with ZZ and ZQ.
3:44 Noob way to delete stuff and move around
4:34 zz, zt and zb to move the screen
5:25 i for insertion
6:07 Insert mode vs. Normal mode: The Magic of Vim
7:01 Most important tip of mapping caps lock as escape
7:49 How to go SANIC fast in vim with xset hacking! 🏃
9:33 Moving by paragraphs with {}
10:12 a, A and I for inserting text in different ways
12:22 Saving and exiting
14:20 Literally sorting every line in vimtutor alphabetically for no reasons (based!)
15:36 Deleting by text objects; operators and motions
20:48 Counts for motions
25:17 Deleting around and inside and () {} [], etc.
28:28 LITERALLY TIME-TRAVELING IN VIM 😮
31:45 put or paste deleted text
33:26 Using the system clipboard in vim or really neovim to copy and paste with other programs
34:40 Replace command (mostly useless, lol)
35:34 c to actually replace things the right way
39:18 File status, using percentages to jump through the file, and gg and G
40:45 Searching for text with / and ? (for it backwards)
42:31 Using % to jump from parenthis and bracket pairs
44:00 Substitute strings like with sed
48:44 External commands and I learned vim on Windows lol
49:54 Captain Kirk and learning visual mode
52:52 THE MOST USEFUL VIM COMMAND: .!!! (PERIOD)
55:40 NO WAIT, THIS ONE IS THE MOST USEFUL
56:40 Replace mode
58:30 vim does have a spellchecker!
1:00:29 Now we learn copying and yanking
1:01:54 Setting variables
1:04:30 How a vimrc works and how to configure vim on startup, tab completion?
1:05:38 WE DID IT REDDIT!

DONATE NOW: https://lukesmith.xyz/donate 💰😎👌💯
WEBSITE: https://lukesmith.xyz 🌐❓🔎</code></pre>

<p>Enjoy! And thank you Kenneth for the Vim Diesel thumbnail!
He said it cost him a C- in art class, lol.</p>


guid: https://lukesmith.xyz/2020.html#two-factor-authentication-without-a-cell-phone
title: Two factor authentication without a cell phone
url: https://lukesmith.xyz/2020.html#two-factor-authentication-without-a-cell-phone
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I've thankfully developed a tendency to make side remarks about things in videos that I'm not sure or don't know about because often times people will fill me in on them.</p>

<p>Yesterday I complained about having to use a cell phone to do Two Factor Authentication (2FA) and asked for another way.
As it ends up, using a cell phone for 2FA is apparently just a bad, normie-friendly way to do it.
And we aren't normie friendly, anyway are we?</p>

<p>Many informed me that SMS protocol (i.e. texting) is actually a highly insecure way to do Two Factor Authentication.
I did also know that there are authenticator apps, but these are often talked about as if they are always cell phone applications.
Very not true.</p>

<p>In fact, <code>pass</code>, the password manager that I use (and I also require it for <a href="https://github.com/LukeSmithxyz/mutt-wizard">mutt-wizard</a>) has an installable module <code>pass-otp</code> in most repositories that does just this without the need for a celular monitoring device and service, etc.</p>

<p>Install it, and let's say I want it to manage my <a href="https://www.coinbase.com/join/smith_5to1">coinbase</a> 2FA.
Well, go to Coinbase's website and click the option to add/change an authenticator app.
They'll give you a QR which you can download (I'll assume it's called 'download.png' here).
Then, use <code>zbar</code> (which you may need to install) to read the QR code image and pipe it into this <code>pass</code> command.
</p>

<pre><code>zbarimg -q --raw download.png | pass otp insert coinbase</code></pre>

<p>Now, whenever you run <code>pass otp coinbase</code>, you will get a 6-digit 2FA code.
After a few seconds, of course, it will change to another 6-digit code like other 2FA applications.</p>

<p>So this is pretty dope.
You could also start using this for scripting/API access if you know what you're doing.
One more thing I don't have to use my cell phone for.
I feel like a boomer for not knowing this before...
</p>

<p>Now the other thing I'd really want is the ability to access SMS protocol on a computer to receive text messages without (a) a cell phone and (b) cell phone service at my location.
The big issue for me is that I have no mobile service in my house (I have to walk out to the north side of my property to get texts). I don't have wifi-calling either.
Some people have submitted some suggestions and I'm still going through them, but we'll see.
I just wish normies could send me a message at a number they <em>think</em> is a normal cell phone, but I can receive on my computer without a cell signal.</p>


guid: https://lukesmith.xyz/2020.html#im-going-to-be-ending-i3-support-in-larbs-very-soon
title: I'm going to be ending i3 support in LARBS very soon!
url: https://lukesmith.xyz/2020.html#im-going-to-be-ending-i3-support-in-larbs-very-soon
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I'm <b>not</b> deleting any of the i3-related config files, I'll just be doing the following:</p>

<ul>
	<li>Removing i3, i3blocks and other i3-only programs from the install list.</li>
	<li>Removing the visual i3 option on the LARBS script that changed <code>~/.xinitrc</code> for you.</li>
	<li>Consolidating the config files, mainly profile files to make things a little more elegant. I am also adding in a custom <code>dwm.desktop</code> file so GUI-cucks can log into dwm with their log-in screens.</li>
</ul>

<p>That last point might cause breakage in i3 builds that people keep up to date with git.
In case it hasn't been clear for the past year, I really want to move past i3. I haven't used it in months and am not reliable to troubleshoot problems on it.
</p>


<p>If you still want to use my i3 setup, you can still:</p>

<ol>
	<li>Run LARBS.</li>
	<li>Manually install i3/i3blocks afterwards.</li>
	<li>Manually change what WM <code>~/.xinitrc</code> starts (if you don't use a login screen/display manager).</li>
</ol>

<p>I have basically not been maintaining i3 for months.
I accept PRs and fixes if offered, but not much more.</p>

<p>I might add a little extra i3 script to be run after LARBS that makes the changes necessary for i3... maybe.
I really recommend moving on to dwm though.</p>


guid: https://lukesmith.xyz/2020.html#new-vids-on-shell-scripting-and-substring-removal
title: New vids on shell scripting and substring removal
url: https://lukesmith.xyz/2020.html#new-vids-on-shell-scripting-and-substring-removal
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Yesterday and just a bit ago I put out two videos of extreme relevance if you want to script efficiently:</p>

<p>Now <a href="https://www.youtube.com/watch?v=w5phSVBEHhQ">the first</a> formally was about writing a network traffic module without dependencies, we talking about the file location of network information, shell arithmatic and some other efficiencies.</p>

<p><a href="https://www.youtube.com/watch?v=QXineadwG4E">The second video</a> is on an important trick for getting a substring from a string without having to call separate programs like <code>awk</code> or <code>cut</code>, and thus saving time.
That is, <em>substring removal</em>, which you've probably seen before. It looks something like this:</p>

<pre><code>echo "${fullfilename%.*}"</code></pre>

<p>That particular command will echo a file name removing its extension.
I explain the logic of what all the symbols mean and how to manipulate them in the video.
</p>


guid: https://lukesmith.xyz/2020.html#help-me-livestream-from-the-remote-unaboomers-cabin
title: Help me livestream from the remote Unaboomer's Cabin!
url: https://lukesmith.xyz/2020.html#help-me-livestream-from-the-remote-unaboomers-cabin
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I want to have a way to stream from my home internet, which is beyond bad.
It is certainly at least good enough to upload audio: I've used some VOIP services perfectly,
but the issue is that <strong>YouTube and most other sites specifically require a video stream</strong> as well.</p>

<p>Probably the best solution would be something like streaming an audio feed to a server of mine, which is doable given my bandwidth, and on that server, combining it with a video feed which can then be fed to YouTube or other streaming sites.</p>

<p>If anyone can give me good specifics on this it would be highly appreciated. My eyes still glaze over when I hear about sockets and such, but there might be a more streamlined (bloated) solution as well...<p>

<p>I made a previous request for how to do a simple audiostream on my own server: most people recommended Icecast, which I've been playing around with. I might just go with that platform-independent solution despite the fact that it will probably lessen the viewership by a good bit! (Maybe that's a good thing?)</p>


guid: https://lukesmith.xyz/2020.html#i-dont-trust-wikipedia-anymore-also-a-request-for-a-stallman-meme
title: I don't trust Wikipedia anymore. Also, a request for a Stallman meme!
url: https://lukesmith.xyz/2020.html#i-dont-trust-wikipedia-anymore-also-a-request-for-a-stallman-meme
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I put up a video on <a href="https://www.youtube.com/watch?v=c_Q7reJtiLU">why I don't use or trust Wikipedia anymore</a>.
It's gotten so bad over the years that I don't even trust it for little things.
I might do more on this later, because I think it's a weather-vane kind of issue, but that's my take on it now.</p>

<p>Obviously I don't trust it for news or politics, but I also can't trust it for specialized topics I'm familiar with: it doesn't very accurately represent academic issues in linguistics, philosophy or especially the history of thought.
This has totally undermined my view of the enterprise in total and I'll be relying on a constellation of smaller sites when I need "basic" encyclopedia information.</p>

<p>Also, for a thumbnail, I'm looking for any meme containing a depiction of Richard Stallman as either a crying wojak or a pink wojak.
I'm sure someone has this and I'm very busy today and can't look too much more after a cursory search... I'll be leaving the house soon...</p>


guid: https://lukesmith.xyz/2020.html#github-sponsorship
title: Github sponsorship
url: https://lukesmith.xyz/2020.html#github-sponsorship
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I went through the rigamarole of setting up Github Sponsors today.
Basically it's just a built-in funding mechanism using Stripe with Github.
So now people can donate to me from Github and support from/for specific projects.</p>

<p>Go to <a href="https://github.com/lukesmithxyz/">my Github page</a> and you'll see "Sponsor" buttons on my profile and all my main repositories. Hey, free software gotta pay <em>some</em> bills.
Or at least start the expansion cabin...
Did I mention I might be starting a business soon?
Maybe more on that later.</p>

<p>Anyway if you want platform independent ways to donate to me, including direct bank transfers and crypto currency, you can always just see <a href="https://lukesmith.xyz">https://lukesmith.xyz</a>.</p>

<p>I always feel like a shill to even say so (or to put the link in video descriptions), but then again, people still come up asking me how to donate. That's how. You have a lot of choices! Thanks for all who do donate; I'd hate to have to resort to selling bath water!</p>


guid: https://lukesmith.xyz/2020.html#converting-facebook-feeds-to-rss
title: Converting Facebook feeds to RSS?
url: https://lukesmith.xyz/2020.html#converting-facebook-feeds-to-rss
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I'm going to record a video today on RSS&mdash;one nice fact of RSS is that there are some services that can automatically generate RSS feeds of social media profiles, even those that have intentionally shirked off RSS to be able to further control content.</p>

<p><a href="https://twitrss.me/">https://twitrss.me/</a> is an example of this for Twitter, so you can subscribe/follow any Twitter account without Twitter being able to filter what you see (and importantly without having an account in the first place).</p>

<p>Unfortunately, despite looking several times, I've never found something like this for public Facebook pages, which I think a lot of people would find hard to live without.
There are a lot of normie/Boomer businesses whose only internet presence is their Facebook page.
Even in my case, there's a local grocery store that has weekly deals that I could only see by navigating to a public Facebook page, which I don't like doing: I'd rather the updates just appear in my RSS feed reader.</p>

<p>Anyway, if anyone knows of a free service that produces RSS feeds for Facebook pages, please tell me ASAP so I can include it in the video.</p>


guid: https://lukesmith.xyz/2020.html#first-episode-of-a-full-series-on-the-basics-of-shell-scripting
title: First episode of a full series on the basics of shell scripting
url: https://lukesmith.xyz/2020.html#first-episode-of-a-full-series-on-the-basics-of-shell-scripting
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I actually somewhat enjoyed doing the <a href="https://www.youtube.com/watch?v=d8XtNXutVto">"Vim Diesel"</a> hour long vim tutorial...</p>

<p>So I decided to do something I've been asked about over the years, and that is to do a series on very basic command-line/terminal/shell/bash usage.</p>

<p>I've put up <a href="https://www.youtube.com/watch?v=W4gE8k2RE_s">the first video in this series here</a> so check it out. Although it's very basic, covering the key commands and key-bindings on the terminal, you might learn something or another new or forgotten...</p>


guid: https://lukesmith.xyz/2020.html#not-related-is-officially-back-new-episode-tomorrow-morning
title: Not Related! is officially back. New episode tomorrow morning.
url: https://lukesmith.xyz/2020.html#not-related-is-officially-back-new-episode-tomorrow-morning
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>The madman has finally done it.</p>

<p>I've finally restarted <a href="https://notrelated.xyz">Not Related!</a>, my long lost podcast!</p>

<p><a href="https://traffic.libsyn.com/secure/notrelated/S02E00_-_Live_from_the_Wild.ogg">Download the new Season 2 introducion</a> episode.</p>

<p>
You can also see the episode <a href="https://www.youtube.com/watch?v=0_IR4UBdDmw">on YouTube</a>, although obviously the audio format is primary.</p>

<p>
I always shot for the perfect sweet spot between that signature "Big-Braned" content and a kind of non-pretentiousness: while the topics of <em>Not Related!</em> are always different, they're all in depth coverages of topics out of the typical realm of common knowledge and internet discussion, oftentimes found in somewhat abstruse study...
If I've wasted time in my life learning something, I might as well make it more accessible to others, even if part of that is just previewing it in audio format.
</p>

<p>Some had noted that a kind of a pattern emerged behind some podcast episodes: deflating some of the academic pretentions of institutionalized science.
That might continue in some episodes (definitely the first real episode, which will come out tomorrow morning), but I really only promise varied and unexpectedly interesting content.</p>

<p>
I've learned on the internet that you can never wait around and expect someone else to cover topics, so while I sort of quit the podcast out of tiredness, I view returning to it as a kind of duty.
I was happy with its content and direction.
</p>

<p>Anyway, blah, blah. <a href="https://notrelated.xyz/rss">Subscribe to the podcast RSS feed</a>. Listen or relisten to the older episodes too.</p>

<p>I read <a href="https://lukesmith.xyz/donate">any kind of donation</a> during the middle-of-the-episode break, so if you have a smart comment or an innocent question about a previous episode, submit it with a donation and I'll read it.
Again, I've already recording the first real episode for the second season, but I might be recording #2 soon after.</p>


guid: https://lukesmith.xyz/2020.html#manjaro-is-good-for-noobs
title: Manjaro is good for noobs.
url: https://lukesmith.xyz/2020.html#manjaro-is-good-for-noobs
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I put out a video on <a href="https://www.youtube.com/watch?v=eWowqM2S9VU">why I always recommend Manjaro for new users</a>. Get Manjaro at <a href="https://manjaro.org">manjaro.org</a>.</p>

<p>Manjaro has a couple of main benefits over other distros:</p>

<ul>
	<li>While other distros idiotically try to containerize programs allow people to get either normie/proprietary software or very up-and-coming software, Manjaro can just use the AUR.</li>
	<li>The frequent updates give Manjaro a substantial edge over Ubuntu and Linux Mint since it allows noobs to get quick updates to highly-active software areas like gayming.</li>
	<li>On a minor point, pacman is better than apt-get on pretty much any metric.</li>
	<li>Manjaro eases the transfer into Arch Linux, which is a typical rite of passage into mature Linux.</li>
</ul>

<p>Of course, reading the comments from new users, I am continually reminded that the real hurdle to getting the most out of Linux is a psychological one: most users want to replicate their Windows 10 setup perfectly and more than that, have the mindset of a passive consooomer for whom even the most inconsequential unexpected things on an operating system are a world-ending impossibilities and sources of frustration.
</p>

<p>There's a lot to say about that.
I spend a lot of time making videos to make life easier for other people.
One thing I've realized is that there are some people who get a lot more excitement out of complaining than having solutions to their problems.</p>

<p>I don't understand that psychology, but it's ubiquitous.</p>


guid: https://lukesmith.xyz/2020.html#on-the-swallowing-patch-in-dwm
title: On the swallowing patch in dwm
url: https://lukesmith.xyz/2020.html#on-the-swallowing-patch-in-dwm
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>dwm has a somewhat unique patch called <a href+"https://dwm.suckless.org/patches/swallow/">swallow</a> which automatically positions a window opened from a terminal over that terminal that would otherwise be non-responsive, uncloseable and thus a big annoyance.</p>

<p>I show this patch and why it's needed <a href="https://www.youtube.com/watch?v=92uo5OBOKfY">in a new video I just released</a>: "Does your Window Manager Swallow?"</p>

<p>I'm also going to start putting my dwm videos into <a href="https://www.youtube.com/playlist?list=PL-p5XmQHB_JSrWHdm-Fb5khZpw2JXLImj">a playlist here</a> so if you want to keep up with them individually you can.</p>


guid: https://lukesmith.xyz/2020.html#oooof-big-server-downage
title: Oooof! Big server downage!
url: https://lukesmith.xyz/2020.html#oooof-big-server-downage
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I was playing around with my server today, you know, the one where I host <a href="https://lukesmith.xyz">my website</a> the <a href="https://larbs.xyz">LARBS website</a> <em>and</em> <a href="https://notrelated.xyz">the <em>Not Related!</em></a> website.</p>

<p>I ended up "accidentally" install a nginx server which obviously interferred with my preexisting apache server (well, at least because I was running a hand-holding distro that automatically turns everything on when you install something!). This caused a general crash of everything a couple hours ago.</p>

<p>It <em>would've</em> been an easy fix, but I decided instead to just wipe the whole thing and restart on a clean server, so that's what I'm doing. This time, I'm just running nginx.</p>

<p>Anyway, some things are still down and I'm going to dinner tonight, so it might be until tomorrow that I fix everything:</p>

<ul>
	<li>The LARBS link at <code>larbs.xyz/larbs.sh</code> is offline until I figure out how to link stuff on nginx the way I did with <code>htaccess</code> on apache.</li>
	<li>Some old links might not rewrite properly, similar to above. I think I have it removing .html at least on my personal site.</li>
	<li>My personal files on my website are down since again they were Apache based.</li>
	<li>My git server is down. I might just remake it on video because people always ask about it.</li>
	<li>If you have the <em>Not Related!</em> link at the notrelated.xyz address, it might be down too: <code>https://notrelated.libsyn.com/rss</code> will work instead; the one at notrelated.xyz was just a link to that one.</li>
</ul>

<p>Thanks to <a href="https://github.com/LukeSmithxyz/emailwiz">that email script</a> I made a while ago I can receive emails, but it looks like I have to tinker with it a little more for isync. I guess that's for the best since I'll update the script for other people.</p>


guid: https://lukesmith.xyz/2020.html#ill-have-server-downtime-tomorrow
title: I'll have server downtime tomorrow.
url: https://lukesmith.xyz/2020.html#ill-have-server-downtime-tomorrow
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I'm going to make some more changes to my server. Expect my websites to be offline tomorrow, hopefully no more than a couple hours. I just want to make sure to get everything right. 😉</p>


guid: https://lukesmith.xyz/2020.html#le-shill-lion
title: Le Shill Lion
url: https://lukesmith.xyz/2020.html#le-shill-lion
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>Redditors have been spamming my videos asking me to respond to the "controversy"/"fiasco" that Brave has been using affiliate links to certain sites openly for their intended purpose.</p>

<p>In March, a commit added additional links that added in suggestions to sites like Coinbase that included Brave's affiliate link.
This was merged into the upstream in April.
You can see the <a href="https://github.com/brave/brave-core/commit/e8fdde70a3ac2c25e6ccc567bc93c6d4059c2d72#diff-4e85e1d3377a3f7b7da27f16f88e9bd5">relevant git history</a>.
</p>

<p>These affiliate links have displayed openly in the url bar and in the autocomplete as options for months.
Mind you, Brave already had a built-in autocomplete/suggestions that recommend sites that you've never been to.
(This has actually always annoyed me to no end and there's no obvious way to turn off these recommendations to useless sites like the New York Times, LinkedIn or Google Calendar.)
</p>

<p>Yet in the past couple of days, some regular investigative journalists discovered what had been in front of their faces every time they typed in their url bar. A lot of people and pages melodramatically call this "link hijacking."
I wish they held those standards for any other program...
</p>

<p>The "controversy" is that when Brave added links to Coinbase and other sites will affiliate links, it includes those affiliate links into the autocomplete.
(With non-affiliate suggestions as well.)
Some non-intrusive affiliate pages would autofill as well (while intrusive pages like Coinbase's would only open if manually selected by the user).
</p>


<p>Really, what is Brave supposed to do?
It already recommends sites, including the sites with affiliate links and Brave is actually literally leading users to these sites anyway.
Using an affiliate link is the right way to do it: these companies want to know and incentivize people who share their sites.
Brave is already doing that.
It's not like it's costing the user anything.
The sites already know your browser anyway.
</p>

<p>Note that DuckDuckGo has done exactly the same thing and makes money from forcibly putting their affiliate links on Amazon and eBay search results.
</p>

<p>There are a lot of furry communists who think that anything involving money must be "shady" or untrustworthy.
The fact is, if Brave is not going to make money by shilling for NGOs and political non-profits like Firefox, or sell user data like Google, it should be making money on things like this.
<em>This is literally what affiliate links are for.</em>
I can't even pretend it's bad.
This is just dumb.
</p>


guid: https://lukesmith.xyz/2020.html#gnutards-unequivocally-destroyed-eternally
title: GNUtards unequivocally destroyed eternally
url: https://lukesmith.xyz/2020.html#gnutards-unequivocally-destroyed-eternally
feedurl: https://lukesmith.xyz/rss.xml
content:
<p><a href="https://www.youtube.com/watch?v=5Wz9BkzU1zY">Important meme video.</a></p>

<p>"I use Linux as my operating system," I state proudly to the unkempt, bearded man. He swivels around in his desk chair with a devilish gleam in his eyes, ready to mansplain with extreme precision. "Actually", he says with a grin, "Linux is just the kernel. You use GNU+Linux!' I don't miss a beat and reply with a smirk, "I use Alpine, a distro that doesn't include the GNU coreutils, or any other GNU code. It's Linux, but it's not GNU+Linux."</p>

<p>The smile quickly drops from the man's face. His body begins convulsing and he foams at the mouth and drops to the floor with a sickly thud. As he writhes around he screams "I-IT WAS COMPILED WITH GCC! THAT MEANS IT'S STILL GNU!" Coolly, I reply "If windows was compiled with gcc, would that make it GNU?" I interrupt his response with "-and work is being made on the kernel to make it more compiler-agnostic. Even you were correct, you wont be for long."</p>

<p>With a sickly wheeze, the last of the man's life is ejected from his body. He lies on the floor, cold and limp. I've womansplained him to death.</p>


guid: https://lukesmith.xyz/2020.html#i-have-my-own-search-engine-now
title: I have my own search engine now
url: https://lukesmith.xyz/2020.html#i-have-my-own-search-engine-now
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I'm actually a bit ahead in making videos: tomorrow or the day after or so, I'll have a video coming out about <a href="https://searx.me">Searx</a> the decentralized meta-search engine which runs on free software and anyone can install and use.</p>

<p>There are already <a href="https://searx.space">many public instances</a> of Searx out there, but I've also decided to make my own at <a href="https://searx.lukesmith.xyz">searx.lukesmith.xyz</a>, so you can try that out if you want. It's hosted on this very server.</p>

<p>If I get <em>too much</em> traffic, I might close or more it, but I'll leave it up for now to see if the traffic isn't too inconvenient.
After all, if I'm the only one using the instance, it's easy enough for the engines it polls to determine it's just me that's searching!
</p>

<p><big><em>Absolutely no coomers allowed!</em></big></p>

<p>Again yeah, I've already made videos on Searx and the process of actually installing your own instance of it and they'll be out within the week.</p>


guid: https://lukesmith.xyz/2020.html#anyone-done-peertube-before
title: Anyone done Peertube before?
url: https://lukesmith.xyz/2020.html#anyone-done-peertube-before
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I get emails about Peertube semi-frequently.
<a href="https://joinpeertube.org/">Peertube</a> is software you can install on your server to make a kind of a YouTube site.
This would actually be a goal of mine:
to be able to host all of my videos, serve them and have a platform truly independent of YouTube (or at least the core of it).
</p>

<p>I've never bothered to join an instance because I can't necessarily trust individual terms or my bandwidth requirements are too big for most,
but I figure it's worth figuring out now and I'm fiddling around with a separate VPS for doing it myself.</p>

<p>I will admit that the installation process has been a pain.
I've come 99% of the way a couple times in the past couple of days, but there's always something missing or out of sync by the time I finish.
I've even degraded myself by deploying containerized versions of the program (soydev.jpg), but to no avail.
</p>

<p>Anyway, I was wondering if any body out there is passionate and knowledgeable about Peertube and could either help me set it up or has principled suggestions.
I'd like to get this done soon.</p>


guid: https://lukesmith.xyz/2020.html#a-guide-to-using-rss-to-replace-social-media
title: A Guide to Using RSS to Replace Social Media
url: https://lukesmith.xyz/2020.html#a-guide-to-using-rss-to-replace-social-media
feedurl: https://lukesmith.xyz/rss.xml
content:
<p>I've just released a
<a href="https://www.youtube.com/watch?v=hMH9w6pyzvU">video on RSS</a>, more or less talking about the basics.</p>

<p>RSS (Really Simple Syndication) is the best way to keep tabs on things online. While social media sites have tried to replace it, it is still the best way to consoooome content, even on social media sites.</p>

<p>For all basic blogs and smart websites, RSS feeds will be obvious and sometimes your browser will automatically detect them, but here is how to get RSS for some common social media sites.</p>

<h3>YouTube</h3>

<p>Thankfully, YouTube still has RSS feeds, albeit very hidden ones:
for example, mine is <code>https://www.youtube.com/feeds/videos.xml?channel_id=UC2eYFnH61tmytImy1mTYvhA</code>, where my channel ID (starting with <code>U</code>).
</p>

<p>
All YouTube channels have channel IDs that you can either see in their channel page URL, or which you can find by looking at their page source and looking for something like <code>channel_id</code>.
</p>

<p>To "subscribe" to a channel via RSS, just take that channel ID and put it in the format of mine I gave above. The main link goes directly to the video page and I usually stream/download them directly with mpv and youtube-dl.</p>

<h3>Twitter</h3>

<p><a href="https://nitter.net">Nitter.net</a> is a Twitter proxy that mirrors Twitter, but without Javascript soyware and spying.
Importantly, Nitter also openly displays links to RSS feeds they generate for accounts in the upper right-hand corner.</p>

<h3>Github/Gitlab</h3>

<p>Github and Gitlab offer RSS for repositories so you can watch activity.</p>

<p>Want to watch development of my dotfiles?
Just use
<code>https://github.com/lukesmithxyz/voidrice/commits/master.atom</code>.</p>

<p>As you can guess, replace my username and repo name with whatever you want to get a feed for that.</p>

<p>Note also that there is an option to get a "private feed" which lists even more things (who follows you and repository events you watch).</p>

<h3>Facebook (and basically every other site)</h3>

<p><a href="https://github.com/RSS-Bridge/rss-bridge">RSS-bridge</a> is the ultimate RSS feed helper and will not just give you RSS feeds for Facebook pages, but basically anything else.</p>

<p>This is software that can run on a server. You can just do an internet search for instances, then feed them a link you want an RSS for and RSS-bridge will autogenerate a feed.</p>

<h3>Podcasts</h3>

<p>Podcasts literally just are RSS feeds! That's why it's so easy to view them anywhere.</p>

<p>For example, my podcast <em>Not Related!</em> is syndicated by Libsyn and its RSS feed url is <code>https://notrelated.libsyn.com/rss</code>.
If you want another Libsyn podcast, just replace "notrelated" with the podcast name on the site.</p>

<h3>My RSS feeds:</h3>

<p>This blog, a link to my youtube RSS and my podcast RSS.</p>

<pre><code>https://lukesmith.xyz/rss.xml
https://lukesmith.xyz/youtube.xml
https://notrelated.xyz/rss
</code></pre>


