Archiv der Kategorie: Nerdig

Eine sammlung aller nerdiger Sachen.

MySports in Linux

Leider gibt es erstmal keinen Port von MySports auf Linux. Es gibt zwar einen Open-Source-Tool zum Auslesen der Daten, aber zur Benutzung der offiziellen Software bleibt man auf eine Lösung mit VirtualBox (die vermutlich einzige brauchbare Software von Oracle) und Windows angewiesen. Die folgenden Schritte beziehen sich alle auf Ubuntu, sollten jedoch ähnlich auf allen gängigen Distributionen funktionieren.

Um die Uhr über USB anzuschließen und in VirtualBox verfügbar zu machen sind einige Schritte notwendig. Automatisch tut sich da nichts, von wegen universelles Plug & Play und so ;-) Zunächst mal zeigt KDE kein angeschlossenes Gerät beim einstecken an. Es lässt sich aber leicht überprüfen, ob ein gerät eingesteckt ist:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 003: ID 1390:7474 TOMTOM B.V. GPS Sport Watch [Runner, Multi-Sport]

Es sieht also schonmal so aus, dass die Uhr vorhanden ist. In VirtualBox kann man in den Eigenschaften einer virtuellen Maschine festlegen, welche der im Host-System vorhandenen Geräte im Gastsystem verfügbar sein sollen. Das Symbol mit dem USB-Stecker und dem grünen + zeigt (eigentlich) die vorhandenen Geräte an. Zunächstmal ist die Liste jedoch leer. Über die Kommandozeile kann man das natürlich auch machen:

$ VBoxManage list usbhost
Host USB Devices:
 
  <no devices>

Diesen Konflikt zwischen den beiden Ausgaben gibt es, weil USB standardmäßig nicht unterstützt wird. Zunächst mal muss das Oracle VM Extension Pack installiert sein, und zwar in der gleichen Version wie VirtualBox. Dies kann man so überprüfen:

$ VBoxManage --version
5.1.2r108956
 
$ VBoxManage list extpacks
Extension Packs: 1
Pack no. 0:   Oracle VM VirtualBox Extension Pack
Version:      5.1.2
Revision:     108956
Edition:      
Description:  USB 2.0 and USB 3.0 Host Controller, Host Webcam, VirtualBox RDP, PXE ROM, Disk Encryption.
VRDE Module:  VBoxVRDP
Usable:       true 
Why unusable:

Die Version (5.1.2) stimmt schonmal überein und USB ist generell verfügbar. Damit die Geräte von VirtualBox erkannt sein, muss der Benutzer jedoch auch Mitglied der Gruppe vboxusers sein:

sudo usermod -a -G vboxusers <useruame>

Damit die Änderungen übernommen werden, muss man sich einmal aus- und wieder einloggen. Nun sind auch die USB-Geräte verfügbar:

$ VBoxManage list usbhost
Host USB Devices:
 
UUID:               05f7f0e1-8d84-4cf7-bd2c-7f11753a02a8
VendorId:           0x1390 (1390)
ProductId:          0x7474 (7474)
Revision:           2.0 (0200)
Port:               1
USB version/speed:  2/Full
Manufacturer:       TomTom
Product:            TomTom GPS Watch
SerialNumber:       HE4045G02754
Address:            sysfs:/sys/devices/pci0000:00/0000:00:1a.7/usb1/1-3/1-3.2//device:/dev/vboxusb/001/004
Current State:      Busy

Bei einem Update der distribution, zum Beispiel von Wily Werewolf auf Xenial Xerus, kann es passieren dass man das Ganze nochmal machen muss oO

Geschrieben von Kap. Zuletzt geändert am 2. August 2016.

Solarisiere dein Leben!

Nein, ich meine keinen neuen digitalen Filter, der die neuesten Instagram-Hipster for Freude jauchzen lässt. Auch nicht die (nicht minder nerdigen, da retro) echte Solarisation, mit der schöne Effekte erzielt werden können.

The Black Sun (1939)

The Black Sun (1939) von Ansel Adams, aus dem Buch Examples: The Making of 40 Photographs. Original in der Sammlung der Yale Art Gallery.

Weitere schöne Beispiele, für den echten Effekt auch in der Serie 1h von Hans-Christian Schink.

Stattdessen geht es um mein aktuelles Lieblings-Farbschema für Programmierung, Solarized von Ethan Schoonover, das vom deutschen KDE-Team passend übersetzt wird ;)

Solarized für Bash

