Fashion Sale Hier klicken Sport & Outdoor reduziertemalbuecher Cloud Drive Photos Learn More sommer2016 Eukanuba Alles für die Schule Hier klicken Fire Shop Kindle PrimeMusic Summer Sale 16
Profil für Markus Tangens > Rezensionen

Persönliches Profil

Beiträge von Markus Tangens
Top-Rezensenten Rang: 27.011
Hilfreiche Bewertungen: 239

Richtlinien: Erfahren Sie mehr über die Regeln für "Meine Seite@Amazon.de".

Rezensionen verfasst von
Markus Tangens

Anzeigen:  
Seite: 1 | 2 | 3 | 4 | 5
pixel
Lob des Sexismus: Frauen verstehen, verführen und behalten
Lob des Sexismus: Frauen verstehen, verführen und behalten
von Lodovico Satana
  Taschenbuch
Preis: EUR 24,90

3 von 4 Kunden fanden die folgende Rezension hilfreich
5.0 von 5 Sternen Politisch inkorrekt und wirkungsvoll, 14. Juli 2015
Verifizierter Kauf(Was ist das?)
Dieses Buch ist politisch inkorrekt! Politisch korrekte Bücher zu Thema glückliche Partnerschaft habe ich schon durch - mit zweifelhaftem Erfolg. Dieses Buch dagegen funktioniert! Da schreibt kein Autor, der sich so überlegt, wie es gehen müsste, sondern einer der praktische Erfahrungen hat. Mit der Rezension dieses Buches habe ich bewusst gewartet, bis ich einen Erfolg erzielt habe. Details verrate ich natürlich nicht, denn das Buch empfiehlt auch: Ein Genießer schweigt und prahlt nicht. :-)

Die Themen des Buches sind: Wie sieht der Mann aus, den Frauen wollen (= Alphatier)? Wie sieht der Mann aus, der bei den Frauen vielleicht beliebt ist, aber von ihnen nicht wirklich ernst genommen wird (= Betatier, "Nice guy"). Welche Typen von Frauen gibt es, an welche sollte man sich halten und welche sollte man meiden? Auf welche Techniken kann ein Verführer zurückgreifen und wie setzt er sie am besten Schritt für Schritt ein? Wie und warum testen Frauen Männer und wie sollten Männer darauf reagieren? Beziehungen - wie und warum überhaupt?

Das große Plus des Buches sind die praktischen Beispiele, nämlich Erfahrungen des Autors und Zuschriften von verzweifelten Männern. Würde sich das Buch nur in allgemeinen Erwägungen ergehen, wäre es ziemlich nutzlos.

Ich benutze das Buch nach dem ersten Durcharbeiten gerne zum Nachschlagen. Dazu missbrauche ich das kleine Glossar am Ende als Stichwortverzeichnis. Für mich wäre es eine große Hilfe, wenn es noch umfangreicher wäre. Fehlende Stichwörter sind beispielsweise: Pussy-Diagnose (Abschnitt 7d, was ist daran gut oder schlecht), Double Bind (wird in Kapitel 3 erstmals erwähnt und erst in Kapitel 9 erklärt), Dissoziation.

Die Frauen-Archetypen in Abschnitt 6c fand ich recht bemüht. Ich habe da niemanden wiedererkannt, so typisch scheinen die Bilder nicht zu sein.

Nervig finde ich das Englisch-Kauderwelsch, aber wenn sich die Pick-Up-Freunde so unterhalten, dann sei's drum.


Wenn die Ziege schwimmen lernt
Wenn die Ziege schwimmen lernt
von Nele Moost
  Gebundene Ausgabe
Preis: EUR 9,95

5.0 von 5 Sternen Goodbye Schulpflicht!, 14. Juli 2015
Verifizierter Kauf(Was ist das?)
Ganz verschiedene Tiere wie Ente, Raupe, Ziege und Pferd gehen in die Schule und sollen dort alle das gleiche lernen: Schwimmen, Klettern, Fliegen. Mit stark unterschiedlichem Erfolg aber letztlich einem vereinenden Ergebnis: Zum Schluss macht keinem Tier mehr irgendetwas Spaß.

Eine ätzende und kindgerechte Darstellung davon, was Schule wirklich ist: Der Versuch, komplett verschieden veranlagten Menschen zur gleichen Zeit am gleichen Ort die gleichen Fertigkeiten beizubringen, die irgendwelche älteren Leute als lebenswichtig definiert und in Lehrplänen verankert haben. Das Buch macht mit seinem Sinnbild so sehr deutlich, was die meisten von Schule geprägten Erwachsenen nicht mehr sehen können oder wollen: Schule versucht etwas unmögliches, das aber mit betontem Ernst und schon seit Jahrzehnten völlig unbeeindruckt von allen Misserfolgen. Noch immer hoffen Eltern, Lehrer und Schüler, dass nur genügend viele weitere Reformen die Grundprobleme der Schule schon lösen werden. Was hätten Sie gerne? 13 Jahre Abitur oder doch nur 11? Frühere Einschulung? Längere Schuleingangsphase? Mehr Vorschule im Kindergarten? Ganztagsschule oder nicht? Gesamtschule oder mehrgliedriges Schulsystem? Integrative Schule? Fremdsprachen gleich in der Grundschule? Neue Fächer? Kopfnoten, ja oder nein? Verbale Bewertungen statt Noten? Mehr oder weniger Lobbyisten an Schulen? Mehr Wissen oder mehr Kompetenzen? Lehrer verbeamten oder nicht? Na egal, wenn wir nur genug ausprobieren, werden wir den Elefanten schon irgendwann zum Fliegen bekommen! Irgendwann muss es ja klappen, die Eule kann es schließlich auch! Es sei denn, es kommt vorher ein Kind, welches ruft: "Der Kaiser hat ja gar keine Kleider an!"

