<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[MaSt]]></title><description><![CDATA[Travel, Technology and Thoughts]]></description><link>https://blog.stabel.family/</link><image><url>https://blog.stabel.family/favicon.png</url><title>MaSt</title><link>https://blog.stabel.family/</link></image><generator>Ghost 4.13</generator><lastBuildDate>Tue, 14 Apr 2026 18:39:59 GMT</lastBuildDate><atom:link href="https://blog.stabel.family/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[New Bike]]></title><description><![CDATA[<p>Since my old bike got stolen, my Christmas present would definitely by a new one. Since I like racing bikes and I don&apos;t have the budget for a fancy 10k carbon one I once again got a vintage racing bike.</p><p>It took me a while to find a</p>]]></description><link>https://blog.stabel.family/new-bike/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b412</guid><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Thu, 24 Dec 2020 21:17:12 GMT</pubDate><content:encoded><![CDATA[<p>Since my old bike got stolen, my Christmas present would definitely by a new one. Since I like racing bikes and I don&apos;t have the budget for a fancy 10k carbon one I once again got a vintage racing bike.</p><p>It took me a while to find a used one for my size. Since I have quite long legs I wanted a frame height of at least 62cm. Unfortunately most of the bikes you find are more like 59cm/60cm. The one I finally found is 64cm so almost too big even for me. It&apos;s a black/white/pink Winora bike from ~1985 in very good condition, everything original. I&apos;m really happy with it.</p><p>After a good clean with the help of YouTube (specifically <a href="https://www.youtube.com/watch?v=5ak4AzlUz5Q">GCN</a> and <a href="https://www.youtube.com/watch?v=B2sKhSDrugE">Park Tools</a>) I noticed that one of the Pedals is hard to turn. Since this was a &quot;new bike&quot; I decided to give servicing them a try. Again <a href="https://www.youtube.com/watch?v=YmPkYMPVqQU">GCN</a> and <a href="https://www.youtube.com/watch?v=LFbSBG7jMzY">Park Tools</a> to the rescue for removal and also for the servicing itself (<a href="https://www.youtube.com/watch?v=LnVBoFjD-Fk">GCN</a> and <a href="https://www.youtube.com/watch?v=bVmSrsnVUGI">Park Tools inkl. adjustent</a> of Shimano SPD pedals).</p><p>Since I couldn&apos;t get the Pedals off at first here a few tips to get them off I gathered on various internet forums:</p><ul><li>Heat (Heat gun, etc. preferably applied to the crank)</li><li>Ice spray (if available)</li><li>Let it soak in WD-40 (or similar)</li><li>Phosphoric Acid (Coke/Pepsi apparently, didn&apos;t dare to coat it in sugar water though)</li><li>Longer/Special Pedal Wrench</li><li>Hammer on normal wrench</li><li>Percussion drill (to loosen the corrosion)</li><li>Hammer on crank to loosen the corrosion</li><li>Tenison belt between wrench and crank arm</li></ul><p>Remember, that the left side (aka non drive train side) is the exact opposite of the &quot;normal&quot; direction. Always open the screws pushing the wrench towards the back of the bike. I was able to open mine after soaking it in WD-40 over night and some light-medium hits with a hammer on my normal 15mm wrench. </p><p>Don&apos;t forget to apply some Copperpaste/Anti-Seize or grease on the pedals before screwing them back in!</p>]]></content:encoded></item><item><title><![CDATA[Restic on Synology]]></title><description><![CDATA[<p>Ever wondered how to backup your NAS so you still have your data when the house burns down? Well, look no further! <a href="restic.net">Restic </a>is an awesome deduplicating backup program (like <a href="https://www.borgbackup.org/">borgbackup</a>) with the advantage that it doesn&apos;t need a special server. Any remote is fine and it supports</p>]]></description><link>https://blog.stabel.family/restic-on-synology/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b410</guid><category><![CDATA[English]]></category><category><![CDATA[NAS]]></category><category><![CDATA[Synology]]></category><category><![CDATA[guide]]></category><category><![CDATA[Restic]]></category><category><![CDATA[Backup]]></category><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Sun, 14 Jun 2020 00:33:07 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1562414962-a6b4f966070d?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1562414962-a6b4f966070d?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Restic on Synology"><p>Ever wondered how to backup your NAS so you still have your data when the house burns down? Well, look no further! <a href="restic.net">Restic </a>is an awesome deduplicating backup program (like <a href="https://www.borgbackup.org/">borgbackup</a>) with the advantage that it doesn&apos;t need a special server. Any remote is fine and it supports <a href="https://rclone.org/">rclone</a> out of the box. The disadvantage compared to borgbackup is the lack of compression.</p><p>In this guide I&apos;ll setup a restic docker container on my Synology NAS with an rclone backend for monthly backups, keeping 12 versions. First off, you need to choose which server to backup your data to. I chose <a href="https://www.jottacloud.com/en/">JottaCloud </a>because they&apos;re based in Europe (feels better privacy wise, even though the data will be encrypted) and they&apos;re quite affordable.</p><p>On to the setup: If you haven&apos;t installed the docker package, do so now. Then login via SSH with the <code>admin</code> account and promote yourself to root with <code>sudo su</code>. Now install rclone locally on your NAS with the following command:</p><pre><code class="language-bash">curl https://rclone.org/install.sh | sudo bash</code></pre><p>Rclone is not needed on the NAS itself for the docker image to function properly, but we need it to setup the configuration. To configure rclone with your backend of choice type <code>rclone config --config /volume1/docker/rclone.conf</code> and go through the setup. The <a href="https://rclone.org/docs/">rclone docs</a> have more information on every backend available. For JottaCloud it will look something like the following (adapted from the rclone docs). Don&apos;t forget to generate your login token on the <a href="https://www.jottacloud.com/web/secure">web client</a>. Choose the <code>Jotta</code> device and <code>Archive</code> mountpoint:</p><pre><code class="language-bash">No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q&gt; n
name&gt; jotta
Type of storage to configure.
Enter a string value. Press Enter for the default (&quot;&quot;).
Choose a number from below, or type in your own value
[snip]
XX / Jottacloud
   \ &quot;jottacloud&quot;
[snip]
Storage&gt; jottacloud
** See help for jottacloud backend at: https://rclone.org/jottacloud/ **

Edit advanced config? (y/n)
y) Yes
n) No
y/n&gt; n
Remote config

Generate a personal login token here: https://www.jottacloud.com/web/secure
Login Token&gt; &lt;your token here&gt;

Do you want to use a non standard device/mountpoint e.g. for accessing files uploaded using the official Jottacloud client?

y) Yes
n) No
y/n&gt; y
Please select the device to use. Normally this will be Jotta
Choose a number from below, or type in an existing value
 1 &gt; DESKTOP-3H31129
 2 &gt; fla1
 3 &gt; Jotta
Devices&gt; 3
Please select the mountpoint to user. Normally this will be Archive
Choose a number from below, or type in an existing value
 1 &gt; Archive
 2 &gt; Links
 3 &gt; Sync
 
Mountpoints&gt; 1
--------------------
[jotta]
type = jottacloud
user = 0xC4KE@gmail.com
token = {........}
device = Jotta
mountpoint = Archive
configVersion = 1
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d&gt; y</code></pre><p>This will create a configuration in a the <code>docker</code> shared folder that can be accessed by the containers. To create the docker container running restic we&apos;ll be using the <code>lobaro/restic-backup-docker:latest</code> image. If it is not available for your architecture you might need to build it yourself first. Just create a folder named <code>restic</code> in your home folder and create a <code>docker-compose.yml</code> with your configuration inside. I do this, because the compose files themselves can be easily backed up. Here&apos;s mine:</p><pre><code class="language-docker-compose.yml">version: &apos;3&apos;