Für die Nutzung in Vim wird pathogen benötigt. Wenn es noch nicht installiert ist, die Schnellanleitung geht wie folgt:

# Verzeichnisse anlegen
mkdir -p ~/.vim/autoload ~/.vim/bundle
# Herunterladen und installieren
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

Um pathogen nutzen zu können, muss es in der ~/.vimrc aktiviert werden:

" Pathogen
execute pathogen#infect()
syntax on
filetype plugin indent on

Nun können neue vim-Pakete einfach in das Verzeichnis geladen werden. Für Solarized geht das wie folgt:

# Wechseln in das (spätestens soeben erzeugte) Verzeichnis
cd ~/.vim/bundle
# Installieren über git-clone
git clone git://github.com/altercation/vim-colors-solarized.git

Modifikation in der .vimrc:

" Solarized
syntax enable
set background=dark
colorscheme solarized

Solarized für NetBeans
Die benötigten Dateien für NetBeans liegen ebenfalls in einem Git-Repository.

mkdir tmp
cd tmp
curl -sOL https://github.com/fentie/netbeans-colors-solarized/archive/master.zip
unzip master.zip
pushd netbeans-colors-solarized-master/
zip -r ../config-nb.zip config/
popd

Das Farbschema kann nun in NetBeans importiert werden. Dazu muss unter Extras | Optionen die Schaltfläche Import... in der unteren linken Ecke gewählt werden. Nachdem die gerade erstellte Datei config-nb.zip kann importiert werden und NetBeans verlangt von selbst einen Neustart.

Das Profil ist automatisch aktiviert, man kann wechseln unter Extras | Optionen | Schriften und Farben als Profil.

Die heruntergeladenen Dateien und das Verzeichnis kann gelöscht werden.

Netbeans mit Solarized-Farbschema

Netbeans mit Solarized-Farbschema

Geschrieben von Kap. Zuletzt geändert am 10. März 2017.

arXiv Terror eingrenzen

Der Upload eines Drafts bei arXiv verursacht einige Schmerzen. Abgesehen davon, dass das System relativ langsam ist, gibt es zwei Hauptprobleme.

  1. Die genutzen Paketversionen sind teilweise sehr alt
  2. Man kann nur Dateien in einem Verzeichnis hochladen und Dateien nur einzeln auswählen.

Darüberhinaus werden automatisch die tex-Sourcen veröffentlicht. Das finde ich sogar gut, aber es erzeugt zumindest bei mir einiges Unwohlsein, weil dadurch auch Kommentare veröffentlicht werden. Und oftmals stehen in Veröffentlichungen noch einige %TODOs oder auskommentierte alte Beweisversuche drin, die man ungern veröffentlichen möchte.

Zur Lösung zumindestens des zweiten Problems habe ich ein kleines Python-Script geschrieben, was das Veröffentlichen einfacher macht. Es löst folgende Aufgaben:

  • Bei angabe eines Wurzeldokumentes werden alle eingebundenen Dokumente in eine Ausgabedatei geschrieben.
  • Jeder Kommentar wird entfernt.

Ausgabe ist dann eine einzelne Datei, die das gesamte Dokument enthält. Zusätzlich mag es natürlich noch weitere Dateien, wie zum Beispiel die Literaturangaben oder das Farbschema für den Ausdruck, geben. Zumindestens die Struktur des Inhalts muss man für die Veröffentlichung nicht mehr bearbeiten, was eine deutliche Erleichterung ist. Selbst bei kurzen Papern kommen leicht einige Dateien zusammen wenn Bilder und Tabellen ausgelagert werden. Bei vernünftiger Sturkturierung landen diese dann auch in entsprechenden Unterverzeichnissen.

Das Tool arxify ist auf GitHub verfügbar.

Geschrieben von Kap. Zuletzt geändert am 30. Juni 2016.

Benutzerdefinierte BibTex-Keys mit Zotero

Zotero ist ein tolles Tool, um Bibliotheken von Referenzen zu verwalten, insbesondere wenn man an verschiedenen Papern und einer Dissertation arbeitet. Der Export nach BibTex wird aber leider etwas stiefmütterlich behandelt, was komisch ist, wo doch Latex im Bereich Physik/Mathematik/Informatik der Standard ist.

Unflexibel heißt hier zum Beispiel, dass die zitierten BibTex-Schlüssel (also das, was im \ref{} als Verweis benutzt wird), die Form „author1_titelwort1_jahr“ hat. Und zwar genau so, mit kleinen Buchstaben etc.

