ImpressumFrank Seitz Wassermühlenstr. 2 25436 Uetersen E-Mail: fsfseitz.de Tel.: +49-176-78243503 Alle Artikel Inhaltsverzeichnis Rechtliche Hinweise Code auf GitHub Code auf meta::cpan KategorienAbonnieren |
Dienstag, 30. Juni 2015Helligkeit von Farben des RGB-Farbraums berechnenMöchte man Text auf einen beliebigen einfarbigen Hintergrund setzen, muss man entscheiden, ob die Farbe des Hintergrunds eher hell oder dunkel ist, so dass man die Schriftfarbe geeignet wählen kann. Für einen dunklen Hintergrund sollte man eine helle Schrift (z.B. weiß) wählen und für einen hellen Hintergrund eine dunkle Schrift (z.B. schwarz), damit der Text problemlos lesbar ist. Eine Heuristik, nach der dies für Farben des RGB-Farbraums entschieden werden kann, ist: Die drei Koeffizienten 0.299, 0.587 und 0.114 gewichten die drei Farbkomponenten hinsichtlich der menschlichen Helligkeitswahrnehmung. Denn bei gleichem Farbwert wird Blau vom Menschen dunkler wahrgenommen als Rot und Rot dunkler als Grün. Die Summe der drei Koeffizienten ergibt 1, entsprechend hat die Funktion den gleichen Wertebereich wie die drei Farbkomponenten. Der übliche Wertebereich ist 0 bis 255. Bei einem Wert < 128 kann man die Farbe als dunkel ansehen, andernfalls als hell. Man kann die Funktion auch anwenden, um RGB-Farben in Grauwerte umzurechnen. Perl: $brightness = sqrt 0.299*$r**2 + 0.587*$g**2 + 0.114*$b**2; JavaScript: brightness = Math.sqrt(0.299*pow(r,2) + 0.587*pow(g,2) + 0.114*pow(b,2)) Hier ein Farbauswahl-Menü, dessen Einträge unter Verwendung der Helligkeitsfunktion generiert wurden, erkennbar daran, dass die Schrift auf der jeweiligen Hintergrundfarbe mal schwarz und mal weiß ist: Der Artikel, der die Heuristik und ihren Ursprung genauer beschreibt: http://alienryderflex.com/hsp.html. Freitag, 26. Juni 2015Overlays in Google Earth einbindenOverlays sind Bilder, die von Google Earth auf einen Bereich der Erdoberfläche (GroundOverlays) oder statisch ins Anwendungsfenster (ScreenOverlays) projiziert werden. Zu den Bildern gehört eine Spezifikation in KML (Keyhole Markup Language), die die Bilder beschreibt und festlegt, wie Google Earth mit ihnen verfahren soll. KML ist XML-basiert und wird in einer Datei mit der Extension .kml gespeichert. Die kml-Datei und die Bild-Dateien können zusammen in Form einer einzelnen kmz-Datei an Google Earth übergeben werden. Die kmz-Datei ist eine ZIP-Datei, die die genannten Dateien enthält. Die kmz-Datei wird entweder über "File/Open" geladen oder als Parameter beim Aufruf von Google Earth angegeben. Beispiel
KML-Datei
Obige KML-Spezifiktion beschreibt ein Bild, das auf die Erdoberfläche projiziert wird (Element GroundOverlay) und ein Bild, das statisch in der oberen linken Ecke des Fensters dargestellt wird (Element ScreenOverlay). Die beteiligten Hauptelemente sind: Document, GroundOverlay, ScreenOverlay. Für die Platzhalter __NAME__, __DESCRIPTION__ usw. müssen konkrete Werte eingesetzt werden.
MIME TypeWird die kmz-Datei von einem HTTP-Server ausgeliefert, sollte dieser den MIME-Type kennen: application/vnd.google-earth.kmz kmz Im Browser kann Google-Earth als Helper-Applikation vereinbart werden. Dann wird Google Earth beim Eintreffen einer kmz-Datei automatisch gestartet und positioniert an den betreffenden Ort. Die Angaben für den Browser sind:
ApplikationDonnerstag, 25. Juni 2015GnuPG: Verschlüsseln, entschlüsseln und andere OperationenDatei verschlüsseln (ohne Rückfrage)$ gpg --encrypt --recipient UID --batch --yes FILE --encrypt : Verschlüsselung --recipient UID : ID des Users, für den die Datei verschlüsselt wird --batch --yes : überschreibe Zieldatei FILE.gpg ohne Rückfrage, falls sie existiert Datei entschlüsseln$ gpg --decrypt FILE.gpg >FILE --decrypt : Entschlüsselung Problem: Entropie bei Schlüsselerzeugung zu niedrigDas Erzeugen eines Schlüssels mit $ gpg --gen-key stoppt mit der Meldung Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy! (Need <N> more bytes) Entropie abfragen: $ cat /proc/sys/kernel/random/entropy_avail Folgende "Lösung", die im Netz viel genannt wird, sollte man nicht anwenden: # apt-get install rng-tools # rngd -r /dev/urandom Siehe Diskussion zur Entropieerhöhung. Geeignet ist dagegen das Forcieren von Plattenaktivität: $ find / >/dev/null Das Kommando wird einfach parallel zu gpg --gen-key ausgeführt, bis der Schlüssel erzeugt ist. Liste der öffentliche Schlüssel des Schlüsselbundes$ gpg --list-keys Revocation Certificate erzeugen$ gpg --gen-revoke UID Das erzeugte Zertifikat auf einem gesicherten Datenträger speichern und zusätzlich ausdrucken. LinksMittwoch, 24. Juni 2015Apache: Aufsetzen einer CGI WebapplikationDas Aufsetzen einer CGI-Applikation ist kein Zauberwerk. Es führen allerdings viele Wege nach Rom und es kann leicht passieren, dass ein "from scratch" erstelltes Setup überkomplex und krautig wird. Es folgt - in vier Schritten - das Setup, mit dem ich beim Erstellen von CGI-Applikationen starte. Es ist aufgeräumt und beruht auf technisch sauberen Konzepten. Von diesem Ausgangspunkt aus lässt sich eine beliebig umfangreiche Applikation aufbauen, ohne später den am Anfang gesteckten Rahmen verlassen zu müssen. 1. Applikationsstruktur im DateisystemJede nicht-triviale Applikation sollte sich im Dateisystem auf drei Bereiche verteilen. Wir wählen nach moderner Unix-Konvention hierfür eine /opt-Struktur:
<application> ist der Name der Applikation. /opt/<application>/ +-- ... +-- www/ +-- bin/index.cgi /etc/opt/<application>/ +-- ... +-- apache.conf /var/opt/<application>/ +-- ... +-- access.log +-- error.log Erläuterung:
2. CGI-Programm (index.cgi)Hier ein minimales CGI-Programm. Es gibt die IP-Adresse des Client aus. #!/usr/bin/perl -T use strict; use warnings; print <<"__HTTP__"; Content-Type: text/plain $ENV{'REMOTE_ADDR'} __HTTP__ # eof 3. Apache-Konfiguration (apache.conf)Die Apache-Konfigurationsdatei vereinbart einen VirtualHost und zwei Verzeichnisse: # Apache Config for <application> <VirtualHost *:80> ServerName [host].[domain] DocumentRoot /opt/[application]/www ScriptAlias /index.cgi /opt/[application]/bin/index.cgi RedirectMatch ^/$ /index.cgi ErrorLog /var/opt/[application]/error.log CustomLog /var/opt/[application]/access.log combined </VirtualHost> <Directory /opt/[application]/bin> Options ExecCGI Require all granted </Directory> <Directory /opt/[application]/www> Require all granted </Directory> # eof Erläuterung:
4. Kommandos (für Apache 2.0 und höher)Mit folgenden Kommandos wird das oben beschriebene Apache-Setup im Webserver aktiviert. Hierfür sind root-Rechte erforderlich. 1 - Apache-Konfiguration der Applikation verlinken (Debian): # ln -s /etc/<application>/apache.conf /etc/apache2/sites-available/<application>.conf 2 - Apache-Konfiguration der Applikation aktivieren: # a2ensite <application> 3 - Apache-Modul für CGI-Ausführung aktivieren: # a2enmod cgid 4 - Apache-Setup in den laufenden Server übernehmen (Debian): # service apache2 reload Variante: Verdecktes CGI-ProgrammWird in die VirtualHost-Definition anstelle von ScriptAlias /index.cgi /opt/<application>/bin/index.cgi RedirectMatch ^/$ /index.cgi die Definition RewriteEngine on RewriteRule ^/([A-Z0-9a-z/]+)$ /opt/<application>/bin/index.cgi/$1 [H=cgi-script] RedirectMatch ^/$ /<start> eingesetzt, tritt das CGI-Programm im URL nicht mehr in Erscheinung. Zusätzlich werden alle Pfade, die ausschließlich aus den Zeichen A-Z0-9a-z/ bestehen, via $PATH_INFO an das CGI-Programm übergeben. Die RewriteEngine muss zuvor verfügbar gemacht werden mit: # a2enmod rewrite Donnerstag, 11. Juni 2015Apache: Redirection auf SubdirectoryMit der Direktive Redirect kann ein Seitenzugriff auf eine andere Seite umgeleitet werden. Die Umleitung schließt alle Subpfade ein, also Seiten mit gleichem Pfadanfang. Möchte man ein Directory auf ein Subdirectory umleiten, klappt es mit Redirect nicht, da dies zu einer Endlos-Rekursion führt. Die Redirect-Regel Redirect /a /a/b führt bei Aufruf von /a zu der endlosen Kette von HTTP-Aufrufen /a /a/b /a/b/b /a/b/b/b ... bis der Browser dies erkennt und mit einer Meldung wie Redirect Loop: Redirection limit for this URL exceeded. abbricht. Die Lösung liefert die (leistungsfähigere) Direktive RedirectMatch. Mit dieser lässt sich der umzulenkende Pfad per Regex präzise eingrenzen: RedirectMatch /a$ /a/b Das Dollarzeichen verankert den Pfad /a am Ende des URL, so dass Subpfade nicht mehr matchen und die Rekursion unterbleibt. Da durch die Regel keine Subpfade weitergeleitet werden, müssen die Zugriffe innerhalb von /a/b relativ sein. Ist das Ausgangsdirectory das Root-Directory, muss auch der Anfang verankert werden, da jedes Verzeichnis auf / endet: RedirectMatch ^/$ /a Mittwoch, 10. Juni 2015PostgreSQL: Installation und KonfigurationPostgreSQL gilt als das beste frei erhältliche Relationale Datenbanksystem. Es besitzt viele Gemeinsamkeiten mit Oracle, ist aber wesentlich leichter zu administrieren. Hier die wichtigsten Kommandos, um damit an den Start gehen zu können. PostgreSQL RDBMS installieren (Debian)# apt-get install postgresql Zum DB-Admin machen# su - postgres Nur von diesem Unix-Account aus kann nach der Installation eine Connection zum DBMS aufgebaut werden. Liste der existierenden Datenbanken$ psql -l [Liste] Nach der Installation existiert zunächst nur die Datenbank postgres. Datenbank erzeugen/zerstören$ createdb DB ... $ dropdb DB Liste der existierenden Benutzer$ psql postgres=# \du oder postgres=# SELECT rolname FROM pg_roles; Benutzer anlegen/entfernen$ createuser USER ... $ dropuser USER Bei Angabe der Option --superuser erhält der Benutzer Admin-Rechte: $ createuser --superuser USER Benutzer sind global für alle Datenbanken einer Installation. Zunächst existiert nur der Benutzer postgres. Soll der User USER von einem anderen Account als dem entsprechenden Unix-Account connecten können, muss ein Passwort vergeben werden. Option -P. DatenbankzugriffIst ein DB-User erzeugt, kann dieser vom gleichnamigen Unix-Account oder per Passwort, falls eins vergeben wurde, von einem anderen Account per psql auf die Datenbank zugreifen. USER$ psql DB psql (9.4.3) Type "help" for help. ... DB=# Wurde ein Passwort für User USER vergeben, aber die Anmeldung von einem anderen Accout aus schlägt fehl mit der Meldung $ psql -U USER DB psql: FATAL: Peer authentication failed for user "USER" dann muss in pg_hba.conf die Authentisierungsmethode für lokale Logins geändert werden von local all all peer in local all all md5 und anschließend der Server neu gestartet werden. Liste der existierenden Objekte
Liste aller interaktiven psql-Kommandos: \? Exportieren/Importieren
Session-EinstellungenZeitzoneDie Zeitzone kann für eine Session abweichend gesetzt werden: SET TIME ZONE 'Europe/Berlin'; Die Default-Zeitzone ist in postgresql.conf definiert: timezone = 'Europe/Berlin' DatumsformatDatumsangaben im Format YYYY-MM-DD: SET datestyle TO iso, ymd; Aktueller Zeitpunkt: select localtimestamp(0); liefert die Zeit entsprechend dem eingestellten Format 2015-06-09 11:44:29 ZeichensatzClient arbeitet mit ISO-8859-1: SET client_encoding TO iso88591 Client arbeitet mit UTF-8: SET client_encoding TO utf8 Siehe: http://www.postgresql.org/docs/9.4/static/multibyte.html Der clientseitige Zeichensatz kann jederzeit umgeschaltet werden. Wenn Daten mit unterschiedlichem Encoding verarbeitet werden, besteht die Möglichkeit, vor dem Schreiben auf die Datenbank das clientseitige Encoding umzuschalten. Die Konvertierung wird dann vom Server übernommen. \-Escapes in Stringliteralen verbietenSET standard_conforming_strings TO on Server-Zugriff von externen HostsDie folgenden Einträge ermöglichen den Zugriff von allen Hosts für alle User und alle Datenbanken.
Server neu starten# /etc/init.d/postgresql-X.Y restart Upgrade auf eine neue VersionSiehe Kapitel "Upgrading" in der Doku. LinksMontag, 8. Juni 2015Perl: Text im richtigen Character Encoding ausgebenJedes Kommandozeilenprogramm, das Texte und Meldungen mit Non-ASCII-Zeichen (z.B. Umlauten) aufs Terminal ausgibt, sollte die aktuelle Locale-Einstellung berücksichtigen, damit sichergestellt ist, dass alle Zeichen richtig dargestellt werden. Es reicht nicht aus, dass die Ausgabe unter der eigenen Terminal-Einstellung (z.B LANG=xx_XX.UTF-8) korrekt aussieht. Denn hat der Anwender ein abweichendes Character-Encoding konfiguriert (z.B. LANG=xx_XX.ISO-8859-1), sieht er anstelle der Non-ASCII-Zeichen Zeichensalat, wenn das Programm nicht explizit in dieses Encoding wandelt (in diesem Fall sähe er zwei Zeichen statt einem für jeden Umlaut). In Perl lässt sich diese nicht-triviale Aufgabe elegant durch Verwendung des Pragma open in Verbindung mit der Angabe ':locale' lösen. Die Zeile use open OUT=>':locale'; am Anfang des Programms sorgt dafür, dass für alle Ausgabeströme (einschl. STDOUT und STDERR) ein I/O-Layer eingerichtet wird, der die geschriebenen Daten automatisch gemäß dem in der Umgebung eingestellten Character-Encoding enkodiert. Beispiel: Die folgenden beiden Programme geben für beliebig in der Umgebung eingestellte Zeichensätze mit deutschen Umlauten - u.a. UTF-8 und ISO-8859-1 - zwei Zeilen mit Umlauten aus, die korrekt dargestellt sein sollten. Hierbei erzeugt print die Ausgabe via STDOUT und warn die Ausgabe via STDERR. Quelle mit einem Latin1-Editor erstellt: #!/usr/bin/env perl
use strict;
use warnings;
use open OUT=>':locale';
my $str = "ÄÖÜäöüß";
print "$str\n";
warn "$str\n";
# eof .
Quelle mit einem UTF-8-Editor erstellt: #!/usr/bin/env perl
use strict;
use warnings;
use utf8; # <- UTF-8 Quelltext
use open OUT=>':locale';
my $str = "ÄÖÜäöüß";
print "$str\n";
warn "$str\n";
# eof .
LinksDonnerstag, 4. Juni 2015LaTeX: Briefe mit scrlttr2 ohne Einrückung setzenDie Briefklasse scrlttr2 ist die vermutlich leistungsfähigste LaTeX-Klasse zum Setzen von (DIN-)Briefen. Sie hat aus meiner Sicht jedoch den kleinen Fehler, dass sie dem Briefkörper eine andere Breite zuweist als dem Briefkopf. Der Briefkörper ist schmaler und unter dem Briefkopf zentiert, was die Lesbarkeit erhöhen soll. Dadurch wirkt der Brieftext gegenüber dem Adressfeld jedoch verschoben. Gerade bei kürzeren Briefen sieht das nach meinem Empfinden nicht gut aus. Scrlttr2 bietet leider keine einfache Möglichkeit, das Layout so umzustellen, dass die Ränder des Briefkörpers mit dem Adressfeld und der Kopfzeile abschließen. Ich musste eine Weile suchen und herumexperimentieren, bis ich eine Lösung gefunden habe: % Briefkörper bündig am Briefkopf ausrichten \setlength{\oddsidemargin}{\useplength{toaddrhpos}} \addtolength{\oddsidemargin}{-1in} \setlength{\textwidth}{\useplength{firstheadwidth}} Die ersten beiden Anweisungen setzen den linken Rand des Briefkörpers mit dem linken Rand des Adressfeldes gleich. Sie finden sich im Buch der Autors von KOMA-Script in Anhang E. Die dritte Anweisung macht den Briefkörper so breit wie den Briefkopf. Diese Anweisung habe ich ergänzt. Beides zusammen ergibt das angestrebte Layout. Vorher/Nachher am Beispiel einer Rechnung:
(Seite 1 von 1, insgesamt 8 Einträge)
|
KalenderStatistikLetzter Artikel:
24.10.2023 21:48 156 Artikel insgesamt
Links
|