entbehrlich.es

Im Moment mache privat ich ziemlich wenig Technik oder Admin Zeug. Das liegt zu großen Teilen an rvo, aber auch an entbehrlich.es.

Ein Projekt, dass aus etwas entstanden ist, dass ich mir seit einiger Zeit angewöhnen will. Mehr Wikipedia lesen. May I introduce to you..

https://entbehrlich.es/

Was ich dabei so finde und interessant ist, landet auf entbehrlich.es. Details auch auf der About Page: https://entbehrlich.es/about/

Why BigData sucks.

In der Arbeit komme ich häufiger mit BigData in Berührung. BigData. Ein hartnäckiges Buzzword, das sich seit Jahren in der IT Branche hält.

Irgendwie geht es um Hadoop. Der Standardstack ist ziemlich robust. Also Hadoop HDFS und Hadoop MapReduce. Aber es gibt noch 100 andere Software Projekte die sich BigData auf die Fahne schreiben. Ein kleiner Auszug:

Hive, Spark, Impala, Tez, HortonWorks, Cloudera, Redshift, Kinesis, ElasticSearch, Tableau, Flume, Storm, Druid, Flink, HBASE, Drill, Kafka, Oozie, Knox, Parquet, Sqoop, Crunch, Lumify, Solr, Samoa, Yarn

Und das sind nur ein paar Wenige. All diese Projekte interagieren in irgendeiner Weise mit HDFS, MapReduce oder werden im selben Kontext angewendet. Alle 2-3 Wochen kommt ein neues Projekt auf den Markt und wird als “the next big thing” gehandelt. Das stellt einige Anforderungen an den Admin.

Auch Ansprüche die man als Admin an sich selbst stellt. Das Setup soll ja schliesslich automatisiert, ausrollbar und hochverfügbar sein.

Administration Hell

Und jetzt einfach mal vorstellen, dass man als Wald-und-Wiesen Admin auf sowas losgelassen wird. Jede Software mit eigener Architektur, eigenen Wording und eigenen Konzepten.

Noch dazu ist das meiste Zeug gerade erst 2-3 Monate alt, seit es aus den Tiefen des Open Apache Graveyards aufkeimte. Da lässt die Softwarequalitätssicherung grüßen.

Ein kleines Spiel. Die folgenden 6 Worte aus dem Hadoopumfeld stellen entweder Master- oder Slave-daemon dar. Ordne zu.

  • Nodemanager
  • Namenode
  • Resourcemanager
  • Datanode
  • Jobtracker
  • Tasktracker

Von oben nach unten: Slave, Master, Master, Slave, Slave, Master, Slave. Witzig ist auch, dass der “Secondary Namenode” so ziemlich alles macht aber kein Secondary ist.

Man merkt öfter, dass das Stück Software einfach nicht zuende Gedacht ist. Mal fehlt das Logrotate, mal ein anständiges Interface um das Cluster zu Administrieren. In den meisten Fällen fliegt einem Software X einfach wegen Kleinigkeiten um die Ohren und man findet sich selbst beim Googeln nach Java Stacktraces wieder.

Quality!

Wenn ich mit dem Anspruch von Unix Software an BigData denke, dreht sich mir alles um. Das Gefühl beschleicht einen, dass nahezu alle Grundsätze von “Simple, Robust, Secure, Fast, Well documented” ignoriert werden.

Community

Ich würde behaupten, mich halbwegs in dem Thema BigData auszukennen. Mit Sicherheit bin ich kein Spezialist, aber ich finde mich zurecht. Selbst wenn ich in den tiefsten Ecken meines Verstandes grabe, fällt es mir bei typischen BigData Artikeln schwer zu verstehen was der Post eigentlich sagen möchte. Ein Beispiel: 16 Top Big Data Platforms

Ich meine ich lese hier kein Tolstoi. Was ist denn los zur Hölle? Und das geht 17 Seiten so weiter!

Conclusion

Ich glaube, das Geschäftsfeld BigData braucht einfach Zeit. Zeit bis sich die “Big Players” herauskristallisiert haben. Bis genügend Startups die Pleite gegangen sind. Bis Data Scientists & Developer nicht mehr gezwungen sind 130 Tools zu evaluieren um Mehrwert zu generieren. Dann wird BigData annehmbar.

Minimales Python Development

