<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>debian on bisco.org</title>
    <link>https://bisco.org/tags/debian/</link>
    <description>Recent content in debian on bisco.org</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 03 May 2026 06:28:51 +0100</lastBuildDate>
    
        <atom:link href="https://bisco.org/tags/debian/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Status update, February - April 2026</title>
      <link>https://bisco.org/notes/status-update-february-april-2026/</link>
      <pubDate>Sun, 03 May 2026 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/status-update-february-april-2026/</guid>
      <description>&lt;p&gt;Due to health reasons I did not have the energy to write individual status
updates for February &amp;amp; March, so I&amp;rsquo;ll just combine them with the April update:&lt;/p&gt;
&lt;p&gt;In February I cleaned out my GitHub account and moved all remaining
projects to &lt;a href=&#34;https://codeberg.org/birger/&#34;&gt;Codeberg&lt;/a&gt;. I archived the
repositories on GitHub and added links to the new repositories on Codeberg.
GitHub is a platform that is more and more frustrating to use. I still have to
use it for my dayjob, though. The number of pull requests and issues that are
written either by bots or by users that use bots increased in the last two
years. Combined with that, GitHub provides a very low barrier for entitled
users who do not want to contribute to a productive environment. GitHub now
feels like the Twitter/X of git forges. Codeberg on the other hand is a
community project. I feel a lot more at home there and the platform itself
feels a lot more responsive than GitHub.&lt;/p&gt;
&lt;h1 id=&#34;debian-related-work&#34;&gt;Debian Related Work&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Uploaded wayback 0.3-1 to experimental&lt;/li&gt;
&lt;li&gt;Uploaded slurp 1.6.0-1 to unstable&lt;/li&gt;
&lt;li&gt;Uploaded first a prerelease of sway to experimental to be able to test
wlroots 0.20.0 and then uploaded rc1, rc2 and rc3 of the upcoming 1.12
release&lt;/li&gt;
&lt;li&gt;Uploaded waybar 0.15.0-1 to unstable&lt;/li&gt;
&lt;li&gt;Uploaded kanshi 1.9.0-1 to unstable, which was possible because the dependency libscfg finally went through NEW&lt;/li&gt;
&lt;li&gt;Uploaded libscfg 0.2.0-1 to unstable&lt;/li&gt;
&lt;li&gt;Uploaded swaybg 1.2.2-1 to unstable&lt;/li&gt;
&lt;li&gt;Uploaded labwc 0.9.4-1, 0.9.5 &amp;amp; 0.9.6 to unstable&lt;/li&gt;
&lt;li&gt;Fixed the packaging of vali and uploaded version 0.1.1-1 to unstable; then
added vali to the build dependencies of kanshi and reuploaded 1.9.0-2 thereof&lt;/li&gt;
&lt;li&gt;Uploaded swaylock 1.8.5-1 to unstable&lt;/li&gt;
&lt;li&gt;Uploaded fcft 3.3.3-1 to unstable&lt;/li&gt;
&lt;li&gt;Uploaded foot 1.26.1-1 to unstable&lt;/li&gt;
&lt;li&gt;Uploaded swayimg 5.0-1 and 5.1-1 to unstable&lt;/li&gt;
&lt;li&gt;Fixed some packaging metadata in libsfdo and uploaded 0.1.4-2 to unstable&lt;/li&gt;
&lt;li&gt;Reverted the upload of slurp from 1.6.0-1 to 1.6.0really1.5.0-1 because the
upstream release of 1.6.0 was made by mistake and yanked a week later. Maybe
I should add a cooldown period before uploading new releases ;)&lt;/li&gt;
&lt;li&gt;Uploaded mako-notifier 1.11.0-1 to unstable&lt;/li&gt;
&lt;li&gt;Uploaded cage 0.3.0-1 to experimental which uses wlroots 0.20.0&lt;/li&gt;
&lt;li&gt;Uploaded xdg-desktop-portal-wlr 0.8.2-1 to unstable&lt;/li&gt;
&lt;li&gt;Voted&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;dh-related-work&#34;&gt;DH Related Work&lt;/h1&gt;
&lt;p&gt;I took part in the &lt;a href=&#34;https://dhd2026.digitalhumanities.de&#34;&gt;DHD 2026 Conference&lt;/a&gt;
in Vienna, including a &lt;a href=&#34;https://www.dhinfra.at/2026-02-23-dhd-workshop-ocr-postcorrection/&#34;&gt;hands-on
workshop&lt;/a&gt;
of the dhinfra project.&lt;/p&gt;
&lt;p&gt;I released 0.60.0, 0.61.0 and 0.62.0 of apis-core-rdf. We rewrote the
configuration format for the importer. We previously used TOML files, but that
does not give us inheritance. So we now use simply Python classes as
configuration format.&lt;/p&gt;
&lt;p&gt;I implemented a new backend for our apis-bibsonomy Django package. The package
is meant to provide a datamodel for storing reference data that links to
Bibsonomy or Zotero. Given that we don&amp;rsquo;t use Bibsonomy anymore we now dropped
the Bibsonomy backend but added a Zotero backend that allows to cache the
entries locally.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Status update, January 2026</title>
      <link>https://bisco.org/notes/status-update-january-2026/</link>
      <pubDate>Fri, 06 Feb 2026 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/status-update-january-2026/</guid>
      <description>&lt;p&gt;January was a slow month, I only did three uploads to Debian unstable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;xdg-desktop-portal-wlr updated to 0.8.1-1&lt;/li&gt;
&lt;li&gt;swayimg updated to 4.7-1&lt;/li&gt;
&lt;li&gt;usbguard updated to 1.1.4+ds-2, which closed &lt;a href=&#34;http://bugs.debian.org/1122733&#34;&gt;#1122733&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was very happy to see the new
&lt;a href=&#34;https://dfsg-new-queue.debian.org/&#34;&gt;dfsg-new-queue&lt;/a&gt; and that there are more hands
now processing the NEW queue. I also finally got one of the packages accepted
that I uploaded after the Trixie release:
&lt;a href=&#34;https://tracker.debian.org/pkg/wayback&#34;&gt;wayback&lt;/a&gt; which I uploaded last August.
There has been another release since then, I&amp;rsquo;ll try to upload that in the next
few days.&lt;/p&gt;
&lt;p&gt;There was a &lt;a href=&#34;https://github.com/b1rger/carl/issues/188&#34;&gt;bug report for &lt;code&gt;carl&lt;/code&gt;&lt;/a&gt;
asking for Windows support. &lt;code&gt;carl&lt;/code&gt; used the &lt;a href=&#34;https://crates.io/crates/xdg&#34;&gt;xdg&lt;/a&gt;
create for looking up the XDG directories, but &lt;code&gt;xdg&lt;/code&gt; does not support
windows systems (and it seems this &lt;a href=&#34;https://github.com/whitequark/rust-xdg/issues/28&#34;&gt;will not
change&lt;/a&gt;)
The reporter also provided a PR to replace the dependency with the
&lt;a href=&#34;https://crates.io/crates/directories&#34;&gt;directories&lt;/a&gt; crate which more system
agnostic. I adapted the PR a bit and merged it and &lt;a href=&#34;https://github.com/b1rger/carl/releases/tag/v0.6.0&#34;&gt;released version
0.6.0&lt;/a&gt; of carl.&lt;/p&gt;
&lt;p&gt;At my dayjob I refactored
&lt;a href=&#34;https://github.com/acdh-oeaw/django-grouper/&#34;&gt;django-grouper&lt;/a&gt;.
&lt;code&gt;django-grouper&lt;/code&gt; is a package we use to find duplicate objects in our data. Our
users often work with datasets of thousands of historical persons, places and
institutions and in projects that run over years and ingest data from multiple sources,
it happens that entries are created several times.
I wrote the initial app in 2024, but was never really happy about the approach
I used back then. It was based on &lt;a href=&#34;https://medium.com/data-science/group-thousands-of-similar-spreadsheet-text-cells-in-seconds-2493b3ce6d8d&#34;&gt;this blog
post&lt;/a&gt;
that describes how to group spreadsheet text cells. It uses &lt;a href=&#34;https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html&#34;&gt;sklearns
TfidfVectorizer&lt;/a&gt;
with a custom analyzer and the library
&lt;a href=&#34;https://github.com/ing-bank/sparse_dot_topn&#34;&gt;sparse_dot_topn&lt;/a&gt; for creating the
matrix. All in all the module to calculate the clusters was 80 lines and with
&lt;code&gt;sparse_dot_topn&lt;/code&gt; it pulled in a rather niche Python library. I was pretty sure
that this functionality could also be implemented with basic sklearn
functionality and it was: we are now using
&lt;a href=&#34;https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.DictVectorizer.html&#34;&gt;DictVectorizer&lt;/a&gt;
because in a Django app we are working with objects that can be mapped to dicts
anyway. And for clustering the data, the app now uses the
&lt;a href=&#34;https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html&#34;&gt;DBSCAN&lt;/a&gt;
algorithm (with the manhattan distance as metric). The module is now only half
the size and the whole app lost one dependency! I released those changes as
&lt;a href=&#34;https://github.com/acdh-oeaw/django-grouper/releases/tag/v0.3.0&#34;&gt;version
0.3.0&lt;/a&gt; of the
app.&lt;/p&gt;
&lt;p&gt;At the end of January together with friends I went to Brussels to attend
&lt;a href=&#34;https://fosdem.org/&#34;&gt;FOSDEM&lt;/a&gt;. We took the night train but there were a couple of
broken down trains so the ride took 26 hours instead of one night. It is a good
thing we had a one day buffer and FOSDEM only started on Saturday. As usual
there were too many talks to visit, so I&amp;rsquo;ll have to watch some of the
recordings in the next few weeks.&lt;/p&gt;
&lt;p&gt;Some examples of talks I found interesting so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a talk about supporting &lt;a href=&#34;https://fosdem.org/2026/schedule/event/RCFALN-rust-building-performance-critical-python-apps/&#34;&gt;Python web deployments with
Rust&lt;/a&gt;
in the Rust Developer room&lt;/li&gt;
&lt;li&gt;a &lt;a href=&#34;https://fosdem.org/2026/schedule/event/S7RELZ-ducks_to_the_rescue_-_etl_using_python_and_duckdb/&#34;&gt;talk about
duckdb&lt;/a&gt;
in the Python Developer room&lt;/li&gt;
&lt;li&gt;an introduction to
&lt;a href=&#34;https://fosdem.org/2026/schedule/event/DVVAV9-particle-os-from-trad-distro-to-immutable-image/&#34;&gt;particleos&lt;/a&gt;
in the Distributions Developer room&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Status update, December 2025</title>
      <link>https://bisco.org/notes/status-update-december-2025/</link>
      <pubDate>Fri, 02 Jan 2026 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/status-update-december-2025/</guid>
      <description>&lt;p&gt;December 2025 started off with a nice event, namely a small gathering of Vienna
based DDs. Some of us were at &lt;a href=&#34;https://debconf25.debconf.org/&#34;&gt;DebConf25&lt;/a&gt; in
Brest and we thought it might be nice to have a get-together of DDs in Vienna.
A couple of months after DebConf25 I picked up the idea, let someone else
ping the DDs, booked a table at a local cafe and in the end we were a group of
6 DDs. It was nice to put faces to names, names to nicknames and to hear what
people are up to. We are definitely planning to repeat that!&lt;/p&gt;
&lt;p&gt;December also &lt;strong&gt;ended&lt;/strong&gt; with a meeting of nerds: the &lt;a href=&#34;https://events.ccc.de/congress/2025/infos/startpage.html&#34;&gt;39th Chaos Communication
Congress&lt;/a&gt; in Hamburg.
As usual, I did not really have that much time to watch many talks. I tend to
bookmark a lot of them in the scheduling app in advance, but once I&amp;rsquo;m at the
congress the social aspect is much more important and I try to only attend
workshop or talks that are not recorded. Watching the recordings afterward is
possible anyway (and I actually try to do that!).&lt;/p&gt;
&lt;p&gt;There was also a Debian Developers meetup at day 3, combined with the usual
time confusion regarding UTC and CET. We talked about having a Debian table at
40c3, so maybe the timezone won&amp;rsquo;t be that much of a problem in the next time.&lt;/p&gt;
&lt;p&gt;Two talks I recommend are &lt;a href=&#34;https://app.media.ccc.de/v/39c3-css-clicker-training-making-games-in-a-styling-language&#34;&gt;CSS Clicker Training: Making games in a &amp;ldquo;styling&amp;rdquo;
language&lt;/a&gt;
and &lt;a href=&#34;https://app.media.ccc.de/v/39c3-to-sign-or-not-to-sign-practical-vulnerabilities-i&#34;&gt;To sign or not to sign: Practical vulnerabilities in GPG &amp;amp;
friends&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Regarding package uploads this month did not happen that much, I only uploaded
the new version (0.9.3) of &lt;a href=&#34;https://labwc.github.io/&#34;&gt;labwc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I created two new releases for &lt;a href=&#34;https://github.com/b1rger/carl&#34;&gt;carl&lt;/a&gt;. First a
0.5 release that adds &lt;code&gt;Today&lt;/code&gt; and &lt;code&gt;SpecifiedDate&lt;/code&gt; as properties. I forwarded an
issue about dates not being parsed correctly to the &lt;a href=&#34;https://github.com/hoodie/icalendar/issues/162&#34;&gt;icalendar issue
tracker&lt;/a&gt; and this was fixed a
couple of days later (thanks!). I then created a 0.5.1 release containing that
fix. I also started planning to move the carl repository back to codeberg,
because Github feels more and more like an AI Slop platform.&lt;/p&gt;
&lt;p&gt;The work on debiverse also continued. I removed the tailwind CSS framework,
and it was actually not that hard to reproduce all the needed CSS classes with
custom CSS. I think that CSS frameworks make sense to a point, but once you
start implementing stuff that the framework does not provide, it is easier if
everything comes out of one set of rules. There was also the article &lt;a href=&#34;https://www.zolkos.com/2025/12/03/vanilla-css-is-all-you-need&#34;&gt;Vanilla
CSS is all you
need&lt;/a&gt; which goes
into the same direction and which gave me some ideas how to organize the CSS
directives.&lt;/p&gt;
&lt;p&gt;I also refactored the filter generation for the listing filters and the HTML
filter form is now generated from the FastAPI &lt;a href=&#34;https://fastapi.tiangolo.com/tutorial/query-param-models/&#34;&gt;Query Parameter
Model&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/status-update-december-2025/Screenshot-filter.png&#34; alt=&#34;Screenshot of the filter form&#34;&gt;&lt;/p&gt;
&lt;p&gt;For navigation I implemented a sidebar, that is hidden on small screens but can
be toggled using a burger menu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/status-update-december-2025/Screenshot-menu.png&#34; alt=&#34;Screenshot of the navigation bar&#34;&gt;&lt;/p&gt;
&lt;p&gt;I also stumbled upon &lt;a href=&#34;https://nibblestew.blogspot.com/2025/12/an-uncomfortable-but-necessary.html&#34;&gt;An uncomfortable but necessary discussion about the
Debian bug
tracker&lt;/a&gt;,
which raises some valid points. I think debiverse could be a solution to the
first point of &amp;ldquo;What could be a way forward?&amp;rdquo;, namely: &amp;ldquo;Create a new web
service that parses the existing bug data and displays it in a &amp;ldquo;rich&amp;rdquo; format&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;But if there is ever another way than email to interact with bugs.debian.org,
than this approach should &lt;strong&gt;not&lt;/strong&gt; rely on passing on the commands via mail. If
I click a button in a web interface to raise the severity, the severity should
be raised right away - not 10 minutes later when the email is received. I think
the individual parts (web, database, mail interface) should be decoupled and
talk to each other via APIs.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Status update, November 2025</title>
      <link>https://bisco.org/notes/status-update-november-2025/</link>
      <pubDate>Tue, 02 Dec 2025 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/status-update-november-2025/</guid>
      <description>&lt;p&gt;I started this month with a week of vacation which was followed by a small
planned surgery and two weeks of sick leave. Nonetheless, I packaged and
uploaded new releases of a couple of packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;swayidle updated to version 1.9.0-1&lt;/li&gt;
&lt;li&gt;swaylock updated to version 1.8.4-1&lt;/li&gt;
&lt;li&gt;foot updated to version 1.25.0-1&lt;/li&gt;
&lt;li&gt;swayimg updated to version 4.6-1&lt;/li&gt;
&lt;li&gt;scdoc updated to version 1.11.4-1&lt;/li&gt;
&lt;li&gt;wofi updated to version 1.5.1-1&lt;/li&gt;
&lt;li&gt;xdg-desktop-portal-wlr updated to version 0.8.0-1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Besides that I reactivated I project I started in summer 2024: debiverse.org.
The idea of that was to have interfaces to Debian bugs and packages that are
usable on mobile devices (I know, ludicrous!). Back then I started with
&lt;a href=&#34;https://flask.palletsprojects.com&#34;&gt;Flask&lt;/a&gt; and
&lt;a href=&#34;https://www.sqlalchemy.org&#34;&gt;Sqlalchemy&lt;/a&gt;, but that soon got out of hand. I now
switched the whole stack to &lt;a href=&#34;https://fastapi.tiangolo.com&#34;&gt;FastAPI&lt;/a&gt; and
&lt;a href=&#34;https://sqlmodel.tiangolo.com&#34;&gt;SQLModel&lt;/a&gt; which makes it a lot easier to
manage. And the upside is that it comes with an API and OpenAPI docs. For the
rendered HTML pages I use
&lt;a href=&#34;https://jinja.palletsprojects.com/en/stable/&#34;&gt;Jinja2&lt;/a&gt; with Tailwind as CSS
framework. I am currently using udd-mirror as database backend, which works
pretty good (for this single user project). It would be nice to have some of
the data in a faster index, like Typesense or Meilisearch. This way it would
be possible to have faceted search or more performant full text search. But I
haven&amp;rsquo;t found any software that could provide this that is packaged in Debian.&lt;/p&gt;
&lt;div style=&#34;text-align: center;&#34;&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/status-update-november-2025/debiverse-bugs-01.png&#34; alt=&#34;Screenshot of the debiverse bug report list&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/status-update-november-2025/debiverse-swagger-02.png&#34; alt=&#34;Screenshot of the debiverse swagger API&#34;&gt;&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Status update, October 2025</title>
      <link>https://bisco.org/notes/status-update-october-2025/</link>
      <pubDate>Mon, 03 Nov 2025 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/status-update-october-2025/</guid>
      <description>&lt;p&gt;At the beginning of the month I uploaded a new version of the &lt;a href=&#34;https://tracker.debian.org/pkg/sway&#34;&gt;sway
package&lt;/a&gt; to Debian. This contains two
backported patches, one to fix reported WM capabilities and one to revert the
&lt;a href=&#34;https://manpages.debian.org/unstable/sway/sway-input.5.en.html#LIBINPUT_CONFIGURATION&#34;&gt;default behavior for
&lt;code&gt;drag_lock&lt;/code&gt;&lt;/a&gt;
to &lt;code&gt;disabled&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I also uploaded new releases of &lt;a href=&#34;https://tracker.debian.org/pkg/cage&#34;&gt;cage&lt;/a&gt; (a
kiosk for Wayland), &lt;a href=&#34;https://tracker.debian.org/pkg/labwc&#34;&gt;labwc&lt;/a&gt;, the
window-stacking Wayland compositor that is inspired by Openbox, and
&lt;a href=&#34;https://tracker.debian.org/pkg/wf-recorder&#34;&gt;wf-recorder&lt;/a&gt;, a tool for creating
screen recordings of wlroots-based Wayland compositors.&lt;/p&gt;
&lt;p&gt;If I don&amp;rsquo;t forget I try to update the watch file of the packages I touch to the
&lt;a href=&#34;https://manpages.debian.org/unstable/devscripts/debian-watch.5.en.html#FORMAT_OF_THE_WATCH_FILE,_VERSION_5&#34;&gt;new version 5
format&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://emersion.fr/blog/2025/announcing-vali/&#34;&gt;Simon Ser announced&lt;/a&gt;
&lt;a href=&#34;https://gitlab.freedesktop.org/emersion/vali&#34;&gt;vali&lt;/a&gt;, a C library for
&lt;a href=&#34;https://varlink.org/&#34;&gt;Varlink&lt;/a&gt;. The blog post also mentions that this will be
a dependency of &amp;ldquo;the next version of the kanshi Wayland output management
daemon&amp;rdquo; and the PR to do so is now already merged. So I created &lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1117255&#34;&gt;ITP: vali &amp;ndash; A
Varlink C implementation and code
generator&lt;/a&gt;, packaged
the library and it is now waiting in NEW. In addition to &lt;code&gt;libscfg&lt;/code&gt; this is now
the second dependency of &lt;code&gt;kanshi&lt;/code&gt; that is in NEW.&lt;/p&gt;
&lt;p&gt;On the Rust side of things I fixed a
&lt;a href=&#34;https://github.com/b1rger/carl/issues/159&#34;&gt;bug&lt;/a&gt; in
&lt;a href=&#34;https://github.com/b1rger/carl/&#34;&gt;carl&lt;/a&gt;. The fix introduces new date
properties which can be use to highlight a calendar date. I also updated
all the dependencies and plan to create a new release soon.&lt;/p&gt;
&lt;p&gt;Later I dug up a Rust project that I started a couple of years ago, where I try
to use &lt;a href=&#34;https://wasm-bindgen.github.io/wasm-bindgen/&#34;&gt;wasm-bindgen&lt;/a&gt; to
implement interactive web components. There is a lot I have to refactor in this
code base, but I will work on that and try to publish something in the next few
months.&lt;/p&gt;
&lt;h2 id=&#34;miscellaneous&#34;&gt;Miscellaneous&lt;/h2&gt;
&lt;p&gt;Two weeks ago I wrote &lt;a href=&#34;https://bisco.org/notes/a-plea-for-dialog/&#34;&gt;A plea for &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;&lt;/a&gt;,
which made the case for using standardized HTML elements instead of resorting
to JavaScript libraries.&lt;/p&gt;
&lt;p&gt;I finally managed to update my shell Server to Debian 13.&lt;/p&gt;
&lt;p&gt;I created &lt;a href=&#34;https://github.com/nextcloud/news-android/issues/1583&#34;&gt;an issue for the nextcloud-news android
client&lt;/a&gt; because I moved
to a new phone and my starred articles did not show up in the news app, which
is a bit annoying.&lt;/p&gt;
&lt;p&gt;I got my ticket for 39C3.&lt;/p&gt;
&lt;p&gt;In my dayjob I continued to work on the refactoring of the import logic of our
&lt;code&gt;apis-core-rdf&lt;/code&gt; app. I released version 0.56 which also introduced the
&amp;ldquo;#snackbar&amp;rdquo; as the container for the toast message, as described in the
&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; block post. At the end of the month I released version 0.57
of &lt;code&gt;apis-core-rdf&lt;/code&gt;, which got rid of the remaining leftovers of the old
import logic.&lt;/p&gt;
&lt;p&gt;A couple of interesting articles I stumbled upon (or finally had the time to read):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://t-strings.help/&#34;&gt;Learn Python’s t‑strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gomakethings.com/just-use-a-button/&#34;&gt;Just use a button&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://rakhim.exotext.com/ai-is-impressive-because-we-ve-failed-at-semantic-web-and-personal-computing&#34;&gt;AI is impressive because we’ve failed at semantic web and personal computing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hackeryarn.com/post/rust-macros-1/&#34;&gt;Let&amp;rsquo;s write a macro in Rust - Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/1041120/&#34;&gt;Explicit lazy imports for Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://frontendmasters.com/blog/what-you-need-to-know-about-modern-css-2025-edition/&#34;&gt;What You Need to Know about Modern CSS (2025 Edition)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>A plea for &lt;dialog&gt;</title>
      <link>https://bisco.org/notes/a-plea-for-dialog/</link>
      <pubDate>Mon, 20 Oct 2025 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/a-plea-for-dialog/</guid>
      <description>&lt;p&gt;A couple of weeks ago there was an article on the Freexian blog about &lt;a href=&#34;https://www.freexian.com/blog/debusine-and-javascript/&#34;&gt;Using
