Subscribe to RSS Subscribe to Comments

Mitja Schmakeit

Bereits 88.65% des Tages sind vergangen. Das bedeutet übrigens, dass es jetzt 21:16:33 Uhr ist!

WTFJS? WTFPHP?

Es gibt eine nette kleine Seite, die sämtliche Unlogik von Javascript sammelt und auflistet.. nennt sich wtfjs.com.
Das gleiche sollte es unbedingt auch für PHP geben.. in welcher anderen Sprache ist so etwas möglich:

<?php
define(KONSTANTE, 'NOCH_EINE');
define(KONSTANTE, 'hallo');
echo NOCH_EINE;
?>

Die Ausgabe:
hallo

Warum das so ist? Wenn man ein nicht-Schlüsselwort (also fast jede beliebige Zeichenkette) ohne Anführungszeichen schreibt, prüft PHP, ob es eine Konstante mit diesem Namen gibt. Wenn ja, wird der Wert dieser Konstante dafür eingesetzt. Wenn nicht, wird es aus einem unverständlichen Grund wie ein String behandelt. Und da KONSTANTE im Beispiel zuerst noch keinen Wert enthielt, wurde also eine Konstante mit dem Namen ‘KONSTANTE’ angelegt. Beim zweiten mal existierte sie dann, also wurde ihr Wert, ‘NOCH_EINE’, für sie eingesetzt. Schon öhm.. cool.

SQL at it’s best

Nur für Leute mit ein wenig Ahnung von Datenbanken – viel Spaß ;)

The Year Table, Row 51, and other Database Oddities

The Joel Test

zum Joel Test: 12 Steps to Better Code

Bday!

Ich suche ein paar Leute, die schon immer mal ein Online-Adressbuch und Geburtstagskalender haben wollten… oder zumindest einsehen, dass es Sinn macht, solche Daten Online zu lagern, damit man von überall auf der Welt an sie heran kommt, auch wenn das Handy versagt o.Ä.

Ich habe momentan ein Miniprojekt namens “Bday”, welches am Ende genau diese Dinge – und zwar möglichst sicher – können soll. Momentan gibt es noch keine Verschlüsselung, dies wird aber unter den Dingen sein, die demnächst hinzukommen (und zwar symmetrisch per JavaScript, sodass niemand außer einem selbst die Daten lesen kann. Wenn ich _niemand_ schreibe, meine ich damit auch die Router und den Server. Nur man selbst soll diese Daten wieder entschlüsseln können).

Auf jeden Fall suche ich dafür ein paar Alphatester (Die Daten, die gespeichert werden, bleiben natürlich auch erhalten, wenn das Miniprojekt Beta geht, d.h. es ist jetzt schon voll benutzbar und ausfallsicher). Einfach mal hier in die Kommentare schreiben oder mich ansprechen..

AJAX => HTTPS

Ist es möglich, via Ajax einen Diffie-Hellman-Schlüsselaustausch (also asymmetrisch) vorzunehmen und danach dann alle Daten vom Server nur noch verschlüsselt zu übertragen, wobei dann der Server und das Ajax-Framework immer selbst ver- und entschlüsseln? Sodass man quasi eine sichere Verbindung über ungesichertes HTTP vornehmen kann? Wäre wohl zu testen.

Ich habe jetzt nicht gegoogelt, ob es das schon gibt.

Not available

Bin krank. Btw, wie würde es gefallen, das Aussehen des Blogs generell auf sowas umzustellen? Habe ja vor, Wordpress ein wenig besser in Joomla einzubinden.

Was ganz anderes: Ich wurde von Peter auf die Möglichkeit hingewiesen, in vip durch diverse Zeichen in der Suche aus dem RegEx auszubrechen und somit Parser-Fehler zu erzeugen. Ich sollte alle Zeichen erwischt haben, die diese Fehler verursachten. Die Suche läuft jetzt auch mit diesen Zeichen. Des weiteren wird “Aufgaben” als Vertretungslehrer in der zensierten Version nun wieder als “Aufgaben.” angezeigt. Außerdem leitet http://mitja.cc/vip (ohne .php) jetzt auf den Vertretungsplan weiter.

Vertretungsplan, die nächste