Wie ein solcher Schlüssel erstellt wird, kann (zumindest in der Variante als Firefox-Plugin) in der Datei BibLaTex festgelegt werden. Diese Datei enthält JavaScript-Code, der aus einem Zotero-Datenbankeintrag einen BibTex-Eintrag erzeugt.

Ein kleines bisschen Flexibilität ist insofern vorhanden, als es die Variable

//%a = first listed creator surname
//%y = year
//%t = first word of title
var citeKeyFormat = "%a_%t_%y";

gibt, in der man das Format festlegen kann. Nicht so gut ist, dass es nur die drei schon erwähnten Platzhalter gibt.

Ich will hier nicht weiter darauf eingehen, wie man überhaupt auf die Idee kommen kann, ein so eingeschränktes, fest vorgegebenes Verfahren zu implementieren, wenn man schon Ansätze wie allgemeine Schlüssel-Formate und reguläre Ausdrücke für die Implementierung benutzt! :facepalm:

Komplexere Schlüssel erzeugen

Ich hätte gerne Schlüssel mit der folgenden Struktur: „Author1Author2Author3+Jahr„, wobei das + genau dann gesetzt wird, wenn es mehr als 3 Autoren gibt. Die Felder für Author2 und Author3 bleiben natürlich leer, wenn eine Veröffentlichung entsprechend weniger Autoren hat.

Eine mögliche Lösung:

