<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Leander&#39;s Blog</title>
    <link>https://blog.leandergoetz.eu/en/posts/</link>
    <description>Leander&#39;s Blog (Posts)</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>de-de</language>
    <lastBuildDate>Sun, 22 Sep 2024 13:27:36 +0200</lastBuildDate>
    
    <atom:link href="https://blog.leandergoetz.eu/en/posts/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>When life gives you a broken typewriter, fix it! 🛠</title>
      <link>https://blog.leandergoetz.eu/en/posts/repairing_typewriter/</link>
      <pubDate>Sun, 22 Sep 2024 13:27:36 +0200</pubDate>
      
      <guid>https://blog.leandergoetz.eu/en/posts/repairing_typewriter/</guid>
      <description>&lt;p&gt;Something uneventful happened in my life again: I am on Erasmus in France when suddenly I hear someone knocking at my door. I open up to find my English neighbour holding a pretty beaten up typewriter.
I take a quick look and accept the challenge.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;facts&#34; &gt;Facts
&lt;span&gt;
    &lt;a href=&#34;#facts&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;










&lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/bestand.webp&#34; width=&#34;&#34;&gt;



    
    &lt;source type=&#34;image/png&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/bestand.png&#34;&gt;
    &lt;img title=cha&amp;#32;cha&amp;#32;real&amp;#32;smooth src=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/bestand.png&#34; alt=&#34;Eine Schreibmaschine, Text darübe: Gabriele 25, ca. 1970&#34;&gt;



&lt;/picture&gt;
&lt;p&gt;The typewriter is actually a west-german one called Gabriele 25, by a company called &lt;a href=&#34;https://de.wikipedia.org/wiki/Triumph-Adler#Geschichte&#34;&gt;Adler&lt;/a&gt;. That&amp;rsquo;s interesting since my typewriter back at home is the east-german competitor&amp;rsquo;s Erika #14.&lt;/p&gt;
&lt;p&gt;Erasmus is pretty neat, but I did not expect to need a set of screwdrivers during my first month being here. Well, I&amp;rsquo;ve always wanted to see the inside of a french hardware store anyways 😉&lt;/p&gt;
&lt;blockquote class=&#34;block-green&#34;&gt;
&lt;p&gt;&lt;strong&gt;Fun-Fact:&lt;/strong&gt; Here in 🇫🇷 many hardware stores have the word &amp;ldquo;Brico&amp;rdquo; in their name because of &lt;em&gt;bricoler&lt;/em&gt; (eng.: to fix, to diy)&lt;/p&gt;
&lt;/blockquote&gt;











&lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/brico.webp&#34; width=&#34;25%&#34;&gt;



    
    &lt;source type=&#34;image/gif&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/brico.gif&#34;&gt;
    &lt;img title=Brico&amp;#32;mio src=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/brico.gif&#34; alt=&#34;Different logos including the word brico&#34;&gt;


&lt;/picture&gt;
&lt;h2 id=&#34;the-insides-&#34; &gt;The insides 🫀
&lt;span&gt;
    &lt;a href=&#34;#the-insides-&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;Equipped with new screwdrivers I got to work and opened Gabriele&lt;/p&gt;











&lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/dirty.webp&#34; width=&#34;&#34;&gt;



    
    &lt;source type=&#34;image/png&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/dirty.png&#34;&gt;
    &lt;img title=🤢🤮 src=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/dirty.png&#34; alt=&#34;Very dirty typewriter&#34;&gt;



&lt;/picture&gt;
&lt;blockquote class=&#34;block-red&#34;&gt;
&lt;p&gt;Dear Garbriele must have stood outside for a long time because there were a lot of tiny bugs and flies inside 🤢🤮&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had to open Gabriele up in the first place because the carriage (the part that should move while typing) stopped moving half way. This was probably due to the fact that Gabriele had rested too long in &amp;ldquo;travel mode&amp;rdquo;&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;, combined with a little moisture this resulted in rust.&lt;/p&gt;
&lt;h2 id=&#34;how-to-fix-it&#34; &gt;How to fix it?
&lt;span&gt;
    &lt;a href=&#34;#how-to-fix-it&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;blockquote class=&#34;block-green&#34;&gt;
&lt;p&gt;Answer: &lt;strong&gt;Cleaning&lt;/strong&gt; and &lt;strong&gt;oiling&lt;/strong&gt; 🛢 (aka WD40)&lt;/p&gt;
&lt;/blockquote&gt;











&lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/wd40.webp&#34; width=&#34;&#34;&gt;



    
    &lt;source type=&#34;image/gif&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/wd40.gif&#34;&gt;
    &lt;img title=my&amp;#32;lord&amp;#32;and&amp;#32;saviour src=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/wd40.gif&#34; alt=&#34;Animated heart that opens up to a picture of wd40 spray&#34;&gt;


&lt;/picture&gt;
&lt;blockquote class=&#34;block-red&#34;&gt;
&lt;p&gt;&lt;strong&gt;Hack:&lt;/strong&gt; WD40 and candles don&amp;rsquo;t like each other (🔥)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A lot of WD40 later and the carriage was moving perfectly smoothly.&lt;/p&gt;
&lt;blockquote class=&#34;block-orange&#34;&gt;
&lt;p&gt;&lt;strong&gt;Last To-do:&lt;/strong&gt; No typewriter without an &lt;u&gt; &lt;strong&gt;inkband&lt;/strong&gt; &lt;/u&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I quickly ordered one off of Amazon&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; (shoutout to my university here that has some deals so we get Prime free for 3 months!)&lt;/p&gt;
&lt;p&gt;Voilà:&lt;/p&gt;











&lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/done.webp&#34; width=&#34;&#34;&gt;



    
    &lt;source type=&#34;image/png&#34; srcset=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/done.png&#34;&gt;
    &lt;img title=you&amp;#32;could&amp;#32;write&amp;#32;love&amp;#32;letters&amp;#32;here&amp;#32;(or&amp;#32;your&amp;#32;grandma) src=&#34;https://blog.leandergoetz.eu/pics/repairing_typewriter/done.png&#34; alt=&#34;Image of a perfectly repaired typewriter that &#34;&gt;



&lt;/picture&gt;
&lt;p&gt;One headache remains with Gabriele tho&amp;hellip;&lt;/p&gt;
&lt;blockquote class=&#34;block-orange&#34;&gt;
&lt;p&gt;She has a &lt;a href=&#34;https://en.wikipedia.org/wiki/AZERTY#/media/File:KB_France.svg&#34;&gt;&lt;em&gt;french&lt;/em&gt; keyboard layout&lt;/a&gt; 😳&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;special-thanks-to&#34; &gt;Special thanks to
&lt;span&gt;
    &lt;a href=&#34;#special-thanks-to&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;blockquote class=&#34;block-green&#34;&gt;
