Perl: Zufälligen Schlüssel/Key eines Hash

Friday, August 4, 2017

Auf einen zufälligen Schlüssel eines Hash, kann man mit der Funktion keys zugreifen. Die Funktion keys, gibt alle Schlüssel eines Hash, als Liste zurück, von der dann ein Wert zufällig abgefragt werden kann:

#!/usr/bin/perl

my %alphabet = (
    A => 1,
    B => 2,
    C => 3,
    D => 4,
    E => 5,
    F => 6,
    G => 7,
    H => 8,
    I => 9,
    J => 10,
    K => 11,
    L => 12,
    M => 13,
    N => 14,
    O => 15,
    P => 16,
    Q => 17,
    R => 18,
    S => 19,
    T => 20,
    U => 21,
    V => 22,
    W => 23,
    X => 24,
    Y => 25,
    Z => 26,
);

my @keys = keys %alphabet;

# zufälliger Key

my $buchstabe = $keys[ rand @keys ];
my $position  = $alphabet{$buchstabe};

printf "Der Buchstabe %s, ist der %i. im Alphabet.\n", $buchstabe, $position;

Es ist auch möglich, direkt auf einen zufälligen Wert eines Hash zuzugreifen. Das funktioniert, analog mit der Funktion values:

my @values = values %alphabet;
print $values[ rand @values ] . "\n";

PS: In den Kommentaren, hat Christian eine etwas schnellere Möglichkeit aufgezeigt:

my @list = %alphabet;
my $random_key = $list[(1|rand@list) -1];
my $random_val = $list[1|rand@list];

Das bitweise ODER mit 1 sorgt dafür, dass das letzte Bit des Ergebnisses von rand auf 1 gesetzt wird. Dadurch entsteht immer eine ungerade Zahl (1|0 => 1, 1|1 => 1, 1|2 => 3, 1|3 => 3, …). Es wird also nur auf ungerade Indizes des Arrays zugegriffen, wo in diesem Fall die Values abgelegt sind. Da dabei immer eine Zahl größer 0 generiert wird, kann mit einem einfachen -1 immer auf die geraden Indizes mit den Keys zugegriffen werden.

FlatPress: Statistik über Klickzahlen erzeugen

Thursday, June 29, 2017

Die FlatPress Blog Engine, bietet leider keinerlei Statistik über Klickzahlen usw.
Deswegen habe ich mir eine Skriptlösung geschrieben, die mir jetzt zeigt, wie viele Klicks ein Beitrag erzeugt (Über die Laufzeit der Logs).

Das Skript

Das Skript liegt auf meinem Webspace (bei Uberspace.de) als ~/bin/clicks.sh vor, die Logs unter ~/log/ und die FlatPress-Installation unter ~/html/blog/.

#!/bin/bash
set -e
cd

date

awk '
/ "(HEAD|GET) \/blog\/\?x=entry:entry[0-9-]+ .+" 200 / {
	entrys[$7]++
	counter++
}
/ "(HEAD|GET) \/blog\/fp-content\/attachs\/.+ .+" 200 / {
        attachs[$7]++
	counter++
}
END {
        for(i in entrys) {
                file="html/blog/fp-content/content/*/*/" substr(i, 16) ".txt"

                subject="N/A"
                "cut -d \\| -f 4 " file " 2>/dev/null" | getline subject

                printf "%5d %5.3g%% %s %s\n",
                        entrys[i],
                        100 / counter * entrys[i],
                        i,
                        subject
        }

        for(i in attachs) {
                printf "%5d %5.3g%% %s\n",
                        attachs[i],
                        100 / counter * attachs[i],
                        i
        }

        printf "%5d insgesamt\n", counter
}
' <(cat logs/access_log; zcat logs/access_log.*.gz) | sort -n

Als Beispielausgabe, hier mal die Top Ten der häufigsten Klicks aktuell (absolute Klicks und prozentual):

$ clicks.sh | tail -n 11
   31 0.455% /blog/?x=entry:entry170609-233049 Payday 2 kostenlos bei Steam
   46 0.675% /blog/?x=entry:entry160205-145935 Anonymous; Netzwerkverkehr eines Benutzers über das Tor-Netzwerk routen, zur Anonymisierung von Verbindungsdaten
   52 0.763% /blog/?x=entry:entry170511-162559 LOVOO bekommt eine "Kuppelfunktion"; Ich habe den Prototypen getestet
   53 0.777% /blog/?x=entry:entry150905-111426 Automatischer Login: nodm (an automatic display manager)
   65 0.953% /blog/?x=entry:entry160508-093015 CyanogenMod auf dem Samsung Galaxy S4 mini GT-I9195 (serranoltexx) installieren
  177   2.6% /blog/?x=entry:entry170629-155523 FlatPress: Klick-Statistik erzeugen
  777  11.4% /blog/?x=entry:entry170422-211028 Debian 9 (Stretch): Oracle VM VirtualBox installieren
 1249  18.3% /blog/?x=entry:entry170626-172443 Smartphones mit Unterstützung von LineageOS und TWRP
 1494  21.9% /blog/?x=entry:entry170608-122844 Perl: Dateien von I2P Eepsites und/oder Tor hidden services downloaden
 2342  34.4% /blog/?x=entry:entry170526-135407 openresolv
 6817 insgesamt

