tobias.bloggt

von weiten reisen, nerdigen skripten und kreativem agenturleben

Archiv für die Kategorie ‘agenturgeschichten




Fol­gen­des Sze­na­rio: Ein Daten­bank­ta­belle ent­hält alle Bank­leit­zah­len Deutsch­lands in­klu­sive der Kurz­be­zeich­nung der Bank. 20.107 Daten­sätze (Stand 04/2009). Al­ler­dings ent­hält die Daten­bank viele dop­pelte Daten­sätze die ge­löscht wer­den sol­len 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, Du­blet­ten zu fin­den und zu lö­schen habe ich nicht her­aus­ge­fun­den, des­halb habe ich mir ein kur­zes php-Script dazu ge­schrie­ben.
An­mer­kung: Bei 20.000 Daten­bank­ein­trä­gen musste ich dazu je­doch die max_execution_time in der php.ini von 60 (Se­kun­den) auf 320 er­hö­hen. Ob dies bei ei­nem Pro­duk­tiv­sys­tem sinn­voll ist, sei da­hin­ge­stellt, das Script lief bei mir lo­kal auf dem Rech­ner und ich habe die Ände­rung so­mit 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 />&nbsp;&nbsp;';
 
        // 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 da­mit ca. 12.000 Du­blet­ten aus der BLZ-Tabelle lö­schen und die Daten­menge so­mit um mehr als 50 % reduzieren.

Für den Ein­satz in ei­nem an­de­ren Daten­bank– und Pro­jekt­um­feld müs­sen die Daten­bank­ab­fra­gen, die HTML-Textausgaben und even­tu­ell auch ei­nige Va­ria­blen an­ge­passt bzw. um­be­nannt werden!

Ich über­nehme keine Ge­währ für die Rich­tig­keit des Skripts und hafte so­mit auch nicht für even­tu­ell ent­stan­dene Schä­den durch fal­schen Ein­satz auf Dritt– oder Produktivsystemen!


Man­che Me­dia­Wiki–Ver­sio­nen, schein­bar be­vor­zugt auf Ubuntu-Betriebssystemen, er­lau­ben den Upload von docx- oder xlsx–Dateien nicht. Das sind die neuen Microsoft-Office-Dateien im XML-Format.

Wir ha­ben eine Weile ge­braucht bis wir zu ei­ner Lö­sung ka­men, aber die funk­tio­niert jetzt auch perfekt.

Das Pro­blem liegt an der MimeTyp-Erkennung für diese …x-Dateien. Per Kom­man­do­zeile auf Ubuntu mit file -bi wird als Mi­me­Type application/x-zip aus­ge­ge­ben. Die Wiki-Software er­kennt die Dateien je­doch als application/zip und of­fi­zi­ell lau­ten die Mi­me­Ty­pes wohl noch­mal ganz anders.

Klä­ren wir je­doch erstein­mal die Aus­gangs­lage. File-Upload im Wiki ist ak­ti­viert, und die Datei­ty­pen docx und xlsx sind dem Ar­ray $wgFileExtensions in der LocalConfig.php hin­zu­ge­fügt. Beim Upload der ent­spre­chen­den Da­tei, er­hält man dann je­doch die Feh­ler­mel­dung "The file is corrupt or has an incorrect extension. Please check the file and upload again."

Die Lö­sungs­vor­schläge auf der MediaWiki-Seite ha­ben uns al­ler­dings nicht ge­hol­fen, und das un­ter #Ubuntu quirks ge­nannte PHP-Modul konn­ten wir nicht aktivieren.

Die Wiki-Software mappt in der Da­tei mime.types im Ord­ner /includes File-Extensions auf Mi­me­Ty­pes. Das Pro­blem ist, dass docx und xlsx dort nicht vor­kom­men. Da wir je­doch wis­sen, dass diese Dateien in­tern als application/zip er­kannt wer­den, kön­nen wir die File-Extensions zu die­ser Liste hin­zu­fü­gen (ent­spre­chende Hil­fe­seite).

Da­nach er­hal­ten wir je­doch die Feh­ler­mel­dung, dass der Upload von Dateien mit Mi­me­Type application/zip nicht er­laubt sei. Nun gut, das wäre dann das klei­nere Pro­blem. Me­dia­Wiki führt eine in­terne MimeType-Blacklist die auch die­sen Ein­trag ent­hält. Also ko­pie­ren wir das Ar­ray von die­ser Seite in un­sere LocalConfig.php und kom­men­tie­ren den Ein­trag application/zip aus.