Wegen rvo und cmddocs musste ich in letzter Zeit ziemlich an meinen Development Kenntnissen arbeiten. Dabei ist eine Menge Zeug heraus gekommen.

Das ganze läuft relativ unprofessionell ab. Ich nutze weder PyCharm noch sonst irgendwelche fancy IDEs. Ich entwickle meinen Python Kram unter OpenBSD auf der Commandline mit vim. Der Rest sind kleine Zusatztools.

Setuptools

Zugegeben, in das Thema pip Packages einzutauchen ist irgendwie unschön. Undurchsichtig, solange man das nicht mal kurz gezeigt bekommt.

Ich nutze dafür Cookiecutter, um nicht alles selbst machen zu müssen.

Imports und Virtualenv

Package Scopes waren für mich immer etwas fragwürdig. Vor allem Imports. Wie importiere ich jetzt selbstgeschrieben Module?

# import foo ? nein.
import rvo.foo

Um diese Schreibweise während dem Development nutzen zu können sollte man sich ein Virtualenv initialisieren und darin das Paket deployen in dem man arbeitet.

pip install virtualenv
virtualenv .venv
source .venv/bin/activate
python setup.py develop

Schon klappts auch mit den Nachbarn^WImports

Changelog

Changelog schreiben. Meh. gitchangelog hilft. Die kleine Software generiert automatisch ein Changelog aus den git Commits. gitchangelog nutzt dafür Regexes um die Commits zu kategorisieren und git tags um die Versionen zu kennzeichnen. Alles Dinge, die ich sowieso schon tue.

$ vim .gitchangelog.rc
section_regexps = [
  ('Feature',
    [ r'^[fF]eature\s*:\s*([^\n]*)$' ]
  ),
  ...
]
tag_filter_regexp = r'^[0-9]+\.[0-9]+(\.[0-9]+)?$'
output_engine = mustache("restructuredtext")

$ gitchangelog > CHANGELOG.rst

Man braucht zwar etwas Disziplin beim committen, aber das ist halbwegs erträglich.

Help!

Das auf pypi nur ReStructuredText okay ist, ist so eine andere Geschichte.

Sollte man (so wie ich) vorher ein Markdown Readme gehabt haben, kann man dieses einfach mit pandoc konvertieren.

pandoc README.md --to rst > README.rst

Editor

Die beiden größten Faktoren für ein entspanntes Entwicklungsumfeld sind für mich syntastic und snippets.

Snippets sind nichts anderes als Autocompletions. Es ist einfach wahnsinnig komfortabel trys und ganze Klassen per Tab automatisch generieren zu lassen. Das verlinkte Repo ist nur der Provider der eigentlichen Schnippsel. Das Plugin, welches diese Snippets abruft und einfügt, ist UltiSnips. So ein Snippets Setup wird aber nie die Intelligenz einer full-blown IDE erreichen, die auch eigene Funktionen, Variablen oder weiss der Teufel noch was komplettieren können.

Wer trotz Snippets Code mit Syntax Errors baut (zum Beispiel ich), greift zu Syntastic. Syntastic zeigt einem (mittels Pylint und Pydocstyle) Importerrors, fehlende Dokumentation oder falsche Methodenparameter.

Per Default werden diese Checks beim Öffnen und Schreiben des Files angewendet. Das “entschleunigt” das Programmiererleben so sehr, dass es nervt. Ich habe das so umgebogen, dass die Überprüfung nur angestoßen wird, wenn ich es will.

let b:syntastic_mode = "passive"
let g:syntastic_always_populate_loc_list = 1 " populate, needed
let g:syntastic_check_on_open = 0
let g:syntastic_check_on_wq = 0
let g:syntastic_check_on_w = 0
let g:syntastic_enable_signs = 0 " dont show crazy signs at left border
let g:syntastic_auto_loc_list = 2 " dont open list automatically
let g:syntastic_loc_list_height = 5 "windows size
let g:syntastic_aggregate_errors = 1

" check for errors with -e
nmap <silent> <leader>e :SyntasticCheck<CR>:Errors<CR>

Und das wars auch schon. Mehr braucht es eigentlich nicht. Mein vim ist mittlerweile wieder etwas schmaler geworden. Bis vor kurzer Zeit hatte ich auch noch die Tagbar aktiv geschaltet. Es fehlt mir ein bisschen, alle Klassen, Funktionen, Variablen und Imports direkt in einer Seitenleiste zu sehen. Aber die Performance lässt einfach extrem zu wünschen übrig. Das Plugin spawnt erstmal einen Subprozess, der das ganze File analysiert. Wenn die Tagbar nicht auf exubertant-ctags basieren würde, wäre das vielleicht anders.