Das Skript kann man bestimmt noch verbessern und schöner schreiben.
Gerade die regulären Ausdrücke, welche die Klicks aus dem Log filtern, matchen vielleicht nicht hundertprozentig, was die Statistik dann verfälscht.
Hier mal Ausnahmen, die das Beispiel oben nicht abdeckt (So gefunden im Log):

  • /blog/?x=entry%3Aentry170626-172443 (URL Decode/Encode)
  • //blog/?x=entry:entry150805-091827

Ein weiterer fehleranfälliger Punkt ist, den Subject anhand des URL auszulesen. Das betrifft vor allem gelöschte Beiträge, die aber noch im Index der Suchmaschinen vorhanden sind.

PS: Eine tagesaktuelle Statistik über den Blog, gibt es jetzt unter https://0010100.net/tmp/clicks.txt.

Perl: Dateien von I2P Eepsites und/oder Tor hidden services downloaden

Thursday, June 8, 2017

Ich programmiere einen Feedreader.

Dieser hat nun auch das Proxy Attribut des Perl Moduls LWP::UserAgent implementiert, um z.B. Feeds von I2P Eepsites und/oder Tor hidden services abonnieren zu können.

Wie man mittels der Perl Module URI::Fetch und LWP::UserAgent, eine solche URL downloadet, will ich hier kurz skizzieren:

#!/usr/bin/env perl

use URI;
use URI::Fetch;

use LWP::UserAgent;
use LWP::Protocol::socks;

my $uri = URI->new("http://example.i2p/");

my $ua = LWP::UserAgent->new();
$ua->proxy( "http", "http://localhost:4444" );

my $response = URI::Fetch->fetch( $uri, UserAgent => $ua )
  or die URI::Fetch->errstr;

print $response->content;

Eepsite: Die (Pseudo-)Top-Level-Domain .i2p

Es wird mittels $ua->proxy( "http", "http://localhost:4444" ); der zu verwendende HTTP-Proxy gesetzt. Analog funktioniert das so auch mit anderen Protokollen, wie z.B. HTTPS, FTP usw.

Siehe auch: http://search.cpan.org/perldoc/LWP::UserAgent.

Tor hidden services: Die (Pseudo-)Top-Level-Domain .onion

Für das SOCKS-Protokoll, muss zusätzlich das Modul LWP::Protocol::socks eingebunden werden.

Um bspw. eine Datei von einem Tor hidden service downzuloaden, muss $ua->proxy( "http", "socks://localhost:9050" ); gesetzt werden.

Siehe auch: http://search.cpan.org/perldoc/LWP::Protocol::socks.

Kommentar: Software lokal installieren mit dem Linux Installations-Dreisatz

Thursday, October 20, 2016

Wird ein Programm nicht über die Paketverwaltung angeboten, bleibt nur das Programm selbst zu installieren.
Hierfür wird i.d.R. der Linux Installations-Dreisatz aufgezeigt, der sich aus den GNU build utils der GNU Toolchain ergibt, um Software zu installieren. Auch selbst entwickelte Programme installiert man i.d.R. auf diese Weise.

Der Linux Installations-Dreisatz im Detail

Als Installations-Dreisatz bezeichnet man das Kompilieren und Installieren eines Programms mit folgenden drei Befehlen:

./configure --prefix=/usr/local
make
make install

In der Standardeinstellung ist normalerweise schon die Installation nach /usr/local vorgesehen. Denn /usr/bin gehört dem System und ist tabu. Siehe GNU Autoconf Handbuch Abs. 4.13 Default Prefix.

Die drei Schritte sollten bekannt sein.
Nun ist aber in vielen Foren und Anleitungen zu lesen, dass für das make install Superuser-Rechte benötigt werden.
Doch das ist falsch. Der richtig Ansatz führt über die Gruppe staff, denn diese Gruppe ist vorgesehen um Software, ohne Superuser-Rechte lokal zu installieren. Fügt man sein Benutzerkonto dieser Gruppe hinzu, erhält man Schreibrechte unterhalb /usr/local und /var/local, so das zur Installation kein Root notwendig ist (was auch einen Sicherheitsgewinn bringt). Die Berechtigungen können im Detail wie folgt ermittelt werden: find / -group staff -writable 2>/dev/null.

Siehe auch: https://wiki.debian.org/SystemGroups.

Hat man Software lokal installiert, muss die Umgebungsvariable PATH entsprechend angepasst werden und /usr/local/bin und /usr/local/sbin hinzugefügt werden (ggf. auch in der Crontab). Und mittels ldconfig /usr/local/lib, der dynamische Linker angewiesen werden, auch nach Libs unter /usr/local/lib zu suchen.

Mehr Details zum Installations-Dreisatz findet man in der einschlägigen Literatur.

Als Alternative zur lokalen Installation, sollte aber immer das Erstellen eines distributions-spezifischen Pakets in Betracht kommen. Denn oft bieten Software-Projekte kein make uninstall an, oder es wurde nur unzureichend implementiert.

Webentwicklung/Webdesign; HTML: Telefonnummern verlinken

Thursday, June 30, 2016

Ganz ähnlich wie E-Mail-Adressen mit dem Schema (scheme) mailto angegebenen werden können und der Link i.d.R. den Mail-Client öffnet, um die E-Mail zu verfassen. Können auch Telefonnummern verlinkt werden (siehe RFC 3966).

Dazu muss das Schema tel genutzt werden. Beispiel:

Telefon: <a href="tel:+491631737743">+491631737743</a>

Am Computer weniger sinnvoll/nützlich, trumpft so ein Link am Smartphone allerdings richtig auf!