Ich habe mit großem Interesse die anderen Amazon-Rezensionen gelesen und festgestellt, dass die meisten vor der eigentlichen Botschaft des Buches noch schnell abbiegen. Zu tief sitzt Schule in uns selbst drin, zu sehr glauben viele von uns nach 12 Jahren Schule, dass es doch zu irgendwas gut sein muss. Dieses Buch sollte allen die Augen öffnen: Schule scheitert grandios an ihrem Anspruch und ist auch nicht reformierbar.

Dieses Buch ist mindestens ein subversives Plädoyer zur Abschaffung der Schulpflicht, die es in dieser Rücksichtslosigkeit in Europa nur in Schweden und der BRD gibt. Eigentlich ist es aber sogar ein Plädoyer zur Überwindung der Schule.


Englisch Lernen mit dem kleinen Gespenst
Englisch Lernen mit dem kleinen Gespenst
Wird angeboten von all my music
Preis: EUR 49,95

1.0 von 5 Sternen Hello, hello, hello, wie ahr se klever kids ..., 1. Mai 2015
"Hello, hello, hello, wie ahr se klever kids ..."
so ertönt es schräg und mit grässlichem deutschen Akzent
zu Beginn der CD und mein erstes Urteil ist gefällt.
"Come on" mit "komm ran" zu übersetzen, finde ich z.B. sehr kühn.
Vielleicht legen sich die Texter doch erst einmal ein Wörterbuch zu,
bevor sie versuchen, den Hörern Englisch beizubringen.
Sodann wursteln sich die Kinder
mit einem kaugummikauenden Onkel durch die CD,
der ein Kauderwelsch aus Deutsch und Englisch zum Besten gibt.
Ob man auf diese Weise gutes Englisch lernt
oder wenigstens die Geschichte vom kleinen Gespenst mitbekommt?
Mir rollen sich da die Fußnägel hoch, aber den kleinen gefällt's.


Roland Big Boy Anhänger 16 Zoll
Roland Big Boy Anhänger 16 Zoll
Wird angeboten von Bikeparts-de (Preise inkl. MwSt. Impressum, AGB, Widerrufsbelehrung finden Sie unter Verkäufer-Hilfe)
Preis: EUR 155,04

1 von 1 Kunden fanden die folgende Rezension hilfreich
2.0 von 5 Sternen Kupplung sieht stark nach geplanter Obsoleszenz aus, 2. Oktober 2014
Rezension bezieht sich auf: Roland Big Boy Anhänger 16 Zoll (Misc.)
Ich habe ein etwas älteres Modell, als das hier abgebildete. Alles in allem ist der Wagen eine schöne Erweiterung, um auch mit dem Fahrrad größere Lasten transportieren zu können. Ich möchte aber zwei Probleme erwähnen:

1. Auch bei mir klappert an dem Anhänger vieles, weswegen ich die Metallrohre des Wagens umgehend mit Isolierschaumstoffröhren für Heizungsrohre ummantelt habe. Außerdem lege ich immer ein Stück Zellstoff über die Kupplung, damit es dort nicht so sehr klappert.

2. Mir ist das kleine schwarze Plasteteil von der Kupplung verloren gegangen. Es hängt da so locker, dass es eigentlich ein Wunder ist, dass es noch nicht eher verloren gegangen ist. Und nun die Erkenntnis: Als Ersatzteil bekommt man nur die ganze Kupplung für 10 Euro aber nicht dieses kleine schwarze Plasteteil für wahrscheinlich nicht mal 50 Cent. Es wäre sehr einfach, diese Plasteteile zu verkaufen. Die Firma Roland macht es aber nicht, weil sich anscheinend keiner darüber beschwert. Wer es nötig hat, den Kunden auf diese Weise das Geld abzuknöpfen, hat sich ehrlich meine niedrige Bewertung erarbeitet.


CSL - 300 Mbit/s USB 2.0 WLAN Stick mit Antennenbuchse und abnehmbarer Antenne
CSL - 300 Mbit/s USB 2.0 WLAN Stick mit Antennenbuchse und abnehmbarer Antenne
Wird angeboten von CSL-Computer
Preis: EUR 12,99

8 von 9 Kunden fanden die folgende Rezension hilfreich
3.0 von 5 Sternen Schwieriges Verhältnis zu Ubuntu Linux 13.10, 7. Mai 2014
Verifizierter Kauf(Was ist das?)
Ich habe einen vier Jahre alten Laptop mit Lubuntu 13.10, bei dem kürzlich die interne Funknetzkarte ausgefallen ist. Nach einigen positiven Amazon-Erfahrungsberichten bei der Verwendung des Adapters unter Linux, war ich voller Hoffnung, dass ich die Fehlfunktion mit dem externen WLAN-USB-Adapter von CSL Computer ausgleichen könnte. Auch einschlägige WLAN-Linux-Erklärungsseiten wie jene von ubuntuusers.de versprechen, dass der verbaute Chipsatz Realtek RTL8191SU ab Ubuntu 12.04 direkt unterstützt werden sollte. Tut er aber nicht. Nach Einstecken des WLAN-USB-Adapters bleibt die LED am Adapter dunkel und der Lubuntu-Desktop weiß nichts von Funknetzwerken.