services:
  restic:
    image: lobaro/restic-backup-docker:latest
    hostname: nas
    restart: always
    privileged: true
    volumes:
      - type: bind
        source: /volume1/homes
        target: /data/homes
        read_only: true
      - type: bind
        source: /volume1/docker/nextcloud
        target: /data/nextcloud
        read_only: true
        # ...
      - /volume1/docker/rclone.conf:/root/.config/rclone/rclone.conf
    environment:
      - RESTIC_REPOSITORY=rclone:jotta:backup
      - RESTIC_PASSWORD=SecurePassWordResticUsesForEncryption
      - BACKUP_CRON=30 0 3 * * # Backup on the 3rd of every month at 0h30
      - RESTIC_FORGET_ARGS=--prune --keep-last 12
      - RESTIC_JOB_ARGS=
      - MAILX_ARGS=-r &apos;nas@mydomain.tld&apos; -S smtp=&apos;smtp.mymailserver.tld:587&apos; -S smtp-use-starttls -S smtp-auth-user=&apos;nas@mydomain.tld&apos; -S smtp-auth-password=&apos;SMTPsendPassword&apos; &apos;nas@mydomain.tld&apos;</code></pre><p>Again, for more options see <code><a href="https://github.com/lobaro/restic-backup-docker">lobaro/restic-backup-docker</a></code> on Github. Notice the inclusion of the <code>rclone.conf</code> under <code>volumes</code> and the <code>RESTIC_REPOSITORY</code> environment variable with <code>rclone:jotta:backup</code> configuring restic to use the rclone backend with the target <code>jotta</code> we configured before and the <code>backup</code> repository, that will be created automatically on the first run.</p><p>Now all you need to do is run <code>docker-compose up -d</code> to start the container. If you want to start a backup run manually, you can use the following command inside the folder with the <code>docker-compose.yml</code> file:</p><pre><code class="language-bash">docker-compose exec -d restic /bin/backup</code></pre><p>Feel free to drop me an email anytime at blog@stabel.family if you have any questions, suggestions or feedback.</p>]]></content:encoded></item><item><title><![CDATA[日記？]]></title><description><![CDATA[<p>&#x50D5;&#x306F;&#x706B;&#x66DC;&#x65E5;&#x3001;4&#x6708;21&#x65E5;&#x304B;&#x3089;&#x6771;&#x4EAC;&#x5927;&#x5B66;&#x3067;&#x307E;&#x305F;&#x65E5;&#x672C;&#x8A9E;&#x3092;&#x52C9;&#x5F37;&#x3057;&#x59CB;&#x3081;&#x307E;&#x3057;&#x305F;&#x3002;&#x3060;&#x304B;&#x3089;&#x3001;&#x6587;&#x6CD5;&#x3092;&#x7DF4;&#x7FD2;&#x306E;&#x305F;&#x3081;&#x306B;&#x6BCE;&#x65E5;&#x3058;&#x3083;&#x306A;</p>]]></description><link>https://blog.stabel.family/ri-ji/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b40f</guid><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Thu, 23 Apr 2020 09:19:54 GMT</pubDate><content:encoded><![CDATA[<p>&#x50D5;&#x306F;&#x706B;&#x66DC;&#x65E5;&#x3001;4&#x6708;21&#x65E5;&#x304B;&#x3089;&#x6771;&#x4EAC;&#x5927;&#x5B66;&#x3067;&#x307E;&#x305F;&#x65E5;&#x672C;&#x8A9E;&#x3092;&#x52C9;&#x5F37;&#x3057;&#x59CB;&#x3081;&#x307E;&#x3057;&#x305F;&#x3002;&#x3060;&#x304B;&#x3089;&#x3001;&#x6587;&#x6CD5;&#x3092;&#x7DF4;&#x7FD2;&#x306E;&#x305F;&#x3081;&#x306B;&#x6BCE;&#x65E5;&#x3058;&#x3083;&#x306A;&#x304F;&#x3066;&#x3001;&#x6BCE;&#x9031;&#x4E8C;&#x56DE;&#x3050;&#x3089;&#x3044;&#x65E5;&#x8A18;&#x3092;&#x66F8;&#x3053;&#x3046;&#x3068;&#x601D;&#x3063;&#x305F;&#x3093;&#x3067;&#x3059;&#x3002;&#x3058;&#x3083;&#x3001;&#x65B0;&#x3057;&#x3044;&#x6587;&#x6CD5;&#x3092;&#x4F7F;&#x3044;&#x59CB;&#x3081;&#x307E;&#x3057;&#x3087;&#x3046;&#xFF01;&#xFF08;&#x6C17;&#x3065;&#x3044;&#x3066;&#x305F;&#x306E;&#x304B;&#xFF1F;&#xFF09;</p><p>&#x6628;&#x65E5;&#x3001;&#x6771;&#x4EAC;&#x5927;&#x5B66;&#x306E;Zoom&#x306E;&#x30AA;&#x30F3;&#x30E9;&#x30A4;&#x30F3;&#x6388;&#x696D;&#x3092;&#x53D7;&#x3051;&#x308B;&#x3068;&#x3001;&#x30C9;&#x30A4;&#x30C4;&#x4EBA;&#x3092;&#x898B;&#x305F;&#x3002;&#x305D;&#x306E;&#x5F8C;&#x3001;&#x5BBF;&#x984C;&#x3092;&#x3059;&#x308B;&#x4EE3;&#x308F;&#x308A;&#x306B;&#x3061;&#x3087;&#x3063;&#x3068;&#x663C;&#x5BDD;&#x3092;&#x3057;&#x3066;&#x30DE;&#x30B9;&#x30AF;&#x3092;&#x8CB7;&#x3044;&#x306B;&#x884C;&#x3063;&#x305F;&#x3002;&#x85AC;&#x5C4B;&#x306B;&#x5165;&#x308B;&#x3068;&#x30A4;&#x30C1;&#x30B4;&#x304C;&#x58F2;&#x3089;&#x308C;&#x305F;&#x3002;&#x5E97;&#x3092;&#x9593;&#x9055;&#x3044;&#x307E;&#x3057;&#x305F;&#x306D;&#x3002;</p><h2 id="-">&#x706B;&#x66DC;&#x65E5;</h2><p>V&#xFF70; &#x307E;&#x3059;&#x300C;&#xFF5E;&#x59CB;&#x3081;&#x308B;&#x300D;&#x3001;&#x300C;&#xFF5E;&#x7D42;&#x308F;&#x308B;&#x300D;&#x3001;&#x300C;&#xFF5E;&#x7D9A;&#x3051;&#x308B;&#x300D;&#x3002;&#x200C;&#x200C;&#x200C;&#x200C;&#x306F;&#x3063;&#x304D;&#x308A;&#x306B;&#x8A00;&#x3046;&#x3068;&#x304D;&#x306B;&#x4F7F;&#x3046;&#x3002;&#x200C;&#x200C;&#x4F8B;&#xFF1A;&#x6388;&#x696D;&#x3092;&#x53C2;&#x52A0;&#x3057;&#x7D42;&#x308F;&#x3063;&#x3066;&#x304B;&#x3089;&#x4E00;&#x7DD2;&#x306B;&#x904A;&#x3073;&#x307E;&#x305B;&#x3093;&#x304B;&#xFF1F;</p><h2 id="--1">&#x6728;&#x66DC;&#x65E5;</h2><p>V-&#x308B;&#x300C;&#xFF5E;&#x3068;&#xFF5E;&#x305F;&#x3002;&#x300D;&#x3001;V-&#x305F;&#x300C;&#xFF5E;&#x305F;&#x3089;&#xFF5E;&#x305F;&#x3002;&#x300D;&#x3002;&#x200C;&#x200C;&#x9A5A;&#x3044;&#x305F;&#x3068;&#x304D;&#x306B;&#x4F7F;&#x3046;&#x3002;&#x200C;&#x200C;&#x4F8B;&#xFF1A;&#x7A93;&#x3092;&#x958B;&#x3051;&#x308B;&#x3068;&#x96EA;&#x304C;&#x964D;&#x3063;&#x3066;&#x3044;&#x305F;&#x3002;&#x200C;&#x200C;</p>]]></content:encoded></item><item><title><![CDATA[Bitwarden on Synology NAS]]></title><description><![CDATA[<p>After Setting up my old and trusted KeePass+Nextcloud Combo and struggling with synchronization conflicts as well as integration problems with Firefox, I decided to give Bitwarden a go.</p><p>UPDATE: Instead of manually setting up the Docker container, I now use <code>docker-compose</code> to set it up. It automatically spawns a</p>]]></description><link>https://blog.stabel.family/bitwarden/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b40e</guid><category><![CDATA[English]]></category><category><![CDATA[guide]]></category><category><![CDATA[NAS]]></category><category><![CDATA[Synology]]></category><category><![CDATA[Bitwarden]]></category><category><![CDATA[KeePass]]></category><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Tue, 21 Apr 2020 18:24:22 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1508345228704-935cc84bf5e2?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1508345228704-935cc84bf5e2?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Bitwarden on Synology NAS"><p>After Setting up my old and trusted KeePass+Nextcloud Combo and struggling with synchronization conflicts as well as integration problems with Firefox, I decided to give Bitwarden a go.</p><p>UPDATE: Instead of manually setting up the Docker container, I now use <code>docker-compose</code> to set it up. It automatically spawns a second container, backing up the database so I can run a backup of my passwords.</p><p>The concept is simple: It&apos;s FOSS, everything is encrypted client side. All normal functionality (imho) is available for free, premium costs 10$/year or for a family of up to five its 12$/year (1$/month). Being an open protocol you can obviously host it yourself. What I don&apos;t get though is why I would have to pay a monthly subscription fee for the premium features even if I host it myself. Therefore I decided to install <a href="https://github.com/dani-garcia/bitwarden_rs">dani-garcia/bitwarden_rs</a> on my Synology NAS in a Docker container. Here&apos;s a short list of To-Dos:</p><ol><li>Setup a (sub-)domain. Mine&apos;s hosted at <a href="https://inwx.de/">inwx.de</a>, so I created a CNAME entry for my existing setup. I&apos;ll use <code>pass.example.tld</code> here.</li><li>Get a certificate for that domain. This one&apos;s easy through the interface and Let&apos;s Encrypt. If you already have one for other services, don&apos;t worry you can have multiple certificates for different (sub-)domains. &#xA0;(Settings -&gt; Security -&gt; Certificates -&gt; Add)</li><li>Add a reverse proxy. This forwards requests to your new (sub-domain) from port 443 (https) to the port the Docker container is running on. I&apos;m going to use <code>8123</code> here, but any port is fine. This way you can have multiple services be reachable on the https port with different (sub-)domains. (Application Portal -&gt; Reverse Proxy -&gt; Create).<br>Just give it a good name like &quot;Bitwarden&quot;; for source choose HTTPS, hostname is <code>pass.example.tld</code>, port 443. Destination is <strong>HTTP</strong>, localhost, port <code>8123</code>. Which is where your Docker container is going to be.</li><li>Download the image. Go to the Registry in the Docker interface (Install Docker from the Package Manager if you haven&apos;t already) and download the image for <code>bitwardenrs/server:latest</code>. </li><li>Launch the image. Go to Images in the Docker interface and launch it. The name is arbitrary, mine&apos;s <code>bitwardenrs</code>. Go to &quot;Advanced Settings&quot;. </li><li>Configure bitwarden.<br>1. Activate automatic restart.<br>2. Go to volume and map <code>docker/bitwardenrs</code> from the NAS to <code>/data</code> inside the container.<br>3. Got to ports and map the container port <code>80</code> to the local port <code>8123</code>. <code>3012</code> is the port for the WebSocket, which we won&apos;t use for now.<br>4. Got to environment variables. First set <code>DOMAIN=https://pass.example.tld</code>, otherwise things might magically break. I like to restrict signups to my domain so I set <code>SIGNUPS_DOMAINS_WHITELIST=example.tld</code>. To disable signups completely just set <code>SIGNUPS_ALLOWED=false</code>. If you want to be able to register you also need to <a href="https://github.com/dani-garcia/bitwarden_rs/wiki/SMTP-configuration">configure environment variables for an SMTP Server</a>. </li><li>Enjoy.</li></ol><p>This setup uses environment variables instead of the config.js. Be aware, that any configuration you might do in the admin interface (and thereby config.js) overwrites this. </p><p><strong>UPDATE: </strong>Here&apos;s the <code>docker-compose.yml</code>. It&apos;s the same as above, but also spawns a second container <code>bitwarden-backup</code> based on <a href="https://gitlab.com/1O/bitwarden_rs-backup/">bitwarden_rs-backup</a> that backs up the database to <code>db_backup</code>folder next to the original database every 3rd of a month at midnight (because my NAS backup runs at 0h30).</p><pre><code>version: &apos;3&apos;

services:
    bitwarden:
        image: bitwardenrs/server:latest
        hostname: nas
        restart: always
        ports:
          - 8123:80
        volumes:
          - /volume1/docker/bitwardenrs:/data
        environment:
          - DOMAIN=https://pass.stabel.family
          - SIGNUPS_DOMAINS_WHITELIST=stabel.family
          - SMTP_PASSWORD=Bb2dmvj6P221HbwjVNrN
          - SMTP_USERNAME=nas@stabel.uber.space
          - SMTP_SSL=true
          - SMTP_PORT=587
          - SMTP_FROM=nas@stabel.family
          - SMTP_HOST=johnson.uberspace.de
    bitwarden-backup:
        image: bruceforce/bw_backup:latest
        restart: always
        depends_on:
          - bitwarden
        volumes:
          - /volume1/docker/bitwardenrs:/data
        environment:
          - CRON_TIME=0 0 3 * *
          - UID=0
          - GID=0
          - TIMESTAMP=false
</code></pre><p>Image: <a href="https://commons.wikimedia.org/wiki/File:Bitwarden_Logo_Horizontal.png">Kspearrin</a> CC BY-SA 4.0</p>]]></content:encoded></item><item><title><![CDATA[Wandern im Westjordanland]]></title><description><![CDATA[Inspiration zu einer zur 2017 neu eröffneten Wandertour über den Masar-Ibrahim-Weg.]]></description><link>https://blog.stabel.family/wandern-im-westjordanland/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b40d</guid><category><![CDATA[Travelling]]></category><category><![CDATA[Deutsch]]></category><category><![CDATA[Inspiration]]></category><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Sun, 01 Mar 2020 08:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1581276889379-27e71eeada5e?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1581276889379-27e71eeada5e?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Wandern im Westjordanland"><p>Eine Interessante Entdeckung machte Meine Mutter mal wieder in der Rheinpfalz am Sonntag vom 10.11.2019. Hier wurde eine besondere Wanderroute Empfohlen.</p><p>2017 er&#xF6;ffnete der neue Masar-Ibrahim-Weg als l&#xE4;ngster Wanderweg des Westjordanlandes. Er ist etwa 330 Kilometer lang und f&#xFC;hrt von Rummanah bis nach Beit Mirsim in Hebron. Daf&#xFC;r braucht man ca. 10 Tage. Zur besseren Orientierung kann man auch einen Wanderf&#xFC;hrer mitnehmen. Ein Veranstalter w&#xE4;re z.B. <a href="adventuretravel.biz">ATTA Adventure Trade Travel Association</a> oder <a href="walkpalestine.com/en">Walk Palestine</a>. Weitere Informationen zum Wandern gibt&apos;s bei <a href="sirajcenter.org/index.php/en">Siraj Center</a>.</p><p>Allgemeine Informationen findet man auch auf <a href="info.goisrael.com/de">Go Israel</a>.</p>]]></content:encoded></item><item><title><![CDATA[Japan Hausbesuch]]></title><description><![CDATA[Nagomi Visit ist eine interessante Website für Hausbesuche in Japan um die Kultur besser kennenzulernen. ]]></description><link>https://blog.stabel.family/japan-hausbesuch/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b40c</guid><category><![CDATA[Deutsch]]></category><category><![CDATA[Japan]]></category><category><![CDATA[Travelling]]></category><category><![CDATA[Inspiration]]></category><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Sun, 01 Mar 2020 07:00:00 GMT</pubDate><media:content url="https://blog.stabel.family/content/images/2020/03/Screenshot_2020-03-01-Eat-and-cook-in-local-homes-all-across-Japan-Nagomi-Visit.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.stabel.family/content/images/2020/03/Screenshot_2020-03-01-Eat-and-cook-in-local-homes-all-across-Japan-Nagomi-Visit.png" alt="Japan Hausbesuch"><p>	Vor ein paar Wochen habe ich in der Zeitung von einer interessanten M&#xF6;glichkeit geh&#xF6;rt, die Japanische Kultur etwas n&#xE4;her kennenzulernen, die ich Euch nat&#xFC;rlich nicht vorenthalten m&#xF6;chte.</p><p>Die Seite hei&#xDF;t <a href="nagomivist.com">Nagomi Visit</a>. Hier kann man f&#xFC;r ca. 3500 Yen einen &quot;Familienbesuch&quot; buchen. Die Vermittlung und das Essen sind hier schon mit drin. Man muss nur einen kurzen Fragebogen ausf&#xFC;llen und dann auf Anfragen von potentiellen Gastgebern warten. Von den Anfragen kann man sich dann eine aussuchen, die einem gef&#xE4;llt. Fertig!</p><p>Beim Besuch in Japan solltest du daran denken, dass es jeden Gastgeber freut, wenn sich der Gast mit dem eigenen Land, der Sprache und den Gepflogenheiten besch&#xE4;ftigt hat. Die Website gibt einem auch Tipps dazu, wie z.B. ein paar japanische S&#xE4;tze die man bei der Begr&#xFC;&#xDF;ung verwenden kann. Insbesondere sollte man gerade in Japan p&#xFC;nktlich sein.</p><p>Drumherum kann ich noch <a href="https://www.japan-guide.com/">Japan Guide</a> f&#xFC;r Japan allgemein, sowie <a href="https://trulytokyo.com/">Truly Tokyo</a> &amp; <a href="https://www.insidekyoto.com/">Inside Kyoto</a> f&#xFC;r die beiden wichtigsten St&#xE4;dte empfehlen. Die offiziellen Seiten <a href="gotokyo.org/">Go Tokyo</a> und <a href="japan.travel">Japan.Travel</a> sind auch auf jeden Fall einen Besuch wert.</p><p>Urspr&#xFC;nglicher Artikel von Sascha Rettig aus der Rheinpfalz am Sonntag, 02.02.2020</p>]]></content:encoded></item><item><title><![CDATA[Raspberry Pi 4 - Device Tree]]></title><description><![CDATA[<p>This article consists of three parts:</p><ul><li>What is the Device Tree in Linux?</li><li>Useful Commands</li><li>Writing your own Device Tree Overlays</li><li>Example: Editing MCP2515 overlay to work with new SPI6</li></ul><h2 id="what-is-the-device-tree">What is the Device Tree?</h2><p>Roughly speaking the Device Tree describes all the hardware of a device in a tree</p>]]></description><link>https://blog.stabel.family/raspberry-pi-4-device-tree/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b40b</guid><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Sun, 26 Jan 2020 14:30:00 GMT</pubDate><content:encoded><![CDATA[<p>This article consists of three parts:</p><ul><li>What is the Device Tree in Linux?</li><li>Useful Commands</li><li>Writing your own Device Tree Overlays</li><li>Example: Editing MCP2515 overlay to work with new SPI6</li></ul><h2 id="what-is-the-device-tree">What is the Device Tree?</h2><p>Roughly speaking the Device Tree describes all the hardware of a device in a tree format. It is especially used for anything that can&apos;t be discovered automatically like serial interfaces, internal memory, oscillators, ... (in contrast to e.g. USB or PCI devices). As the Raspberry Pi has a lot of GPIO headers exposed, additional devices can be added that the current device tree doesn&apos;t know about. That&apos;s where overlays come into play. </p><p>The default base device tree source file for the RPI4 B can be found in the kernel sources in the <code>raspberrypi/linux</code> under <code>linux/arch/arm/boot/dts/<a href="https://github.com/raspberrypi/linux/blob/rpi-4.19.y/arch/arm/boot/dts/bcm2711-rpi-4-b.dts">bcm2711-rpi-4-b.dts</a></code>. This is the source file for the board, which is based itself on the source file for the SoC <code>linux/arch/arm/boot/dts/<a href="https://github.com/raspberrypi/linux/blob/rpi-4.19.y/arch/arm/boot/dts/bcm2711.dtsi">bcm2711.dtsi</a></code>.</p><h3 id="what-is-an-overlay">What is an overlay?</h3><p>Overlays are applied to the base device tree at a later point to change it, usually to add a device, or to configure/enable one that is already present in the base device tree. </p><p>For example: the overlay <code><a href="https://github.com/raspberrypi/linux/blob/rpi-4.19.y/arch/arm/boot/dts/overlays/spi5-1cs-overlay.dts">spi5-1cs-overlay.dts</a></code> configures the <code>spi5</code> node already present in the device tree to enable it with one CS pin and a spidev device.</p><p>All available overlays can be found in the <code>/boot/overlays</code> directory. Albeit already compiled.</p><h2 id="useful-commands">Useful Commands</h2><h3 id="dtc">dtc</h3><p>dtc is the <em>device tree compiler</em>. It is used to losslessly compile <code>.dts</code> files to <code>.dtb</code> files. As a naming convention all overlays source files end in <code>-overlay.dts</code> and are compiled to <code>*.dtbo</code>.</p><pre><code class="language-bash">pi@raspberrypi:~ $ dtc -@ -I dts -O dtb -o my_overlay.dtbo my_overlay-overlay.dts </code></pre><p>The <code>-@</code> is needed for overlays as it prevents the compiler from looking up the references from the source file, which it - of course - wouldn&apos;t find.</p><h3 id="dtoverlay">dtoverlay</h3><p>dtoverlay is used to dynamically load device trees.</p><ul><li><code>dtoverlay -a</code> to list all available overlays </li><li><code>dtoverlay -l</code> to list the currently applied overlays</li><li><code>dtoverlay -h &lt;overlay_name&gt;</code> to get information about any overlay, its parameters and possible values</li><li><code>dtoverlay &lt;overlay_name&gt; &lt;param_name&gt;=&lt;param_value&gt;</code> to add an overlay with some parameters</li><li><code>dtoverlay -r &lt;overlay_name&gt;</code> to remove a previously loaded overlay</li></ul><p>Note: <code>dtoverlay -l</code> only lists <em>dynamically</em> loaded modules and only those can be removed with <code>dtoverlay -r</code>. Anything that was loaded via <code>/boot/config.txt</code> is considered part of the base device tree. Some overlays have to be added this way and can&apos;t be loaded by <code>dtoverlay</code>.</p><h3 id="raspi-gpio">raspi-gpio</h3><ul><li>Install it if not yet present: <code>apt-get install raspi-gpio</code></li><li><code>raspi-gpio funcs</code> lists all available functions for all pins</li><li><code>raspi-gpio get</code> lists how every pin is currently configured</li></ul><h3 id="debugging">Debugging</h3><ul><li>Add <code>dtdebug=1</code> to <code>/boot/config.txt</code> to get a detailed output from <code>vcdbg log msg</code>, when an overlay fails to be applied at startup it will just be skipped.</li><li>Remember <code>dmesg | grep -i &lt;device_name&gt;</code> can be useful to see if the module corresponding to the overlay has been loaded successfully. </li><li><code>dtc -I fs /proc/device-tree</code> prints the current complete device tree</li></ul><h2 id="writing-your-own-device-tree-overlays">Writing your own Device Tree Overlays</h2><p>For an explanation of the syntax of <code>*.dts</code> files take a look at the <a href="https://www.raspberrypi.org/documentation/configuration/device-tree.md#part1.1">official documentation.</a> It&apos;s really good and you&apos;ll need it as the syntax is weird. Especially for overlays.</p><h3 id="miscellaneous">Miscellaneous</h3><p>The number behind the @ in the name of a node (e.g. <code>can@0</code>) is the address inside the parent the node can be found at. It is by convention equal to the value of the reg property, in this case <code>reg = &lt;0&gt;;</code>.</p><p><code>#address-cells = &lt;1&gt;;</code> defines how many addresses the children contain (here 1).</p><p><code>#size-cells = &lt;0&gt;;</code> sets the size of the address space to 0. That means that the children will have a single address, instead of an address space (for e.g. memory).</p><p>Combined one can conclude that the reg property will only contain one value for the address and an empty value for the length (like above).</p><p>This also means, that this overlay can only be enabled once on a given SPI bus, because the addresses would clash. To enable it a second time the reg property and address have to be changed. This is independent of the CS used.</p><h2 id="example-editing-mcp2515-overlay-to-work-with-new-spi5">Example: Editing MCP2515 overlay to work with new SPI5</h2><p>The overlay <a href="https://github.com/raspberrypi/linux/blob/rpi-4.19.y/arch/arm/boot/dts/overlays/mcp2515-can0-overlay.dts"><code>mcp2515-can0-overlay.dts</code></a> references <code>&lt;&amp;spi0&gt;</code> in multiple places. In principle the only thing you have to do to make it work with another spi interface is to change all of them to e.g. <code>&lt;&amp;spi6&gt;</code>. While you&apos;re at it also change all occurrences of <code>can0</code> to <code>can6</code> and <code>can0_osc</code> to <code>can6_osc</code> so they don&apos;t conflict when loading both.</p><pre><code class="language-dts">/*
 * Device tree overlay for mcp251x/can0 on spi0.0
 */