JavaScript in Debusine without depending on
JavaScript&lt;/a&gt;. It
describes how JavaScript is used in the Debusine Django app, namely &amp;ldquo;for
progressive enhancement rather than core functionality&amp;rdquo;.
This is an approach I also follow when implementing web interfaces and I think
developments in web technologies and standardization in recent years have made
this a lot easier.&lt;/p&gt;
&lt;p&gt;One of the examples described in the post, the &amp;ldquo;Bootstrap toast&amp;rdquo; messages, was
something that I implemented myself recently, in a similar but slightly
different way.&lt;/p&gt;
&lt;p&gt;In the main app I develop for my day job we also use &lt;a href=&#34;https://getbootstrap.com&#34;&gt;the Bootstrap
framework&lt;/a&gt;. I have also used it for different
personal projects (for example the GSOC project I did for Debian in 2018, was
&lt;a href=&#34;https://bisco.org/notes/first-gsoc-report/&#34;&gt;also a Django app that used
Bootstrap&lt;/a&gt;).
Bootstrap is still primarily a CSS framework, but it also comes with a
JavaScript library for some functionality. Previous versions of Bootstrap
depended on jQuery, but since version 5 of Bootstrap, you don&amp;rsquo;t need jQuery
anymore. In my experience, two of the more commonly used JavaScript utilities
of Bootstrap are &lt;a href=&#34;https://getbootstrap.com/docs/5.0/components/modal/&#34;&gt;modals&lt;/a&gt;
(also called lightbox or popup, they are elements that are displayed &amp;ldquo;above&amp;rdquo;
the main content of a website) and
&lt;a href=&#34;https://getbootstrap.com/docs/5.0/components/toasts/&#34;&gt;toasts&lt;/a&gt; (also called
alerts, they are little notification windows that often disappear after a
timeout). The thing is, Bootstrap 5 was released in 2021 and a lot has happened
since then regarding web technologies. I believe that both these UI components
can nowadays be implemented using standard HTML5 elements.&lt;/p&gt;
&lt;p&gt;An eye opening talk I watched was &lt;a href=&#34;https://www.youtube.com/watch?v=IP_rtWEMR0o&#34;&gt;Stop using JS for
that&lt;/a&gt; from last years JSConf(!).
In this talk the speaker argues that the &lt;a href=&#34;https://en.wikipedia.org/wiki/Rule_of_least_power&#34;&gt;Rule of least
power&lt;/a&gt; is one of the core
principles of web development, which means we should use HTML over CSS and CSS
over JavaScript. And the speaker also presents some CSS rules and HTML elements
that added recently and that help to make that happen, one of them being the
&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog&#34;&gt;dialog
element&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &amp;lt;dialog&amp;gt; HTML element represents a modal or non-modal dialog box or other
interactive component, such as a dismissible alert, inspector, or subwindow.&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;cite&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog&#34;&gt;The Dialog element at MDN&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The baseline for this element is &amp;ldquo;widely available&amp;rdquo;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This feature is well established and works across many devices and browser
versions. It’s been available across browsers since March 2022.&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;cite&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog&#34;&gt;The Dialog element at MDN&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This means there is an HTML element that does what a modal Bootstrap does!&lt;/p&gt;
&lt;p&gt;Once I had watched that talk I removed all my Bootstrap modals and replaced
them with HTML &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; elements (JavaScript is still needed to &lt;code&gt;.show()&lt;/code&gt; and
&lt;code&gt;.close()&lt;/code&gt; the elements, though, but those are two methods instead of a full
library). This meant not only that I replaced code that depended on an external
library, I&amp;rsquo;m now also a lot more flexible regarding the styling of the
elements.&lt;/p&gt;
&lt;p&gt;When I started implementing notifications for our app, my first approach was to
use Bootstrap toasts, similar to how it is implemented in Debusine. But looking
at the amount of HTML code I had to write for a simple toast message, I thought
that it might be possible to also implement toasts with the &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; element.
I mean, basically it is the same, only the styling is a bit different. So what
I did was that I added a &lt;code&gt;#snackbar&lt;/code&gt; area to the DOM of the app. This would be
the container for the &lt;code&gt;toast&lt;/code&gt; messages. All the toast messages are simply
&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; elements with the &lt;code&gt;open&lt;/code&gt; attribute, which means that they are
visible right away when the page loads.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&amp;lt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#309&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;snackbar&amp;#34;&lt;/span&gt;&amp;gt;
  {% for message in messages %}
    &amp;lt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;dialog&lt;/span&gt; &lt;span style=&#34;color:#309&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;mytoast alert alert-{{ message.tags }}&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#309&#34;&gt;role&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;alert&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#309&#34;&gt;open&lt;/span&gt;&amp;gt;
      {{ message }}
    &amp;lt;/&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;dialog&lt;/span&gt;&amp;gt;
  {% endfor %}
&amp;lt;/&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;div&lt;/span&gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This looks a lot simpler than the Bootstrap toasts would have.&lt;/p&gt;
&lt;p&gt;To make the &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; elements a little bit more fancy, I added some CSS to make
them fade in and out:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;.&lt;span style=&#34;color:#0a8;font-weight:bold&#34;&gt;mytoast&lt;/span&gt; {
    &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;z-index&lt;/span&gt;: &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt;;
    &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;animation&lt;/span&gt;: fadein &lt;span style=&#34;color:#f60&#34;&gt;0.5&lt;/span&gt;&lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;s&lt;/span&gt;, fadeout &lt;span style=&#34;color:#f60&#34;&gt;0.5&lt;/span&gt;&lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#f60&#34;&gt;2.6&lt;/span&gt;&lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;s&lt;/span&gt;;
}

@&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;keyframes&lt;/span&gt; &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;fadein&lt;/span&gt; {
    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;from&lt;/span&gt; {
        &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;opacity&lt;/span&gt;: &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt;;
    }

    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;to&lt;/span&gt; {
        &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;opacity&lt;/span&gt;: &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt;;
    }
}

@&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;keyframes&lt;/span&gt; &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;fadeout&lt;/span&gt; {
    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;from&lt;/span&gt; {
        &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;opacity&lt;/span&gt;: &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt;;
    }

    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;to&lt;/span&gt; {
        &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;opacity&lt;/span&gt;: &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt;;
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To close a &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; element once it has faded away, I had to add one
JavaScript event listener:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;color:#366&#34;&gt;window&lt;/span&gt;.addEventListener(&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;load&amp;#39;&lt;/span&gt;, () =&amp;gt; {
    &lt;span style=&#34;color:#366&#34;&gt;document&lt;/span&gt;.querySelectorAll(&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;.mytoast&amp;#34;&lt;/span&gt;).forEach((element) =&amp;gt; {
        element.addEventListener(&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;animationend&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;function&lt;/span&gt;(e) {
            e.animationName &lt;span style=&#34;color:#555&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;fadeout&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; element.close();
        });
    });
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(If one would want to use the same HTML code for both script and noscript users,
then the CSS should probably adapted: it fades away and if there is no
JavaScript to close the element, it stays visible after the animation is over.
A solution would for example be to use a close button and for noscript users
simply let it stay visible - this is also what happens with the noscript
messages in Debusine).&lt;/p&gt;
&lt;p&gt;So there are many &amp;ldquo;new&amp;rdquo; elements in HTML and a lot of &amp;ldquo;new&amp;rdquo; features of CSS. It
makes sense to sometimes ask ourselves if instead of the solutions we know (or
what a web search / some AI shows us as the most common solution) there might
be some newer solution that was not there when the first choice was
created. Using standardized solutions instead of custom libraries makes the
software more maintainable. In web development I also prefer standardized
elements over a third party library because they have usually better
accessibility and UX.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;https://alfy.blog/2025/10/04/how-functional-programming-shaped-modern-frontend.html&#34;&gt;How Functional Programming Shaped (and Twisted) Frontend
Development&lt;/a&gt;
the author writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Consider the humble modal dialog. The web has &amp;lt;dialog&amp;gt;, a native element with
built-in functionality: it manages focus trapping, handles Escape key
dismissal, provides a backdrop, controls scroll-locking on the body, and
integrates with the accessibility tree. It exists in the DOM but remains
hidden until opened. No JavaScript mounting required.&lt;/p&gt;
&lt;p&gt;[&amp;hellip;]&lt;/p&gt;
&lt;p&gt;you’ve trained developers to not even look for native solutions. The platform
becomes invisible. When someone asks “how do I build a modal?”, the answer is
“install a library” or “here’s my custom hook,” never “use &amp;lt;dialog&amp;gt;.”&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;cite&gt;&lt;a href=&#34;https://alfy.blog/2025/10/04/how-functional-programming-shaped-modern-frontend.html&#34;&gt;Ahmad Alfy&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Status update, September 2025</title>
      <link>https://bisco.org/notes/status-update-september-2025/</link>
      <pubDate>Wed, 01 Oct 2025 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/status-update-september-2025/</guid>
      <description>&lt;p&gt;Regarding Debian packaging this was a rather quiet month. I uploaded version
1.24.0-1 of &lt;a href=&#34;https://codeberg.org/dnkl/foot&#34;&gt;foot&lt;/a&gt; and version 2.8.0-1 of
&lt;a href=&#34;https://github.com/git-quick-stats/git-quick-stats&#34;&gt;git-quick-stats&lt;/a&gt;. I took
the opportunity and started migrating my packages to the new &lt;a href=&#34;https://manpages.debian.org/unstable/devscripts/debian-watch.5.en.html&#34;&gt;version 5 watch
file
format&lt;/a&gt;,
which I think is much more readable than the previous format.&lt;/p&gt;
&lt;p&gt;I also uploaded version 0.1.1-1 of
&lt;a href=&#34;https://codeberg.org/emersion/libscfg&#34;&gt;libscfg&lt;/a&gt; to NEW. &lt;code&gt;libscfg&lt;/code&gt; is a C
implementation of the &lt;a href=&#34;https://git.sr.ht/~emersion/scfg&#34;&gt;scfg&lt;/a&gt; configuration
file format and it is a dependency of recent version of
&lt;a href=&#34;https://gitlab.freedesktop.org/emersion/kanshi&#34;&gt;kanshi&lt;/a&gt;. &lt;code&gt;kanshi&lt;/code&gt; is a tool
similar to autorandr which allows you define output profiles and kanshi
switches to the correct output profile on hotplug events. Once &lt;code&gt;libscfg&lt;/code&gt; is in
unstable I can finally update &lt;code&gt;kanshi&lt;/code&gt; to the latest version.&lt;/p&gt;
&lt;p&gt;A lot of time this month in finalizing a redesign of the output rendering of
&lt;a href=&#34;https://github.com/b1rger/carl&#34;&gt;carl&lt;/a&gt;. &lt;code&gt;carl&lt;/code&gt; is a small rust program I wrote
that provides a calendar view similar to &lt;code&gt;cal&lt;/code&gt;, but it comes with colors and
ical file integration. That means that you can not only display a simple
calendar, but also colorize/highlight dates based on various attributes or
based on events on that day. In the initial versions of &lt;code&gt;carl&lt;/code&gt; the output
&lt;em&gt;rendering&lt;/em&gt; was simply hardcoded into the app.&lt;/p&gt;
&lt;div style=&#34;text-align: center;&#34;&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/b1rger/carl/main/data/screenshot-ical.png&#34; alt=&#34;Screenshot of carl&#34;&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This was a bit cumbersome to maintain and not configurable for users. I am
using templating languages on a daily basis, so I decided I would reimplement
the output generation of &lt;code&gt;carl&lt;/code&gt; to use templates. I chose the
&lt;a href=&#34;https://github.com/mitsuhiko/minijinja&#34;&gt;minijinja&lt;/a&gt; Rust library which is
&amp;ldquo;based on the syntax and behavior of the Jinja2 template engine for Python&amp;rdquo;.
There are others out there, like &lt;a href=&#34;https://keats.github.io/tera/&#34;&gt;tera&lt;/a&gt;, but
minijinja seems to be more active in development currently. I worked on this
implementation on and off for the last year and finally had the time to finish
it up and write some additional tests for the outputs. It is easier to maintain
templates than Rust code that uses &lt;code&gt;write!()&lt;/code&gt; to format the output. I also
implemented a configuration option for users to override the templates.&lt;/p&gt;
&lt;p&gt;Additional to the output refactoring I also fixed couple of bugs and finally
released &lt;a href=&#34;https://crates.io/crates/carl/0.4.0&#34;&gt;v0.4.0 of carl&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In my dayjob I released version 0.53 of apis-core-rdf which contains the place
lookup field which I implemented in August. A couple of weeks later we released
version 0.54 which comes with a middleware to show pass on messages from the
&lt;a href=&#34;https://docs.djangoproject.com/en/5.2/ref/contrib/messages/&#34;&gt;Django messages
framework&lt;/a&gt; via
response header to HTMX to trigger message popups. This implementation is based
on the blog post &lt;a href=&#34;https://blog.benoitblanchon.fr/django-htmx-messages-framework/&#34;&gt;Using the Django messages framework with
HTMX&lt;/a&gt;. Version
0.55 was the last release in September. It contained preparations for
refactoring the import logic as well as a couple of UX improvements.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Status update, August 2025</title>
      <link>https://bisco.org/notes/status-update-august-2025/</link>
      <pubDate>Mon, 01 Sep 2025 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/status-update-august-2025/</guid>
      <description>&lt;p&gt;Due to the freeze I did not do that many uploads in the last few months, so
