Drücke „Enter”, um zum Inhalt zu springen.

Veröffentliche Beiträge in “Programmierung”

Ich entdecke und fixe Bugs, schreibe wilde Hacks… sprich: ich programmiere

Schick!

Jan 0

Ich machte mich vorhin ein bisschen auf den Weg durch das Internet, stöberte ein bisschen hier und ein bisschen da. Und was entdeckte ich? Das da. Da muss man nur mit der Mouse drüber fahren und schon gibt es Hilfe, was sich dahinter verbirgt. Musste natürlich sofort in meinen Blog integriert werden und eine kleine Anpassung am Stylesheet, damit der Mauszeiger auch anständig wie ein Fragezeichen aussieht.

Wie das mit den kleinen Tooltips funktioniert? Bitte sehr:

<acronym title="Ich bin ein kleiner lustiger Text.">Wer bist du?</acronym>

Und so sieht das dann fertig aus: Wer bist du?

Böse wird es nur, wenn versucht einen Smiley in dem Tooltip unterzubringen, dann kommt das HTML aus dem Tritt und es funktioniert garnicht. Ich weiß, es ist ein fieser Trick, aber die Tooltips kommen ja auch nur durch das Attribut title zustande. Aber ich finde es eine nette Möglichkeit, kleine Hilfen in den Text zu integrieren, auch wenn es sich nicht um Akronyme handelt.

Arbeitsvorbereitung

Jan 0

Mein PHP-Problem stellte sich als doch sehr simpel heraus, es handelte sich nur um eine Konfigurationseinstellung, dass eine Session automatisch mit der Browseranfrage generiert wird (siehe Screenshot). Fraglich nur, warum ich dann die Session nicht manuell mit session_start() starten konnte. Nachdem ich dieses Problem nun behoben habe, kann ich jetzt einen Entwurf für die Realisierung machen, denn probiert habe ich genug, die Basisfunktionen sind ja bereits implementiert.

screenshot_php

Ich weiß garnicht, wie lange ich mich jetzt schon mit der Auftragsverwaltung herumschlage, in der Zeit hätte ich mir schon längst eine bessere, freie Version aus dem Netz suchen können. Aber hier geht es um das Erweitern des Horizonts. Und PHP war bis dato ja quasi noch ein Fremdwort für mich. Jetzt bin ich schon ein wenig vertrauter mit PHP, mußte ich doch erst ein wenig umdenken, da ich durch Arbeit ein anderes Denken im Bezug auf Webseiten gewöhnt war.

Nachdem ich das Problem der Konfiguration gelöst hatte, war wieder Probierstunde in meiner Küche angesagt. Ich hatte das Rezept auf einem Kochblog gefunden, für lecker befunden und mir die Zutaten geholt und schon konnte es losgehen. Da dem Rezept ein Name fehlt, nenne ich es mal Scharfes Kokoshähnchen.

scharfes_kokoshuehnchen
  • 2 Paprika (rot und grün)
  • 1 Dose Kokosmilch (400ml)
  • Kokosflocken
  • 1 Dose Ananas in Stücken (Abtropfgewicht 350g)
  • 400g Hähnchenbrustfilet
  • 2 cm frischen Ingwer
  • 6 getrocknete Chilischoten
  • 3-4 EL Mangochutney, scharf
  • Öl, Salz, Rosenpaprik (scharf)
  • 200g Basmatireis

Ich finde die Angaben für Ingwer immer etwas schwierig, weil es sich um ein schmales oder breites Stück handeln kann, ich habe mich für ein Stück in der Größe einer Walnuss entschieden. Das habe ich geschält und dann ganz fein gehackt. Dem folgten Paprika, der auch in Stück geschnitten wurde, sowie das Hähnchenfilet, das ich auch mundgerecht zurecht gestückelt habe.

