mthie spaces

Warum ich das Error-Handling in Go mag

06.09.2014 15:12

Immer wieder lese oder höre ich, dass Go-Anfängern dieses ständige

if err != nil

nicht gefällt. Selbst auf dem sehr lustigen Vergleich If programming languages were weapons kam dieser Punkt auf:

Ich bin da eher der Meinung, dass man falsch an die ganze Sache ran geht, wenn man das so sieht. Fangen wir doch mal an, mit anderen Lösungsansätzen zu vergleichen.

try-catch-Blöcke

Seit es PHP5 gibt, sind try-catch-Blöcke in PHP möglich und erfreuen sich großer Beliebtheit. In Java gibt es das natürlich schon länger und selbst Python hat Exceptions.
Leider gibt es grad in der Scriptsprachen-Welt sehr viele Hohlbirnen, die der Meinung sind, es sei total knuffig, einfach um alles in der main()-Methode ein try mit entsprechend generischem Catcher zu setzen.
Einfach alles abzufangen und in den eigentlichen aufrufenden Methoden immer davon auszugehen, dass sich schon der äußere Catch drum kümmern wird, dass zumindest eine Fehlermeldung ausgegeben wird, kann man schon so machen, ist aber leider sehr kurz gedacht und führt z.B. bei Web-Applikationen dazu, dass man nicht eine spezifische Meldung sieht, was grad gegen die Wand gefahren ist, sondern ein Error 500 oder ein "An error occurred" - das führt dann gerne dazu, dass Menschen Bescheid sagen, dass die Webseite nicht funktioniert.

$ok-Variablen

Es geht natürlich noch besser. Ganz ohne spezielle Fehlerbehandlung. Man schleift einfach durch die gesamte Software ein $ok (mit oder ohne Dollarzeichen hängt jetzt einfach mal von der Sprache ab). Sobald ein Fehler auftritt, setzt man diese dann auf false und schon weiss der Rest des Programms, dass er so nicht weiterarbeiten darf. Warum genau nicht und was vielleicht noch zu tun ist (DB-Connection schließen, Schreibvorgänge finalisieren), hat dann den Rest auch nicht zu interessieren.

if err != nil

Ich muss gestehen: Als ich mit Go anfing, fand ich das ziemlich komisch. Die Methoden hatten multiple Rückgabewerte und oft war der zweite vom Typ error.
Go beschwert sich selbstverständlich auch, wenn man multiple Rückgaben hat, aber nur eine Variable zuweist.

Nehmen wir also folgende Beispielmethode:

func Foo() (string, error) {
	return "bar", errors.New("My Error")
}

Was also nicht geht:

func main() {
	bla := Foo()
}

Es muss lauten:

func main() {
	baz, err := Foo()
	if err != nil {
		// Error Handling
	}
	fmt.Print(baz)
}

Oder man entscheidet sich wirklich explizit dafür, den zurückgegebenen Error zu ignorieren:

func main() {
	baz, _ := Foo()
	fmt.Print(baz)
}

Aber genau das ist der Punkt: Man muss sich explizit dafür entscheiden, genau diesen Fehler zu ignorieren oder ihn eben weiter zu verarbeiten, zurückzugeben oder was auch immer. Das zwingt den Entwickler dazu, sich aktiv damit auseinanderzusetzen, was als nächstes passiert oder was passieren könnte.

Ich mag das.

Hunderte Webseiten gehackt - warum nur?

17.03.2014 20:44

Es wurden also diverse Typo3-Webseiten gehackt. Soso. Ich mach jetzt einfach mal keinen Typo3-Flame-Post, sondern stell einfach mal die Frage: Warum?

Scheinbar wurde die eigentliche Schwachstelle aktuell noch gar nicht gefunden und das ist eigentlich das Fatale daran. Ich predige immer wieder, dass es keine wirklich geile Idee ist, jede Anfrage durch Scripte zu schießen. Man findet dabei immer eine Lücke, die einen simplen Zugang zum Server ermöglichen.