&lt;p&gt;&lt;strong&gt;Arthur&lt;/strong&gt; (Typewriter-Finder, Proofreader)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Caro&lt;/strong&gt; (Article-Reminder, Proofreader)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dani&lt;/strong&gt; (Screwdriver-Lender)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gonzalo&lt;/strong&gt; (Chill-Roommate)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fabienne&lt;/strong&gt; (English pedantic)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Travel mode is common for portable typewriters so that the damages while carrying it are reduced.&amp;#160;&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;&gt;
&lt;p&gt;Unfortunately I couldn&amp;rsquo;t find a local store here that sold typewriter inkbands :(&amp;#160;&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;/div&gt;
</description>
    </item>
    
    <item>
      <title>scraping austria - a painful lesson in webscraping</title>
      <link>https://blog.leandergoetz.eu/en/posts/scraping_austria/</link>
      <pubDate>Wed, 10 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.leandergoetz.eu/en/posts/scraping_austria/</guid>
      <description>&lt;p&gt;Servus! I got the inspiration for this project by a youtube video I watched. In the video, the guy scrapes some embassy websites and automatically sends an e-mail to every single embassy. It&amp;rsquo;s a very entertaining video, you can watch the &lt;a href=&#34;https://www.youtube.com/watch?v=Jbix9y8iV38&amp;amp;t=115s&#34;&gt;video here&lt;/a&gt;. Inspired by the &amp;ldquo;simple&amp;rdquo; approach, I thought: Well, embassies are taken, what else is there to scrape? And I wanted something more challenging than scraping 10 accumulating websites that have basically done my job already.
So I came up with something original:&lt;/p&gt;
&lt;h1 id=&#34;scraping-every-single-website-of-every-municipality-in-austria-&#34; &gt;scraping every single website of every municipality in austria 🇦🇹
&lt;span&gt;
    &lt;a href=&#34;#scraping-every-single-website-of-every-municipality-in-austria-&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;The task was determined, now all I needed was a well thought out plan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;find a list of ALL municipalities&lt;/li&gt;
&lt;li&gt;combine each municipality&amp;rsquo;s name with different domains&lt;/li&gt;
&lt;li&gt;find existing domains&lt;/li&gt;
&lt;li&gt;look for indicators that the current site is the correct one (and not just a registered, unused one or - even worse - a business site)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Let&amp;rsquo;s go!&lt;/em&gt;&lt;/p&gt;
&lt;h1 id=&#34;finding-a-list---all-hail-statistik-austria&#34; &gt;finding a list - all hail statistik austria
&lt;span&gt;
    &lt;a href=&#34;#finding-a-list---all-hail-statistik-austria&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;Finding a complete and up-to-date list wasn&amp;rsquo;t quite as hard as I thought it would be. Turns out that Statistik Austria has some pretty cool stuff on their website, like &lt;a href=&#34;http://www.statistik.at/verzeichnis/reglisten/gemliste_knz.xls&#34;&gt;this table&lt;/a&gt; which contains every municipality, it&amp;rsquo;s postal code (PLZ) and it&amp;rsquo;s &lt;strong&gt;Gemeindekennziffer&lt;/strong&gt; (GKZ).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What the hell is a GKZ?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.leandergoetz.eu/pics/scraping_austria/confusedDoggo.webp&#34; alt=&#34;Confused Dog&#34;&gt;&lt;/p&gt;
&lt;p&gt;Glad you asked! It&amp;rsquo;s a unique number assigned to each municipality, much like a postal code number, but still very much different. The GKZ has five digits, while the PLZ has only four. PLZs are an old system which has it&amp;rsquo;s pros and cons, the biggest disadvantage being that PLZs don&amp;rsquo;t have geographical meaningfulness:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2384 is the PLZ for Breitenfurt, Lower Austria&lt;/li&gt;
&lt;li&gt;3012 is the PLZ for Wolfsgraben, Lower Austria (only 4km away from the former)&lt;/li&gt;
&lt;li&gt;Vorarlberg&amp;rsquo;s PLZs all start with 6, which is also Tyrol&amp;rsquo;s first number&lt;/li&gt;
&lt;li&gt;Except South Tyrol&amp;rsquo;s PLZ: starts with 9, which is otherwise Carinthia&amp;rsquo;s!&lt;br&gt;
&lt;br&gt;
One can see: This system is not good, especially if you want to retrieve geographical data from it.&lt;br&gt;
That&amp;rsquo;s why Statistik Austria came up with the GKZ&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;the-genius-way-of-gkz&#34; &gt;the genius way of GKZ
&lt;span&gt;
    &lt;a href=&#34;#the-genius-way-of-gkz&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;As mentioned above the GKZ consists of 5 numbers:
The first representing the state with numbers 1 to 9.
Second and third represent the political districts within the state.
The last two digits represent the municipalities within that district.
So Bisamberg for example has the GKZ: 3 12 01&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3: Lower Austria&lt;/li&gt;
&lt;li&gt;12: District of Korneuburg&lt;/li&gt;
&lt;li&gt;01: Bisamberg&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;br&gt;&lt;br&gt;
&lt;em&gt;Way better!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;combinations-and-permutations-are-a-pain-in-the-ass&#34; &gt;combinations and permutations are a pain in the ass
&lt;span&gt;
    &lt;a href=&#34;#combinations-and-permutations-are-a-pain-in-the-ass&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;So Austria has roughly 2100 municipalities. That&amp;rsquo;s a lot. Especially if you think about all possible combinations for domains.
&amp;lsquo;&amp;lsquo;&amp;lsquo;python
gemeinde_name = &amp;ldquo;Bisamberg&amp;rdquo;.lower()&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;list_possible_domains = [

    # If the website isn&#39;t in HTTPS, trying to access it via HTTPS will throw an error
    &amp;quot;http://www.{gemeinde_name}.gv.at&amp;quot;.format(gemeinde_name)

    # Not everybody uses .gv domains
    &amp;quot;http://www.{gemeinde_name}.at&amp;quot;.format(gemeinde_name)

    # Turns out: states have domains??? Mostly Tyrol (.tirol), Burgenland (.bgld) and Upper Austria (.ooe)
    &amp;quot;http://www.{gemeinde_name}.bgld.gv.at&amp;quot;.format(gemeinde_name)

]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;rsquo;&amp;rsquo;&amp;rsquo;
For one-worded municipalities this approach works fine but it won&amp;rsquo;t work with such as &amp;ldquo;Krems an der Donau&amp;rdquo;. Another example are all municipalities with &amp;ldquo;Sankt&amp;rdquo;, like &amp;ldquo;St. Georgen im Lavanttal&amp;rdquo;. The work-around I came up with is a very simple one:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ugly_gemeinde_name_1 = &amp;quot;Krems an der Donau&amp;quot;.lower()

split_gemeinde_name_1 = ugly_gemeinde_name_1.split(&amp;quot; &amp;quot;) // =&amp;gt; [&#39;krems&#39;,&#39;an&#39;,&#39;der&#39;,&#39;donau&#39;]

# Then I wrote some very ugly functions that format different possible domain names - I will spare you the details.
# In the end, the list of possible domains looked like this

list_of_possible_domains = [

    &amp;quot;http://www.krems.at&amp;quot;,
    &amp;quot;http://www.krems-an-der-donau.at&amp;quot;,
    &amp;quot;http://www.krems-donau.at&amp;quot;,
    &amp;quot;http://www.krems.gv.at&amp;quot;,
    &amp;quot;http://www.krems-an-der-donau.gv.at&amp;quot;,
    &amp;quot;http://www.krems-donau.gv.at&amp;quot;

# ... and more ]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;requests-and-false-positives&#34; &gt;requests and false positives
&lt;span&gt;
    &lt;a href=&#34;#requests-and-false-positives&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;So after generating all possibilities, I cycled through them and sent a GET request to each one. If the domain doesn&amp;rsquo;t exist, python will throw an error and with a simple try except magic, you can easily catch those and verify existing sites.&lt;/p&gt;
&lt;h1 id=&#34;are-you-4-real&#34; &gt;are you 4 real?
&lt;span&gt;
    &lt;a href=&#34;#are-you-4-real&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;So it turned out: just because the site exists doesn&amp;rsquo;t mean that it&amp;rsquo;s the right one. There are business or private sites that use one of the generated domains. I had to check for keywords like &amp;ldquo;Rathaus&amp;rdquo;, &amp;ldquo;Gemeindeamt&amp;rdquo; etc. And even with these checks, I am pretty sure that there are STILL wrong sites in my table - nobody&amp;rsquo;s perfect!&lt;/p&gt;
&lt;h1 id=&#34;you-got-mail&#34; &gt;you got mail
&lt;span&gt;
    &lt;a href=&#34;#you-got-mail&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;After hours of crawling &amp;amp; scraping I finally had a table to work with for scraping the e-mail adresses. It&amp;rsquo;s basically the same step as before when I checked for keywords, only that this time I was looking for words like &amp;ldquo;Kontakt&amp;rdquo; and &amp;ldquo;Impressum&amp;rdquo; and then had to parse only the adress without any unwanted text like the &amp;ldquo;to:&amp;rdquo; junk. For this step I had to use selenium because many of the sites use an excessive amount of javascript. So I had to render it. But I actually really enjoyed working with selenium - very powerful tool!&lt;/p&gt;
&lt;p&gt;Now all that was left to do was to look for errors (there were a LOT) and some general cleanup and encoding issues. I learned a lot while doing this and also had a lot of fun. You can find the data on my &lt;a href=&#34;https://github.com/bresu/oe_gemeinden&#34;&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;My &lt;a href=&#34;https://www.youtube.com/watch?v=77gKSp8WoRg&#34;&gt;hometown&lt;/a&gt;!&amp;#160;&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;/div&gt;
</description>
    </item>
    
    <item>
      <title>schools and privacy: don&#39;t mix!</title>
      <link>https://blog.leandergoetz.eu/en/posts/webuntis/</link>
      <pubDate>Fri, 10 Jan 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.leandergoetz.eu/en/posts/webuntis/</guid>
      <description>&lt;p&gt;If you are/ were a student in Austria during thr last 10 years, you probably came into contact with the company WebUntis. Mostly known for their timetable manager tool and security flaws.&lt;/p&gt;
&lt;p&gt;So the company&amp;rsquo;s reputation really isn&amp;rsquo;t the best when it comes to security vulnerabilities and how they handle them. It took them allegedly 5 months to close a XSS-vulnerability on their site&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; But for an austrian enterprise whose headquarters are located in Lower Austria they are actually doing pretty good.&lt;/p&gt;
&lt;p&gt;Or so I thought.&lt;/p&gt;
&lt;h1 id=&#34;school-admins-are-just-people-too&#34; &gt;School-Admins are just people too
&lt;span&gt;
    &lt;a href=&#34;#school-admins-are-just-people-too&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;Being responsible for the IT-System of a school must be horrible. Colleagues forget their passwords, the student-database needs to be constantly kept up-to-date and you have to work with horrible Software, such as &lt;strong&gt;Excel&lt;/strong&gt;(😔), &lt;strong&gt;Word&lt;/strong&gt;(🤮)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Heartfelt condolences to you, admins ❤️&lt;/p&gt;
&lt;p&gt;But nevertheless: some mistakes can not be forgiven!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So it turns out that most school administrators either did not read the WebUntis-Manuals carefully enough or they simply misunderstood the meaning of some website-settings. But these &amp;ldquo;minor&amp;rdquo; mistakes are the reason for why the data of 100s of students is freely accessible online.&lt;/p&gt;
&lt;h1 id=&#34;so-whats-the-problem-now&#34; &gt;So what&amp;rsquo;s the problem now?
&lt;span&gt;
    &lt;a href=&#34;#so-whats-the-problem-now&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;As much as I would like to show you what I mean by that: I won&amp;rsquo;t.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Because we are talking about data of minors, children. And this is not a &amp;ldquo;how-to-get-arrested tutorial&amp;rdquo;.
AFAIK 3 schools in and outside of Vienna are affected - roughly 1800 students total. The data you can access freely include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Class-Name 🤨&lt;/li&gt;
&lt;li&gt;First and Last name 🤨🤨&lt;/li&gt;
&lt;li&gt;Electives and schedule 🤨🤨&lt;/li&gt;
&lt;li&gt;Religious belief (can be deducted from religion-class) 🤨🤨🤨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But what I can show you is how stupid some of WebUntis&amp;rsquo; design really is!&lt;/p&gt;
&lt;p&gt;Enjoy 😁&lt;/p&gt;
&lt;h1 id=&#34;webuntis-security-bullshit&#34; &gt;WebUntis &lt;del&gt;Security&lt;/del&gt; &lt;em&gt;Bullshit&lt;/em&gt;
&lt;span&gt;
    &lt;a href=&#34;#webuntis-security-bullshit&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;When I went to school, our admin configured the timetable-accessibilty by groups. So if you were a student, you could see any other students timetable.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For a long time, I thought only our admin did this bad practice&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Turns out: &lt;em&gt;This is pretty normal for most schools!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This alone is a big security hazard. It only takes one students compromised account to get access to the whole network.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But it even get&amp;rsquo;s better!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The default username and password can be configured and most of the time the login credentials look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Schüler: Maximilian Mustermann (10.10.2001)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;must.max&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;20011010&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Every admin has the possibility to customize these defaults, so every school does their own thing - which is good for security!&lt;/p&gt;
&lt;p&gt;But oh boy you gotta look at this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.leandergoetz.eu/pics/webuntis/webuntisTutorial.jpg&#34; alt=&#34;Oh no&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;😐&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Apparently, a lot of schools send out guides on how to use WebUntis. With a little bit of Google-Dorking&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; you will find most of them. Now you know the default credential sytle 🎉 And I am pretty sure that there will be some students that &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; change their default password.&lt;/p&gt;
&lt;p&gt;But this alone is not yet the real problem!&lt;/p&gt;
&lt;p&gt;Once you are logged in, you can see your fellow students usernames. No fullnames?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Great, so where do the fullnames come from then?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, you can not only see everyones timetable, but you can also &lt;em&gt;print&lt;/em&gt; them:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.leandergoetz.eu/pics/webuntis/webuntisPlease.gif&#34; alt=&#34;I MADE THIS GIF WOOOO&#34;&gt;&lt;/p&gt;
&lt;p&gt;Clicking on that will open a new &lt;em&gt;window&lt;/em&gt; with the timetable being formatted in HTML (no PDFs are created)&lt;/p&gt;
&lt;p&gt;and what is that?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.leandergoetz.eu/pics/webuntis/webuntisFullname.jpg&#34; alt=&#34;Oh no, our timetable - it&amp;amp;rsquo;s broken!&#34;&gt;&lt;/p&gt;
&lt;p&gt;Stay safe y&amp;rsquo;all&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://packetstormsecurity.com/files/157998/WebUntis-2020.12.1-Cross-Site-Scripting.html&#34;&gt;Bug report&lt;/a&gt;&amp;#160;&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;&gt;
&lt;p&gt;also called &lt;a href=&#34;https://en.wikipedia.org/wiki/Google_hacking&#34;&gt;Google-Hacking&lt;/a&gt;&amp;#160;&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;/div&gt;
</description>
    </item>
    
  </channel>
</rss>