Bei den Chilischoten habe ich mich für frische Schoten entschieden und diese in kleine Stücke zerteilt. Wer es nicht ganz so scharf mag, kann die Kerne entfernen. Da der Reis am längsten in der Zubereitung braucht, kann der in zwischen gekocht werden. Dann erhitzt man eine Pfanne röstet die Kokosflocken an und stellt sie beseite. Mit etwas Öl brät man nun das Hähnchen bis es schön braun ist und stellt die Stücken dann warm.

Als nächstes wird der Paprika zusammen mit dem Ingwer und den Chilis angebraten, später gibt man noch die Ananas hinzu und löscht mit etwas Ananassaft ab. Etwas Salz und Rosenpaprika hinzu und das Mangochutney unterrühren. Abschließend wird die Kokosmilch dazugegossen, etwas eingekocht und dann das Hähnchen sowie die Kokosflocken wieder dazugegeben.

In der Zwischenzeit ist der Reis ja auch langsam soweit und dann kann man servieren. Guten Appetit und viel Spaß beim Nachkochen!

Ein PHP-Buch…

Jan 0

Mit meinem Webspace von http://www.fraktalgrafik.de hab ich auch gleichzeitig die Unterstützung von PHP und MySQL gewonnen. Wollte ich auch so! Also suche ich jetzt nach einem guten Buch die mir einen professionellen Einstieg zu PHP/MySQL ermöglichen. Da ich ein fertiges System nutze, möchte ich keine Installationstipps und als Programmierer brauche ich auch keine Einleitung im Aufbau von HTML. Von daher fielen alle Bücher aus dem Hause Markt+Technik, PHP für Dummies etc. aus. Bücher, die sich professionell nannten waren auch professionell, für Leute, die bereits PHP anwenden. Auch ein Fehlgriff. Also kamen folgende Bücher in die engere Auswahl...

addision_php PRO:
Wie alle Addison-Wesley-Bücher kommt auch dieses Buch schnell dahin, wo man möchte. Alles ist kurz und übersichtlich erläutert.

KONTRA: Leider benötige ich kein Buch, dass mir erklärt, wie SQL-Statements formuliere und wo die Abhandlung von PHP und das Auslesen von MySQL-Abfragen nur ein Viertel des Buches ausmacht.
franzis_php PRO:
Fängt genau da an, wo ich es brauche. Das Inhaltsverzeichnis ist lang, bietet aber gleichzeitig die Befehlsübersicht, die ich suche. Alles wird an Code-Ausschnitten erklärt. Ich hatte beim ersten Durchblättern den Eindruck, dass nichts zuviel und zuwenig ist.

KONTRA:
Man kann bzw. muss zwei Seiten auf einmal lesen. Das Buch ist ca. 4cm dick und enthält über 1000 Seiten. Sprich - das Papier ist äußerst fadenscheinig und damit ist das Buch als Arbeitsmittel und Nachschlagewerk ungeeignet.
oreilly_php PRO:
Bringt es auf den Punkt, genau wie ich es wünsche und enthält sogar als Beispiel einen Webshop, der Schritt für Schritt erklärt wird. Außerdem mag ich das Design der O'Reilly-Bücher (Aber das nur nebenbei)

KONTRA:
Das einzige Buch ohne CD. Man kann sich zwar die Listings herunterladen, aber mir wäre eine CD lieber. Macht sich schöner, wenn man einen Quelltext mal schnell im Editor öffnen will.

Nun ja, ich werde mal eine Nacht drüber schlafen, vielleicht bin ich heute einfach zu kritisch. Obwohl es ja nicht so schwierig sein kann, wenn ein Buch folgendes als Inhalt hat:

  • keine Installationstipps (und wenn dann nur im Anhang)
  • einen kurzen Einstieg in PHP
  • eine Befehlsreferenz für schnelles Nachschlagen
  • Anbindung und Arbeit mit einer MySQL-Datenbank
  • Schrittweises Aufbauen eines komplexen Beispiels, wie z.B. Kundenverwaltung, Webshop o.ä.
  • Quelltexte als CD