Hier nochmal ein paar Fragen für die typischen Website-Betreiber:

  • braucht man bei jeder Anfrage an den Server ein Script, was die Seite generiert und raushaut oder kann man die Seite einfach bei jeder Änderung generieren, als statische Datei ablegen und ausliefern lassen?
  • muss das Administrations-/Redaktions-Tool immer von jedem erreichbar sein oder kann man dieses anderweitig schützen?
  • braucht man jedes Script im Document-Root oder kann man diese vielleicht in einen Bereich legen, wo eben nicht jeder dran kommt?
  • wollt ihr euren Server wirklich immer selbst betreuen oder kann man dies auch jemandem überlassen, der Ahnung davon hat, auch wenn es teurer als ein 30-Euro-Root-Server ist?

Grad im Agenturbereich ist es mir schon häufiger aufgefallen, dass es immer noch nicht normal ist, seinen Serverbetrieb aus der Hand zu geben, obwohl dort oft nur Hobby-Admins sitzen, die schon mal gehört haben, wie man einen Apache installiert. Wenn man sich dann die Updates auf dem Server anschaut, sieht es meist düster aus. Wenn es dann darum geht, den Scripten entsprechende Rechte zu geben, endet es meist im
chmod -R 777 *.

Es gibt einfach so viel mehr Dinge, die so eine dynamische Website an Pflichten mit sich bringt, als nur ein Update-Button-Drücker einmal im Monat, wenn man zufällig sieht, dass es für Wordpress ein Update gibt.

</watchever>

18.12.2013 02:13

Vor einigen Monaten hiess es bei uns: "Lass uns mal Lovefilm kündigen und watchever ausprobieren, hab da bisher nur Gutes gehört". Gesagt getan, dank der jeweils monatlichen Kündigungsfristen.

Es war auch so schön einfach, die PS3 anzuwerfen, den Film auszusuchen und loszulegen. Denkste!

In den letzten Wochen liefen bei uns alle Doctor Who Staffeln, die watchever auch komplett anbietet (Lovefilm hat von der letzten Staffel nicht alle Folgen und Maxdome hat nur die 1., 2. und 5. Staffel). Nachdem wir dann ab der dritten Folge von der PS3 auf den Rechner geschwenkt haben, weil die Konsolen-Version der Software ständig abstürzte, wenn es mal eine kleine Störung im Bild gab, ging es grob. Zwar waren immer mal wieder ein paar Sekunden verloren gegangen, aber ich hab das dann immer leichtfertig auf "ist halt ein Stream" geschoben.

Will heissen: Glücklich war ich nicht, aber wir haben uns respektiert. Das Filmangebot war auch so lala, aber wenn man nach dem dritten Film, den man gesehen hat (nicht ohne Störungen) wirklich suchen muss, um was ansatzweise Spannendes zu finden, ist für mich das Angebot einfach nicht passend.

Ich habe es allerdings heute geschafft, meine bessere Hälfte zu überzeugen, mal "Friendship!" zu gucken. Nicht jedermanns Sache, aber der Schweighöfer ist halt irgendwie cool. Leider haben wir 4/5tel des Films nur gehört und uns zusammengereimt, da die Störungen im Film so unendlich schrecklich waren. Entweder sahen wir ein schwarzes Bild oder ausschließlich Artefakte. Mit der Playstation ging es gar nicht, mit dem Rechner war es eine Katastrophe.

Nunja, was so ein Freggel ist wie ich: Man vermutet ja erstmal die Probleme im eigenen Haus. Also startete ich den Router neu, probierte es mal mit dem Microsoft-Browser (die Streaming-Anbieter haben immer noch nicht kapiert, dass Silverlight eine ganz beschissene Idee ist) und sogar einen anderen Rechner. Letzteres zeigte mir, dass es nicht an uns liegen konnte, da die Aussetzer exakt an den gleichen Stellen passierten.

Es ist mir schleierhaft, wie solche Anbieter, die von Investoren und Eigentümern reichlich Geld in den Rachen geworfen bekommen, überleben können. Leider ist Netflix in Deutschland immer noch nicht vertreten, aber bei denen ist die Technik wenigstens ausgereift(er) und man kann es sogar mit einem Chromebook ansehen, da man einen Fallback auf Flash hat.

Was habt ihr so für Erfahrungen, vielleicht auch mit anderen Anbietern?

