{DEVELOPERS SHAME DAY}

Cem hat kürzlich den Developers Shame Day ins Leben gerufen.

Als Stichtag würde ich den 3.11.2010 vorschlagen. Ich stelle mir vor, dass an diesem Tag alle Entwickler, die ein Blog oder eine Seite betreiben, ein kleines Stück Code präsentieren, dass aus heutiger (oder vielleicht auch damaliger) Sicht total hirnverbrannt ist. Ein Stück Code, dass uns selbst die Schamröte ins Gesicht steigen lässt. Dabei ist egal, ob es sich um PHP, JavaScript, CSS, HTML, Java, C oder sonst etwas handelt. Es muss nur von euch sein und es darf nicht verändert werden (umeventuell doch als total verrückter Hund dazustehen ). Ein kleiner erläuternder Text sollte natürlich auch nicht fehlen.

Und das ist mein Beitrag, wohl einer meiner ersten Gehversuche in PHP. Der Quellcode entstammt einer Datei namens „functions.inc.php“ [sic!]. Und es scheint so ;), also wäre es eine größere Anwendung gewesen, ich habe jedoch echt keine Ahnung mehr welche — vielleicht die erste PHP-Homepage in Eigenentwicklung? Die Datei hatte sich irgendwie auf meine „Informatik-Diskette“ [sic!] (Oberstufenkurs) verirrt, von der ich tatsächlich noch ein Abbild hatte. Der Rest der Programmiersünden muss entweder (m)einen Backup-Aufräumaktionen oder einem vor einigen Jahren aufgetreten Backupmediumfehler zum Opfen gefallen sein. Zu meiner Verteidigung kann ich wohl nur sagen hoffen, dass dies einer erste Spielversion war und nie „produktiv“ wurde.

Listing

Bitte in voller Länge genießen. Jede Zeile ist ein Genuss. *ankoppfass*

Unverändert, nur Benutzername/Passwort habe ich ausgeixt.

Datei: functions.inc.php (von 2002 oder 2003)

<?php
//conf.inc.php
//please don't change this file manually - go to your admin-area to change settings!!!
$listname="Meine Linkliste";
$listname2="Downloads";
$linkwidth="100%";
$addpagewidth="50%";
$catorder="name";
$incatsort="Hits";
$perpage="5";
$max_search="10";
$adminpw="a";
$max_desc_leng="500";
$html="ON";
$language="german.lang";
$timeformat="1";
 @include("global/$language"); // language-file
 @include("../global/$language"); // language-file