there were various new releases I packaged once Trixie was released. Regarding
the release of Debian 13, Trixie, I wrote a small &lt;a href=&#34;https://bisco.org/notes/updates-and-additions-in-debian-13-trixie/&#34;&gt;summary of the changes in my
packages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I uploaded an unreleased version of &lt;code&gt;cage&lt;/code&gt; to experimental, to prepare for the
transition to wlroots-0.19. Both &lt;code&gt;sway&lt;/code&gt; and &lt;code&gt;labwc&lt;/code&gt; already had packages in
experimental that depended on the new wlroots version. When the transition
happened, I uploaded the &lt;code&gt;cage&lt;/code&gt; version to unstable, as well as &lt;code&gt;labwc&lt;/code&gt; 0.9.1
and &lt;code&gt;sway&lt;/code&gt; 1.11.&lt;/p&gt;
&lt;p&gt;I updated&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;foot&lt;/code&gt; to 1.23.1&lt;/li&gt;
&lt;li&gt;&lt;code&gt;waybar&lt;/code&gt; to 0.14.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swaylock&lt;/code&gt; to 1.8.3&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git-quick-stats&lt;/code&gt; to 2.7.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swayimg&lt;/code&gt; to 4.5&lt;/li&gt;
&lt;li&gt;&lt;code&gt;usbguard&lt;/code&gt; to 1.1.4&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fcft&lt;/code&gt; to 3.3.2&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fnott&lt;/code&gt; to 1.8.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wdisplays&lt;/code&gt; to 1.1.3&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wev&lt;/code&gt; to 1.1.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wlopm&lt;/code&gt; to 1.0.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wmenu&lt;/code&gt; to 0.2.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;libsfdo&lt;/code&gt; to 0.1.4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of the packages I uploaded using &lt;code&gt;git-debpush&lt;/code&gt;, some of them could not
be uploaded this way due to upstream using git submodules (this is
&lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1107219&#34;&gt;1107219&lt;/a&gt;). I also
created &lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1112040&#34;&gt;1112040 - git-debpush: should also say which tag it
created&lt;/a&gt; and
&lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1111504&#34;&gt;1111504 - git-debpush: pristine-tar check warns about pristine-tar data thats
not present&lt;/a&gt; (which
is already fixed).&lt;/p&gt;
&lt;p&gt;I uploaded &lt;code&gt;wayback&lt;/code&gt; 0.2 to NEW, where it is &lt;a href=&#34;https://ftp-master.debian.org/new/wayback_0.2-1.html&#34;&gt;waiting for
review&lt;/a&gt;,
(&lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1109889&#34;&gt;ITP&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In my dayjob I added extended the place lookup form of apis-core-rdf to allow
searching places and selecting them on a map using leaflet and the nominatim
API. Another issue I worked on was about highlighting those inputs of our
generic list filter that are used to filter the results. I released a couple
of bugfix releases for the v0.50 release, then v0.51 and two bugfix releases
and then v0.52 and another couple of bugfix releases. v0.53 will land in a
couple of days. I also released v0.6.2 of apis-highlighter-ng, which is sort
of a plugin for apis-core-rdf, that allows to highlight parts of a text and
link them to whatever Django object (in our case relations).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Updates and additions in Debian 13 Trixie</title>
      <link>https://bisco.org/notes/updates-and-additions-in-debian-13-trixie/</link>
      <pubDate>Sat, 16 Aug 2025 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/updates-and-additions-in-debian-13-trixie/</guid>
      <description>&lt;p&gt;Last week Debian 13 (Trixie) was released and there have been some updates
and additions in the packages that I maintain, that I wanted to write
about. I think they are not worth of being added to the release notes, but I
still wanted to list some of the changes and some of the new packages.&lt;/p&gt;
&lt;h1 id=&#34;sway&#34;&gt;sway&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://swaywm.org/&#34;&gt;Sway&lt;/a&gt;, the tiling Wayland compositor was version 1.7 in
Bookworm. It was updated to version 1.10 (and 1.11 is already in experimental
and waiting for an upload to unstable). This new version of &lt;code&gt;sway&lt;/code&gt; brings,
among a lot of other features, updated support for touchpad gestures and
support for the
&lt;a href=&#34;https://wayland.app/protocols/ext-session-lock-v1&#34;&gt;ext-session-lock-v1&lt;/a&gt;
protocol, which allows for more robust and secure screen locking. The
configuration snippet that activates the default sway background is now shipped
in the &lt;code&gt;sway-backgrounds&lt;/code&gt; package instead of being part of the sway package
itself.&lt;/p&gt;
&lt;p&gt;The default menu application was changed from &lt;code&gt;dmenu&lt;/code&gt; to &lt;code&gt;wmenu&lt;/code&gt;. &lt;code&gt;wmenu&lt;/code&gt; is a
Wayland native alternative to &lt;code&gt;dmenu&lt;/code&gt; which I packaged and it is now
recommended by &lt;code&gt;sway&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There are some small helper tools for sway that were updated: &lt;code&gt;swaybg&lt;/code&gt; was
bumped from 1.2.0 to 1.2.1, &lt;code&gt;swaylock&lt;/code&gt; was bumped from 1.7.2 to 1.8.2.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;grimshot&lt;/code&gt; script, which is a script for making screenshots, was part
of the sway&amp;rsquo;s contrib folder for a long time (but was shipped as a separate
binary package). It was removed from sway and is now part of the
&lt;a href=&#34;https://github.com/OctopusET/sway-contrib&#34;&gt;sway-contrib&lt;/a&gt; project. There are
some other useful utilities in this source package that I might package in the
future.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;slurp&lt;/code&gt;, which is used by &lt;code&gt;grimshot&lt;/code&gt; to select a region, was updated from
version 1.4 to version 1.5.&lt;/p&gt;
&lt;h1 id=&#34;labwc&#34;&gt;labwc&lt;/h1&gt;
&lt;p&gt;I uploaded the first &lt;code&gt;labwc&lt;/code&gt; package two years ago and I&amp;rsquo;m happy it is now part
of a stable Debian release. &lt;a href=&#34;https://labwc.github.io/&#34;&gt;Labwc&lt;/a&gt; is also based on
wlroots, like &lt;code&gt;sway&lt;/code&gt;. It is a window-stacking compositor and is inspired by
&lt;a href=&#34;http://openbox.org/&#34;&gt;openbox&lt;/a&gt;. I used openbox for a long time back in the day
before I moved to i3 and I&amp;rsquo;m very happy to see that there is a Wayland
alternative.&lt;/p&gt;
&lt;h1 id=&#34;foot&#34;&gt;foot&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://codeberg.org/dnkl/foot&#34;&gt;Foot&lt;/a&gt; is a minimalistic and fast Wayland
terminal emulator. It is mostly keyboard driven. &lt;code&gt;foot&lt;/code&gt; was updated from version
1.13.1 to 1.21.0. The probably most important change for users updating might be
the fact that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Control+Shift+u&lt;/code&gt; is now bound to &lt;code&gt;unicode-input&lt;/code&gt; instead of &lt;code&gt;show- urls-launch&lt;/code&gt;, to follow the convention established in GTK and Qt&lt;/li&gt;
&lt;li&gt;&lt;code&gt;show-urls-launch&lt;/code&gt; now bound to &lt;code&gt;Control+Shift+o&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;et-cetera&#34;&gt;et cetera&lt;/h1&gt;
&lt;p&gt;The Wayland kiosk &lt;code&gt;cage&lt;/code&gt; was updated from 0.1.4 to 0.2.0.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;waybar&lt;/code&gt; bar for wlroots compositors was updated from 0.9.17 to 0.12.0.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;swayimg&lt;/code&gt; was updated from 1.10 to 3.8 and now brings support for custom key
bindings, support for additional image types (PNM, EXR, DICOM, Farbfeld,
sixel) and a gallery mode.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tofi&lt;/code&gt;, another dmenu replacement was updated from 0.8.1 to 0.9.1,
&lt;code&gt;wf-recorder&lt;/code&gt; a tool for screen recording in wlroots-based compositors, was
updated from version 0.3 to version 0.5.0. &lt;code&gt;wlogout&lt;/code&gt; was updated from version
1.1.1 to 1.2.2. The application launcher &lt;code&gt;wofi&lt;/code&gt; was updated from 1.3 to 1.4.1.
The lightweight status panel &lt;code&gt;yambar&lt;/code&gt; was updated from version 1.9 to 1.11.
&lt;code&gt;kanshi&lt;/code&gt;, the tool for managing and automatically switching your output
profiles, was updated from version 1.3.1 to version 1.5.1.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;usbguard&lt;/code&gt; was updated from version 1.1.2 to 1.1.3.&lt;/p&gt;
&lt;h1 id=&#34;added&#34;&gt;added&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fnott&lt;/code&gt; - a lightweight notification daemon for wlroots based compositors&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fyi&lt;/code&gt; - a utility to send notifications to a notification daemon, similar
to &lt;code&gt;notify-send&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pipectl&lt;/code&gt; - a tool to create and manage short-lived named pipes, this is a
dependency of &lt;code&gt;wl-present&lt;/code&gt;. &lt;code&gt;wl-present&lt;/code&gt; is a script around
&lt;a href=&#34;https://github.com/Ferdi265/wl-mirror&#34;&gt;wl-mirror&lt;/a&gt; which implements output
mirroring for wlroots-based compositors&lt;/li&gt;
&lt;li&gt;&lt;code&gt;poweralertd&lt;/code&gt; - a small daemon that notifies you about the power status of
your battery powered devices&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wlopm&lt;/code&gt; - control power management of outputs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wlrctl&lt;/code&gt; - command line utility for miscellaneous wlroots Wayland extensions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wmenu&lt;/code&gt; - already mentioned, the new default launcher of sway&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wshowkeys&lt;/code&gt; - shows keypresses in wayland sessions, nice for debugging&lt;/li&gt;
&lt;li&gt;&lt;code&gt;libsfdo&lt;/code&gt; - libraries implementing some freedesktop.org specs, used by labwc&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Status update, July 2025</title>
      <link>https://bisco.org/notes/status-update-july-2025/</link>
      <pubDate>Fri, 01 Aug 2025 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/status-update-july-2025/</guid>
      <description>&lt;p&gt;In beginning of July I got my &lt;a href=&#34;https://bisco.org/notes/debian-on-framework-12/&#34;&gt;12&amp;quot; framework
laptop&lt;/a&gt; and installed Debian
on it. During that setup I made some updates to my &lt;a href=&#34;https://salsa.debian.org/birger/base-setup&#34;&gt;base
setup&lt;/a&gt; scripts that I use to
install Debian machines.&lt;/p&gt;
&lt;p&gt;Due to the freeze I did not do much package related work. But I was at
&lt;a href=&#34;https://bisco.org/notes/my-debconf-25-review/&#34;&gt;DebConf&lt;/a&gt; and I uploaded a new
release of &lt;a href=&#34;https://labwc.github.io/&#34;&gt;labwc&lt;/a&gt; to experimental, mostly to &lt;a href=&#34;https://bisco.org/notes/my-first-tag2upload-upload/&#34;&gt;test
the tag2upload workflow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started working on packaging
&lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1109230&#34;&gt;wlr-sunclock&lt;/a&gt; which
is a small Wayland widget that displays the sun&amp;rsquo;s shadows on the earth. I also
created &lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1109889&#34;&gt;an ITP&lt;/a&gt; for
&lt;a href=&#34;https://gitlab.freedesktop.org/wayback/wayback/&#34;&gt;wayback&lt;/a&gt;. Wayback is an X11
compatibility layer to allow to run X11 desktop environments using Wayland.&lt;/p&gt;
&lt;p&gt;In my dayjob I did my usual work on
&lt;a href=&#34;https://github.com/acdh-oeaw/apis-core-rdf&#34;&gt;apis-core-rdf&lt;/a&gt;, which is our
Django application for managing prosopographic data. I implemented a password
change interface and did some restructuring of the templates. We released a new
version which was followed by a bugfix release a couple of days later.&lt;/p&gt;
&lt;p&gt;I also implemented a rather big refactoring in
&lt;a href=&#34;https://gitlab.oeaw.ac.at/acdh-ch/pfp/pfp-api/&#34;&gt;pfp-api&lt;/a&gt;. PFP-API is a
&lt;a href=&#34;https://fastapi.tiangolo.com/&#34;&gt;FastAPI&lt;/a&gt; based REST API that uses
&lt;a href=&#34;https://github.com/acdh-oeaw/rdfproxy&#34;&gt;rdfproxy&lt;/a&gt; to fetch data from a
Triplestore, converts the data to Pydantic models and then ships the models as
JSON. Most of the work is done by
&lt;a href=&#34;https://github.com/acdh-oeaw/rdfproxy&#34;&gt;rdfproxy&lt;/a&gt; in the background, but I
adapted the existing pfp-api code to make it easier to add new entity types.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My DebConf 25 review</title>
      <link>https://bisco.org/notes/my-debconf-25-review/</link>
      <pubDate>Sat, 26 Jul 2025 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/my-debconf-25-review/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://debconf25.debconf.org/&#34;&gt;DebConf 25&lt;/a&gt; happened between 14th July and
19th July and I was there. It was my first DebConf (the big one, I was at a
&lt;a href=&#34;https://bisco.org/notes/mini-debconf-in-hamburg/&#34;&gt;Mini DebConf in Hamburg&lt;/a&gt; a
couple of years ago) and it was interesting. DebConf 25 happened at a Campus
University at the outskirts of Brest and I was rather reluctant to go at first
(&lt;a href=&#34;https://ep2025.europython.eu/&#34;&gt;EuroPython 25&lt;/a&gt; was happening at the same time
in Prague), but I decided to use the chance of DebConf happening in Europe,
reachable by train from Vienna. We took the nighttrain to Paris, then found our
way through the maze that is the Paris underground system and then got to Brest
with the TGV. On our way to the Conference site we made a detour to a
supermarket, which wasn&amp;rsquo;t that easy because is was a national holiday in France
and most of the shops were closed. But we weren&amp;rsquo;t sure about the food situation
at DebConf and we also wanted to get some beer.&lt;/p&gt;
&lt;p&gt;At the conference we were greeted by very friendly people at the badge station
and the front desk and got our badges, swag and most important the keys to
pretty nice rooms on the campus. Our rooms had a small private bathroom with a
toilet and a shower and between the two rooms was a shared kitchen with a
refrigerator and a microwave. All in all, the accommodation was simple but
provided everything we needed and especially a space to have some privacy.&lt;/p&gt;
&lt;p&gt;During the next days I watched a lot of talks, met new people, caught up with
old friends and also had a nice time with my travel buddies. There was a beach
near the campus which I used nearly every day. It was mostly sunny except for
the last day of the conference, which apparently was not common for the Brest
area, so we got lucky regarding the weather.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/my-debconf-25-review/1_small.jpg&#34; alt=&#34;Landscape view of the sea at Dellec beach&#34;&gt;&lt;/p&gt;
&lt;p&gt;Given that we only arrived in the evening of the first day of DebConf, I missed
the talk &lt;a href=&#34;https://debconf25.debconf.org/talks/142-when-free-software-communities-unite-tails-tor-and-the-fight-for-privacy/&#34;&gt;When Free Software Communities Unite: Tails, Tor, and the Fight for
Privacy&lt;/a&gt;
(&lt;a href=&#34;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-754-when-free-software-communities-unite-tails-tor-and-the-fight-for-privacy.av1.webm&#34;&gt;recording&lt;/a&gt;),
but I watched it on the way home and it &lt;a href=&#34;https://lwn.net/Articles/1029769/&#34;&gt;was also covered by
LWN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On Tuesday I started the day by visiting a &lt;a href=&#34;https://debconf25.debconf.org/talks/120-tag2upload-upload-simply-by-pushing-a-signed-git-tag/&#34;&gt;talk about
tag2upload&lt;/a&gt;
(&lt;a href=&#34;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-397-tag2upload-upload-simply-by-pushing-a-signed-git-tag.av1.webm&#34;&gt;recording&lt;/a&gt;).
The same day there was also an academic track and I watched the talk titled
&lt;a href=&#34;https://debconf25.debconf.org/talks/99-integrating-knowledge-graphs-into-the-debian-ecosystem/&#34;&gt;Integrating Knowledge Graphs into the Debian
Ecosystem&lt;/a&gt;
(&lt;a href=&#34;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-634-integrating-knowledge-graphs-into-the-debian-ecosystem.av1.webm&#34;&gt;recording&lt;/a&gt;) which presented
a property graph showing relationships between various entities like packages,
maintainers or bugs (there is &lt;a href=&#34;https://github.com/alexander-belikov/deb-kg&#34;&gt;a
repository&lt;/a&gt; with parts of a paper,
but not much other information). The speaker also mentioned the &lt;a href=&#34;https://github.com/growgraph/graphcast&#34;&gt;graphcast
framework&lt;/a&gt; and the &lt;a href=&#34;https://github.com/growgraph/ontocast&#34;&gt;ontocast
framework&lt;/a&gt; which sound interesting - we
might have use for something liked this at $dayjob.&lt;/p&gt;
&lt;p&gt;In the afternoon there was &lt;a href=&#34;https://debconf25.debconf.org/talks/97-archwiki-a-biased-swot-analysis/&#34;&gt;a talk about the
ArchWiki&lt;/a&gt;
(&lt;a href=&#34;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-664-archwiki-a-biased-swot-analysis.av1.webm&#34;&gt;recording&lt;/a&gt;)
which gave a comprehensive insight in how the
&lt;a href=&#34;https://wiki.archlinux.org&#34;&gt;ArchWiki&lt;/a&gt; and the community behind it works. Right
after that was a Debian Wiki BoF. There are various technical limitations with
the current wiki software and there are not enough helping hands to maintain
the service and do content curation. But the BoF had some nice results: there
is now a new &lt;a href=&#34;https://lists.debian.org/debian-wiki/&#34;&gt;debian-wiki mailinglist&lt;/a&gt;,
an IRC channel, a MediaWiki installation has been set up during DebConf, there
are efforts to migrate the data and most importantly: and handful of people who
want to maintain the service and organize the content of the wiki. I think the
input from the ArchWiki folks gave some ideas how that team could operate.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/my-debconf-25-review/2_small.jpg&#34; alt=&#34;Tag at the wall at Dellec beach&#34;&gt;&lt;/p&gt;
&lt;p&gt;Wednesday was the day of the daytrip. I did not sign up for any of the trips
and used the time to &lt;a href=&#34;https://bisco.org/notes/my-first-tag2upload-upload/&#34;&gt;try out
tag2upload&lt;/a&gt;, &lt;a href=&#34;https://lists.debian.org/debian-devel-changes/2025/07/msg00720.html&#34;&gt;uploaded
the latest labwc release to
experimental&lt;/a&gt;
and spent the rest of the day at the beach.&lt;/p&gt;
&lt;p&gt;Other noteworthy session I&amp;rsquo;ve attended were the &lt;a href=&#34;https://debconf25.debconf.org/talks/31-dont-fear-the-tpm/&#34;&gt;Don&amp;rsquo;t fear the
TPM&lt;/a&gt; talk
(&lt;a href=&#34;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-671-dont-fear-the-tpm.av1.webm&#34;&gt;recording&lt;/a&gt;),
which showed me a lot of stuff to try out, the session about
&lt;a href=&#34;https://debconf25.debconf.org/talks/196-lintian-ng/&#34;&gt;lintian-ng&lt;/a&gt; (no
recording), which is an experimental approach to make lintian faster, the
&lt;a href=&#34;https://debconf25.debconf.org/talks/184-wcurl-one-year-later/&#34;&gt;review of the first year of wcurls
existence&lt;/a&gt; (no
recording yet) and the summary of &lt;a href=&#34;https://debconf25.debconf.org/talks/113-rust-packaging-in-debian/&#34;&gt;Rust packaging in
Debian&lt;/a&gt; (no
recording yet). In between the sessions I started working on packaging
wlr-sunclock
(&lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1109230&#34;&gt;#1109230&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&#34;what-did-not-work&#34;&gt;What did not work&lt;/h3&gt;
&lt;p&gt;Vegan food.&lt;/p&gt;
&lt;p&gt;I might be spoiled by other conferences. Both at EuroPycon last year (definitely
bigger, a lot more commercial) and at &lt;a href=&#34;https://blog.python.cz/pycon-cz-23-wrap-up-and-summary-how-did-we-do&#34;&gt;PyCon CZ
23&lt;/a&gt; (similar
in size, a lot more DIY) there was catering with explicitly vegan options.&lt;/p&gt;
&lt;p&gt;As I&amp;rsquo;ve mentioned in the beginning, we went to a supermarket before we went to
the conference and we had to go there one more time during the conference. I
think there was a mixture between a total lack of awareness and a LOT of
miscommunication. The breakfasts at the conference consisted of pastries and
baguettes - I asked at the first day what the vegan options were and the answer
was &amp;ldquo;I don&amp;rsquo;t know, &lt;strong&gt;maybe&lt;/strong&gt; the baguette?&amp;rdquo; and we were asked to only take as
much baguette as the people who also got pastries.&lt;/p&gt;
&lt;p&gt;The lunch was prepared by the &amp;ldquo;Restaurant associatif de Kernévent&amp;rdquo; which is
a canteen at the university campus. When we asked if there is vegan food, the
people there said that there was only a vegetarian option so we only ate salad.
Only later we heard via word of mouth that one has to explicitly ask for a
vegan meal which was apparently prepared separatly and you had to find the
right person that knows about it (I think thats very Debian-like 😉). But even
then a person once got a vegetarian option offered as vegan food.&lt;/p&gt;
&lt;p&gt;One problem was also the missing / confusing labeling of the food. At the
conference dinner there was apparently vegan food, but it was mixed with all
the other food. There were some labels but with hundreds of hungry people around
and caterers removing empty plates and dropping off plates with other stuff,
everything gets mixed up. In the end we ate bread soaked in olive oil, until the
olive oil got taken away by the catering people literally while we were dipping
the bread in it.&lt;/p&gt;
&lt;p&gt;And when these issues were raised, some of the reactions can be summarized as
&amp;ldquo;You&amp;rsquo;re holding it wrong&amp;rdquo; which was really frustrating.&lt;/p&gt;
&lt;p&gt;The dinners at the conference hall were similar. At some point I had the
impression that &amp;ldquo;vegan&amp;rdquo; and &amp;ldquo;vegetarian&amp;rdquo; was simply seen as the same thing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/my-debconf-25-review/3_small.jpg&#34; alt=&#34;Dinner menu at the conference&#34;&gt;&lt;/p&gt;
&lt;p&gt;If the menus would be written like a &lt;code&gt;debian/copyright&lt;/code&gt; file it would probably
have looked like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Food: *
Diet: Vegan or Vegetarian
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But the thing is that Vegan and Vegetarian cannot be mixed. Its similar to non
compatible licenses. Once you mix vegan food with vegan food with vegetarian
food it&amp;rsquo;s not vegan anymore.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t get me wrong, I know its hard to organize food for hundreds of people.
But if you don&amp;rsquo;t know what it means to provide a vegan option, just communicate
the fact so people can look alternatives in advance. During the week some of
the vegan people shared food, which was really nice and there were also a lot
of non-vegan people who tried to help, organized extra food or simply listened
to the hangry rants. Thanks for that!&lt;/p&gt;
&lt;h3 id=&#34;paris&#34;&gt;Paris&lt;/h3&gt;
&lt;p&gt;Saturday was the last day of DebConf and it was a rainy day. On Sunday morning
we took the TGV back to Paris and then stayed there for one night because the
next night train back to Vienna was on Monday. Luckily the weather was
better in Paris. The first thing we did was to look up a vegan burger place. In
the evening we strolled along the Seine and had a couple of beers at the
Jardins du Trocadéro. Monday the rain also arrived in Paris and we mostly went
from one cafe to the next, but also managed to visit Notre Dame.&lt;/p&gt;
&lt;h3 id=&#34;conclusio&#34;&gt;Conclusio&lt;/h3&gt;
&lt;p&gt;The next DebConf will be in Argentina and I think its likely that DebConf 27
will also not happen anywhere in trainvelling distance. But even if, I think
the Mini DebConfs are more my style of happening (there is one planned in
Hamburg next spring, and a couple of days ago I learned that there will be a
Back to the Future musical show in Hamburg during that time). Nonetheless I had
a nice time and I stumbled over some projects I might get more involved in.
Thanks also to my travel buddies who put up with me 😋&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My first tag2upload upload</title>
      <link>https://bisco.org/notes/my-first-tag2upload-upload/</link>
      <pubDate>Thu, 17 Jul 2025 09:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/my-first-tag2upload-upload/</guid>
      <description>&lt;p&gt;Following the DebConf25 talk by Ian Jackson &lt;a href=&#34;https://debconf25.debconf.org/talks/120-tag2upload-upload-simply-by-pushing-a-signed-git-tag/&#34;&gt;tag2upload - upload simply by
pushing a signed git
tag&lt;/a&gt;
I decided to use the quiet time during the day of the DayTrip on DebConf 25 to
try out uploading a package using
&lt;a href=&#34;https://wiki.debian.org/tag2upload&#34;&gt;tag2upload&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Given the current freeze a couple of the packages I maintainer have new
releases waiting. I decided on uploading the new version of labwc to
experimental. &lt;a href=&#34;https://labwc.github.io&#34;&gt;Labwc&lt;/a&gt; is a Wayland compositor based on
the wlroots compositor library (the library that &lt;a href=&#34;https://swaywm.org/&#34;&gt;sway&lt;/a&gt; is
using). Labwc is inspired by the &lt;a href=&#34;https://openbox.org&#34;&gt;Openbox window manager&lt;/a&gt;.
The upstream team of Labwc &lt;a href=&#34;https://github.com/labwc/labwc/releases/tag/0.9.0&#34;&gt;released version
0.9.0&lt;/a&gt; last week, the first
version that is based on wlroots 0.19.x. Wlroots 0.19.x is also only available
in experimental, so that was a good fit for trying an upload with tag2upload.&lt;/p&gt;
&lt;p&gt;I first used my usual workflow, going into my package repository, doing
&lt;code&gt;get fetch origin&lt;/code&gt;, checking out the tag of the new release and tagging that
with &lt;code&gt;git tag upstream/0.9.0&lt;/code&gt;. Then I bumped the version in the
&lt;code&gt;debian/experimental&lt;/code&gt; branch, adapted the &lt;code&gt;debian/control&lt;/code&gt; file for the changed
wlroots dependency, committed and built the package using &lt;code&gt;git-buildpackage&lt;/code&gt; to
check if it builds fine and there are no lintian errors.
Then I moved on to look at tag2upload.&lt;/p&gt;
&lt;p&gt;As a starting point for using tag2upload I read the blogpost by Jonathan Carter
&lt;a href=&#34;https://jonathancarter.org/2025/06/19/my-first-tag2upload-upload/&#34;&gt;My first tag2upload
upload&lt;/a&gt;. It
pointed me to one very important option of &lt;code&gt;git debpush&lt;/code&gt;, namely the
&lt;code&gt;--baredebian&lt;/code&gt; option which I have to use because I use the bare Debian git
layout. Given that the last upload of labwc I did was to unstable, I also had
to add the &lt;code&gt;--force=changed-suite&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I also started right away to use the &lt;code&gt;--tag-only&lt;/code&gt; option, because for my first
tests I only wanted to have local changes and nothing pushed to anywhere.
I also used the &lt;code&gt;--dry-run&lt;/code&gt; option. This led to the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; git debpush --baredebian --force=changed-suite --dry-run --tag-only
tags 0.9.0, upstream/0.9.0 all exist in this repository
tell me which one you want to make an orig.tar from: git deborig --just-print &#39;--version=0.9.0-1&#39; TAG
git-debpush: git-deborig failed; maybe try git-debpush --upstream=TAG
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This was a bit confusing, because the error message talked about &lt;code&gt;git-deborig&lt;/code&gt;,
but I was using &lt;code&gt;git-debpush&lt;/code&gt;. I also did &lt;strong&gt;not&lt;/strong&gt; want to make an orig.tar! The
&lt;a href=&#34;https://manpages.debian.org/experimental/git-debpush/git-debpush.1.en.html#upstream=&#34;&gt;&lt;code&gt;--upstream&lt;/code&gt; option in the &lt;code&gt;git-debpush(1)&lt;/code&gt;
manual&lt;/a&gt;
gave an explanation for this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When pushing a non-native package, git-debpush needs a tag for the
upstream part of your package.&lt;/p&gt;
&lt;p&gt;By default git-debpush asks git-deborig(1), which searches for a
suitable tag based on the upstream version in debian/changelog.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So apparently &lt;code&gt;git-debpush&lt;/code&gt; can not find out what the correct tag for the
upstream version is, because &lt;code&gt;git-deborig&lt;/code&gt; can not find out what the correct
tag for the upstream version is. &lt;code&gt;git-debpush&lt;/code&gt; simply &lt;a href=&#34;https://salsa.debian.org/dgit-team/dgit/-/blob/6392a3092f8251adde5a65ea807374553cfcfa29/git-debpush#L437&#34;&gt;calls &lt;code&gt;git deborig --just-print --version=&amp;quot;$version&amp;quot;&lt;/code&gt; in line 437&lt;/a&gt;.
This fails because I initially created a second &lt;code&gt;upstream/0.9.0&lt;/code&gt; to the existing
&lt;code&gt;0.9.0&lt;/code&gt; release tag. I do this for &lt;code&gt;git-buildpackage&lt;/code&gt; to find the upstream sources,
but with multiple tags &lt;code&gt;git-deborig&lt;/code&gt; is not sure which one is the tag it should
use (although both point to the same commit).&lt;/p&gt;
&lt;p&gt;So I removed the &lt;code&gt;upstream/0.9.0&lt;/code&gt; tag and ran &lt;code&gt;git debpush&lt;/code&gt; again and now there
was no error message (besides the warning regarding the changed suite) but it also
did not give an feedback about what is happening. So I tried without the &lt;code&gt;--dry-run&lt;/code&gt;
option. Again, no output whatsoever, other than the warning about the changed
release, &lt;strong&gt;BUT&lt;/strong&gt; my gnupg asked me for permission to sign via my yubikey! And
when I looked at the list of tags, I saw that there is now a &lt;code&gt;debian/0.9.0-1&lt;/code&gt;
tag that was not there before! Looking at the tag I saw that it was a tag in
the format described in the
&lt;a href=&#34;https://manpages.debian.org/experimental/git-debpush/tag2upload.5.en.html&#34;&gt;&lt;code&gt;tag2upload(5)&lt;/code&gt;&lt;/a&gt;
manual page, containing the following lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;labwc release 0.9.0-1 for experimental

[dgit distro=debian split --quilt=baredebian]
[dgit please-upload source=labwc version=0.9.0-1 upstream-tag=0.9.0 upstream=4beee3851f75b53afc2e8699c594c0cc222115bd]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and the tag was signed by me. The &lt;code&gt;4beee3851f75b53afc2e8699c594c0cc222115bd&lt;/code&gt; commit
ID is the commit the &lt;code&gt;0.9.0&lt;/code&gt; tag points to.&lt;/p&gt;
&lt;p&gt;Now that I had a signed commit tag in the correct format, I went to the &lt;a href=&#34;https://salsa.debian.org/labwc-team/labwc&#34;&gt;labwc
packaging repository on salsa&lt;/a&gt; and enabled
the webhook to trigger the tag2upload service (I just saw that &lt;a href=&#34;https://wiki.debian.org/tag2upload&#34;&gt;the
documentation&lt;/a&gt; was updated and there is now
a global webhook on salsa, so this step is not needed anymore).&lt;/p&gt;
&lt;p&gt;Finally I pushed the tags using &lt;code&gt;git push --tags&lt;/code&gt;. I could also have used
&lt;code&gt;git-debpush&lt;/code&gt; for this step, but I&amp;rsquo;d rather use git directly. I then looked at
the &lt;a href=&#34;https://tag2upload.debian.org/&#34;&gt;tag2upload queue&lt;/a&gt; and saw how a worker
built and uploaded the newest labwc release and I also got an email from the
tag2upload service &lt;code&gt;[tag2upload 275] uploaded labwc 0.9.0-1&lt;/code&gt;. And a couple of
minutes later I got the confirmation that labwc 0.9.0-1 was accepted into
experimental. Great!&lt;/p&gt;
&lt;p&gt;So, to conclude: for tag2upload to work we simply need a git tag in the correct
format. The tag2upload service now gets triggered by every pushed tag on salsa
but only acts on tags that adhere to the &lt;a href=&#34;https://manpages.debian.org/experimental/git-debpush/tag2upload.5.en.html&#34;&gt;&lt;code&gt;tag2upload(5)&lt;/code&gt;
format&lt;/a&gt;.
&lt;code&gt;git-debpush&lt;/code&gt; is a simply bash script that creates such a tag and by default also
pushes the tag.&lt;/p&gt;
&lt;p&gt;I think the script could be a bit more verbose, for example telling me that it
created a tag and the name of that tag. I think the dependency on &lt;code&gt;git-deborig&lt;/code&gt;
is also a problem. I use &lt;code&gt;git-buildpackage&lt;/code&gt; to build my packages and by default
&lt;em&gt;&lt;code&gt;git-buildpacakge&lt;/code&gt; assumes upstream tags are of the form upstream/%(version)s&lt;/em&gt;
(&lt;a href=&#34;https://wiki.debian.org/PackagingWithGit#Import_from_an_upstream_git_repository&#34;&gt;source&lt;/a&gt;).
I could now change that for all the packages I maintain, but I also think it
makes sense to control the tag myself and not use a tag that is controlled by
upstream. Upstream could change or delete that tag or I might need to create a
tag for a version that is not tagged by upstream.&lt;/p&gt;
&lt;p&gt;I also think &lt;code&gt;git-debpush&lt;/code&gt; is a rather mileading command name, given that the
main task of the script is to create a tag in the correct format.&lt;/p&gt;
&lt;p&gt;Other than that, I&amp;rsquo;m pretty happy about this service. I have a rather crappy
uplink at home and it is not so uncommon for my uploads to fail because the
connection dropped during &lt;code&gt;dput&lt;/code&gt;. Using a simple git based upload approach
makes these problems a thing of the past. I might look into other ways to
create the needed tag, though.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Debian on Framework 12</title>
      <link>https://bisco.org/notes/debian-on-framework-12/</link>
      <pubDate>Mon, 07 Jul 2025 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/debian-on-framework-12/</guid>
      <description>&lt;p&gt;For some time now I was looking for a device to replace my Thinkpad. Its a 14&amp;quot;
device, but thats to big for my taste. I am a big fan of small notebooks, so
when frame.work announced their 12&amp;quot; laptop, I took the chance and ordered one
right away.&lt;/p&gt;
&lt;p&gt;I was in one of the very early batches and got my package a couple of days ago.
When ordering, I chose the DIY edition, but in the end there was not that much
of DIY to do: I had to plug in the storage and the memory, put the keyboard in
and tighten some screws. There are very &lt;a href=&#34;https://guides.frame.work/c/Framework_Laptop_12&#34;&gt;detailed
instructions&lt;/a&gt; with a lot of
photos that tell you which part to put where, which is nice.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;1.jpg&#34; alt=&#34;Image of the Framework 12 laptop, assembled but powered off&#34;&gt;&lt;/p&gt;
&lt;p&gt;My first impressions of the device are good - it is heavier than I anticipated,
but very vell made. It is very easy to assemble and disassemble and it feels
like it can take a hit.&lt;/p&gt;
&lt;p&gt;When I started it the first time it took some minutes to boot because of the
new memory module, but then it told me right away that it could not detect an
operating system. As usual when I want to install a new system, I created
a &lt;a href=&#34;https://grml.org&#34;&gt;GRML&lt;/a&gt; live usb system and tried to boot from this
USB device. But the Framwork BIOS did not want to let me boot GRML, telling
me it is blocked by the current security policy. So I started to look in the
BIOS where I could find the SecureBoot configuration, but there was no such
setting anywhere. I then resorted to a Debian Live image, which was allowed
to boot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;2.jpg&#34; alt=&#34;Image of the screen of the Framework 12 laptop, saying it could not detect an operating system&#34;&gt;&lt;/p&gt;
&lt;p&gt;I only learned later, that the SecureBoot setting is in a separate section
that is not part of the main BIOS configuration dialog. There is an &amp;ldquo;Administer
Secure Boot&amp;rdquo; icon which you can choose when starting the device, but
&lt;a href=&#34;https://community.frame.work/t/responded-secure-boot-not-shown/31707&#34;&gt;apparently only &lt;em&gt;before&lt;/em&gt; you try to load an image that is not
allowed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I always use my &lt;a href=&#34;https://salsa.debian.org/birger/base-setup/-/blob/main/init.sh&#34;&gt;personal minimal install
script&lt;/a&gt; to
install my Debian systems, so it did not make that much of a difference to use
Debian Live instead of GRML. I only had to &lt;code&gt;apt install debootstrap&lt;/code&gt; before
running the script.&lt;/p&gt;
&lt;p&gt;I updated the install script to default to &lt;code&gt;trixie&lt;/code&gt; and to also install
&lt;code&gt;shim-signed&lt;/code&gt; and after successful installation booted into Debian 13 on the
Framwork 12. Everthing seems to work fine so far. WIFI works. For &lt;code&gt;sway&lt;/code&gt; to
start I had to install &lt;code&gt;firmware-intel-graphics&lt;/code&gt;. The touchscreen works without
me having to configure anything (though I don&amp;rsquo;t have frame.work stylus, as they
are not yet available), also changing the brightness of the screen worked right
away. The keyboard feels very nice, likewise the touchpad, which I configured
to allow tap-to-click using the &lt;code&gt;tap enabled&lt;/code&gt; option of
&lt;a href=&#34;https://manpages.debian.org/bookworm/sway/sway-input.5.en.html&#34;&gt;sway-input&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;3.jpg&#34; alt=&#34;Image of the a Framework 12 laptop, showing the default Sway background image&#34;&gt;&lt;/p&gt;
&lt;p&gt;One small downside of the keyboard is that it does not have a backlight, which
was a surprise. But given that this is a frame.work laptop, there are chances
that a future generation of the keyboard will have backlight support.&lt;/p&gt;
&lt;p&gt;The screen of the laptop can be turned all the way around to the back of the
laptops body, so it can be used as a tablet. In this mode the keyboard gets
disabled to prevent accidently pushing keys when using the device in tablet
mode.&lt;/p&gt;
&lt;p&gt;For online meetings I still prefer using headphones with cables over bluetooth
once, so I&amp;rsquo;m glad that the laptop has a headphone jack on the side.&lt;/p&gt;
&lt;p&gt;Above the screen there are a camera and a microphone, which both have separate
physical switches to disable them.&lt;/p&gt;
&lt;p&gt;I ordered a couple of expansion cards, in the current setup I use two USB-C,
one HDMI and one USB-A. I also ordered a 1TB expansion card and only used this
to transfer my &lt;code&gt;/home&lt;/code&gt;, but I soon realized that the card got rather hot, so I
probably won&amp;rsquo;t use it as a permanent expansion.&lt;/p&gt;
&lt;p&gt;I can not yet say a lot about how long the battery lasts, but I will bring
the laptop to DebConf 25, I guess there I&amp;rsquo;ll find out. There I might also
have a chance to test if the screen is bright enough to be usable outdoors ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Another round of rust</title>
      <link>https://bisco.org/notes/another-round-of-rust/</link>
      <pubDate>Fri, 11 Aug 2023 09:52:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/another-round-of-rust/</guid>
      <description>&lt;p&gt;A couple of weeks ago I had to undergo surgery, because one of my kidneys
malfunctioned. Everything went well and I&amp;rsquo;m on my way to recovery. Luckily the
most recent local heat wave was over just shortly after I got home, which made
being stuck at home a little easier (not sure yet when I&amp;rsquo;ll be allowed to do
sports again, I miss my climbing gym&amp;hellip;).&lt;/p&gt;
&lt;p&gt;At first I did not have that much energy to do computer stuff, but after a week
or so I was able to sit in front of the screen for short amounts of time and I
started to get into writing Rust code again.&lt;/p&gt;
&lt;h1 id=&#34;carl&#34;&gt;carl&lt;/h1&gt;
&lt;p&gt;The first thing I did was updating &lt;a href=&#34;http://carl.cli.rs/&#34;&gt;carl&lt;/a&gt;. I updated all
the dependencies and switched the dependency that does coloring from
&lt;code&gt;ansi_term&lt;/code&gt;, which is
&lt;a href=&#34;https://rustsec.org/advisories/RUSTSEC-2021-0139.html&#34;&gt;unmaintained&lt;/a&gt;, to
&lt;a href=&#34;https://crates.io/crates/nu-ansi-term&#34;&gt;nu-ansi-term&lt;/a&gt;. When I then updated the
&lt;a href=&#34;https://crates.io/crates/clap&#34;&gt;clap&lt;/a&gt; dependency to version 4 I realized that
clap now depends on the &lt;a href=&#34;https://crates.io/crates/anstyle&#34;&gt;anstyle&lt;/a&gt; crate for
text styling - so I updated &lt;code&gt;carl&lt;/code&gt;s coloring code once again so it now uses
&lt;code&gt;anstyle&lt;/code&gt;, which led to less dependencies overall. Implementing this change I
also did some refactoring of the code.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;carl&lt;/code&gt; how also has &lt;a href=&#34;http://carl.cli.rs/&#34;&gt;its own website&lt;/a&gt; as well as a
subdomain&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;I also added a couple of new date properties to &lt;code&gt;carl&lt;/code&gt;, namely all weekdays as
well as &lt;code&gt;odd&lt;/code&gt; and &lt;code&gt;even&lt;/code&gt; - this means it is now possible choose a separate color
for every weekday and have a rainbow calendar:&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/another-round-of-rust/screenshot-rainbow.png&#34; alt=&#34;screenshot carl&#34;&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is included in version 0.1.0 of carl, which I &lt;a href=&#34;https://crates.io/crates/carl&#34;&gt;published on
crates.io&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;typelerate&#34;&gt;typelerate&lt;/h1&gt;
&lt;p&gt;Then I started writing my first game -
&lt;a href=&#34;https://github.com/b1rger/typelerate&#34;&gt;typelerate&lt;/a&gt;. It is a copy of the great
&lt;a href=&#34;https://typespeed.sourceforge.net/&#34;&gt;typespeed&lt;/a&gt;, without the multiplayer
support.&lt;/p&gt;
&lt;p&gt;To describe the idea behind the game, I quote the &lt;a href=&#34;https://typespeed.sourceforge.net&#34;&gt;typespeed&lt;/a&gt; website:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Typespeed&amp;rsquo;s idea is ripped from ztspeed (a DOS game made by Zorlim). The
Idea behind the game is rather easy: type words that are flying by from left
to right as fast as you can. If you miss 10 or more words, game is over.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Instead of the multiplayer support, &lt;code&gt;typelerate&lt;/code&gt; works with UTF-8 strings &lt;em&gt;and&lt;/em&gt;
it also has another game mode: in &lt;code&gt;typespeed&lt;/code&gt; you only type whats scrolling
via the screen. In &lt;code&gt;typelerate&lt;/code&gt; I added the option to have one or more
&lt;em&gt;answer&lt;/em&gt; strings. One of those has to be typed &lt;em&gt;instead&lt;/em&gt; of the word flying
across the screen. This lets you implement kind of an question/answer game. To
be backwards compatible with the existing wordfiles from &lt;code&gt;typespeed&lt;/code&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, the
wordfiles for the question/answer games contain comma separated values. The
&lt;a href=&#34;https://github.com/b1rger/typelerate&#34;&gt;typelerate repository&lt;/a&gt; contains
wordfiles with Python and Rust keywords as well as wordfiles where you are
shown an Emoji and you have to type the corresponding Github shortcode. I&amp;rsquo;m
happy to add additional wordfiles (there could be for example math
questions&amp;hellip;).&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/another-round-of-rust/screenshot-typelerate.png&#34; alt=&#34;screenshot typelerate&#34;&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&#34;marsrover&#34;&gt;marsrover&lt;/h1&gt;
&lt;p&gt;Another commandline game I really like, because I am fascinated by the animated
ASCII graphics, is the venerable
&lt;a href=&#34;https://www.seehuhn.de/pages/moon-buggy&#34;&gt;moon-buggy&lt;/a&gt;. In this game you have to
drive a vehicle across the moon&amp;rsquo;s surface and deal with obstacles like craters or
aliens.&lt;/p&gt;
&lt;p&gt;I reimplemented the game in rust and called it &lt;code&gt;marsrover&lt;/code&gt;:&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/another-round-of-rust/screenshot-marsrover.png&#34; alt=&#34;screenshot marsrover&#34;&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I &lt;a href=&#34;https://crates.io/crates/marsrover&#34;&gt;published it on crates.io&lt;/a&gt;, you can find
the &lt;a href=&#34;https://github.com/b1rger/marsrover&#34;&gt;repository on github&lt;/a&gt;. The game uses
a configuration file in &lt;code&gt;$XDG_CONFIG_HOME/marsrover/config.toml&lt;/code&gt; - you can
configure the colors of the elements as well as the levels. The game comes with
&lt;a href=&#34;https://github.com/b1rger/marsrover/blob/f80299bb23d1e40c8b7a871d76d8a9490628c04f/src/config.rs#L76&#34;&gt;four levels
predefined&lt;/a&gt;,
but you can use the configuration file to override that list of levels with
levels with your own properties. The level properties define the probabilities
of obstacles occuring on your way on the mars surface and a points setting that
defines how many points the user can get in that level (=the game switches to
the next level if the user reaches the points).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[levels]]
prob_ditch_one = 0.2
prob_ditch_two = 0.0
prob_ditch_three = 0.0
prob_alien = 0.5
points = 100
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After the last level, the game generates new ones on the fly.&lt;/p&gt;
&lt;section class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;thanks to the service from &lt;a href=&#34;https://cli.rs&#34;&gt;https://cli.rs&lt;/a&gt;. &lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;actually, &lt;code&gt;typelerate&lt;/code&gt; is not backwards compatible with the &lt;code&gt;typespeed&lt;/code&gt;
wordfiles, because those are not UTF-8 encoded &lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
    </item>
    
    <item>
      <title>Introducing carl</title>
      <link>https://bisco.org/notes/introducing-carl/</link>
      <pubDate>Mon, 03 Jan 2022 09:52:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/introducing-carl/</guid>
      <description>&lt;p&gt;For some time now I wanted to learn &lt;a href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;, but I
either didn&amp;rsquo;t have the time or couldn&amp;rsquo;t come up with a nice beginner project.
Given that I recently found myself to be without a job and we had another
lockdown in the part of the world I happen to live in, I decided to give that
idea another go (no pun intended).&lt;/p&gt;
&lt;p&gt;There is apparently a trend to reimplement existing Unix tools in Rust (see
&lt;a href=&#34;https://the.exa.website/&#34;&gt;exa&lt;/a&gt;, a &amp;lsquo;modern replacement for ls&amp;rsquo;,
&lt;a href=&#34;https://github.com/dandavison/delta&#34;&gt;delta&lt;/a&gt;, a syntax highlighting pager for
git, diff and grep output, &lt;a href=&#34;https://github.com/sharkdp/bat&#34;&gt;bat&lt;/a&gt;, a &amp;lsquo;cat clone
with wings&amp;rsquo;, &lt;a href=&#34;https://zellij.dev/&#34;&gt;zellij&lt;/a&gt;, a terminal workspace,
&lt;a href=&#34;https://github.com/BurntSushi/ripgrep&#34;&gt;ripgrep&lt;/a&gt;, a line-oriented search tool
&amp;hellip;). I looked around what else was out there, but what I wasn&amp;rsquo;t able to find
was an implementation of &lt;code&gt;cal(1)&lt;/code&gt; in Rust (maybe I wasn&amp;rsquo;t looking hard enough,
feel free to point anything out to me I might have overlooked).
No &lt;code&gt;cal&lt;/code&gt; in Rust even though a calendar implementation would provide the
potential to go over the top with terminal colors, which is also very important
when writing reimplementations of older CLI tools! So I started writing and
soon had a simple prototype of a &lt;code&gt;cal&lt;/code&gt; reimplementation. A couple of weeks
later I can now present &lt;a href=&#34;https://codeberg.org/birger/carl&#34;&gt;&lt;code&gt;carl&lt;/code&gt;&lt;/a&gt;, a &lt;code&gt;cal&lt;/code&gt;
implementation in Rust:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/introducing-carl/screenshot-default.png&#34; alt=&#34;default carl output&#34;&gt;&lt;/p&gt;
&lt;p&gt;The default output of &lt;code&gt;carl&lt;/code&gt; is what you would expect from a commandline
calendar tool. It prints the days of the current month and highlights the
current day. Other than the &lt;code&gt;cal&lt;/code&gt; tools I tried, &lt;code&gt;carl&lt;/code&gt; by default also prints
days that are in the past in grey. Like &lt;code&gt;cal&lt;/code&gt; it can also print three month if
you use the &lt;code&gt;-3&lt;/code&gt; switch or the whole year if you use the &lt;code&gt;-y&lt;/code&gt; switch.&lt;/p&gt;
&lt;h3 id=&#34;colors&#34;&gt;Colors&lt;/h3&gt;
&lt;p&gt;You can use a theme file to change the colors &lt;code&gt;carl&lt;/code&gt; uses for various
dates. The name of the theme is set in &lt;code&gt;carl&lt;/code&gt;s configuration file (in
&lt;code&gt;XDG_CONFIG_HOME/.carl/config.toml&lt;/code&gt; or system-wide in
&lt;code&gt;XDG_CONFIG_DIRS/.carl/config.toml&lt;/code&gt;) using the &lt;code&gt;theme&lt;/code&gt; setting - carl looks for
the theme in the file &lt;code&gt;${themename}.theme&lt;/code&gt; in the configuration folders. A
custom theme could for example look like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/introducing-carl/screenshot-custom.png&#34; alt=&#34;custom carl output&#34;&gt;&lt;/p&gt;
&lt;p&gt;You can change the foreground color, background color and/or style of a date
using a combination of various stylenames like &lt;code&gt;BGRed&lt;/code&gt;, &lt;code&gt;Bold&lt;/code&gt; and &lt;code&gt;FGCyan&lt;/code&gt;.
The &lt;a href=&#34;https://codeberg.org/birger/carl/src/branch/main/README.md&#34;&gt;README&lt;/a&gt; lists
all possible stylenames. A list of &lt;em&gt;date properties&lt;/em&gt; defines which dates the
specific style should affect- date properties are for example &lt;code&gt;CurrentDate&lt;/code&gt;,
&lt;code&gt;AfterCurrentDate&lt;/code&gt; or &lt;code&gt;FirstDayOfMonth&lt;/code&gt;. Again, the
&lt;a href=&#34;https://codeberg.org/birger/carl/src/branch/main/README.md&#34;&gt;README&lt;/a&gt; lists the
existing date properties and I&amp;rsquo;m happy to implement more of them, if you have
ideas.&lt;/p&gt;
&lt;h3 id=&#34;ical-support&#34;&gt;Ical support&lt;/h3&gt;
&lt;p&gt;I also added the option to list &lt;code&gt;.ical&lt;/code&gt; files in the configuration file. &lt;code&gt;carl&lt;/code&gt;
can display the dates from the ical file(s) with a separate style. There can
either be a global style for all the dates from all the ical files by using the
&lt;code&gt;IsEvent&lt;/code&gt; date property or a separate style for the dates of a specific
&lt;code&gt;*.ical&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/introducing-carl/screenshot-ical.png&#34; alt=&#34;carl output with ical files&#34;&gt;&lt;/p&gt;
&lt;p&gt;Using the &lt;code&gt;--agenda&lt;/code&gt; commandline switch &lt;code&gt;carl&lt;/code&gt; also shows an agenda of dates
from the &lt;code&gt;ical&lt;/code&gt; files.&lt;/p&gt;
&lt;h3 id=&#34;installation&#34;&gt;Installation&lt;/h3&gt;
&lt;p&gt;I have &lt;a href=&#34;https://crates.io/crates/carl&#34;&gt;uploaded carl to crates.io&lt;/a&gt;, so you can
install carl using cargo: &lt;code&gt;cargo install carl&lt;/code&gt;. I also plan to upload it to
Debian at some point. If you find bugs or have feature requests, please don&amp;rsquo;t
hesitate to &lt;a href=&#34;https://codeberg.org/birger/carl/issues&#34;&gt;create issues&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>An Analysis of 5 Million OpenPGP Keys</title>
      <link>https://bisco.org/notes/an-analysis-of-5-million-openpgp-keys/</link>
      <pubDate>Fri, 23 Oct 2020 19:54:51 +0200</pubDate>
      
      <guid>https://bisco.org/notes/an-analysis-of-5-million-openpgp-keys/</guid>
      <description>&lt;p&gt;In July I finished my Bachelor&amp;rsquo;s Degree in IT Security at the University of
Applied Sciences in St. Poelten. During the studies I did some elective
courses, one of which was about Data Analysis using Python, Pandas and Jupyter
Notebooks. I found it very interesting to do calculations on different data
sets and to visualize them. Towards the end of the Bachelor I had to find a
topic for my Bachelor Thesis and as a long time user of OpenPGP I thought it
would be interesting to do an analysis of the collection of OpenPGP keys that
are available on the keyservers of the SKS keyserver network.&lt;/p&gt;
&lt;p&gt;So in June 2019 I fetched a copy of one of the key dumps of the one of the
keyservers (some keyserver publish these copies of their key database so people
who want to join the SKS keyserver network can do an initial import). At that
time the copy of the key database contained 5,499,675 keys and was around 12GB.
Using the &lt;a href=&#34;https://github.com/hockeypuck/hockeypuck&#34;&gt;hockeypuck keyserver
software&lt;/a&gt; I &lt;a href=&#34;https://hockeypuck.io/populating.html&#34;&gt;imported the
keys&lt;/a&gt; into an PostgreSQL database.
Hockeypuck uses a table called &lt;code&gt;keys&lt;/code&gt; to store the keys and in there the column
&lt;code&gt;doc&lt;/code&gt; stores the OpenPGP keys in JSON format (always with a data field
containing the original unparsed data).&lt;/p&gt;
&lt;p&gt;For the thesis I split the analysis in three parts, first looking at the Public
Key packets, then analysing the User ID packets and finally studying the
Signature Packets. To analyse the respective packets I used SQL to export the
data to CSV files and then used the pandas &lt;a href=&#34;https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html&#34;&gt;read_csv
method&lt;/a&gt;
to create a dataframe of the values. In a couple of cases I did some parsing
before converting to a DataFrame to make the analysis step faster. The parsing
was done using the &lt;a href=&#34;https://github.com/toofishes/python-pgpdump&#34;&gt;pgpdump python
library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Together with my advisor I decided to submit the thesis for a journal, so we
revised and compressed the whole paper and the outcome was now&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
&lt;a href=&#34;http://isyou.info/jowua/papers/jowua-v11n3-6.pdf&#34; style=&#34;border: 1px solid black; padding: .5em; background: pink;&#34;&gt;PUBLISHED&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;in the Journal of
Wireless Mobile Networks, Ubiquitous Computing, and Dependable Applications
(&lt;a href=&#34;http://jowua.com/&#34;&gt;JoWUA&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I think the work gives some valuable insight in the development of the use of
OpenPGP in the last 30 years. Looking at the public key packets we were able to
compare the different public key algorithms and for example visualize how DSA
was the most used algorithm until around 2010 when it was replaced by RSA.
When looking at the less used algorithms a trend towards ECC based crytography is
visible.&lt;/p&gt;
&lt;p&gt;What we also noticed was an increase of RSA keys with algorithm ID 3 (RSA Sign-Only),
which &lt;a href=&#34;https://tools.ietf.org/html/rfc4880#section-13.5&#34;&gt;are deprecated&lt;/a&gt;. When
we took a deeper look at those keys we realized that most of those keys used a
specific User ID string in the User ID packets which allowed us to attribute
those keys to two software projects both using the &lt;a href=&#34;http://www.bouncycastle.org/java.html&#34;&gt;Bouncy Castle Java
Cryptographic API&lt;/a&gt; (resp. the Spongy
Castle version for Android). We also stumbled over a tutorial on &lt;a href=&#34;https://bouncycastle-pgp-cookbook.blogspot.com/2013/01/generating-rsa-keys.html&#34;&gt;how to create
RSA keys with
Bouncycastle&lt;/a&gt;
which also describes how to create RSA keys with code that produces RSA
Sign-Only keys. In one of those projects, this &lt;a href=&#34;https://github.com/guardianproject/proofmode/issues/65&#34;&gt;was then
fixed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By looking at the User ID packets we did some statistics about the most used
email providers used by OpenPGP users. One domain stood out, because it is not
the domain of an email provider: &lt;code&gt;tellfinder.com&lt;/code&gt; is a domain used in around
45,000 keys. &lt;a href=&#34;https://uncharted.software/product/tellfinder/&#34;&gt;Tellfinder&lt;/a&gt; is a
Big Data analysis software and the UID of all but two of those keys is
&lt;code&gt;TellFinder Page Archiver- Signing Key &amp;lt;support@tellfinder.com&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We also looked at the comments used in OpenPGP User ID fields. In 2013 Daniel
Kahn Gillmor published a blog post titled &lt;a href=&#34;https://debian-administration.org/users/dkg/weblog/97&#34;&gt;OpenPGP User ID Comments considered
harmful&lt;/a&gt; in which he
pointed out that most of the comments in the User ID field of OpenPGP keys are
duplicating information that is already present somewhere in the User ID or the
key itself. In our dataset 3,133 comments were exactly the same as the name,
3,346 were the same as the domain and 18,246 comments were similar to the local
part of the email address&lt;/p&gt;
&lt;p&gt;Last but not least we looked at the signature subpackets and the development of
some of the preferences (&lt;a href=&#34;https://tools.ietf.org/html/rfc4880#section-5.2.3.7&#34;&gt;Preferred Symmetric
Algorithm&lt;/a&gt;, &lt;a href=&#34;https://tools.ietf.org/html/rfc4880#section-5.2.3.8&#34;&gt;Preferred
Hash Algorithm&lt;/a&gt;) that are
being published using signature packets.&lt;/p&gt;
&lt;p&gt;Analysing this huge dataset of cryptographic keys of the last 20 to 30 years
was very interesting and I learned a lot about the history of PGP resp.
OpenPGP and the evolution of cryptography overall. I think it
would be interesting to look at even more properties of OpenPGP keys and I also
think it would be valuable for the OpenPGP ecosystem if these kinds analysis
could be done regularly. An approach like &lt;a href=&#34;https://metrics.torproject.org&#34;&gt;Tor
Metrics&lt;/a&gt; could lead to interesting findings and
could also help to back decisions regarding future developments of the OpenPGP
standard.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fosdem 2020</title>
      <link>https://bisco.org/notes/fosdem-2020/</link>
      <pubDate>Tue, 04 Feb 2020 22:02:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/fosdem-2020/</guid>
      <description>&lt;p&gt;Today I returned from Brussels, where I attended &lt;a href=&#34;https://fosdem.org&#34;&gt;FOSDEM&lt;/a&gt;.
It was my first time in Brussels and it was my first FOSDEM.&lt;/p&gt;
&lt;p&gt;The days before FOSDEM, from Wednesday to Friday, there was a
&lt;a href=&#34;https://wiki.debian.org/DebianEvents/be/2020/MiniDebCamp&#34;&gt;MiniDebCamp&lt;/a&gt; in the
local &lt;a href=&#34;https://hsbxl.be/contact/&#34;&gt;Hackerspace&lt;/a&gt;. The Hackerspace is located at
Studio CityGate, a collective space which was apparently an old factory for
textile and medical equipment and can now be used by cultural projects (though
I think its only temporary). There is a Bar at the ground floor, a recording
studio in the basement, a skate park and a climbing wall and much more. The
building and the yard reminded me a bit of the collective art space Fux, where
the Hamburg MiniDebConfs 2018 and 2019 were located.&lt;/p&gt;
&lt;p&gt;I only visited DebCamp on Friday and did a bit of work on the &lt;a href=&#34;https://timeline.debian.net&#34;&gt;debian
timeline&lt;/a&gt; (researched dates/events to be added)
and on sway related packages.&lt;/p&gt;
&lt;p&gt;The two days of FOSDEM were very interesting, although draining. There were
talks and discussions all the time in multiple rooms of every size. On
Saturday I found the policy debates in the &lt;a href=&#34;https://fosdem.org/2020/schedule/track/legal_and_policy_issues/&#34;&gt;Legal and Policy Issues
devroom&lt;/a&gt; to be
very interesting and entertaining. The culture of debate competition is
something I didn&amp;rsquo;t know at all before (besides from movies) and it was a
fascinating experience to see people so eloquently defend views they actually
don&amp;rsquo;t really hold. There were also some points raised about ethical licensed
that gave me a lot to think about.&lt;/p&gt;
&lt;p&gt;On Sunday I started the day by watching a short introduction to &lt;a href=&#34;https://salsa.debian.org/mejo/cryptsetup-suspend&#34;&gt;hard disk
encryption in Linux suspend mode with
cryptsetup-suspend&lt;/a&gt; which I&amp;rsquo;m
looking forward to try out (though I&amp;rsquo;ll need support for suspend to RAM on the
Pinebook first).
Later that day I watched a couple of talks in the &lt;a href=&#34;https://fosdem.org/2020/schedule/track/community_devroom/&#34;&gt;Community
devroom&lt;/a&gt;. There was
a great talk about &lt;a href=&#34;https://fosdem.org/2020/schedule/event/capitalismethicaloss/&#34;&gt;Building Ethical Software Under
Capitalism&lt;/a&gt; by
Deb Nicholson from &lt;a href=&#34;https://sfconservancy.org/&#34;&gt;Software Freedom Conservancy&lt;/a&gt;
and Megan Sanicki from Google gave a talk about &lt;a href=&#34;https://fosdem.org/2020/schedule/event/leadeross/&#34;&gt;Leadership in Open
Source&lt;/a&gt; (&amp;ldquo;Every contributor
is a leader&amp;rdquo;).
The last talk of the day I watched was &lt;a href=&#34;https://fosdem.org/2020/schedule/event/dip_decentralize_fediverse/&#34;&gt;Who will Decentralise the
Fediverse?&lt;/a&gt;
about Mastodon et al and the challenges of decentralization in federated
networks.&lt;/p&gt;
&lt;p&gt;I actually planned to do some tests of the Pinebook Pro during FOSDEM, but in
the end I only opened the notebook once a day for a short time. I even forgot
to stop by at the Pine64 stand.&lt;/p&gt;
&lt;p&gt;All in all, it were interesting days. Apart from the talks I met some new
people, some old friends and had inspiring discussions. What I&amp;rsquo;ll definitely
skip next time is the Beer Event, that&amp;rsquo;s not my kind of evening activity but
I&amp;rsquo;ll plan to spend more time at the DebCamp (if it &lt;a href=&#34;https://lists.debian.org/debian-project/2020/01/msg00041.html&#34;&gt;happens
again&lt;/a&gt;).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Installing Debian on the Pinebook Pro</title>
      <link>https://bisco.org/notes/installing-debian-on-the-pinebook-pro/</link>
      <pubDate>Sun, 26 Jan 2020 18:30:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/installing-debian-on-the-pinebook-pro/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mastodon.technology/@brion/103495587657662243&#34;&gt;@brion on mastodon&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you want the Linux-circa-2004 experience back, just try Linux on ARM!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;everything compiles slowly&lt;/li&gt;
&lt;li&gt;distro-hopping to find better hardware support&lt;/li&gt;
&lt;li&gt;oops, you need proprietary drivers for that&lt;/li&gt;
&lt;li&gt;forum posts hold the authoritative documentation &lt;em&gt;and&lt;/em&gt; code for your distro&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:D&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In November last year, I ordered a &lt;a href=&#34;https://wiki.pine64.org/index.php/Pinebook_Pro&#34;&gt;Pinebook
Pro&lt;/a&gt; from
&lt;a href=&#34;https://www.pine64.org/&#34;&gt;Pine64&lt;/a&gt;. The Pinebook Pro is a 14&amp;quot; (1080p) ARM laptop
based on a RK3399 SOC. It has an eMMC built in and it is possible to add an
NVMe SSD drive using an adapter. In addition it also has a micro SD card reader
and can boot from that. The notebook is very lightweight and the case seems
solid. The bottom cover is attached using normal Philips head screws and there
is a lot of detailed documentation in the wiki about the parts of the board and
how to access the internals.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not really a fan of the keyboard, because in my opinion it feels a bit
cheap - pressing the keys does not feel as smooth as I&amp;rsquo;m used to from other
keyboards, like from the Thinkpad x230 or the 2012 MacBook Air.  In addition to
that I made the mistake of choosing an ANSI keyboard, which makes it harder for
me to reach the &lt;code&gt;Enter&lt;/code&gt; key. The big advantage of the device is definitely the
battery. In the first week of playing around with the device (not using it that
much, but doing a lot of tests with booting different images) I didn&amp;rsquo;t even
unpack the power supply. Another nice feature are the &lt;em&gt;privacy switches&lt;/em&gt; - when
you press F1, F2 or F3 for 10 seconds you cut the power for the BT/WiFI module
(F1), the webcam (F2) or the microphone (F3). At least that&amp;rsquo;s the theory, it
does not work with my Pinebook, but there is a firmware update for the keyboard
that I did not yet install, which might fix that.&lt;/p&gt;
&lt;p&gt;I also really like how the Pinebook Pro creators keep you up to date with news
regarding their products and related software. They publish monthly updates
about updates in &lt;a href=&#34;https://www.pine64.org/blog/&#34;&gt;their blog&lt;/a&gt;, they also try
to take part in the discussions in the &lt;a href=&#34;https://forum.pine64.org&#34;&gt;pine64
forum&lt;/a&gt; and they have a &lt;a href=&#34;https://fosstodon.org/@PINE64&#34;&gt;presence on the
fediverse&lt;/a&gt; (there are more communication
channels, but those are the ones I follow/used).&lt;/p&gt;
&lt;p&gt;There are a couple of different pre built &lt;a href=&#34;https://wiki.pine64.org/index.php/PinebookPro_Software_Release&#34;&gt;operating system
images&lt;/a&gt; one can
&lt;code&gt;dd&lt;/code&gt; to SD cards or the eMMC and there are also some scripts to &lt;em&gt;install&lt;/em&gt;
(instead of &lt;code&gt;dd&lt;/code&gt;ing) systems. The laptop comes preinstalled with what is
usually (in the forums and the wiki) called &lt;em&gt;Debian Desktop&lt;/em&gt;. It is a Debian
based image with a Mate Desktop and a lot of modifications. The images for this
system are distributed via a &lt;a href=&#34;https://github.com/mrfixit2001/debian_desktop/&#34;&gt;github
repository&lt;/a&gt;. I did not find any
source code for the images nor documentation about the changes from upstream
Debian, so I have no idea how they are built (the archives behind the &lt;em&gt;Source
code&lt;/em&gt; links on the release page of the images only contain the README.md file).
I only started the preinstalled system once or twice, but it seemed to work
very well (suspend worked) and it ships a lot of useful software for end users.
But I did not take a deeper look at this image. There
are also two Ubuntu based images listed in the Pine64 wiki, one of which comes
with LXDE as desktop system, the other one with the Mate Desktop. They are also
distributed via github release pages, but in these cases the &lt;a href=&#34;https://github.com/ayufan-rock64/linux-build/&#34;&gt;repository also
contains the code of the build
scripts&lt;/a&gt;. Manjaro, an Arch Linux
based distribution, also provides images for the Pinebook Pro. Besides those
there are Armbian images, Android images, Chromium images and some more.&lt;/p&gt;
&lt;p&gt;I did not really want to use any of the provided images, but rather install my
own Debian system. There is an &lt;a href=&#34;https://github.com/daniel-thompson/pinebook-pro-debian-installer/&#34;&gt;installer
script&lt;/a&gt;
which installs Debian on a SD card or the eMMC using debootstrap. This script
does a lot of useful stuff, and a good part of my approach of installing Debian
is based on it.&lt;/p&gt;
&lt;p&gt;I installed Debian on an SD card using my older HP laptop. There are two
main parts one needs that are not part of Debian yet, a heavily patched kernel
on the one hand and the u-boot bootloader, also with some patches.  There is &lt;a href=&#34;https://eno.space/blog/2020/01/pbp-uboot&#34;&gt;a
great tutorial&lt;/a&gt; on how to build an
(almost) upstream u-boot for the Pinebook. This is based on &lt;a href=&#34;https://git.eno.space/pbp-uboot.git&#34;&gt;this git
repository&lt;/a&gt; which contains the u-boot
upstream sources modified to work on the Pinebook and with some changes to the
boot order. The main path is &lt;a href=&#34;https://lists.denx.de/pipermail/u-boot/2019-November/390246.html&#34;&gt;this
one&lt;/a&gt; which
was posted to the u-boot mailinglist in November, but I&amp;rsquo;m not sure whats the
status of it. Lets hope it will be merged upstream for the next release of
u-boot.&lt;/p&gt;
&lt;p&gt;For the kernel there is &lt;a href=&#34;https://gitlab.manjaro.org/tsys/linux-pinebook-pro&#34;&gt;a repository in the manjaor
gitlab&lt;/a&gt; and the maintainer
of this kernel repository announced that they &lt;a href=&#34;https://forum.pine64.org/showthread.php?tid=8207&#34;&gt;plan on mainlining the
patches&lt;/a&gt;. The only thing not
working yet is suspend to RAM. I&amp;rsquo;m currently using the
&lt;code&gt;v5.5-rc7-panfrost-fixes&lt;/code&gt; branch of the kernel.&lt;/p&gt;
&lt;p&gt;To crossbuild the kernel, I had to first prepare my build machine (which is AMD64):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;apt install crossbuild-essential-arm64 flex bison fakeroot build-essential bc libssl-dev&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;then I cloned the repository and copied the configuration the Manjaro kernel is
using from &lt;a href=&#34;https://gitlab.manjaro.org/manjaro-arm/packages/core/linux-pinebookpro&#34;&gt;their kernel package
repository&lt;/a&gt;.
I also had to disable compression of kernel modules.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;git clone https://gitlab.manjaro.org/tsys/linux-pinebook-pro
&lt;span style=&#34;color:#366&#34;&gt;cd&lt;/span&gt; linux-pinebook-pro
wget https://gitlab.manjaro.org/manjaro-arm/packages/core/linux-pinebookpro/raw/master/config -O .config
scripts/config --set-str LOCALVERSION -custom
scripts/config --disable MODULE_COMPRESS
make -j&lt;span style=&#34;color:#c30&#34;&gt;`&lt;/span&gt;nproc&lt;span style=&#34;color:#c30&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;ARCH&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;arm64 &lt;span style=&#34;color:#033&#34;&gt;CROSS_COMPILE&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;aarch64-linux-gnu- &lt;span style=&#34;color:#033&#34;&gt;KBUILD_IMAGE&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;arch/arm64/boot/Image deb-pkg&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The developer who maintains the kernel also published a &lt;a href=&#34;https://gitlab.manjaro.org/tsys/pinebook-firmware&#34;&gt;repository with
firmware for the Broadcom Wifi module and the
DisplayPort&lt;/a&gt;. Another
&lt;a href=&#34;https://gitlab.manjaro.org/manjaro-arm/packages/community/ap6256-firmware&#34;&gt;manjaro repository contains the firmware for the bluetooth
chip&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next step was to bootstrap Debian. First I installed the packages to bootstrap
a system with another architecture and then I prepared the SD card:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;apt install qemu-user-static binfmt-support
sfdisk /dev/sdc &amp;lt; gpt.sfdisk
mkfs.ext4 /dev/sdc1
cryptsetup luksFormat /dev/sdc2
cryptsetup luksOpen /dev/sdc2 sdc2_crypt
mkfs.ext4 /dev/mapper/sdc2_crypt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;gpt.sfdisk&lt;/code&gt; containing the following partition layout:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;label: gpt
unit: sectors

/dev/sdc1 : &lt;span style=&#34;color:#033&#34;&gt;start&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;      442368, &lt;span style=&#34;color:#033&#34;&gt;size&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;     1024000, &lt;span style=&#34;color:#033&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;0FC63DAF-8483-4772-8E79-3D69D8477DE4, &lt;span style=&#34;color:#033&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;Boot&amp;#34;&lt;/span&gt;
/dev/sdc2 : &lt;span style=&#34;color:#033&#34;&gt;start&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;     1466368,                    &lt;span style=&#34;color:#033&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;0FC63DAF-8483-4772-8E79-3D69D8477DE4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Then I created a temporary folder, mounted the partitions and used
&lt;code&gt;qemu-debootstrap&lt;/code&gt; to install the base system:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#033&#34;&gt;CHROOT&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;`&lt;/span&gt;mktemp -d&lt;span style=&#34;color:#c30&#34;&gt;`&lt;/span&gt;
mount /dev/sdc2_crypt &lt;span style=&#34;color:#033&#34;&gt;$CHROOT&lt;/span&gt;
mkdir &lt;span style=&#34;color:#033&#34;&gt;$CHROOT&lt;/span&gt;/boot
mount /dev/sdc1 &lt;span style=&#34;color:#033&#34;&gt;$CHROOT&lt;/span&gt;/boot

sudo qemu-debootstrap --arch&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;arm64 --include&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;u-boot-menu,initramfs-tools,sudo,network-manager,cryptsetup,cryptsetup-initramfs bullseye &lt;span style=&#34;color:#033&#34;&gt;$CHROOT&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Then I copied the kernel package I built on the SD card and installed it in the
chroot. Part of the linux image is also a &lt;code&gt;*.dtb&lt;/code&gt; file for the RK3399, which I
had to copy to &lt;code&gt;/boot&lt;/code&gt; (because u-boot needs this file and the &lt;code&gt;/&lt;/code&gt;-filesystem
is encrypted).
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;mount -o &lt;span style=&#34;color:#366&#34;&gt;bind&lt;/span&gt; /dev &lt;span style=&#34;color:#033&#34;&gt;$CHROOT&lt;/span&gt;/dev
mount -o &lt;span style=&#34;color:#366&#34;&gt;bind&lt;/span&gt; /sys &lt;span style=&#34;color:#033&#34;&gt;$CHROOT&lt;/span&gt;/sys
mount -t proc /proc &lt;span style=&#34;color:#033&#34;&gt;$CHROOT&lt;/span&gt;/proc
chroot &lt;span style=&#34;color:#033&#34;&gt;$CHROOT&lt;/span&gt;
dpkg -i linux-image-5.5.0-rc7-custom+_5.5.0-rc7-custom+-1_arm64.deb
cp /usr/lib/linux-image-5.5.0-rc7-custom+/rockchip/rk3399-pinebook-pro.dtb /boot/

&lt;span style=&#34;color:#366&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;UUID&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;blkid -s UUID -o value /dev/mapper/sdc2_crypt&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt; / ext4 defaults &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; &amp;gt;&amp;gt; /etc/fstab
&lt;span style=&#34;color:#366&#34;&gt;echo&lt;/span&gt; sdc2_crypt &lt;span style=&#34;color:#033&#34;&gt;PARTUUID&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;blkid -s PARTUUID -o value /dev/sdc2 &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt; none luks,discard,initramfs &amp;gt;&amp;gt; /etc/crypttab
&lt;span style=&#34;color:#366&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;UUID&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;blkid -s UUID -o value /dev/sdc1&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt; /boot ext4 defaults &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; &amp;gt;&amp;gt; /etc/fstab&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Finally I pointed the
&lt;a href=&#34;https://manpages.debian.org/buster/u-boot-menu/u-boot-update.8.en.html&#34;&gt;u-boot-update&lt;/a&gt;
script to the &lt;code&gt;*.dtb&lt;/code&gt; file and added my user account:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;# in /etc/defaults/u-boot&lt;/span&gt;
&lt;span style=&#34;color:#033&#34;&gt;U_BOOT_FDT&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;rk3399-pinebook-pro.dtb&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#033&#34;&gt;U_BOOT_PARAMETERS&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;console=tty1&amp;#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;adduser bisco
adduser bisco sudo&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the running system I then also &lt;a href=&#34;https://raw.githubusercontent.com/daniel-thompson/pinebook-pro-debian-installer/master/etc/tmpfiles.d/force-s2idle.conf&#34;&gt;enabled
s2idle&lt;/a&gt;,
because suspend to RAM does not work yet.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t had time to do any more tests on this device, but I hope I&amp;rsquo;ll get to
that in February. If I manage to set up the system to a usable state, I&amp;rsquo;ll
bring it to FOSDEM, which will be its first outside test&amp;hellip;&lt;/p&gt;
&lt;p&gt;On the software side most stuff until now works fine. The main downside is the
missing TorBrowser package, but this is
&lt;a href=&#34;https://trac.torproject.org/projects/tor/ticket/12631&#34;&gt;tracked&lt;/a&gt;
&lt;a href=&#34;https://trac.torproject.org/projects/tor/ticket/32355&#34;&gt;upstream&lt;/a&gt;. Alacritty
does not work and &lt;a href=&#34;https://github.com/alacritty/alacritty/issues/128&#34;&gt;won&amp;rsquo;t in the near
future&lt;/a&gt;, it seems. When I
tried to use tilix, that led to
&lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=949952&#34;&gt;#949952&lt;/a&gt;, so I&amp;rsquo;m
using rxvt-unicode for now&amp;hellip;&lt;/p&gt;
&lt;p&gt;There is now also &lt;a href=&#34;https://wiki.pine64.org/index.php/Pinebook_Pro_Debian_Installer&#34;&gt;a wiki page for the Debian installer
script&lt;/a&gt; which
lists some issues and tips how to fix them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Converting ikiwiki to hugo</title>
      <link>https://bisco.org/notes/converting-ikiwiki-to-hugo/</link>
      <pubDate>Wed, 20 Nov 2019 18:30:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/converting-ikiwiki-to-hugo/</guid>
      <description>&lt;p&gt;Sometimes I play around with &lt;a href=&#34;https://tails.boum.org&#34;&gt;Tails&lt;/a&gt; and on rare
occasions I also &lt;a href=&#34;https://tails.boum.org/contribute/build/manually/&#34;&gt;build a Tails image
myself&lt;/a&gt;. One thing that
makes the build of Tails a bit tedious is that it a also builds the Tails
Website, which contains the whole documentation (which is really cool, because
that way users have the most up to date documentation on their desktop!).
The problem is, that the website takes a looooong time to build- on my Laptop
(i7-5600U) it takes around 11 minutes.&lt;/p&gt;
&lt;p&gt;I was curious if it was possible to convert the whole website, which is based
on &lt;a href=&#34;https://ikiwiki.info/&#34;&gt;ikiwiki&lt;/a&gt;, to &lt;a href=&#34;https://gohugo.io/&#34;&gt;the hugo static site
generator&lt;/a&gt; which is known to be pretty fast (&amp;quot;&lt;em&gt;with its
amazing speed and flexibility, Hugo makes building websites fun again&lt;/em&gt;&amp;quot; as the
hugo website puts it ;)). I did some research if there was some tooling to do
so- the &lt;a href=&#34;https://gohugo.io/tools/migrations/&#34;&gt;Hugo website lists some migration
tools&lt;/a&gt; but nothing for ikiwiki, but I
stumbled upon &lt;a href=&#34;https://gohugo.io/tools/migrations/&#34;&gt;anarcat&amp;rsquo;s conversion notes&lt;/a&gt;
which has a lot of information and also links to the &lt;a href=&#34;https://blog.jak-linux.org/2018/10/25/migrated-website-from-ikiwiki-to-hugo/&#34;&gt;write up jak did on his
conversion&lt;/a&gt;.
Anarcat also published a &lt;a href=&#34;https://gitlab.com/anarcat/scripts/blob/master/ikiwiki2hugo.py&#34;&gt;python script to convert ikiwiki to
hugo&lt;/a&gt; which I
tried, but there were some important parts missing. As it happened I also had
to prepare for an exam at that time and I am a bit of a
&lt;a href=&#34;https://www.youtube.com/watch?v=arj7oStGLkU&#34;&gt;procrastinator&lt;/a&gt;, so I started
adapting the script for the Tails wiki and then rewrote some parts and now its
just another &lt;a href=&#34;https://salsa.debian.org/bisco-guest/ikiwiki2hugo&#34;&gt;ikiwiki2hugo
script&lt;/a&gt;:&lt;/p&gt;
&lt;h1 id=&#34;what-does-it-do&#34;&gt;What does it do?&lt;/h1&gt;
&lt;p&gt;For every ikiwiki &lt;code&gt;*.mdwn&lt;/code&gt; or &lt;code&gt;*.html&lt;/code&gt; file, it creates a Markdown file with
&lt;a href=&#34;https://gohugo.io/content-management/front-matter/&#34;&gt;hugo frontmatter&lt;/a&gt;. The
information for the hugo frontmatter comes from parsing the &lt;code&gt;[[!meta&lt;/code&gt; directives
in the files.&lt;/p&gt;
&lt;p&gt;If there is a *.po file with the same name, the script creates a &lt;code&gt;*.XX.md&lt;/code&gt; file
with the strings translated.&lt;/p&gt;
&lt;p&gt;Then the content is converted:&lt;/p&gt;
&lt;p&gt;The content of the Markdown files is a copy of the content of the ikiwiki files
with the ikiwiki directives replaced by &lt;a href=&#34;https://gohugo.io/content-management/shortcodes/&#34;&gt;hugo
shortcodes&lt;/a&gt;.  There are a lot
of &lt;a href=&#34;https://ikiwiki.info/ikiwiki/directive/&#34;&gt;directives&lt;/a&gt; out there and I only
implemented replacements for some of them.  My test ikiwiki instance was the
the &lt;a href=&#34;https://tails.boum.org&#34;&gt;Tails&lt;/a&gt; ikiwiki source, so I mostly implemented
directives used there.  Merge requests or patches for additional directives are
welcome- to add a replacement for a directive, look in the &lt;a href=&#34;https://salsa.debian.org/bisco-guest/ikiwiki2hugo/tree/main/directives&#34;&gt;directives
folder&lt;/a&gt;,
all the replacement python modules inherit from the &lt;code&gt;Directive&lt;/code&gt; class. The
shortcode files are &lt;code&gt;assets/shortcodes&lt;/code&gt; folder.&lt;/p&gt;
&lt;h1 id=&#34;what-does-it-not-do&#34;&gt;What does it not do?&lt;/h1&gt;
&lt;p&gt;Probably the more important question ;)&lt;/p&gt;
&lt;p&gt;There are a lot of directives whose replacements are not implemented. Most
important probably the &lt;code&gt;[[!inline&lt;/code&gt; directive with multiple (and negative)
arguments and the &lt;code&gt;[[!map&lt;/code&gt; directive.&lt;/p&gt;
&lt;p&gt;Also, Hugo is more strict regarding Markdown syntax. It does not convert
markdown syntax that is embedded in &lt;code&gt;&amp;lt;div&amp;gt;...&amp;lt;/div&amp;gt;&lt;/code&gt; and other block-level
elements.&lt;/p&gt;
&lt;h1 id=&#34;the-result&#34;&gt;The result&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: This comparison only looks at the build time- there is a lot of
functionality of ikiwiki that hugo does not provide, for example the possibility
to edit websites through the browser, which is used for the &lt;a href=&#34;https://tails.boum.org/blueprint/&#34;&gt;Tails
blueprints&lt;/a&gt;. Another feature are the
&lt;a href=&#34;https://tails.boum.org/blueprint/&#34;&gt;traillink directives&lt;/a&gt; which i simple
replaced by normal markdown links.&lt;/p&gt;
&lt;p&gt;Anarcat also provides a nice oneliner to check which directives are used in the
ikiwiki repository:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;grep -h -r &lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;\[\[!&amp;#39;&lt;/span&gt; * | sed &lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;s/\[\[!/\n[[!/g&amp;#39;&lt;/span&gt; | grep &lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;\[\[!&amp;#39;&lt;/span&gt; | sed &lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;s/ .*//&amp;#39;&lt;/span&gt; | sort | uniq -c | sort -n&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Before running the script (I&amp;rsquo;ve removed listings of directives that occure less than 100 times):
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;    ...
    ...
    &lt;span style=&#34;color:#f60&#34;&gt;122&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!wikipedia&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    124 [[!debsa2012
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    130 [[!debsa2018
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    134 [[!tails_roadmap
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    152 [[!debsa2014
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    188 [[!debsa2015
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    204 [[!debsa2017
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    219 [[!tails_gitweb_branch
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    222 [[!debsa2016
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    247 [[!tails_website
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    283 [[!mfsa
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    604 [[!cve
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    655 [[!toggleable
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    696 [[!tails_roadmap]]
&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    775 [[!&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#f60&#34;&gt;806&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!tails_gitweb
   &lt;span style=&#34;color:#f60&#34;&gt;1143&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!toggle
   &lt;span style=&#34;color:#f60&#34;&gt;1203&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!wikipedia
   &lt;span style=&#34;color:#f60&#34;&gt;1704&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!traillink
   &lt;span style=&#34;color:#f60&#34;&gt;2411&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!pagetemplate
   &lt;span style=&#34;color:#f60&#34;&gt;2434&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!toc
   &lt;span style=&#34;color:#f60&#34;&gt;2572&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!tag
   &lt;span style=&#34;color:#f60&#34;&gt;5627&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!inline
   &lt;span style=&#34;color:#f60&#34;&gt;5747&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!tails_ticket
   &lt;span style=&#34;color:#f60&#34;&gt;8673&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!img
  &lt;span style=&#34;color:#f60&#34;&gt;13577&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!meta&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;After the conversion :
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;      &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!immagine
      &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!parent&lt;span style=&#34;color:#555&#34;&gt;]]&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;`&lt;/span&gt;.
      &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!tails_gitweb
      &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!tails_ticket
     &lt;span style=&#34;color:#f60&#34;&gt;30&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!map
     &lt;span style=&#34;color:#f60&#34;&gt;66&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;[[&lt;/span&gt;!inline&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
(I think the &lt;code&gt;immagine&lt;/code&gt; is a typo in a translation; I also &lt;a href=&#34;https://salsa.debian.org/tails-team/tails/merge_requests/40&#34;&gt;found a couple of
other typos which are fixed
now&lt;/a&gt;; the
&lt;code&gt;tails_ticket&lt;/code&gt; directive is a code-quote from the release process document and
the &lt;code&gt;tails_gitweb&lt;/code&gt; is &lt;strong&gt;the one&lt;/strong&gt; occurence of this directive which lists the
description before the path ;))&lt;/p&gt;
&lt;p&gt;Hugo takes nearly two seconds to build the website:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;                   | DE  |  EN  | ES  | FA  | FR  | IT  | PT
+------------------+-----+------+-----+-----+-----+-----+-----+
  Pages            | &lt;span style=&#34;color:#f60&#34;&gt;286&lt;/span&gt; | &lt;span style=&#34;color:#f60&#34;&gt;1023&lt;/span&gt; | &lt;span style=&#34;color:#f60&#34;&gt;286&lt;/span&gt; | &lt;span style=&#34;color:#f60&#34;&gt;286&lt;/span&gt; | &lt;span style=&#34;color:#f60&#34;&gt;286&lt;/span&gt; | &lt;span style=&#34;color:#f60&#34;&gt;286&lt;/span&gt; | &lt;span style=&#34;color:#f60&#34;&gt;286&lt;/span&gt;
  Paginator pages  |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |    &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt;
  Non-page files   |   &lt;span style=&#34;color:#f60&#34;&gt;9&lt;/span&gt; |  &lt;span style=&#34;color:#f60&#34;&gt;400&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;9&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;9&lt;/span&gt; |  &lt;span style=&#34;color:#f60&#34;&gt;14&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;9&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;9&lt;/span&gt;
  Static files     |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |    &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt;
  Processed images |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |    &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt;
  Aliases          |   &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; |    &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt;
  Sitemaps         |   &lt;span style=&#34;color:#f60&#34;&gt;2&lt;/span&gt; |    &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt;
  Cleaned          |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |    &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt; |   &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt;

Total in &lt;span style=&#34;color:#f60&#34;&gt;1711&lt;/span&gt; ms&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Finally, a screeshot of the Tails website built with hugo- it looks pretty
broken. Most of the syntax that does not work is because its embedded in HTML
tags. Apparently &lt;a href=&#34;https://github.com/gohugoio/hugo/pull/6484&#34;&gt;hugo thinks about switching to another markdown
renderer&lt;/a&gt;, so that could make a
conversion from systems with a lot of mixed HTML/Markdown code easier.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/converting-ikiwiki-to-hugo/Screenshot.png&#34; alt=&#34;Screenshot of the Tails website built with hugo&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Installing and running Signal on Tails</title>
      <link>https://bisco.org/notes/installing-and-running-signal-on-tails/</link>
      <pubDate>Thu, 03 Oct 2019 09:52:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/installing-and-running-signal-on-tails/</guid>
      <description>&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❗ This article is very outdated. You should look for more recent instructions. ❗&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;/table&gt;
&lt;p&gt;Because the topic comes up every now and then, I thought I&amp;rsquo;d write down how to
install and run &lt;a href=&#34;https://signal.org&#34;&gt;Signal&lt;/a&gt; on
&lt;a href=&#34;https://tails.boum.org&#34;&gt;Tails&lt;/a&gt;. These instructions are based on &lt;a href=&#34;https://tails.boum.org/news/test_4.0-beta2/&#34;&gt;the 2nd Beta
of Tails 4.0&lt;/a&gt; - the 4.0 release is
scheduled for October 22nd. I&amp;rsquo;m not sure if these steps also work on Tails 3.x,
I seem to remember having some problems with installing flatpaks on Debian
Stretch.&lt;/p&gt;
&lt;p&gt;The first thing to do is to enable the &lt;a href=&#34;https://tails.boum.org/doc/first_steps/additional_software/&#34;&gt;Additional
Software&lt;/a&gt; feature
of Tails persistence (the &lt;a href=&#34;https://tails.boum.org/doc/first_steps/persistence/configure/#index1h2&#34;&gt;Personal
Data&lt;/a&gt;
feature is also required, but that one is enabled by default when configuring
persistence). Don&amp;rsquo;t forget to reboot afterwards. When logging in after the
reboot, please set an &lt;a href=&#34;https://tails.boum.org/doc/first_steps/startup_options/administration_password/&#34;&gt;Administration
Password&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The approach I use to run Signal on Tails is using flatpak, so install flatpak
either via Synaptic or via commandline:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;sudo apt install flatpak&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Tails then asks if you want to add &lt;code&gt;flatpak&lt;/code&gt; to your additional software and I
recommend doing so. The list of additional software can be checked via
Applications → System Tools → Additional Software. The next thing you
need to do is set up the directories- &lt;code&gt;flatpak&lt;/code&gt; installs the software packages
either system-wide in &lt;code&gt;$prefix/var/lib/flatpak/&lt;/code&gt;[&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;] or per user in
&lt;code&gt;$HOME/.local/share/flatpak/&lt;/code&gt; (the latter lets you manage your flatpaks without
having to use elevated permissions). User specific data of the apps goes into
&lt;code&gt;$HOME/.var/app&lt;/code&gt;. This means we have to create directories on our &lt;code&gt;Peristent&lt;/code&gt; folder
for those two locations and then link them to their targets in &lt;code&gt;/home/amnesia&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I recommend putting these commands into a script (i.e.
&lt;code&gt;/home/amnesia/Persistent/flatpak-setup.sh&lt;/code&gt;) and making it executable (&lt;code&gt;chmod +x /home/amnesia/Persistent/flatpak-setup.sh&lt;/code&gt;):&lt;/p&gt;
&lt;span style=&#34;font-size:80%&#34;&gt;
Update (2022/07): added fixes reported by reader
&lt;/span&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#099&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;&lt;/span&gt;
mkdir -p /home/amnesia/Persistent/flatpak
mkdir -p /home/amnesia/.local/share

&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;if&lt;/span&gt; ! file /home/amnesia/.local/share/flatpak | grep -q &lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;symbolic link&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;then&lt;/span&gt;
        rm -rf --one-file-system /home/amnesia/.local/share/flatpak
        ln -s /home/amnesia/Persistent/flatpak /home/amnesia/.local/share/flatpak
&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;fi&lt;/span&gt;

mkdir -p /home/amnesia/Persistent/app
mkdir -p /home/amnesia/.var
ln -s /home/amnesia/Persistent/app /home/amnesia/.var/app&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now you need to add a flatpak remote and install signal:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;amnesia@amnesia:~$ torify flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
amnesia@amnesia:~$ torify flatpak install flathub org.signal.Signal&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;This will take a couple of minutes.&lt;/p&gt;
&lt;p&gt;To show Signal the way &lt;del&gt;to the next whiskey bar&lt;/del&gt; through Tor the HTTP_PROXY
and HTTPS_PROXY environment variables have to be set. I recommend again to put
this into a script (i.e.  &lt;code&gt;/home/amnesia/Persistent/signal.sh&lt;/code&gt;)
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#099&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;HTTP_PROXY&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;socks://127.0.0.1:9050
&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;HTTPS_PROXY&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;socks://127.0.0.1:9050
flatpak run org.signal.Signal&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/installing-and-running-signal-on-tails/SignalonTails1.png&#34; alt=&#34;Screenshot of Signal on Tails 4&#34;&gt;
Yay it works!&lt;/p&gt;
&lt;p&gt;To update signal you have to run
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;amnesia@amnesia:~$ torify flatpak update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;To make the whole thing a bit more comfortably, the folder softlinks can be
automatically created on login using a Gnome autostart script. For that to work
you have to have the
&lt;a href=&#34;https://tails.boum.org/doc/first_steps/persistence/configure/#index11h2&#34;&gt;Dotfiles&lt;/a&gt;
feature of Tails enabled. Then you can create a
&lt;code&gt;/live/persistence/TailsData_unlocked/dotfiles/.config/autostart/FlatpakSetup.desktop&lt;/code&gt;
file:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;[Desktop Entry]&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;FlatpakSetup&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;GenericName&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;Setup Flatpak on Tails&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Comment&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;This script runs the flatpak-setup.sh script on start of the user session&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;/live/persistence/TailsData_unlocked/Persistent/flatpak-setup.sh&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Terminal&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;false&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;Application&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;By adding
&lt;code&gt;/live/persistence/TailsData_unlocked/dotfiles/.local/share/applications/Signal.desktop&lt;/code&gt;
file to the &lt;code&gt;dotfiles&lt;/code&gt; folder, Signal also shows as part of the Gnome
applications with a nice Signal icon:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;[Desktop Entry]&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;Signal&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;GenericName&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;Signal Desktop Messenger&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;/home/amnesia/Persistent/signal.sh&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Terminal&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;false&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;Application&lt;/span&gt;
&lt;span style=&#34;color:#309&#34;&gt;Icon&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;/home/amnesia/.local/share/flatpak/app/org.signal.Signal/current/active/files/share/icons/hicolor/128x128/apps/org.signal.Signal.png&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/installing-and-running-signal-on-tails/SignalonTails2.png&#34; alt=&#34;Screenshot of Signal Application Icon Tails 4&#34;&gt;&lt;/p&gt;
&lt;section class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;It is also possible to configure additional system wide installation locations, details are documented in &lt;a href=&#34;https://manpages.debian.org/buster/flatpak/flatpak-installation.5.en.html&#34;&gt;flatpak-installation(5)&lt;/a&gt; &lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
    </item>
    
    <item>
      <title>Installing Debian with encrypted boot using GRML</title>
      <link>https://bisco.org/notes/installing-debian-with-encrypted-boot-using-grml/</link>
      <pubDate>Thu, 21 Mar 2019 19:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/installing-debian-with-encrypted-boot-using-grml/</guid>
      <description>&lt;p&gt;A couple of days ago an interesting step-by-step guide on how to &lt;a href=&#34;https://lists.debian.org/debian-boot/2019/01/msg00035.html&#34;&gt;install
Debian with full disk encryption, including /boot, using
debian-installer&lt;/a&gt;
was posted on the debian-boot mailinglist. This reminded me of the steps I used
and wrote down a couple of month ago to create a similar setup. These steps
describe a full disk (including &lt;code&gt;/boot&lt;/code&gt;) encrypted setup on a non coreboot
enabled system using the great [grml live distro] (&lt;a href=&#34;http://grml.org/)&#34;&gt;http://grml.org/)&lt;/a&gt;.  (And
just to be sure I just redid the same setup on a test device with the
newest &lt;a href=&#34;https://grml.org/changelogs/README-grml-2018.12/&#34;&gt;grml release
Gnackwatschn&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;The first step was to set up the network using &lt;code&gt;grml-network&lt;/code&gt; after which I
started by preparing the disk. I wiped the disks old partition table
using &lt;code&gt;sgdisk(8)&lt;/code&gt; and then created a 512MB EFI System partition and
used the rest of the disk for a Linux partition:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sgdisk --zap-all /dev/sda
sgdisk -n1:1M:+512M -t1:EF00 /dev/sda
sgdisk -n2:0:0 -t2:8300 /dev/sda
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then I initialized the LUKS partition, set a passphrase and opened the LUKS device:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cryptsetup luksFormat /dev/sda2
cryptsetup luksOpen /dev/sda2 sda2_crypt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The LUKS device is then used to create a LVM volume group which in this example
is called &lt;code&gt;vg-2560p&lt;/code&gt;. In that volume group I created a logical volume for the
&lt;code&gt;/root&lt;/code&gt; filesystem:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pvcreate /dev/ampper/sda2_crypt
vgcreate vg-2560p /dev/mapper/sda2_crypt
lvcreate -L 120G vg-2560p -n root
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The next step was to create an ext4 filesystem on the &lt;code&gt;/root&lt;/code&gt; volume and a msdos
filesystem with a 32bit file allocation table and the
label &lt;code&gt;EFI&lt;/code&gt; on the EFI System partition:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkfs.ext4 /dev/vg-2560p/root
mkdosfs -F 32 -n EFI /dev/sda1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I then mounted the root partition,
&lt;a href=&#34;https://wiki.debian.org/Debootstrap&#34;&gt;debootstrap&lt;/a&gt;ped buster onto the
partition, mounted the EFI partition and remounted &lt;code&gt;/dev&lt;/code&gt;, &lt;code&gt;/proc&lt;/code&gt;, &lt;code&gt;/sys&lt;/code&gt; and
&lt;code&gt;/run&lt;/code&gt; into the new system:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mount /dev/vg-2560p/root /mnt
debootstrap buster /mnt http://deb.debian.org/debian
mkdir /mnt/boot/efi
mount /dev/sda1 /mnt/boot/efi
mount --rbind /dev /mnt/dev/
mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --rbind /run /mnt/run
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After that I used &lt;code&gt;chroot(8)&lt;/code&gt; to change into the buster installation and do
some initial configuration. I first told &lt;code&gt;apt(8)&lt;/code&gt; not to install recommended
packages and then installed a kernel, grub, cryptsetup, lvm2 and sudo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chroot /mnt /bin/bash
echo &amp;quot;Apt::Install-Recommends 0;&amp;quot; &amp;gt;&amp;gt; /etc/apt/apt.conf.d/local-recommends
apt install linux-image-amd64 cryptsetup lvm2 grub-efi-amd64 sudo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On the new system, the &lt;code&gt;/etc/fstab&lt;/code&gt; file is empty and so I added the filesystems
and I also added information about the encrypted disk to the &lt;code&gt;/etc/crypttab&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo PARTUUID=$(blkid -s PARTUUID -o value /dev/sda1) /boot/efi vfat nofail,x-systemd.device-timeout=1 0 1 &amp;gt;&amp;gt; /etc/fstab
echo UUID=$(blkid -s UUID -o value /dev/mapper/vg--2560p-root) / ext4 defaults 0 1 &amp;gt;&amp;gt; /etc/fstab
echo sda2_crypt PARTUUID=$(blkid -s PARTUUID -o value /dev/sda2) none luks,discard,initramfs &amp;gt;&amp;gt; /etc/crypttab
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I also had to tell grub to enable device decryption:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;quot;GRUB_ENABLE_CRYPTODISK=y&amp;quot; &amp;gt;&amp;gt; /etc/default/grub
update-initramfs -c -k all
update-grub
grub-install --target=x86_64-efi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The final step, which I forget nearly every time when i install a system using
&lt;code&gt;debootstrap(8)&lt;/code&gt;, was to ad a user account:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adduser bisco
adduser bisco sudo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;PS: On the laptop I installed a couple of month ago, I had to set the path to
the EFI Grub file (&lt;code&gt;\EFI\debian\grubx64.efi&lt;/code&gt;) in bios. On the laptop i used to
reproduce the above steps, i didn&amp;rsquo;t find that setting in bios (its from 2011,
maybe a bios update would have helped), but I was able to choose the file
during boot.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>30minutes Django introduction</title>
      <link>https://bisco.org/notes/30minutes-django-introduction/</link>
      <pubDate>Sat, 02 Mar 2019 17:52:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/30minutes-django-introduction/</guid>
      <description>&lt;p&gt;Yesterday i had to give a short, 30 minutes, introduction to Django and show
how to create a small webapplication using Django. These are the my notes to
this workshop:&lt;/p&gt;
&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;http://djangoproject.com/&#34;&gt;Django&lt;/a&gt; is a webframework written in Python. It was
started in 2003 and in 2005 it was released under the BSD License. In 2008 the
Django software foundation took over development of Django. End of 2017 the
version 2.0 of Django was released, which was the first Python 3 only release.
About every two years there is a LTS release which is supported for at least
three years. Famous websites using Django are the website of the Washington
Post or the website of the NASA.&lt;/p&gt;
&lt;p&gt;Django follows the Model View Controller (MVC) pattern, though in the case of
Django it is often described as Model View Template pattern, given that Django
doesn&amp;rsquo;t adhere the MVC pattern completely.&lt;/p&gt;
&lt;p&gt;The advantage of a webframework following the MVC pattern is, that the work
with data, the presentation of data and the processing of data has only to be
dealt with on an abstract layer. This means, one doesn&amp;rsquo;t have to directly work
with database connections, it is not necessary to write SQL statements and also
Webforms are handled by Django.&lt;/p&gt;
&lt;p&gt;A Django project is started by the command &lt;code&gt;django-admin startproject projectname&lt;/code&gt;. This command creates a folder containgin a Python module and a
management Python script.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user@calculator:~ tree
.
├── manage.py
└── projectname
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The management script can be used to handle various configuration tasks, like
generating the database structure, creating an admin account or starting the
built-in development webserver.&lt;/p&gt;
&lt;p&gt;The Python module contains a configuration file which contains settings like
the chosen database backend (sqlite by default) and it lets you deactivate the
DEBUG mode. The DEBUG mode should be deactivated before moving a Django project
to production, because with the activated DEBUG mode, error messages also
contain a lot of debugging information about the system. If the DEBUG mode is
deactivated, the error messages are replaced with a 404 page.&lt;/p&gt;
&lt;p&gt;Another important file is the &lt;code&gt;urls.py&lt;/code&gt; file. It maps paths in the URI to
functionality in the Django project. The last file is the &lt;code&gt;wsgi.py&lt;/code&gt; file, WSGI
is the Web Server Gateway Interface and it is a standard for webservers passing
requests to Python scripts.&lt;/p&gt;
&lt;h1 id=&#34;bookmanagement-example&#34;&gt;Bookmanagement Example&lt;/h1&gt;
&lt;p&gt;To give a small example what a Django web application could look like, i&amp;rsquo;ve
created a book management applications. It stores books in a database and lets
you add, view, modify, list and delete book entries. This example was written
with Django 2.1. If you want to try it, you&amp;rsquo;ll have to 1) install Django, 2)
run &lt;code&gt;./manage.py migrate&lt;/code&gt; to create the db.sqlite file and populate it with
the database structure and 3) run &lt;code&gt;./manage.py runserver&lt;/code&gt; to start the
development webserver. You can then access the webapp on
&lt;code&gt;http://localhost:8000&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;First we have to add an app to our Django project. This app is a simple Python
module and it can be created with the command &lt;code&gt;./manage.py startapp bookmanagent&lt;/code&gt; (where &lt;code&gt;bookmanagement&lt;/code&gt; is the name of our app). To make this
app known to the Django project, we also have to add the app name to the
list of &lt;code&gt;INSTALLED_APPS&lt;/code&gt; in the &lt;code&gt;settings.py&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;The first thing to create is a model. Every task in this web application works
on book entries, so we first have to create a model &lt;code&gt;Book&lt;/code&gt;. A model is like an
object in object oriented programming and in Django it is a Python class. We
define a model in the file &lt;code&gt;bookmanagement/models.py&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    year = models.PositiveSmallIntegerField()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is a definition of the model &lt;code&gt;Book&lt;/code&gt; with the attributes &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;author&lt;/code&gt;
and &lt;code&gt;year&lt;/code&gt;. &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;author&lt;/code&gt; are character fields, the &lt;code&gt;year&lt;/code&gt; attribute is
an integer field. Django contains &lt;a href=&#34;https://docs.djangoproject.com/en/2.0/ref/models/fields/&#34;&gt;around 25 different field
types&lt;/a&gt;, i.e. for
dates, email addresses or text input.
After defining a model, we have to run &lt;code&gt;./manage.py makemigrations bookmanagement&lt;/code&gt; and &lt;code&gt;./manage.py migrate&lt;/code&gt; to create the needed tables in the
database for our model.&lt;/p&gt;
&lt;p&gt;To work with our model, the next step is to create views to add, modify,
delete, display and list books. Views are Djangos method to process web
requests. Views go in the &lt;code&gt;bookmanagement/views.py&lt;/code&gt; file. Django comes with a
lot of generic views and we can write Python classes that inherit from those
generic views to implement all the methods we need for the bookmanagement
application:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class BookList(ListView):
    model = Book

class BookCreate(CreateView):
    model = Book
    fields = [&#39;title&#39;, &#39;author&#39;, &#39;year&#39;]
    success_url = &#39;/books&#39;

class BookDetail(DetailView):
    model = Book

class BookUpdate(UpdateView):
    model = Book
    fields = [&#39;title&#39;, &#39;author&#39;, &#39;year&#39;]
    success_url = &#39;/books&#39;

class BookDelete(DeleteView):
    model = Book
    success_url = &#39;/books&#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As mentioned before, we use the &lt;code&gt;urls.py&lt;/code&gt; file to map the paths in the URI to
the functionality of the Django project:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;path(&#39;createbook/&#39;, views.BookCreate.as_view(), name=&#39;createbook&#39;),
path(&#39;book/&amp;lt;int:pk&amp;gt;&#39;, views.BookDetail.as_view(), name=&#39;bookdetail&#39;),
path(&#39;books/&#39;, views.BookList.as_view()),
path(&#39;deletebook/&amp;lt;int:pk&amp;gt;&#39;, views.BookDelete.as_view(), name=&#39;deletebook&#39;),
path(&#39;updatebook/&amp;lt;int:pk&amp;gt;&#39;, views.BookUpdate.as_view(), name=&#39;updatebook&#39;),
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now we have the paths, the views to operate on data and the model that
describes the data structure. The only additional piece of the puzzle are
templates. Templates are files that define how a view returns data to a
webbrowser. In our case they contain HTML and some template specific
statements. In most of my Django projects i use a generic &lt;code&gt;body.html&lt;/code&gt; file that
defines the overall structure of the web pages (like including a style sheet or
defining a navigation bar) and all the view-specific templates then inherit the
content of this file (&lt;code&gt;boomanagement/templates/body.html&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
  &amp;lt;title&amp;gt;Bookmanagement&amp;lt;/title&amp;gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css&amp;quot; integrity=&amp;quot;sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T&amp;quot; crossorigin=&amp;quot;anonymous&amp;quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body class=&amp;quot;bg-light&amp;quot;&amp;gt;
    &amp;lt;nav class=&amp;quot;navbar navbar-dark navbar-expand-md bg-dark mb-4&amp;quot;&amp;gt;
        &amp;lt;a class=&amp;quot;navbar-brand&amp;quot; href=&amp;quot;/books&amp;quot;&amp;gt;Bookmanagement&amp;lt;/a&amp;gt;
        &amp;lt;ul class=&amp;quot;navbar-nav mr-auto&amp;quot;&amp;gt;
            &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&amp;lt;a class=&amp;quot;nav-link&amp;quot; href=&amp;quot;{% url &#39;createbook&#39; %}&amp;quot;&amp;gt;Add Book&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/nav&amp;gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;jumbotron mt-5&amp;quot;&amp;gt;
{% block content %}
{% endblock %}
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The template for the listview
(&lt;code&gt;bookmanagement/templates/bookmanagement/book_list.html&lt;/code&gt;) then only has to
extend this template. The list view passes a list of objects to the template
and in the template we can just iterate through this list and create links for
the details of a book, a link for modifying a book and a link for deleting a
book.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{% extends &#39;body.html&#39; %}

{% block content %}
&amp;lt;ul&amp;gt;
{% for object in object_list %}
&amp;lt;li&amp;gt;
    &amp;lt;a href={% url &#39;bookdetail&#39; object.pk %}&amp;gt;{{ object.title }}&amp;lt;/a&amp;gt;, {{ object.year }}, &amp;lt;a href=&amp;quot;{% url &#39;deletebook&#39; object.id %}&amp;quot;&amp;gt;Delete&amp;lt;/a&amp;gt;, &amp;lt;a href=&amp;quot;{% url &#39;updatebook&#39; object.id %}&amp;quot;&amp;gt;Update&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
{% endfor %}
&amp;lt;/ul&amp;gt;
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The template file for the input form
(&lt;code&gt;bookmanagement/templates/bookmanagement/book_form.html&lt;/code&gt;), too, extends the
&lt;code&gt;body.html&lt;/code&gt; template and then simply shows the form that is passed from the
create or update view:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{% extends &#39;body.html&#39; %}

{% block content %}
&amp;lt;form method=&amp;quot;post&amp;quot;&amp;gt;{% csrf_token %}
        {{ form.as_p }}
            &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Save&amp;quot;&amp;gt;
&amp;lt;/form&amp;gt;
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The important thing with form templates is the statement &lt;code&gt;{% csrf_token %}&lt;/code&gt;
which includes a token to protect against &lt;a href=&#34;https://docs.djangoproject.com/en/2.1/ref/csrf/&#34;&gt;Cross Site Request
Forgery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is all to have a working bookmanagement web application. There is one
other feature of Django, that makes it especially helpful for internal use,
that is the admin interface. Django comes with an admin interface that you can
access on &lt;code&gt;http://localhost:8000/admin&lt;/code&gt;.  This can also be used to manage model
objects. If you add&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from .models import Book
admin.site.register(Book)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to the file &lt;code&gt;bookmanagement/admin.py&lt;/code&gt; you can manage all your book entries in a
login protected area without having to create views or templates. This can be
useful for very basic internal web applications.&lt;/p&gt;
&lt;h1 id=&#34;simpleview&#34;&gt;SimpleView&lt;/h1&gt;
&lt;p&gt;One more thing about views:
As mentioned above, views process web requests. In the views for the
bookmanagement application, we didn&amp;rsquo;t have to touch any of the functions of
these classes, but if we want, we can override the request processing. In the
following snipplet, i&amp;rsquo;ve implemented methods for &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt;
requests. Django provides us the &lt;code&gt;HttpResonse&lt;/code&gt; object to respond to a request.
As you can see in the &lt;code&gt;get()&lt;/code&gt; method, we can simply pass a string and also give
the desired status code as an argument. The &lt;code&gt;post()&lt;/code&gt; method also simply returns a
string- but to test this method, i had to remove the csrf protection from this
view. This is done in the &lt;code&gt;dispatch()&lt;/code&gt; method using a &lt;code&gt;method_decorator&lt;/code&gt;. Last
but not least there is the &lt;code&gt;delete()&lt;/code&gt; method, which returns a &lt;code&gt;JsonResponse&lt;/code&gt; to
show that Django can also be used to implement APIs. In addition, this method
also sets a header field &lt;code&gt;X-Clacks-Overhead&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class SimpleView(View):

    @method_decorator(csrf_exempt)
    def dispatch(self, request):
        return super().dispatch(request)

    def get(self, request):
        return HttpResponse(&amp;quot;I&#39;m a teapot!&amp;quot;, status=418)

    def post(self, request):
        return HttpResponse(&amp;quot;Going postal!&amp;quot;)

    def delete(self, request):
        response = JsonResponse({&#39;deleted&#39;:&#39;foobar&#39;, &#39;useragent&#39;: request.META[&#39;HTTP_USER_AGENT&#39;]})
        response[&#39;X-Clacks-Overhead&#39;] = &amp;quot;GNU Terry Pratchett&amp;quot;
        return response
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If we test the views &lt;code&gt;get()&lt;/code&gt; method using &lt;a href=&#34;https://httpie.org/&#34;&gt;httpie&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user@calculator:~ http http://localhost:8000/simpleview/
HTTP/1.1 418 Unknown Status Code
Content-Length: 13
Content-Type: text/html; charset=utf-8
Date: Sat, 02 Mar 2019 16:41:47 GMT
Server: WSGIServer/0.2 CPython/3.7.2+
X-Frame-Options: SAMEORIGIN

I&#39;m a teapot!
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;post()&lt;/code&gt; method:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user@calculator:~ http POST http://localhost:8000/simpleview/
HTTP/1.1 200 OK
Content-Length: 13
Content-Type: text/html; charset=utf-8
Date: Sat, 02 Mar 2019 16:42:50 GMT
Server: WSGIServer/0.2 CPython/3.7.2+
X-Frame-Options: SAMEORIGIN

Going postal!
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip; and the &lt;code&gt;delete()&lt;/code&gt; method:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user@calculator:~ http DELETE http://localhost:8000/simpleview/
HTTP/1.1 200 OK
Content-Length: 50
Content-Type: application/json
Date: Sat, 02 Mar 2019 16:44:01 GMT
Server: WSGIServer/0.2 CPython/3.7.2+
X-Clacks-Overhead: GNU Terry Pratchett
X-Frame-Options: SAMEORIGIN

{
    &amp;quot;deleted&amp;quot;: &amp;quot;foobar&amp;quot;,
    &amp;quot;useragent&amp;quot;: &amp;quot;HTTPie/0.9.8&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can find the code of the bookmanagement webapplication &lt;a href=&#34;https://gitlab.com/bisco/30mindjango/&#34;&gt;in my 30mindjango
git repository&lt;/a&gt; on gitlab.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sway in experimental</title>
      <link>https://bisco.org/notes/sway-in-experimental/</link>
      <pubDate>Sun, 17 Feb 2019 20:52:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/sway-in-experimental/</guid>
      <description>&lt;p&gt;A couple of days ago the 1.0-RC2 version of
&lt;a href=&#34;https://github.com/swaywm/sway&#34;&gt;Sway&lt;/a&gt;, a Wayland compositor, landed in Debian
&lt;strong&gt;experimental&lt;/strong&gt;. Sway is a drop in replacement for the &lt;a href=&#34;https://i3wm.org/&#34;&gt;i3 tiling window
manager&lt;/a&gt; for wayland. Drop in replacement means that, apart
from minor adaptions, you can reuse your existing i3 configuration file for
Sway. On the &lt;a href=&#34;https://swaywm.org/&#34;&gt;Website of sway&lt;/a&gt; you can find a short
introduction video that shows the most basic concepts of using Sway, though if
you have worked with i3 you will feel at home soon.&lt;/p&gt;
&lt;p&gt;In the video the utility swaygrab is mentioned, but this tool is not part of
Sway anymore. There is another screenshot tool now though, called
&lt;a href=&#34;https://wayland.emersion.fr/grim/&#34;&gt;grim&lt;/a&gt; which you can combine with the tool
&lt;a href=&#34;https://wayland.emersion.fr/slurp/&#34;&gt;slurp&lt;/a&gt; if you want to select regions for
screenshots. The video also mentions
&lt;a href=&#34;https://github.com/swaywm/swaylock&#34;&gt;swaylock&lt;/a&gt;, which is a screen locking
utility similar to i3lock. It was split out of the main Sway release a couple
of weeks ago but there also exists a Debian package by now. And there is a
package for &lt;a href=&#34;https://github.com/swaywm/swayidle&#34;&gt;swayidle&lt;/a&gt;, which is a idle
management daemon, which comes handy for locking the screen or for turning of
your display after a timeout. If you need clipboard manager, you can use
&lt;a href=&#34;https://github.com/bugaevc/wl-clipboard&#34;&gt;wl-clipboard&lt;/a&gt;. There is also a
notification daemon called &lt;a href=&#34;https://github.com/emersion/mako&#34;&gt;mako&lt;/a&gt; (the Debian
package is called mako-notifier and is in NEW) and if you don&amp;rsquo;t like the
default swaybar, you can have a look at
&lt;a href=&#34;https://github.com/Alexays/Waybar&#34;&gt;waybar&lt;/a&gt; (not yet in Debian, see &lt;a href=&#34;https://bugs.debian.org/922117&#34;&gt;this
RFS&lt;/a&gt;). If you want to get in touch with other
Sway users there is a #sway IRC channel on freenode. For some tricks setting up
Sway you can browse the &lt;a href=&#34;https://github.com/swaywm/sway/wiki&#34;&gt;wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want to try Sway, beware that is is a release candiate and there are
still bugs. I&amp;rsquo;m using Sway since a couple of month and though i had crashes
when it still was the 1.0-beta.1 i hadn&amp;rsquo;t any since beta.2. But i&amp;rsquo;m using a
pretty conservative setup.&lt;/p&gt;
&lt;p&gt;Sway was started by &lt;a href=&#34;https://drewdevault.com/&#34;&gt;Drew DeVault&lt;/a&gt; who is also the
upstream maintainer of &lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt;, the
Wayland compositor library Sway is using and who some might now from his
&lt;a href=&#34;https://sourcehut.org/&#34;&gt;sourcehut&lt;/a&gt; project (&lt;a href=&#34;https://lwn.net/Articles/775963/&#34;&gt;LWN
Article&lt;/a&gt;). He also just published an
article about &lt;a href=&#34;https://drewdevault.com/2019/02/10/Wayland-misconceptions-debunked.html&#34;&gt;Wayland
misconceptions&lt;/a&gt;.
The upstream of grim, slurp and mako is Simon Ser, who also contributes
to sway.
A lot of thanks for the Debian packaging is due to nicoo who did most of the
heavy lifting and to Sean for having patience when reviewing my
contributions. Also thanks to Guido for maintaining wlroots!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New OpenPGP Key</title>
      <link>https://bisco.org/notes/2018-new-openpgp-key/</link>
      <pubDate>Sat, 11 Aug 2018 17:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/2018-new-openpgp-key/</guid>
      <description>&lt;p&gt;After 5 years i thought it would be time for a new OpenPGP key. Also
i wanted to migrate to an offline master key and subkeys that are
stored on an OpenPGP smartcard.&lt;/p&gt;
&lt;p&gt;My old key will continue to be valid for some time, but i prefer all
future correspondence to come to the new one. I would also like this
new key to be integrated into the web of trust.
&lt;a href=&#34;https://bisco.org/notes/2018-new-openpgp-key/index.md.asc&#34;&gt;There is also a plaintext version of this message that is signed by
both keys to certify the transition.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;the old key was:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pub   rsa4096 2013-11-20 [SC] [expires: 2018-09-27]
      CBF53E306528F800E3AA4EAF32C61D34C09C6A34
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And the new key is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pub   rsa4096 2018-08-11 [C] [expires: 2020-08-10]
      C5BC7498F466D885188CB397CB06EA7B78DBE151
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To fetch my new key from a public key server, you can simply do:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gpg --recv-key C5BC7498F466D885188CB397CB06EA7B78DBE151&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you already know my old key, you can now verify that the new key is
signed by the old one:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gpg --check-sigs C5BC7498F466D885188CB397CB06EA7B78DBE151&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you are satisfied that you&amp;rsquo;ve got the right key, and the UIDs match
what you expect, I&amp;rsquo;d appreciate it if you would sign my key:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gpg --sign-key C5BC7498F466D885188CB397CB06EA7B78DBE151&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Lastly, if you could send me these signatures, i would appreciate it.&lt;/p&gt;
&lt;p&gt;Please let me know if there is any trouble, and sorry for the
inconvenience.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Final GSOC 2018 Report</title>
      <link>https://bisco.org/notes/final-gsoc-2018-report/</link>
      <pubDate>Wed, 08 Aug 2018 14:30:43 +0100</pubDate>
      
      <guid>https://bisco.org/notes/final-gsoc-2018-report/</guid>
      <description>&lt;p&gt;This is the final report of my 2018 Google Summer of Code project. It also
serves as my final code submission.&lt;/p&gt;
&lt;h1 id=&#34;short-overview&#34;&gt;Short overview:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Nacho, a web frontend for registering and managing LDAP accounts:
&lt;a href=&#34;https://salsa.debian.org/bisco-guest/nacho&#34;&gt;https://salsa.debian.org/bisco-guest/nacho&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Evaluation of existing SSO solutions
&lt;a href=&#34;https://salsa.debian.org/bisco-guest/sso-evals/&#34;&gt;https://salsa.debian.org/bisco-guest/sso-evals/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add oauth2 authentication to existing Debian service
&lt;a href=&#34;https://salsa.debian.org/bisco-guest/nm.debian.org/tree/ssoauth2&#34;&gt;https://salsa.debian.org/bisco-guest/nm.debian.org/tree/ssoauth2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;description&#34;&gt;Description&lt;/h1&gt;
&lt;p&gt;The main project was &lt;code&gt;nacho&lt;/code&gt;, the web frontend for the guest accounts of the
Debian project. The software is now in a state where it can be used in a
production enviroment and there is already work being done to deploy the
application on Debian infrastructure. It was a lot of fun programming that
software and i learned a lot about Python and Django. My mentors gave me
valuable feedback and pointed me in the right direction in case i had
questions. There are still some ideas or features that can be implemented and
i&amp;rsquo;m sure some feature requests will come up in the future. Those can be tracked
in the &lt;a href=&#34;https://salsa.debian.org/bisco-guest/nacho/issues&#34;&gt;issue tracker in the salsa
repository&lt;/a&gt;. An overview of
the activity in the project, including both commits and issues, can be seen in
the &lt;a href=&#34;https://salsa.debian.org/bisco-guest/nacho/activity&#34;&gt;activity list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The SSO evaluations i did give an overview of existing solutions and will help
in the decision making process. The
&lt;a href=&#34;https://salsa.debian.org/bisco-guest/sso-evals/blob/master/README.md&#34;&gt;README&lt;/a&gt;
in the evaluation repository has a table taht summarizes the findings of the
evaluations.&lt;/p&gt;
&lt;p&gt;The branch of nm.debian.org that implements oauth2 authentication against an
oauth2 provider provides a proof of concept of how the authentication can be
implemented and it can be used to integrate the functionality into other
services.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve learned a lot in the last few month and it was a pleasure to work with
babelouest and formorer. Debian is an interesting project and i plan to keep
on contributing or maybe even intensify the contributions. Maybe i can use
the the oauth2 authentication on nm.debian.org for my own application soon ;)&lt;/p&gt;
&lt;h1 id=&#34;reports&#34;&gt;Reports&lt;/h1&gt;
&lt;p&gt;The list of reports in chronological order from top to bottom:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://bisco.org/notes/application-for-google-summer-of-code-2018/&#34;&gt;Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bisco.org/notes/debian-guest-account-backend-design/&#34;&gt;Backend design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bisco.org/notes/first-gsoc-report/&#34;&gt;First report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bisco.org/notes/second-gsoc-report/&#34;&gt;Second report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bisco.org/notes/third-gsoc-report/&#34;&gt;Third report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bisco.org/notes/fourth-gsoc-report/&#34;&gt;Fourth report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bisco.org/notes/fifth-gsoc-report/&#34;&gt;Fifth report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bisco.org/notes/sixth-gsoc-report/&#34;&gt;Sixth report&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Sixth GSoC Report</title>
      <link>https://bisco.org/notes/sixth-gsoc-report/</link>
      <pubDate>Fri, 27 Jul 2018 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/sixth-gsoc-report/</guid>
      <description>&lt;p&gt;After finishing the the evaluations of the SSO solutions, formorer asked me to
look into integrating one of the solutions into the existing Debian SSO
infrastructure. Sso.debian.org is a Django application that basically provides
a way of creating and managing client certificates. It does not do
authentication itself, but uses the &lt;a href=&#34;https://docs.djangoproject.com/en/dev/howto/auth-remote-user/&#34;&gt;REMOTE_USER authentication
source&lt;/a&gt; of
Django. I tested integration with lemonldap-ng, and after some troubles setting
up the sso.debian.org clone on my infrastructure (thanks to Enrico for pointing
me in the right direction) the authentication using the apaches &lt;code&gt;authnz&lt;/code&gt; module
worked.  To integrate &lt;code&gt;lemonldap-ng&lt;/code&gt; i only had to add a &lt;code&gt;ProxyPass&lt;/code&gt; and a
&lt;code&gt;ProxyPassReverse&lt;/code&gt; directive in the apache config. I tested the setup using
gitlab and it worked.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also added some additional features to &lt;code&gt;nacho&lt;/code&gt;: on the one hand, i&amp;rsquo;ve
added a management command that removes stale temporary accounts that have
never been activated. The idea is to run that command in regular intervals via
cron (or systemd timers). To implement that feature, i basically followed the
howto for &lt;a href=&#34;https://docs.djangoproject.com/en/dev/howto/custom-management-commands/#howto-custom-management-commands&#34;&gt;writing custom django-admin
commands&lt;/a&gt;
from the django manual.  Based on that knowledge i then implemented two other
commands that provide backup and restore functionality. The &lt;code&gt;backup&lt;/code&gt; command
prints the contents of the LDAP database on stdout in
&lt;a href=&#34;https://tools.ietf.org/html/rfc2849&#34;&gt;LDIF&lt;/a&gt; format. The &lt;code&gt;restore&lt;/code&gt; command
expects LDIF on stdin and writes those values to the ldap database. I also did
some cleanup in the codebase and documented the test cases.&lt;/p&gt;
&lt;p&gt;The third big project i looked into was to implement oauth2 authentication for
one of the existing websites that use sso.debian.org. I chose nm.debian.org for
that, because it is based on Django. I used a lot of time to look for existing
modules for Django that implement oauth2 authentication and tesed some of them.
There is for example
&lt;a href=&#34;https://django-allauth.readthedocs.io/en/latest/&#34;&gt;django-allauth&lt;/a&gt; that
provides authentication against a lot of authentication providers. I did manage
to create an addiational authentication provider for Keycloak, but it seemed a
bit overengineered to use such a big application for only one provider. So i
sat down and wrote a small Django app that does oauth2 authentication. As soon
as that worked with a clean Django installation, it took just some small
adjustments to use it for the newmaintainer interface. You can find the branch
&lt;a href=&#34;https://salsa.debian.org/bisco-guest/nm.debian.org/tree/ssoauth2&#34;&gt;on salsa&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fifth GSoC Report</title>
      <link>https://bisco.org/notes/fifth-gsoc-report/</link>
      <pubDate>Fri, 13 Jul 2018 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/fifth-gsoc-report/</guid>
      <description>&lt;p&gt;No shiny screenshots this time ;-)&lt;/p&gt;
&lt;p&gt;In the last two weeks i&amp;rsquo;ve finished evaluating the SSO solutions. I&amp;rsquo;ve added
the evaluation of &amp;lsquo;ipsilon&amp;rsquo;, a python based single sign on solution. I&amp;rsquo;ve also
updated the existing evaluations with a bit more information about their
possibility to work with multiple backends. And i&amp;rsquo;ve added gitlab configuration
snippets for some of the solutions. Formorer asked me to create a tabular
overview of the outcome of the evaluations, so i did that in the
&lt;a href=&#34;https://salsa.debian.org/bisco-guest/sso-evals/blob/master/README.md&#34;&gt;README&lt;/a&gt;
of the corresponding salsa repository. I&amp;rsquo;ve also pushed the code for the test
client application i used to test the SSO solutions.&lt;/p&gt;
&lt;p&gt;This week i used to look into the existing Debian SSO solution that works with
certificates. The idea is not to change it, but to integrate it with the chosen
OAuth2/SAML solution. To test this, i&amp;rsquo;ve pulled the code and set up my own
instance of it. Fortunatly it is a Django application, so i now have some
experience with that. Its not working yet, but i&amp;rsquo;m getting there.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also reevaluated a design desicion i made with &lt;code&gt;nacho&lt;/code&gt; and came to the
same conclusion: that storing the temporary accounts in ldap too is the way to
go. There are also still some small feature requests i want to implement.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fourth GSoC Report</title>
      <link>https://bisco.org/notes/fourth-gsoc-report/</link>
      <pubDate>Fri, 29 Jun 2018 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/fourth-gsoc-report/</guid>
      <description>&lt;p&gt;As announced &lt;a href=&#34;https://bisco.org/notes/third-gsoc-report/&#34;&gt;in the last report&lt;/a&gt;, i started looking
into SSO solutions and evaluated and tested them. At the begining my focus was
on SAML integration, but i soon realized that OAuth2 would be more important.&lt;/p&gt;
&lt;p&gt;I started with installing &lt;a href=&#34;http://lemonldap-ng.org/&#34;&gt;Lemonldap-NG&lt;/a&gt;. LL-NG is a
WebSSO solution writting in perl that uses ModPerl or FastCGI for delivering
Webcontent. There is a Debian package in stable, so the installation was no
problem at all. The configuration was a bit harder, as LL-NG has a complex
architecture with different vhosts.  But after some fiddling i managed to
connect the installation to our test LDAP instance and was able to authenticate
against the LL-NG portal. Then i started to research how to integrate an OAuth2
client. For the tests i had on the one hand a gitlab installation that i tried
to connect to the OAuth2 providers using the
&lt;a href=&#34;https://gitlab.com/satorix/omniauth-oauth2-generic&#34;&gt;omniauth-oauth2-generic&lt;/a&gt;
strategy. To have a bit more fine grained control over the OAuth2 client
configuration i also used &lt;a href=&#34;https://github.com/requests/requests-oauthlib/&#34;&gt;the python
requests-oauthlib&lt;/a&gt; module and
modified the &lt;a href=&#34;https://requests-oauthlib.readthedocs.io/en/latest/examples/real_world_example.html&#34;&gt;web app example from their
documentation&lt;/a&gt;
to my needs.  After some fiddling and a bit of back and forth on the
lemonldap-ng mailinglist i managed both test clients to authenticate against
LL-NG.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/fourth-gsoc-report/02-LLNG-01.png&#34; alt=&#34;Lemonldap-NG Screenshot&#34;&gt;&lt;/p&gt;
&lt;p&gt;The second solution i tested was &lt;a href=&#34;http://www.keycloak.org/&#34;&gt;Keycloak&lt;/a&gt;, an
identity and access management solution written in java by Redhat. There is no
debian package, but nonetheless it was very easy to get it running. It is
enough to install &lt;code&gt;jre-default&lt;/code&gt; from the package repositories and then run the
&lt;code&gt;standalone&lt;/code&gt; script from the extracted keycloak folder. Because keycloak only
listens on localhost and i didn&amp;rsquo;t want to get into configuring the java
webserver stuff, i installed nginx and configured is as a proxy.  In Keycloak
too the first step was to configure the LDAP backend. When i was able to
successfully login using my LDAP credentials, i looked into configuring an
OAuth2 client, which wasn&amp;rsquo;t that hard either.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/fourth-gsoc-report/01-Keycloak-01.png&#34; alt=&#34;Keycloak Screenshot&#34;&gt;&lt;/p&gt;
&lt;p&gt;The third solution i looked into was
&lt;a href=&#34;https://babelouest.github.io/glewlwyd/&#34;&gt;Glewlwyd&lt;/a&gt;, written by babelouest.
There is a Debian package in buster, so i added the buster sources, set up apt
pinning and installed the needed packages. Glewlwyd is a system service that
listens on localhost:4593, so i also used nginx in this case. The configuration
for the LDAP backend is done in the configuration file which is on Debian
&lt;code&gt;/etc/glewlwyd/glewlwyd-debian.conf&lt;/code&gt;.  Glewlwyd provides a webinterface for
managing users and clients and it is possible to store all the values in LDAP.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/fourth-gsoc-report/03-Glewlwyd-01.png&#34; alt=&#34;Keycloak Screenshot&#34;&gt;&lt;/p&gt;
&lt;p&gt;The next steps will be to test the last candidate, which is &lt;code&gt;ipsilon&lt;/code&gt; and also
test all the solutions for some important features, like multiple backends and
exporting of configurable attributes. Last but not least i want to create a
table to have an overview of all the features and drawbacks of the solutions.
All the evaluations are public in &lt;a href=&#34;https://salsa.debian.org/bisco-guest/sso-evals/&#34;&gt;a salsa
repository&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also carried on doing some work on &lt;code&gt;nacho&lt;/code&gt;, though most of the issues that
have to be fixed are rather small. I reguarly stumble upon texts about Python
or Django, like for example the &lt;a href=&#34;https://code.djangoproject.com/wiki/NewbieMistakes&#34;&gt;Django
NewbieMistakes&lt;/a&gt; and try to
read all of them and use that for improving on my work.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Third GSoC Report</title>
      <link>https://bisco.org/notes/third-gsoc-report/</link>
      <pubDate>Fri, 15 Jun 2018 06:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/third-gsoc-report/</guid>
      <description>&lt;p&gt;The last two weeks went by pretty fast, probably also because the last courses
this semester started and i have a lot of additional work to do.&lt;/p&gt;
&lt;p&gt;I closed the last report with writing about the implementation of the test
suite. I&amp;rsquo;ve added a lot more tests since then and there are now around 80 tests
that are run with every commit. Using unit tests that do some basic testing
really makes life a lot easier- next time i start a software project i&amp;rsquo;ll
definitly start early on with writing tests. I&amp;rsquo;ve also read a bit about the
difference of integration and unit tests. A unit test should only test one
specific functionality, so i refactored some of the old tests and made them
more granular.&lt;/p&gt;
&lt;p&gt;I then also looked into coding style checkers and decided to go with
&lt;a href=&#34;https://pypi.org/pypi/flake8&#34;&gt;flake8&lt;/a&gt;. There were a huge pile of coding style
violations in my code, most of them lines that were more than 79 characters.
I&amp;rsquo;ve integrated flake8 in the test suite and removed all the violations. One
more thing about python: i&amp;rsquo;ve read &lt;a href=&#34;https://github.com/arogozhnikov/python3_with_pleasure&#34;&gt;python3 with
pleasure&lt;/a&gt; which gives a
great overview about some of the new features of python3 and i&amp;rsquo;ve made some
notes about stuff i want to integrate (i.e. pathlib)&lt;/p&gt;
&lt;p&gt;Regarding the functionality of nacho i&amp;rsquo;ve added the possibility to delete an
account. SSH keys are now validated on upload and it is possilbe to configure
the key types that are allowed. I initially just checked if the key string
consists of valid base64 encoded data, but that was not really a good solution
so i decided to use &lt;a href=&#34;https://pypi.org/pypi/sshpubkeys&#34;&gt;sshpubkeys&lt;/a&gt; to check the
validity of the keys. Nacho now also checks the profile image before storing it
in the LDAP database- it is possible to configure the image size and list
allowed image types, which is verified using
&lt;a href=&#34;https://github.com/ahupp/python-magic&#34;&gt;python-magic&lt;/a&gt;.
I also made a big change concerning the configuration: all the relevant
configuration options are now moved to a seperate configuration file in json
format, which is parsed when nacho is started. This makes it also a lot easier
to have default values and to let users override them in their local config.
I also updated the documentation and the debian package.&lt;/p&gt;
&lt;p&gt;Now that the issues with nacho are slowly becoming smaller, i&amp;rsquo;ll start to look
into existing SSO solutions that then can be used with the LDAP backend. There
are four solutions i&amp;rsquo;ve on my list at the moment, that are
&lt;a href=&#34;http://www.keycloak.org/&#34;&gt;keycloak&lt;/a&gt;, &lt;a href=&#34;https://pagure.io/ipsilon&#34;&gt;ipsilon&lt;/a&gt;,
&lt;a href=&#34;https://lemonldap-ng.org/documentation/presentation&#34;&gt;lemonldap-ng&lt;/a&gt; and
&lt;a href=&#34;https://github.com/babelouest/glewlwyd&#34;&gt;glewlwyd&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Second GSoC Report</title>
      <link>https://bisco.org/notes/second-gsoc-report/</link>
      <pubDate>Fri, 01 Jun 2018 07:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/second-gsoc-report/</guid>
      <description>&lt;p&gt;A lot has happened since &lt;a href=&#34;https://bisco.org/notes/first-gsoc-report/&#34;&gt;the last report&lt;/a&gt;. The main
change in &lt;code&gt;nacho&lt;/code&gt; was probably the move to integrate
&lt;a href=&#34;https://github.com/django-ldapdb/django-ldapdb/&#34;&gt;django-ldapdb&lt;/a&gt;. This
abstracts a lot of operations one would have to do on the directory using bare
ldap and it also provides the possibility of having the LDAP objects in the
Django admin interface, as those are addressed as Django models.  By using
django-ldapdb i was able to remove around 90% of the self written ldap logic.
The only functionality that still remains where i have to directly use the ldap
library are the password operations. It would be possible to implement these
features with django-ldapdb, but then i would have to integrate password
hashing functionality into nacho &lt;em&gt;and&lt;/em&gt; above all i would have to adjust the
hashing function for every ldap server with a different hashing algorithm
setting. This way the ldap server does the hashing and i won&amp;rsquo;t have to set the
algorighm in two places.&lt;/p&gt;
&lt;p&gt;This led to the next feature i implemented, which was the password reset
functionality. It works as known from most other sites: one enters a username
and gets an email with a password reset link. Related to this is also the
mofification operation of the mail attribute: i wasn&amp;rsquo;t sure if the email
address should be changeable right away or if a new address should be confirmed
with a token sent by mail. We talked about this during our last mentors-student
meeting and both formorer and babelouest said it would be good to have a
confirmation for email addresses. So that was another feature i implemented.&lt;/p&gt;
&lt;p&gt;Two more attribute that weren&amp;rsquo;t part of nacho up until now were SSH Keys and a
profile image. Especially the ssh keys led to a redesign of the profile page,
because there can be multiple ssh keys. So i changed the profile container to
be a bootstrap card and the individual areas are tabs in this card:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://bisco.org/notes/second-gsoc-report/screenshot.png&#34; alt=&#34;Screenshot of the profile page&#34; title=&#34;The profile page&#34;&gt;&lt;/p&gt;
&lt;p&gt;For the image i had to create a special upload form that saves the bytestream
of the file directly to ldap which stores it as base64 encoded data. The display
of the &lt;code&gt;jpegPhot&lt;/code&gt; field is then done via&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=data:image/png;base64,...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This way we don&amp;rsquo;t have to store the image files on the server at all.&lt;/p&gt;
&lt;h2 id=&#34;a-short-note-about-the-ssh-key-schema&#34;&gt;A short note about the ssh key schema&lt;/h2&gt;
&lt;p&gt;We are using &lt;a href=&#34;http://pig.made-it.com/ldap-openssh/openssh-ldap.schema&#34;&gt;this openssh-ldap
schema&lt;/a&gt;. To include
the schema in the slapd installation it to be converted to an ldif file. For
that i had to create a temporary file, lets call it &lt;code&gt;schema_convert.conf&lt;/code&gt; with
the line&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;include /path/to/openssh-ldap.schema
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;using&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo slaptest -f schema_convert.conf -F /tmp/temporaryfolder
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;one gets a folder containing the ldif file in
&lt;code&gt;/tmp/temporaryfolder/cn=config/cn=schema/cn={0}openssh-ldap.ldif&lt;/code&gt;. This file
has to be edited (remove the metadata) and can then be added to ldap using:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ldapadd -Y EXTERNAL -H ldapi:/// -f openssh-ldap.ldif
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;what-else-happend&#34;&gt;What else happend&lt;/h2&gt;
&lt;p&gt;Another big improvement is the admin site. Using &lt;code&gt;django-ldapdb&lt;/code&gt; i have a
model view on selected ldap tree areas and can manage them using the
webinterface. Using the group mapping feature of &lt;code&gt;django-auth-ldap&lt;/code&gt; i was
able to give management permissions to groups that are also stored in ldap.&lt;/p&gt;
&lt;p&gt;I updated the nacho debian package. Now that django-ldapdb is in testing, all
the dependecies can be installed from Debian packages. I started to use the
salsa issue tracker for the issues which makes it a lot easier to keep track of
things to do. I took a whole day to start getting into unit tests and i started
writing some. On day two of the unit test experience i started using the gitlab
continuous integration feature of salsa. Now every commit is being checked
against the test suite. But there are only around 20 tests at the moment and it
only covers registration and login and password reset- i guess there are around
100 test cases for all the other stuff that i still have to write ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mini Debconf in Hamburg</title>
      <link>https://bisco.org/notes/mini-debconf-in-hamburg/</link>
      <pubDate>Wed, 30 May 2018 09:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/mini-debconf-in-hamburg/</guid>
      <description>&lt;p&gt;Last week i attended my very first Debian Conference, the Mini Debconf in
Hamburg. It gave me the opportunity to personally meet one of my gsoc mentors,
formorer, and i&amp;rsquo;ve also met some other folks, both Debian contributors and
people who are not. It was my first time experiencing Hamburg with warm and
sunny weather- i went to Hamburg multiple times in the years when the Chaos
Communication Congress was held there. The first day of my stay i took the time
and looked around the city and was also curious about the state of the congress
center- it looks like they are very thorough with the reconstruction.
&lt;img src=&#34;cch.jpg&#34; alt=&#34;Congress Center Hamburg&#34; title=&#34;A photo of the congress center hamburg&#34;&gt;&lt;/p&gt;
&lt;p&gt;From the Debconf i only attended the conference itself, not the Debcamp part.
There were a couple of interesting talks, one of them was &lt;a href=&#34;https://meetings-archive.debian.net/pub/debian-meetings/2018/miniconf-hamburg/2018-05-19/cadus.webm&#34;&gt;about
CADUS&lt;/a&gt;,
an &lt;a href=&#34;https://www.cadus.org/&#34;&gt;organisation that works in combining technology and humanitarian
aid&lt;/a&gt;. They built a mobile hospital from and old truck
and they are researching and creating other really useful stuff. They also did
a &lt;a href=&#34;https://fahrplan.events.ccc.de/congress/2017/Fahrplan/events/9188.html&#34;&gt;talk at the 34c3 in Leipzig last
year&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After the CADUS talk there was formorers talk about the migration to salsa and
the end of alioth.d.o. He also talked about some interesting features of the
gitlab instance.
Then there was a talk about &amp;ldquo;package security beyond signatures and
reproducible builds&amp;rdquo; which proposed solutions to distribute software with apt
that would help to detect targeted backdoors. Definitly an interesting topic,
but i think i&amp;rsquo;ll have to watch the recording of the talk again to understand
the approach (or do some reading about merkle trees ;)).
Another interesing talk was about the Civil Infrastructure Platform, which aims
to provide support for Linux systems for infrastructure that runs up to 30
years.&lt;/p&gt;
&lt;p&gt;The recordings of the talks are in the &lt;a href=&#34;https://meetings-archive.debian.net/pub/debian-meetings/2018/miniconf-hamburg/&#34;&gt;meeting archive&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>First GSoC Report</title>
      <link>https://bisco.org/notes/first-gsoc-report/</link>
      <pubDate>Mon, 21 May 2018 09:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/first-gsoc-report/</guid>
      <description>&lt;p&gt;To whom it may concern, this is my report over the first few weeks of gsoc
under the umbrella of the Debian project. I&amp;rsquo;m writing this on my way back from
the minidebconf in Hamburg, which was a nice experience, maybe there will be
another post about that ;)&lt;/p&gt;
&lt;p&gt;So, the goal of my GSOC project is to &lt;em&gt;design and implement a new SSO solution&lt;/em&gt;
for Debian. But that only touches one part of the projects deliveries. As you
can read in the description Alexander Wirth originally posted in the Debian
Wiki&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, the project consists of two parts, where the first one is the
design and coding of a new backend and self-service interface for Debian guest
users (this includes the accounts of Debian Maintainers).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It should also allow creating and selfservice for guest users and DMs. Those
users belong into their own backend and should be suffixed with -guest&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So after getting in touch with my two mentors, Alexander (formorer) and Nicolas
(babelouest), we talked a bit about how to communicate and organize meetings;
then i started looking into possible solutions for the guest backend. This is
actually the more time critical part, as the current -guest accounts are stored
on alioth and alioth will be shut down at the end of may. But Alexander assured
that he will maintain the guest user database by hand for the time being, until
the new -guest account solution can go into production.&lt;/p&gt;
&lt;p&gt;Even before the official acceptance for GSOC i thought about how to implement
this and i also talked a bit about that with Alexander. The first decision to
make was to choose a data store for the backend.
LDAP was a candidate but it would also have been possible to use relational
databases. But LDAP is already being used in Debian in the userdir-ldap project
and there is also more support for LDAP from potential existing SSO solutions,
so it was an obvious choice. There second decision to make was to choose a
Webframework for the self service web frontend. I already had some experience
with Ruby and Rails, but there are some Django applications in Debian
ecosystem (i.e. tracker.d.o.) and i wanted to learn something new. Also
i had to do a Python course at the university so wanted to bring the mostly
theoretical knowledge to practical use.&lt;/p&gt;
&lt;p&gt;Alexander asked me to write a design document for the guest-backend, which i
[published a few weeks ago] (/notes/debian-guest-account-backend-design/).
Nicolas gave some feedback on the document right away and Alexander and i
reviewed the design document again this weekend during MiniDebConf which
resulted in some additional requirements for the backend, like the support of
groups.&lt;/p&gt;
&lt;p&gt;In the few weeks after writing the design document, i looked more into the
possibilities of the different ldap-django extensions. There are two ldap
extensions that allow authentication against an ldap server in the debian
archive (&lt;a href=&#34;https://tracker.debian.org/pkg/django-auth-ldap&#34;&gt;django-auth-ldap&lt;/a&gt;
and &lt;a href=&#34;https://tracker.debian.org/pkg/django-python3-ldap&#34;&gt;django-python3-ldap&lt;/a&gt;),
where the former has a slightly better popcon score.
And there is also django-ldapdb, which maps the objects from ldap to django
models; django-ldapdb was not packaged yet, but the day i wanted to create an
ITP, &lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=898750&#34;&gt;#898750&lt;/a&gt; was
created and the package was uploaded a few days ago.
Also i started getting into Django coding itself. I went through most of the
&lt;a href=&#34;https://docs.djangoproject.com/en/2.0/intro/tutorial01/&#34;&gt;Writing your first Django app
tutorial&lt;/a&gt; and started
by writing simple webapps. Also
&lt;a href=&#34;https://simpleisbetterthancomplex.com&#34;&gt;simpleisbetterthancomplex&lt;/a&gt; has a lot of
helpful Django resources.&lt;/p&gt;
&lt;p&gt;I then also started coding the self service web application and had a basic
prototype ready after a week. The prototype allows to register an account,
which will only become active after the email address has been confirmed using
a token. Activated accounts can login and modify their profile, which at the
moment only means changing the password; the next step will be to implement a
password reset feature, implement an admin interface, add some more fields to
the user profile, etc&amp;hellip;&lt;/p&gt;
&lt;p&gt;You can see some screenshots of the prototype below:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;1-login.png&#34; alt=&#34;Screenshot of the login form&#34; title=&#34;A simple login form&#34;&gt;
&lt;img src=&#34;4-signup.png&#34; alt=&#34;Screenshot of the signup form&#34; title=&#34;The signup form&#34;&gt;
&lt;img src=&#34;5-link.png&#34; alt=&#34;Screenshot of the activation link message&#34; title=&#34;An activation link is being sent...&#34;&gt;
&lt;img src=&#34;6-activemail.png&#34; alt=&#34;Screenshot of the activation email&#34; title=&#34;... and the account has to be activated&#34;&gt;
&lt;img src=&#34;8-activedone.png&#34; alt=&#34;Screenshot of the &amp;lsquo;account activated&amp;rsquo; message&#34; title=&#34;After activation of the account...&#34;&gt;
&lt;img src=&#34;10-loggedin.png&#34; alt=&#34;Screenshot of the profile page&#34; title=&#34;... login is possible&#34;&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve named the webapp &amp;lsquo;nacho&amp;rsquo;, you can see the code
&lt;a href=&#34;https://salsa.debian.org/bisco-guest/nacho&#34;&gt;in my salsa repo&lt;/a&gt;.&lt;/p&gt;
&lt;section class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://wiki.debian.org/SummerOfCode2018/Projects#SummerOfCode2018.2FProjects.2FNewDebianSSO.Successor_of_the_Debian_SSO_Service&#34;&gt;https://wiki.debian.org/SummerOfCode2018/Projects#SummerOfCode2018.2FProjects.2FNewDebianSSO.Successor_of_the_Debian_SSO_Service&lt;/a&gt; &lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
    </item>
    
    <item>
      <title>Debian guest-account backend design</title>
      <link>https://bisco.org/notes/debian-guest-account-backend-design/</link>
      <pubDate>Tue, 01 May 2018 19:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/debian-guest-account-backend-design/</guid>
      <description>&lt;h1 id=&#34;design-of-the-debian-sso-guest-backend&#34;&gt;Design of the Debian SSO guest backend&lt;/h1&gt;
&lt;p&gt;The guest backend solution consists of two parts: a database for storing
account data and a frontend for self-management for guest users.
The solution should provide the following functionality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;users should be able to register a guest user account&lt;/li&gt;
&lt;li&gt;existing guest users should be able to change their passwords&lt;/li&gt;
&lt;li&gt;existing guest users should be able to change their profile information&lt;/li&gt;
&lt;li&gt;existing guest users should be able to reset lost or forgotten
passwords&lt;/li&gt;
&lt;li&gt;admins should be able to manage guest user accounts in case of
malfunctions&lt;/li&gt;
&lt;li&gt;the current and any future SSO service should be able to authenticate
users against the guest backend&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;backend-database&#34;&gt;Backend-Database&lt;/h1&gt;
&lt;p&gt;Because the existing Debian SSO already uses LDAP (Leightweight Directory
Access Protocol&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;) to authenticate Debian Developers and because LDAP is more
or less a standard for directory services, it stands to reason to also use LDAP
as a database backend for storage of user accounts.&lt;/p&gt;
&lt;p&gt;LDAP stores data in a Tree using objects with attributes and values. The set of
attributes are defined in the objectclasses the object itself has as attributes.
An LDAP object is uniquely identified by its Distinguished Name, which can be
described as the path to the object from the databases root entry.&lt;/p&gt;
&lt;h2 id=&#34;tree&#34;&gt;Tree&lt;/h2&gt;
&lt;p&gt;The directory structure of the backend could be very simple- as there are only
accounts stored in the database and no groups or addressbooks (which is what
ldap is used for often).&lt;/p&gt;
&lt;p&gt;The Domain Componenet of the LDAP tree should reflect the infrastructure it
is running on, i.e. &lt;em&gt;dc=guestldap,dc=debian,dc=org&lt;/em&gt; if hosted on Debian infra
or &lt;em&gt;dc=guestldap,dc=debian,dc=net&lt;/em&gt; if hosed somewhere else.
The container for the accounts should follow the best practice and be called
&lt;em&gt;ou=people&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;accounts&#34;&gt;Accounts&lt;/h2&gt;
&lt;p&gt;A guest accounts basically consists of a username and a password hash. In LDAP
there are various objectclasses that provide these attributes, like
&lt;strong&gt;posixAccount&lt;/strong&gt; or &lt;strong&gt;shadowAccount&lt;/strong&gt;. Both are described in rfc2307&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.
Every &lt;strong&gt;objectClass&lt;/strong&gt; has attibutes the object &lt;strong&gt;MUST&lt;/strong&gt; have and attributes it
&lt;strong&gt;MAY&lt;/strong&gt; have. For our usecase the objectclass &lt;strong&gt;shadowAccounts&lt;/strong&gt; is a better
fit, because &lt;strong&gt;posixAccount&lt;/strong&gt; has multiple attibutes we would have to store
that are not useful in our setup (i.e. &lt;em&gt;uid&lt;/em&gt;, &lt;em&gt;gid&lt;/em&gt;, &lt;em&gt;homeDirectory&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;shadowAccount&lt;/strong&gt; objectclass has the following definition&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;objectClasses: ( 1.3.6.1.1.1.2.1 NAME &#39;shadowAccount&#39;
  DESC &#39;Additional attributes for shadow passwords&#39;
  SUP top AUXILIARY MUST uid MAY ( userPassword $ shadowLastChange
  $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive
  $ shadowExpire $ shadowFlag $ description ) )
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So by using this objectclass we have to only use the uid and it also
provides the attribute &lt;strong&gt;userPassword&lt;/strong&gt; for storing the password hash of the
users password.&lt;/p&gt;
&lt;h3 id=&#34;account-reset&#34;&gt;Account reset&lt;/h3&gt;
&lt;p&gt;The requirements at the beginning of this document also specify that the user
should be able to reset the password for their account. This means we have to
store some kind of account reset information. It is popular to use an email
address for these kind of situations. As apparent from the objectclass defintion
above, the shadowAccount objectclass does not provide an email field. Thus we
have to include another objectclass in the guest account entries. There are
multiple objectclasses that provide an email attribute. One often used objectclass
is &lt;strong&gt;inetOrgPerson&lt;/strong&gt;, which is defined in rfc2798&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; objectclass ( 2.16.840.1.113730.3.2.2
   NAME &#39;inetOrgPerson&#39;
   DESC &#39;RFC2798: Internet Organizational Person&#39;
   SUP organizationalPerson
   STRUCTURAL
   MAY ( audio $ businessCategory $ carLicense $ departmentNumber $
    displayName $ employeeNumber $ employeeType $ givenName $
    homePhone $ homePostalAddress $ initials $ jpegPhoto $
    labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $
    roomNumber $ secretary $ uid $ userCertificate $
    x500uniqueIdentifier $ preferredLanguage $
    userSMIMECertificate $ userPKCS12 )
   )  
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;inetOrgPerson&lt;/strong&gt; provides the &lt;strong&gt;mail&lt;/strong&gt; attribute. The objectclass has no &lt;strong&gt;MUST&lt;/strong&gt;
attributes, but it is derived from &lt;strong&gt;organisationalPerson&lt;/strong&gt; which is itself derived
from person, which has the attributes &lt;strong&gt;cn&lt;/strong&gt; (commonName) and &lt;strong&gt;sn&lt;/strong&gt; (surname) as &lt;strong&gt;MUST&lt;/strong&gt;
attributes.&lt;/p&gt;
&lt;p&gt;In conclusion, a guest user entry would have to have the following entries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;uid&lt;/li&gt;
&lt;li&gt;userPassword&lt;/li&gt;
&lt;li&gt;cn&lt;/li&gt;
&lt;li&gt;sn&lt;/li&gt;
&lt;li&gt;mail&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;security-considerations&#34;&gt;Security considerations&lt;/h2&gt;
&lt;p&gt;The ldap server should not allow anonymous bind. The password hash in the
userPassword attribute should use a current hashing algorithm. OpenLDAP
provides built in support for MD5, MD5 salted, SHA-1 and SHA-1 salted, which
are all not recommended anymore. There is the possibilty to pass hashing and
verification to the operating systems crypt&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; function though. In linux
the crypt function can use different hashing schemes. The hashing scheme used
for the password hash in prepended to the password hash and forms a PHC string
as defined in the PHC string format&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;.
(I&amp;rsquo;ve asked DSA for information about preferred hashing algorithms on Debian
systems, but got no answer back.)&lt;/p&gt;
&lt;h1 id=&#34;frontend&#34;&gt;Frontend&lt;/h1&gt;
&lt;p&gt;As described in the preamble, users should be able to register an account and be
able to do basic self service, like change the password and reset the password
in case it gets lost. Also there should be an admin interface for user management.&lt;/p&gt;
&lt;p&gt;Most users are accustomed to do such tasks via a webinterface, which is also the
most common solution. There are multiple techonolgies out there that could help
in writing such a webinterface- the most common solutions in the Debian project
are perl scripts and Django&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt; based webprojects (like tracker.d.o).&lt;/p&gt;
&lt;p&gt;Django is a web framework that is based on the Model-View-Controller pattern. It
provides the building blocks to easily create basic Webapplications. Moreover it
comes with an integrated admin interface and user and group models.&lt;/p&gt;
&lt;p&gt;Djangos default database backends include MySQL, sqlite and other relational
databases, but not LDAP. There are two approaches to use Django with LDAP:&lt;/p&gt;
&lt;p&gt;It is possible to use Django plugins for authenticating against an LDAP database (like
python-django-auth-ldap or python-django-python3-ldap).
The problem with these plugins is, that they are only for authentication, which
means that any write operations on the LDAP Database would have to be programmed
by hand. The upside is, that this approach provides a more granular control on
the permissions the Django application needs for working with the LDAP Backend.&lt;/p&gt;
&lt;p&gt;The second approach would be to use django-ldapdb&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt;, which uses LDAP
as a data storage backend. The benefit of this approach is a better integration
in the Django framework (i.e. the user model could be reused which makes it
easily accessible in the Django admin console). The downside is, that the Django
application need read and write access to the whole &lt;strong&gt;ou=people&lt;/strong&gt; subtree, to
be able to perform its tasks. django-ldapdb is not packaged for Debian yet.&lt;/p&gt;
&lt;h1 id=&#34;webinterface-and-backend-database&#34;&gt;Webinterface and Backend-Database&lt;/h1&gt;
&lt;p&gt;The Webinterface and the LDAP Database can basically run on the same server, but
the services can also be distributed to to servers. Regardless of the servers,
the Webinterface should access the LDAP Database via an encrypted channel (ldaps).&lt;/p&gt;
&lt;section class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc4511&#34;&gt;https://tools.ietf.org/html/rfc4511&lt;/a&gt; &lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc2307&#34;&gt;https://tools.ietf.org/html/rfc2307&lt;/a&gt; &lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;http://www.zytrax.com/books/ldap/ch3/&#34;&gt;http://www.zytrax.com/books/ldap/ch3/&lt;/a&gt; &lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc2798&#34;&gt;https://tools.ietf.org/html/rfc2798&lt;/a&gt; &lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://manpages.debian.org/stretch/manpages-dev/crypt.3.en.html&#34;&gt;https://manpages.debian.org/stretch/manpages-dev/crypt.3.en.html&lt;/a&gt; &lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/P-H-C/phc-string-format/blob/master/phc-sf-spec.md&#34;&gt;https://github.com/P-H-C/phc-string-format/blob/master/phc-sf-spec.md&lt;/a&gt; &lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:7&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.djangoproject.com/&#34;&gt;https://www.djangoproject.com/&lt;/a&gt; &lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:8&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/django-ldapdb/django-ldapdb/&#34;&gt;https://github.com/django-ldapdb/django-ldapdb/&lt;/a&gt; &lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
    </item>
    
    <item>
      <title>Application for Google Summer of Code 2018</title>
      <link>https://bisco.org/notes/application-for-google-summer-of-code-2018/</link>
      <pubDate>Fri, 27 Apr 2018 17:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/application-for-google-summer-of-code-2018/</guid>
      <description>&lt;p&gt;&lt;em&gt;To Whom It May Concern&lt;/em&gt;, this is my student application for this years
google summer of code for the debian SSO project- i removed the boring
parts about myself ;)&lt;/p&gt;
&lt;h1 id=&#34;student-application&#34;&gt;Student Application&lt;/h1&gt;
&lt;h2 id=&#34;description-of-the-project&#34;&gt;Description of the Project&lt;/h2&gt;
&lt;h3 id=&#34;status-quo&#34;&gt;Status Quo&lt;/h3&gt;
&lt;p&gt;For some time now, the Debian project has a single sign on (SSO)
solution&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; that users can use to authenticate against on
tracker.debian.org, nm.debian.org, contributors.debian.org and
paste.debian.net. The SSO solution&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; uses client browser certificates
and is maintained by Enrico Zini (&lt;a href=&#34;mailto:enrico@debian.org&#34;&gt;enrico@debian.org&lt;/a&gt;). It does not bring its own
user database, but forwards authentication to &lt;strong&gt;mod_ldap&lt;/strong&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;. There
are two authentication backends, ldaps://db.debian.org, which is the main
debian developers database, and ldaps://alioth.debian.org. Alioth.debian.org
was/is a FusionForge installation, which acted as the main code management
system for the debian project. And in connection with sso.debian.org it acted
as a backend for &amp;lsquo;guests&amp;rsquo; and Debian Maintainers. Alioth was replaced by
salsa.debian.org, which is a gitlab installation that went live in december
2017 and left beta in the beginning of 2018. But salsa.debian.org does not
provide an authentication backend for sso.debian.org, which means, as soon as
alioth.debian.org will be gone, there is one backend missing.
Sso.debian.org is also only a single sign on solution, but not a user
management solution. There is no way for users to reset their password or to
delete their account. Another interesting feature would be to provide an
interface to manage SSH or OpenPGP keys.
And last but not least, sso.debian.org only provides an SSO solution based on
certificates. There are other technologies like Oauth2 or SAML, that are more
widespread and integrated in wide range of products. Some solutions have been
mentioned in a discussion about the sso.debian.org service on debian-devel in
August last year&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;. There is also a wiki page&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; collecting
facts about the SSO service and listing some ideas for a makeover.&lt;/p&gt;
&lt;h3 id=&#34;project-goal--devilerables&#34;&gt;Project Goal / Devilerables&lt;/h3&gt;
&lt;p&gt;As described above, there are two main tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sso.debian.org frontend: for one there is the expansion or replacement of
sso.debian.org with Oauth2 and/or SAML. There have been some proposals on
debian-devel about this topic, whic will have to be tested. If there is no
suitable solution the existing sso.debian.org solution has to be extended
with additional authentication mechanism or a new single sing on solution has
to be implemented.&lt;/li&gt;
&lt;li&gt;sso.debian.org backend: the second task is the design, development and
implementation of the guest-backend of sso.debian.org. This platform should
provide means to manage one&amp;rsquo;s own account data, reset a password, manage keys
for OpenPGP or SSH and delete an account. As with the sso solution, there
will be one part research in existing solutions as well as development of
an own solution and subsequently the design and development of the
solution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any Work, be it research or be it programming tasks will be documented and
published in git. If it turns out that it would be practical to spread the
work over multiple repositories, that won&amp;rsquo;t be a problem (thats what
submodules are for). To accompany the work there can be regular written by
mail and/or blog post.&lt;/p&gt;
&lt;h3 id=&#34;rough-timeline&#34;&gt;Rough Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;April 23 - Mai 14:
Get to know the existing sso solution as well as the userdir-ldap system that
the Debian project uses to manage the debian developer accounts &lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;.
Read and test different SSO solutions. Talk to DSA about requirements/wishes
for the SSO platform as well as possible Test-VMs. Maybe talk to package
maintainers of possible solutions about their relationship with upstream
and upstreams responsivness. Compose an implementation plan, devide in two
steps and write an email to debian-devel about it, asking for input.
From May 3rd to May 5th there will be the Vienna Linux Weeks which would be
interesting- also to get in contact with Debian contributors. But there will
also be an big exam on May 4th. It&amp;rsquo;s not clear yet if that leaves time for
attending the Linux Weeks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;May 14 - June 11:
If time permits, go to Mini-DebConf in Hamburg, which will happen from May
16-20 to do some community bonding and talk over some ideas.
Start with step one with designing the LDAP database for the backend and at the
same time start implementing the chosen SSO solution on a test server. The goal
to have basic prototypes for both the backend and the frontend before June 11.
Give regular updates to mentors about progress and/or obstacles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;June 11 16:00 UTC
Mentors and students can begin submitting Phase 1 evaluations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;June 15 16:00 UTC
Phase 1 Evaluation deadline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;June 15 - July 9:
Start with step 2: implement a webinterface for the management of the backend.
Refine the existing prototypes; find and remove bugs, check deliverables.
Create a test application that authenticates against the chosen SSO solution or
even propose a patch for an existing debian service to make that service
authenticate against the new solution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;July 9 16:00 UTC
Mentors and students can begin submitting Phase 2 evaluations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;July 13 16:00 UTC
Phase 2 Evaluation deadline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;July 13 - August 4
Bugfixing, testing, puppetize existing setup; report to debian-devel about the
project status; Start writing down future features;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;August 6 - 14 16:00 UTC
Final week: Students submit their final work product and their final mentor
evaluation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;section class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://anonscm.debian.org/cgit/debian-sso/debian-sso.git/&#34;&gt;https://anonscm.debian.org/cgit/debian-sso/debian-sso.git/&lt;/a&gt; &lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://sso.debian.org/&#34;&gt;https://sso.debian.org/&lt;/a&gt; &lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://httpd.apache.org/docs/2.4/mod/mod_ldap.html&#34;&gt;https://httpd.apache.org/docs/2.4/mod/mod_ldap.html&lt;/a&gt; &lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://lists.debian.org/msgid-search/20170820161607.GP21385@gpm.stappers.nl&#34;&gt;https://lists.debian.org/msgid-search/20170820161607.GP21385@gpm.stappers.nl&lt;/a&gt; &lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://wiki.debian.org/Services/DebianSingleSignOn&#34;&gt;https://wiki.debian.org/Services/DebianSingleSignOn&lt;/a&gt; &lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://salsa.debian.org/dsa-team/mirror/userdir-ldap&#34;&gt;https://salsa.debian.org/dsa-team/mirror/userdir-ldap&lt;/a&gt; &lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
    </item>
    
    <item>
      <title>Coreboot on the x230</title>
      <link>https://bisco.org/notes/coreboot-on-the-x230/</link>
      <pubDate>Fri, 16 Mar 2018 19:28:51 +0100</pubDate>
      
      <guid>https://bisco.org/notes/coreboot-on-the-x230/</guid>
      <description>&lt;p&gt;After living with my old coreboot installation for more than 18 month, i recently decided to build a new image and flash it.
So i downloaded a coreboot 4.7 archive, extracted it and started building. I wanted a coreboot image with grub as a payload,
but this time i didn&amp;rsquo;t want to build the grub payload myself, but let coreboot do the dirty work. To these are the changes
i made to the default coreboot config:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Mainboard vendor (Lenovo)
Mainboard model (ThinkPad X230)
ROM chip size (4096 KB (4 MB))
Add a payload (GRUB2)  ---&amp;gt;
GRUB2 version (2.02)  ---&amp;gt;
(cryptodisk luks lvm gcry_rijndael gcry_sha256 usbserial_ftdi usbserial_pl2303) Extra modules to include in GRUB image
Include GRUB2 runtime config file into ROM image
(grub.cfg) Path of mygrub.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and this is the corresponding mygrub.cfg file- it is based on the
&lt;a href=&#34;https://notabug.org/libreboot/libreboot/src/master/resources/grub/config/menuentries/common.cfg&#34;&gt;common.cfg grub config from the libreboot project&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function try_isolinux_config {
	set root=&amp;quot;${1}&amp;quot;
	for dir in &#39;&#39; /boot; do
		if [ -f &amp;quot;${dir}&amp;quot;/isolinux/isolinux.cfg ]; then
			syslinux_configfile -i &amp;quot;${dir}&amp;quot;/isolinux/isolinux.cfg
		elif [ -f &amp;quot;${dir}&amp;quot;/syslinux/syslinux.cfg ]; then
			syslinux_configfile -s &amp;quot;${dir}&amp;quot;/syslinux/syslinux.cfg
		fi
	done
}
function search_isolinux {
	for i in 0 1; do
		# raw devices
		try_isolinux_config &amp;quot;(${1}${i})&amp;quot;
		for part in 1 2 3 4 5; do
			# MBR/GPT partitions
			try_isolinux_config &amp;quot;(${1}${i},${part})&amp;quot;
		done
	done
}

function decrypt {
        insmod luks
        insmod cryptodisk
        cryptomount (ahci0,msdos1)
        insmod lvm
}

menuentry &#39;Load Operating System (incl. fully encrypted disks)  [l]&#39; --hotkey=&#39;l&#39; {
        decrypt
        if [ -f (lvm/vg--x230-root)/boot/grub.cfg ] ; then
                root=(lvm/vg--x230-root)
                configfile /boot/grub.cfg
        fi
}

menuentry &#39;Debian GNU/Linux [d]&#39; --hotkey=&#39;d&#39; {
        decrypt
        root=(lvm/vg--x230-root)
        linux /vmlinuz
        initrd /initrd.img
}

menuentry &#39;Debian GNU/Linux Old [o]&#39; --hotkey=&#39;o&#39; {
        decrypt
        root=(lvm/vg--x230-root)
        linux /vmlinuz.old
        initrd /initrd.img.old
}

menuentry &#39;Search ISOLINUX menu (AHCI)  [a]&#39; --hotkey=&#39;a&#39; {
	search_isolinux ahci
}
menuentry &#39;Search ISOLINUX menu (USB)  [u]&#39; --hotkey=&#39;u&#39; {
	search_isolinux usb
}
menuentry &#39;Search ISOLINUX menu (CD/DVD)  [c]&#39; --hotkey=&#39;c&#39; {
	insmod ata
	for dev in ata0 ata1 ata2 ata3 ahci1; do
		try_isolinux_config &amp;quot;(${dev})&amp;quot;
	done
}
menuentry &#39;Poweroff  [p]&#39; --hotkey=&#39;p&#39; {
	halt
}
menuentry &#39;Reboot  [r]&#39; --hotkey=&#39;r&#39; {
	reboot
}
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
  </channel>
</rss>