Empfehlen kann ich außerdem noch vim-python-pep8-indent, damit man auch Indents und Formatierung richtig macht. Um die Versionsverwaltung in den Editor einzubinden kann man noch gitgutter nutzen (highlightet geänderte Zeilen) und fugitive, womit sich git direkt aus vim bedienen lässt.

Versionierung

Versionierung ist auch noch so ein Ding. Wie kann ich meine Software jetzt möglichst ohne Aufwand um eine Version erhöhen? Wenn man aktuellen Browser Versionsnummern folgt, passiert das durchaus öfter.

Wo will ich meine Versionsinformationen überall haben?

  • Commandline mit –version
  • In der Help Message
  • Im pip Paket
  • Im Git Changelog

Die stressfreiste Variante ist, sie nur in der setup.py zu definieren und sie an allen anderen Stellen zu importieren.

setup(
    name='rvo',
    version='10.0.0',
    ...
)

In der __init__.py holt man sie sich via

#!/usr/bin/env python2.7
from pkg_resources import get_distribution
__version__ = get_distribution('rvo').version

Und kann es an den verschiedensten Stellen einbauen mit

from rvo import __version__

PyPI

In der .pypirc sollte man, bevor man irgendwas tut, erstmal das Repo eintragen.

[pypitest]
repository=https://testpypi.python.org/pypi
username=your_username
password=your_password

Danach kann das Pakt in die unendlichen Weiten des Internets freigelassen werden.

python setup.py register -r pypitest
python setup.py sdist upload -r pypitest

Nach ein paar (erfolgreichen) Tests, kann man das nochmal wiederholen und auf PyPI hochladen. Macht einfach einen gedanklichen sed auf s#pypitest#pypi#.

Tests

Unter anderem auch noch… Tests. Aber das Thema ist so groß und ich noch so unerfahren, dass ich das mal weg lasse. Will man auf jedenfall haben, da Tests im Zweifel die einzigen Indikatoren für Paketmaintainer diverser Betriebssysteme sind, um sicherzustellen, dass die Software auch wirklich funktioniert.

Python Crypto - How do I Stromchiffre?

Ich schreibe schon seit Längerem eine Art Rewrite von cmddocs. Diesmal aber mit MongoDB als Backend. Darin liegen meine Notizen, Wiki, Zitate, Codeschnipsel und Journal. Wie genau das aussieht, wird ein anderer Post beschreiben, wenn ich es mal OpenSource machen sollte…irgendwann™

Auch wenn die MongoDB mit Authentication gesichert und der Transportweg mit TLS verschlüsselt ist (Data-in-Transit), verspürt man wie bei Full-Disk-Encryption den Drang die Daten auch auf der Platte zu verschlüsseln.

Was noch übrig bleibt, ist Data-at-Rest und dafür habe ich mich für applikationsseitige Verschlüsselung entschieden, da ich soetwas noch nicht gemacht habe.

Den Content, den ich in “rvo” (Arbeitstitel..) einwerfe und absichern will, möchte ich also mit einem Passwort verschlüsseln und dort ablegen. Dafür sind aber mehrere Teilkomponenten nötig.

Salsa20

Ich habe Salsa20 in der symmetrischen Variante als Algorithmus gewählt. Ich wollte irgendwas modernes und nicht eines von 100.000 How Tos für AES in Python nachbauen. In der deutschen Wikipedia taucht dafür das Wort “Stromverschlüsselung” auf… chchch. Der Streamcipher bietet wohl Geschwindigkeit als auch keine bekannten Angriffe die alle Phasen überwinden. Ich hab auch mal das Paper von djb überflogen, aber natürlich kein Wort verstanden.

Die Python Library pyNaCL, nimmt einem dabei aber zum Glück einiges ab.

import nacl.secret
import nacl.utils
key = nacl.utils.random(nacl.secret.SecretBox.KEY_SIZE)
box = nacl.secret.SecretBox(key)
msg = b"total laser"
nonce = nacl.utils.random(nacl.secret.SecretBox.NONCE_SIZE)
encrypted = box.encrypt(msg, nonce, encoder=nacl.encoding.HexEncoder)

