Datenhaufen zu IT und Elektronik.

Autor: kernel-error (Seite 13 von 47)

IPv6 Traffic hat sich verdoppelt

Wenn ich meine Graphen so verfolge sehe ich eine Verdopplung des IPv6 Traffics seit dem Anfang diesen Jahres beim HTTPS Traffic. SMTP ist es nur knapp 50% mehr. Ich würde nun jetzt einfach mal behaupten dass inzwischen viel mehr Enduser mit einer IPv6 Adresse unterwegs sind und Mailserverbetreiber so schnell nicht „nachziehen“.

Mich überrascht dieser starke Anstieg in 2017 etwas daher habe ich nun mal alles gegen meinen IPv4 Traffic gehalten.

Insg. habe ich von meinen Systemen ausgehend 12,5% mehr IPv6 Traffic als IPv4 Traffic. Eingehend habe ich tatsächlich 6% mehr IPv6 Traffic als IPv4 Traffic 🙂 OK OK jetzt bin ich dabei sicher nicht repräsentativ… Nur ist in 2017 das Verhältnis zumindest bei mir von IPv4 zu IPv6 gekippt. Jetzt sind alle Systeme bei mir durchgängig IPv6 fähig und alles bewegt sich sicher sehr in seiner eigenen Blase, nicht zu viel herein steigern…

Gab es da nicht vor Kurzem eine Heise Meldung?

https://www.heise.de/newsticker/meldung/IPv4-Adressen-immer-knapper-Adressklau-sogar-mit-gefaelschter-Sterbeurkunde-3872129.html

Schaue ich mir die großen an sieht man das es mehr wird und vor allem auch bei uns in Deutschland:

https://www.google.de/ipv6/statistics.html

https://stats.labs.apnic.net/ipv6

Mit einigen Bekannten habe ich ebenfalls gesprochen, hier zeigt sich ein sehr ähnliches Bild. Wir bleiben nur immer in der gleichen „Blase“. Mein Brötchengeber wäre noch ein ganz guter und sicher schon ein repräsentativ Statistikgeber, nur leider ist es hier produktiv noch extrem dunkel wenn es um IPv6 geht. 🙁 Hier gibt es gerade andere Baustellen.

Wie ist es denn bei euch? Jemand ein paar Zahlen oder Links für mich?

Update

Na schau an, eine erste Anregung habe ich schon mal. Mobile Endgeräte... Wenn man nicht gerade bei der Telekom ist sind viele noch mit ihren Smartphones auf IPv4 festgebunden. Statistiken von google/facebook/twitter usw. wird dieses sicher stark verfälschen. Wobei *grübel* verfälschen? Ist „das Internet“ (ich denke gerade an The IT Crowd) nicht inzwischen eher Smartphone? Benutzer mit einem Smartphone werden meine Webseite kaum anschauen, denn sie sieht mit so einem Gerät noch viel schlimmer aus als sie es bereits mit einem normalen Browser tut.

RFC 7858 – DNS over Transport Layer Security