/dts-v1/;
/plugin/;

/ {
    compatible = &quot;brcm,bcm2835&quot;;
    /* disable spi-dev for spi0.0 */
    fragment@0 {
        target = &lt;&amp;spi0&gt;;
        __overlay__ {
            status = &quot;okay&quot;;
        };
    };

    fragment@1 {
	target = &lt;&amp;spidev0&gt;;
	__overlay__ {
	    status = &quot;disabled&quot;;
	};
    };

    /* the interrupt pin of the can-controller */
    fragment@2 {
        target = &lt;&amp;gpio&gt;;
        __overlay__ {
            can0_pins: can0_pins {
                brcm,pins = &lt;25&gt;;
                brcm,function = &lt;0&gt;; /* input */
            };
        };
    };

    /* the clock/oscillator of the can-controller */
    fragment@3 {
        target-path = &quot;/clocks&quot;;
        __overlay__ {
            /* external oscillator of mcp2515 on SPI0.0 */
            can0_osc: can0_osc {
                compatible = &quot;fixed-clock&quot;;
                #clock-cells = &lt;0&gt;;
                clock-frequency  = &lt;16000000&gt;;
            };
        };
    };

    /* the spi config of the can-controller itself binding everything together */
    fragment@4 {
        target = &lt;&amp;spi0&gt;;
        __overlay__ {
            /* needed to avoid dtc warning */
            #address-cells = &lt;1&gt;;
            #size-cells = &lt;0&gt;;
            can0: mcp2515@0 {
                reg = &lt;0&gt;;
                compatible = &quot;microchip,mcp2515&quot;;
                pinctrl-names = &quot;default&quot;;
                pinctrl-0 = &lt;&amp;can0_pins&gt;;
                spi-max-frequency = &lt;10000000&gt;;
                interrupt-parent = &lt;&amp;gpio&gt;;
                interrupts = &lt;25 8&gt;; /* IRQ_TYPE_LEVEL_LOW */
                clocks = &lt;&amp;can0_osc&gt;;
            };
        };
    };
    __overrides__ {
        oscillator = &lt;&amp;can0_osc&gt;,&quot;clock-frequency:0&quot;;
        spimaxfrequency = &lt;&amp;can0&gt;,&quot;spi-max-frequency:0&quot;;
        interrupt = &lt;&amp;can0_pins&gt;,&quot;brcm,pins:0&quot;,&lt;&amp;can0&gt;,&quot;interrupts:0&quot;;
    };
};</code></pre><p>I additionally edited the <code>target=&lt;&amp;spi6&gt;</code> section and added a parameter so that the CS pin can be freely chosen as well:</p><pre><code class="language-dts">/*
 * Device tree overlay for mcp251x/can6 on spi6.0
 */