Ich bin ja, was Crypto in der Entwicklung angeht, ziemlich unerfahren. Deshalb wollte ich dem notwendigen Kram mir bekannter Ciphers, wie Content zerstückeln für Block Ciphers und Padding, aus dem Weg gehen indem ich eine “Stromverschlüsselung” chchch verwende.

Aber auch bei Salsa20 gibts für den Entwickler Eigenheiten, die man bei der Implementierung berücksichtigen muss. Zum Beispiel die nonce. Nonce ist ein String, der nur einmal pro Zugriff auf den Ciphertext verwendet werden soll. Das heisst, auch wenn ich eine meiner Notizen lesend abrufe, muss ich es neu verschlüsseln mit einem anderen 24 Byte String als nonce.

Blake2b

Was mich ja nervt ist, dass Ciphers immer(?) eine fixe Größe eines Strings als Secret Key erwarten. In den meisten Beispielen im Netz ist das Passwort zur Verschlüsselung natürlich zufällig genau so lang, wie der Algorithmus es erwartet.

Deshalb muss ein Passwort-Hash her, von denen es wieder n Varianten gibt. Neben PBKDF2 (oder auch PDKDOMGWTFBBQ.. weil ich mir nie merken kann wie das Acronym genau lautet) auch noch die “Stromchiffre” chchch Blake2. Eigentlich ist dieser jetzt nicht so wirklich für Passwort Hashing geeignet, weil Sachen wie Salts usw fehlen (korrigiert mich, sollte ich falsch liegen). Zumindest wurde mir eben dieser ans Herz gelegt, um ihn in den Cipher zu kippen, da er genau die 32 Byte auswirft, die ich für Salsa20 brauche.

from pyblake2 import blake2b
key = blake2b(digest_size=32)
key.update(getpass.getpass("PASSWORD:"))
key = key.digest()

Einen normalen Workflow mit diesen beiden Komponenten findet ihr auf Github

Indirektion

Nachdem ich den Blake2b Hash als Key für Salsa20 nutzen kann um meine Dokumente zu verschlüsseln, stellen sich aber noch zwei weitere Probleme.

Erstens muss ich bei jedem Dokument das Passwort eingeben. Vertippe ich mich, ist das Passwort für ein Dokument anders als für alle anderen. Zweitens muss ich, sollte ich mich mal entscheiden mein Passwort zu ändern, alle Dokumente entschlüsseln und mit dem neuen Passwort verschlüsseln.

Wie alle Probleme in der Informatik löst man sie wie? Genau, Indirektion! Also generiere ich bei der ersten Benutzung einen Masterkey und verschlüssle diesen mit einem Passwort, welches der User wählt.

So kann ich auch abfangen, ob das eingegebene Passwort (bei späterer Benutzung) falsch oder richtig ist. Das Konzept ist natürlich jetzt auch nicht auf meinem Mist gewachsen. Festplattenverschlüsselungssoftware macht ähnliches. Wie geil wäre es auch, wenn du dein Disk Encryption Passwort änderst und erstmal die ganze HDD neu gecrypted werden muss?

Meine Klasse “Crypto” in rvo enthält nun 4 Methoden: init_master, get_master, encrypt und decrypt. Und funktionieren tuts auch noch. Irre.

Twitter Cards in Hugo

Twitter Cards sind diese seltsamen kurzen Vorschauen die einem auf Twitter bei geposteten Links angezeigt werden.

Bei den meisten Zeilen werden nur statische Dinge aus dem Hugo Context oder der Konfiguration angezogen. Die einzige interessante Zeile ist wohl der twitter:title. Damit nicht nur einzelne Blogposts sondern auch Seiten wie Archiv oder Home mit dem richtigen Seitentitel bestückt werden ist die if/else Unterscheidung nötig.

<!-- Twitter Cards -->
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="{{ .Site.Params.Twitter }}">
<meta name="twitter:creator" content="{{ .Site.Params.Twitter }}">
<meta name="twitter:title" content="{{ $isHomePage := eq .Title .Site.Title }}{{ .Title }}{{ if eq $isHomePage false }} - {{ .Site.Title }}{{ end }}">
<meta name="twitter:url" content="{{ .Permalink }}">
<meta name="twitter:image" content="{{ .Site.BaseURL }}/images/noqqe_square.png">
<meta name="twitter:description" content="{{if .IsPage}}{{ .Summary }}{{else}}{{.Site.Params.Description}}{{end}}">