Weiter bin ich so vorgegangen:

1. Ich habe versucht, den Originaltreiber von der mitgelieferten CD zu übersetzen. Das scheiterte daran, dass unter anderem eine Funktion namens "daemonize" im Kernel 3.11 von Ubuntu 13.10 nicht mehr existiert, wie ich verschiedenen Foren entnehmen konnte.

2. Ich habe mich bei [....] nach einem neueren Treiber umgesehen. Der letzte stammt aber von Mai 2012.

3. Verschiedene Versuche, irgendwelche Kernelmodule zu laden oder die Geräte-ID einem Treiber zuzuordnen oder Firmware-Bin-Dateien in irgendwelchen Verzeichnissen abzulegen, brachten keinen Erfolg.

4. Letzter Versuch war die Nutzung des Windows-XP-Treibers mit Hilfe des Ndiswrappers. Damit konnte ich tatsächlich eine Verbindung aufbauen. Allerdings muss ich zu Beginn den Adapter erst neu einstecken, damit er angenommen wird. Außerdem zickt jetzt der Rechner hin und wieder herum: Er friert manchmal ein, wenn man auf dem Lubuntu-Desktop das Funknetzwerk aktivieren will und beim Herunterfahren bleibt mitunter der Rechner hängen, schaltet sich also insbesondere nicht automatisch aus.

Mein Fazit: Nichts für den Durchschnittsbenutzer unter Linux.
Kommentar Kommentare (2) | Kommentar als Link | Neuester Kommentar: Aug 17, 2014 6:37 PM MEST


Die Entdeckung der Faulheit: Von der Kunst, bei der Arbeit möglichst wenig zu tun
Die Entdeckung der Faulheit: Von der Kunst, bei der Arbeit möglichst wenig zu tun
von Corinne Maier
  Taschenbuch

3.0 von 5 Sternen zutreffend, aber langweilig, 1. Februar 2014
Verifizierter Kauf(Was ist das?)
Ich hatte in dem Buch ausgefallene Tipps erwartet, wie man sich auf Arbeit um die Arbeit drückt, ohne aufzufallen, oder wenigstens ein paar Anekdoten aus dem frustrierenden Angestelltendasein in einem großen Konzern. Nichts von beidem findet man in diesem Buch. Es ist eine Aneinanderreihung allgeheimgehaltener Schilderungen vom traurigen Zustand eines Großunternehmens, sicher zutreffend, aber wenig lesenswert. Am interessantesten fand ich noch den Hinweis auf die Affäre "avions renifleurs". Ansonsten halte ich mich lieber an das häufig im Buch erwähnte Dilbert-Prinzip.


Haskell-Intensivkurs: Ein Kompakter Einstieg in die Funktionale Programmierung (Xpert.press) (German Edition)
Haskell-Intensivkurs: Ein Kompakter Einstieg in die Funktionale Programmierung (Xpert.press) (German Edition)
von Marco Block
  Taschenbuch
Preis: EUR 39,99

3 von 5 Kunden fanden die folgende Rezension hilfreich
2.0 von 5 Sternen Haskell - intensiv nachbessern bitte!, 31. Januar 2014
Ich habe selbst Erfahrungen mit Haskell-Programmierung und suche ein Buch, das ich Studenten in die Hand drücken kann. Es gibt zahlreiche Lobpreisungen von Haskell in deutscher Sprache in Zeitschriftenartikeln und im Internet, aber häufig schlage ich die Hände über dem Kopf zusammen, weil die vorgestellten Lösungen reichlich umständlich, manchmal sogar falsch sind und die Argumente für Haskell am Kern der Sache vorbeigehen. Hebt sich dieses Buch positiv von anderen Beiträgen ab?

Eine Rezension von Einführung in die Programmierung mit Haskell bemängelt, dass jenes Buch kein Wort über Monaden enthält, während für das vorliegende Buch eine Rezension die Einführung in Monaden lobt. Weil Monade in Haskell mit vielen Irrtümern belastet sind, (siehe: "What a Monad is not" in der Haskell-Wiki) werde ich mir also genau das Kapitel über Monaden genauer anschauen.

Das Kapitel 17 über Monade beginnt auf Seite 210. Auf Seite 211 gibt es bereits den ersten Fehler: In der Implementierung von "h" sind in der Verkettung "gMit ++ fMit" die Operanden vertauscht, die Texte werden also entgegen der chronologischen Reihenfolge zusammengesetzt, was auch der später gezeigten allgemeinen Implementierung des Writer-Monads widerspricht. Auf Seite 212 sieht man in der Ausgabe von "h 5" ein fehlendes Leerzeichen zwischen dem Punkt und "fertig". D.h. den darüber dargestellten Programmteil haben die Autoren offenbar so nicht ausgeführt. Als nächstes werden Zufallszahlen im Modul "Data.Random" verortet, tatsächlich muss man sie aber von "System.Random" importieren.