/dts-v1/;
/plugin/;

/ {
    compatible = &quot;brcm,bcm2835&quot;;
   
    /* spi6 cs pin config */
    fragment@0 {
        target = &lt;&amp;spi6_cs_pins&gt;;
        frag0: __overlay__ {
            brcm,pins = &lt;26&gt;; /* gpio26, hardware pin 37 */
            brcm,function = &lt;1&gt;; /* output */
        };
    };

    /* spi6 config */
    fragment@1 {
        target = &lt;&amp;spi6&gt;;
        frag1: __overlay__ {
            /* needed to avoid dtc warning */
            #adress-cells = &lt;1&gt;;
            #size-cells = &lt;0&gt;;

            status = &quot;okay&quot;;
            pinctrl-names = &quot;default&quot;;
            pinctrl-0 = &lt;&amp;spi6_pins &amp;spi6_cs_pins&gt;;
            cs-gpios = &lt;&amp;gpio 26 1&gt;;
        };
    };

    /* the interrupt pin of the can-controller */
    fragment@2 {
        target = &lt;&amp;gpio&gt;;
        __overlay__ {
            can6_pins: can6_pins {
                brcm,pins = &lt;16&gt;; /* gpio16, hardware pin 36 */
                brcm,function = &lt;0&gt;; /* input */
            };
        };
    };

    /* the clock/oscillator of the can-controller */
    fragment@3 {
        target-path = &quot;/clocks&quot;;
        __overlay__ {
            /* external oscillator of mcp2515 on SPI6.0 */
            can6_osc: can6_osc {
                compatible = &quot;fixed-clock&quot;;
                #clock-cells = &lt;0&gt;;
                clock-frequency  = &lt;16000000&gt;;
            };
        };
    };

    /* the spi config of the can-controller itself binding everything together */
    fragment@4 {
        target = &lt;&amp;spi6&gt;;
        __overlay__ {
            /* needed to avoid dtc warning */
            #address-cells = &lt;1&gt;;
            #size-cells = &lt;0&gt;;

            can6: mcp2515@0 {
                reg = &lt;0&gt;;
                compatible = &quot;microchip,mcp2515&quot;;
                pinctrl-names = &quot;default&quot;;
                pinctrl-0 = &lt;&amp;can6_pins&gt;;
                spi-max-frequency = &lt;10000000&gt;;
                interrupt-parent = &lt;&amp;gpio&gt;;
                interrupts = &lt;16 8&gt;; /* IRQ_TYPE_LEVEL_LOW */
                clocks = &lt;&amp;can6_osc&gt;;
            };
        };
    };

    __overrides__ {
        cs_pin = &lt;&amp;frag0&gt;,&quot;brcm,pins:0&quot;,
                 &lt;&amp;frag1&gt;,&quot;cs-gpios:4&quot;;
        oscillator = &lt;&amp;can6_osc&gt;,&quot;clock-frequency:0&quot;;
        spimaxfrequency = &lt;&amp;can6&gt;,&quot;spi-max-frequency:0&quot;;
        interrupt_pin = &lt;&amp;can6_pins&gt;,&quot;brcm,pins:0&quot;,
                        &lt;&amp;can6&gt;,&quot;interrupts:0&quot;;
    };
};</code></pre><p>This just needs to be compiled and copied to <code>/boot/overlays/</code>:</p><pre><code class="language-bash">dtc -@ -I dts -O dtb -o mcp2515-can6.dtbo mcp2515-can6-overlay.dts
cp mcp2515-can6.dtbo /boot/overlays/</code></pre><p>After that you can load it dynamically:</p><pre><code class="language-bash">overlay mcp2515-can6 cs_pin=16 interrupt_pin=26 oscillator=16000000</code></pre><p>Or statically adding to <code>/boot/config.txt</code>. Don&apos;t add anything else and make sure that nothing uses the same pins!</p><pre><code>dtoverlay=mcp2515-can6,cs_pin=16,interrupt_pin=26,oscillator=16000000</code></pre><p>Now that the device is known to Linux it behaves the same as usual. Just follow <a href="http://youness.net/raspberry-pi/raspberry-pi-can-bus">any of the myriad of guides on connecting the MCP2515. </a>Pay special attention the the mentioned common mistakes (like having only one node). Put the can interface up and start sending data:</p><pre><code>ip link set can0 up type can bitrate 50000
cansend can0 111#FF</code></pre><p>It could also be adapted to work for any SPI interface like the <a href="https://github.com/raspberrypi/linux/blob/rpi-4.19.y/arch/arm/boot/dts/overlays/mcp3008-overlay.dts">overlay for the MCP3008</a> works for SPI0, SPI1 and SPI2.</p><p>I hope this was somewhat useful.</p><h2 id="more-resources">More Resources</h2><ul><li><a href="https://www.raspberrypi.org/documentation/configuration/device-tree.md">Official Raspberry Pi Documentation on Device Trees</a></li><li><a href="https://www.raspberrypi.org/forums/viewforum.php?f=107">Official Raspberry Pi Device Tree Forum</a></li><li><a href="https://www.devicetree.org/">Official DeviceTree.org specification</a></li><li><a href="https://elinux.org/Device_Tree_Usage">Good Explanation on how to write your own Device Tree</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Raspberry Pi 4 - Multiple SPIs]]></title><description><![CDATA[<p>In this post I want to talk about the new Raspberry Pi 4 (RPI4) and one of its new features: Multiple (up to 6) accessible SPIs! While the older RPIs all had SPI0, SPI1 and SPI2, only SPI0 and SPI1 where accessible through the pin headers. Now there are SPI3</p>]]></description><link>https://blog.stabel.family/raspberry-pi-4-multiple-spis-and-the-device-tree/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b409</guid><category><![CDATA[Raspberry Pi]]></category><category><![CDATA[English]]></category><category><![CDATA[SPI]]></category><category><![CDATA[Device Tree]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Overlay]]></category><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Sun, 26 Jan 2020 11:00:00 GMT</pubDate><media:content url="https://blog.stabel.family/content/images/2020/01/1920px-Raspberry_Pi_4_Model_B_-_Side.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.stabel.family/content/images/2020/01/1920px-Raspberry_Pi_4_Model_B_-_Side.jpg" alt="Raspberry Pi 4 - Multiple SPIs"><p>In this post I want to talk about the new Raspberry Pi 4 (RPI4) and one of its new features: Multiple (up to 6) accessible SPIs! While the older RPIs all had SPI0, SPI1 and SPI2, only SPI0 and SPI1 where accessible through the pin headers. Now there are SPI3 through SPI6 in addition to that! </p><p>I&apos;ll assume you know your way around the command line and that you know what SPI is. For an explanation of what I&apos;m doing here, what a device tree and an overlay is, read the article about the Device Tree.</p><h2 id="spi-overlays">SPI Overlays</h2><p>To use any interface on the hardware pins, the desired interface has to be enabled first. This can be done by adding the corresponding line to <code>/boot/config.txt</code> and rebooting the RPI. For SPI this is:</p><pre><code>dtoverlay=spi&lt;n&gt;-&lt;m&gt;cs</code></pre><p>Replace <code>&lt;n&gt;</code> with the SPI bus number you want to use. Values: <code>0-6</code><br>Replace <code>&lt;m&gt;</code> with the amount of chip selects (CS) you want to enable. Values: &#xA0;<code>1-2</code></p><p>There&apos;s one exception for SPI0: here <code>&lt;m&gt;</code> is empty ( <code>dtoverlay=spi0-cs</code> ). This enables two chip selects automatically.</p><p>If you want to use pins that are different from the default chip select you can add parameters at the end of the line. Here you can also enable/disable <code>spidev</code>. This creates a user interface node to access the bus e.g. via python. It&apos;s on by default.</p><p>For example to enable SPI6 with 2 CS lines on GPIO16 and GPIO26 you have to add the following line to <code>/boot/config.txt</code>:</p><pre><code>dtoverlay=spi6-2cs,cs0_pin=16,cs1_pin=26</code></pre><p>Be careful, lines must be shorter than 80 characters. If a line becomes to long you can use the equivalent long form:</p><pre><code>dtoverlay=spi6-2cs
dtparameter=cs0_pin=16
dtparameter=cs1_pin=26</code></pre><p>Additionally disable spidev:</p><pre><code>dtoverlay=spi6-2cs
dtparameter=cs0_pin=16,cs0_spidev=disable
dtparameter=cs1_pin=26,cs1_spidev=disable</code></pre><p>Enabling all SPI busses at the same time does not work by default, because some of the chip select pins overlap other SPIs and cause conflicts (e.g. on hardware pin 26 [GPIO7] below SPI1 CS1 and SPI4 SCLK share the same pin). To prevent this you have to use CS pins that are different from the default. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2020/01/rpi4-pinout.png" class="kg-image" alt="Raspberry Pi 4 - Multiple SPIs" loading="lazy"><figcaption>By Les Pounder (https://www.tomshardware.com/reviews/raspberry-pi-gpio-pinout,6122.html)</figcaption></figure><p>Keep in mind that there&apos;s a difference between the hardware pin number and the GPIO pin number. Also notice that SPI1 and SPI6 use the same pins and can therefore not be enabled at the same time.</p><p>The SPI pins (other than CS, i.e. MOSI, MISO, SCLK) are bound by hardware and cannot be changed.</p><h2 id="useful-commands">Useful Commands</h2><h3 id="dtoverlay">dtoverlay</h3><p>So far so good, but rebooting the PI every time to make a change is really annoying, especially if you&apos;re just trying out different configurations. While the above is perfect for persistent setups, there is a way to temporarily load an overlay. Using the example from above:</p><pre><code class="language-bash">pi@raspberrypi:~ $ dtoverlay spi6-2cs cs0_pin=16 cs1_pin=26</code></pre><p>This will not persist a reboot though. To remove it again use the following command, only specifying the name of the overlay:</p><pre><code class="language-bash">pi@raspberrypi:~ $ dtoverlay -r spi6-2cs</code></pre><p>With <code>dtoverlay -h</code> you get a nice help text of the program. It&apos;s a very useful program, as it can also give you a list of available overlays, currently loaded overlays, etc.</p><h3 id="dtparam">dtparam</h3><p>The <code>dtparam</code> program is only for parameters directly to the base device tree. For overlays (like the SPI above) always use <code>dtoverlay</code> with a list of parameters.</p><h3 id="raspi-gpio">raspi-gpio</h3><p>To check if the overlay was applied correctly and the pins have been configured properly you can check the output of</p><pre><code class="language-bash">pi@raspberrypi:~ $ raspi-gpio get</code></pre><p>This should contain something like the following if you enabled SPI6 like above</p><pre><code>[...]
GPIO 19: level=0 fsel=7 alt=3 func=SPI6_MISO pull=DOWN
GPIO 20: level=0 fsel=7 alt=3 func=SPI6_MOSI pull=DOWN
GPIO 21: level=0 fsel=7 alt=3 func=SPI6_SCLK pull=DOWN
[...]
GPIO 16: level=1 fsel=1 func=OUTPUT pull=DOWN
[...]
GPIO 26: level=1 fsel=1 func=OUTPUT pull=DOWN
[...]</code></pre><h2 id="outlook">Outlook</h2><h3 id="more-cs-pins">More CS pins</h3><p>Enabling and disabling SPI busses is nice, but with the default overlays you are mostly limited to 1 or 2 CS. There are a lot of tutorials on how to use a separate multiplexer chip to achieve more, but since any GPIO pin can be used you can theoretically have a lot of CS pins before running out options. Unfortunately this is not possible with the currently available overlays, but fret not: You can edit them to support more.</p><h3 id="other-spi-devices-can-adc-">Other SPI devices (CAN, ADC, ...)</h3><p>But what if you have a device that connects through SPI like the MCP2515 CAN bus chip or the MCP3008 10bit ADC? There are existing overlays for that, but unfortunately for most of them have been written only for SPI0 and will not work on any other of the new SPI interfaces or even have fixed interrupt/cs pins. To get those devices to work on a different SPI bus we need to edit the device tree overlays ourselves. For a way to do that read the article on Device Trees.</p><p>Cover Image by <a href="https://commons.wikimedia.org/wiki/File:Raspberry_Pi_4_Model_B_-_Side.jpg">Michael Henzler / Wikimedia Commons</a></p><h2></h2>]]></content:encoded></item><item><title><![CDATA[Automatic mail sorting based on recipient]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>In this article I will describe how I set up my mail on the <a href="https://uberspace.de/">wonderful Uberspace 7</a> using <code>.qmail</code> and <code>maildrop</code> to automatically create subfolders in my inbox and sort mail in these based on the recipient (i.e. my) mail address.</p>
<p>The basic idea is that if you own</p>]]></description><link>https://blog.stabel.family/automatic-mail-sorting-based-on-recipient/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b407</guid><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Mon, 11 Jun 2018 09:05:50 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>In this article I will describe how I set up my mail on the <a href="https://uberspace.de/">wonderful Uberspace 7</a> using <code>.qmail</code> and <code>maildrop</code> to automatically create subfolders in my inbox and sort mail in these based on the recipient (i.e. my) mail address.</p>
<p>The basic idea is that if you own an domain like <code>yourdomain.tld</code> you can add <em>unlimited</em> email addresses. So I had the idea (which is not new) to create different email adresses for different services like <code>facebook@yourdomain.tld</code> for Facebook, <code>github@yourdomain.tld</code> for GitHub, etc. You get the idea.<br>
Creating a new mailbox for every service is way too much work. Catching all emails in one mailbox and creating a new folder and a filter to sort the mails into a folder every time is still really annoying. It&apos;s way easier if you can just register for a site and a new folder in your inbox gets created automatically when an email arrives on the domain for the new service.</p>
<p>So first I created my main mailbox which I use for my own mail. Emails to this address go directly into the inbox without filtering.</p>
<pre><code class="language-shell">uberspace mail user add isabell
</code></pre>
<p>Then I added <code>yourdomain.tld</code> to my uberspace for use with email. Don&apos;t forget to set the corresponding DNS records on your provider (will be output by the add script).</p>
<pre><code class="language-shell">uberspace mail domain add yourdomain.tld
</code></pre>
<p>On Uberspace the first sorting is done by <code>.qmail</code> files. By default all emails that are not caught by some specific <code>.qmail</code> file will match <code>.qmail-default</code> where it gets send to <code>|/usr/bin/vdeliver</code> (The pipe at the beginning tells <code>qmail</code> to pipe the mail into an external program, in this case <code>vdeliver</code>). More on this in the <a href="https://wiki.uberspace.de/mail:dotqmail">Uberspace Wiki</a>. <code>vdeliver</code> then delivers the mail to the corresponding inbox if it exists and drops all others (<a href="https://wiki.uberspace.de/mail:technik#zusammenhang_zwischen_qmail_und_vmailmgr">actually they are dropped earlier</a>, but lets keep it simple)<br>
Because we want to receive all emails we forward all mails that arrive at <code>.qmail-default</code> directly to our inbox</p>
<pre><code class="language-shell">echo &quot;isabell@yourdomain.tld&quot; &gt; .qmail-default
</code></pre>
<p>Now all emails arrive at your inbox. So where&apos;s the filter? Now we get to <code>maildrop</code>. Instead of accepting all mails directly into our inbox we call <code>maildrop</code> first. How? We tell <code>qmail</code> to do it for us:</p>
<pre><code class="language-shell">echo &quot;|maildrop $HOME/.myfilter&quot; &gt; .qmail-isabell
</code></pre>
<p><code>$HOME/.myfilter</code> contains our filter configuration. For more information on maildrop filters see the <a href="https://wiki.uberspace.de/mail:maildrop">Uberspace Wiki</a>.<br>
Take a look at the filter first:</p>
<pre><code class="language-bash">logfile &quot;$HOME/mailfilter.log&quot;