emte wies mich darauf hin, dass der Vertretungsplan nicht Anonym genug sei und die Namen darauf für Außenstehende zu viele Informationen preisgeben. Ich hatte da bisher nicht drüber nachgedacht, bin aber zu dem Schluss gekommen, dass Datenschutz in dem Fall durchaus sinn macht. Ich habe den VertretungsPlan Improved (vip) ein wenig abgeändert. Folgende Änderungen gab es:

  1. In der normalen Ausgabe werden die Namen der Lehrkräfte bis auf einen Buchstaben nicht mehr angezeigt.
  2. Schülern der BBS-BL darf persönlich die Adresse genannt werden, unter der der vip unzensiert erscheint, d.h. alle Namen vollständig sind. Diese Version ist ohnehin nur dann nötig, wenn man unbedingt wissen will, wen man nun als Vertretungslehrer hat.
  3. Der vip sieht jetzt um einiges besser aus.
  4. Die offizielle Adresse lautet nun http://mitja.cc/vip.php.

Vertretungsplan läuft wieder

Meine XHTML-valide Version des Vertretungsplans unserer Schule läuft wieder.
Zu finden ist er weiterhin unter
http://mitja-schmakeit.de/vip.php
und jetzt auch unter dem noch leichter zu merkenden
http://mitja.cc/vip.php

Danke an Alex (der “<3-Alex” ist gemeint) für das Melden des Fehlers.

Rekursives Array…

Igitt: Die Supervariable $GLOBALS in PHP, die bekanntlich alle definierten Variablen als Arrayelemente enthält, enthält auch sich selbst… >.<
<?php
$i = "Test<br>\n";
echo $GLOBALS["i"];
echo $GLOBALS["GLOBALS"]["i"];
echo $GLOBALS["GLOBALS"]["GLOBALS"]["GLOBALS"]["GLOBALS"]["GLOBALS"]["GLOBALS"]["i"];
?>

Gibt aus:

Test
Test
Test

Was für einen Sinn macht das.. hätte man die Variable nicht als “alle Variablen außer sich selbst” definieren können?

So far, sinnlose Gedanken zum Sonntagabend.

Vertretungsplan

Ich möchte an dieser Stelle nochmal auf den Vertretungsplan unserer BBS Burgdorf-Lehrte hinweisen. Dieser ist unter http://mitja-schmakeit.de/vip.php zu finden. Vorteile meines Scripts:

  • Aufgeräumtes, valides XHTML :-) (Ok, ich weiß, solang ne Seite in _eurem_ Browser funktioniert, wen stört da html? Im vergleich zig Errors bei der Originalseite)
  • Keine nervige auswahl welcher Standort oder ob Rolltext oder nicht
  • Zusätzlich eine Suchbox oben links, mit der ihr beliebige Einträge markieren lassen könnt.. die Sucht nach jedem Text auf der Seite.. also einfach eure klasse eingeben, oder einen lehrer.. und schon wirds markiert.

Wenn jemand ne eigene Homepage hat und auf den Vertretungsplan verlinken möchte, mit einem Voreingestellten Suchwert:
einfach http://mitja-schmakeit.de/vip.php?suche=euresuche benutzen.

Viel Spaß in den Ausfallstunden.

Exec-PHP Test

Dies ist ein Exec-PHP Test.
Ich bin ein Held, ich kann die Zahlen von 1 bis 100 ausgeben..: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
btw: Hab mal ne Archiv-Seite eingebaut. Zu finden im Menü links unter “Pages”.

todo-liste

Ich merke doch so langsam, dass es durchaus sinnvoll ist sich mal aufzuschreiben was man noch alles zu tun hat, wenn man Zeit hat oder nicht weiß was man machen soll, weil man irgendwie solche Sachen dann doch dauernd vergisst. Deshalb führe ich seit zwei Wochen eine todo-Liste.. und die halte ich sogar aktuell :-)

Meine Todo-Liste ist nur eine Textdatei, ein Todo pro Zeile und davor eine Rangnummer.. z.B.:

1 Physik lernen
3 IT lernen
7 Führerschein Theorie lernen
8 KK-Anträge Domains
.
.
.

Wenn ich dort eine Zeile anfüge, will ich die natürlich nicht selbst einsortieren. Das übernimmt also “sort” für mich, ein sehr nützliches Linux-Programm. Ein sehr kleiner Codeschnipsel (geschrieben in bash) automatisiert selbst diesen Aufruf von sort (+ schreiben in tmp-Datei + zurückkopieren):

#! /bin/bash
if [ "$1" == "" ]; then
        echo "No filename given" 1>&2
        exit 1;
fi
if  test -e $1; then
        sort -g $1 | egrep -v "^$" > /tmp/sorttmp
        mv /tmp/sorttmp $1
        exit 0;