Ich habe in den letzten Tagen etwas mit dem RFC 7858 (https://tools.ietf.org/html/rfc7858) herumgespielt. Meine Zonen und auch Dienste sind per DNSsec, HSTS, Pinning usw. usw. abgesichert. Warum also noch DNS per TLS? Nun ja… Sinn macht es sicher keinen, bei mir ist nichts spannendes zu finden und kaum ein Besucher wird mit Problemen rechnen müssen wenn er hier ist. Für mich sollte Kryptographie nicht die Ausnahme sondern der Normalzustand sein. RFC 7858 ist da nur ein weiteres Detail. In einer DNS Abfrage finden sich selten geheime Daten. Klar wäre es schlecht wenn diese verändert würden um diese zu verhindern reicht eine Signatur. Das mitlesen der DNS Abfragen würde einer dritten Person so aber offenlegen wo man surft und welche Dienste man nutzt. Sind diese Abfragen per TLS verschlüsselt bleibt dieses geheim. Daher macht es wohl am meisten Sinn es für seinen lokalen DNS Resolver zu nutzen oder es auf großen DNS Servern zu aktivieren. DNS Servern welche sich um viele Zonen kümmern….

Um irgendwo zu starten und selbst einen Eindruck davon zu bekommen habe ich es auf meinen DNS Servern für meine Zonen aktiviert. Bis auf ns2.kernel-error.org haben die Server gültige Zertifikate. Bei ns2.kernel-error.org muss ich mal schauen wie es sich entwickelt.

Als Test:

$ getdns_query -s www.kernel-error.de a @176.9.109.53 -l L

Viel Spaß

Sanftanlauf für Elektromotoren: Softstart und Anlaufstrombegrenzer im Detail

In meiner Werkstatt habe ich ein paar Elektrogeräte für welche ich gerne einen Sanftanlauf hätte. Einmal um den „Druck“ den hohen Anlaufstrom etwas von den ~Sicherungen~ zu nehmen und dann natürlich um die Geräte an sich etwas zu schonen, denn ein schlagartig anlaufender Elektromotor haut schon ganz schön rein 🙂

Natürlich gibt es viele schöne Dinge, die man einfach kaufen und zwischen stecken/einbauen kann aber ich wollte selbst einmal überlegen wie ich es realisieren kann und vor allem mit dem Zeug aus meiner „Restekiste“. So bin ich auf folgende Schaltung für meine Absauganlage gekommen. Die Anlage bekommt nur Strom, wenn ein anders Elektrogerät eingeschaltet wird und schaltet mit einem gewissen Nachlauf selbst ab (diese Schaltung führe ich vielleicht auch mal irgendwann auf). Es funktioniert also nicht diese einfach immer unter Strom zwischen zu stecken! Oh und natürlich sind Arbeiten am Strom sehr gefährlich und dürfen nur von Menschen ausgeführt werden, welche dieses dürfen 🙂 Diese Beschreibung also nicht nachmachen!

Schaltplan für einen 240V Sanftanlauf für Elektromotoren.

C1 und R1 arbeiten in der Schaltung als eine Art Kondensatornetzteil. D1 – D4 übernehmen die Aufgabe des Gleichrichters. R2 sorgt dafür, dass beim Abschalten die Schaltung möglichst schnell spannungsfrei ist (die Kondensatoren also entladen werden). C2 glättet die Spannung aus dem Gleichrichter, D5 nagelt die Spannung in der Schaltung auf ca. 18V fest. Über R3 wird C3 langsam geladen. R4 sorgt wieder für schnelles Entladen von C3. D6 schützt Q1 vor der Spule in K1, R5 ist die eigentliche „Handbremse“ für den nachgeschalteten Elektromotor. Er lässt, bis zum anziehen des Relais weniger durch und der Motor kann nicht mit voller Power loslegen.

Kommt also Spannung auf die Schaltung wird diese so lang über R5 zum Motor geleitet, bis C3 geladen ist. Denn wenn C3 voll ist, schaltet Q1 durch und somit zieht K1 an und überbrückt so R5.

R5 muss daher auf den nach gelagerten Elektromotor abgestimmt sein, sonst platzt R5 ggf. einfach. Die Größe von C3 bestimmt hierbei die Länge der Verzögerung von K1. 220μF war dabei für mich etwas zu klein. 440μF ist die perfekte Zeit

Die Platine selbst sieht nun so aus.

Selbstgebaute Platine für einen 240V Sanftanlauf für Elektromotoren.

Oh, die Absauganlage besteht aus einem Nassauger von Kärcher hinter einem selbstgebauten Zyklonabscheider.

Fragen? Dann fragen 🙂

Read- und Write-Latency mit ioping messen: So geht’s

Um die Performance von irgendwelchen Datenträgern / Netzlaufwerken usw. zu messen gibt es sehr viele verschiedene Tools. bonnie++ ist hier ein gutes Beispiel. Möchte man nur „mal schnell“ die read-/write latency messen und ein paar grobe Infos zu den IOPs haben kann ich hier ioping empfehlen.

Ein Beispiel zum messen der read latency:

➜  ~ ioping -s 256k -T 120 -D -c 20 ./
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=1 time=16.0 us (warmup)
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=2 time=35.7 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=3 time=45.8 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=4 time=46.3 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=5 time=43.4 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=6 time=46.8 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=7 time=41.2 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=8 time=41.7 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=9 time=47.7 us (slow)
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=10 time=42.4 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=11 time=41.8 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=12 time=41.1 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=13 time=48.8 us (slow)
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=14 time=47.1 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=15 time=42.8 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=16 time=47.9 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=17 time=50.5 us (slow)
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=18 time=52.8 us (slow)
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=19 time=44.6 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=20 time=45.3 us

--- ./ (zfs tanksmeer/usr/home) ioping statistics ---
19 requests completed in 853.7 us, 4.75 MiB read, 22.3 k iops, 5.43 GiB/s
generated 20 requests in 19.0 s, 5 MiB, 1 iops, 269.2 KiB/s
min/avg/max/mdev = 35.7 us / 44.9 us / 52.8 us / 3.85 us

ioping liest hier jeweils 256k (-s 256k), ignoriert alles was länger brauch als die angegebene Zeit (-T 120), macht es als direct IO ohne cache (-D), dieses insg. 20 mal in Folge (-c 20) und einfach im aktuellen Pfad (./).

Die Zusammenfassung ist ähnlich wie bei ping 🙂

Ein Beispiel zum messen der write latency:

➜  ~ ioping -s 256k -T 120 -D -W -c 20 ./
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=1 time=27.0 us (warmup)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=2 time=54.4 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=3 time=60.6 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=4 time=65.5 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=5 time=57.8 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=6 time=74.0 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=7 time=65.5 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=8 time=65.3 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=9 time=70.9 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=10 time=70.7 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=11 time=2.65 ms (slow)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=12 time=71.8 us (fast)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=13 time=64.5 us (fast)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=14 time=77.0 us (fast)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=15 time=63.3 us (fast)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=16 time=67.4 us (fast)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=17 time=51.6 us (fast)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=18 time=82.9 us (fast)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=19 time=81.5 us (fast)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=20 time=56.2 us (fast)

--- ./ (zfs tanksmeer/usr/home) ioping statistics ---
19 requests completed in 3.86 ms, 4.75 MiB written, 4.93 k iops, 1.20 GiB/s
generated 20 requests in 19.0 s, 5 MiB, 1 iops, 269.5 KiB/s
min/avg/max/mdev = 51.6 us / 202.9 us / 2.65 ms / 577.9 us

Richtig… Hier ist nur ein -W dazu gekommen!

So lässt sich schnell und einfach ein Eindruck über die aktuelle Performance von einem „Filesystem“ erlangen. Einfach um zu sehen ob es sich unter Last anders verhält oder ähnliches.

Viel Spaß und bei Fragen, einfach fragen.

FreeBSD CPU Microcode Updates

Das es auch mal in einer CPU Fehler geben kann ist nicht jedem bewusst. Da es aktuell sehr durch die Presse geht, inzwischen vielleicht schon einigen Menschen mehr als vorher. Das diese Fehler in CPUs sogar recht oft vorkommen, daran denken die wenigsten. Ich kann mich noch an einen Intel Prozessor erinnern bei dem man einfach mit dem Windows Taschenrechner testen konnte ob ein bestimmte Bug vorliegt. Diese CPU durfte man sogar zurückgeben weil es sich nicht durch ein simples Update fixen lässt.

Update? Ja man kann den sogenannten Microcode der CPU updaten. Ja der Microcode ist fest in der CPU „eingebrannt“ ein solches Update muss also jedes mal gemacht werden, wenn die CPU erneut eingeschaltet wird. Daher lösen es die meisten Mainbordhersteller über ein Bios Update. Wenn ihr also mal die Changelogs eurer Bios Updates durchgeht werdet ihr immer mal wieder etwas von CPU und oder Microcode lesen. Das ist dann genau so etwas. Setzt man ein älteres Mainboard ein gibt es auch kein Update 😀 Setzt man Linux ein installiert man sich die Microcode Updates und bei jedem Start bekommt die CPU so ihr Update. Bei FreeBSD geht dieses natürlich ebenfalls. Da diese Frage bei mir schon ein paar mal angekommen ist, dieser Beitrag.

Das Paket nennt sich devcpu-data und findet sich in der Ports und ebenfalls auch als Binary:

$ pkg install devcpu-data

Damit es aktiviert ist und beim Booten geladen wird, ja ihr erratet es… Folgendes muss in die /etc/rc.conf :

microcode_update_enable="YES"

Dann lässt sich alles einmal anstarten und direkt sehen ob es erfolgreich ist:

$ /usr/local/etc/rc.d/microcode_update start
Updating cpucodes...
/usr/local/share/cpucontrol/m12206a7_00000029.fw: updating cpu /dev/cpuctl0 from rev 0x28 to rev 0x29... done.
/usr/local/share/cpucontrol/m12206a7_00000029.fw: updating cpu /dev/cpuctl2 from rev 0x28 to rev 0x29... done.
/usr/local/share/cpucontrol/m12206a7_00000029.fw: updating cpu /dev/cpuctl4 from rev 0x28 to rev 0x29... done.
/usr/local/share/cpucontrol/m12206a7_00000029.fw: updating cpu /dev/cpuctl6 from rev 0x28 to rev 0x29... done.
Done.

Wie man sieht, er konnte ich ein Update vom Microcode durchführen und es gab auch eines. Es kommt immer mal wieder vor das Fehler gefunden werden daher dieses immer aktuell halten.

DNSSEC, EDNS und PMTU-Fehler bei BIND: Lösung für DNSviz-Meldungen

Mir ist in der letzten Zeit an ein paar Systemen ein kleines „Problem“ im Zusammenhang mit DNSSEC, IPv6 und UDP Paketgrößen aufgefallen. Wobei aufgefallen hier nicht ganz korrekt ist, ich bin durch http://dnsviz.net darauf gestoßen worden. Die Jungs kommen mir nämlich mit der folgenden Warnung entgegen:

domain.tld/A: No response was received until the UDP payload size was decreased, indicating that the server might be attempting to send a payload that exceeds the path maximum transmission unit (PMTU) size. (2001:210:5000:bbbb::aaaa:1, UDP_0_EDNS0_32768_4096)

Diese Meldung besagt das es vom jeweiligen DNS Server erst eine Antwort gegeben hat, nachdem die UDP Größe verringert wurde. Dieses fällt einem im normalen Tests mit dig / drill oder ähnlichem nicht wirklich auf. Denn hier wird absolut automatisch die Paketgröße weiter verringert bis es klappt. Es „dauert“ nur etwas länger….

Der DNS-Server, in diesem Fall ein bind9.11, versucht auf die Frage mit einem IPv6 UDP Paket zu Antworten und schickt dieses mit 4096 Byte raus. Aus irgendeinem Grund (Firewall, Einstellungen im OS, Filter auf dem Netzwerk….) wird dieses Paket auf seinem Weg aber verworfen und erreicht sein Ziel nicht. Da wir hier über UDP sprechen merkt das der Server nicht und glaubt er habe seinen Job gut gemacht. Woher soll bind auch wissen das sein Paket nicht angekommen ist oder irgendwas auf dem Weg sein Pakete mit dieser Größe nicht mag?

Um als Admins herauszufinden wie groß die Pakete von seinem System denn werden können kann man folgenden einfachen Test nutzen:

$ dig +short rs.dns-oarc.net txt
rst.x490.rs.dns-oarc.net.
rst.x499.x490.rs.dns-oarc.net.
rst.x457.x499.x490.rs.dns-oarc.net.
"2001:310:6000:f::1fc7:1 sent EDNS buffer size 512"
"Tested at 2017-07-05 08:23:52 UTC"
"2001:310:6000:f::1fc7:1 DNS reply size limit is at least 499"

Wie zu erkennen ist endet es auf diesem System bei 512 Byte. Wenn wir uns jetzt nicht weiter um den Grund kümmern wollen oder können, müssten wir also unserem bind sagen das er bitte immer nur mit maximal 512 Byte arbeitet, wenn er UDP nutzt. Dieses geht wie folgt im Options Block:

options {
	[....]
	edns-udp-size 512;
	max-udp-size 512;
	[....]
};

edns-upd-size ist hier für das Empfangen und max-udp-size für das Senden von Paketen. Ab dem Moment probiert es bind nur noch mit 512 Byte und die Clients werde auf ihre erste Frage hin direkt eine Antwort bekommen, ohne die Frage so oft wiederholen zu müssen, bis sie schrittweise zurück auf 512 Byte sind.

So long…

FreeBSD: WLAN und der Ländercode korrekt einstellen

Nutzt man auf seinem FreeBSD das WLAN so funktioniert es in der Regel ohne Probleme. Wenn man aber an ein WLAN gerät das Kanal 12 oder 13 benutzt, so funktioniert das irgendwie nicht. Warum? Ganz einfach… im Standard kommt ein FreeBSD mit dem Ländercode US für USA hoch. Dort ist leider essig mit Kanal 12 und 13. Daher muss man seinem FreeBSD erstmal sagen das es sich in Deutschland befindet. Dieses geht wie folgt:

$ ifconfig  wlan0 list channel
$ ifconfig  wlan0 down
$ ifconfig  wlan0 ecm
$ ifconfig  wlan0 regdomain ETSI
$ ifconfig  wlan0 country DE
$ ifconfig  wlan0 up
$ ifconfig  wlan0 list channel

Zeile 1 zeigt einem dabei die aktuellen Kanaleinstellungen, Zeile 2 schaltet das die Karte für die Umstellungen ab, Zeile 3 bis 5 bringen uns nach Europa und Deutschland, Zeile 6 schaltet das wlan wieder ein und Zeile 7 gibt uns nun die aktuellen Kanäle einmal aus.

Möchte man dieses nun nicht immer einstellen sondern fest bei jedem Start mit eingebaut haben hilft folgende Zeile in der /etc/rc.conf:

create_args_wlan0="ecm regdomain ETSI country DE"

Möchte man mehr erfahren kann man sich die Datei: /etc/regdomain.xml anschauen oder besser noch:

$ ifconfig wlan0 list regdomain

Dieses geht natürlich ebenfalls mit dem country:

$ ifconfig wlan0 list countries

Tjo… Viel Spaß wa?

Piwigo 2.8.2/2.9 Upgrade: Häufige Fehler und Lösungen

Da klicke ich doch gestern das Upgrade meiner Piwigo Bildergalerie von 2.8 auf 2.9 und es scheint sauber gelaufen zu sein. Leider findet sich ab dem Moment auf der Seite die folgende Fehlermeldung:

Warning:  [mysql error 1054] Unknown column 'last_visit' in 'field list'

UPDATE piwigo_user_infos
  SET last_visit = NOW(),
      lastmodified = lastmodified
  WHERE user_id = 1
 in /pfad/bilder.kernel-error.de/include/dblayer/functions_mysqli.inc.php on line 845

Was ist da wohl passiert? Im nginx Logfile findet sich dabei folgendes:

UPDATE piwigo_user_infos
  SET last_visit = NOW(),
      lastmodified = lastmodified
  WHERE user_id = 2
 in /pfad/bilder.kernel-error.de/include/dblayer/functions_mysqli.inc.php on line 845" while reading upstream, client: 2001:aaaa:aaaa:aaaa:eef4:bbff:fe47:c54c, server: bilder.kernel-error.de, request: "GET / HTTP/2.0", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "bilder.kernel-error.de"
2017/05/30 15:53:29 [error] 97077#100936: *1 FastCGI sent in stderr: "PHP message: PHP Warning:  [mysql error 1054] Unknown column 'last_visit' in 'field list'

Also schaue ich mir mal die Logmeldungen zum Zeitpunkt des Upgrades von Version 2.8.x auf Version 2.9.0 an und finde diesen Eintrag:

ALTER TABLE `piwigo_user_infos`
  ADD COLUMN `last_visit` datetime default NULL,
  ADD COLUMN `last_visit_from_history` enum('true','false') NOT NULL default 'false'
; in /pfad/bilder.kernel-error.de/include/dblayer/functions_mysqli.inc.php on line 845" while reading response header from upstream, client: 2001:aaaa:aaaa:aaaa:eef4:bbff:fe47:c54c, server: bilder.kernel-error.de, request: "GET /upgrade.php?now= HTTP/2.0", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "bilder.kernel-error.de"
2017/05/30 15:53:28 [error] 97076#100895: *48 FastCGI sent in stderr: "PHP message: PHP Warning:  [mysql error 1054] Unknown column 'last_visit' in 'field list'

Tja… Da ist beim Upgrade aus irgendeinem Grund also wirklich das Upgrade an der Datenbanke abgesoffen 🙁 Ich habe mir dann aus dem Upgradescript die passenden Einträge für die Datenbank herausgesucht und sie noch einmal von Hand auf die DB log gelassen:

ALTER TABLE `piwigo_comments` CHANGE `date` `date` datetime NOT NULL default '1970-01-01 00:00:00';
ALTER TABLE `piwigo_history` CHANGE `date` `date` date NOT NULL default '1970-01-01';
ALTER TABLE `piwigo_images` CHANGE `date_available` `date_available` datetime NOT NULL default '1970-01-01 00:00:00';
ALTER TABLE `piwigo_old_permalinks` CHANGE  `date_deleted` `date_deleted` datetime NOT NULL default '1970-01-01 00:00:00';
ALTER TABLE `piwigo_rate` CHANGE `date` `date` date NOT NULL default '1970-01-01';
ALTER TABLE `piwigo_sessions` CHANGE `expiration` `expiration` datetime NOT NULL default '1970-01-01 00:00:00';
ALTER TABLE `piwigo_upgrade` CHANGE `applied` `applied` datetime NOT NULL default '1970-01-01 00:00:00';
ALTER TABLE `piwigo_user_infos` CHANGE `registration_date` `registration_date` datetime NOT NULL default '1970-01-01 00:00:00';
ALTER TABLE `piwigo_user_infos`
  ADD COLUMN `last_visit` datetime default NULL,
  ADD COLUMN `last_visit_from_history` enum('true','false') NOT NULL default 'false'
;

Scheint zu passen 🙂

« Ältere Beiträge Neuere Beiträge »

© 2025 -=Kernel-Error=-

Theme von Anders NorénHoch ↑