von weiten reisen, nerdigen skripten und kreativem agenturleben
Folgendes Szenario: Ein Datenbanktabelle enthält alle Bankleitzahlen Deutschlands inklusive der Kurzbezeichnung der Bank. 20.107 Datensätze (Stand 04/2009). Allerdings enthält die Datenbank viele doppelte Datensätze die gelöscht werden sollen um Platz zu sparen.
CREATE TABLE IF NOT EXISTS `bankcode` ( `ID` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT, `Bankleitzahl` VARCHAR(8) NOT NULL, `Kurzbezeichnung` VARCHAR(50) NOT NULL, PRIMARY KEY (`ID`), KEY `Bankleitzahl` (`Bankleitzahl`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='Bankleitzahlen' AUTO_INCREMENT=20108;
Code: SQL-Tabellenstruktur
Eine reine SQL-Möglichkeit, Dubletten zu finden und zu löschen habe ich nicht herausgefunden, deshalb habe ich mir ein kurzes php-Script dazu geschrieben.
Anmerkung: Bei 20.000 Datenbankeinträgen musste ich dazu jedoch die max_execution_time in der php.ini von 60 (Sekunden) auf 320 erhöhen. Ob dies bei einem Produktivsystem sinnvoll ist, sei dahingestellt, das Script lief bei mir lokal auf dem Rechner und ich habe die Änderung somit für gut heißen können.
<?php /** * Dubletten finden und löschen * @author Tobias Fischer / tobias (at) mediaversal (punkt) de * @date 2009-04-12 */ // Datenbankverbindung aufbauen /* ... */ // Anzahl der Datensätze auslesen und ausgeben $result = mysql_query("SELECT `ID` FROM `bankcode`;"); $datensaetze = mysql_num_rows($result); echo 'Datensätze: '.$anzahl.'<br /><br />'; // Arrays erstellen die in den for-Schleifen verwendet werden $dubletten_ids = array(); //zählt die Dubletten eines Datensatzes $overall_ids = array(); // zählt die Gesamtanzahl der Dubletten // Erste Schleife - durchläuft jeden der 20.000 Datensätze einzeln for($i=0;$i< $datensaetze;$i++) { if(!in_array($i, $overall_ids)) { $fid = mysql_result($result,$i,0); $result2 = mysql_query("SELECT * FROM `bankcode` WHERE `ID` = " . $fid . ";"); for($k=0;$k<mysql_num_rows($result2);$k++) { $bcid = mysql_result($result2,$k,0); $blz = mysql_result($result2,$k,1); $kurz = mysql_result($result2,$k,2); // Sucht nach Datensätzen mit gleicher BLZ und gleicher Kurzbezeichnung // AND `ID` <> '".$bcid."' schließt den aktuellen Datensatz aus $result3 = mysql_query("SELECT `ID` FROM `bankcode` WHERE `Bankleitzahl` = '" . $blz . "' AND `Kurzbezeichnung` = '" . $kurz . "' AND `ID` <> '" . $bcid . "';"); // Mache weiter falls Dubletten vorhanden sind if(mysql_num_rows($result3) != 0) { // Durchläuft die Ergebnismenge und speichert alle ID's der gefundenen Dubletten for($m=0;$m<mysql_num_rows ($result3);$m++) { $dubletten_ids[$bcid][$m] = mysql_result($result3,$m,0); } echo '<br />'; echo 'BLZ "'.$blz.'" und Kurzbez. "'.$kurz.'" (ID: '.$bcid.') kommen unter folgenden IDs nochmals vor:'; echo '<br /> '; // Aktuelles Dubletten-ID-Array nochmals durchlaufen und // a) ID's ausgeben // b) jede ID im Array $overall_ids speichern // dies hat den Zweck, dass Datensätze mit dieser ID in der ersten Schleife übersprungen werden // da sonst eine Dopplung vorliegen würde while(list($key,$value) = each($dubletten_ids[$bcid])) { $overall_ids[] = $value; echo '<span '; // Um die Dubletten sofort zu löschen, folgende Zeilen einkommentieren /* $delete = mysql_query("DELETE FROM `bankcode` WHERE `ID` = " . $value . " LIMIT 1;"); if($delete) { echo ' style="color:green;"'; } else { echo ' style="color:red;"'; } */ echo '>'; echo $value; echo ',</span> '; } echo '<br />'; // Frühzeitige Übergabe an den Browser flush(); } } } } echo '<br />'; // Gesamtanzahl aller Dubletten echo count($overall_ids); ?>
Code: PHP-Code-Snippet
Ich konnte damit ca. 12.000 Dubletten aus der BLZ-Tabelle löschen und die Datenmenge somit um mehr als 50 % reduzieren.
Für den Einsatz in einem anderen Datenbank– und Projektumfeld müssen die Datenbankabfragen, die HTML-Textausgaben und eventuell auch einige Variablen angepasst bzw. umbenannt werden!
Ich übernehme keine Gewähr für die Richtigkeit des Skripts und hafte somit auch nicht für eventuell entstandene Schäden durch falschen Einsatz auf Dritt– oder Produktivsystemen!
Manche MediaWiki–Versionen, scheinbar bevorzugt auf Ubuntu-Betriebssystemen, erlauben den Upload von docx- oder xlsx–Dateien nicht. Das sind die neuen Microsoft-Office-Dateien im XML-Format.
Wir haben eine Weile gebraucht bis wir zu einer Lösung kamen, aber die funktioniert jetzt auch perfekt.
Das Problem liegt an der MimeTyp-Erkennung für diese …x-Dateien. Per Kommandozeile auf Ubuntu mit file -bi wird als MimeType application/x-zip ausgegeben. Die Wiki-Software erkennt die Dateien jedoch als application/zip und offiziell lauten die MimeTypes wohl nochmal ganz anders.
Klären wir jedoch ersteinmal die Ausgangslage. File-Upload im Wiki ist aktiviert, und die Dateitypen docx und xlsx sind dem Array $wgFileExtensions in der LocalConfig.php hinzugefügt. Beim Upload der entsprechenden Datei, erhält man dann jedoch die Fehlermeldung "The file is corrupt or has an incorrect extension. Please check the file and upload again."
Die Lösungsvorschläge auf der MediaWiki-Seite haben uns allerdings nicht geholfen, und das unter #Ubuntu quirks genannte PHP-Modul konnten wir nicht aktivieren.
Die Wiki-Software mappt in der Datei mime.types im Ordner /includes File-Extensions auf MimeTypes. Das Problem ist, dass docx und xlsx dort nicht vorkommen. Da wir jedoch wissen, dass diese Dateien intern als application/zip erkannt werden, können wir die File-Extensions zu dieser Liste hinzufügen (entsprechende Hilfeseite).
Danach erhalten wir jedoch die Fehlermeldung, dass der Upload von Dateien mit MimeType application/zip nicht erlaubt sei. Nun gut, das wäre dann das kleinere Problem. MediaWiki führt eine interne MimeType-Blacklist die auch diesen Eintrag enthält. Also kopieren wir das Array von dieser Seite in unsere LocalConfig.php und kommentieren den Eintrag application/zip aus.
Und schon klappt der Upload!
11 Feb
… in Arbeitsstunden für mein Startup
habe ich im vergangenen Jahr in mein Startup [mediaversal] gesteckt. Umgerechnet in „normale“ Arbeitstage à 8 Stunden wären das dann ca. 30 Tage.
Hört sich erstmal nicht viel an. Weniger als 10 % des Jahres. Nun ja, das ist ja nicht mein Hauptgeschäft – denn in erster Linie bin ich ja wohl mal Student. Und zum simplen Vergleich: Das Studium mit 2 Semestern à 16 Semesterwochen hat immerhin 160 Tage beansprucht
Die meiste Zeit davon habe ich laut mite mit PHP-Programmierung verbracht, gefolgt von klassischen HTML oder CSS-Aufgaben. Der Schwerpunkt lag also ganz deutlich im Web-Bereich. Und damit fühle ich mich auch ganz wohl…
Vor ziemlich genau einem Jahr habe ich an dieser Stelle unter dem Titel „Intelligentes Skalieren von Bildern“ über eine Bildbearbeitungs-Technologie namens „Seam Carving“ gebloggt. Ein Kollege in meiner ehemaligen Praktikumsfirma Meyle&Müller hatte die Grundlagen dieser Technik parallel zu zwei israelischen Entwicklern entwickelt und in seinem Blog veröffentlicht.
Was damals vermutet, aber noch nicht veröffentlicht wurde, war die Tatsache, dass Adobe die Technik der zwei Israelis bereits eingekauft hatte und in die nächste Photoshop-Version integrieren wollte.
Ich hatte das Thema nicht mehr verfolgt, bis ich vor einigen Tagenüber die CS4-Ankündigung bei Ulf Theis gestolpert bin.
Und tatsächlich, die neue CS4 Version von Photoshop enthält die Technik zum intelligenten, inhaltsbezogenen Skalieren von Bildern. Ein kleines Demo-Video auf der Adobe-Website demonstriert die Funktionalität.
Wer mehr über die Technik erfahren will die dieses Verfahren ermöglicht, der schaue sich das Video auf www.seamcarving.com an und lese parallel meinen oben verlinkten alten Blogeintrag…
Ich arbeite gerne und viel mit Schriften – sei es im Studium oder für mein StartUp. Schriftklassifizierungen nach DIN habe ich zum Glück aber nie auswendig lernen müssen. Und wenn doch, wäre dieser kurze Youtube-Clip bestimmt hilfreich gewesen. Schön gemacht finde ich
–––––
Und wie ihr seht bin ich gerade frisch von der drupa zurück. Bilder und ein kurzer Bericht werden in kürze folgen.
Hej hej, jag heter Tobias och är tjugofyra år gammal. Das, liebe Freunde der Sprachenkultur, war Schwedisch. Und nochmals auf deutsch: mein Name ist Tobias und ich bin 24 Jahre alt. An der Hochschule der Medien in Stuttgart habe ich acht Semester "Druck- und Medientechnologie" studiert. Anfang 2007 habe ich mich mit [mediaversal] selbstständig gemacht, meinem StartUp das mir die Zeit des Studiums etwas versüßte. Seit April 2011 arbeite ich jedoch festangestellt bei der pagina GmbH und entwickle und gestalte E-Books. Und was sonst noch so los ist erfahrt ihr hier im Blog!