# set default Maildir to user isabell
MAILDIR=&quot;$HOME/users/isabell&quot;

DESTDIR=&quot;$MAILDIR&quot;

# Instead of looking at &quot;To&quot; or &quot;Cc&quot; we look at the
# &quot;Delivered-To: &quot; header, which is added by qmail, because
# it&apos;s easier and it&apos;s reliably there in contrast to the others

# For now just loop over all occurences and take the last email
ADDR=&quot;&quot;
foreach /^Delivered-To:\s*.*/
{
    ADDR=getaddr($MATCH)
}

# Use sed to extract just the local part of the url without username
SERVICE=`echo $ADDR | sed &apos;s/^[a-z0-9]*-\(.*\)@.*/\1/&apos;`

# If it was delivered to a subdomain, put it in a subfolder, otherwise
# deliver it to the main inbox (also in case of an error)
if ( $SERVICE )
{
    DESTDIR=&quot;$MAILDIR/.INBOX.$SERVICE&quot;
}

# check if the folder already exists and create and subscribe if necessary
if ( ! `test -d &quot;$DESTDIR&quot;` )
{
    `maildirmake &quot;$DESTDIR&quot;`
    `echo &quot;INBOX.$SERVICE&quot; &gt;&gt; &quot;$MAILDIR&quot;/subscriptions`
}