Auf Seite 215 werden für Abschnitt 17.3.2 durch die Überschrift Umwandlungsregeln für if-then-else innerhalb der do-Notation in Aussicht gestellt. Der Abschnitt zeigt aber keinerlei solche Umwandlung, er weist nur darauf hin, dass die Then- und Else-Zweige ggf. eigene do-Schlüsselwörter benötigen. Das ist aber keine Besonderheit der if-then-else-Syntax, sondern trifft auch auf alle Funktionen zu, beispielsweise "ifThenElse" oder "when". Tatsächlich zeigt das Beispiel aber eine andere Besonderheit:

if p then do
..anweisung2
..anweisung3
else do
..anweisung4
..anweisung5

Wenn in einem do-Block eine Zeile in der ersten Spalte des Blockes beginnt, so wertet der Haskell-Übersetzer dies normalerweise als neue monadische Aktion, und fügt ein (>>) oder (>>=) ein. In dem Beispiel beginnt eine Zeile allerdings mit "else" und dieses wird trotz genannter Regel dem vorangehenden "if" zugeordnet. Dies ist eine syntaktische Ausnahme, um eine Einrückung zu ermöglichen, die viele Programmierer aus imperativen Sprachen gewohnt sind. Siehe Artikel DoAndIfThenElse in der GHC-Wiki.

Persönlich finde ich das überflüssig, weil ich aus Symmetriegründen den Then- und Else-Teil gleich einrücken würde:

if p
..then do
....anweisung2
....anweisung3
..else do
....anweisung4
....anweisung5

Darüber hinaus halte ich eine spezielle Syntax für if-then-else überflüssig, weil es auch die Standardfunktion ifThenElse gibt. Zuletzt weisen die Autoren darauf hin, dass man den Else-Teil nicht weglassen darf. An dieser Stelle könnten sie den Leser darauf hinweisen, dass es die Funktion 'when' gibt, bei der man genau das darf. Meine Meinung: Wenn man gleich die Funktion ifThenElse verwendet, dann ist es klarer, dass der Else-Teil immer dazu gehört, und der Wechsel von einer Funktion "ifThenElse" zu einer Funktion "when" erscheint mir auch leichter zu sein, als ein Wechsel von einer speziellen Syntax (if-then-else) zu einer regulären Funktion (when).

Weiter geht es auf Seite 219 mit dem Reader-Monad. Ich musste mich zuerst durch das Programm arbeiten, um überhaupt zu verstehen, welches Problem die Autoren lösen wollen. Anscheinend betrachten die Autoren "Magenta" als eine Farbnuance von "Rot" und "Cyan" als eine Nuance von "Gruen". Aus irgendeinem Grund wollen sie eine Liste von Texten einlesen, in welchen sich Namen von Grundfarben und Namen von Nuancen abwechseln, und daraus eine Liste machen, in der diese Zuordnung sozusagen maschinenverständlich aufbereitet ist. Was die Motivation für so eine Aufgabe sein könnte, erschließt sich mir zunächst nicht.

Die Implementierung ist ebenso merkwürdig wie die Aufgabenstellung. Mir sticht sofort ins Auge, dass die Funktion liesFarben erstens nicht total ist, sie zweitens zwei Funktionen "rot" und "gruen" aufruft, die nahezu gleich sind, und drittens sich viel einfacher mit einem mapM implementieren lässt. Ersteres bedeutet, dass der Funktionswert undefiniert ist, wenn eine andere Farbe als "Rot" und "Gruen" gelesen wird. Wenn man sich Warnungen ausgeben lässt, so warnt ein Haskell-Übersetzer in der Regel vor unvollständigen Fallunterscheidungen wie dieser. Auf diese Problematik sollte der Text wenigstens hinweisen. Zweiteres heißt, dass ohne Not redundanter Programmtext geschrieben wird. Beide Funktionen unterscheiden sich nur darin, welcher Farbe-Konstruktor verwendet wird. Man hätte es viel einfacher haben können, indem man "rot" und "gruen" zusammenfasst zu

sucheFarbe :: [String] -> Reader Woerterbuch (Int, [String])

und dann die Konstruktoren Rot und Gruen erst in den Fallbehandlungen von liesFarben anwendet. Aber auch das ist noch sehr umständlich. Das "rest"-Argument in "rot" und "gruen" wird nämlich gar nicht verarbeitet, sondern nur durchgereicht. Also würde es auch ein

sucheFarbe :: String -> Reader Woerterbuch Int

tun. Eine Fallbehandlung von liesFarben sieht dann nur noch so aus:

liesFarben ("Rot":nuance:rest) = do
..nuanceInt <- sucheFarbe nuance
..erg <- liesFarben rest
..return (Rot nuanceInt : erg)

Aber auch das ist alles noch sehr umständlich, weil drittens eigentlich ein mapM geboten ist. Ich würde so vorgehen: Zuerst schreibe ich eine Funktion, welche eine Liste in Paare benachbarter Elemente zerlegt:

pairs :: [a] -> [(a,a)]

Dann schreibe ich eine Funktion liesFarbe, die sich mit genau einer Farbe und ihrer Nuance beschäftigt:

liesFarbe :: (String, String) -> Reader Woerterbuch Farbe
liesFarbe (farbe, nuance) =
..fmap (case farbe of "Rot" -> Rot; "Gruen" -> Gruen) $
..sucheFarbe nuance

Zum Schluss setze ich zusammen:

liesFarben = mapM liesFarbe . pairs