else
        echo "File does not exist" 1>&2
        exit 2;
fi

Organisiert noch wer seine Todos? Ich wette wenn überhaupt, dann Handschriftlich, oder? ;P

mcrypt

Ihr, die ihr irgendwann einmal die mcrypt-Funktionen von php nutzen möchtet, merkt euch folgendes: mcrypt_decrypt() bei PHP gibt den String mit einem bis unendlich vielen (warum überhaupt oO?!) terminierenden Null-Char \0 zurück, damit es dem ausgangsstring entspricht muss es also getrim()mt werden. (Und zwar nur mit dem NUL-Zeichen)

<pre><?php
$instr = “Wer das liest ist toll “;
echo “instr: $instr\n”;
$pw = “ganzsicherespasswort”;
$algo = MCRYPT_BLOWFISH;
$mode = MCRYPT_MODE_ECB;
$iv_size = mcrypt_get_iv_size($algo, $mode);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
echo “iv: $iv\n”;
$enc = mcrypt_encrypt($algo, $pw, $instr, $mode, $iv);
echo “enc: $enc\n”;
$outstr = mcrypt_decrypt($algo, $pw, $enc, $mode, $iv);
$outstr = trim($outstr, “\0″);
echo “outstr: $outstr\n”;
echo “instr is “;
if ($instr != $outstr) { echo “NOT “; }
echo “equal to outstr\n”;
echo “instrlen: “.strlen($instr).”\n”;
echo “outstrlen: “.strlen($outstr).”\n”;
?></pre>

(hier steht keine Überschrift)

Der auf http://german-bash.org/29073 beschriebene Regex

(?:^|”)(http|ftp|mailto)*:*(//)*(\w+(?:[\.:@]\w+)*?)(?:/|@)?([^"\?]*?)(?:\?([^\?"]*?))?(?:$|”)

ist Müll und fast keiner der outputs ist zu verwenden (zum überprüfen auf eine richtige URL geht es wohl gerade noch..).

Meiner ist viel toller und gibt noch dazu nur sinnvolle sachen aus :) :

([a-zA-Z]{3,})://([^/]+)(?:.(=?[^\?]*/))*([^\?]*)(?:\?(.*))?

