Chrome mit about:flags verbessern
Per about:flags, eingegeben in die URL-Leiste, können bei Chrome experimentelle Optionen aktiviert werden, die nicht in den Einstellungen zu finden sind. Inzwischen sind das einige, ich hatte vor längerer Zeit da schonmal reingeguckt und war ob der Masse an Optionen diesmal ziemlich überrascht.
Interessant sind die ganzen Gpu-Beschleunigungen:
- GPU compositing on all pages
- GPU Accelerated Drawing
- GPU Accelerated Canvas 2D
Wir haben ein Browsergame angefangen, das grafisch für ein Browsergame relativ aufwändig ist und von diesen Optionen gefühlt ordentlich profitiert.
Ansonsten wären da noch:
- Preload Instant Search
- Smooth Scrolling
- Prerender from omnibox
Smooth Scrolling ist die einzige Option, die ich direkt spürte - das sanfte Scrollen wirkt schon ganz gut. Die anderen beiden würden auf jeden Fall nicht schaden, wenn sie funktionieren.
Serverwechsel
Nachdem Dirk entschieden hat, keine fremden Webseiten mehr zu hosten, wurde dieser Blog auf Roberts Server umgezogen.
Danke an euch beide!
Falls etwas noch nicht funktionieren sollte, bitte melden.
Mass Effect 3: Die DLC-Lüge
Inzwischen bin ich stinksauer über das Ende des Spiels. Dieses Review erfasst das Spiel gut, aber dieser Kommentar trifft es am besten (Spoilerwarnung!):
Ich will eine logische Erklärung und einfach sehen, was meine Entscheidung bewirkt und nicht nur, ob der Big Ben später eine neue Uhr braucht oder nicht und die Reaper umfallen oder verschwinden. Ich will die effektiven Konsequenzen sehen. Ich will sehen, wie die Geth, die ich damit auslösche, tot umfallen. Ich will sehen, wie EDI im Sitz neben Joker im Cockpit plötzlich tot in sich zusammensackt und er stinksauer auf mich sein wird, weil ich sie somit auch töte. Ich will sehen, daß Liara Tränen in den Augen hat und traurig auf diese kleine Box mit Mini-Holo-Shepard in ihren Händen schaut, weil sie weiß, daß sie ihre Liebe Shepard nie wieder sehen wird - denn entweder tot, oder für immer getrennt. Ich will sehen, wie Turianer, Quarianer, Asari, Salarianer, Kroganer und wie sie alle heißen, auf ihren Planeten gen Himmel schauen und das Schauspiel der Auswirkung beobachten - wird es sie töten oder nicht? Ich will Hackett und Co. auf ihren Schiffen erschöpft aber glücklich sehen, weil wir die Reaper besiegt haben. Ich will meine einzelnen Crew-Mitglieder sehen, damit ich weiß, was mit ihnen ist. Was wurde aus meinen Freunden und Kampfgefährten? Überlebt da überhaupt jemand.
Ich weiß im Grunde gar nichts. Ich weiß nur, daß am Ende die Normandy irgendwo in der Pampa irgendeines Planeten strandet und (ich hoffe das wird bei der abtrünnigen Entscheidung auch so sein) neben Joker Liara und Garrus aus dem Wrack steigen.
Dazu kommt jetzt noch der Ärger über den DLC, der am Releasetag mit herauskam. Ich hatte das vorher versucht zu ignorieren, weil ich erstmal das Spiel sehen wollte. Aber die Geschichte passt zu gut zu dem erbärmlichen Ende, um sich jetzt nicht doch noch drüber zu ärgern. Sehr viel.
Die Lüge
Darum gehts: Am Tag des Releases erschien dieser DLC, From Ashes. Eine eigene Kurzmission mit einem weiteren Crewmitglied. Das ist schon deshalb eine Frechheit, weil es im dritten Teil viel weniger Begleiter gibt als im zweiten, dieser DLC also eine extra dafür geschaffene Lücke füllt. Desweiteren sind Teile des DLCs auf dem Originalspiel enthalten. Das heißt, es wurde frühzeitig geplant. Aber die eigentliche abgrundtiefe Frechheit ist die Erklärung dafür:
During that certification time, we had a small team of developers begin to craft the ‘From Ashes’ content, with the intent to finish production on it long after ME3 was out of our hands as a dev team.
However, because the plot of ME3 is so richly interwoven with the character interactions and moments, you simply cannot use a DLC module to ‘insert’ a new character. As we’ve mentioned before, that character has to be planned and the framework has to be established ahead of time for us to build off of with the DLC module. You may have seen a similar framework developed in ME2 for the Zaeed and Kasumi characters. We wanted Javik to be a fully featured squad member, with deep dialogue throughout the game – and we needed him to be accessible via the character selection GUI (which you cannot simply ‘overwrite’ with DLC). Thus, certain elements of the Javik appearance and some of the VO needed to be included on the disc. That is a fact. But that doesn’t mean the content was created, and then removed. It is a necessity of adding a rich character presence in our game.
Hervorhebung von mir. Und jetzt nochmal lesen. Michael Gamble behauptet da allen Ernstes, dass das Charaktermodell schon auf der Disk ist, nicht etwas weil der DLC schon lange fertig war und einfach aus dem Spiel herausgenommen wurde, sondern weil sie unfähig seien, die Charakterauswahl so zu programmieren, dass sie nachträglich Charaktere hinzufügen können!
Gelöschte Beleidigungen hier gedanklich wieder einsetzen.
Es ist eine Lüge. Selbst wenn das System es wirklich derzeit nicht könnte, könnte man selbstverständlich nachträglich so etwas hinzufügen. Wenn Bioware wirklich unfähig ist, so etwas simples wie eine UI dynamisch zu machen, wie haben sie dann das ganze Spiel programmiert? Wenn sie wirklich keinen einzigen Programmierer haben, der das kann, oben im Blog ist meine Kontaktadresse, sie können mich ja anheuern. Und ich kann aus dem Stegreif 5 Programmierer nennen, die das umsetzen könnten.
(Etwas anderes sieht es bei dem Rest aus, bestehende Gespräche zu modifizieren ist natürlich nicht mehr so einfach, aber genauso natürlich auch nicht unmöglich.)
Technische Notwendigkeit/Unmöglichkeit vorzuschieben ist so ein beliebter Trick. Ich bin Informatiker, ich kenne das und habe es zu oft erlebt. Ich könnte jedes Mal kotzen, wenn diese Verteidigungskarte so offensichtlich als Lüge dient. Sie bauen darauf, dass der Großteil der Menschen, denen dieses Geschäftsgebaren moralisch verwerflich vorkommt, keine Ahnung haben und dann mit den Schultern zucken und sagen: "Ok, wenn es eben notwendig ist das so vorzubereiten...".
Es ist es nicht. Der gefundene Code beweist schlicht und einfach, dass das Release-Tag-DLC von vorneherein geplant war. Damit verstößt es gegen den Kaufvertrag - vielleicht nicht im juristischen Sinne, aber im eigentlichen ist die Abmachung dargestalt, dass man das kauft, was vorher entwickelt wurde.
Über die Verwerflichkeit von DLCs
Warum ist das nun so schlimm? Spiele sind ein besonderes Medium. Sie erzählen mehr als eine einfache Geschichte. Sie involvieren den Spieler in ihre Geschichte, lassen ihn in Grenzen in einer virtuellen Welt agieren. Die emotionale Wirkung von Spielen ist dadurch unvergleichlich hoch, nicht umsonst vermutet man bei Spielen ein gar nicht so geringes Suchtpotential.
Spieleentwickler haben dadurch eine gewisse Macht über den Spieler. Sie erschaffen diese Fantasiewelten, und damit erschaffen sie einen Teil der Erlebniswelt von vielen Menschen, an die sie sich lange erinnern. Zwischen Spielern und Entwicklern muss deswegen ein Vertrauensverhältnis bestehen, denn: Sie sind aufeinander angewiesen. Entwickler investieren Millionen in Spiele, dann kaufen Millionen von Spieler diese, in der Erwartung auf diese Welt und die erlebbare Geschichte.
DLCs zerstören dieses Vertrauen. DLCs sind Bestandteile des Spiels und der Geschichte - nur selten einfach optionale Zusätze - die man gegen Geld erwerben kann, nachdem der Spieler schon für die eigentliche Geschichte Geld bezahlt hat. Ein Harry Potter, das vorgibt den letzten Kampf gegen Voldemort zu erzählen, dann aber die Geschichte der Zerstörung eines der Seelengefäße einfach auslässt und nächträglich in einem Taschenbuch erzählt, die großartigen Geschehnisse dieser Geschichte aber zehnmal im Endkampf andeutet.
Oder anders: Bei DLCs geben Spielern Entwicklern erst Geld für das eigentliche Spiel, werden dadurch involviert in die Geschichte, woraufhin der Entwickler sagt "Das war jetzt aber doch nicht die ganze Geschichte, zahl noch einmal". Und das wieder und wieder.
Manchmal ist die Masche auch: "Du willst wirklich mit strahlender Rüstung und Schwert die Welt retten statt mit einem Holzbesen? Zahl noch einmal."
Das war schon immer verwerflich. Es wird es aber noch verwerflicher in einem Spiel, das entgegen den Versprechungen doch kein Ende der Geschichte mit all ihren Facetten liefert. Es wird noch verwerflicher, wenn der DLC ganz offensichtlich kein nachträglich erstellter Zusatz ist, sondern bei Release des Spieles schon fertig war. Es wird noch verwerflicher, wenn in dem gleichen Spiel riesige Handlungslücken zum Vorgänger sind, weil die Zwischengeschichte in DLC-Häppchen erzählt wurde. Es wird noch verwerflicher, wenn in dem ganzen Spiel - nicht nur im Ende - so viele offensichtliche Lücken klappen, die garantiert durch DLCs gefüllt werden sollen.
BioWare ist nun auf meiner schwarzen Liste. Da kommen sie wieder runter, wenn sie mindestens ein kostenloses Update für das ME3 veröffentlichen und dabei das Outro so anpassen, dass es wirklich ein vollständiges Ende der Geschichte liefert.
Mass Effect 3
Spoilerwarnung
Ich mag die ganze Reihe. Mir gefällt das Science-Fiction-Universum, ich mag die neuen Ideen darin. Das eigentliche Spiel ist dann nicht viel mehr als ein Shooter mit Rollenspielelementen, aber das hat Deus Ex auch nicht schlechter gemacht. Durch meine Entscheidungen die Spielwelt so sehr zu beeinflussen, oder das zumindest vorgegaukelt zu bekommen, ist großartig.
Entsprechend gespannt war ich auf den dritten und angeblich letzten Teil. Ein paar Gedanken dazu.
Entscheidungen
Die Quicktime-Events sind sehr selten geworden, und sie sind kaputt. Als Paragon-Spieler habe ich nur ganz selten die rechte Maustaste drücken dürfen und so die Handlung beeinflusst. Zugegeben, an ein paar wichtigen Stellen. Aber gerade am Ende, ab dem Kampf gegen den Attentäter, wurde mir nur noch Renegade angeboten. Als dieser hinter mir stand und sein Schwert schon über Shepards Kopf schwebte, und dann das Renegade-Symbol auftauchte, dann drückte man halt das. Die Handlung ließ nicht den Schluß zu, dass danach noch ein Paragon-Symbol hätte kommen können.
Nach der dadurch ausgelösten drastischen Aktion habe ich dann am Ende gewartet, als das Renegade-Symbol wieder kam, und so wurde Anderson getötet. Es kam kein Paragon-Symbol um ihn zu retten. Das war durchaus traurig und ich war etwas entsetzt.
Wenn ich so meine Erinnerungen durchgehe scheint das ein generelles Problem zu sein. Mass Effect hat immer erst Renegade, dann Paragon angeboten. Manchmal auch nur Paragon, manchmal nur Renegade. Dadurch weiß man als Spieler nie, welche Möglichkeiten man hat. Es wäre weniger enttäuschend gewesen, wenn beide Symbole zugleich angezeigt würden - zumindest immer dann, wenn das Spiel überhaupt beide vorsieht, vielleicht das eine ausgegraut, wenn die Punkte dafür fehlen.
Das gleiche Problem in den Dialogen: Zustimmung ist immer oben. Paragon auch. Manchmal, in den Missionsbesprechung, ist Zustimmung unten. Dann kommen Szenen wie der Beschuss des Geth-Schiffs durch den verrückten Quarianer-General, bei dem ein Paragon-Shepard das geduldig hätte ertragen sollen statt ihm über eine blaue Option zurechtzuweisen - oder war das nur Zustimmung und gar nicht Paragon? Ihn niederzuschlagen war es sicher nicht, aber nur das fühlte sich richtig an. Trotzdem, die erste Stelle, an der ich merkte, dass das Entscheidungssystem Paragon benachteiligt und nicht richtig funktioniert.
Das Ende
Das Ende fühlt sich falsch an. Fans beschweren sich, und das ist kein Wunder. Ab dem Moment, als man vor dem Portal zu Boden ging, wirkt alles folgende wie eine Traumsequenz. Man bekommt nicht erklärt, warum man den Reaperstrahl als einziger überlebt hat. Man bekommt nicht erklärt, warum da auf einmal der Junge ist. Die Präsentation der drei Entscheidungen ist schlecht gemacht, uneindeutig, ich wusste nicht mehr genau was welche macht - und das liest man öfter.
Durch die Erklärung schien die Paragon-Option ziemlich mies zu sein, durch das Outro dann doch nicht so schlecht. Zumindest für das Universum.
Ich bin überzeugt davon, dass die Schreiber versucht haben, diese Interpretation - es ist nur ein Traum - zumindest anzudeuten. Bei all dem Grauen vielleicht auch für sie ein Trost. Denn eine richtig positive "Shepard rettet seine Begleiter und das Universum"-Option war ihnen wohl zu platt.
Die Ankündigung eines nächsten Teils nach dem Trailer durch den Geschichtenerzähler konnte ich dann nicht mehr richtig einordnen. Ich musste gleichzeitig lächeln und es erschien mir unnötig.
Edit: Das oben ist aber nicht das große Problem. Das Hauptproblem des Endes ist die fehlende Verbindung zum Entscheidungssystem. Alle vorherigen Handlungen haben - völlig entgegen den Versprechungen - schlicht keine Auswirkungen, einzig die Kampfstärke der Flotte beeinflusst Aspekte wie die Zerstörung der Erde. Verdammt enttäuschend und im Grunde eine Beleidigung.
Apokalypse
Thema Trost und Grauen: Der dritte Teil ist unfassbar düster. Das hat mich ein bisschen überrascht. Klar, auch vorher ging es schon um die anstehende Vernichtung des Universums. Und ja, auch jetzt noch hat das Universum etwas von dem strahlenden Rot und dem Bonbon-Blau. Aber das Flüchtlinglager? Die KZ-artigen Leichenberge am Ende? Der Tod von alten Gefährten und die Milliarden an getöteten Menschen und Aliens - das ist schon nicht ohne. USK 16 geht hier mal in Ordnung. Dass die Apokalypse begonnen hat spürt man nur zu deutlich.
Ich trauerte um Thane.
Krieg und Militär
Was über den Tod zur Einstellung des Spiels zu Militär und Krieg führt. Und hier bin ich unsicher, was das Spiel sagt, was vielleicht daran liegt, dass es gespalten ist. Es sterben unfassbar viele Soldaten in den gezeigten Kriegsszenen. Es wird das Leiden der Flüchtlinge gezeigt, und die Trauer der Begleiter über die Zerstörung ihrer Heimatwelt und den Tod ihrer Familien.
Aber gleichzeitig ist man Soldat, redet entweder salbungsvoll über den heroischen gemeinsamen Kampf oder hartherzig über die notwendige Stärke um zu Überleben. Beides passt im Kampf gegen allesvernichtende Superaliens vielleicht noch.
Aber dazu noch: Admiral Hackett bleibt das Spiel über die heroische Überinstanz, dessen Plan man ausführt und so vielleicht die Welt rettet. Die seltsamen Soldaten-Verbrüderungsszenen mit James und Anderson. Das hab ich nicht mehr als passend empfunden, als zu platt.
Gleichzeitige Verdammung des Krieges und Glorifizierung des Militärs, das könnte es sein.
Abzocke DLC
Am Tag des Releases ein DLC rauszubringen ist eine Frechheit. Ich bin ein Fan der Serie, ich habe kein einziges Spiel gekauft. Über das erste bin ich damals nur zufällig gestolpert, ganz legal geliehen bekommen, das zweite hatte dann schon das DLC-Problem - Itemverwaltung abgeschafft und dafür Zusatzitems in DLCs verpackt. Jetzt beim dritten das First-Day-DLC - es ist erbärmlich. Ich würde mir das Spiel gerne kaufen, alle drei, aber nur, wenn ich dann auch die ganze Geschichte bekomme. Die Lücken in der Handlung durch die mir fehlenden DLCs zum zweiten Teil waren schon ziemlich unangenehm und wurden einem im Dreier platt unter die Nase gerieben.
Führt zu einem seltsamen Ergebnis: Gleichzeitig bewundere ich das Spiel, und ich verabscheue die Verkaufspolitik dahinter.
Innovation bei den Waffen
Die Waffen haben mich irritiert. Ein Sturmgewehr ist ein Sturmgewehr, eine SMG eine SMG. Aber eine Pistole ist entweder eine SMG-artige Schnellfeuerwaffe oder eine langsame Magnum oder ein haftender Granatwerfer oder ein aufladbarer Laserstrahl. Toll, nur etwas unausgewogen stark, dadurch macht das Spiel mit Pistolen fast immer - wenn man nicht gerade die Durchschlagskraft eines Geth-Gewehrs braucht - mehr Spaß. Schade für Soldatenklassen.
Fazit
Das Spiel konnte an den Erwartungen an das Ende der Geschichte nur scheitern. Es macht trotzdem auch bei der Geschichte vieles richtig, die gezeigten Flottenkämpfe zum Beispiel. Auch die Atmosphäre ist passend düster. Spielerisch ist es eben ein Shooter mit Rollenspielelementen, nicht mehr, aber ein gut gemachter. Im Grunde sind die Kämpfe fordernd, mit ein paar Waffenupgrades dann fast immer problemlos, die Banshees dagegen sind bis zum Ende äußerst fordernd. Der dritte Teil der Reihe ist ein großartiges Spiel, der die Stärke dieses Mediums zeigt, aber mit schwer zu verstehenden FehlernMacken.
Usability-Woche, Teil 4: Mass-Effekt 2 Speicherstand in ME3 importieren
Der Import an sich funktioniert, abgesehen von dem Gesichter-Bug, komfortabel über das Menü. Aber die Voraussetzung dafür ist, dass ME2 noch auf dem PC installiert ist. Bei mir sind 3 PCs, 4 Wohnungen und 2 Windows-Installationen seit dem Durchspielen des Vorgängers vergangen und alle Dateien des Speicherstands sind bei Google hochgeladen, haben nur deshalb überlebt.
Es gibt aber keinen Ordner-Auswählen-Dialog, auch nicht im Konfigurationstool. Es ist unmöglich, vom Spiel selbst aus anzugeben, wo die Speicherstände aufbewahrt sind.
Was man machen muss: Den Dateibaum nachbauen. Man muss manuell diesen Ordner erstellen:
"C:\Dokumente\ und\ Einstellungen\BENUTZER\Documents\BioWare\Mass Effect 2\Save\Shephard_12_Soldier_230212"
und dort die Speicherdateien hineinkopieren. Ich weiß nicht, ob man den Namen den Speicherständen entsprechend anpassen muss. Erst danach taucht der alte Speicherstand zum Import im Menü auf.
Die Importfunktion ist der wichtigste Bestandteil des Spiels. Für Kenner der Serie geht es vor allem darum, das Ende der Geschichte und die Auswirkungen des eigenen Handelns zu sehen. Es muss Unmengen an Arbeit in die Berücksichtigung aller möglichen Entscheidungen geflossen sein.
Völlig unverständlich, warum nach all der Arbeit vergessen wurde, dass man den zu importierenden Speicherstand dem Spiel geben muss.
Usability-Woche, Teil 3: Chromium und das Plus
Diese Einschätzung ist etwas weniger eindeutig als die davor. Chromium ist etwas schwierig zu bewerten. Mit seinem Versuch, möglichst viel Ballast vom Browserinterface zu entfernen, hat er alle Browser erheblich beeinflusst - und sicher sehr positiv. Demgegenüber stehen unselige Entscheidungen wie seine eigenen Fensterkontrollen, wodurch Chrome zwar gut aussieht, aber die Konsistenz auf dem Desktop zerstört. Ich glaube, dass diese hier auch ein Fehler ist:
Das Plus im Icon für "Neues Tab öffnen" wurde entfernt. So sah das vorher aus:
Ich glaube nicht, dass das furchtbar schlimm ist. Wahrscheinlich kann man das austesten und die meisten Nutzer, die Tabs verstanden haben, kommen trotzdem zurecht. Trotzdem sprechen Gründe dagegen:
- Durch das fehlende Plus ist nicht auf einen Blick klar, was der Button macht
- Da der Wandel plötzlich geschah, dachten einige Nutzer, dass etwas kaputt wäre. Es wurde sogar Bugreports eröffnet.
Wichtiger als die Gründe dagegen sind die Gründe für die Änderung: Es gibt keine. Zumindest habe ich keine gefunden und kann mir keine vorstellen. Google+ differenzieren zu wollen ist kein Argument, das zählt.
Usability-Woche, Teil 2: Suche im Explorer
Dieses Fundstück ist von Robert.
Die Suche von Windows 7 ist manchmal etwas seltsam, funktioniert aber im Grund recht solide. Hier geht es um die Anzeige des Dateinamens:
Normalerweise zeigt eine Suche den Teil des Dokuments, der das gefundene Wort umgibt. Bei Dateinamen vorne anzufangen ist eine verständliche Entscheidung. Es wird aber eine unglückliche, wenn die angezeigten Namensbestandteile generisch sind, z.B. wie hier nur den Sänger und das Album anzeigen, statt den gesuchten Liedtitel.
Da rechts noch ganz viel Platz ist, könnte dieser genutzt und der Name einfach voll angezeigt werden.
Usability-Woche, Teil 1: BSCW
Ein Design richtig zu testen ist nicht einfach. Aber offensichtliche Fehler zu finden ist es. Deshalb starte ich hiermit eine kleine Serie von gesammelten Usability-Problemen.
BSCW
BSCW ist eine Kollaborationsplattform. Das heißt es ist ein Server, auf den Dozenten Folien hochladen und Studenten sich anmelden können, um diese Folien sehen zu dürfen.
Ich bin bei sowas öfter ein bisschen widerspenstig. Meiner Meinung nach braucht es für sowas kein spezialisiertes Tool, sondern eine stinknormale Webseite mit hochgeladenen Folien. Und evtl. ein Forum zum diskutieren. Dementsprechend habe ich den Server einmal benutzt und daraufhin meine Zugangsdaten vergessen. Ist natürlich kein echtes Problem, man kann ja das Passwort zurücksetzen. In der Registrierungsmail steht:
1. Für den Fall, dass Sie Ihr Passwort vergessen haben, registrieren Sie
sich einfach erneut mit der URL:<https://bscw.wineme.fb5.uni-siegen.de/pub/bscw.cgi?op=rmail>
Bitte geben Sie Ihre E-Mail-Adresse name@student.uni-siegen.de in dem dann
angezeigten Formular an.
Gesagt, getan:
Dumme Spammer
Dirk hat wieder über seine Spamplugineinstellungen geschrieben, und seine Einstellungen sind sinnvoll. Zumindest denke ich das, denn sie sind nahezu identisch zu meinen. Ich empfehle, sie zu übernehmen.
Was mir dazu noch eingefallen ist: Ratet mal, welcher Artikel hier im Blog die meisten Spamkommentare bekommt, die aber eigentlich immer im Papierkorb oder in der Moderation landen? Richtig, die Vorstellung der ersten Version des Spamblock-Bayes-Plugins.
Antworten und Einbindung
None of the newbies who failed to receive a reply within 24 hours of posting their first question were still posting to the mailing lists beyond the study period.
Das ist ziemlich eindeutig. Ich lese gerade eine Studie zum Verhalten von Anfängern auf Mailinglisten. Mich hat das an all die Ratschläge erinnert, dass man auf Blogs Kommentatoren persönlich antworten soll - was für mich immer selbstverständlich war, immerhin geht es auch um das Gespräch. Ich finde es aber auch für die FOSS-Projekte interessant, die eigentlich untersucht wurden. Will man weitere Entwickler ist es also ziemlich wichtig, dass man direkt und möglichst schnell auf Anfragen antwortet.
Wahrscheinlich ist es an sich ziemlich selbstverständlich, wer ignoriert wird fühlt sich nicht gebraucht.
Monad, Currying: Mir unklare Informatikbegriffe
Vll tritt da eine Schwäche von mir bei den formalen Grundlagen zutage, aber sowohl Currying als auch Monads sind so Begriffe, die ich (z.B. bei Hackernews) öfter mal lese, die mir aber schlicht nichts sagen. Kann mich nicht erinnern, darüber je was gelernt zu haben. Dabei hatte ich ja funktionale Programmierung, mochte sie schlußendlich sogar, und da wird wohl beides genutzt.
Nach meiner Faustregel hat es niemand verstanden, den ich bis jetzt gelesen habe, denn ich finde keine einfache Erklärung. Vielleicht kann hier jemand helfen? Ich beschreibe mal, was ich bisher habe.
Currying
Abgeleitet aus der comp.lang.functional-FAQ: Das scheint total unspannend zu sein. Hat man nur einen Parameter zur Verfügung, dann kann man um
f(x,y)
auszudrücken, x durch eine Funktion ersetzen, also:
(f'(x))(y) = f (x,y)
Das solls sein?
Gut, mir ist klar, dass man das gebrauchen kann, wenn man in einer seltsamen Sprache zwar lambda zur Verfügung hat, aber nur einparametrige Funktionen. Das wäre dann ein theoretisches Konstrukt ohne Praxisrelevanz, das höchstens dann gut ist, wenn eine solche Sprache zu leichteren Beweisen führt und man sie nutzt, weil man bewiesen richtigen Programmcode braucht.
Monads
Hier geht mein im Studium gestählter Bullshit-Sensor an. Und zwar, weil hier die FAQ jede Antwort darüber verweigert, was es ist, und nur darüber schreibt, wofür es gut ist:
What is a "monad", and what are they used for?
The concept of a monad comes from category theory; full details can be found in any standard textbook on the subject. Much of the interest ...
Was mich wieder zu meiner Frage führt, ob es wirklich Dinge gibt, die so kompliziert und trotzdem wichtig sind, dass man sie nicht mehr mit einfachen Worten ausdrücken kann (siehe die Sprachbarriere bei FGdI).
Wie auch immer, aus diesem Paper und Wikipedia wird die Essenz des Begriffs nicht wirklich klar. Laut dem Paper: Ein Monad ist ein Ding M, das Seiteneffekte darstellt, und das man deswegen vor den normalen Typ stellt? Das Divisionsbeispiel aus der Wikipedia ist für mich an sich einleuchtend (abgesehen von der grauenhaften Syntax):
(//) :: Maybe a -> Maybe a -> Maybe a _ // Nothing = Nothing Nothing // _ = Nothing _ // Just 0 = Nothing Just x // Just y = Just (x / y)
Statt eine Division / zu definieren, die Zahlen zurückgibt (und dann Sonderfälle wie die Division durch 0 fangen zu dürfen), definiere ich eine Division //, die entweder Zahlen oder einen Ausweichtyp ausgibt. Ähnlich wie Listen, die entweder Elemente oder ein Schlußsymbol beinhalten. Und wieder: Ist das alles?
Ich muss es bezweifeln, sonst könnte man es einfach erklären.
Gradient-Background per CSS
Inzwischen ist das ja altbekannt, wie man mit CSS Farbverläufe als Hintergrundfarbe setzen kann. Mehr als Notiz für mich:
background-color: #4a7aca; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4a7aca', endColorstr='#80a4e0'); background: -webkit-gradient(linear, left top, left bottom, from(#4a7aca), to(#80a4e0)) no-repeat; background: -moz-linear-gradient(top, #4a7aca, #80a4e0) no-repeat; background: -o-linear-gradient(top, #4a7aca, #80a4e0) no-repeat; background: -ms-linear-gradient(top, #4a7aca, #80a4e0) no-repeat; background: linear-gradient(top, #4a7aca, #80a4e0) no-repeat;
Edit: Noch ein paar mehr Notizen. Hat man wenig Inhalt auf der Seite und setzt den Gradient auf das html-Element, ist untendrunter alles weiß. Zwei Lösungsmöglichkeiten:
html { ... min-height: 100% }
Dadurch wird sauber der Gradient nach unten gezogen.
Problematisch aber: Dann den body ebenfalls mit min-height nach unten zu ziehen ist scheinbar nicht möglich. Deswegen die Alternative:
html { ... height: 100% background-attachment: fixed; } body { min-height: 80%; }
Das passt dann von der Positionierung, aber der Gradient sieht immer gleich aus (bei der Scrollseite, an der ich gerade sitze, soll der Farbverlauf mit den Fortschritt vermitteln und daher bleibt es bei der ersten Lösung).
Was das Smartifizieren bringt
Es wird öfter geschrieben, dass Serendipity sauberen Code hätte und ein gutes Stück Software sei. Letztes bestreite ich keinesfalls. Aber über den sauberen Code kann man streiten: es ist halt ursprünglich ein PHP4-Programm, und das sieht man.
Im Backend sieht es besonders übel aus. Gerne wurde da mit ?> gearbeitet und daraufhin der HTML-Code direkt ausgegeben - und dabei die Einrückung aufgegeben. Dadurch wird der Code richtig schwer lesbar. Ein gutes Beispiel ist dieser Abschnitt der plugins.inc.php:
if ($serendipity['GET']['only_group'] == 'UPGRADE') { serendipity_plugin_api::hook_event('backend_pluginlisting_header_upgrade', $pluggroups); } ?> <table cellspacing="0" cellpadding="0" border="0" width="100%"> <?php $available_groups = array_keys($pluggroups); foreach($pluggroups AS $pluggroup => $groupstack) { if (empty($pluggroup)) { ?> <tr> <td colspan="2" class="serendipity_pluginlist_header"> <form action="serendipity_admin.php" method="get"> <?php echo serendipity_setFormToken(); ?> <input type="hidden" name="serendipity[adminModule]" value="plugins" /> <input type="hidden" name="serendipity[adminAction]" value="addnew" /> <input type="hidden" name="serendipity[type]" value="<?php echo htmlspecialchars($serendipity['GET']['type']); ?>" /> <?php echo FILTERS; ?>: <select name="serendipity[only_group]"> <?php foreach((array)$available_groups AS $available_group) { ?> <option value="<?php echo $available_group; ?>" <?php echo ($serendipity['GET']['only_group'] == $available_group ? 'selected="selected"' : ''); ?>> <?php echo serendipity_groupname($available_group); ?> <?php } ?> <option value="ALL" <?php echo ($serendipity['GET']['only_group'] == 'ALL' ? 'selected="selected"' : ''); ?>> <?php echo ALL_CATEGORIES; ?> <option value="UPGRADE" <?php echo ($serendipity['GET']['only_group'] == 'UPGRADE' ? 'selected="selected"' : ''); ?>> <?php echo WORD_NEW; ?> </select> <input class="serendipityPrettyButton input_button" type="submit" value="<?php echo GO; ?>" /> </form> </td> </tr> <?php if (!empty($serendipity['GET']['only_group'])) { continue; } } elseif (!empty($serendipity['GET']['only_group']) && $pluggroup != $serendipity['GET']['only_group']) { continue; } else { ?><td colspan="2" class="serendipity_pluginlist_section"><strong><?php echo serendipity_groupname($pluggroup); ?></strong></td> </tr> <?php } ?> <tr> <td><strong>Plugin</strong></td> <td width="100" align="center"><strong>Action</strong></td> </tr> <?php foreach ($groupstack as $plug) { Die gleiche Stelle in der smartifizierten Version:
if ($serendipity['GET']['only_group'] == 'UPGRADE') { serendipity_plugin_api::hook_event('backend_pluginlisting_header_upgrade', $pluggroups); } $available_groups = array_keys($pluggroups); $data['available_groups'] = $available_groups; $groupnames = array(); foreach($available_groups as $available_group) { $groupnames[$available_name] = serendipity_groupname($available_group); } $data['groupnames'] = $groupnames; $data['pluggroups'] = $pluggroups; $data['formToken'] = $formToken; $data['only_group'] = $serendipity['GET']['only_group']; $requirement_failures = array(); foreach($pluggroups AS $pluggroup => $groupstack) { foreach ($groupstack as $plug) {Man spart zwar nicht insgesamt an Zeilen:
wc -l include/admin/plugins.inc.php 583 include/admin/plugins.inc.php wc -l /var/www/include/admin/plugins.inc.php /var/www/include/admin/tpl/plugins.inc.tpl 448 /var/www/include/admin/plugins.inc.php 209 /var/www/include/admin/tpl/plugins.inc.tpl 657 insgesamtEs wurden zusammengerechnet sogar mehr. Aber man bekommt weniger und besser lesbaren Code auf der Logikebene, und sowieso: Eine Trennung zwischen Logikebene und Sicht.
Eine sehr kleine Datei fehlt noch, bis jetzt bin ich mit dem Ergebnis unserer Arbeit schon sehr zufrieden.
(Seite 1 von 1, insgesamt 13 Einträge)Suche
Kategorien
Blog abonnieren
Blogroll