Die Autoren entschuldigen sich am Ende des Abschnittes mit dem Satz:
"Da wir unser Beispiel einfach gehalten haben, um die Konzepte zu verdeutlichen, erfordert es ein wenig Phantasie, den Vorteil der Verwendung der Monade zu sehen."

Wenn sie ihr Beispiel wirklich einfach gehalten hätten, so wie ich es gezeigt habe, dann hätten sie auch die Vorteile von Monaden demonstrieren können. Im Englischen nennen es die Haskell-Freunde "separation of concerns", zu deutsch etwa: "immer nur eine Sache auf einmal erledigen". Ich denke, ich habe das ganz gut gezeigt: Eine Handvoll einfach zu verstehende Funktionen wie "pairs" und "liesFarbe" lassen sich mit ebenfalls gut verständlichen Kombinatoren wie "mapM" und "." zu etwas Großem zusammensetzen.

Im übrigen sehe ich auch in real verwendeten Haskell-Paketen häufig Code, in dem auf umständliche Weise Funktionen wie "map" oder "mapM" mit Anwendungscode vermengt werden. Es wäre wirklich nötig in einem Lehrbuch mit gutem Beispiel voranzugehen.

Kommen wir zum Zustandsmonad auf Seite 220. Auch hier versuchen die Autoren ein neues Konzept anhand eines unklaren Beispiels einzuführen. Es geht um einen Getränkeautomaten. Aber was soll dieser Getränkeautomat genau tun? Erst im Verlaufe des Programmes beginne ich zu erahnen, dass der Automat nicht mit Euro bezahlt wird, sondern man eine Geldeinheit pro Flasche entrichten muss. Diese Vereinfachung finde ich sinnvoll, aber keineswegs selbstverständlich. Ein Hinweis darauf muss mir entgangen sein. Der Zustandsgraph in Abbildung 17.1 zeigt drei Zustände 0, 1, 2, welche im Datentyp Automat als Int deklariert sind, bei denen mir aber nicht klar ist, was sie bedeuten. Die Autoren wären gut beraten, für die Zustände einen Aufzählungstypen mit aussagekräftigen Namen zu verwenden, ähnlich dem Typ "Aktion". Auch beim Typ "Aktion" ist mir allerdings nicht klar, was die Aktionen "Flasche" und "Entnehmen" bedeuten. Bei der Aktion "Geld" tippe ich auf den Einwurf einer Geldeinheit. Im Programm ist es möglich mit den Aktionen "Geld" und "Entnehmen" vom Zustand 2 in den Zustand 1 zu gelangen. Diese Kante fehlt in der Abbildung. Mich beschleicht der Verdacht, dass das Programm eigentlich gar keiner Unterscheidung von Zuständen bedarf. Kann man nicht einfach zwei Zähler verwenden: Einer für die eingeworfene Geldmenge und einer für den Umfang des Vorrates an Flaschen? Geldeinwurf erhöht den Geldzähler und Auswurf einer Flasche erniedrigt den Geldzähler und den Vorratszähler. Indem die Autoren die Zustände einfach durchnumeriert haben, haben sie sich schön um eine Klärung ihrer Bedeutung herumgedrückt. Deswegen könnte es gut sein, dass es eigentlich nur einen Zustand gibt, nämlich "Automat funktioniert".

So wirr wie die Aufgabenstellung sieht auch die Implementierung aus. Sie besteht aus der Funktion mit dem Typen

automat :: [Aktion] -> State Automat [String]

und Sie ahnen es schon, auch diese Funktion lässt sich im Wesentlichen als mapM schreiben. Stattdessen vermengen die Autoren die Fallunterscheidung zum Listenskelett mit der Fallunterscheidung zur Aktion, wobei die Aktionen "Geld" und "Flaschen" mit eigenen Funktionen implementiert sind, aber "Entnehmen" direkt in "automat" behandelt wird. Das Hin- und Herspringen zwischen "automat", "geld" und "flaschen" erinnert mich stark an das lange überwunden geglaubte GOTO. Beim Fall "Entnehmen" habe ich wieder zu bekritteln, dass mit "error" die Funktion nicht total ist und weiterhin wundere ich mich über das umständliche "case (guthaben z) of n | n==0 -> ..." welches man doch eher als "case guthaben z of 0 -> ..." schreiben würde.

Zum Schluss scheitert man daran, das Beispiel auszuführen, denn auf Seite 222 ist die Hugs-Eingabezeile so formatiert, dass man das zweite Argument von "runState" für die Ausgabe von Hugs halten muss. Die Einrückung für "Entnehmen" ist nett gemeint, aber Anfänger bekommen leicht den Eindruck, dass man das so einrücken müsste, insbesondere weil man ihnen zuvor gesagt hat, dass Einrückungen in Haskell eine Bedeutung haben. Es wäre sicher sinnvoller gewesen, zur Erzeugung eines Anfangszustandes eine Funktion zu programmieren, dann hätte der gesamte runState-Aufruf in zwei Eingabezeilen gepasst. Im übrigen hatte ich hinter dem Namen "automat" eher eine Funktion erwartet, die einen Automat-Datenverbund erzeugt. Die im Buch gezeigte Funktion hätte ich eher "ausfuehren" genannt.