Nachdem ich das Angebot jetzt in etwa kenne, werde ich nochmal einen genaueren Blick bei Amazon reinwerfen - deren Angebot ist einfach größer...

Des Rätsels Lösung

Jan 0

Letztens hatte ich ja einen Beitrag mit einem kleinen Programmierrätsel geschrieben. Hier nochmal kurz die Problembeschreibung: Die Routine schneidet bei double-Werte zwischen 0 und -1 das Vorzeichen weg. Nachdem ich die Routine debuggt habe, konnte ich den Fehler auf genau eine Zeile festnageln.

int gruppe = ((long)value)%1000;

Spielen wir das doch mal für folgende Werte durch:

value (double) gruppe (int)
50.0 50
5.0 5
0.5 0
0 0
-0.5 0
-5.0 -5
-50.0 -50

Das Problem ist: Wenn man einen double-Wert auf long castet, geht der Nachkommabereich verloren. Wenn der aber entscheidend für das Vorzeichen ist, wie z.B. bei -0.5, dann geht auch das Vorzeichen verloren, denn -0 gibt es nicht!

Also blieb mir nichts weiter übrig, als den Wertebereich abzufragen und ein Flag zu setzen, dass ich nach der Konvertierung abfrage und dann manuell ein negatives Vorzeichen in den String einbaue.

Weiter geht’s

Jan 0

Heute habe ich mir ein paar Controls vorgenommen und in die Oberfläche eingefügt. Klingt erstmal nicht aufregend, wurde aber spannend, als ich mich mit dem Visual Editor herumschlug und feststellte, dass die Konfiguration des Layouts nicht so funktionierte, wie ich mir das dachte.

Also schnappte ich mir ein paar Tutorials, bis ich gefunden hatte, was ich suchte. Händisch programmierte ich dann das Layout, sowie die Ausdehnungen für die Controls rein und plötzlich konnte der Visual Editor mit Layouts umgehen und schlug mir vor, wohin ich welche Objekte verschieben kann. Der Code, der dabei herauskommt, ist dabei noch jenseits von dem, was ich mir unter ordentlicher Programmierung vorstelle. Also werde ich noch etwas weiter den Prototypen vorantreiben und dann noch mal eine händische, aber ordentliche Programmierung vornehmen.

Jedenfalls sah das Ergebnis heute so aus:

programm_3

Nächstes Mal werde ich mit Scrollbars experimentieren und versuchen Fraktale zu erzeugen, die größer als das dargestellte Fenster sind. Ach so... die Buttons sind noch ohne Funktion - den Listener muss ich auch noch schreiben. Ich wollte nur mal sehen, wie sich Buttons in die Toolbar einbauen lassen, interessant wäre dann noch das Einbinden von Grafiken auf die Buttons. Das "Fertig..." ist auch nur ein Fake, einzig die Funktion Programm->Ende wird schon erfolgreich ausgeführt.

Erste Äpfel…

Jan 0

Ich habe heute abend wieder begonnen, mein Fraktalprogramm zu schreiben. Wieder weil ja mein Rechner komplett zusammengebrochen ist und eine Neuinstallation von Nöten war. Natürlich hab ich die Quellen nicht gesichert. Also hieß es heute komplett von vorn zu beginnen. Zumindest habe ich jetzt den Stand vom ersten Abend nachbauen können und diesmal gleich die Quellen auf eine andere Platte gesichert.

fp_01

Naja, ich hoffe, dass ich bald den Stand wie er auf dem Fraktalblog steht, wieder erreicht habe!

4 c0d3rz 0n7y!

Jan 0

Ich bin immer wieder begeistert, wie buggy eine Routine sein kann. Bei der Umwandlung von double-Werten in einen formatierten String, trat folgendes Problem auf: Die Funktion arbeitet korrekt, es sei denn, man gibt einen Wert zwischen 0 und -1 Euro an, dann geht das Vorzeichen verloren. Alles weitere funktioniert korrekt!

