Wie schafft man sowas eigentlich?

written by Martin Häcker on

(Zu Rachel's Song von Vangelis)

Meine Bekannte Katrin hat sich eine Zeitschaltuhr zugelegt. Nun ja, da denkt man, diese Dinger gibts ja schon lange, kann ja alles nicht so schwer sein.

:-D

Nach längerer Zeit hat Sie herausgefunden wie der Funktioniert - zu zweit haben wir ihn dann mal im Detail angeschaut.

Schonmal vorweg: Meinen Respekt. Was die alles Falsch gemacht haben, muss man wirklich absichtlich machen, sonst geht das einfach nicht.

Hier erstmal ein Bild

Image

Vielleicht das gute Vorne weg: Es ist klar eine Durchgangssteckdose, wo man was einsteckt ist schon mal einfach.

Nein, mehr positives fällt mir dazu nicht ein. Sorry.

Kommen wir mal zu den Details. Es ist eine Zeitschaltuhr. Völlig unbedarft erwartet man also erst einmal eine Uhr, die schaltet. Und wenn man das Bild betrachtet, dann ist das ja auch schon mal vertraut. Da sind Zahlen und die sind im Kreis angeordnet.

Ach ja, schalten... Das war schon die erste Schwierigkeit - wie schaltet man das gute StĂĽck? Man muss die Schalter (der schwarze Kranz um das "Ziffernblatt" hoch oder herunterdrĂĽcken um den Strom zu schalten.

Interessanterweise gibt es auf dem guten StĂĽck aber keinerlei Hinweis welche Stellung ein entspricht! Soweit ich das beurteilen kann scheint aber "herausgezogen" ein zu bedeuten. Sehr intuitiv.

Ach ja, und dann gibt es noch einen roten Schalter auf der Seite. Den haben wir auch nicht verstanden. Jetzt bei der Recherche hier zum Schreiben bin ich auf der Seite von Conrad-Elektronik fündig geworden. Offenbar ist das ein Master-Schalter der die Zeitschaltuhr völlig übergeht. Ist der UNBESCHRIFTETE Schalter also in der falschen Position, funktioniert sowieso gar nix.

Aber falls er zufällig richtig ist ist es trotzdem noch kompliziert - denn welcher der etwa 120 Schalter in dem Aussenring ist für welche Zeit zuständig? Beim Versuch das herauszufinden stößt man schnell darauf das man den äusseren Ring mit den Zahlen - das "Ziffernblatt" sozusagen - drehen kann.

Praktisch. So kann man zum Feststehenden Uhrzeiger die passende Uhrzeit einstellen.

Ich stelle mir das so vor: Damit man nicht völlig verzweifelt, wird man vermutlich die Uhr so einstellen, dass 0/24 Uhr oben ist, und dann stellt man sich einen Wecker, damit man die Uhr zum richtigen Zeitpunkt einsteckt, damit die Uhrzeit die er dann anzeigt zur Tageszeit passt. Und vielleicht betreibt man es vorher dann noch ein paar Stunden damit der Zeiger auf eine passende Stelle zeigt und man nicht um Mitternacht zum Zeitschaltuhr einstecken aufstehen muss.

Sehr komfortabel.

Ach ja, ausserdem stellt man ungefähr zu diesem Zeitpunkt fest, das die Beschriftung auf dem Ziffernblatt in die falsche Richtung ist. Nicht wie bei einer Uhr, nein, nein - natürlich anders herum. Auch wenn einem der Pfeil auf der "Zeiger"-Scheibe eine normale Richtung vorgaukeln möchte. Ach ja, natürlich macht der schon Sinn - denn den "Ziffernblatt"-Ring kann man nämlich ohne große Kraft nur in diese Richtung drehen. Oder soll - damit das einstellen der Uhrzeit noch "leichter" fällt vielleicht?

Der "Zeiger" jedenfalls bewegt sich genau in die andere Richtung.

Fassen wir also mal Zusammen:

  • Schalten? An schwarzen Stiften, so etwa 10 min pro Stift, was ein und was aus bedeutet muss man aber durch trial und Error bestimmen
  • Es gibt einen unbeschrifteten Schalter, der den ganzen Mechanismus ausser Kraft setzt - Was ein und was aus bedeutet muss man ausprobieren.
  • Man dreht nicht die Scheibe mit dem Pfeil darauf, sondern den Ring aussen herum auf dem die Zahlen stehen.
  • Damit stellt man die Uhrzeit zu dem feststehenden "Uhrzeiger" ein. Man stellt also nicht den "Uhrzeiger" sondern das "Ziffernblatt"
  • Das "Ziffernblatt" ist in die falsche Richtung beschriftet

Eine tolle Uhr ist dass. Ich meine, man hat wirklich das Gefühl das der Konstruktör entweder noch nie eine Uhr in der Hand gehabt hat und daher etwas völlig neues erfinden musste, oder aber das er sich absichtlich überlegt hat, wie er seine Benutzer noch ein bisschen mehr quälen kann.

Wirklich faszinierend.

Ha-, ha-, ha-....

written by Martin Häcker on

... war alles was ich noch sagen konnte, nachdem mir mein Vater ein (!!) Korn des Szechuanpfeffers gegeben hatte, die meine Verwandte Renate aus China mitgebracht hat.

Was die Wikipedia als "scharf-prickelnde Geschmack, der ein GefĂĽhl der Taubheit auf Lippen und Zunge bewirkt" beschreibt ist in wirklichkeit ein intensives prickeln des ganzen Mundes, als stĂĽnde der ganze Rachen unter Strom!

Und das eine viertel-Stunde lang.

Dabei ist der Pfeffer eigentlich nicht scharf - man hat nur einen völlig betäubten Mund - der Geschmack ist wirklich nur als "volle Dröhnung" zu beschreiben.

Genau genommen, bin ich immer noch etwas high...

:) Cooles Zeug.

Nur wie man damit WĂĽrzen soll ist mir noch schleierhaft.

Wie erklärt man Objektorientierung (2)

written by Martin Häcker on

Da hab ich doch tatsächlich meinen ersten Kommentar zu einem Blog-Eintrag erhalten. Per mail von Felix!.

:)

