Danke Unitymedia/Vodafone! Danke BIND9

Während das erstere eher ironisch gemeint ist, es das zweite ein ganz ehrlicher Dank. Aber wieso schreibe ich das so? Eine kurze Geschichte, wie ich mal meinen Unitymedia-Anschluss auf eine höhere Geschwindigkeit umstellen wollte.

Die Vorgeschichte

Ich bin nunmal Informatiker. Das bedeutet, ich probiere gerne Dinge aus. So habe ich auch einen kleinen Raspberry, auf dem ich eine private Cloud (Nextcloud) verwende. Um von außen dranzukommen, klar, habe ich eben eine DynDNS-Weiterleitung auf die öffentliche IP meines Hausanschlusses bei Unitymedia und entsprechende Portfreigaben. Alles funktioniert.

Nun hatte ich die Idee, ich könnte Geld sparen, da ich immer weniger klassisch fernsehe und immer mehr streame – also weg mit dem HD-Tarif und her mit mehr Geschwindigkeit. Im Rahmen des Telefonats mit der netten Dame von Vodafone/Unitymedia habe ich dann mehrfach nachgefragt, ob nicht doch aus meinem IPv4-Tarif plötzlich ungewollt DSLite wird. „Nein“, so sagte die Dame, „alles bleibt wie bisher“.

Das Unheil

Und weil ich mich ja auf mein 2-wöchiges Widerrufsrecht berufen kann, habe ich das mal bestellt. Trotz angekündigter Wartezeit wegen hoher Nachfrage trudelte bereits 2 Tage später das neue Kabelmodem, eine so genannte Vodafone Easybox, bei mir ein. Erstmal nur den Rechner angeschlossen, alles mögliche wieder so eingestellt, wie bereits am alten Router (insbesondere die Portweiterleitungen) und dann: Stecker raus, neues Gerät hingestellt, Stecker rein. Und siehe da: Nach einigen Minuten bangen Wartens funktionierten nicht nur Internet, sondern auch das Telefon. Das war ja schon mal schön.

Aber was war das?

Meine Cloud (und noch ein weitere Dienst, den ich nach außen bereitstelle) waren hingegen nicht mehr erreichbar. Einfach tot. Von keinem PC und keinem Handy mehr erreichbar. Na gut, dachte ich, da warte ich nochmal ein bisschen. Beim Einkaufen probierte ich dann den Zugriff auf meiner Cloud nochmal von unterwegs und siehe da, sie war online! Hurra!

Wieder zuhause: Kein Zugriff. Komisch. Also, WLAN am Handy nochmal deaktiviert: Zugriff möglich. WLAN am Handy wieder aktiviert: Kein Zugriff. Sprich: Zugriff von außerhalb möglich, aber von innerhalb desselben LAN nicht? Das gab’s ja noch nie! Normalerweise ist es immer umgekehrt!

Nach langem Googeln dann:

Die Lösung

Die tolle Vodafone Easybox unterstützt (im Gegensatz zu allen mir bisher bekannten Routern)  kein NAT-Loopback! Sprich: Sobald eine Anfrage aus dem internen Netz nach außen erfolgt und wieder zurückkommt, wie in diesem Fall, streckt die Easybox die Flügel und verwirft die ganze Anfrage. Super! Was jetzt?

Nun, die Lösung ließ sich ebenfalls mit einigem Zeitaufwand ergoogeln. Ein eigener Nameserver muss her und der muss dafür sorgen, dass die Anfragen auf den entsprechenden Domainnamen eben nicht mehr auf die externe IP verweisen, sondern auf die interne IP im LAN. BIND9 ist auf dem Raspberry ja schnell aufgesetzt. Dann definiert man noch eine Response Policy Zone und schon geht’s.

Im Detail

Man lege zunächst eine Konfiguration für die RPS an namens db.rpz im Ordner /etc/bind:

Hierdurch werden quasi Einträge der eigentlichen DNS-Antwort „überschrieben“. Dadurch erfolgt eine Umleitung auf interne IP-Adressen anstatt auf die externe IP-Adresse des Routers. Hat man diese Konfiguration angelegt, muss man in der lokalen Konfiguration noch eine entsprechende Zone anlegen:

Schlussendlich müssen wir die Zone noch in den Optionen aktivieren:

Startet man dann den Dienst neu funktioniert sowohl von außerhalb des LAN als auch von innerhalb alles wie vorher.

Ein- und Ausblenden von Rahmen in RDLC-Reports