Die Variable var citeKeyConversions = { gibt drei Funktionen zurück, abhängig davon, ob a, t oder y als Wert in citeKeyFormat benutzt worden ist.

Um das Verhalten wie gewünscht anzupassen benutze ich folgendes Vorgehen: wenn die Variable %a mehrmals benutzt wird, soll jeweils der nächste Author benutzt werden. Weiterhin sollen die Authoren mit großem Anfangsbuchstaben benutzt werden, der Aufruf von toLowerCase() muss also entfernt werden. Der Anfang des Funktionsgenerators sähe dann z. B. so aus:

var authorcount = 0; // counts how often %a is already used
 
var citeKeyConversions = {
  "a": function (flags, item) {
    if (item.creators && item.creators[authorcount] && item.creators[authorcount].lastName) {
      if( authorcount == 3 ) // add + for each additional author after the third
        return "+";
      // removed the lower case conversion here and access to authorcount-index instead of zero
      return item.creators[authorcount++].lastName.replace(/ /g, "_").replace(/,/g, "");	
    }
    return "";
  },

Dies liefert allerdings noch nicht das gewünschte verhalten, die Namen werden weiterhin in Kleinbuchstaben verwandelt. Dafür zuständig ist der reguläre Ausdruck

var citeKeyCleanRe = /[^a-z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g;

der Angibt welche Zeichen erlaubt sind. Sämtliche anderen Zeichen werden am Ende entfernt. Hier fehlt der Teil für Großbuchstaben, so dass diese entfernt werden. Wenn man es anpasst, klappt es:

var citeKeyCleanRe = /[^a-zA-Z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g;

Mit dem korrekten citeKeyFormat

var citeKeyFormat = "%a%a%a%a%y";

funktioniert es im Wesentlichen, wie gewünscht.

Feintuning

Etwas Feintuning ist allerdings noch notwendig. Es wird zur Formatierung die Methode tidyAccents aufgerufen, die Akzente, Tilden und Ähnliches entfernt, so dass der BibTex-Key am Ende im Ascii-Format ist. Die dabei aufgerufene Methode ZU.removeDiacritics ist leider nicht hundertprozentig korrekt, so dass aus einem ß lediglich ein einzelnes s wird.

Um das zu korrigieren kann man vorher

  r = r.replace(new RegExp("[ß]", 'g'), "ss");

einfügen.

Weitere Änderungen kann man bei Bedarf hinzufügen. Falls Dopplungen auftauchen (was eher unwahrscheinlich ist, aber trotzdem vorkommen kann) werden Anhänge der Form „-1“, „-2“ etc. automatisch angehängt. Für meine Situation habe ich das so angepasst, dass Buchstaben „a“, „b“, etc. angehängt werden.

    var citekey = basekey;
    var i = 0;
    while (citekeys[citekey]) {
      //citekey = basekey + "-" + i;
      citekey = basekey + String.fromCharCode("a".charCodeAt()+i);
      i++;
    }
    citekeys[citekey] = true;

Die Variante mit den Buchstaben ist natürlich nicht so allgemein, wie die mit den Indizes, aber ich erwarte nicht mehr Veröffentlichungen der gleichen Autoren in einem Jahr zu haben, als Buchstaben im Alphabet sind, vor allem, da die hier vorgestellte Variante mit Großbuchstaben fortfährt.

Viel Erfolg euch, euer eigenes Schlüssel-Key-System automatisch generieren zu lassen :)

Geschrieben von Kap. Zuletzt geändert am 14. März 2014.

Neue Schlacht im Verwertungs-Krieg

Mittlerweile weiß es jeder: Die GEMA ist böse und davon, wie das Internet funktioniert hat sie schon gar keine Ahnung. Nun Betritt neben der GEZ und der GEMA ein weiterer Schurke auf und will harmlosen Konsumenten das Geld aus der Tasche ziehen: die ZPÜ (die sogenannte „Zentralstelle für Überspielungen“) möche gern Abgaben bis zu 36€ auf jedes Handy aufschlagen.

Die ZPÜ hat mehrere große Konzerne angeschrieben, doch bitte für jedes Verkaufte Handy seit 2011 eine entsprechende Gebühr zu erheben. Wofür? Na, für die vielen legalen Privatkopieen, die damit so erstellt werden! Eine gewisse Chuzpe kann man der ZPÜ nicht abstreiten, so richtete sie ihre Forderung direkt an Chefs und CEOs, z.B. an Tim Cook (Apple), Larry Page (Google) und Kazuo Hirai (Sony). Die düften alle erstmal ob des scheinbaren Witzes gelacht haben. Eine unbekannte deutsche Organisation mit einem Umlaut im Namen fordert hunderte Millionen. Eigentlich ganz lustig, diese Lederhosenträger aus Europa ;)

Vermutlich sind die ZPÜler leider nicht verrückt, sondern meinen es ernst oO als Verhandlungsbasis stehen folgende Preise im Raum:

  • 36€ für Smartphones mit mehr als 8 GiB Speicher
  • 16€ für Smartphones mit weniger als 8 GiB Speicher
  • 12€ für herkömmliche Handys

Diese Zahlungen werden angeblich eingefordert, um einen angemessenen Schadensersatz für die zahllosen legalen Privatkopien, die mit den Handys gemacht werden. Diese Abgaben sind auch schon auf Kopierern, Computern, Festplatten, CD-, DVD- und BluRay-Brennern, USB-Speichermedien und auf quasi Allem enthalten. Und nun müssen sie natürlich noch auf Handys erhoben werden, weil man damit so gut kopieren kann. Und zwar die Daten, die man über die Musik-Flatrate (Google All Access, Spotify, iTunes und Konsorten) schon bezahlt hat. Demnächst auch auf Fernsehern, Kühlschränken und Toastern :-/

Denn: für illegale Kopien ist diese Abgabe ja nicht geschaffen. Wobei das mal langsam an der Zeit wäre: man darf illegale Kopien machen, schließlich wurde ja dafür auch schon ordentlich bezahlt! Abgesehen von der Mehrfachbelastung für über 9000 Geräte entspräche das dann schon fast der Kulturflatrate.

Dabei kennen wir doch alle bereits lange die Vorteile, die Raubmordkopien haben:

If you are a pirate, this is what you get: but if ou are a paying customer, this is what you get:

Vorteile von Raubkopien gegenüber legal erworbener DVDs.

Auch wenn es bereits vier Jahre alt ist, und DVDs bereits damals veraltet waren, ist es noch immer wahr. Mein schlechtes Gewissen bezüglich des Kopierens wird sich auch durch diesen erneuten Beitrag nicht bilden.

Die Abgabe für PCs liegt übrigens bei 13,19 € im Falle privater Nutzung. Das wären bei meinem Rechner etwa 3,77 € pro Terabyte. Hochgerechnet auf Handys würde das auf mein Handy mit 8 GiB Speicher 3 Cent betragen. Nun, damit könnte ich mich im Notfall einverstanden erklären.

Bleibt zuletzt noch die Frage zu klären, was die ZPÜ eigentlich ist, außer ein Witzverein mit Umlaut. Die ZPÜ vertritt gesammelt die verschiedenen Verwertungsgesellschaften, denn außer der GEMA, die ja leider hinlänglich für die Musik-Probleme bekannt ist, gibt es noch entsprechende Gesellschaften wie VG Wort für journalistische Erzeugnisse. (Gehört da dieses Blog nicht auch zu? Nun, Geld stinkt nicht, vielleicht trage ich mich da mal ein!) und weitere. Eine relativ unbekannte ist die GÜFA. Wieder so ein Umlaut-Zeug, diesmal aber die einzige, die vermutlich berechtigterweise Geld von Handyherstellern fordern kann: sie vertritt die Pornografen. Und die, das wird man sofort einsehen, werden wohl am häufigsten Kopiert. Die Anzahl der YouPorn und RedTube-Clips, die in Schulen und Unis von Handy zu Handy gereicht werden, dürften unzählbar sein :P

Geschrieben von Kap. Zuletzt geändert am 24. Februar 2014.

MathML mit WordPress

Im Artikel über Matrix-Generierung habe ich zum ersten Mal MathML benutzt. Um zu einer korrekten Darstellung in WordPress zu kommen, musste ich etwas Tricksen. Was genau zu tun ist, beschreibe ich hier.

Das Layout von nerdpause ist bereits in HTML5 geschrieben (erkennbar am als erster Zeile der Ausgabe), so dass Math ML ohne weitere Probleme benutzt werden kann. Sollte das Layout noch in XHTML 1.1 verfasst sein, muss der DocType um die Angabe zu MathML erweitert werden, sie lautet dann .

Wie man MathML-Code schreibt, ist in vielen Artikeln und Blogs beschrieben, zum Beispiel hier von Danijel Gorupec, aber auch der (englische) Wikipedia-Artikel bietet für den Einstieg einige Beispiele. Der Deutsche taugt natürlich mal wieder nichts und verdient im aktuellen Zustand keinen Link.

Die wesentliche Struktur von MathML-Code ist eher langatmig. Der Formel aus dem Satz von Pythagoras,

a2 + b2 = c2, wobei a,b,c

, sieht etwa so aus:

<math>
  <msup>
    <mi>a</mi>
    <mn>2</mn>
  </msup>
  <mo>+</mo>
  <msup>
    <mi>b</mi>
    <mn>2</mn>
  </msup>
  <mo>=</mo>
  <msup>
    <mi>c</mi>
    <mn>2</mn>
  </msup>
  <mtext>, wobei&nbsp;</mtext>
  <mi>a</mi>
  <mo>,</mo>
  <mi>b</mi>
  <mo>,</mo>
  <mi>c</mi>
  <mo>&#x02208;</mo>
  <mi>&#x0211D;</mi>
</math>

Dabei ist vor allem zu beachten, dass der Mathematik-Bereich von <math> umschlossen wird. Das Element math kann entweder inline oder als Block dargestellt werden, was über CSS geregelt werden kann (analog z.B. zu span oder div).

Im Standardverhalten von WordPress ist das Ergebnis jedoch grauenhaft. Es werden zahllose Leerzeilen eingefügt, ein Blick in den Code der übertragenen Seite zeigt viele zusätzliche <p> und <br>-Tags. Das ist ein bekannter Bug, der jedoch schon seit 4 Jahren nicht gefixt wird. Angeblich weil das Einflüsse auf Rückwärtskompatibilität hätte. Dass man bei Verwendung der Auto-Format-Funktion von WordPress auf MathML in der selbst geschriebenen Variante komplett verzichten muss wird dabei nicht berücksichtig.

Wie behebt man das ganze nun? Ganz einfach!

In WordPress gibt es die Funktion wpautop, die bestimmte Formatierungen automatisch durchführt. Eigentlich ganz praktisch, damit kann man Absätze erzeugen, indem man einfach leere Zeilen einfügt, ähnlich wie bei LaTeX. Die Methode fügt die Absätze noch an weiteren Stellen ein, unter anderem auch nach math-Umgebungen. Um das Verhalten zu ändern, muss man einfach die datei wp-includes/formatting.php öffnen und eine Zeile wie folgende suchen:

// Space things out a little
$allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|option|form|map|area|blockquote|address|style|p|h[1-6]|hr|fieldset|noscript|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)';

In der Variable allblocks sind alle Bereiche definiert, die als Block dargestellt werden sollen. Man muss dort einfach den Teil |math| löschen, und die Darstellung von MathML klappt problemlos!

Geschrieben von Kap. Zuletzt geändert am 7. Februar 2014.

Der Java user.home-Bug

Ich habe kürzlich mein System neu aufgesetzt und bin dabei auf ein Problem gestoßen, das die Java-Entwickler seit Jahren nicht lösen.

Ich unterteile (unter Windows) mein System in zwei Teile,C: und D:. Auf ersterem Laufwerk installiere ich die Programme und Windows, auf letzterem lagere ich meine Daten. Naheliegend, weil D nach C kommt aber auch für Daten ;) . So kann ich das System neu aufsetzen und die Daten einfach mitnehmen. Nach der Neuinstallation muss ich nur die Ordner von zum Beispiel C:\Users\Benutzername\Desktop wieder auf D:\Desktop umbiegen und alles ist wie gehabt.