do {   // Rest bilden   int gruppe = ((long)value)%1000;   // nächste Gruppe ermitteln   value /= 1000.0;   // noch mehr da?   if (1.0 < value || -1.0 > value)   {     // mit Nullen auffüllen     // und Punkt setzen     result = "." + String(abs(gruppe),true,3) + result;   }   else   {     // keine Nullen     // Kein Punkt     result = String(gruppe,false,3) + result;   } } while (1.0 < value || -1.0 > value);

Na... wer findet den Bug?

Kleine Schritte

Jan 0

Heute hatte ich mir vorgenommen, die Berechnung und die Anzeige von einander zu trennen. Dazu habe ich in meiner Fraktalklasse aus einer Methode zwei gemacht. Eine zum Berechnen und eine zum Ausgeben. Die Oberfläche wurde davon kaum tangiert. Beim Ausgeben wird nur die Fraktalklasse nach dem Bild abgefragt. Dass das schon berechnet ist, interessiert dabei ja nicht. Ergebnis: Das Scrollen in der Grafik geht schön flüssig und ohne Ruckeln.

programm_5

Dem Berechnen-Button wurde endlich ein Icon verpasst und Funktionalität hinterlegt. Wenn der Button gedrückt wird, wird das Fraktal neu berechnet. Und schon stehe ich wieder vor einem neuen Problem, dass kein Neues ist: Wenn ich auf den Button berechnen drücke, soll der Text der Statuszeile auf "Rechne..." gesetzt werden und sobald er fertig ist, wieder auf "Fertig...". Das Problem äußert sich dann wie folgt: Es bleibt "Gestartet..." stehen, er rechnet und wenn er fertig ist, blitzt kurz was auf und dann steht "Fertig..." da. Woran liegt das? Stichwort: Eventqueue. Wenn der Button gedrückt wird, geht das Programm in den dafür vorgesehenen Zweig der Eventbearbeitung. Solange der Event abgearbeitet wird, müssen andere Events warten. So auch die Events, die das Neuzeichnen der Statuszeile veranlassen.

Demzufolge ist die nächste Aufgabe: Der Buttonevent muss schnell verlassen werden und den Weg frei geben für die Ausgabe der Statusnachrichten. Realisierung: Mit Betreten des Eventhandler wird ein Thread gestartet, der Setzen des Textes, Berechnen und wiederum Setzen des Textes veranlasst.

Was zu einem wirklichen Problem werden kann, ist das Setzen einer benutzerdefinierten Palette. Momentan adressiere ich die Werte für die Pixel direkt, d.h. ich benutze jeweils einen Wert für jeden der RGB-Kanäle. Realisierungsmöglichkeiten:

  1. Eine Übersetzungstabelle zwischenschalten, die mir die RGB-Werte für einen bestimmten Abbruchwert liefert. Nachteil dabei ist, dass diese Tabelle 16,7 Millionen Einträge hat.
  2. Abbildung über eine Formel: Anhand der Formel kann ich aus dem Abbruchwert den RGB-Wert berechnen. Diese Methode ist allgemein bei Fraktalgeneratoren üblich.

Und gegen abend – Regen

Jan 0

Nachdem ich heute morgen schon mal aufgezählt habe, was den vorteilhaft gegenüber einer Fahrt mit dem ÖPNV ist, fiel mir heute nachmittag noch etwas ein....

Begonnen hat das Ganze mit einer ewig langen Suche nach Bugs im meinem Programm. Und wer schon mal ein Programm zerlegen und wieder zusammensetzen mußte, weiß wovon ich rede. So stolperte ich von einem Bug zum anderen. Das erstaunliche daran war, dass ich viele gefunden hab, die sonst niemand entdeckt hätte. Gegen 16:30 Uhr glaubte ich meinem Ziel unglaublich nahe und packte schon mal alles zusammen. Doch mein Test ergab, das Ergebnis stimmte, aber die Teilsummen nicht. Also ging die Suche weiter. Ungefähr 2 Bugfixes und keine Änderung später sah ich mich schon morgen wieder auf Arbeit kommen, da der Fehler bis Donnerstag gefixt sein mußte und wir Sachsen morgen unseren teuer bezahlten Buß- und Bettag haben.

Um es mal mit Alanis Morissettes Worten zu sagen:

And life has funny way of helping you out when You think everything's gone wrong und everything blows up In your face

Denn 17:45 Uhr ging auf einmal alles auf. Die Gesamtsumme stimmte, die Teilsummen stimmten, es gab keine Rundungsfehler. Unter anderem machte sich folgender Bug breit... Es darf wieder mal geraten werden.

unsigned long Toolbox::RundeToCent(double value) {   // Rückgabewert   unsigned long rc = 0;   // einige Konvertierungen   [...]   // Rundung ab 0.5 auf nächsten vollen Wert   // sog. buchhalterisches Runden   rc = (unsigned long)value;   if (0.0 < value)   {     if (value - rc >= 0.5)       ++rc;   }   else   {     if (value - rc <= -0.5)       --rc;   }   // Rückgabe   return rc; }

Und dabei ist es doch so offensichtlich. Auf jeden Fall ging ich noch schnell in die Kaffeeküche und schaffte meine Tassen weg. Ich sah schon die nasse Scheibe und als ich ging, rannte ich schnell bei strömenden Regen zum Auto. Ich dem Moment war ich wieder froh, mit dem Auto auf Arbeit gefahren zu sein. Außentemperatur 3-4°C und dann Regen ist einfach hässlich. Auf dem Heimweg hatte es an etlichen Stellen Unfälle gegeben unter anderem mitten auf einer Elbbrücke, was für mich bedeutete, dass ich gut eine halbe Stunde für 300-400 Meter brauchte, aber es war warm. Aber die Straßenbahn stand auch - ein weiteres Pro für das Team Rüedi + Speedy.

Käfer

Jan 0

Jeder Programmierer hatte schon mal einen - einen Bug. Aber das die Bugs auch noch in Kategorien eingeteilt werden, machte mit auch erst heute ein Kollege klar. Bei den Bugs unterscheidet man folgende:

Heisenbug

Nach der Heisenbergschen Unschärferelation benannter Bug, der verschwindet oder sein Verhalten verändert, wenn er untersucht wird. Prominentestes Beispiel ist, wenn man ein Programm in der Release-Version erstellt hat und dann wieder eine Debug-Version erstellt und der Fehler dann verschwindet.

Bohr Bug

Der Bohr-Bug verhält sich gegensätzlich zum Heisenbug. Genau wie das Bohrsche Atommodell ist dieser Bug komplett nachvollziehbar und verändert sein Verhalten nicht. Also der klassische Computerbug.

Schrödingbug

Der Schrödingbug ist ein ganz witziger Bug - nachempfunden nach Schrödingers Gedankenexperiment mit der Katze, die gleichzeitig tot und lebendig ist, bis jemand nachgesehen hat und somit den Zustand festlegt. Übertragen auf den Bug ist der Fehler im Programm solange bis jemand sich den Quellcode ansieht und den Fehler feststellt. Ab diesem Moment bricht das Programm an dieser Stelle ab und hört erst damit auf, wenn der Bug entfernt wurde. Ziemlich unwahrscheinlich...

Mandelbug

Nach dem Amerikaner Mandelbrot benannter Bug, dessen Auftreten nicht bestimmt werden kann, weil die Komplexität des Systems sehr hoch ist, sodass sein Auftreten chaotisch ist. Der Mandelbug wird häufig dem Heisenbug gleichgesetzt, meiner Erfahrung nach verteilt sich ein Mandelbug auf mehrere Heisen-, Schröding- und Bohr-Bugs.

Quelle: Wikipedia (engl.)

WordPress Cookie Hinweis von Real Cookie Banner