<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Posts tagged with “Book” on Mark van Lent’s weblog</title>
  <updated>2022-12-30T00:00:00+00:00</updated>
  <link rel="self" type="application/atom+xml" href="https://markvanlent.dev/tags/book/index.xml" hreflang="en"/>
  <id>tag:markvanlent.dev,2010-04-02:/tags/book/index.xml</id>
  <link rel="alternate" type="text/html" href="https://markvanlent.dev/tags/book/" hreflang="en"/>
  <author>
      <name>Mark van Lent</name>
      <uri>https://markvanlent.dev/about/</uri>
    </author>
  <rights>Copyright (c) Mark van Lent, Creative Commons Attribution 4.0 International License.</rights>
  <icon>https://markvanlent.dev/favicon.ico</icon>
  <entry>
    <title type="html"><![CDATA[Open tabs — December 2022]]></title>
    <link rel="alternate" href="https://markvanlent.dev/2022/12/30/open-tabs-december-2022/" type="text/html" />
    <id>https://markvanlent.dev/2022/12/30/open-tabs-december-2022/</id>
    <author>
      <name>map[name:Mark van Lent uri:https://markvanlent.dev/about/]</name>
    </author>
    <category term="book" />
    <category term="docker" />
    <category term="homelab" />
    <category term="restic" />
    <category term="security" />
    <category term="tabs" />
    
    <updated>2025-09-13T21:07:32Z</updated>
    <published>2022-12-30T00:00:00Z</published>
    <content type="html"><![CDATA[<p>The end of the year is a nice time to review my open tabs on my phone and
computer to see what&rsquo;s worth saving and what is not. So here is
<a href="/tags/tabs/">another round</a>.</p>
<p>Note that I do not necessarily endorse the articles or applications I link to.
Most of the links to tools are here specifically because they seem interesting
to me, but I have no actual experience with them&mdash;hence the need for a reminder
on this list.</p>
<p>I have tried to group the links somewhat, but other than that they are listed in
more or less random order.</p>
<h2 id="development">Development</h2>
<dl>
<dt><a href="https://daniel.feldroy.com/posts/autodocumenting-makefiles">Autodocumenting Makefiles</a></dt>
<dd>A nice trick to document your <code>Makefile</code>.
This article was also discussed on <a href="https://news.ycombinator.com/item?id=30137254">Hacker News</a>.</dd>
<dt><a href="https://github.com/TomNomNom/gron">gron</a></dt>
<dd>From the <code>README</code>: <q>gron transforms JSON into discrete assignments to make it
easier to grep for what you want and see the absolute &lsquo;path&rsquo; to it. It eases the
exploration of APIs that return large blobs of JSON but have terrible
documentation.</q></dd>
<dt><a href="https://asdf-vm.com/">asdf</a></dt>
<dd>A version manager for e.g. Ruby, Node.js, Python.</dd>
<dt><a href="https://sharats.me/posts/shell-script-best-practices/">Shell Script Best Practices</a></dt>
<dd>Some rules of thumb for writing shell scripts which were also
<a href="https://news.ycombinator.com/item?id=33354286">discussed on Hacker News</a>.</dd>
<dt><a href="https://levelup.gitconnected.com/how-to-change-git-default-branch-from-master-3933afab08f9">How to change git default branch from master</a></dt>
<dd>I had to (or wanted to) switch from using the name &ldquo;master&rdquo; for my main branch
to something else (&ldquo;main&rdquo; in most cases) for a couple of Git repositories. It is
not hard, but if you do not do it often, it is convenient to have a guide like this
to make sure you do not forget anything.</dd>
</dl>
<h2 id="blogs">Blogs</h2>
<dl>
<dt><a href="https://bitfieldconsulting.com/">Bitfield Consulting</a></dt>
<dd>I&rsquo;m linking the whole website here since it has a bunch of nice <a href="https://bitfieldconsulting.com/golang">Go related
articles</a> but also interesting articles
in the <a href="https://bitfieldconsulting.com/blog">blog</a>.</dd>
<dt><a href="https://blog.kronis.dev/articles">Kristiāns Kronis&rsquo; blog</a></dt>
<dd>I have a couple of articles on this blog still open to (finish) reading, like
<a href="https://blog.kronis.dev/articles/using-ubuntu-as-the-base-for-all-of-my-containers">Using Ubuntu as the base for all of my containers</a>,
<a href="https://blog.kronis.dev/tutorials/moving-from-gitlab-ci-to-drone-ci">Moving from GitLab CI to Drone CI</a> and
<a href="https://blog.kronis.dev/articles/on-burnout">On burnout</a>.</dd>
<dt><a href="https://www.vharmers.com/">Valentine&rsquo;s blog</a></dt>
<dd>Informative blog of which I still want to read the last two articles in the
<a href="https://www.vharmers.com/tags/opsec/">OpSec blog series</a>.</dd>
<dt><a href="https://www.linuxserver.io/blog">linuxserver.io blog</a></dt>
<dd>A blog by the community that maintains &ldquo;the largest collection of Docker
images on the web&rdquo; (their words).</dd>
</dl>
<h2 id="security">Security</h2>
<dl>
<dt><a href="https://www.goldfiglabs.com/guide/personal-infosec-security-checklist/">The Personal Infosec &amp; Security Checklist</a></dt>
<dd>Actionable best practices to harden your security posture.</dd>
<dt><a href="https://security-list.js.org/#/">Personal security checkist</a></dt>
<dd>Tips for protecting your digital security and privacy.</dd>
<dt><a href="https://defensivecomputingchecklist.com/">A Defensive Computing Checklist</a></dt>
<dd>Another list of tips on how to make your digital life more safe.</dd>
<dt><a href="https://routersecurity.org/">Router Security</a></dt>
<dd>A site with the focus on the security of routers. From the same author as the
previous link.</dd>
<dt><a href="https://aegis-icons.github.io/">Aegis-icons</a></dt>
<dd>Unofficial set of icons for the <a href="https://getaegis.app/">Aegis Authenticator</a>
application.</dd>
<dt><a href="https://ppn.snovvcrash.rocks/">Pentester&rsquo;s Promiscuous Notebook</a></dt>
<dd>Notes by and for a pentester.</dd>
</dl>
<h2 id="homelab">Homelab</h2>
<dl>
<dt><a href="https://github.com/BaptisteBdn/docker-selfhosted-apps">BaptisteBdn/docker-selfhosted-apps</a></dt>
<dd>A GitHub repository with guides on how to run a bunch of applications via
Docker.</dd>
<dt><a href="https://petersem.github.io/dockerholics/">Dockerholics Application List</a></dt>
<dd>Another list of applications you can host yourself using Docker containers.</dd>
<dt><a href="https://github.com/awesome-selfhosted/awesome-selfhosted">Awesome-Selfhosted</a></dt>
<dd>Yet another (<em>the</em>?) list of applications you can run yourself.</dd>
<dt><a href="https://github.com/awesome-foss/awesome-sysadmin">Awesome Sysadmin</a></dt>
<dd>A list of Free and Open-Source sysadmin resources.</dd>
<dt><a href="https://containrrr.dev/watchtower/">Watchtower</a></dt>
<dd>Automatically update your Docker containers if newer images are available.</dd>
<dt><a href="https://crazymax.dev/diun/">Diun</a></dt>
<dd>If you do not like the idea of automatically updating your containers with
Watchtower, you might want to look at this <strong>D</strong>ocker <strong>I</strong>mage <strong>U</strong>pdate
<strong>N</strong>otifier application.</dd>
<dt><a href="https://www.drone.io/">Drone</a></dt>
<dd>I&rsquo;m already running a <a href="https://gitea.io/en-us/">Gitea</a> instance and a
<a href="https://hub.docker.com/_/registry">Docker Registry</a>. Drone might be a nice
third component to automatically build projects and e.g. create Docker images
and push them to my internal registry.</dd>
<dt><a href="https://homelab.khuedoan.com/">Khue&rsquo;s Homelab</a></dt>
<dd>Khue Doan has a project to provision, operate and update his homelab. As such
it is a nice inspiration.</dd>
<dt><a href="https://grafana.com/oss/loki/">Grafana Loki</a></dt>
<dd>A log aggregation system that looks like a useful addition to my setup, since
I&rsquo;m already running <a href="https://grafana.com/grafana/">Grafana</a> to visualise some
metrics.</dd>
<dt><a href="https://vector.dev/">Vector</a></dt>
<dd>This also looks like a interesting tool to collect logs.</dd>
<dt><a href="https://github.com/smallstep/certificates">Step Certificates</a></dt>
<dd>I am already using a private certificate authority to create certificates for
the services in my homelab, but it would be nice to have a self hosted
<a href="https://www.rfc-editor.org/rfc/rfc8555">ACME server</a> to do the tedious work.
This tool might be what I need.</dd>
</dl>
<h2 id="entertainment">Entertainment</h2>
<dl>
<dt><a href="https://play.elevatorsaga.com/">Elevator Saga</a></dt>
<dd>Fun game where you program an elevator/set of elevators to meet certain criteria.</dd>
<dt><a href="https://www.movieofthenight.com/">Movie of the Night</a></dt>
<dd>While officially a <q>movie/series recommendation engine</q> I use
this site regularly to check if I can stream a movie or series in my country and
if so, on which service it is available.</dd>
<dt><a href="https://osmc.tv/">OSMC</a></dt>
<dd>An interesting looking open source media center, which you can run on a
Raspberry Pi or on their devices, like the <a href="https://osmc.tv/vero/">Vero 4K+</a></dd>
<dt><a href="https://www.amazon.com/Lazarus-Heist-Hollywood-Finance-Inside/dp/024155425X">The Lazarus Heist: From Hollywood to High Finance: Inside North Korea&rsquo;s Global Cyber War</a></dt>
<dd>A book about the
<a href="https://en.wikipedia.org/wiki/Lazarus_Group">Lazarus Group</a>, tipped in
<a href="https://darknetdiaries.com/transcript/119/">Darknet Diaries episode 119</a>.</dd>
<dt><a href="https://scottjucha.com/silverships.html">The Silver Ships Series</a></dt>
<dd>A book series by Scott Jucha, tipped in the
<a href="https://twit.tv/shows/security-now">Security Now podcast</a>. (The series is
mentioned in <a href="https://www.grc.com/sn/sn-887.htm">episode 887</a> for the first
time.) I&rsquo;ve finished the first book and loved reading it!</dd>
<dt><a href="https://nostarch.com/open-circuits">Open Circuits</a></dt>
<dd>A lovely book about electronic components with beautiful pictures.</dd>
</dl>
<h2 id="miscellaneous">Miscellaneous</h2>
<dl>
<dt><a href="https://pfauth.com/intentioneel-leven/persoonlijk-manifest/">Schrijf een persoonlijk manifest voor richting in je werk en leven</a> (Dutch)</dt>
<dd>I&rsquo;m not sure I&rsquo;ll ever write such a personal manifest, but just reading this
article gave me enough food for thought to make some decisions.</dd>
<dt><a href="https://www.lifewire.com/use-file-history-in-windows-10-3891070">How to Use File History in Windows 10</a></dt>
<dd>Useful article for people that want to backup and restore files on
Windows machines.</dd>
<dt><a href="https://restic.net/">Restic</a></dt>
<dd>I&rsquo;m in the process of testing this backup tool to see if I want to switch over
to restic from my current <code>rsync</code> based script to backup my Linux machines to an
external disk. If I go that route, I&rsquo;ll also have to have a look at
<a href="https://github.com/binarybucks/restic-tools">restic-tools</a>.</dd>
<dt><a href="https://shen.hong.io/reproducible-pdfa-compliant-latex/">Creating Fully Reproducible, PDF/A Compliant Documents in LaTeX</a></dt>
<dd>When I was perparing my CV and a cover letter, I wanted the resulting PDF to
be more accessible. This article gave me useful instructions on how to achieve
that.</dd>
<dt><a href="https://thepihut.com/blogs/raspberry-pi-tutorials/using-neopixels-with-the-raspberry-pi">Using Neopixels with the Raspberry Pi</a></dt>
<dd>I&rsquo;m toying with the idea of upgrading my home office with some LED
strips. Perhaps I&rsquo;ll use Neopixels and a Raspberry Pi (or similar board) to do
this.</dd>
<dt><a href="https://jvns.ca/blog/things-your-manager-might-not-know/">Things your manager might not know</a></dt>
<dd>An article about how you can help your manager (help you).</dd>
</dl>]]></content>
  </entry>
  <entry>
    <title type="html"><![CDATA[Book review: Plone 3 Intranets]]></title>
    <link rel="alternate" href="https://markvanlent.dev/2010/09/13/book-review-plone-3-intranets/" type="text/html" />
    <id>https://markvanlent.dev/2010/09/13/book-review-plone-3-intranets/</id>
    <author>
      <name>map[name:Mark van Lent uri:https://markvanlent.dev/about/]</name>
    </author>
    <category term="book" />
    <category term="plone" />
    <category term="webmaster" />
    
    <updated>2021-07-18T14:38:11Z</updated>
    <published>2010-09-13T08:31:00Z</published>
    <content type="html"><![CDATA[<p>One of the latest Plone books from Packt Publishing is
<a href="https://www.packtpub.com/product/plone-3-intranets/9781847199089?utm_source=vlent.nl&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_004175">Plone 3 Intranets</a>
(Design, build, and deploy a reliable, full-featured, and secure
Plone-based enterprise intranet easily from scratch) by Víctor
Fernández de Alba. Packt sent me a copy and asked me to review it.</p>
<p>My first observation: since I&rsquo;ve been developing Plone sites for a
couple of years now, I&rsquo;m not really part of the targeted audience. The
book is meant for people without Plone experience and the reader
doesn&rsquo;t need any programming or CMS knowledge.</p>
<p>As a result the book starts with an introduction to Plone (and Python)
and guides the reader through the installation of an instance. While
the unified installer is demonstrated, the book also shows
<a href="https://pypi.org/project/zc.buildout/">buildout</a>. The latter may
seem unnecessary for the target audience, but later chapters also use
buildout, for instance to install add-on products.</p>
<p>Chapters three through eight are devoted to core concepts of Plone:
managing content, configuration, users, groups, workflow, security,
and so on. These chapters give the reader a good overview of what
Plone has to offer for intranets. The author also suggests a number of
third party products to add even more functionality (see the
<a href="https://www.packtpub.com/product/plone-3-intranets/9781847199089?utm_source=vlent.nl&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_004175">table of contents</a>
for details).</p>
<p>Chapter ten is where the book surprised me a bit. Suddenly the author
starts developing a product himself. This wasn&rsquo;t exactly what I had
suspected given the target audience. Chapter eleven switches back to
using the available functionality (like content rules, WebDAV and
external editing). Yet in chapter twelve there&rsquo;s more code: subjects
like TAL, METAL, viewlets, acquisition and resource registries are
briefly explained.</p>
<p>The last chapter is devoted to deploying the intranet. It demonstrates
Apache configurations, but also discusses the usage of a ZEO
server/client setup, load balancing and caching.</p>
<h2 id="verdict">Verdict</h2>
<p>It&rsquo;s hard for me to put myself in the shoes of someone unknown with
programming, Plone or even a CMS, so I might underestimate the target
audience of this book. However, I feel that the chapters about
creating a custom product and theme (chapters ten and twelve) might
not be suitable for them and leave them with a lot of questions. On
the other hand, the author has experience training non-technical
end-users and so let&rsquo;s give him the benefit of the doubt.</p>
<p>By the way, don&rsquo;t let the fact that the book is based on Plone 3 scare
you: the author frequently points out where it differs from Plone 4.</p>
<p>Overall
<a href="https://www.packtpub.com/product/plone-3-intranets/9781847199089?utm_source=vlent.nl&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_004175">Plone 3 Intranets</a>
is a good introduction and a really nice overview of the broad
functionality Plone has to offer. After reading the book you should
probably be able to get a nice intranet up and running with the
practical tips and examples in the book.</p>]]></content>
  </entry>
  <entry>
    <title type="html"><![CDATA[Book review: Django 1.1 Testing and Debugging]]></title>
    <link rel="alternate" href="https://markvanlent.dev/2010/06/20/book-review-django-11-testing-and-debugging/" type="text/html" />
    <id>https://markvanlent.dev/2010/06/20/book-review-django-11-testing-and-debugging/</id>
    <author>
      <name>map[name:Mark van Lent uri:https://markvanlent.dev/about/]</name>
    </author>
    <category term="book" />
    <category term="development" />
    <category term="django" />
    <category term="testing" />
    
    <updated>2021-07-18T14:38:11Z</updated>
    <published>2010-06-20T15:05:00Z</published>
    <content type="html"><![CDATA[<p>In April Packt published
<a href="https://www.packtpub.com/product/django-1-1-testing-and-debugging/9781847197566">Django 1.1 Testing and Debugging</a>
by Karen M. Tracey. After reading it I figured I might as well write a
review.</p>
<p>The book is written for Django application developers and requires
basic knowledge of Python and Django. And although the code samples
are indeed explained, the context is not always expanded on. This
makes sense for this book and the author recommends to at least do the
<a href="https://docs.djangoproject.com/en/dev/intro/tutorial01/">Django tutorial</a>. I
think you&rsquo;ll get even more out of the book if you&rsquo;ve got a bit more
experience with building Django applications.</p>
<p>As the title already gives away, the book focusses on two subjects:
testing and debugging. These topics are discussed while developing a
survey application. Because this application is used consistently in
the book, the examples require less explanation which means that the
focus in more on the subject at hand (e.g. writing a unit test)
instead of developing this specific application.</p>
<h2 id="testing">Testing</h2>
<p>The first five chapters dive into the world of testing. Karen starts
with explaining how to run the tests and what success and failure
looks like. The second chapter has a focus on
<a href="https://docs.python.org/3/library/doctest.html">doctests</a>. Not only does
she show examples of tests, she also lists pros and cons of using
doctests. Meanwhile she also discusses whether a test is even useful
(example: you should not test Django itself). The examples in the book
consist of doctests that are placed in the docstring of functions. She
does not show how to run a doctest in a separate file
(e.g. <code>README.txt</code>) which can be more useful for explaining or
demonstrating the API of the application as a whole, or doing
integration tests.</p>
<p><a href="https://docs.python.org/3/library/unittest.html">Unit tests</a> are
discusses more extensively in chapters three to five. Karen starts by
reimplementing the doctests as unit tests and continues by showing
things like the <code>setUp</code> and <code>tearDown</code> methods and also
<code>django.test.Client</code> to test views. In the last chapter about testing
she introduces the reader to test runners, test coverage and using
<a href="https://pypi.org/project/twill/">twill</a> instead of
<code>django.test.Client</code>. The only thing I want to nag about is the style
of some of the examples. Occasionally she writes things like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">testHome</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="kn">from</span> <span class="nn">django.core.urlresolvers</span> <span class="kn">import</span> <span class="n">reverse</span>
</span></span><span class="line"><span class="cl">    <span class="o">...</span>
</span></span></code></pre></div><p>Where I would write:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">django.core.urlresolvers</span> <span class="kn">import</span> <span class="n">reverse</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">testHome</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="o">...</span>
</span></span></code></pre></div><p>In my opinion every programming book should pay attention to
programming style. Although it does not have to be addressed
explicitly, the style of the examples should be consistent and follow
the appropriate coding standards/guides (like
<a href="https://www.python.org/dev/peps/pep-0008/">PEP8</a> for example which
states that imports must be at the top of the file).</p>
<h2 id="debugging">Debugging</h2>
<p>Anyway, on with the book review&hellip; The remainder of the book is about
debugging and troubleshooting. Karen first describes the functionality
Django offers to debug your application. For instance, the debug error
pages are explained in detail. The style Karen chose for this part of
the book resembles watching a programmer at work: a mistake is made
and results in an error page, the error reported by Django is
investigated to discover the cause of the problem and the code is
fixed.</p>
<p>Next subject is how to find errors that are less obvious: Django does
not show an error page, but the application does not work as it
should. Initially some custom code is created to show the SQL queries
involved in a view. Although this code is replaced by the
<a href="https://pypi.org/project/django-debug-toolbar/">Django Debug Toolbar</a>
later on, it is also used to show how to package the custom code for
reuse. (Personally, I would have kept the custom query display section
a bit shorter and skip the packaging altogether. It&rsquo;s beyond the scope
of the book and I think there are other resources that describe
developing for reuse much better.) Karen does a great job describing
the features offered by the Django Debug Toolbar. She also explains
why using print statements is evil and using logging is good.</p>
<p>The next subject (chapter nine) is the Python debugger (<code>pdb</code>). Not only
is this chapter a thorough description of the debugger, there&rsquo;s also a
number of pages devoted to
<a href="https://en.wikipedia.org/wiki/Race_condition#Computing">race conditions</a>.
Although this is an important subject, I personally sometimes forget about it
when developing an application. So I think it&rsquo;s great that it the subject is
brought up in this book!</p>
<p>Chapter ten (&ldquo;When All Else Fails: Getting Outside Help&rdquo;) is a nice description
of what you should do when you encounter a problem in Django. Karen points the
reader to the <a href="https://docs.djangoproject.com/">Django documentation</a> (to
confirm you are using the API as it was intended) and
<a href="https://code.djangoproject.com/">Django&rsquo;s bug tracker</a> (where you might already
find a fix for your problem). She also gives clear instructions and tips on what
to do when the problem isn&rsquo;t already fixed or perhaps hasn&rsquo;t even been reported
yet.</p>
<p>The last chapter of the book is about moving your code to production
and making it accessible for the world. It gives an example for the
required WSGI script and the Apache configuration. Furthermore, it
also describes debugging the production environment and load testing
with <a href="https://www.joedog.org/siege-home/">Siege</a>.</p>
<p>Finally Karen discusses the use of Apache and mod_wsgi during development.
Although she claims that the Apache/mod_wsgi setup can be made nearly as
convenient as using the Django development server I think it really depends on
the situation. I agree that it may be a good way to tackle some problems and
setup issues early on. But if you are working with a number of developers on the
project and each developer is working on several different projects (sometimes
even switching projects throughout the day), I&rsquo;m not sure whether it&rsquo;s worth the
effort.</p>
<h2 id="conclusion">Conclusion</h2>
<p>I&rsquo;ve been developing in Python a couple of years, mainly working on
Plone projects since 2007 and doing Django applications since 2009. I
was already more than familiar with the topics in the book (doctests,
unit test, logging, debugging, et cetera) and have also done a bit of
test driven development. As a result, the book did not open a whole
new world for me. However, I do think that the book was worth the
read. I picked up a few new tricks and gained an even better insight
in testing and debugging Django applications.</p>
<p>One last complaint though: the title of the book could have been a bit
better: by putting the Django version number in the title, the book
seems to target Django 1.1 specifically. Sure, Django 1.1 and 1.1.1
have been used in the book. And sure, some examples might not work in
earlier or later versions of Django. However, the principles remain
the same! In my opinion the version should have been left out of the
title.</p>
<p>Although I may not agree with everything, I think
<a href="https://www.packtpub.com/product/django-1-1-testing-and-debugging/9781847197566">Django 1.1 Testing and Debugging</a>
is a good book. So I&rsquo;d like to thanks Karen and Packt for writing and
publishing it.</p>]]></content>
  </entry>
</feed>