Als letztes kommt der Listenmonad ab Seite 222. Dort wird eine Funktion vorgestellt, die alle Permutationen einer Liste aufzählt - selbstverständlich mit dem typischen Anfängerfehler, die Funktion "delete" zu verwenden. In der Haskell-Wiki wird unter "Haskell programming tips" fast genau dieses Beispiel behandelt und die Funktion "removeEach" vorgeschlagen, mit welcher man Permutationen ohne die Typbeschränkung "Eq" berechnen kann. Überdies funktioniert "removeEach" auch beim Auftreten von Elementen, die bezüglich (==) gleich sind.

Die Funktion slowSort ließe sich sehr knapp implementieren als "filter istSortiert . perm". Die Autoren ziehen jedoch eine mehrzeilige Lösung im Listenmonad vor, weil nunmal der Listenmonad gerade das Thema ist.

Das zum Thema Monade. Ansonsten habe ich zu bemängeln, dass in dem Buch Programmierfehler und Ausnahmebehandlung durcheinander geworfen werden. Wenn beispielsweise dem Getränkeautomaten die Flaschen ausgehen, dann darf natürlich nicht das Programm abstürzen, so wie es die Autoren programmiert haben. Vielmehr muss das Programm auf diese Situation vorbereitet sein und dem Benutzer eine sinnvolle Fehlermeldung mitteilen, ihm das Geld zurückgeben und am besten gleich den Getränkelieferer informieren. Auch die Verwendung des Writer-Monads für Debug-Ausgaben ist nicht korrekt. Für die Fehlersuche kann man Hilfsausgaben vorübergehend(!) mit Debug.Trace.trace ausgeben, aber das Programm dauerhaft auf die Fehlersuche anzupassen, ist sicher nicht der richtige Weg. Eine sinnvolle Anwendung für ein Protokoll wäre eine Log-Datei für einen Web-Server, in der der Web-Server gestellte Anfragen archiviert.

Weiterhin stört mich, dass aus dem Buch nur schwer zu erkennen ist, welche Programmschnippsel zusammengehören. Es werden regelmäßig Bezeichner an einer Stelle definiert und an anderer Stelle verwendet, aber der Sichtbarkeitsbereich ist ebensowenig ersichtlich, wie der Satz an importierten Modulen. Eine sinnvolle Einteilung wäre etwa ein Modul pro Kapitel. Wenn man die Dateien jedoch von der Seite der Autoren herunterlädt, so erhält man die Schnipsel genauso aufgeteilt, wie sie in den Blöcken im Buch erscheinen. In dieser Form lassen sie sich nicht in einen Haskell-Interpreter laden! Es ist also gar nicht klar, ob die Autoren ihre Programme überhaupt jemals ausprobiert haben. Meine oben gezeigten Beispiel wecken Zweifel daran. Dieser Umstand erklärt wohl auch, warum sich manchmal Bezeichner von einem Block zum nächsten ändern, ohne dass es die Autoren bemerken. Das sieht man zum Beispiel am Typen "Baum" auf Seite 168: Dort steht "x {elems = size x + size y, ..." Die Variable "x" ist vom Typ "Baum", dieser hat aber kein Element namens "elems". Im Übrigen ist "elems" fettgedruckt, sicher weil das LaTeX-Paket "listings" eine entsprechende Funktion im Modul Data.Array kennt.

Der Datentyp "Baum" eignet sich darüber hinaus gut als Beispiel, wie man Datentypen nicht definiert: In der Definition werden 3 Sprachen und 4 Metaphern vermengt. Die Sprachen sind Deutsch (Baum, Knoten, anzahl, inhalt), Latein (nil von nihil), und Englisch (lT und rT vermutlich leftTree und rightTree, die unnötige Abkürzung macht die Sache nur noch schlimmer), und jedes der Wörter Baum, Knoten, Nil und inhalt gehört anscheinend zu einer anderen Metapher, aber zu welcher? Ich denke, wenn man einen Baum als Vorbild wählt, dann sollte man auch bei Bestandteilen eines Baumes bleiben, also Wurzel, Ast, Zweig, Blatt etc. Auch sonst trifft man in dem Buch viele gequälte denglische Ausdrücke wie Traversierung (statt ... ja was wollen sie eigentlich sagen?), Instanz (statt Ausprägung), Funktionskomposition (statt -verkettung), Pattern match (statt Mustertest). Für mich sind Nicht- oder Schlechtübersetzungen häufig ein Zeichen von Nicht-Verstehen und das deckt sich mit meinem Eindruck, den ich allein aus dem Monad-Kapitel mitgenommen habe.

Habe ich schon erwähnt, dass die Haskell-Module zum Buch teilweise Tabulatoren enthalten? Das ist in Haskell problematisch, weil Einrückungen eine Bedeutung haben, und es wird spätestens dann zum Problem, wenn man Texte mit Leerzeichen und Tabulatoren zusammenkopiert.

In meinem Schlusswort möchte ich auf die Frage zurückkommen, ob man das Buch Studenten in die Hand drücken soll oder nicht. Meine Antwort: Ja, man sollte das durchaus tun, denn daraus kann man eine Menge lernen. Erstens lernt man, dass Programmierer ziemlich schlampig sind und dass dies leider auch auf Haskell-Programmierer zutrifft. Zweitens kann man lernen, wie man es nicht macht und warum. Würde man Studenten nur zeigen, wie man diszipliniert programmiert, dann würden sie einem ja nicht glauben, dass Programmierer zu gewissen Schandtaten wirklich bereit sind.