Nun wollte ich NetBeans installieren, das schlug aber fehl mit dem Hinweis, dass im Verzeichnis D:\ nicht mehr genug Platz vorhanden sei (etwa 600 MiB waren nötig, meine alte Platte war aber voll) um einen Ordner .nbi anzulegen oO . Nun erinnerte ich mich, dass ich schon immer den Ordner D:\.nbi hatte und den auch durch Löschen nicht dauerhaft entfernen konnte. Eine schnelle Suche ergab folgendes:

Der Ordner .nbi wird von der Installationsroutine angelegt und sollte eigentlich in %USERPROFILE%, also in der Windows-Variante des Home-Verzeichnisses liegen. Im Blog von Tim Ehat fand ich die Lösung: Das Home-Verzeichnis wird von der JVM über eine Systemeigenschaft „user.home“ abgefragt, zum Beispiel so:

public class PropertyTest {
    public static void main(String[] args)
        throws Exception {
			System.out.println( System.getProperty("user.name") );
			System.out.println( System.getProperty("user.home") );
			System.out.println( System.getProperty("user.dir") );
		}
}

In Windows wird jedoch das Elterverzeichnis des Desktops genommen (der bei mir nunmal unter D:\Desktop liegt). Das ist nun auch die Erklärung, warum ich diese Verzeichnisse auf Laufwerk D bekomme.