Ja, ich muss noch an der Technik hier schrauben. Wird gemacht. Versprochen.

Hier zum Kommentar:

Richtig verstanden hat man erst wenn man es erklären kann. Das bedeutet aber auch, dass deine Erklärung nicht zu einem vollständigen Verständnis deiner Zuhörer_innen führen kann.

So hab ich diesen Satz noch gar nicht gesehen - aber das steckt da drinnen und ist absolut korrekt.

Allerdings...

Das bedeutet natürlich nicht, dass man sich weniger bemühen sollte auch schon bei der Erklärung eines Konzeptes so viel wie möglich erreichen zu wollen.

... muss man es trotzdem versuchen. Ein Kurs ist ja immer von ganz unterschiedlichen Menschen belegt, die jeder auf einem anderen Level sind.

Das Problem als Vortragender ist da natürlich das ich nicht individuell auf die einzelnen Zuhörer eingehen kann - um das Beispiel zu wählen das ihm am Meisten erklärt.

Das bedeutet aber natürlich auch, das damit jeder aus einem Vortrag etwas anderes mitnimmt. Ein perfekt strukturierter Vortrag gibt damit jedem der ihn hört genau das mit, was er benötigt um weiterzumachen und bietet bei erneutem hören weitere Inspiration.

Ok, das schafft man wohl nicht - aber das Ziel, das man das Material so präsentiert, das der Anfänger einen Einstieg hat, und der der etwas weiter ist, mehr mitnehmen kann - das hab ich schon.

Was ist Objektorientierung?

written by Martin Häcker on

Es heiĂźt ja, das man etwas erst wirklich verstanden hat, wenn man es einem anderen Menschen beigebracht hat.