# last line, deliver to $MAILDIR
to &quot;$DESTDIR&quot;
</code></pre>
<p>I already added a lot of comments, so I think most commands should be clear, but here again a basic rundown. <code>qmail</code> adds a <code>Delivered-To: </code> header when it delivers a mail to an inbox. It does not do this if you call a programm in the <code>.qmail</code> file (i.e. <code>|maildrop .myfilter</code>, I learned this the hard way). This is why we first catch all mails in <code>.qmail-default</code> and forward it to our main user <code>.qmail-isabell</code> and THEN call <code>maildrop</code> to apply the filter, instead of just calling maildrop directly in the <code>.qmail-default</code>.<br>
Why go to such lenghts? Because the <code>To: </code> and <code>Cc: </code> headers are not always there (think mailing list, bcc, ...) and there can be multiple recipients. The solution via <code>Delivered-To: </code> is easier since there may be multiple headers, but the first one (i.e. first added, listed last) will be the one where the other server initially sent our email and it will be the only email in this header. Thanks to <a href="https://blog.macfrog.de/2014/05/03/was-man-mit-maildrop-alles-anstellen-kann/">Thorsten K&#xF6;ster</a> for the idea.</p>
<p>With that in mind the script is easy. First define a default mailbox and set the destination mailbox to to be sure that no emails are dropped. Next go over all <code>Delivered-To: </code> headers, get the last one and extract the local part (i.e. <code>&lt;address&gt;</code> below) with <code>sed</code>. Remember the domain looks like this:</p>
<pre><code class="language-shell">Delivered-To: &lt;user&gt;-&lt;namespace&gt;-&lt;address&gt;@&lt;domain&gt;.&lt;tld&gt;
</code></pre>
<p>If you have a namespace enabled you probably need to adjust not only the filter, but probably also the forwarding earlier.</p>
<p>So if we have a valid subdomain (i.e. it wasn&apos;t sent to <code>isabell@yourdomain.tld</code> directly) we check if there the directory in the inbox already exists, if not create it and subscribe to it. Lastly deliver the mail.<br>
Two things to note: Subfolders in <a href="https://wiki2.dovecot.org/MailboxFormat/Maildir#Directory_Structure">Mailbox format</a> are created with leading dots and dots as seperators and not a &quot;real&quot; directory tree. Second, in IMAP you have to subscribe to a folder on a client to be able to see it. Usually you subscribe to all folders when you add the account to your client, but the oftentimes don&apos;t get updated automatically if new ones appear, therefore hiding the newly created folder. But because the list is stored on the server (so it get&apos;s synced across clients) we can easily modify it.</p>
<p>That&apos;s it! Lot&apos;s of explanation and not so much to do, but great results.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Isso on Ghost on Uberspace 7]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Here&apos;s my guide on installing Isso on Uberspace 7 for comments als alternative to Disqus and Commento. See also my last posts on <a href="/ghost-install/">Installing Ghost</a> and <a href="/commento-on-uberspace-7/">Installing Commento</a> and my thoughts for choosing Isso over Commento on <a href="/comments-on-ghost-on-uberspace-7/">Comments on Ghost on Uberspace 7</a>.</p>
<p>The <a href="https://posativ.org/isso/docs/install/">official Install Guide</a> of</p>]]></description><link>https://blog.stabel.family/isso-on-ghost-on-uberspace-7/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b406</guid><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Wed, 11 Apr 2018 21:37:07 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Here&apos;s my guide on installing Isso on Uberspace 7 for comments als alternative to Disqus and Commento. See also my last posts on <a href="/ghost-install/">Installing Ghost</a> and <a href="/commento-on-uberspace-7/">Installing Commento</a> and my thoughts for choosing Isso over Commento on <a href="/comments-on-ghost-on-uberspace-7/">Comments on Ghost on Uberspace 7</a>.</p>
<p>The <a href="https://posativ.org/isso/docs/install/">official Install Guide</a> of Isso suggests to use <code>pip</code>, in our case with the <code>--user</code> flag for a local install:</p>
<pre><code class="language-shell">pip install --user isso
</code></pre>
<p>(If you like to support python3 you can also do a <code>pip3 install --user isso</code> or even use <code>pip3.6</code>)</p>
<p>As in the guide for Ghost we need to choose a port:</p>
<pre><code class="language-shell">ISSOPORT=$(( $RANDOM % 4535 + 61000)); netstat -tulpen | grep $ISSOPORT &amp;&amp; echo &quot;versuch&apos;s nochmal&quot;
</code></pre>
<p>We want notifications when someone comments on our blog. Therefore we create a mailuser to send the emails from and set a password (of course you can skip this if you don&apos;t need/want it):</p>
<pre><code class="language-shell">uberspace mail user add comments
</code></pre>
<p>Now we create a config file in <code>~/etc/isso/</code>. We chose to configure Isso with smtp mail, therefore we add the <code>[smtp]</code> section and <code>notify = smtp</code> to our configuration. You can just copy the whole <code>cat</code> command and paste it in the shell:</p>
<pre><code class="language-shell">mkdir ~/etc/isso
cat &lt;&lt;__EOF__ &gt;~/etc/isso/user.cfg
[general]
dbpath = $HOME/etc/isso/comments.db
host = https://yourdomain.tld/
log-file = /home/maxb/logs/isso_logfile
notify = smtp

[server]
listen = http://localhost:$ISSOPORT/

[smtp]
username = comments@$USER.uber.space
password = SECRETMAILBOXPASSWORD
to = yourmailadress@yourhoster.tld
from = comments@yourdomain.tld
host = $HOSTNAME
__EOF__
</code></pre>
<p>After executing don&apos;t forget to change <code>yourdomain.tld</code> to your actual domain and to enter the password you chose earlier (<code>~/etc/isso/user.cfg</code>). Https only is sufficient, because uberspace enforces https and redirects all unencrypted requests. Of course you omit the smtp and notify settings if you didn&apos;t create the mailuser. More on the server config in the <a href="https://posativ.org/isso/docs/configuration/server/">Official Documentation</a>.</p>
<p>To make isso available on the outside we need to add a subdomain. For example <code>comments.yourdomain.tld</code>:</p>
<pre><code class="language-shell">uberspace web domain add comments.yourdomain.tld
</code></pre>
<p>Now we need to tell Apache to proxy all requests to Isso. We do this by creating a directory for the subdomain and placing a <code>.htaccess</code> file in there:</p>
<pre><code class="language-shell">mkdir /var/www/virtual/$USER/comments.yourdomain.tld
cat &lt;&lt;__EOF__ &gt;/var/www/virtual/$USER/comments.yourdomain.tld/.htaccess
DirectoryIndex disabled
RewriteEngine On
RewriteRule ^(.*) http://localhost:$ISSOPORT/\$1 [P,L]
__EOF__
</code></pre>
<p>The first row prevents Apache from serving an <code>index.html</code> when just accessing the domain. This would prevent the Isso client (i.e. your website) from reaching the right endpoint at the server.<br>
The last line of the file redirects the traffic to the Isso server.</p>
<p>Lastly comes the service file. We need to create a service file again, like we did for Ghost:</p>
<pre><code class="language-shell">cat &lt;&lt;__EOF__ &gt;~/etc/services.d/isso.ini
[program:isso]
command = $HOME/.local/bin/isso -c $HOME/etc/isso/user.cfg run
autostart = true
autorestart = true
__EOF__
</code></pre>
<p>It&apos;s pretty self-explanatory. <code>autostart</code> starts the isso server on startup and <code>autorestart</code> restarts the server when it fails.</p>
<p>Now just reread the config and update it to start Isso!</p>
<pre><code class="language-shell">supervisorctl reread
supervisorctl update
</code></pre>
<p>Lastly we need to add the comment section to the blog. Probably below every post, so we take a look at our theme, which is casper, and find the <code>~/ghost/content/themes/casper/post.hbs</code>. Some way down is already an commented part for Disqus. There we can add (obviously not inside the commented part) the following snippet:</p>
<pre><code class="language-html">&lt;script data-isso=&quot;https://comments.yourdomain.tld/&quot;
    src=&quot;https://comments.yourdomain.tld/js/embed.min.js&quot;&gt;&lt;/script&gt;