Die sonstigen Inhalte werden aus der config.yaml geholt.

params:
 Description: "No advertising, no support, no bug fixes, payment in advance."
 Author: "Florian Baumann"
 Twitter: "@noqqe"

Tor & 32c3

Man kommt sich wieder vor wie 14. Damals, als man sich in der Schule freute am Internet zu sitzen und nach Lycos und Yahoo nicht mehr wusste, wohin man eigentlich surfen soll. Zumindest hatte ich dieses Gefühl am 32c3, als ich mich mal etwas besser umsah innerhalb der Darkweb^WCyber^WHidden Services mit den (jetzt per RFC gesicherten) .onion Adressen.

Wo steht eigentlich Tor? Wer hat davon etwas? Wenn ich nicht gerade als Whistle-Blower irgendwelche Dokumente in einen SecureDrop einwerfen will oder auf einer bestimmten Site Materialien erwerben möchte, ist das richtig schwer zu beantworten. Klar jetzt werden wieder allerhand Stereotypen bedient, aber mal ehrlich.

Was tut man? Man altavistat! Ich scheine nicht allein zu sein mit dem Problem nichts wirklich zu finden. Sowohl im wörtlichen als auch im übertragenen Sinne. Es gibt unzählige Index-Seiten, Tor Suchmaschinen, Quora Fragen usw.

Man klickt sich durch anonyme Chats, Beichtseiten, diverse Imageboards (dt&en) und zu meiner Überraschung auch interessante Sachen wie The Tor BSD Diversity Project

Leider ist die Ahnungslosigkeit innerhalb des Schul-Deja vu nicht das einzige das sich wiederholt. Auch die Web-Design sieht original so aus, als wäre man in der Zeit zurückgereist.

Im Talk am 32c3 war das Thema einfach mehr Sites in das Onion Network zu kriegen.

Sogar ein Blog bei dem es total Sinn befreit sie in Netzwerk anzulegen. So wie diesen hier. Trotzdem hab ich es mal getan. Unter gtn6uc5wbeavcda3.onion kann man diesen Blog nun abrufen.

OpenBSD Upgrade Guidelines

OpenBSD ist eine der am Besten dokumentierten Betriebssysteme überhaupt. Nichts, aber auch garnichts, führt an der offiziellen Upgrade Dokumentation vorbei, da diese jedes mal auch ein wenig anders ist.

Trotz allem Pflege ich so meine eigene kleine Anleitung in cmddocs um die vier Kisten unter meiner “Obhut” unfallfrei durch das Upgrade zu führen. Vor allem da nicht alle Aspekte in der offiziellen Anleitung ausgeführt werden. Seit 6 Releases mach ich das jetzt so.

Pre-Upgrade

  • Upgrade Manual auf http://www.openbsd.org/faq/upgrade5X.html genauestens durchlesen
  • Downtime im Monitoring eintragen
  • root Login direkt über sshd sicherstellen
  • Sicherstellen dass root eine /bin/ksh zugewiesen hat
  • Verifizieren dass die letzten Backups liefen

Upgrade

  • Von einem Host dediziert als root user einloggen, pur, nicht über sudo
  • Sicherstellen ob der Mirror, den man benutzt schon gesynct ist.
  • Base Sets und Kernel und Signaturen ziehen.
VER=5.8
ARCH=$(uname -m)
wget -r --no-parent -A.tgz http://openbsd.cs.fau.de/pub/OpenBSD/$VER/$ARCH/
cd openbsd.cs.fau.de/pub/OpenBSD/$VER/$ARCH/
wget http://openbsd.cs.fau.de/pub/OpenBSD/$VER/$ARCH/bsd
wget http://openbsd.cs.fau.de/pub/OpenBSD/$VER/$ARCH/bsd.rd
wget http://openbsd.cs.fau.de/pub/OpenBSD/$VER/$ARCH/bsd.mp
wget http://openbsd.cs.fau.de/pub/OpenBSD/$VER/$ARCH/bsd.sp
wget http://openbsd.cs.fau.de/pub/OpenBSD/$VER/$ARCH/SHA256
wget http://openbsd.cs.fau.de/pub/OpenBSD/$VER/$ARCH/SHA256.sig
  • Schritten aus der Anleitung zum Einspielen auf openbsd.org folgen
  • Reboot
  • Auf Package- / Base-Changes im Tutorial achten.

