Archive for the ‘Informatik’ Category

Berechnen der nten Wurzel (Python, Scheme)

Tuesday, June 17th, 2008

Einmal von Python, um meinen alten Beitrag fuer Quadratwurzeln zu uebertrumpfen, und zum anderem per Scheme, um einfach die unglaubliche Ausdrucksfaehigkeit der Sprachen der LISP-Familie zum Ausdruck kommt.

Man koennte, natuerlich auch die mathematische Grundlagen von Python/Scheme ausnutzen und n**1/root (bzw. (expt n 1/root)) rechnen lassen und somit sich gar nicht um die Implementierung eines Verfahrens zur Berechnung einer Wurzel kuemmern; allerdings kann man davon nichts lernen.

Python:

from decimal import Decimal

def callRecNthroot(num=1, approx=1, root=2, steps=5):
    if approx == 1:
        approx /= root
    num, approx = Decimal(str(num)), Decimal(str(approx))
    return recNthroot(num, approx, root, steps)

def recNthroot(num, approx, root, steps)
    if steps > 0
        return recNthroot(num, (1/root)*((root-1)*approx + (num/(approx**(root-1))), root, (steps-1))
    return approx

Eigentlich ganz verstaendlich, bis auf ein paar Einfluesse von mir und meinem eher funktionalen Hintergrund, der auch Faulheit enthaelt.

foo /= n

bedeutet

foo = foo/n

. Meinen funktionalen (Wtf? `funktionen’? War ich da besoffen?) Hintergrund sieht man bei der tail-recursion: Ich packe alle Veraenderungen in den erneuten Funktionsaufruf, auch wenn das recht nervig ist, wenn man das aus dem Kopf heraus macht. Der neue Wert von approx stimmt; das ist das Newtonverfahren, wenn man nicht ableiten kann bzw. gerade keine Ableitfunktion (ist sehr kurz) schreiben moechte. Ich habe in Python einfach mal das `steps’-Argument benutzt, anstatt eine Praezision zu definieren; solange man eine nicht allzu ferne Naeherung angibt, so sind i.d.R. alle Stellen bis steps^2 korrekt.

Scheme:

(define (enough-prec? a b prec)
        (< (abs (- a b)) prec))

(define (nthroot n root)
        (lambda (x)
                (cond
                        ((enough-prec? n (expt x root) 0.0001) x)
                        (else ((nthroot n root) (* (/ 1 root) (+ (* (- root 1) x) (/ n (expt x (- root 1))))))))))

(Der letzte Teil ist so ziemlich das Gleiche.)

Man ruft die Funktion per ((nthroot n root) <approximation>) (Vergessen, dass HTML die Kleiner- und Groeßerzeichen frisst.) auf; fuer die Leute, die kein Scheme koennen. Die Annaeherung sollte moeglichst eine Dezimalzahl sein, da Scheme ansonsten ganz stolz eine rationale Zahl hervorbringt, die u.U. lang und unverstaendlich ist. (Probiert etwa mal ((nthroot 1000 3) 15); zwar bekommt man schnell etwas zurueck, allerdings hat das bei mir in Guile fast 2 Zeilen verschlungen.) Nun aber zum Code: Die Funktion (enough-prec?) nimmt 3 Argumente; zwei Zahlen, die sie voneinander subtrahieren soll und danach den Betrag davon berechnen soll, und eine Praezision; recht trivial, noch. Jetzt kommen wir zur Hauptfunktion: Ich benutze (lambda), um eine anonyme Funktion zu benutzen, die recht nett und praktisch sind. In ihr benutze ich (cond), um zwei Faelle zu unterscheiden: Zum einem, ob genuegend Praezision erlangt wurde; falls dies der Fall sein sollte, so spuckt er meine Annaeherung aus. Wenn nicht, wird er (nthroot) mit selbem n und root, aber einem neuen Argument fuer (lambda), aufrufen; eine tail-recursion; oder eher mies uebersetzt: Endrekursion. Der Trick dabei: Durch (enough-prec?) wird er solange weiterrechnen, bis man die gewollte Praezision hat; hier ist es 0.0001.

Was wohl eher auf einem Taschenrechner landet? Letztere Methode, mit so viel Genauigkeit, wie der Rechner Stellen anzeigt. Durch einen Tastendruck wird wohl eine Abstraktionsfunktion, sagen wir mal (nroot) aufgerufen, die n und root benoetigt und daraus eine sinnvolle Approximation macht. Wenn der Wert zu hoch ist, etwa ((nthroot 8 3) 64), so koennte er ewig weiterrrechnen. (Die Naeherungsmethode wuerde so eine immer groeßer werdende Naeherung herausgeben.)

(so long and (more (fun understanding)))

Programmiersprachen

Tuesday, June 3rd, 2008

Neben meines Schreibanfalls wegen dieser verdammten Maus, habe ich mir heute mal wieder ein paar Gedanken zum Thema Programmiersprachen gemacht; vor allem, da ich ja Lisp (derzeitig am ehesten Scheme durch das SICP) lerne und es - imo - eine Ausdrucksfaehigkeit hat, die von keiner anderen Sprache angegriffen werden kann. Allerdings: Wenn man allein durch die Ausdrucksfaehigkeit seine Sprache waehlt, so programmiert man in einem Vakuum; man laesst den Luftwiderstand - oder, um es passender zu formulieren, den “Ich-entwerfe-noch-einmal-das-Rad-und-zwar-doppelt-so-gut”-Faktor - weg.

Was ist denn dieser komische Faktor? Einfach: In Python (oder ein Java, wer diese gehypte Sprache mag) hat man schon eine Menge von Libraries, die einem vieles abnehmen. Du musst HTML parsen? Kein Problem - Python hat dafuer schon ‘ne Lib - `Modul’ auf Pythonisch. In Scheme sucht man vergeblich nach so ‘ner Lib - es soll ja eine abgespeckte Version von Common Lisp, der gigantischen Multiparadigmapsprache, die mehr Augen hat, als Java Libs, sein. (Das Standard von Scheme passt eigentlich fast gar in den Index des Standards von CL; da erkennt man den unglaublichen Unterschied zwischen diesen beiden Dialekten von Lisp.)

Wenn man sich traut, sich diese Libs selbst zu schreiben - und nebenbei produktiv zu sein, d.h. etwas anderes machen als die Libs zu schreiben - dann soll man es ruhig tun. Klar - es ist ein gigantischer Gewinn, wenn’s um Faehigkeit geht, aus dem geringem, welchem man in Scheme hat, solche Libs zu bauen - allerdings hat der schlechte Javaprogrammierer, waehrend der Schemeprogrammierer unglaublich produktiv seine Libs macht, schon laengst seinen Auftrag erledigt. CL hat nicht allzu viel von diesem Defizit; dafuer wollen aber viele schon wegen den Sexps (“S-expressions”, ihr notgeilen Deppen!) und der komischen Makrosyntax gar nichts davon wissen - obwohl beide eben den LISP-Programmierer so unglaublich maechtig machen.

Insofern kann man sagen, dass CL - auch wenn es so gigantisch ist und, nebenbei bemerkt, ein veraltetes Librarysystem hat - durchaus eine Alternative zu Java ist. Bloß warum wird CL nicht oefters benutzt? Weil Java einfach nur richtig dick von Sun gehypt wurde. CL ist schneller, besser und ausdrucksfaehiger als Java - und je mehr Personen eine Sprache nutzen, desto mehr Libs wird es dafuer geben. (Nebenbei bemerkt: Manche Compiler von Scheme schaffen - wirklich - eine Geschwindigkeit von Code, die die Herrschaft von C im Bereich der Geschwindigkeit angreift - und diese Compiler sind selbst in Scheme geschrieben.)

Jetzt knallt’s - was weiß ich die wievielte

Tuesday, June 3rd, 2008

So, gut, ich komme von der Schule heim. In der letzten Stunde, selbstverstaendlich, Franzoesisch - Hassfach, beschissene Sprache und so. So, denkt man man kaeme heim, kann sich ausruhen, den Computer anschalten und dachte ebenso am vorigen Abend, dass die Maus nach einem laengeren Ausschalten wieder funktionieren wuerde - nichts da! Nein, natuerlich funktioniert die Maus nicht. Also, Windoof booten, mal schauen ob sie da auch nicht funktioniert. Ja, wie ich es liebe, sie funktioniert da auch nicht. Naja, gut, klauen wir mal die Maus von der Mutter - ist ja ‘ne Kabelmaus - und probieren die aus. Nein, funktioniert auch nicht - #”§%!

Gut, vielleicht zeigt der Monitor das nicht mehr an; er ist ja arg in die Jahre gekommen. Schnappen wir uns den Monitor, hieven wir ihn hoch (gar nicht so leicht, wenn man keine Muskeln hat und eher auf seinen Bauch setzt) und stellen ihn ca. 6m Nichtluftlinie entfernt auf den Esstisch. Den anderen Monitor aus dem Zimmer meines Bruders holen; den sollte ich eh schon laengst benutzen, laut ihm. Oh, Schreck, oh Graus, schon das Menue in GRUB sieht graesslich aus! (Oh, Schreck, oh Graus, das sieht ja gar wie ein Reimchen aus!). Ubuntu probieren - nein, die PS/2-Maus funktioniert immer noch nicht. Resetten, da ich komischerweise per Tab nicht auf das Teil zum Herunterfahren komme. Windoof booten - keine Maus funktioniert. Loggen wir uns mal ein. Firefox per 1337en Faehigkeiten aus Tab und den Pfeiltasten aufrufen - mal in einem Forum fragen, ob da wer einen Gedanken dazu haette. Nebenher noch einen IRC-Klienten, den ich fuer solche Notfaelle auf Windoof installiert habe, starten.

Okay, im Forum meint jemand, dass die Anschluesse am PC nicht sauber waeren - dann haette das graduell im Laufe der letzten Tage zugenommen, aber egal; ich habe ja nur erwaehnt, dass das vor ein paar Tagen so war - und sich trivial loesen ließ - und das jetzt wieder so ist. Zum anderem kam jemand, den ich IRL kenne, mit dem eher sarkastisch gemeinten Kommentar, dass mein Motherboard kaputt waere; gut moeglich, allerdings wuerde da mehr nicht mehr funktionieren. So, gut, deren Ideen mit einem Post invalidiert.

Mittlerweile ist der Server des Forums abgestuerzt und der IRC-Chat fuellt sich mit Leuten, die absuchten wollen; natuerlich koennen die mir nicht helfen. Nach ein paar simplen Fragen und ein paar geringfuegig sarkastischen Kommentaren zu der Unhilfsbereitschaft von manchen Personen wurde ich gekickbant - aeußerst sozial, insbesondere, wenn ein Sop da anwesend war, der gerne mit seiner Sozialitaet prahlt und mir doch sagt, wie asozial ich doch sei und es ein Segen sei, dass er mich auf seiner Ignorierliste habe.

Nach der guten alten Informatikerweisheit, dass etwas Ruhe fuer den PC, nachdem Murphys Gesetz zugeschlagen hat, Wunder wirken soll, habe ich ihn fuer ein paar Minuten ausgeschalten. Bla, bla, etwas Orwell gelesen, mich ueber meinen idiotischen Physiklehrer aufregt und so weiter und so fort. Aber dann! Oh Schreck, oh Heil, die Kabelmaus funktioniert unter Ubuntu.

Und nun poste ich das hier, mich selbst fragend, warum zur inexistenten Hoelle die Kabelmaus funktioniert, aber die Funkmaus nicht, obwohl das Funkkeyboard funktioniert. Frage an die Leser: Was zur Hoelle war das? (Selbst ich bin in diesem Falle unwissend. Ich koennte allerdings zu jeder Zeit annehmen, dass mein Computer zur Frau mutiert - das erklaert alles. Das ist aber eher unwahrscheinlich.)

Mein kleines Bootabenteuer

Saturday, April 19th, 2008

Seit ein paar Monaten habe ich immer wieder mit GRUB zu kaempfen. Keine Ahnung, ob es daran liegt, dass GRUB irgendeinen miesen Bug hat oder die Ubuntus einfach nur keine Ahnung von Bootloadern haben. Jedenfalls werde ich mal hier eine meiner Odysseen aufschreiben:

Heute, ausgerechnet an einem ganz guten Tag, stehe ich auf und habe Kopfschmerzen. Gut, die machen eh nichts, habe ich eh meistens. Aber, aber! Ich will mich ja heut etwas ausruhen und erfreuen … hmm, schnell noch was ueber die Proportionalitaet der schweren und traegen Masse unter Ubuntu lesen, dann rebooten. Dabei erinner’ ich mich an dieses doofe Grub, welches meint, dass meine Ubuntuplatte auf (hd0) ist, obwohl sie auf hdb ist (genauer: hdb1, in Grubsyntax also (hd1,0)). Ah, naja, wenigstens erkennt es ja Windoof richtig. Jut, was ham wir da? Diablo II, natuerlich. Schnell noch ein paar Musikdateien in Winamp einwerfen, dessen Interface keine Chance gegen das von XMMS hat, und dann spielen.

So weit so gut. Median rockt. Spiel ich so vor mich hin, als dann ploetzlich mein Bildschirm schwarz wird und mein Sound streikt. Gut, Windoof ist eh Scheiße, rebooten. Nochmal Diablo II und so. Gleiches Spiel. Gedanke: “Ach, fick dich du scheiß Windoof, ich formatier’ dich in den naechsten Tagen. Geh ich eben meinem ueblichen Ge*nixe nach.” Hach, wie schoen das doch gewesen waere, denn: Resetten (eingedeutscht, zusaetzliches t, damit es phonetisch korrekt ist; ich mag eigentlich keine Anglizismen, allerdings brauch man das halt in der deutschen *nix-Community, oder *nix-Gesellschaft, fuer die Germanisten) und dann mit leckerem, toastbrotartigem Pizzabrot in der Hand lesen, dass sdb1 corrupt sein soll. Danach noch das selbe mit sdb3 und sda1. Hach … hochfahren tut er dann trotzdem, obwohl man nicht tut sagen tut. So, gut, Logs durchschaun, nichts. Hmm, hda1 ist nicht gemountet, mal mit “mount /dev/sda1 /media/hda1”, oder so, mounten. Ach, nee, ja, sudo. Nee, nee, da meckert die Konsole rum: Die Partition wurde nicht richtig runtergefahren.

Achtung, Achtung, nun forciere ich Grub hda1 zu mounten, indem ich in /etc/fstab noch am Ende der Optionen meines Windoofeintrags ein “force” einfuege. Rebooten. Ubuntu booten. Schoen, klappt alles. Allerdings zeigt es mir vorher noch an, dass die NTFS-Partition immer noch irgendwie am Laufen ist. Gut, neu booten, Windoof versuchen zu booten. Mit ueblichen “root (hd0,0)” und so, klappte ja alles vorher. Nichts. Dann eben “rootnoverify (hd0,0)”. Schoen, beim Booten habe ich nun einen Technosound, der nur einer wiederholt falschen Eingaben gleichkommen kann. Resetten. Ubuntu hochfahren und kurz das man von Grub konsultieren. Gut, gut, ich soll’s mit “map (hd0) (hd1)” und “map (hd1) (hd0)” probieren. Fangfrage: Wo wird das platziert? Anscheinend nach “rootnoverify (hd0,0)”. Denn dann konnte ich endlich, verdammt nochmal, Windoof booten und es richtig herunterfahren.

Oh, was fuer eine Odyssee. Immerhin habe ich nun mal wieder mehr Erfahrung mit Grub. Ab mit der Loesung in das Cheat Sheet, welches ich in letzter Zeit hier ansammle. Wird schon noch frueh genug veroeffentlicht. Nee, nee, das wird in mehreren Dingsen erscheinen.

Regexen als Passwoerter

Tuesday, March 18th, 2008

Dieser geniale Einfall ist mir, nachdem ich mich selbst durch das re-Modul von Python gequaelt habe, gerade eben gekommen. Jedenfalls: Wie zur Hoelle soll jemand auf ein Passwort wie re.compile('M?A?C?R?O?\\D?(utilizer|user))' (2 Backslashes, da man in Python den Backslash escapen muss - ja, mit Absicht kein raw string.) kommen? Noch ein uebliches Sicherheitsschmankerl à la %&/(! am Anfang hinknallen und sich aufschreiben, was fuer einen Regex man braeuchte. (Der Regex, nebenbei erwaehnt, sucht nach 5 bestimmten, optionalen Buchstaben (’M', ‘A’, ‘C’, ‘R’, ‘O’) und danach nach einem optionalen Buchstaben, der beliebig ist, um danach das ganze nach ‘utilizer’ bzw. ‘user’ zu untersuchen.)

QED. Regexen lohnen sich als Passwoerter. Zumindest sind sie erheblich sicherer als die 08/15-Idiotenpasswoerter von manchen Leuten, die etwa nur ‘god&jesus’ als Passwort haben. (Uebrigens ist das das Passwort des Vatikans; nicht weitersagen!)

Was ist ueberhaupt der korrekte deutsche Plural von Backslash? Ich will nicht “umgekehrter Schraegstrich” schreiben, da ich der Ansicht bin, dass Backslash ein deutsches Wort wie Internet ist. Ueberhaupt: Der Duden akzeptiert schon “googlen”, da sollte das googolen und der Backslash nicht weit entfernt sein.

So long.