Nun, mir stellt sich mal wieder die Frage, im Rahmen des Javakurses der Freitagsrunde an der TU-Berlin:

Wie erklärt man Objektorientierung wirklich gut?

Verschiedene Kräfte zerren da an mir:

  • Der Vortrag muss in eine Stunde passen
  • Die Sprache anhand der es erklärt werden muss ist Java
  • Die Studenten haben noch nie eine Programmiersprache gesehen
    • oder vorher eine Funktionale Sprache gelernt, die sie nicht verstanden haben

Was mir am meisten am Herzen liegt sagt Kent Beck in Smalltalk best Practice Patterns einfach wunderschön:

Objects model the world through behavior and state. Behavior is the dynamic, active, computational part of the model. State is what is left after behavior is done, how the model is represented before, after, and during a computation.

Of the two, behavior is the more important to get right. The primacy of behavior is one of the odd truths of objects, odd because it flies in the face of so much accumulated experience. Back in the bad old days you wanted to get the representation right as quickly as possible, because every change to the representation bred changes in many different computations.

Objects (done right) change all that. No longer is your system a slave of its representation. Because objects can hide their representation behind a wall of messages, you are free to change representation and only affect one object.

Nur leider können die Studenten mit dem Vergleich in die alten Tage nix anfangen, denn sie haben ja gerade keine Erfahrung warum die alten Tage schlecht waren.

Immerhin der erste Satz ist brauchbar - und ich werde ihn tunlichst einbringen. Damit ist das Problem doch schon mal zumindest kleiner geworden.

Denkfutter bis zum nächsten mal...

Warum entwickeln immer noch so viele Leute ohne UnitTests?

written by Martin Häcker on

WeiĂź ich nicht, aber ich weiĂź, was fĂĽr Folgen es hat.

Wenn man ohne Tests entwickelt, dann hat man beim Schreiben von z.B. einer Klasse immer den vollen Zugriff auf das gesamte System - und es ist ständig verlockend, nur eben dieses andere Subsystem aufzurufen oder es in die klasse als Instanzvariable einzubinden. Da man kein Korrektiv hat, sind die Folgen dieser Handlungen fast unsichtbar. Die Abhängigkeiten im System nehmen immer weiter zu - und die Architetkur immer weiter ab. :/

Als Testgetriebener Entwickler muss man sich, um den Code in einer Testsuite überhaupt laufen lassen zu können maximal vom Rest des Systems abkapseln. Das bedeutet das man sich bei jeder Abhängigkeit die man dazu nimmt genau überlegt, ob man sie wirklich braucht, ob man sie erreichen kann, indem man einen Parameter übergibt, oder indem man ein Protokoll einführt das die Kommunikation dieser zweier Systembestandteile klärt. Immer macht man sich über die Grenzen der Komponente Gedanken und wie die Kommunikation darüber hinaus abläuft.

Man macht eben nicht einfach nur einen Konstruktorparameter über den dann als globale Variable alles zugänglich ist - den man im Test aber niemals instanziiert bekommt.

Diese Tatsache macht für mich einen der größten Unterschiede zwischen Testgetrieben entwickeltem Code und sonstigem Code aus.

Es ist unglaublich schwierig (auf anhieb) Code zu schreiben der Wiederbenutzbar ist und wenig Abhängigkeiten besitzt - wenn man Code testgetrieben entwickelt bekommt man aber unheimlich viel davon umsonst.

Alleine deswegen darf es heute eigentlich keine Ausrede mehr Geben ohne Tests zu entwickeln.

Die Provider sollen gefälligst P2P verhindern!

written by Martin Häcker on

Fodert Dieter Gorny, Cheff des Bundesverbands der Musikindustrie. Klar.

Spannend finde ich aber das er vorgibt, aus der letztlich erschienen Brennerstudie wäre ersichtlich das sich illegale Downloads um die Hälfte reduziert haben.

Nämlich von 600 Millionen auf 300 Millionen.

