Leffe – Blonde

Da sprudeln die Aromen! Viel Malz und die typisch belgische Brettanomyceshefe (nehme ich an, wer weiß?). Dazu eine leichte Süße und schon ist man froh, dass nur 0,3l in der Flasche sind. Sonst könnte das bei den 6,6% Vol. böse enden.

P.S.: ich wünsche mir eine Rückbesinnung auf solche Biere statt (wie die Amerikaner derzeit) einfach nur brutale Mengen an Hopfen rein zu hauen.

P.P.S: ja, ich weiß, es gibt leckere IPAs, trotzdem!

IMG_3434.JPG

IMG_3435.JPG

IMG_3436.JPG

Swift – two WTFs, a Fail and a Train Wreck

So Apple has a new programming language called Swift. You probably heard the news and read the Swift book so I wont bother repeating the good parts. I fell in love with nearly all of the new features (compared to C/Objective C) only from reading the Swift book BUT…

There are some foul spots in that sweet fruit. I gave this post the title „two WTFs, a Fail and a Train Wreck“ to sum up my gripes. Let’s start with the first WTF:

First WTF – Constant Arrays

In the Swift book it says:

if you assign an array or a dictionary to a constant, that array or dictionary is immutable

Ok, so far so good. Exactly what you would expect.

„…and its size cannot be changed.“

Wh..what’s that? I’m confused! Let’s read on.

For dictionaries, immutability also means that you cannot replace the value for an existing key in the dictionary. An immutable dictionary’s contents cannot be changed once they are set.

Ok, still as expected.

Immutability has a slightly different meaning for arrays, however. You are still not allowed to perform any action that has the potential to change the size of an immutable array, but you are allowed to set a new value for an existing index in the array.

WHAAAT??? Ok, nice optimization but aren’t that weird rules? I use a constant because I want it to be constant and not to have a faster variable. The implementation details should not shine through like that!

If you really want to have fun, try to wrap your head around the chapter „Assignment and Copy Behavior for Arrays“ in the Swift book. That mad endeavour is left as an exercise to the reader. Good luck!

The Fail – Method names

One of the greatly undervalued gems in Objective C is that there is no difference between the name of a method and the named parameters. It’s the same thing, and it can be rather poetic:

[url bookmarkDataWithOptions:NSURLBookmarkCreationMinimalBookmark
includingResourceValuesForKeys:nil relativeToURL:nil error:nil];

becomes this abomination:

url.bookmarkDataWithOptions(options: NSURLBookmarkCreationMinimalBookmark, includingResourceValuesForKeys: nil, relativeToURL: nil, error: nil)

urgh! „Options“ twice. Not good! There is no reason Swift could not have retained the elegant square bracket syntax of Objective C. None. Still they force us to cut the first part of our method name in half with a round bracket. Thank you so much.

Second WTF – Closure Syntax in a Method/Function Invocation

According to the Swift book you can call a function with a closure as a parameter like this:

reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )

or like this:

reversed = sort(names, { s1, s2 in return s1 > s2 } )

or like this:

reversed = sort(names, { s1, s2 in s1 > s2 } )

or like this:

reversed = sort(names, { $0 > $1 } )

or (in this case) like this:

reversed = sort(names, >)

or like this:

reversed = sort(names) { $0 > $1 }

Any questions?

The Trainwreck – Operator overloading

Whew that’s a big one! Obviously Chris Lattner and his team have not read Scott Meyers „Effective C++“ and „More Effective C++“ back then in the mid-nineties. Meyers makes some good cases against using operator overloading in C++, which is an especially hellish place anyway. But some cases are relevant beyond C++. Let me pick one, the boolean operator problem. Let’s assume we have two functions a() and b() that return a BOOL (or Bool). When we use a if-clause like this (in C)

if (a() && b())
{ /* do stuff */}

and a() returns false, b() will not be called. You can question this design decision by Kernighan and Ritchie from over 40 years ago but this behaviour has made it into many, many languages since then and Swift is no exception. Open a playground and copy and paste as we move along for maximum fun:

func a () -> Bool {
return false
}

func b () -> Bool {
println("b() was called")
return true
}

if a() && b() {
println("YES");
}
else
{
println("NO");
}

The console contains no surprise:

NO

Now let’s do some mean operator overloading with 3 components:

// a class
class Blah {
}

// an overloaded &&-operator
@infix func && (left: Blah, right: Bool) -> Bool {
return a() && right
}

// finally a func that returns a Blah object
func c () -> Blah {
return Blah()
}

Now let’s do the same if-clause but with c() instead of a():

if c() && b() {
println("YES");
}
else
{
println("NO");
}

Guess what happens?

b() was called
NO

Ouch! This behaviour is totally expected but just as surprising at the same time. It is not easy to tell what really happens from looking at the code
if c() && b()
That’s bad. It basically means you can’t trust the evaluation rules for operators anymore. That’s a train wreck! Especially for a language that tries so hard to avoid those kinds of problems.

Probably as you read this some kid out there thinks it’s a good idea to create and use a %%%-operator in his library. He might just have pushed it to Github. Who knows? Or imagine someone thinks how cool it was to port std::stream of the C++-STL to Swift, does so and your boss likes it? Nothing wrong with the STL back then when your boss still wrote code, right? RIGHT?

