Eine derart ausgewogene Mischung aus verschiedenen Malzen (auch dunklen) und aromatischem Hopfen hatte ich lange nicht. Ahh, so macht Fasten Spaß. Oder würde es, wenn ich es täte.
P.S.: gemerkt? Die Biergartensaison hat angefangen!
Lecker, Technik
Das Voynichmanuskript… Tja wie fange ich an? Wer es noch nie gesehen hat, erst einmal hier entlang! Es lohnt sich, einfach mal rein zu blättern um einen eigenen Eindruck von dem Werk zu bekommen. Mich hat gleich beim ersten Anschauen ein Grusel der Faszination befallen, denn die Vorstellung, hier ein Artefakt zu betrachten, dass die Wissenschaft bisher nicht versteht, hat etwas Besonderes. Hat etwas so Besonderes, dass einige sogar der Idee verfallen sind, es handele sich um einen Hoax. Aber Eines nach dem Anderen.
Das Voinichmanuskript enthält viele Zeichnungen von Pflanzen von – naja, wie soll ich sagen? …äh… – „mittlerer“ Qualität. Die Qualität der Zeichnungen der Pflanzen sind derart mäßig, dass man die Vorstellung der Hoaxbefürworter, es handele sich um Phantasiepflanzen, nicht so ohne Weiteres von der Hand weisen kann. Leider.
Vor einigen Tagen stieß ich auf einen gewissen Stephen Bax, der der Meinung ist, einige Glyphen des Manuskripts Lauten zugeordnet zu haben. Ganz so wie beim Rosetta Stein die Pharaonamen sollen die Pflanzennamen den entscheidenden Durchbruch bringen. Wer sich das Paper von Bax durchliest, bekommt den Eindruck, jemanden vor sich zu haben, der durchaus in der Lage ist seriöse Forschungsarbeit ab zu liefern. Der Mann ist außerdem Universitätsprofessor. Seine Argumentation ist recht abwägend und einigermaßen schlüssig. Aber, Voynichmanuskript? Da ist erstmal Vorsicht geboten, denn intuitiv hatte ich von Anfang an das Gefühl einen unwiderstehlichen Magnet für Spinner vor mir zu haben. Ich hatte ja keine Ahnung! Ich bin nämlich später erst auf diesen Artikel bei Ciphermysteries stoßen. Aua! Was mich (zu meiner Verteidigung) allerdings selber stutzig gemacht hat, ist, dass er sich auf die Pflanzenkenntnisse einer gewissen Edith Sherwood verlässt, die unter anderem auch so etwas geschrieben hat. Noch Fragen?
Dann war da noch das Paper, das Holgi in der WRINT Wissenschaft 249 anspricht. Das war aber eindeutig. Da braucht man eigentlich nur einen beliebigen Absatz zu lesen um zu merken, dass der Autor mit unbelegtem Halbwissen um sich wirft. Als Beispiel sei rausgegriffen:
"The cat illustrated on folio 72r is the ocelot [Leopardus pardalis (Linnaeus, 1758)]. The stripes across the face, the rounded ears, and the gray spotting (illustrated with the blue pigment) are all characteristic of this cat. This species ranges from Texas to Argentina.28 Oddly, “angst” is written in a darker ink and different handwriting."
Ok, jetzt mal abgesehen, dass die Katze auf folio 72v zu sehen ist, will ich mal wissen wie er auf Ocelot kommt. Das Vieh auf dem Pergament kann wirklich jede beliebige Raubkatze sein! Und „angst“? Ja, kann man da lesen, muss man aber nicht. *facepalm* Auch hier war ciphermysteries wieder sehr vernichtend
Ich könnte noch lange so weiter machen, habe aber keine Lust. Wer mehr Bullshit lesen will, dem sei voynich.nu „empfohlen“. Oder einfach Google.
Zwei Fakten sind einigermaßen sicher beim Voynichmanuskript:
1. Es stammt aus dem frühen 15. Jahrhundert (Radiokarbonmethode sei Dank!)
2. Es zieht eine unglaubliche Menge an Spinnern an. (Manche von denen ignorieren sogar Fakt Nummer 1)
Und ich bin auch noch drauf reingefallen! Siehe Freakshow 127 (ab ca 3:47:05).
Asche auf mein Haupt! Mea culpa! Ich gelobe Besserung!
Ein rundes malziges Dunkel mit nur milder Bitterkeit. Als jemand, der seit einiger Zeit der Meinung ist, dass der Hopfen momentan zu sehr im Mittelpunkt der Braukunst steht und gerne ein Revival das Malzes erleben würde, kann ich nur sagen: Geht raus und kauft den Kloster-Sud und genießt es wie die vollmundigen Malzaromen die Kehle herunterlaufen!
Vorweg
Dies ist kein Howto bis auf den letzten Befehl herunter. Deshalb werde ich ab und zu andere Sachen verlinken statt selbst in ermüdender Weise alles noch mal aufzuschreiben. Trotzdem lasst es mich in den Kommentaren wissen, falls was Wichtiges fehlt, viel zu kurz dargestellt wurde oder falsch/veraltet ist. Danke!
Warum FreeBSD – ZFS – Netatalk? Ich bin Macfan seit geraumer Zeit, alle meine nicht-Server sind seit langem Macs, Windows und Linux spielen bei mir nur eine marginale Rolle. Netatalk kann das von Apple entworfene Apple Filing Protocol (AFP) und kann sich einem Mac als Time Machine Server ausgeben. Es ist also also der Fileserver der Wahl. Mit Mavericks (OS X 10.9) hat Apple SMB 2 Support eingebaut, wir werden also in Zukunft wahrscheinlich Samba haben wollen, besonders, wenn das dann Time Machine kann, aber momentan ist da der Status noch unklar. Wenn es soweit ist werde ich mich auf jeden Fall hier und bei der Freak Show dazu äußern.
Hardware
Bei dieser Updaterunde des Homeservers wollte ich mich nicht mehr mit den maximal 4 GB RAM der Atomboards begnügen. Das liegt vor allem daran, dass ZFS richtig viel Speicher haben will, die CPU-Performance der Atom Prozessoren würde dagegen dicke reichen. Ich habe mich also nach was besserem umgeschaut. Hängen geblieben bin ich beim Sockel 1150 und dem H87 Chipsatz im Allgemeinen und beim Gigabyte H87M-D3H im Besonderen. Mit 32 GB RAM Maximalausbau und 6 onboard SATAports kann man schon was anfangen. Dazu den ab Werk heruntergetakteten Core i3 4130T von Intel in der Boxed Variante. Ich hatte noch nie einen Prozessor selber gesteckt, aber Jahrzehnte der selbermachwütigen Idioten haben ganz offensichtlich ihre Spuren hinterlassen. Ich hätte Schwierigkeiten gehabt absichtlich was falsch zu machen. Was ich aber falsch gemacht habe ist die Motherboardgröße. Es gibt einen Unterschied zwischen mini-ITX und micro-ATX. Der ist an der kritischen Stelle meines bisherigen Gehäuses etwa 2 1/2 cm groß. Also musste ein neues Gehäuse her. Ich habe das Lian Li PC-V358 Micro-ATX Cube in schwarz gewählt, denn es versprach in meinen Schubkastenschrank zu passen. Gut, wie sich herausgestellt hat, nur mit abgeschraubten Füßen und einem abgewinkelten Kaltgerätestecker, aber hey…!
FreeBSD
FreeBSD 10 ist frisch released, da habe ich genau das heruntergeladen und per dd auf einen USB-Stick gepackt. Beim Booten dann die erste positive Überraschung:
Der (seit FreeBSD 9 neue) Installer kann jetzt Root-on-ZFS installieren! Das war vorher per Hand doch sehr mühsam. Steht zwar „Experimental“ dran, hat in meinem Fall aber gut funktioniert. Ich dachte ich probier’s mal mit zwei Platten im Mirror:
Der Installer tut genau das Richtige und bietet auch keine unnützen Optionen an. Mit dem Kommando gpart show
kann man sich anschauen, wie die beteiligten Laufwerke partitioniert worden sind:
root@server:~ # gpart show
=> 34 976773101 ada3 GPT (466G)
34 6 - free - (3.0K)
40 1024 1 freebsd-boot (512K)
1064 41943040 2 freebsd-swap (20G)
41944104 934829024 3 freebsd-zfs (446G)
976773128 7 - free - (3.5K)
=> 34 976773101 ada6 GPT (466G)
34 6 - free - (3.0K)
40 1024 1 freebsd-boot (512K)
1064 41943040 2 freebsd-swap (20G)
41944104 934829024 3 freebsd-zfs (446G)
976773128 7 - free - (3.5K)
Also genau wie man es haben will. Auch die angelegten ZFS Filesysteme sehen sehr vernünftig aus:
root@server:~ # zfs list
NAME USED AVAIL REFER MOUNTPOINT
zroot 5.14G 432G 144K none
zroot/ROOT 1.81G 432G 144K none
zroot/ROOT/default 1.81G 432G 1.32G /
zroot/tmp 560K 432G 176K /tmp
zroot/usr 2.79G 432G 144K /usr
zroot/usr/home 272K 432G 184K /usr/home
zroot/usr/ports 2.79G 432G 1.96G /usr/ports
zroot/usr/src 144K 432G 144K /usr/src
zroot/var 542M 432G 518M /var
zroot/var/crash 148K 432G 148K /var/crash
zroot/var/log 728K 432G 356K /var/log
zroot/var/mail 232K 432G 144K /var/mail
zroot/var/tmp 360K 432G 152K /var/tmp
Nun sollte man bei dem Pool den Failmode auf continue umschalten, sonst bleibt er beim Booten hängen, wenn etwas faul ist: zpool set failmode=continue zroot
Ports
Damit wir überhaupt richtig loslegen können brauchen wir eine aktuelle Portscollection. Also los:
root@server:~ # portsnap fetch ; portsnap extract
Das kann jetzt dauern, aber es lohnt sich! Um die Ports später auf dem neusten Stand zu halten, benutze ich immer portupgrade
also:
root@server:~ # portsnap fetch ; portsnap update ; portupgrade -a
SSH
SSH ohne Passwort sondern mit Schlüssel. Einfach machen, und man ist vor den Skriptkiddies wieder ein Tick sicherer.
ZFS
Zu ZFS muss man ja an sich nicht viel sagen. Wer sich die Mühe macht FreeBSD zu installieren tut es in der Regel um von den Vorteilen von ZFS zu profitieren. Wer noch nicht überzeugt ist, schaue sich folgenden Output an:
root@server:~ # zpool status
pool: zroot
state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
repaired.
scan: resilvered 20.7M in 0h0m with 0 errors on Sun Dec 22 20:02:57 2013
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
diskid/DISK-1240000000000464p2 ONLINE 0 0 0
diskid/DISK-4C532000000319101264p2 FAULTED 0 94 0 too many errors
errors: No known data errors
Ich hatte testweise FreeBSD auf zwei USB-Sticks installiert und der eine ist offensichtlich direkt gestorben. Hey, der war nagelneu! Aber kein ernstes Problem wenn man von einem ZFS-Mirror bootet, woanders würde man von vorne anfangen. Übrigens hat es sich ausgezahlt, Datenträger von verschiedenen Herstellern zu beziehen. Gilt auch für Festplatten! Ich würde schwer davon abraten mehrere baugleiche Platten vom gleichen Hersteller zu beziehen, am Besten noch aus der gleichen Charge… Keine gute Idee!
Den Datenpool habe ich mit 6 Platten und Raidz2 angelegt. Beim ersten Versuch hat ZFS gemecktert, dass eine Platte 4k-Sektoren benutzt und die Performance leiden würde. Wem das auch passiert, hier entlang: Pool anlegen mit Festplatten die intern 4K-Sektoren benutzen.
Kleiner Tip: Ich habe unter FreeBSD ganz normal einen User angelegt und ihm dann auf dem Datenpool ein eigenes ZFS-Dateisystem kreiert und es mit zfs set mountpoint=/usr/home/...
an die Stelle gelegt, wo es auf dem Root-Volume angelegt wurde. So erspart man sich das Konfigurieren des Useraccounts. Und Dank ZFS muss man auch nicht in der /etc/fstab
herummurksen um etwas irgendwo hin zu mounten.
Netatalk
Ein zentraler Sinn der ganzen Übung ist, wie ja bereits erwähnt, dass ich mein Time Machine Backup auf den Server machen will und dazu braucht er Netatalk. Ich habe mich gleich auf Netatalk 3.1 gestürzt. Man installiert dazu den Netatalk 3 port in /usr/ports/net/netatalk3
cd /usr/ports/net/netatalk3
make install
Bei der Installation hat man die Wahl zwischen Avahi und dem Apple mDNSResponder als Bonjour-Provider. Ich habe Avahi gewählt, aber Vorsicht, da hängt ein ganzer Rattenschwanz an Abhängigkeiten dran und wenn man nicht aufpasst bekommt man auch noch einen X-Server installiert.
In /etc/rc.conf
muss man einen ganzen Sack Services starten sonst funktioniert das alles nicht:
dbus_enable="YES"
avahi_daemon_enable="YES"
netatalk_enable="YES"
cnid_metad_enable="YES"
afpd_enable="YES"
Als nächstes kreiert man das File /usr/local/etc/avahi/services/afpd.service
und tut in etwa den folgenden XML-Code hinein:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">Mein Server</name>
<service>
<type>_afpovertcp._tcp</type>
<port>548</port>
</service>
<service>
<type>_device-info._tcp</type>
<port>0</port>
<txt-record>model=Xserve</txt-record>
</service>
<service>
<type>_adisk._tcp</type>
<port>9</port>
<txt-record>sys=waMA=xx:xx:xx:xx:xx:xx,adVF=0x100</txt-record>
</service>
</service-group>
Avahi annonciert mit dieser Datei einen Fileserver namens Mein Server. Wichtig ist, dass man die MAC-Adress seiner Netwerkkarte dort einfügt wo im Beispiel xx:xx:xx:xx:xx:xx
steht. Im Netz findet man noch weitere Anleitungen, in denen die Volumes mit Hilfe von <txt-record> Tags konfiguriert werden, aber Netatalk 3 bekommt das auch ohne hin.
Zum Schluss brauchen wir noch eine /usr/local/etc/afp.conf
damit Netatalk weiß, was es tun soll. Ich schmeiße mal meine (leicht zensierte) afp.conf
in die Runde:
;
; Netatalk 3.x configuration file
;
[Global]
; Global server settings
hostname = server
;login message = "Welcome"
mimic model = Xserve
zeroconf = yes
uam list = uams_guest.so uams_dhx.so uams_dhx2.so
guest account = nobody
[Time Server]
path = /TimeServer
valid users = roddi
time machine = yes
[Homes]
basedir regex = /usr/home
valid users = roddi
[Server]
path = /server
valid users = roddi
Fertig
So das war es erstmal. Wenn es Anregungen, Korrekturen oder so gibt, immer her damit. Ich hoffe der Artikel ist eine Hilfe für jeden, der es mit FreeBSD mal versuchen möchte. In diesen Sinne: Viel Spaß am Gerät!
— UPDATE —
FreeNAS
Ich wurde von diversen Seite auf FreeNAS hingewiesen worden und Ihr habt recht. Wem das hier zu viel Umstand ist, der sollte ein Blick auf FreeNAS werfen. Da bekommt man FreeBSD – ZFS – Netatalk fertig verpackt mit Webconfigurationsoberfläche auf einem USB-Stick.
NAS4Free
Außerdem kam noch der Hinweis auf NAS4Free rein. Dazu kann ich aber nichts sagen.
Soso, die 5,0 Biervertriebs-GmbH verzichtet auf allerlei Marketingschnickschnack und macht auf simples Bier. Wenn nur dieser Verzicht nicht auch was von Marketingschnickschnack hätte! Noch dazu wird das Bier offensichtlich von einer nicht genannten Brauerei im Auftrag gebraut. Und dass die Brauer nicht auch am Bier gespart haben, hm, naja. Also für mich ist das Bier einen Tick zu massenkompatibel, nicht schlecht, aber auch nicht weiter bemerkenswert.
Ich dachte ich poste mal ein Video mit 120 fps. Man sieht ganz gut, was der Trick am Weißbiereingießen ist: Die Flasche nur soweit rausziehen, dass der Schaum wieder eingesaugt wird. Dann kann läuft es nicht über, weil es nicht gluckert und nur soviel Bier nachfließt wie Schaum eingesogen wird.
Wenn meine nicht vorhandenen Spanischkenntnisse halbwegs tragen, steht da was von vier Generationen Brautradition. Das schmeckt man zwar schon, aber um gegen die fränkischen Brauereien oder gegen Oregons Craftbrewer an zu kommen muss Estrella Gallicia besseren Hopfen einkaufen, viel besseren Hopfen! Trotzdem weiß ich wonach ich beim nächsten Spanienaufenthalt Ausschau halte.
Das Kellerweizen gehört zu den fruchtigeren mit schöner Beerennote. Ich bilde mir ein Brombeere und Blaubeere heraus zu schmecken und ein wenig floraler Hopfen. Eines der ganz wenigen Biere mit Hopfenextrakt, das mich überzeugt, aber beim Weißbier ist der Hopfen vielleicht auch nicht ganz so wichtig.
Zwei Bugs haben sich in den Workshop eingeschlichen, die ich nicht so stehen lassen kann:
1.-[USVDetailViewController setNewEntry:]
wird nicht benutzt. (Ende von Video 11)
Danke für’s Aufspüren an Tobias Müller a.k.a @twam bei App Dot Net
Wir haben eine Methode -[USVDetailViewController setNewEntry:]
geschrieben, die ruft [self configureView]
auf und diese Methode lädt den Link des Entrys. -[USVDetailViewController setNewEntry:]
wird aber nie benutzt. Die Methode -[USVDetailViewController viewDidLoad]
ruft ebenfalls [self configureView]
auf, insofern wird beim Laden des Views auch der Link geladen. Beides ist ziemlich unschön:
-[USVDetailViewController setNewEntry:]
brauchen wir eigentlich nicht, weil wir den Link nicht ändern, während der WebView angezeigt wird. Also löschen wir die Methode, getreu nach dem Motto „less code is better code“. [self configureView]
in -[USVDetailViewController viewDidLoad]
aufgerufen wird, ist aber auch nicht korrekt, weil der User ja zurück zur EntriesTableView gehen und ein anderes Entry auswählen könnte, ohne dass der WebView abgebaut wird. Momentan wird er abgebaut, aber verlassen kann man sich darauf nicht. Wer weiß, was Apple in iOS 7 tun wird. Der korrekte Ort für den Aufruf von [self configureView]
ist also -[USVDetailViewController viewWillAppear:]
. Das wird immer dann aufgerufen, wenn der WebView erscheint.Die Änderungen:
[self configureView]
aus viewDidLoad rausnehmen:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.webView.delegate = self; }
viewWillAppear:
hinzufügen:
- (void) viewWillAppear:(BOOL)animated { [self configureView]; }
-[USVDetailViewController setNewEntry:]
kann ganz weg.
2. Im WebView wird der falsches Detail-Link angezeigt (Ende von Video 14)
Danke für’s Aufspüren an Michael Schulz a.k.a @michas auf App Dot Net
In -[USVEntriesTableViewController prepareForSeque:sender:]
wird für das Anzeigen der Details das falsche Entry ausgewählt. Das kommt daher, dass -[UITableView indexPathForSelectedRow]
verwendet wird um die Row zu ermitteln. Wir haben aber gar keine Row ausgewählt, sondern den Detail Button getappt. Daher liefert der Aufruf von -[UITableView indexPathForSelectedRow]
nichts (nil
) zurück. Man kann bei Objectve C aber auf einem nil
-Pointer Methoden aufrufen ohne einen Crash zu bekommen. Diese Methodenaufrufe liefern dann immer nil
bzw. 0
zurück. Das heißt, dass aus dem entries.row
in der nächsten Zeile immer 0
herauskommt, und wir somit als Entry immer self.entries[0]
benutzen.
Wenn man einen Breakpoint an der Stelle setzt und es laufen lässt, sieht man recht schnell indexPath
ist 0
. Man sieht aber auch, dass sender
eine USVEntryCell
ist.
Die richtige Methode ist also -[UITableView indexPathForCell:]
, die wir mit sender
als Argument aufrufen, dann bekommen wir auch den korrekten NSIndexPath
.
Die korrigierte Methode lautet also:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"PushToDetail"]) { NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; USVEntry *entry = self.entries[indexPath.row]; ((USVDetailViewController*)segue.destinationViewController).entry = entry; } else if ([segue.identifier isEqualToString:@"PushToMedia"]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; USVEntry *entry = self.entries[indexPath.row]; ((USVMediaViewController*)segue.destinationViewController).enclosureURL = entry.enclosureURL; } }
Sorry für die Fehler. Wer weitere findet, immer her damit!