Man kann das nun ganz einfach Umbiegen: Die JVM fragt eine Umgebungsvariable _JAVA_OPTIONS ab, in der man den Java-Parameter -Duser.home=%USERPROFILE%\AppData\Roaming eingeben kann, oder einen beliebigen anderen Pfad.

Fazit: endlich ist mein System sauber und die Datenplatte von unnötigem Müll befreit. Was die Entwickler dazu getrieben hat, einen selten dämlichen Algorithmus zur Bestimmung des Home-Verzeichnisses zu wählen und das nicht zu fixen, weiß ich leider auch nicht. Im Kommentarbereich von Tims Blog wird angedeutet, dass es an Abwärtskompatibilität liegt. Aber mal ehrlich: Wenn man den Pfad zumindest auf %USERPROFILE% setzt bekommen das normale Anwender nicht mit. Und Nutzer, die ihren Desktop umlegen sollten in der Lage sein, eventuell auftretende Probleme zu Fixen.

Geschrieben von Kap. Zuletzt geändert am 4. Januar 2014.

Zufällige Matrizen generieren

Zum Testen einer Methode zur Matrix-Multiplikation wollte ich gern Matrizen haben, dass das Ergebnis einer Matrixmultiplikation eine ganzzahlige Matrix mit „schönem“ Aussehen ist, so dass die Korrektheit der Implementation leicht überprüft werden kann. Sämtliche Matrizen sollten nach möglichkeit ganzzahlig sein. Um das Ziel zu erreichen habe ich einen Matrix-Generator geschrieben, mit dem ich das vorgestellte Verfahren erleutere. Der Generator benutzt meine simple Implementation einer Matrix-Klasse, die die wichtigsten Methoden bereitstellt.

Zuerst wollte ich eine Einheitsmatrix erzeugen, ich suchte also zwei Matrizen

A

und

B

mit

A×B=E

. Dies würde jede invertierbare Matrix erfüllen. Zusätzlich sollten nun aber

A

und

B

noch ganzzahlig sein. Allgemein ist für eine ganzzahlige Matrix

A

die Inverse

A1

zwar rational, aber nicht ganzzahlig.

Meine Kenntnisse der linearen Algebra waren etwas eingerostet, aber nach kurzer Suche fand ich einen Artikel von Nathan Brixius, der ebenfalls über die Erzeugung spezieller Matrizen schrieb und mir bei der Erinnerung half. Für die Determinanten von Matrizen gilt

det(A) · det(B)=det(AB)

und die Determinante der Einheitsmatrix ist natürlich 1. Außerdem kann man die Determinante von Matrizen in oberer oder unterer Dreiecksform als Produkt der Diagonalen leicht bestimmen.

Wir erzeugen zunächst eine Matrix in unterer Dreiecksform:

double[][] values = new double[dimension][dimension];
for( int i = 0; i < dimension; ++i )
	values[i][i] = 1;