Ich hatte folgende Anforderung. In einem Report, in welchem Detailzeilen bereits über ein anderes Element ein- und ausgeblendet werden konnten (Plus/Minus-Knopf) sollte eine Summenzeile rein. Diese sollte, wenn die Details ausgeklappt waren, oben mit einer Rahmenlinie abgesetzt sein, aber keine Rahmenlinie haben, wenn der Detailbereich eingeklappt war.

Nun, leider kann man zwar den Rahmentyp dynamisch durch einen Ausdruck anpassen, aber ob nun der Detailbereich ein- oder ausgeklappt ist, lässt sich so nicht feststellen.

Die Lösung hierfür ist: Duplizieren der Summenzeile.

Man hat nun zwei Zeilen mit demselben Inhalt. Die erste Zeile designt man so, wie sie im ausgeklappten Zustand erscheinen soll, die zweite, so wie sie im eingeklappten Zustand erscheinen soll.

Nun wählt man durch Rechtsklick für jede Zeile den Menüpunkt „Row Visibility“. Je nach Anfangszustand stellt man folgende Parameter für jede der zwei Zeilen ein:

Die Zeile, die anfangs sichtbar sein soll, erhält den Zustand „Show“ und „Display can be toggled by this report item“ mit dem entsprechenden Feld, welches auch die Details ein- und ausblendet.

Die Zeile, die bei Statusänderung sichtbar sein soll, erhält den Zustand „Hide“ und „Display can be toggled by this report item“ mit demselben Feld, welches auch die Details und die andere Report-Summenzeile steuert.

Und schon klappt es…

@IBDesignable: Using class UIView for object with custom class

Aktuell programmiere ich eine kleine iOS Anwendung für meine Tochter. Im Zuge der Entwicklung fand ich heraus, dass es schon seit Längerem möglich ist, eigene Views auch im Interface Builder per @IBDesignable Attribut anzeigen zu lassen. Das ging früher nicht. Natürlich hat mich das sehr gefreut und spontan habe ich das mit einem selbstgezeichneten Control ausprobiert…

Nur hat es leider gar nicht funktioniert. Immer bekam ich eine Warnung:

Using class UIView for object with custom class because the class … does not exist

Nach 1 1/2 Stunden intensiven Ausprobierens, Lesen von Tutorials (in denen natürlich alles super klappt) und dem kurzen Gedanken, den ganzen Mist einfach bleiben zu lassen, kam dann die Erleuchtung und damit auch die Lösung:

Die Modulbezeichnung darf keine Leerzeichen oder Sonderzeichen beinhalten. Also merke:

Wenn Du ein neues Projekt anlegst, verzichte auf Leerzeichen und Sonderzeichen…

Seite nun auf Deutsch

Über Jahre habe ich mich damit abgemüht, meine Inhalte möglichst international zu gestalten. Die ganze Diskussion über die DSGVO hat dem nun ein Ende gesetzt. Die Seite wird nun über kurz oder lang komplett eingedeutscht, neue Inhalte werden nur noch auf Deutsch veröffentlicht.

Ich danke meinen internationalen Gästen für ihr Interesse.


For years I’ve worked hard to post in Englisch to reach an international audience. The entire GDPR discussion ends this. This site will from now on be in German only. Existing content will be migrated over the course of the coming weeks, new content will only be in German.

I thank my international guests for their interest in my content.

nuget.exe in Visual Studio 2017 verwenden

In früheren Versionen von Visual Studio konnte ich nuget Packages erzeugen, indem ich ein Post-Build-Ereignis hinzufügt, das das alte Paket löschte und ein neues durch Aufrufen von nuget.exe erzeugte:

nuget pack "$(ProjectPath)"

Das hat mit einem Mal in Visual Studio 2017 nicht mehr funktioniert. Stattdessen begrüßte mich ein Fehler #9009 in der entsprechenden Zeile, was bedeutet, dass nuget.exe von Visual Studio nicht gefunden werden konnte. Ich kopierte die neueste Verson von nuget.exe in C:\Windows\System32 und konnte das Programm auch erfolgreich von der Windows Console aufrufen. Aber was soll ich sagen? Der Fehler in Visual Studio kam immernoch. Auch in der Visual Studio Nuget Console.

Langer Rede kurzer Sinn (und Facepalm): Da Visual Studio ein 32-bit Programm ist, muss nuget.exe natürlich in C:\Windows\System32\SysWOW64 um es zum Laufen zu kriegen…

Ich bin wieder da

Ich verwende auch wieder ein CMS für meine Seite. Warum? Statische Seitengeneratoren funktionieren zwar ganz gut, aber mir fehlt die Möglichkeit, von überall aus zu schreiben – zuhause oder auch am Smartphone.

Und darum läuft diese Seite jetzt auch wieder mit WordPress 🙂