35 Euro ist diese Diskussionsgrundlage allerdings ganz klar nicht wert. Vielleicht bekommen Sie das Buch irgendwo gebraucht.
Kommentar Kommentare (8) | Kommentar als Link | Neuester Kommentar: Jun 24, 2014 7:53 PM MEST


Pferdefreundschaft für immer: Die Pferde vom Friesenhof
Pferdefreundschaft für immer: Die Pferde vom Friesenhof
von Margot Berger
  Gebundene Ausgabe
Preis: EUR 5,00

4 von 4 Kunden fanden die folgende Rezension hilfreich
1.0 von 5 Sternen alter Wein in neuen Schläuchen, 31. Dezember 2013
Wir haben uns auf neue Pferdegeschichten gefreut und stattdessen die Geschichten bekommen, die wir schon in Pferdesommer am Meer und Ein Wunschpferd kommt selten allein von Margot Becker aus dem Arena-Verlag haben, also von der gleichen Autorin und vom gleichen Verlag. Dabei legt der Verlag durchaus kriminelle Energie an den Tag, denn alle drei Bücher haben ein anderes Titelbild, verschiedene ISBNs und jede Ausgabe gilt als 1. Auflage. Die Seiten in den Büchern sind aber exakt gleich.
Der Preis des Buches ist mit 5 Euro gerade so hoch, dass sich der Aufwand einer Rückgabe eigentlich nicht lohnt. Alles in allem scheint das ein abgekartetes Spiel zu sein, bei dem der Verlag auf die Trägheit der Käufer spekuliert.


Brother DCP-9055CDN Farblaser-Multifunktionsgerät (Drucker, Kopierer, Scanner) weiß/garu
Brother DCP-9055CDN Farblaser-Multifunktionsgerät (Drucker, Kopierer, Scanner) weiß/garu
Wird angeboten von Coemedia GmbH
Preis: EUR 444,44

4.0 von 5 Sternen runde Sache mit Schwächen beim Scannen, 28. Juni 2013
Also zunächst mal bin ich ganz zufrieden mit dem Kauf: Ein Farb-Laser-Drucker mit Duplex-Einheit, Scanner mit automatischem Einzug, wobei beide über das Netzwerk von mehreren Rechnern angesprochen werden können für nur 550 Euro, das ist eine preiswerte runde Sache! Scannen und Drucken funktionieren auch reibungslos unter Linux! Die Kartuschen können nachgefüllt werden und der Händler hat mir versichert, dass in Geräten dieser Preisklasse keine Seitenzähler eingebaut sind, die das Gerät nach einer bestimmten Benutzungsdauer für immer abschalten. Aber es gibt so einige nervige Kleinigkeiten, die vor allem den Scanner betreffen.

Zunächst noch einmal zu den Kartuschen, denn ganz so problemlos, wie mein Händler versicherte, ist die Sache nicht. Der Drucker meldet frühzeitig, wenn eine Kartusche zur Neige geht. Selbst wenn er dann das endgültige Ende verkündet und den Dienst einstellt, ist der Ausdruck zuvor noch satt, und die Kartusche keineswegs am Ende. D.h. der Drucker schaltet pauschal nach Ablauf eines Zählers ab und nicht nach Füllstand der Kartusche. Ich habe im Internet eine "Cheat-Liste" gesucht und gefunden, auf der für sehr viele Druckertypen steht, wie man solche Seitenzähler zurücksetzt. Damit habe ich den Zähler für eine Farb-Kartusche vor etwa einem Jahr zurückgesetzt und die Kartusche ist noch nicht leer. Ich spare aber auch mit Farbdrucken. Die vielfältigen offiziellen PDF-Dokumente von Brother schweigen sich zum Zurücksetzen der Zähler aus. Das riecht doch förmlich nach geplanter Obsoleszenz.

Hier die Anleitung zum Rücksetzten des Zählers:
1) Gerät einschalten, Vorderklappe öffnen.
2) STORNO-Taste 1x drücken (RESET PARTS LIFE Menü).
3) Mit den ▲▼-Tasten Kartusche auswählen ( STD-Standard / HC-Jumbo / S.HC Super Jumbo ).
4) OK Taste 1x drücken für die Bestätigung.
5) ▲-Taste 1x drücken für die Initialisierung.
6) Vorderklappe schließen.

Jetzt zum Scanner: Egal ob beim Scannen über die Glasplatte oder über den automatischen Einzug, wenn ich die Vorlagen bündig an die Ränder lege, dann sind die Ränder der Vorlagen im digitalisierten Bild abgeschnitten. Wäre es denn so schwierig, den Scanner so zu bauen, dass die Lichtsensorenzeile im Zweifelsfall über die Glasplatte hinaus reicht, anstatt von der Vorlage etwas abzuschneiden? So nehme ich nun immer eine Stück Pappe zu Hilfe, um vollflächig bedruckte Vorlagen vollständig digitalisieren zu können. Das ist umständlich und das Bild wird trotzdem schief.