&lt;section id=&quot;isso-thread&quot;&gt;&lt;/section&gt;
</code></pre>
<p>Again, don&apos;t forget to change your domain!</p>
<p>That&apos;s almost it. Restart Ghost to see the comment section appear!</p>
<pre><code class="language-shell">supervisorctl restart ghost
</code></pre>
<p>If you have questions, leave a comment below.</p>
<p>Yours,<br>
Max</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Commento on Ghost on Uberspace 7]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>This post explains how to install Commento (current version 0.3.1) on a <a href="https://uberspace.de/">Uberspace 7</a> installation.</p>
<h2 id="prerequisites">Prerequisites</h2>
<p>First choose a random port that is still free</p>
<pre><code class="language-shell">COMMENTOPORT=$(( $RANDOM % 4535 + 61000)); netstat -tulpen | grep $COMMENTOPORT &amp;&amp; echo &quot;versuch&apos;s nochmal&quot;
</code></pre>
<p>Because there is no port forwarding</p>]]></description><link>https://blog.stabel.family/commento-on-uberspace-7/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b405</guid><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Wed, 11 Apr 2018 16:09:20 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>This post explains how to install Commento (current version 0.3.1) on a <a href="https://uberspace.de/">Uberspace 7</a> installation.</p>
<h2 id="prerequisites">Prerequisites</h2>
<p>First choose a random port that is still free</p>
<pre><code class="language-shell">COMMENTOPORT=$(( $RANDOM % 4535 + 61000)); netstat -tulpen | grep $COMMENTOPORT &amp;&amp; echo &quot;versuch&apos;s nochmal&quot;
</code></pre>
<p>Because there is no port forwarding as of yet I decided to use apache as a port 80 proxy to commento. So the first step is so register a new subdomain. I chose <code>comments.yourdomain.tld</code>. Register it with the <code>uberspace</code> tool and don&apos;t forget to set your DNS records:</p>
<pre><code class="language-shell">uberspace web domain add comments.yourdomain.tld
</code></pre>
<p>Next create a folder in your virtualroot for your subdomain and</p>
<pre><code class="language-shell">cd /var/www/virutal/$USER/
mkdir comments.yourdomain.tld
cd comments.yourdomain.tld
</code></pre>
<p>Place an <code>.htaccess</code> file in there with the following contents to proxy the requests to the commento server and don&apos;t forget to change <code>COMMENTOPORT</code> to the port <code>echo $COMMENTOPORT</code> gives you:</p>
<pre><code class="language-shell">RewriteEngine On
RewriteRule ^(.*) http://localhost:COMMENTOPORT/$1 [P,L]
</code></pre>
<p>All of this will probably be obsolete in the near future.</p>
<h2 id="installingcommento">Installing Commento</h2>
<p>First create a subfolder for the binary and databasefile:</p>
<pre><code class="language-shell">mkdir ~/commento
cd ~/commento
</code></pre>
<p>Next lookup the <a href="https://github.com/adtac/commento/releases/latest">latest release url</a>, download the latest release of Commento from Github and extract it.</p>
<pre><code class="language-shell">wget &quot;https://github.com/adtac/commento/releases/download/v0.3.1/commento_0.3.1_linux_amd64.tar.gz&quot;
tar -xzf commento_0.3.1_linux_amd64.tar.gz
rm commento_0.3.1_linux_amd64.tar.gz
</code></pre>
<p>Now copy the assets (namely the javascript and stilesheet) into your ghost theme. For example I copy them in my casper theme:</p>
<pre><code class="language-shell">cp assets/style/commento.css ~/ghost/content/themes/casper/assets/css/
cp assets/js/commento.js ~/ghost/content/themes/casper/assets/js/
</code></pre>
<p>Edit your <code>post.hbs</code> to include the following code snippet I wrote. In my case its the <code>~/ghost/content/themes/casper/post.hbs</code>. In the casper theme there is already a commented out section for Disqus comments. Just place it right above/below that.</p>
<pre><code class="language-html">&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div id=&quot;commento&quot;&gt;&lt;/div&gt;
&lt;script
    src=&quot;{{asset &quot;js/commento.js&quot;}}&quot;
    data-div=&quot;#commento&quot;&gt;
&lt;/script&gt;
&lt;script&gt;
    Commento.init({
        serverUrl: &quot;//comments.yourdomain.tld&quot;,
        commentoCssUrl: &quot;{{asset &quot;css/commento.css&quot;}}&quot;
    })