//connect.inc.php
// DON'T CHANGE THIS FILE MANUALLY - EDIT ONLY VIA ADMIN-AREA
$server="localhost";
$user="xxx";
$pass="xxx";
$mydb="xxx";
$db_prefix="xl_";
$db_prefix2="dl_";
function JPDiv ($a,$b) {
  $i=0;
  $j=0;
  while($j==0) {
    if(($a/($b*($i+1)))>1) {
      $i++;
    } else {
      $j = 1;
    }
  }
return $i;
}
function JPDatumZeit ($a) {
  $JPTag = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
  $JPMonat = array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
  $JPDatumTag = $JPTag[date("w",$a)];
  $JPDatumMonat = $JPMonat[date("n",$a)-1];
  $JPDatumJahr = date("Y",$a);
  $JPZeit = date("H:i:s",$a);
  $b = $JPDatumTag . ", " . date("j") . ". " . $JPDatumMonat . " " . $JPDatumJahr . " [" . $JPZeit . "]";
return $b;
}
function JPDatumZeit2 ($a) {
  $JPDatumJahr = date("Y",$a);
  $JPZeit = date("H:i:s",$a);
  $b = date("j") . "." . date("w",$a)+1 . "." . $JPDatumJahr . " [" . $JPZeit . "]";
return $b;
}
class my_zugriff{
//Variablen für Zugangsdaten
var $user="xxx";		//Benutzername für den MySQL-Zugang
var $password="xxx";		//Passwort
var $host="localhost";	//Name (IP-Adr.) des Rechners mit MySQL
var $dbname="xxx"; 	//Name der Datenbank
//Weitere Variablen
var $db_verbindung=false; //Speichert die Verbindungskennung
var $sql_result=false; //Speichert die Kennung eines ausgewerteten SQL-Befehls
//Konstruktor definieren
function my_zugriff(){
   //Funktion verbinden wird bei Aufruf der Klasse ausgeführt
	 $this->verbinden();
}
//Falls keine Verbindung besteht,
//Verbindung aufbauen und Datenbank als Standard definieren
function verbinden(){
if ($this->db_verbindung==false){
   $this->db_verbindung = @mysql_connect($this->host, $this->user, $this->password);
   if(empty($this->db_verbindung)){
      $this->fehler("Beim Verbinden");
   }
   $auswahl = @mysql_select_db($this->dbname, $this->db_verbindung);
   if(empty ($auswahl)){
      $this->fehler("Beim Ausw&auml;hlen der DB");
   }
   return $this->db_verbindung;
}
}
//Gibt Fehlermeldung aus und beendet das Skript
function fehler($fehlerpunkt){
    echo $fehlerpunkt . " ist ein Fehler aufgetreten!<br>";
		echo mysql_error() . "<br>"; //Fehlerbezeichnung
		echo mysql_errno();	 	 		//Fehlernummer
		echo "</body></html>";		//Html-Tags schließen
		exit;
}
//SQL-Befehl ausführen
function sql_befehl($sql){
$this->sql_result = @mysql_query($sql, $this->db_verbindung);
if (empty($this->sql_result)){
	 $this->fehler("Beim Senden der Abfrage");
}
return $this->sql_result;
}
//Falls zuvor ein SQL-Befehl ausgeführt wurde,
//wird hier das Array mit den Datensätzen ausgegeben
function sql_daten(){
if(!empty($this->sql_result)){
		$sql_array=@mysql_fetch_array($this->sql_result);
		return $sql_array;
}else{
		$this->fehler("Beim Ausgeben der Datens&auml;tze");
}
}
//eig. Fkt
function sql_num_rows($sql){
$this->sql_befehl($sql);
$rows = MYSQL_NUM_ROWS($this->sql_result);
return $rows;
}
}
$db=new my_zugriff();
$db->sql_befehl("SELECT elem_string FROM elem_global WHERE elem_name='JPmyVersion'");
$myVersion_now = $db->sql_daten();
 $JPmyVersion = $myVersion_now[0];
?>

Selbstreflexion

  • Struktur: globale Variablen
  • Struktur/Aufbau: als Script noch okay, aber als Include? Oweh..
  • Includes mittendrin
  • Variabel- und Funktionsnamen multilingual
  • Inhalt der Funktionen..
  • kein gängiger Codestyle (ja, der Blog zeigt’s richtig an)
  • Inline-SQL(!)

Kurzum: What the hell…?

Weitere via Google oder Twitter oder Facebook.

The World’s Fastest Database