Zweites Problem beim Scannen: Ich habe es unter Linux nicht geschafft, den Scan-Vorgang vom Scanner aus zu starten. Wenn ich das machen will, muss ich auf meinem Rechner einen FTP- oder Samba-Server starten. Ich schätze, dass damit viele Benutzer schon überfordert sind. Ich habe es geschafft, einen FTP-Server zu starten und habe auch von einem zweiten Rechner probiert, Dateien auf dem FTP-Server abzulegen - das funktioniert jedenfalls. Wenn ich allerdings am Scanner einen Scan-Vorgang über FTP starten will, dann sagt er nebulös, dass das fehlschlägt. Er gibt mir keine Informationen darüber, warum es genau nicht funktionieren soll. Das Handbuch schweigt sich zu diesem Problem ebenfalls aus.

Ich denke, es wäre sehr viel einfacher, wenn der Drucker die Bilder lokal speichern könnte, und ich sie mir über den Web-Browser vom Drucker über HTTP abholen könnte. Jedenfalls funktioniert die Konfiguration des Druckers über den eingebauten Web-Server tadellos. Meine Notlösung sieht so aus, dass ich mir ein Shell-Skript geschrieben habe, welches hintereinander weg Scan-Vorgänge startet. Ich muss nur zusehen, dass ich am Scanner die Vorlagen rechtzeitig auflege. Danach muss ich mir aus den digitialisierten Bildern die passenden heraussuchen.

Interessante Beobachtung am Rande: Ein Bekannter von mir besitzt den Canon imageRunner, einen Drucker-Scanner-Kopierer mit ähnlichem Funktionsumfang, und bei ihm funktioniert die Übertragung gescannter Bilder mit FTP genauso nicht und er weiß auch nicht warum.

Das dritte Problem, wieder mit dem Scanner, ist bislang eher theoretischer Natur: Während ich die Druckertreiber direkt aus Ubuntu-Archiven installieren kann, muss ich die Scannertreiber von Brother besorgen und installieren. D.h. die Brother-Scanner-Treiber liegen nicht offen und wenn Brother die Unterstützung für zukünftige Rechnergenerationen oder Linux-Versionen einstellen sollte, oder ich auf ein nicht unterstütztes System wechseln will, dann stehe ich im Regen. Das Problem dürfte genauso Windows-Benutzer betreffen.

Dann habe ich noch eine Merkwürdigkeit beobachtet: Manchmal ist in Ausdrucken die Auflösung der Schrift stark reduziert. Meine Vermutung ist, dass beim Mischen von Text und Grafik die Textauflösung auf die der Grafik reduziert wird. Warum das so sein muss, ist mir schleierhaft. Es sieht so aus, als ob sich das Problem beheben lässt, wenn ich beim Druck die Option "High Quality Image Printing" wähle. Aber bis ich bemerkt hatte, dass es da ein systematisches Problem gibt, hatte ich schon etliche verhunzte Ausdrucke produziert.

Als allerletzte Beschwerde möchte ich noch vorsichtig anmerken, dass der Drucker sehr schwer ist und viel Platz wegnimmt. Ursprünglich hoffte ich, ein Gerät zu bekommen, das so kompakt ist, wie die vielen erhältlichen Drucker-Scanner-Kopierer auf Tintenstrahlbasis. Aber Duplexeinheit und vier Laser-Kartuschen fordern anscheinend ihren Platz. Mir wurde auch erklärt, dass man die Größe des Druckers eigentlich nur auf Kosten der Kartuschengröße reduzieren könne, und dann würden die Kosten für die Kartuschen und deren Nachbefüllen verhältnismäßig groß werden. Vielleicht gibt es ja doch noch irgendeinen technologischen Durchbruch, um auch Laserdruckertechnik kompakt bauen zu können, oder vielleicht erfindet jemand ein ganz neues Verfahren zum Drucken?
Kommentar Kommentare (2) | Kommentar als Link | Neuester Kommentar: Jan 18, 2014 11:47 AM CET


Speedlink Aero flexibler USB Ventilator (geräuscharm, An- und Aus-Schalter)
Speedlink Aero flexibler USB Ventilator (geräuscharm, An- und Aus-Schalter)
Wird angeboten von Eliware
Preis: EUR 9,90

4 von 6 Kunden fanden die folgende Rezension hilfreich
3.0 von 5 Sternen Blöde Leuchtreklame, 28. Juni 2013
Im Laden gab es leider nur die Variante des Lüfters mit integrierten LEDs. Ich hoffte, man könnte die ausschalten. Man kann es nicht. Ich hoffte, man könnte die LEDs mit Pflaster überkleben. Die leuchten aber so stark, dass es praktisch keinen Unterschied macht, ob da Pflaster drauf ist oder nicht. Nun ventiliert also dieses Ding neben mir und die blinkenden Lichter lenken mich total ab. Ist es denn so schwierig einen Lüfter ohne oder mit abschaltbaren LEDs zu bauen?

Ok, ich habe festgestellt, dass man den Propeller von der Achse abziehen kann. Wenn man ihn auseinanderschraubt, so kann man die kleine Leiterplatte mit den daran hängenden LEDs einfach herausziehen. Zuerst hatte ich versucht, das Motorgehäuse auseinanderzubauen, wobei ich im Handumdrehen die Drähte zum Motor durchgerissen hatte.

Jedenfalls habe ich nach dieser Operation einen netten, nicht nervenden Lüfter. Wahrscheinlich hätten die LEDs als Tastaturbeleuchtung sogar ganz nützlich sein können, aber dann nicht bunt und nicht blinkend und besser abschaltbar.


Seite: 1 | 2 | 3 | 4 | 5