Packages und Ports

  • Packages: PKG_PATH in ksh/bash aktualisieren und updaten

    export PKG_PATH=http://openbsd.cs.fau.de/pub/OpenBSD/$(uname -r)/packages/$(uname -m)/
    pkg_add -u
    
  • CVS src Tree updaten

    cd /usr
    cvs -qd anoncvs@openbsd.cs.fau.de:/cvs get -rOPENBSD_5_X -P src
    
  • CVS ports Tree updaten

    cd /usr
    cvs -qd anoncvs@openbsd.cs.fau.de:/cvs get -rOPENBSD_5_X -P ports
    

Errata

Da oftmals Errata publik werden nachdem das eigentliche Release schon im freeze ist, am besten gleich nach dem Upgrade schauen, ob schon Errata verfügbar sind. Ich benutze hierfür Binpatching via openup

PKG_PATH_MAIN=http://openbsd.cs.fau.de/pub/OpenBSD/5.X/packages/amd64/
./openup

3rd Party Software

Sicher treffen diese Punkte nicht auf jeden zu, aber um ein Bild zu verschaffen um was es geht:

  • pip Packages neu installieren
  • gem Packages neu installieren
  • go Software neu bauen
  • Selbst kompilierte Software neu bauen (taskwarrior, tarsnap)

Post-Upgrade

  • sshd root login deaktivieren
  • Default Shell auf Bash zurückstellen (falls nötig)

Eventuell ist das für Neulinge oder Andere nützlich. Mir hilft es jedes mal wieder. Und wenn es nur darum geht mir sicher zu sein, nichts vergessen zu haben.

Als ich begann die Wikipedia zu editieren.

Ich begann vor kurzer Zeit, die Wikipedia zu editieren.

Der OpenBSD Artikel

Ich hab vorher noch nie irgendwas in die Wikipedia eingetragen. Und ich kann auch nicht sagen warum ich das jetzt mal machen wollte. Spieltrieb vielleicht.

Es begann mit dem Einfügen der Versionstabelle in den OpenBSD Artikel. Ich klaute mir eine Vorlage zu einer Versionstabelle aus einem Artikel, an den ich mich nicht mehr erinnern kann, editierte ein bisschen und am Ende kam das heraus was jetzt ersichtlich ist.

Alles verlief recht angenehm. Der Eintrag wurde gesichtet und freigegeben. Ganz nett eigentlich. Das war mein erster Beitrag und obwohl ich mit allem Möglichen rechnete, blieb er bestehen.

Der OpenSMTPD Artikel

Im Zuge der Ergänzung von Software Projekten die aus OpenBSD entspringen im Hauptartikel, fiel mir auf dass es für OpenSMTPD und OpenIKED keine Einträge gab.

Wie schwer konnte das wohl sein, einen neuen Artikel einzureichen? Schliesslich machen das auch andere Menschen. Ich kopierte also den Inhalt von OpenNTPD und schrieb ihn ein wenig um. Drückte auf Speichern.

Was dann passiert war vorerst normal. Wegen fehlender Relevanz sollte der Artikel gelöscht werden.

Löschanträge

Ich war mir erst unsicher ob das vielleicht immer so ist. Aber nach etwas stöbern und lesen, wurde mir klar dass es für soetwas “Einzelnachweise” braucht. Irgendeine Nutzungsstatistik oder einen Nachweis für signifikanten Marktanteil der das Subjekt relevant genug macht um in der Wikipedia genannt zu werden.

Zuerst bezog ich mich aber auf die Wikipedia Einträge anderer OpenBSD Software wie OpenBGPD und OpenNTPD. Den Eintrag hatte ich ja sogar als Vorlage benutzt. Das hatte lustiger Weise zur Folge das auch diese Artikel einen Löschantrag aufgebrummt bekamen. Ein Gefühl von “Das hast du ja jetzt ganz toll gemacht” machte sich breit.

Ich teile die Ansicht nicht, dass Relevanz erst bewiesen werden muss. Gerade bei OpenBSD gibt es nur sehr wenig Nutzerzahlen oder Projekte wie popcon. Wohingegen man aber sonst die Grenze zieht, ohne das jedes Github Projekt seinen eigenen Artikel bekommt, bin ich mir auch nicht ganz schlüssig.