Da wĂĽrde ich doch schon mal gerne die Studie sehen, Herr Bundesverband. Und was da genau gefragt wurde. "Wie viele illegale Downloads haben sie im letzten Jahr gemacht?" oder "Sind sie sich im klaren darĂĽber das das herunterladen von Musik aus dem Internet illegal ist?" und direkt danach "Wie viele MusikstĂĽcke haben sie im letzten Jahr heruntergeladen?"

Vielleicht taugt die Studie ja auch und die Leute sind dazu übergegangen Fernsehserien etc. herunter zu laden. Jedenfalls weiß ich nichts darüber das sich die verbrauchte Bandbreite oder der Anteil der P2P-Dienste an der Gesamtbandbreite irgendwie verringert hätte.

Wirklich schade, das man in der Politik nicht seine Quellen offen legen muss, wie in der Forschung. :-/

Transparenz ist doch was feines.

UnitTests auf ein TracPlugin...

written by Martin Häcker on

... sind eine schöne Sache. Wenn man sie denn hinkriegt.

Da wäre zuerst der einfache Fall: Was macht man um eine Wiki-Seite zu erzeugen und zu laden?

Well, hier ist wie es geht:

#!/usr/bin/env python

import unittest

from trac.wiki.model import WikiPage
from trac.test import EnvironmentStub

class PluginTests(unittest.TestCase):

    def test_can_save_and_load_wiki_page(self):
        env = EnvironmentStub()
        page = WikiPage(env, "Foo", None)
        page.text = "barfoo"
        page.save("fnord", "bar", "localhost")

        self.assertEquals("barfoo", WikiPage(env, "Foo", None).text)

Soweit nicht soo schwer. Vor allem sehr schick, das das EnvironmentStub() einem die ganze Arbeit abnimmt um das Trac-Environment UnitTest fähig zu machen. Ein Call und alles ist da - inklusive einer in-memory Sqlite Datenbank.

Nice.

Der eigentliche Hammer ist dann aber, wenn man ein Plugin bauen will das von anderen Plugins abhängt. Das ist nämlich deutlich komplizierter.

Da ergibt sich nämlich das Problem, das man plötzlich das Component-System von Trac verstehen muss, damit man überhaupt auf die Klassen und ExtensionPoints eines anderen Plugins aufbauen kann.

FĂĽr uns um Beispiel das TracTags-Plugin. Dieser Blog basiert auf diesen Tags. Blog-Posts werden durch einen speziellen Tag ("blog") zu einem Blog-Post, Kategorien sind nur Tags und ĂĽberhaupt funktioniert alles nur ĂĽber Tags. Tags sind cool.

Aber, man muss das Plugin erst einmal schwer zur Zusammenarbeit überreden - denn, es benötigt ein Datenbankupgrade damit es überhaupt funktioniert.

Und ĂĽberhaupt ist die Datenbank am Anfang total leer. :/