But joking aside: There are so few problems you can only solve with operator overloading but so many problem to have with it. It really makes you wonder: How could this get past the reasonable people in the team of Chris?

I’m at a loss here. I have no idea.

20140606-232810-84490665.jpg

Warum Honig jetzt ganz anders schmeckt

Wir haben da so ein Ferienhaus in der Toskana. Da ist die meiste Zeit im Jahr niemand, weil die Toskana ist ja nicht um die Ecke. Im Spätsommer macht der letzte das Haus gründlich zu und dazu gehören auch die Klappläden an den Fenstern. Da hat sich letztes Jahr ein Bienenvolk zwischen einem Fenster und dem Klappladen eingenistet.

20140606-122227-44547289.jpg

20140606-122251-44571746.jpg

20140606-122314-44594860.jpg

Ein super Schauspiel, man konnte Drohnen ausmachen und Arbeiterinnen beim Schwänzeltanz beobachten. Trotzdem wurde sich drauf geeinigt, dass die Bienen einem Imker übergeben werden sollen. Besagter Imker kam und sah sich mit einer schwierigen Aufgabe betraut. Allein das Fenster zu öffnen war nicht so recht einfach.

20140606-122652-44812570.jpg

20140606-122652-44812754.jpg

Aber er bekam es auf und damit nahm das Unglück seinen Lauf. Die Wabenlamellen, die die Bienen gebaut hatten blieben teils am Fenster und teils am Laden kleben. Als der Imker dann den Fensterladen öffnete war das das Ende für die strukturelle Integrität des Stocks. Große Teile der Waben brachen ab und fielen zu Boden. In dem Chaos das dann losbrach war die Königin nicht auszumachen.

20140606-180315-64995884.jpg

Das Ende des ersten Tages sah entsprechend trostlos aus.

20140606-224017-81617866.jpg

Allerdings hatte der Imker ein paar honigführende Waben aussortiert.
.

20140606-225731-82651069.jpg

Ich hatte dann recht viel Mühe das Haus bienenfrei zu bekommen, damit die Familie wieder einziehen konnte. Am Fenster hing eine kleine Traube Bienen und unter den Bienenstocktrümmern verkroch sich der Rest.

20140606-231330-83610196.jpg
Der Staat war nicht weggeschwärmt. Am zweiten Tag waren wir ausgeflogen und als wir abends kamen, hatte der Imker einen grünen Kasten hinterlassen und die Lage schien sehr ruhig. Wir hatten die Hoffnung, die Bienen hätten sich in den Kasten begeben. Ich habe mich dann daran gemacht den Honig zu ernten/abzufüllen (Wie sagt man?)

20140606-230608-83168826.jpg

Am Morgen des dritten Tages waren die Bienen wieder am Fenster und zwischen den Trümmern hervorgekrochen. Der Imker kam nochmal und hat Gift gesprüht und das nicht zu knapp. Uns allen tat das in der Seele weh, aber es schien nicht anders zu gehen. Ich habe noch nie so viele tote Bienen gesehen, oder überhaupt so viele tote Tiere auf einen Haufen.

P.S.: Um den Artikel nicht so deprimierend abzuschließen habe ich hier noch eine faszinierende Nahaufnahme von einer Hornisse. Da gibt’s hier auch einige. Bis jetzt waren die Hornissen von allen Stechinsekten am friedlichsten.

20140606-231639-83799595.jpg

Kloster Scheyern – Kloster-Weisse hell

Sie ist ein wenig säuerlich, die bei Tucher gebraute Kloster-Weisse. Das Weizenaroma will nicht so recht durchkommen und irgendwelche Beeren schmecke ich auch nicht. Keine Banane. Das alles liegt bestimmt nicht am Hopfenextrakt auf dem ich immer herum hacke, aber die Verwendung von selbigem macht die Sache auch nicht unbedingt besser. Klosterbier-Vertriebs GmbH. naja.

20140509-222459.jpg

20140509-222508.jpg

20140509-222515.jpg

Reutberger Kloster-Biere – Kloster Märzen

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!

20140309-174041.jpg

20140309-174052.jpg

20140309-174108.jpg

Das Voynichmanuskript und die Idioten

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!

Weißenoher Klosterbrauerei – Kloster-Sud

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!

20140203-143247.jpg

20140203-143257.jpg

20140203-143307.jpg

FreeBSD – ZFS – Netatalk

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:

20131222-204355.jpg
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:

20131222-205204.jpg
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.

Blümelein


Duration: 00:02:48

This work is licensed under a Creative Commons Attribution 3.0 Germany License.

Der Song ist jetzt auch schon Jahre alt. Ursprünglich mal mit Garage Band angefangen hat er jetzt mehrere Garage Band Versionen gesehen und schließlich Logic 9 (sehr kurz) und Logic X. Logic X ist ja durchaus benutzbar, nachdem eigentlich alle Versionen davor eine Katastrophe waren.

Musikgeschmäcker können schon ein Problem sein…