Aber das schreiben des Ausdrucks war für mich leider ein reiner Lerneffekt (soll heißen es war absolut SINNLOS den Mist da zu schreiben), da PHPs parse_url() viel Effektiver und besser arbeitet und ich eigentlich nur nach so einer Funktion gesucht habe :(

Informatik…

Morgen schreiben wir eine Informatik-Klausur.
Die Arbeit vom letzten Jahr findet ihr bei der becci ;) . Ich poste hier die Antworten auf die Arbeit, und übe so schonmal.. ;)

  1. Aufgabe:

    Codieren sie das folgende Struktogramm:

    Struktogramm #1
    Anmerkungen: Es fehlt die Angabe der Sprache, in der das Codiert werden soll.
    Lösung:

    /* Code on this blogentry by Mitja Schmakeit is licensed under the terms of the WTFPL, Version 2 and comes without any warranty. */
    #include <iostream>
    
    using namespace std;
    
    int main (void)
    {
    	cout << "Geben Sie eine Zahl ein: ";
    	float i;
    	cin >> i;
    	if (i < 0)
    	{
    		cout << i << endl << "i ist eine negative Zahl" << endl;
    	}
    	else
    	{
    		cout << i << endl << "i ist eine positive Zahl" << endl;
    	}
    	return 0;
    }
    

    Das sollte wohl jeder hinbekommen, der auch nur halbwegs anwesend war im Unterricht. Sehr dumm an der Aufgabe ist es, dass im Struktogramm selbst steht, dass i erst _nach_ der Abfrage ausgegeben werden soll. Schlauer wäre natürlich, das vorher auszugeben, da es ja in jedem Fall ausgegeben wird.

  2. Aufgabe:

    Gegeben ist der folgende Programmausschnitt:

    	int x = 12;
    	int *px = &x;
    	printf( "*px hat den Wert %d\n", *px );
    	printf( "px hat den Wert %p\n", px );

    Was wird in Zeile 3, was in Zeile 4 ausgegeben?

    Lösung:
    In Zeile 3 wird der Wert 12 ausgegeben, da der Pointer px durch den * referenziert wird, und man dadurch den Inhalt von x erhält. Dieser wird von printf() als %d, also "digit" (Dezimalzahl), ausgegeben.
    In Zeile 4 wird die Speicheradresse von x als hexadezimale Zahl ausgegeben, da px nicht referenziert wird und somit einfach die Adresse von x zurückgibt. px wird also von printf() als %p, also "pointer" (Hexadezimalzahl), ausgegeben.

    Das mit den Pointern kann sehr verwirrend werden. Ich hatte vor Monaten ein Tutorial dazu geschrieben, welches ihr hier finden könnt. Ich hoffe es ist verständlich...

  3. Aufgabe:

    Zeigen Sie, wie ein zweidimensionales Feld mit der Bezeichnung "Messwerte" mit 3*3 Feldern deklariert wird, welche zunächst mit dem Integerwert 4 initialisiert werden.

    Lösung:
    (Anm.: Ich verwende den Ausdruck "Array" lieber, da Feld einfach nicht so Ausdrucksstark ist...)

    	float Messwerte[3][3];
    	for (int x = 0; x <= 2; x++)
    		for (int y = 0; y <= 2; y++)
    			Messwerte[x][y] = 4;
    

    Ihr wisst hoffentlich noch, dass man die geschweiften Klammern {} nach for (und auch allen anderen) weglassen kann, wenn danach nur genau EINE Anweisung folgt, die in diesen Block gehört. Deshalb funktioniert das so, wie es da steht.

  4. Aufgabe:

    Zeigen und erläutern Sie wie der Wert des Feldes "in der Mitte" ausgelesen werden kann.

    	cout << Messwerte[1][1] << endl;
    

    Dieser Code gibt das Feld "in der Mitte" des zweidimensionalen Arrays aus, das wir in voriger Aufgabe erstellt haben. Da Arrays mit dem Index [0] beginnen, ist der Bereich 0-2 und nicht 1-3. Deshalb ist das Feld "in der Mitte" auf "Position" [1][1].
    (Anm.: Ich habe keine Ahnung, was ich zu der Aufgabe sonst noch hinschreiben sollte? Fällt noch wem was ein?)

  5. Aufgabe:

    In das Feld text[20] wurde der String "Hallo Lehrte" geschrieben. Geben Sie die mit Hilfe der Zeile:

    cout << text[1]; cout << text[14];
    

    erzeugte Ausgabe an und erläutern Sie diese.

    Lösung:
    Bei text[1] wird ein "a" ausgegeben, da dieses Zeichen an der 2. Stelle im Array steht. Bei text[14] kann die Ausgabe nicht vorausgesagt werden, da dieser Teil nicht initialisiert wurde. Lediglich bis text[12] (was ein Null-Char '\0' enthält) lässt sich die Ausgabe voraussagen.

    Hierfür sollte man wissen, dass Strings nicht anderes als Arrays sind, weswegen man genau so auch Zeichen herausholen kann. Das erste Zeichen ist dabei wieder die [0]. Strings enden immer mit dem Null-Char '\0', das Anzeigt, dass der String hier zuende ist.

  6. Aufgabe:

    Was geschieht, wenn das Feld wie folgt deklariert wird: text[10] und anschließend der String "Hallo Lehrte" geschrieben würde. Begründen Sie Ihre Aussage.

    Lösung:
    "Hallo Lehr" wird in das Array geschrieben, alles darüber hinaus wird sehr Wahrscheinlich nicht geschrieben, es sei denn, der dem Array nachfolgende Speicherbereich ist vom eigenen Programm allokiert (zugeordnet). Meist wird der nachfolgende Speicherbereich aber von einem anderen Programm oder gar nicht benutzt, sodass der Prozessor diesen Schreibzugriff verhindern wird, und der String letzten Endes nicht komplett geschrieben werden kann.

  7. Aufgabe:

    Aus wie vielen Elementen besteht das Feld, das mit der Zeile "char w2[]= "Test";" deklariert und initialisiert wird?

    Lösung:
    Das Array besteht aus 5 Elementen. Die ersten vier beinhalten den eigentlichen String, das letzte Element enthält das terminierende Null-Zeichen '\0'.

Keine Gewähr für irgendeine Richtigkeit, bei Fehlern dürft ihr trotzdem kommentieren ;) Fragen auch ab in die Kommentare, ich werde gegen 19 Uhr nochmal hereinschauen und beantworten, falls was da ist. Ich glaube desweiteren, dass wir morgen eine schwerere Arbeit mit Klassen und Objekten vorgesetzt bekommen. Viel Glück euch allen...

Nächste Seite »

Based on FluidityTheme Redesigned by Kaushal Sheth Sponsored by Web Hosting Bluebook