Manuell zu drahtlosen Netzwerk verbinden

Ich nutze momentan mein altes Netbook zum experimentieren als Server und habe deswegen ein minimales Debian installiert. Um es nicht schon im Leerlauf zu überlasten habe ich keinen X-Server oder etwas ähnliches installiert, welches mir einen Networkmanager bescheren könnte und war daher gezwungen die Verbindung zu meinem lokalen WLAN manuell aufzubauen.

Da die Verbindung automatisch bei jedem Systemstart aufgebaut werden soll, habe ich mir zwei Skripte wlan-start.py und wlan-stop.py geschrieben welche ich in einer /etc/init.d/wlan aufrufe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash
#/etc/init.d/wlan

case "$1" in
    start)
        /root/scripts/wlan-start.py
        ;;
    stop)
        /root/scripts/wlan-stop.py
        ;;
    *)
        echo "Usage: /etc/init.d/wlan {start|stop}"
        exit 1
        ;;
esac

exit 0

Ein anschließendendes:

# update-rc.d wlan defaults

sorgt für das Aufrufen beim Systemstart.

Die Zugangsdaten der wpa2 Netze speichere ich unter /etc/wlan/SSID.conf wobei SSID gegen die entsprechende WLAN-SSID zu ersetzen ist:

1
2
3
4
5
6
7
8
9
#!/usr/bin/python3

import os

ssid = input("SSID: ")
password = input("Password: ")

os.system("wpa_passphrase %s %s > /etc/wlan/%s.conf" %(ssid, password, ssid))
print("Config file was written to: /etc/wlan/%s.conf" %ssid)

(wpa_passphrase aus Paket: wpasupplicant)
Das wlan-start.py-Skript muss nun nur noch die gefundenen mit den bekannten SSIDs aus dem /etc/wlan-Verzeichnis abgleichen und ggf. die entsprechende .conf-Datei laden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/python3

import os
import subprocess
import sys

FNULL = open(os.devnull, 'w')

print("Searching for known wireless networks...")
conffile = ""
try:
    subprocess.check_call(["ifconfig", "wlan0", "up"], stdout=FNULL, stderr=subprocess.STDOUT)
    output = subprocess.check_output(["iwlist", "wlan0", "scan"], universal_newlines=True)
    ssids = [line.strip()[7:-1] for line in output.split('\n') if 'ESSID:' in line]
    for ssid in ssids:
        f = "/etc/wlan/" + ssid + ".conf";
        if os.path.isfile(f):
            conffile = f
            break
    if conffile == "":
        print("No known wireless networks found")
        sys.exit(0)
    print("Found network: %s" %ssid)
except:
    print("An error occured while searching for wireless networks.")
    sys.exit(1)

print("Connecting...")
try:
    subprocess.check_call(["wpa_supplicant", "-B", "-iwlan0", "-c" + conffile, "-Dwext"], stdout=FNULL, stderr=subprocess.STDOUT)
    subprocess.check_call(["dhclient", "wlan0"], stdout=FNULL, stderr=subprocess.STDOUT)
except:
    print("An error occured. Cannot connect to wireless network.")
else:
    print("Successfully connected to %s" %ssid)

(Für den Scann-Vorgang mit iwlist wird das Paket wireless-tools benötigt.)

Der vollständigkeitshalber hier auch noch das wlan-stop.py-Skript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/usr/bin/python3

import subprocess

try:
    subprocess.check_call(["dhclient", "-r", "wlan0"])
    subprocess.check_call(["ifconfig", "wlan0", "down"])
except:
    print("An error occured while shutting down wlan0")
else:
    print("Shutting down wlan0 was successful")

Bug bei LaTeXs longtable

Ich weiß nicht, ob das wirklich ein Bug ist, ich würde es aber mal zumindest unter unexpected behavior packen:

Folgender Code crasht:

1
2
3
4
5
\begin{longtable}{r||r|r|r}
\caption{Messwerte 2 - 10 Messwerte}\\[3mm]
\label{tab:mv2}

Nr. & Impulse & Brutto & Netto\\

Schuld daran ist Zeile 3 in der sich hinter } noch Leerzeichen einschummeln. Ein abschließendes % fixt das:

\label{tab:mv2}%

Aus gnuplot mit pdflatex exportieren

Ein recht nützliches Skript für alle gnuplot Freunde. Es exportiert euren Plot in ein Tex-File und kompiliert es gleich zu einem PDF. Damit habt ihr auch in gnuplot Zugriff auf den vollen Latex-Formelsatz, zur Not sind auch nachträgliche Änderung im Tex-File möglich (dort würde sich dann z.B auch die Schriftart /-größe anpassen lassen). Standardmäßig ist der Export schwarz-weiß.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
save "$0.gp"
set terminal push
set terminal epslatex standalone

set output "$0.tex"
replot
set output
set terminal pop

system "pdflatex $0.tex > /dev/null"
system "rm $0.aux $0.log"

Der Aufruf des Skripts sieht wie folgt aus:

call "export.gp" "meinTollerPlot"

Wahrscheinlichkeitsnetz mit gnuplot

Ich musste heute Messreihen auf statistische Reinheit untersuchen, indem ich sie auf Wahrscheinlichkeitspapier auftrage und mit der theoretisch nach Gauß berechneten Gerade vergleiche.

Da wir von der Uni aus nur ein schlecht kopiertes Wahrscheinlichkeitsnetz zur Verfügung gestellt bekommen haben, wurde diese Arbeit natürlich auf gnuplot abgewälzt.

Dummerweise musste ich festellen, dass gnuplot nativ keine derartige Skalierung seiner Ordinate anbietet (wie es sie für logarithmische Skalierung gibt) und es auch nicht möglich ist, die Achsen nach beliebigen Funktionen zu skalieren. Daher muss folgender Trick herhalten:

Man belässt die Achsen in ihrer äquidistanten Unterteilung und skaliert einfach die Messwerte. Anschließend überschreibt man die Achsenbeschriftung mit eigenen Werten. Für die Berechnung der Werte bietet gnuplot die Funktion invnorm.

Der Vollständige workaround sieht dann wie folgt aus:

1
2
3
4
5
set ytics ("0.1" invnorm(0.001), "1" invnorm(0.01), "5" invnorm(0.05), "10" invnorm(0.1), "20" invnorm(0.2), "30" invnorm(0.3), "40" invnorm(0.4), "50" invnorm(0.5), "60" invnorm(0.6), "70" invnorm(0.7), "80" invnorm(0.8), "90" invnorm(0.9), "95" invnorm(0.95), "99" invnorm(0.99), "99.9" invnorm(0.999))
set yrange [invnorm(0.0001):invnorm(0.9999)]
set grid
set key left
plot "..." using 1:(invnorm($2/100))

Es empfiehlt sich die Legende links zu setzen, da sich im Idealfall die Messwerte von unten links nach oben rechts verteilen werden.