for( int i = 1; i < dimension; ++i )
	for( int j = 0; j < i; ++j )
		values[i][j] = getValue(i, j);
Matrix lowerTriangular = new Matrix( values );

Es wird ein 2-dimensionales Array erzeugt, das die Werte enthält. Die Diagonale wird mit

1

gefüllt und die untere Hälfte mit Werten, die in der Methode getValue erzeugt werden (z.B. zufällig).

Genauso wird eine Matrix in oberer Dreiecksform benötigt:

values = new double[dimension][dimension];
for( int i = 0; i < dimension; ++i )
	values[i][i] = 1;
for( int i = 0; i < dimension-1; ++i )
	for( int j = i+1; j < dimension; ++j )
		values[i][j] = getValue(i, j);
Matrix upperTriangular = new Matrix( values );

Das Prinzip entspricht dem der LU-Zerlegung einer Matrix: Es werden zwei Matrizen L und U in unterer beziehungsweise oberer Dreiecksform erzeugt, so dass die Determinante 1 ist (d.h. die Diagonale ist 1). Die Matrix

M:=L×U

ist ganzzahlig und invertierbar und nach der Bestimmung der Inversen über die Determinante ist die inverse Matrix

A1

ebenfalls ganzzahlig.

Matrix matrix = lowerTriangular.mult( upperTriangular );
Matrix inverse = matrix.invert();

Mögliche Matrizen als Testinstanzen sind damit also

M

und

A1

. Um Abwechslung zu erzeugen kann man nun beliebige Matrizen

F

an

M

von links anmultiplizieren (oder an

A1

von rechts) und erhält als Ergebnis nicht mehr die Einheitsmatrix, sondern

F

:

F×M×M1=F×E=F

.

Als Beispiel erzeugen wir eine Matrix, die natürliche Zahlen von 1 aufsteigend enthält:

values = new double[dimension][dimension];
int c = 1;
for( int i = 0; i < dimension; ++i )
	for( int j = 0; j < dimension; ++j )
		values[i][j] = c++;
Matrix F = new Matrix( values );

Damit kann die Ausgabematrix erstellt werden:

Matrix result = matrix.mult( inverse );

Die beiden Testinstanzen sind dann result und inverse, das Ergebnis der Multiplikation ist

F

. Natürlich kann

F

auch rationale Zahlen enthalten, dann ist natürlich die Eingabematrix auch nicht mehr ganzzahlig.

Geschrieben von Kap. Zuletzt geändert am 11. Januar 2014.

Der lange Weg zur Adresse in den USA

Ich wollte mir eine Flasche 360 Vodka Glazed Donut bestellen, die Geschmacksrichtung ist einfach zu abgefahren, um sie nicht zu probieren. Leider gibt es fast keinen europäischen Händler, der diese Marke führt und amerikanische Händler verschicken nichts nach Europa. Also muss eine US-Adresse her, das ist aber auch leichter gesagt, als getan. Hier die ersten drei Phasen auf dem Weg zum Vodka.

Phase 1: Versand nicht Möglich

Nachdem ich vom Vodka 360° gehört hatte (nicht zu verwechseln mit Three Sixty!), wurde der Wunsch ihn zu haben schnell so groß, dass ich ihn nicht mehr ignorieren konnte.

So schwer kann das ja nicht sein… denkste! Schnell das Internet angeschmissen (nur metaphorisch), etwas gegoogelt und festgestellt: so einfach ist das doch nicht oO Er wird nur in den USA vertrieben (mit ausnahme eines UK-Stores, wo er aber ausverkauft war) und kein Geschäft in den USA schickt Alkohol nach Europa. Schon irgendwie verständlich, es mag ja Zoll-Probleme geben. Aber ich habe noch nicht mal einen Gefunden der Auf-eigene-Gefahr-Versand anbietet.

Nach weiterer Suche wurde auch klar, warum: zwar ist die Prohibition schon seit einiger Zeit vorbei, so richtig überwunden scheint das ganze Thema mit dem bösen Alkohol aber noch nicht, und so hat jeder Versandhändler auch eigene Listen, in welche Staaten er überhaupt Alkohol verschickt. So einfach geht das also nicht, es muss eine neue Idee her!

Phase 2: Weiterversand