Logos und Urheberrechte

Weder das OpenBSD noch OpenSMTPD haben klare Lizenzen auf ihren Artworks wie Banner oder Logos. In der englischen Wikipedia sind all diese Logos eingebunden. Das OpenBSD Logo dort weisst sogar spezifische Informationen über die Herkunft und eingeräumten Nutzungsrechte auf.

The holder of the copyright (Theo de Raadt) mentions on the artwork website the following “license”: Most images provided here are copyright by OpenBSD, by Theo de Raadt, or by other members or developers of the OpenBSD group. However, it is our intent that anyone be able to use these images to represent OpenBSD in a positive light. So enjoy them and let the world see them, if that is your wish. Theo de Raadt is aware of the use of this svg file for the wikipedia article.

Ich lud also mit einer ähnlichen Übersetzung das Logo in die deutsche Wikipedia. Wurde auch prompt wegen ungeklärten Nutzungsrechten wieder gelöscht.

Wahrscheinlich hängt das mit deutscher Gesetzgebung zusammen. Da geht es wohl vor, die Organisation zu schützen statt schöne Artikel zu haben.

Ende

Ein bisschen in all das einzutauchen, Vorgänge und Gepflogenheiten dieses “speziellen” Ökosystems zu verstehen war interessant. Ich weiss nicht wie all das ausgehen wird. Wahrscheinlich wird es aber von diesem Ausgang abhängen, ob ich weiterhin ab und zu mal Artikel ergänze oder einfach nur ein weiterer vergraulter Wikipedianer werde dem Mühe zunichte gemacht wurde.

vim für alle Gelegenheiten

Ich benutze vim für so gut wie alles. Blogposts, Mails, Notizen, Dokumentation, Skripte und Code. Doch egal wie sehr ich diesen wunderbaren Editor auch konfiguriere, es kommen immer wieder Situationen auf, in denen das ein oder andere Setting keinen Sinn ergibt.

Spelling, Textwidth und Wrapping sind zum Beispiel solche Settings. Über einen Blogpost über Vim mit Markdown stiess ich dann auf ein Plugin, welches sich um Soft-/Hard-Wrapping kümmert.

Im README befand sich ein Beispiel, in dem für verschiedene FileTypes unterschiedliche Optionen gesetzt werden.

augroup pencil
  autocmd!
  autocmd Filetype *      call pencil#init({'wrap': 'soft', 'textwidth': 75})
                            \ | setl textwidth=0 wrapmargin=0 wrap
  autocmd Filetype mail   call pencil#init({'wrap': 'soft', 'textwidth': 75})
                            \ | setl sw=2 ts=2 noai nonu nornu
                            \ | setl tw=100
                            \ | setl fdo+=search
  autocmd FileType markdown call pencil#init({'wrap': 'soft', 'textwidth': 80})
                            \ | setl spell spelllang=de,en fdl=4 noru nonu nornu
                            \ | setl tw=100
                            \ | setl fdo+=search
  autocmd FileType text   call pencil#init({'wrap': 'soft', 'textwidth': 75})
                            \ | setl spell spelllang=de,en fdl=4 noru nonu nornu
                            \ | setl tw=75
                            \ | setl fdo+=search
augroup END

Für die meisten vim User dürfte das nichts neues sein. Gerade Textwidth und Wrapping haben bei mir auch erstmal Versteh-Bedarf gehabt. Ich kann jetzt auch die Tagbar (für Variablen und Funktionen) nur für bestimmte Filetypes öffnen. Außerdem hab ich noch ein paar weitere Plugins gefunden.

Plugin 'tpope/vim-fugitive' " Git Wrapper
Plugin 'tpope/vim-commentary' " auto commenting with keybinding gc
Plugin 'airblade/vim-gitgutter' " git diff line next to line numbers
Plugin 'junegunn/goyo.vim'  " writer fullscreen mode
Plugin 'reedes/vim-pencil'  " Soft-, Hard-Wrapping
Plugin 'ntpeters/vim-better-whitespace' " highlightning for whitespace

So sieht mein vim wenn ich ein .markdown File öffne, komplett anders aus als bei Puppet oder Python. Kontextabhängiger Editor. So. gut. Ich werde da noch weiter rumbasteln, denke ich mal sehr.