Um es gleich zu verraten: Die Lösung lag darin, das man dem Environment einerseits sagen muss, das man gerne Standard-Daten hätte und andererseits, welche Plugins es alles aktivieren soll. Nicht schwer. Nur nicht offensichtlich. :(

#!/usr/bin/env python

import unittest

from trac.wiki.model import WikiPage
from trac.test import Mock, EnvironmentStub, MockPerm

from tractags.api import TagSystem

from tractags.model import TagModelProvider

class PostFinderTest(unittest.TestCase):

    def setUp(self):
        self.env = EnvironmentStub(default_data=True, enable=["tractags.*", 'trac.*'])
        self.env.upgrade()        
        self.env.db.commit()


    def test_can_save_and_load_wiki_page(self):
        page = WikiPage(self.env, "Foo", None)
        page.text = "barfoo"
        page.save("fnord", "bar", "localhost")

        self.assertEquals("barfoo", WikiPage(self.env, "Foo", None).text)


    def test_can_add_tags_and_retrieve_tagged_pages(self):
        from trac.web.href import Href
        page = WikiPage(self.env, "Foo", None)
        page.text = "barfoo"
        tag_system = TagSystem(self.env)
        req = Mock(perm=MockPerm(), args={}, href=Href('/'))
        tag_system.add_tags(req, page.resource, ["blog"])
        page.save("fnord", "bar", "localhost")

        self.assertEquals("barfoo", WikiPage(self.env, "Foo", None).text)

        blog_resources = [i for i in tag_system.query(req, "blog")]
        self.assertEquals(1, len(blog_resources))

Mei war das eine Arbeit die ganzen Objekte zusammen zu suchen die man für test_can_add_tags_and_retrieve_tagged_pages() benötigt.

Well, ein start ist gemacht, aus dem wir jetzt einen Page-Loader refactor-n (-ieren?) werden.

Yay!

Heute blog ich nicht

written by Martin Häcker on

Dafür bin ich nämlich viel zu betrunken.

Schließlich hat die Friedrich Ebert Stiftung heute den Wein bezahlt, den ich abgegriffen habe, während ich meine Freundin von einer Veranstaltung dort abgeholt habe.

Das Essen war auch nicht soo toll.

Naja, immerhin der Rotwein.

Ach ja, die Veranstaltung hieĂź: "AuĂźen vor oder mittendrin? Gesellschaftliche Partizipation und Anerkennung erwerbsloser Menschen". An sich spannend, aber die Teilnehmer haben eigentlich alle nur immer die gleichen bekannten Stereotypen von sich gegeben. Wirklich gut fand ich (neben meinem Vater :) dann vor allem Frauke Hehl die mal wirklich gesagt hat was sache ist: Das alle Arbeit haben ist einfach inzwischen eine Illusion der wir uns nicht mehr hingeben dĂĽrfen.

Recht hat sie.

So, und jetzt gute Nacht.

In der Piratenpartei…

written by Martin Häcker on

Das Spannendste an der Piratenpartei sind die, die dabei mitmachen.

Zum Beispiel RKA. Mir ist ein Rätsel, wie er die ganzen Dinge, die er tut, in seine Zeit einsortiert.

  • Bei der Piratenpartei ist er aktiv - bald sogar im Vorstand.
  • Beim AK-Vorrat ist er aktiv - er hat dort z.B. die Abgabe des SchriftstĂĽcks (120 Ordner) fĂĽr die Klage gegen die Vorratsdatenspeicherung mit vorbereitet
  • Privat grĂĽndet er noch diverse Firmen mit
  • Studiert nebenbei noch Wirtschaftsrecht
  • WeiĂź von allen Dingen, wo man sie bekommen kann
  • Hat einen grandiosen Ăśberblick, wo im Internet welche Startups gerade was machen

Einfach beeindruckend.

Was ist das eigentlich,

written by Martin Häcker on

dass Betreiber von Geschäften so überwachungsgeil macht?

Zum Beispiel dieser Eigentümer einer Diskothek. Der erstellt über jeden seiner Besucher ein komplettes Persönlichkeitsprofil, inclusive wann sie bei welcher Bedienung wie viel von welchen Getränken gekauft haben. Und natürlich von wann bis wann sie anwesend waren, woher sie kommen, welche Telefonnummer sie haben, etc.

Das Geilste: die Überwachten Club-Gänger werden dargestellt, als fänden sie das ganz toll. Schließlich müssen sie als Mitglied keinen Eintritt bezahlen und erhalten Zutritt zum Buffet.

Diese Daten werden ewig aufgezeichnet - die Bilder der Ăśberwachungskamera 'nur' mindestens ein halbes Jahr auf dem Privatrechner des EigentĂĽmers.

"Die wollen das doch genau so!" hört man den Betreiber quasi schreien.

Und was wenn er Windows benutzt und jemand bei ihm in das Rechnernetzwerk einbricht und die Daten alle stiehlt?

p.s.: Haben wir da jetzt nicht ein Grundrecht auf Datenintegrität?