Geniale Idee, wie man die Datenbankperformance verbessern kann. Das da früher keiner auf die Idee gekommen ist. m( *

APDB utilizes the physical memory locator (CHS# – Cylinder, Head, Sector) as data-access keys.

Schade, dass das nur mit 3,5″ Platten kommt.

Und wem das nicht reicht, um am Boden zu liegen.. die beiden Kommentare unten drunter sind auch nicht ohne, etwa

No, the solution is to hardcode all of your data in silicon. The processor should have a unique instruction for each database record. You want record 292 of your database? You just execute the machine code instruction FETCH_RECORD_292, and BAM!, you’ve got your record. What if you don’t know the record number, and want to look up a record by its index? That’s what compilers are for, duh.

Ups, verrechnet.

In einer Javaanwendung habe ich vor einigen Tagen einen Faxpaus zum Besten gegeben, da muss man auch erstmal drauf kommen. Nicht eindeutig identifizierbare – sprich primitiven künstlichen Primärschlüssel – Entitäten mussten in eine Ausgabestruktur (JSON/XML) umgewandelt werden. Da nach aussen diese Entitäten aber einen – künstlichen – Schlüssel brauchen, habe ich entsprechend ein Konstrukt gebaut. In abgewandelter Form (natürlich im Original nicht mit System.out, aber es passt der Einfachheithalber genau):

System.out.print(entity1.getId() + '_' + entity2.getId());

wobei die Methode getId() jeweils ein primitives long zurückgibt. Und weil ich ja so sparsam bin, nutze ich auch nur ein Characterzeichen als Seperator. Jaja.. War eine äußerst sparsame Angelegenheit, die dazu führte, das ich heute wie verzweifelt gesucht habe, wieso denn kein String, sondern ein (hoher) numerischer Wert ausgegeben wird. Arg!

Für diejenigen, die diese Anekdote bis hierhin nicht verstanden haben: Macht nichts, scheinbar kein Programmierer 🙂 Die Lösung: Ein Characterzeichen ist natürlich kein String, d.h. Java wird nicht automatisch daraus einen String erstellen. Dementspreched steht dort eine Formel a la „long + int + long“, und dies ist irgendwas, nur nicht das gewünschte.

Große ZIP-Datei verschicken – eine Google-Odyssee

Ein ehemaliger Kommilitone wollte ein paar Dinge geschickt haben; gesagt, getan: 36 20 Megabyte. Seltsamerweise wollte das Mac-like Drag ’n‘ Drop des Verzeichnisses nicht. Die Fehlermeldung, das „googlemail.com“ nur 34 Megabyte zulässt, veranlasste mich daher, etwas aufzuräumen. 🙂 Aber auch die 20 Megabyte wollten nicht, diesmal ohne weitere Erklärung. Auch ein anderer GoogleMail-Account wollte nicht.

Okay, also über das Webinterface (Nervstufe 1). Im Safari wählte ich die Datei und schrieb den kleinen Satz und drückte „Senden“ — und da fiel mir auf, das die Mail gar keinen Anhang hatte? Also, nochmal „Neue Mail“, Datei wählen.. und nix. Kein Anhang.

Okay, also über den Firefox (Nervstufe 2). Die letzten Schritte wiederholt, und er lud auch brav die Datei mit Fortschrittsbalken hoch, nur um mir dann bei gefühlten 99, 999999999999999% (will heißen: die letzten 5 % haben mindestens 10x so lange wie die vorherigen 95% gebraucht) mitzuteilen, dass das Archiv wegen einer ausführbaren Datei nicht akzeptiert wird. Was? Hä? 🙂

Okay, prüfen wir die verf… Dateien (Nervstufe 3). Nun habe ich jede Datei geprüft, aber leider außer gefährlichen PDFs, sensiblen PNGs und potenziell terroristischen JPGs nur eine wirklich – naja, *hüstel* – nennenswerte Datei in irgendeinem Unterordner finden können: dateiname.chm. Warum auch immer. Umbenannt, wieder das Spielchen von vorne, keine Veränderung, Archiv immer noch illegal. (Nervfaktor 4).

Schlussendlich habe ich danach das Archiv.zip in Archiv.zip.itsonlyafuckingzipfile umbenannt und hochgeladen (via Mail).. und alles war wunderbar.

Evolution of Dance – okay, alt.

Wer wenigstens ab und zu mal YouTube-Videos im Netz schaut, dem dürfte das fast legendäre „Evolution of Dance“ bekannt sein.

Dagegen kannte ich die Hochzeitsvariante noch nicht, obwohl nun auch bereits seit zwei Jahren im Netz.

Man darf es mir aber wohl verübeln, wenn soviel Content hochgeladen wird, oder?

Sixt wirbt mit Ulla (Gang 2)

Super, dass man der Frau Ministerin den Dienstwagen in Alecante geklaut hat – das sollte mittlerweile jeder mitbekommen haben. Ist schließlich Sommerloch. Das der Wagen sogar mittlerweile wieder da, vielleicht der eine oder andere auch.

Aber Sixt, durchaus bekannt für manche kreativen Werbeideen, legte bereits am Montag mit einer Werbung vor. Super. Jetzt aber haben sie, meine ich, doch den Vogel abgeschossen. Genial 🙂

Aber seht selbst, via DerWesten!