&lt;/script&gt;
</code></pre>
<p>Create the service file <code>~/etc/services.d/commento.ini</code> with the following content and again don&apos;t forget to change it to your actual <code>COMMENTOPORT</code>:</p>
<pre><code class="language-ini">[program:commento]
directory=/home/$USER/commento
command=/home/$USER/commento/commento
environment = COMMENTO_PORT=&quot;COMMENTOPORT&quot;
autorestart=true
</code></pre>
<p>Reread, update and restart all services, so ghost also reloads the script:</p>
<pre><code class="language-shell">supervisorctl reread
supervisorctl update
supervisorctl restart all
</code></pre>
<p>And you&apos;re done! There should be a comment section below every post now. If you have questions, leave a comment below.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Comments on Ghost on Uberspace 7]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>This is just a small discussion on options to add comments to Ghost on your <a href="https://uberspace.de">fabulous Uberspace</a>. See also <a href="/ghost-install">Ghost Install on Uberspace 7</a></p>
<p>tl;dr I wrote a Guide on <a href="/commento-on-uberspace-7">Installing Commento on Uberspace 7</a> but then decided to go with <a href="/isso-on-ghost-on-uberspace-7/">Installing Isso on Uberspace 7</a> because it has</p>]]></description><link>https://blog.stabel.family/comments-on-ghost-on-uberspace-7/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b404</guid><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Wed, 11 Apr 2018 15:53:52 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>This is just a small discussion on options to add comments to Ghost on your <a href="https://uberspace.de">fabulous Uberspace</a>. See also <a href="/ghost-install">Ghost Install on Uberspace 7</a></p>
<p>tl;dr I wrote a Guide on <a href="/commento-on-uberspace-7">Installing Commento on Uberspace 7</a> but then decided to go with <a href="/isso-on-ghost-on-uberspace-7/">Installing Isso on Uberspace 7</a> because it has support for notifications.</p>
<h2 id="options">Options</h2>
<p>First off: simplest is probably if you just use one of the commenting frameworks available which are explained pretty good on <a href="https://www.ghostforbeginners.com/how-to-enable-comments-on-a-ghost-blog">this site</a> like:</p>
<ul>
<li>Disqus</li>
<li>Facebook</li>
<li>NodeBB</li>
<li>Livefyre</li>
</ul>
<p>If you don&apos;t want to rely on a seperate service, like your privacy (or don&apos;t like how slow they are) and are not particulary fond of hosting your own nodeBB there are other options:</p>
<ul>
<li><a href="https://github.com/posativ/isso">Isso</a> Python + SQLite3 (3135 Stars)</li>
<li><a href="https://github.com/adtac/commento">Commento</a> Go + SQLite3 (2551 Stars)</li>
<li><a href="https://github.com/schn4ck/schnack">Schnack</a> Node + SQLite3 (1196)</li>
<li><a href="https://github.com/phusion/juvia">juvia</a> Ruby on Rails + PostgreSQL (1025 Stars)</li>
<li><a href="https://github.com/coralproject/talk">CoralProject Talk</a> Node + MongoDB + Redis (872 Stars)</li>
<li><a href="https://github.com/discourse/discourse">Discourse</a> Ruby on Rails + PostgreSQL + Redis (24666 Stars)</li>
</ul>
<p>I included the Github stars (as of writing), to show that most of them are already quite established with Discourse being far ahead.</p>
<p>As juvia is currently unmaintained and PostgreSQL and MongoDB aren&apos;t currently available at Uberspace 7 I feel like the last three are all too much hassle. They&apos;re also kind of overkill for such a small and simple blog.</p>
<p>So let&apos;s take a closer look at Commento and Isso:</p>
<ul>
<li>Commento is <a href="https://www.reddit.com/r/selfhosted/comments/7fx99u/commento_is_a_lightweight_privacyfocused/dqg2pin/">faster</a></li>
<li>Isso has one level of nesting only</li>
<li>Both currenly use SQLite, but commento will implement others</li>
<li>Isso is older (more mature?)</li>
<li>Isso looks more like Disqus, which I like more.</li>
<li>Commento has <a href="https://akismet.com/">Akismet</a> support</li>
<li>Isso has voting functionality</li>
<li>Isso has email notifications</li>
</ul>
<p>Because I already found a <a href="https://blog.amuehlbeier.de/isso-auf-u7/">Guide on Isso for Uberspace 7</a> I thought I&apos;d try it with <a href="/comments-on-ghost-on-uberspace-7/">Commento</a>.</p>
<p>Here is my guide for <a href="/comments-on-ghost-on-uberspace-7">Installing Commento</a>.</p>
<p>After getting it up and running though I decided that I wanted email notifications, which are currently not supported on Commento. Therefore I wrote a guide on <a href="/isso-on-ghost-on-uberspace-7/">Installing Isso</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Ghost Install on Uberspace 7]]></title><description><![CDATA[This small guide explains how to install the latest version of ghost on your Uberspace 7 using the ghost-cli.]]></description><link>https://blog.stabel.family/ghost-install/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b3cb</guid><category><![CDATA[uberspace]]></category><category><![CDATA[github]]></category><category><![CDATA[M4a1x]]></category><category><![CDATA[ghost]]></category><category><![CDATA[guide]]></category><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Wed, 11 Apr 2018 01:41:47 GMT</pubDate><media:content url="https://blog.stabel.family/content/images/2018/04/ghost.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.stabel.family/content/images/2018/04/ghost.png" alt="Ghost Install on Uberspace 7"><p>This small guide explains how to install the latest version of ghost on your <a href="https://uberspace.de/">Uberspace 7</a> using the <code>ghost-cli</code>. Inspired by this <a href="https://blog.amuehlbeier.de/ghost-auf-uberspace-u7/">guide by Arthur M&#xFC;hlbeier</a> (German) for the beta and the <a href="https://wiki.uberspace.de/cool:ghost">old guide for Uberspace 6</a> (also German).</p>
<p>Update: Uberspace is so great, they already had a <a href="https://lab.uberspace.de/en/guide_ghost.html">guide for Ghost</a>, which does the exact same thing as mine, just better.</p>
<h2 id="prerequisites">Prerequisites</h2>
<ul>
<li>Point your url to your Uberspace using the following command (also see <a href="https://manual.uberspace.de/en/web-domains.html%5D">Uberspace Manual</a>):<pre><code class="language-shell">uberspace web domain add yourdomain.tld
</code></pre>
</li>
<li>Find an empty port by entering this into your shell:<pre><code class="language-shell">GHOSTPORT=$(( $RANDOM % 4535 + 61000)); netstat -tulpen | grep $GHOSTPORT &amp;&amp; echo &quot;versuch&apos;s nochmal&quot;
</code></pre>
If there&apos;s no output you found one. You can get it by entering <code>echo $GHOSTPORT</code></li>
<li>Find your MySQL password in <code>~/.my.cnf</code>. See also <a href="https://manual.uberspace.de/en/database-mysql.html">Uberspace Manual for MySQL</a>. Be careful not to get the wrong one! The second account is read only; this will result in lots of errors when you start the server.</li>
</ul>
<h2 id="baseinstall">Base Install</h2>
<p>Install the ghost-cli first:</p>
<pre><code class="language-shell">npm install -g ghost-cli@latest
</code></pre>
<p>Now we either execute <code>ghost install -d ~/ghost --no-setup-linux-user</code> and prompt our way through (you dont want to setup anything that is managed by the Uberspace team such as mysql, nginx, systemd and ssl) or execute the command below with the right parameters. You should change everything written in CAPS.</p>
<pre><code class="language-shell">ghost install -d ~/ghost --no-stack --url https://YOURDOMAIN.TLD --port $GHOSTPORT --db mysql --dbuser $USER --dbpass YOURDBPASSWORD --dbname $USER --process local --no-start --no-setup-mysql --no-setup-nginx --no-setup-ssl --no-setup-systemd --no-setup-linux-user --no-prompt
</code></pre>
<p>Ghost should now be installed in <code>~/ghost</code>.</p>
<h2 id="makeghostaccessiblefromtheoutside">Make Ghost accessible from the outside</h2>
<p>To make the Ghost server, which will only be running locally, accessible to the outside we need to proxy the requests to the server. For this we create a directory with the name of your (sub-)domain.</p>
<pre><code class="language-shell">mkdir /var/www/virtual/$USER/yourdomain.tld
</code></pre>
<p>Now we create an <code>.htaccess</code> file which redirects all requests to the port where your ghost instance is running. Just copy the whole thing into your shell:</p>
<pre><code class="language-shell">cat &lt;&lt;__EOF__ &gt;/var/www/virtual/$USER/comments.yourdomain.tld
DirectoryIndex disabled
RewriteEngine On
RewriteRule ^(.*) http://localhost:GHOSTPORT/$1 [P]
__EOF__
</code></pre>
<h2 id="createaservicefile">Create a service file</h2>
<p>Now we create the service file for ghost <code>~/etc/services.d/ghost.ini</code> with the following content (as explained on the <a href="https://manual.uberspace.de/en/daemons-supervisord.html">Uberspace Manual to supervisord</a>). Again just copy the command right into your shell:</p>
<pre><code class="language-shell">cat &lt;&lt;__EOF__ &gt;~/etc/services.d/ghost.ini
[program:ghost]
directory=/home/$USER/ghost
command=/home/$USER/bin/ghost run
environment = NODE_ENV=&quot;production&quot;
autorestart=true
__EOF__
</code></pre>
<p>Lastly reread the services directory and update the services:</p>
<pre><code class="language-shell">supervisorctl reread
supervisorctl update
</code></pre>
<p>That&apos;s it!</p>
<p>If everything worked Ghost is now available on yourdomain.tld, or alternatively under yourusername.uber.space<br>
You can now go to <a href="https://yourdomain.tld/ghost">https://yourdomain.tld/ghost</a> and start writing your blog!</p>
<p>Thanks for reading! If you have questions, leave a comment below!<br>
If you also want a comment section on your blog, check out <a href="/comments-on-ghost-on-uberspace-7/">my post on comments</a></p>
<h2 id="shortcut">Shortcut</h2>
<p>P.S.: Here&apos;s a small and &quot;stupid&quot; script that just executes the aforementioned commands in order, but reads your domain and passwords automatically. Just execute it and hit Enter if the url is correct. Use at your own risk!</p>
<ol>
<li>Download <a href="https://github.com/M4a1x/uberspace-ghost/blob/master/setup_ghost.sh">this script</a><pre><code class="language-shell">curl -O &apos;https://raw.githubusercontent.com/M4a1x/uberspace-ghost/master/setup_ghost.sh&apos;
</code></pre>
</li>
<li>Make it executable:<pre><code class="language-shell">chmod +x setup_ghost.sh
</code></pre>
</li>
<li>Execute it<pre><code class="language-shell">./setup_ghost.sh
</code></pre>
</li>
<li>Press Enter if URL is correct, otherwise enter <code>yourdomain.tld</code></li>
<li>Go to <code>yourdomain.tld</code> and enjoy your new blog!</li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Unileben Kyodai]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Ich spiele weiterhin mit der Google Spracherkennung herum. Funktioniert immer noch sehr gut. Insbesondere gew&#xF6;hnt man sich daran die Satzzeichen mit zu diktieren.</p><p></p>
<p>Im Dorm haben sie seit kurzem einen Plastik Bambusbaum aufgestellt in denen sie Gl&#xFC;ckw&#xFC;nsche und w&#xFC;nsche geh&#xE4;ngt</p>]]></description><link>https://blog.stabel.family/overcast-clouds-23-c-japan-ja-ich-spiele-weiter/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b3cc</guid><category><![CDATA[Japan]]></category><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Thu, 29 Jun 2017 14:42:33 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Ich spiele weiterhin mit der Google Spracherkennung herum. Funktioniert immer noch sehr gut. Insbesondere gew&#xF6;hnt man sich daran die Satzzeichen mit zu diktieren.</p><p></p>
<p>Im Dorm haben sie seit kurzem einen Plastik Bambusbaum aufgestellt in denen sie Gl&#xFC;ckw&#xFC;nsche und w&#xFC;nsche geh&#xE4;ngt haben. Ich vermute einfach mal, dass es das Tanabata Festival ist, bin mir da aber nicht ganz sicher, da ich noch nicht dazu gekommen bin jemanden dar&#xFC;ber auszufragen.</p>
<p>Weiterhin war ich heute mal wieder im Caf&#xE9; und nachdem ich da meinen Eiskaffee getrunken hatte habe ich beim Rausgehen wie die anderen G&#xE4;ste auch ein &#x30D6;&#x30EC;&#x30BC;&#x30F3;&#x30C8; (Present) bekommen, das aus einem Rasierer, Shampoo und Waschdeo besteht. Fand ich sehr interessant..</p>
<p>Auch habe ich zum ersten Mal einen Reifen nicht abgeschlossen ohne Fahrrad gesehen, normalerweise ist es ja andersrum oder der Reifen ist angeschlossen. Gibt&#x2019;s wohl nur in Japan.</p>
<p>Meine Schuhe die ich aus Deutschland mitgebracht habe, geben wohl auch langsam den Geist auf. Bei einem fehlt an der Ferse ein relativ gro&#xDF;es St&#xFC;ck der Sohle. Keine Ahnung wie das passiert ist oder wo dieses St&#xFC;ck gelandet ist.</p>
<p>Ganz langsam aber sicher macht mein IMDb Datenanalyseprojekt Fortschritte. Wer Lust hat kann sich das ja mal auf Github anschauen; da lade ich ab und zu mal den aktuellen Stand hoch. Freue mich &#xFC;ber Kommentare.</p>
<p><a href="https://github.com/M4a1x/IMDBanalysis">https://github.com/M4a1x/IMDBanalysis</a></p><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Unileben, schon wieder]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Tja die Posts werden wohl langsam wieder sp&#xE4;rlicher, das liegt allerdings aber auch daran dass in letzter Zeit nicht viel passiert ist. Heute habe ich nicht viel gemacht. Heute morgen etwas Mario gespielt auf meinem 3DS, danach ein wenig japanisch &amp; programmieren und anschlie&#xDF;end W&#xE4;</p>]]></description><link>https://blog.stabel.family/tja-die-posts-werden-wohl-langsam-wieder/</link><guid isPermaLink="false">6139d4bd0c0f7660feb6b3cd</guid><category><![CDATA[Japan]]></category><dc:creator><![CDATA[Max Stabel]]></dc:creator><pubDate>Sun, 25 Jun 2017 17:06:14 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Tja die Posts werden wohl langsam wieder sp&#xE4;rlicher, das liegt allerdings aber auch daran dass in letzter Zeit nicht viel passiert ist. Heute habe ich nicht viel gemacht. Heute morgen etwas Mario gespielt auf meinem 3DS, danach ein wenig japanisch &amp; programmieren und anschlie&#xDF;end W&#xE4;sche gewaschen. Dann hat mich Erika angerufen und gefragt ob ich Zeit habe beim Bambus schneiden zu helfen das war so gegen 2 Uhr.  Etwa gegen 6 Uhr war ich dann wieder zur&#xFC;ck im Dorm. Die meiste Zeit hat es eh geregnet, von daher war auch nicht viel mit Ausgehen, Wandern oder &#xE4;hnlichem. Heute Abend habe ich Spotlight geschaut. Verdammt guter Film. Und anschlie&#xDF;end ist mir die Idee gekommen mal eine diktier App f&#xFC;r&#x2019;s Handy auszuprobieren. Dieser Text z.B. wurde mit Google voice input diktiert. Funktioniert insgesamt ziemlich gut ist nur irgendwie ungewohnt Punkte und Kommas zu diktieren. Wobei ich Kommas meistens vergesse. Bin immer noch da hin und hergerissen ob ich das Datensammeln von Google aktivieren soll um die Spracherkennung zu verbessern, oder ob sie eigentlich schon gut genug ist. Ich sollte unbedingt noch weitere Kommandos nachschauen, au&#xDF;er Punkt und Komma.</p>
<p>Au&#xDF;erdem habe ich mit Erika und Alexis wieder Deutsch geredet und auch etwas Neues &#xFC;ber Japanisch gelernt. Es macht immer wieder Spa&#xDF; sich auf Deutsch mit ihnen zu unterhalten.
<br>Japanisch ist schon eine sehr simplizistisch Sprache, wodurch sie eben besonders schwer wird.</p><!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>