Ghost - das kannste schon so machen

15.10.2013 20:43

Hey, ein neues Blogsystem hat das Beta-Licht der Welt erblickt. Beta. Wirklich Beta. Anders kann man Ghost bisher auch nicht nennen.

Ich hab es mir mal etwas angeschaut, nicht ganz tief reingeschaut, aber grob einen Überblick verschafft.

Fangen wir doch mal damit an, dass es in JavaScript geschrieben ist, um auf Node.js zu laufen. Nun muss man dazusagen, dass Node nicht unbedingt meine erste Wahl wäre, um ein Blog zu betreiben, ist es für die meisten Leute, die heutzutage ein Blog haben, wohl eher unbenutzbar. Und wenn man versucht, es auf einer sinnvollen Cloudplattform wie Heroku zum Laufen zu bringen, wird einem direkt gesagt: "Tu's nicht!". Das widerum hat mich natürlich nicht davon abgehalten, es trotzdem zu tun.

Warum keine sinnvoll skalierende Cloud-Plattform unterstützt wird? Weil man lokal Dateien speichern möchte. Eines der größten Fehler, wie ich finde. Warum will eine Blogsoftware, die in diesem Jahrzehnt angefangen wurde zu schreiben, auf die eigene Festplatte schreiben? Warum baut man es nicht gleich so, dass man z.B. in ein S3-Bucket hochlädt? Das wäre nun wirklich kein Beinbruch.

Dann geht's weiter. In der Standard-Konfiguration will Ghost in eine sqlite-Datenbank persistieren. Nun hört man natürlich ganz oft, dass sqlite eine fantastisch skalierende Datenbank ist. Nicht. Aber man kann natürlich auch mysql verwenden. Nur muss man sich diese Konfiguration erstmal schön zurechtsammeln und -frickeln.

Die Mail-Konfiguration, die notwendig ist, um einen User anzulegen (komische Aussage auf deren Website) ist auch irgendwie merkwürdig und in der Default-Konfiguration auf mailgun eingestellt. Das liess sich zum Glück im Zusammenhang mit Heroku am einfachsten konfigurieren.

Als es dann lief, stolperte ich darüber, dass man irgendwie einen User anlegen müsse. Schade nur, dass man danach diesen Sign-Up gar nicht mehr deaktivieren kann. Wäre ja aus Sicherheitsgründen vielleicht gar keine so ungeile Idee.

Über das Frontend sag ich mal erstmal nix, dazu haben die anderen Hippster in diesem Internet schon genug geschrieben.

Was ich aber noch loswerden möchte ist, dass ZIP-File mit dem Source-Code ein schönes Blender-Paket ist. Installiert man alle notwendigen Node.js-Pakete, sind alleine diese schon 25 MB groß. Ich will ja nix sagen, aber wenn man Wordpress schon eine Konkurrenz machen will, sollte man deren 15 MB unkomprimiert schon unterbieten können.

Was ich aber schon einen guten Anfang finde, ist im Übrigen, dass man komplett auf HTML 5 gesetzt hat und dass alles über Templates generiert wird und nicht über PHP-Files mit reingewurschteltem HTML.

Show in News Feed - meine Facebook-Aufräumaktion

14.10.2013 20:16

Lange hab ich überlegt, wie ich mal meinen Facebook-Stream etwas aufräumen kann, ohne dafür alle Leute entfreunden zu müssen und hab verschiedene Sachen ausprobiert.

Das Resultat: Das "Show in News Feed" Häkchen. Nimmt man das Häkchen weg, ist der News-Feed um Beiträge dieses Freundes erleichtert. Da ich aber ab und zu an einem Sonntag-Nachmittag mal Langeweile habe, möchte ich vielleicht einfach mal in der Post-Suppe nachlesen und alle Freunde, denen ich das Häkchen entfernt habe, in eine spezielle Liste gepackt. Somit kann ich dann auch mal Zeug auf mich einprasseln lassen, wenn ich das möchte. Ansonsten ist alles in angenehmer "Lautstärke".

Schade im Übrigen, dass es für dieses Häkchen keine API-Methode gibt. Es war eine ziemliche Drecksarbeit, das alles manuell zu machen.

1