Da viele Nerds eh an Gegenstände kommen müssen, die bei uns nicht verkauft werden (da wir dankenswerterweise hier hin #Neuland auch von Firmen wie Google zweitklassig behandelt und einige Produkte nicht bekommen) hatte ich schon von virtuellen Adressen gehört.

Kurze Recherche ergab drei Kandidaten: MyUS, Borderlinx und VIAdress. Letzterer fäll hauptsächlich durch Spam negativ auf, fällt also direkt raus. Borderlinx hätte zwar den Vorteil mit DHL zusammen zu Arbeiten und so die potentiellen Möglichkeit dem deutschen Zoll gut klar zu kommen, schießt sich aber durch die Restriktionen bereits ins Abseits. Dass Leichen und lebende Tiere nicht verschickt werden ist ja noch einsehbar. Aber auch Handys und Alkohol werden nicht verschickt (wichtig auch für alle Nerds!), sogar Pornos sind nicht erlaubt (wobei man die Möglichkeit ja eh nicht braucht). Also war die Entscheidung klar: MyUS sollte es werden, es wurde auch bei Awesome Drinks, dem Shop von Everyday Drinkers bzw. Common Man Cocktails für internationalen Versand empfohlen.

Phase 3: Account anlegen

Die letzte Phase sollte eigentlich recht schnell gehen. Account anlegen (kostet 10$) und fertig. Das hat sich jedoch als schwierig herausgestellt, da ich meine Kreditkartendaten nicht eingeben konnte, ausgerechnet bei einem amerikanischen Unternehmen, dabei funktioniert da doch alles mit Kreditkarten! Eine völlig neue Erfahrung. Zusätzlich zu den üblichen Informationen (Nummer, Code, …) wurde nämlich noch nach der „Issuing Bank“ und „Issuing Bank Phone Number“ gefragt.

Nun, die ausgebende Bank der Kreditkarte ist nicht unbedingt die Bank, von der man die Karte erhalten hat. Bei der Anmeldung wird immerhin der Tipp gegeben, dass diese Informationen auf der Rückseite stünden. Tatsächlich stand da bei mir auch was (eine Bank von der ich noch nie gehört habe). Die Telefonnummer steht da jedoch nicht.

Man kann jedoch einfach an diese Informationen kommen: die ersten sechs Ziffern der Kreditkartennummer, die sogenannte BIN, kodieren unter anderem die ausgebende Bank und in Online-Datenbanken wie Binbase.org kann man sich die Bank und zum Glück auch die Telefonnummer heraussuchen lassen.

Zuletzt verwendet MyUS bei der Dateneingabe einen Mechanismus, der von NoScript als gefährliche Cross-Site-Script-Attacke erkannt wird. Nach vielen Versuchen konnte ich es immerhin noch erreichen, dass meine Karte akzeptiert wurde und ich habe endlich meine Adresse in Florida B-) .

Ob das ganze mit dem Vodka doch noch klappt, werde ich demnächst berichten.

Geschrieben von Kap. Zuletzt geändert am 12. November 2013.

Ich und mein Computer: Symbolische Links

Es gibt eine ganze Liste von Fehlern, die ein Computer so haben kann. Deichkind beschreiben in ihrem Song Ich und mein Computer einige davon. Die meisten davon waren mit bekannt, und einige wie „Festplatte Voll“ und „Falsche Version, Update nicht verfügbar“ hatte ich natürlich auch schon. Selbstverständlich auch den Refrain „Sanduhr – Sanduhr“.

Auf meinem Linux-Rechner bin ich vor der Sanduhr verschont, dafür gibt es aber ein Problem, an das der Typische Windws-User nicht denkt. (Bei Äpfeln gibts das theoretisch auch, da ja auch ein Unix drunter ist. The More You Know ;) )

The More You Know - Have A Mac? - You Use UNIX!

Nun hatte ich das Problem, dass Wuala auf dem Linux-Rechner ein Verzeichnis nicht synchronisiert. In der Sync-Übersicht (Strg+F9) wurde bei dem Sync-Auftrag zwar ein grünes Häkchen angezeigt, die Größe des Verzeichnisses stand aber bei 0 B, obwohl das Verzeichnis ganz sicher Dateien enthielt. Nach langem Suchen, was wohl die Ursache sein könnte, fand ich heraus dass ~/Data ein symbolischer Link auf ein anderes Verzeichnis war. Wuala scheint symbolische Links nicht zu unterstützen, nach Änderung auf den absoluten Pfad klappte auch das synchronisieren.

:facepalm: ich hatte das gleiche Problem bereits mit Thunderbird, das den Profilordner nicht ordnungsgemäß lädt, wenn er einen symbolischen Link enthält.

In dem Sinne: Programm findet Daten nicht, symbolischer Link benutzt!

Geschrieben von Kap. Zuletzt geändert am 20. November 2013.