Multi User Dungeons

MUDs sind textbasierte RPGs aus der ganz frühen Zeit der Videospiele. Man verbindet sich ganz altmodisch per telnet auf Port 23 und es kann los gehen.

Ich habe das vor Jahren mal ausprobiert, aber gleich wieder verworfen. Vor ein paar Wochen musste ich aber wieder daran denken und angefangen das MorgenGrauen zu spielen.

Typischerweise befindet man sich in Räumen bzw Feldern, die mit einem 3-4 Zeilen langem Beschreibungstext die Umgebung spezifizieren. Das Reicht vom Hobbit Wald zur Drachenhöhle, über den Sumpf der Orks, bis hin zur Zwergenhochburg im Gebirge. Darin können sich allerhand Sachen befinden. NPCs, Tische, Tümpel, ein Strauch, ein abgetrennter Trollkopf oder verzauberte Kochlöffel. Danach hat man meist ein paar Möglichkeiten. Man untersucht Details im Raum, spricht mit NPCs, tötet irgendetwas oder verlässt den Raum in eine Himmelsrichtung.

Man bewegt sich also von Raum zu Raum. Am Anfang geht das noch und man fängt Stück für Stück an die Welt zu erforschen aber schnell merkt man, dass die Welt einfach zu groß ist um durch fiese Wälder zu tollen und sich alle Wege zu merken. Deshalb macht man einfach ein paar Skizzen und Notizen.

Charm hat auch Stufenpunkte System. Statt World of Warcraft like pausenlos auf dem immer gleichen Mob zu kloppen um EPs zu grinden, setzt sich das Levelsystem aus einem komplexen Mix allerhand Indikatoren zusammen. Natürlich gibt es EP, aber es gibt auch separate Punkte für Quests, gefundene Zaubertränke (die Stats erhöhen), geführte Dialoge, Besuche in Orten der Weltkarte und und und. Alles ist darauf abgezielt die Erfahrung des Spielers in allen Bereichen des Spiels im Level widerzuspiegeln.

TinTin++

Mit der Zeit ergeben sich aber natürlich Schwächen von einfachem Telnet. Kein Zurück, keine History, Text des flappt einfach zwischen dem Getippten usw. Dabei bietet so ein einfaches Textinterface do so viel potiential für Tooling!

  • Autocomplete
  • History
  • Alias
  • Loops
  • Highlights für Farben
  • Actions
  • Reverse Search a la Bash
  • Path Recording (was ich noch nicht nutze)
  • Prompts

Es gibt wirklich eine Menge Clients. Das Meiste davon ist totaler Bullshit. Einer aber hat meinen Geschmack recht gut getroffen. Ncurses Interface und sau schön skriptbar. Tintin++. Er kann so ziemlich alles was man sich wünschen kann.

Ein Auszug der Konfiguration von Tintin++

#HIGHLIGHT  {%w teilt Dir mit: %*}  {light green}  {5}
#HIGHLIGHT  {Du teilst %w mit: %*}  {light green}  {5}
#HIGHLIGHT  {Es gibt %w sichtbaren Ausgang:}  {light blue}  {5}
#HIGHLIGHT  {Es gibt %w sichtbare Ausgaenge:}  {light blue}  {5}
#HIGHLIGHT  {^[%w:%*]%*}  {green}  {5}
#SPLIT      {bottom row}
#TAB        {steinschlag}
#TAB        {unt}
#TAB        {info}
#TAB        {frage}
#TAB        {kurzinfo}
#ALIAS      {k} {kurzinfo} {5}
#ALIAS      {u} {unt} {5}
#ALIAS      {tmo} {tm ootato} {5}
#ALIAS      {ZT} {zaubertraenke} {5}
#ACTION     {Eine Stechmuecke kommt an} {toete muecke} {5}
#SESSION    MorgenGrauen mg.mud.de 23

Un noch einiges mehr. Wenn ich zum Beispiel in einer alten Scheune befinde und 50 Kisten zum Untersuchen habe, löse ich das auch öfters mal mit einer For-Loop

#loop 1 50 x {ziehe kiste $x ; oeffne kiste}

Oder ähnliches. Es macht Spass im Moment einen kleinen Zwerg durch die Gegend schicken. Ich werde da wohl noch die eine oder andere Stunde verbringen :)

Bildquelle: VT-100 von Wikipedia