Und schon klappt der Upload!


Das war 2008…

… in Ar­beits­stun­den für mein Startup

mite_report_2008.gif

236 Stun­den

habe ich im ver­gan­ge­nen Jahr in mein Star­tup [me­dia­ver­sal] ge­steckt. Um­ge­rech­net in „nor­male“ Ar­beits­tage à 8 Stun­den wä­ren das dann ca. 30 Tage.

Hört sich erst­mal nicht viel an. We­ni­ger als 10 % des Jah­res. Nun ja, das ist ja nicht mein Haupt­ge­schäft – denn in ers­ter Li­nie bin ich ja wohl mal Stu­dent. Und zum sim­plen Ver­gleich: Das Stu­dium mit 2 Se­mes­tern à 16 Se­mes­ter­wo­chen hat im­mer­hin 160 Tage be­an­sprucht ;-)

Die meiste Zeit da­von habe ich laut mite mit PHP-Programmierung ver­bracht, ge­folgt von klas­si­schen HTML oder CSS-Aufgaben. Der Schwer­punkt lag also ganz deut­lich im Web-Bereich. Und da­mit fühle ich mich auch ganz wohl…


Vor ziem­lich ge­nau ei­nem Jahr habe ich an die­ser Stelle un­ter dem Ti­tel „In­tel­li­gen­tes Ska­lie­ren von Bil­dern“ über eine Bildbearbeitungs-Technologie na­mens „Seam Car­ving“ ge­b­loggt. Ein Kol­lege in mei­ner ehe­ma­li­gen Prak­ti­kums­firma Meyle&Müller hatte die Grund­la­gen die­ser Tech­nik par­al­lel zu zwei is­rae­li­schen Ent­wick­lern ent­wi­ckelt und in sei­nem Blog ver­öf­fent­licht.

Was da­mals ver­mu­tet, aber noch nicht ver­öf­fent­licht wurde, war die Tat­sa­che, dass Adobe die Tech­nik der zwei Is­rae­lis be­reits ein­ge­kauft hatte und in die nächste Photoshop-Version in­te­grie­ren wollte.

Ich hatte das Thema nicht mehr ver­folgt, bis ich vor ei­ni­gen Ta­gen­über die CS4-Ankündigung bei Ulf Theis ge­stol­pert bin.

SeamCarvingCS4Und tat­säch­lich, die neue CS4 Ver­sion von Pho­to­shop ent­hält die Tech­nik zum in­tel­li­gen­ten, in­halts­be­zo­ge­nen Ska­lie­ren von Bil­dern. Ein klei­nes Demo-Video auf der Adobe-Website de­mons­triert die Funktionalität.

Wer mehr über die Tech­nik er­fah­ren will die die­ses Ver­fah­ren er­mög­licht, der schaue sich das Vi­deo auf www.seamcarving.com an und lese par­al­lel mei­nen oben ver­link­ten al­ten Blogeintrag…

—————
© Bild(er): Adobe Systems Inc.


Ich ar­beite gerne und viel mit Schrif­ten – sei es im Stu­dium oder für mein Star­tUp. Schrift­klas­si­fi­zie­run­gen nach DIN habe ich zum Glück aber nie aus­wen­dig ler­nen müs­sen. Und wenn doch, wäre die­ser kurze Youtube-Clip be­stimmt hilf­reich ge­we­sen. Schön ge­macht finde ich :-)

You need to a flashplayer enabled browser to view this YouTube video

–––––

Und wie ihr seht bin ich ge­rade frisch von der drupa zu­rück. Bil­der und ein kur­zer Be­richt wer­den in kürze folgen.




    Kanada-Urlaub

    Was bis­her ge­schah: Van­cou­ver, Van­cou­ver Is­land, Vic­to­ria, To­fino, Van­cou­ver, Har­ri­son Hot Springs, Fra­ser Can­yon, Hell’s Gate, Kam­loops, Cle­ar­wa­ter, Blue Ri­ver, Jas­per, Lake Louise, Banff, Cal­gary, Ed­mon­ton, Kam­loops, Adams Lake, Lyt­ton, Burnaby, Vancouver

    Statusleiste

    tobias.twittert



tobias.bloggt

    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 Medien­tech­no­logie" 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!