10. Dezember 2016 21:21

spickzettel cuesplit

von robert 5. Jul 2012 17:17 (vor 1619 Tagen) ~ comments (0)

cuebreakpoints input-one-big-file.cue | shnsplit -o flac input-one-big-file.flac

./flac2mp3.sh (siehe archlinux-wiki)

#! /bin/sh

for a in *.flac; do
   OUTF=${a%.flac}.mp3

   ARTIST=$(metaflac "$a" --show-tag=ARTIST | sed s/.*=//g)
   TITLE=$(metaflac "$a" --show-tag=TITLE | sed s/.*=//g)
   ALBUM=$(metaflac "$a" --show-tag=ALBUM | sed s/.*=//g)
   GENRE=$(metaflac "$a" --show-tag=GENRE | sed s/.*=//g)
   TRACKNUMBER=$(metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g)
   DATE=$(metaflac "$a" --show-tag=DATE | sed s/.*=//g)

   flac -c -d "$a" | lame -m j -q 0 --vbr-new -V 0 -s 44.1 - "$OUTF"
   id3 -t "$TITLE" -T "${TRACKNUMBER:-0}" -a "$ARTIST" -A "$ALBUM" -y "$DATE" -g "${GENRE:-12}" "$OUTF"
done

Tod dem BOM!

von robert 1. Mär 2012 15:16 (vor 1745 Tagen) ~ comments (0)

It seems kind of stupid to add a byte order mark to a file for which there cannot be any byte order confusion, so you will not be surprised to learn that the practice of adding BOMs to UTF-8 files is being driven by Microsoft. In its online library, you’ll find this gem:

Always prefix a Unicode plain text file with a byte order mark, which informs an application receiving the file that the file is byte-ordered.

Even when the file is not byte-ordered. Ugh.

von hier: http://www.leancrew.com/all-this/2010/09/duh-bom/

#!/usr/bin/perl -i.bak -p
s/^\xef\xbb\xbf//;

Ubuntu ändert meine IP Adresse

von Jens Rietdorf 18. Aug 2010 09:25 (vor 2307 Tagen) ~ comments (1)

Probelem:

Ein neu eingeirichteter Server (Ubuntu 10.04) bekommt nach dem ersten neustart eine statische IP-Adresse statt der standardmäßigen dhcp Konfiguration. Jedoch nach einiger Zeit bekommt der Server wieder per dhcp eine neue IP-Adresse zugewiesen und ist über die Alte nicht erreichbar. Was ist passiert? lange Zeit ratlosigkeit, dann aber ein einfall: apparmor.

apparmor kontrolliert regelmässig die Netzwerkverbindungen. Wird dann eine pid unter /var/run/dhclient.eth0.pid gefunden wird die IP-Adresse erneuert, und die Konfiguration unter /etc/network/interfaces einfach mal ignoriert.

also /var/run/dhclient.eth0.pid löschen und alles funktioniert.


nur so zum spaß: json lesbar ausgeben (php json pretty print)

von robert 9. Aug 2010 18:51 (vor 2315 Tagen) ~ comments (0)

function json_pretty_print($json, $nl="\n", $tab="  "){
   $fn_pp = function($c) use($nl, $tab){
      static $level=0;
      if($c == '{' || $c == '[') return($c . $nl . str_repeat($tab, ++$level));
      if($c == '}' || $c == ']') return($nl . str_repeat($tab, --$level) . $c);
      if($c == ',') return(',' . $nl . str_repeat($tab, $level));
      if($c == ':') return ": ";
      return $c;
   };
   return join('"', array_map(function($j) use($nl, $tab, $fn_pp){
     static $in_str=true;
     if($j[strlen($j)-1]!="\\") $in_str = !$in_str;
     if(!$in_str) return join('', array_map($fn_pp, str_split($j)));
     return $j;
  }, explode('"', json_encode(json_decode($json)))));  
}

scala: new wave javac

von robert 17. Nov 2009 16:28 (vor 2580 Tagen) ~ comments (0)

scala ist ein der vielen neuen sprachen, die auf der java VM laufen. derzeit erfährt das ding ne menge hype. zwar ist scala statisch typisiert.. aaaber mit einem tollen typensystem, das deduktiv die datentypen erkennt und damit umständliche deklarationen vermeidet. ich habe mir gerade einen text von james strachan durchgelesen. der verdiente java veteran ist begeistert und sieht in scala einen möglichen nachfolger für java.

danach habe ich gleich einen seiner links zu den IBM developerWorks angeklickt und bin ganz schön ins kichern geraten. aber seht selbst:

def filterFeed(feed:Elem, feedId:String):Seq[Node] = {
   var results = new Queue[Node]()
   feed\"entry" foreach{(entry) =>
     if (search(entry\"service"\"id" last, feedId)){
       results += (entry\"user"\"nickname").last
     }
   }
   return results
 }

 def search(p:Node, Name:String):Boolean = p match {
   case <id>{Text(Name)}</id> => true
   case _ => false
 }

der code soll ein xml dokument filtern, indem es alle tags /entry/service/id mit einer zeichenkette vergleicht. das sieht aus wie, ähm, eine perleske parodie auf eine skriptsprache. faszinierend die search() funktion: man baut sich ein tag mit einem content-node, den man mit dem test-node vergleicht. warum nicht direkt den text vergleichen? naja und das case _ soll so eine art default sein… sieht so die zukunft von java aus? manchen leutchen ist einfach nicht zu helfen.

achja. hier das zitat zur fantastischen mustererkennung:

This function uses one of the most powerful features of Scala, its pattern matching. In this case, you compare the input node against a node named id that has a child text node made of the Name string passed in to the function. If there is a match, the function returns true. The syntax case _ matches everything else. The _ is again being used a wildcard in Scala. A statement like case _ is similar to a default clause in a case statement in Java or C++ code. This is a pretty simple example of the power of pattern matching in Scala


php 5.3: der namespace separator

von robert 6. Nov 2009 21:48 (vor 2591 Tagen) ~ comments (0)

ich freu mich so tierisch, dass php namespaces bekommt. ohne namespaces war es immer so wie wenn einen die leute immer nur mit vornamen anreden. ich merke immer erst so spät, dass ich gemeint bin, wenn jemand „robert“ sagt.

den entwicklerzauberkünstlern ist ein wahres wunderwerk an eleganz gelungen. das mehrjährige warten hat sich gelohnt. wir bekommen das hübscheste trennerzeichen des ganzen planeten: den sogen. backslash (\)

com\arschgeil\cms\form\button::show();

wow. das sieht cool aus. ich hatte mir ja auch schon überlegt, welchen trenner man nehmen könnte. da mir das bakslasch bisher unvertraut war (ich brauchte jetzt erstmal ne minute, um das auf meiner tastatur zu finden) bin ich selber natürlich nicht auf diese idee gekommen. mir schwebte eher ein zusammengesetztes zeichen vor (wegen der rückwärtskomtiblibität). also meine idee war: %!$~#

com%!$~#arschgeil%!$~#cms%!$~#form%!$~#button::show();

auch nicht schlecht, oder?

UPDATE: ich sehe gerade: andere leute haben auch tolle ideen. wie wäre es mit so:

com:)arschgeil:)cms:)form:)button::show();

hier gefunden


verrückte welt

von robert 12. Okt 2009 02:20 (vor 2617 Tagen) ~ comments (0)

meine kleine heile welt ist mal wieder aus den fugen geraten. in thüringen will die spd mit der cdu die regierung bilden, anstatt mit linke und grünen. ähm, was heisst die spd? matschie will es - und die parteimitglieder? eher nicht. vllt wird es in thüringen erstmals seit etlichen jahren eine urabstimmung in der spd geben. cool wäre das schon… was bisher geschah: matschie verhandelt „am rande der selbstverleugnung“ mit den fiesen typen (chaos!) von der linken. er und seine 3 unterhändler haben von der (stabilität garantierenden) cdu ministerposten angeboten bekommen, aber von linke und grüne nicht das alleinernennungsrecht der ministerpräsidentIn. für eine 18% partei ist das natürlich die pure selbstverleugnung. vorher: althaus ist mit seiner partei im schönen thüringen dermaßen abgeschmiert, dass er zurücktreten mußte. jetzt heisst es: weiter so! wir leben in der bakschisch republik und es gibt kein zurück!

im saarland ist jetzt herr lafontaine schuld, dass die grünen mit fdp und einer eigentlich abgewählt geglaubten cdu unter peter müller eine regierung bilden, während schwarzgelb in berlin die lizenzen für die atommeiler verlängern und damit de facto den atomausstieg kippen. da fällt mir spontan die signatur eines unbekannten diskussionsteilnehmers ein: was ist der unterschied zwischen genie und wahnsinn? genie hat grenzen. interessant (wie immer) das hier: wie geht es uns, herr küppersbusch

bei anne will wird im ersten dtsch fernsehen ernsthaft die frage gestellt, ob die unangemeldete verspeisung einer bulette (thür. frigadelle) samt brötchen - diebstahl ist und somit die fristlose kündigung der mit dessen liebevoller arrangierung betrauten sekretärin rechtens. oups. es finden sich leutchen die in diesem zusammenhang ernsthaft fragen „ja wo soll man denn da die grenze ziehen?“ den namen kenn ich — fällt aber unter die rubrik „hoffentlich vergess ich das wieder“

es gibt trotzdem keinen grund depressiv zu werden, denn: 1:0 gegen russland heisst — wir (jetzt mal das wirklich alle „wir“!) werden weltmeister. leider erst 2010, aber vorfreude ist ja die schönste.

ps ihr armleuchter: es ist ein missverständis: herr westerwelle kann entgegen aller behauptungen englisch. er kann halt nicht cool.


LAMP++ mit snow leopard

von robert 8. Sep 2009 23:42 (vor 2650 Tagen) ~ comments (2)

snow leopard (mac os x 10.6) ist zwar mit seinem 64bit dingelskern dann doch nicht so der (freudig) erwartete geschwindigkeitsrausch. was aber gut ist: apple hat die skriptsprachen aktualisiert. das bedeutet neben neuesten version von python, ruby und perl gibt es auch php 5.3. und diesmal sogar mit den wichtigsten libs. ich habe bisher noch keine extension vermisst. deshalb habe ich das auch noch nicht kompiliert. trotzdem muss man noch ein bisschen rumfummeln, bis man eine gutausgerüstete entwicklermaschine bekommt.

LAMP == linux, apache, mysql, php

linux

ok, war nur spaß. wie lassen natürlich das os x system drauf…

apache

apache2 ist schon installiert und kann über das kontrollfeld systemeinstellungen/ freigaben/ webfreigabe aktiviert werden. testen kann man das dann, indem man http://localhost in die browser adresszeile eingibt.

msql

mysql fehlt. die erste lücke ist gefunden. mittlerweile gibt es dafür aber ein vorkompiliertes paket.

http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg

das 10.5 intel image funktioniert bei mir wunderbar. man kann sich ein kontrollfeld installieren (empfehlenswert), mit dem man die DB hoch und runterfahren kann.

einen hübschen cocoa client gibt es hier: sequel pro

php aktivieren

php ist von hause aus nicht aktiviert. d.h. hier muss man an die konfigdatei ran: in /etc/apache2/httpd.conf die zeile

LoadModule php5_module        libexec/apache2/libphp5.so

auskommentieren. oft braucht man auch virtuelle hosts. dann sollte man gleich noch die zeile

Include /private/etc/apache2/extra/httpd-vhosts.conf

auskommentieren. in der extra/httpd-vhost.conf sollte dann auch schon was sinnvolles stehen. bei mir steht da:

<Directory /Users/rw/dev/sites/*/htdocs>
    Order allow,deny
    Allow from all
    AllowOverride All
    Options FollowSymLinks
</Directory>

<Directory /Library/WebServer/Documents>
    Order allow,deny
    Allow from all
    AllowOverride All
    Options FollowSymLinks
</Directory>

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/Library/WebServer/Documents"
    ServerName localhost
    ServerAlias otto
</VirtualHost>


<VirtualHost *:80>
    ServerName demo
    ServerAlias demo.otto
    DocumentRoot /Users/rw/dev/sites/demo/htdocs
    ErrorLog /Users/rw/dev/sites/demo/log/error_log
    CustomLog /Users/rw/dev/sites/demo/log/access_log combined
</VirtualHost>

bedeutet: der default host ist wie gehabt unter /Library/WebServer/Documents. meine experimente finden unter /Users/rw/dev/sites/demo/htdocs statt, wobei demo der name des virtuellen hosts ist (otto ist der computername). die directory anweisungen sind dafür da, dass ich alles machen darf, sprich: symbolische links setzen und .htaccess dateien anlegen. jeder virtuelle host muss natürlich in die /etc/hosts eingetragen werden:

127.0.0.1       localhost demo

sonst bekommt man zb. statt dem demo server, demo.com zu gesicht, wenn man es im browser aufruft.

nach einem apache restart. haken in systemeinstellungen/ freigaben/ webfreigabe wegnehmen und wiederreinsetzen sollte dann php funktionieren. testbar über eine datei zb. info.php, die man in /Library/WebServer/Documents platziert und via http://localhost/info.php aufruft.

<?phpinfo()?>

hyperestraier

zu einer guten webanwendung gehört eine leistungsfähige suchmaschine. erste wahl ist hierbei hyperestraier. glücklicherweise ist das kompilieren absolut problemlos. voraussetzung ist die qdbm die sich aber auch klaglos kompilieren läßt. also qdbm runterladen unter http://qdbm.sourceforge.net/ auspacken, ins verzeichnis wechseln und dann die hlg3fltgk:

./configure
make mac
sudo make install-mac

man beachte die mac version von make und -install. nach selbigem verfahren bringt man dann auch den hyperestraier zum laufen.

spätestens jetzt wird es auch interessant /usr/local/bin in den systemsuchpfad von kommandozeilenprogrammen aufzunehmen. dazu ändert man die entsprechende zeile in der /etc/profile in

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"

das gilt dann für alle user. wenn man das nur für einen user möchte, trägt man in die /Users/username/.bash_profile diese zeile ein:

PATH="$PATH:/usr/local/bin"

imagemagick

viele webanwendungen verwenden imagemagick zur bildbearbeitung. und das zu recht, sind doch die resize ergebnisse denen der gd-lib in sachen qualität deutlich überlegen. als kommandozeilentool ist die installation i.d.R. auch vollkommen unkomliziert. leider ist imagemagick auf dem mac ein echtes sorgenkind. zwar gibt es mittlerweile ein binary auf den projektwebseiten, die systemintegration ist indes sehr unhandlich, so dass man davon abraten muss. (man muss entweder eine reihe von umgebungsvariablen setzen — dann auch wieder extra für den apache — oder ca. 10 symlinks setzen…) beim surfen nach einer neuen lösung bin ich auf ein interessantes script gestossen, dass das runterladen+kompilieren von imagemagick und den zahlreichen bibliotheken, von denen es abhängig ist, erleichtern soll. und es funktioniert wirklich:

http://github.com/maddox/magick-installer/tree/master

wer dieses shellscript direkt auschecken will (git clone) braucht natürlich noch den versionsverwaltungsclient (siehe nächster abschnitt).

testen, ob alles funktioniert, kann man z.b. mit dem kommando

convert logo: logo.gif

das sollte das gif mit dem kleinen magier erzeugen.

subversion und git

ein subversion client ist bei snow leopard schon dabei. git ist das neueste ding in sachen (dezentrale) versionsverwaltung. ich habe mir einen installer runtergeladen und der funktioniert auch (leo intel image):

http://code.google.com/p/git-osx-installer/

ja. das wars erstmal. jetzt hat man ein system, mit dem man schonmal einiges anstellen kann. viel spaß.


"Wir haben uns verdoppelt"

von robert 30. Aug 2009 21:38 (vor 2659 Tagen) ~ comments (0)

— guido w. 30.8.09


das intervall problem... und funktionale programmierung mit php 5.3

von robert 30. Aug 2009 18:04 (vor 2659 Tagen) ~ comments (0)

vor langer zeit haben wir eine anwendung zur zeiterfassung geschrieben. ein teilproblem war die berechnung von zuschlägen auf grundlage eines umfangreichen tarifpapiers. die zuschläge für wochenendarbeit, nachtarbeit, etc. sollten sich möglichst konfigurieren lassen. beispielsweise in der form startstunde-endstunde priorität beschreibung

0-4 6 nachts
5-10 4 früh
22-24 6 nachts
12-23 9 sonntag

die priorität ist wichtig, weil sich die zeitintervalle überschneiden können. in diesem fall wird der höherwertige aufschlag berechnet, also wer sonntags 22-23 uhr arbeitet bekommt sonntagszuschlag und nicht nachtzuschlag.

ich finde dieses problem recht interessant. es hatte mir damals einiges kopfzerbrechen bereitet. mit den neuen sprachfeatures von php 5.3, den anonymen funktionen und closures, wollte ich mir das problem nochmal neu anschauen und testen inwieweit sich der code damit straffen läßt.

beginnen wir mit den eingabedaten:

$zeiten_def=<<<EDEF
3-8
9-23
EDEF;

$tarif_def=<<<EDEF
0-4 6 nachts
5-10 4 früh
12-13 3 mittags
6-7 8 blubb
14-15 8 blibb
18-22 4 spät
22-24 6 nachts
12-23 9 sonntag
EDEF;

function parse_input($in, $extended=false){
    return array_map(function($line) use($extended){
        $l = preg_split("/[-\s]+/", trim($line), 4);
        $zeiten = array('start'=>$l[0], 'end'=>$l[1]);
        if($extended){
            $zeiten['prio']=$l[2];
            $zeiten['descr']=$l[3];
        }
        return $zeiten;
    }, explode("\n", $in));
}

function p_ival($i){
    $p = ($i['prio']) ? 
        " kategorie {$i['prio']} ({$i['descr']})" : '' ;
    return sprintf("%02d - %02d%s",
        $i['start'], $i['end'], $p);
}

$tarife=parse_input($tarif_def, true);
$zeiten=parse_input($zeiten_def);

usort($tarife, function($a, $b){
    if($a['prio'] > $b['prio']) return -1;
    if($a['prio'] < $b['prio']) return 1;
    return 0;
});

aus den eingabedaten werden listen mit intervallen erzeugt. ein intervall ist ein hash mit den schlüsseln start, end und optional prio und descr. beim einlesen kommt schon ein closure zum einsatz: die array_map funktion nutzt eine anonyme funktion, die zugriff auf den übergeordneten funktionsparameter erhält (use $extended). davon abhängig erzeugt sie die optionalen intervallschlüssel. das ist nice. früher hätte man z.b. einen ähnlichen effekt mit einer globalen variable erzielen können (häßlich).

$tarife wir anschliessend nach priorität sortiert. für den lösungsweg gilt: wer zuerst kommt, malt zuerst. daher diese vorsortierung.

die funktion p_ival() ist eine hilfsfunktion, mit der wir einen intervall anzeigen können.

mit einer generischen lösung wird die arbeitszeit mit den tarifintervallen verglichen. eine vergleichsfunktion gibt die treffer und die nichttreffenden teile zurück. die funktion match_interval() erledigt diese arbeit. sie ist etwas länglich geraten, muss sie doch alle möglichkeiten einzeln testen und die ergebnismengen zusammenstellen. vllt. hat jmd ne idee, wie das kürzer zu machen ist.

function match_interval($needle, $haystack){
    print "TEST ".p_ival($needle)."  VS ".p_ival($haystack)."\n";
    $matched=array(); $unmatched=array();
    // kein match. 
    // ende der nadel vor beginn des heu bzw. 
    // anfang der nadel hinterm heu
    if(($needle['end'] <= $haystack['start']) ||
        ($needle['start'] >= $haystack['end'])){
        $unmatched[]=$needle;
    // nadel direkt im heu
    }elseif(($needle['start']>=$haystack['start']) && 
        ($needle['end'] <= $haystack['end'])){
        $matched[]=$needle;
    // nadel ist größer als das heu
    }elseif(($haystack['start']>$needle['start']) && 
        ($haystack['end'] < $needle['end'])){
        $matched[]=$haystack;
        $unmatched[]=array("start"=>$needle['start'],
            "end"=>$haystack['start']);
        $unmatched[]=array("start"=>$haystack['end'],
            "end"=>$needle['end']);
    // teil der nadel is im heu!
    // ist es der hintere?
    }elseif($needle['end']<=$haystack['end']){
        $matched[]=array("start"=>$haystack['start'],
            "end"=>$needle['end']);
        $unmatched[]=array("start"=>$needle['start'],
            "end"=>$haystack['start']);
    // oder der vordere?
    }else{
        $matched[]=array("start"=>$needle['start'],
            "end"=>$haystack['end']);
        $unmatched[]=array("start"=>$haystack['end'],
            "end"=>$needle['end']);
    }
    // jetzt noch unsere informationen an die
    // fundstelle hängen
    $matched = array_map(function($f) use($haystack){
        $f['prio']=$haystack['prio'];
        $f['descr']=$haystack['descr'];
        return $f;
    }, $matched);
    return array($matched, $unmatched);
}

beim vergleich der intervalle sind also 4 fälle denkbar:

  1. der intervall passt nicht. er wird vollständig als rest zurückgegeben
  2. der intervall passt vollständig in den (gleich großen oder größeren). es wird kein rest zurückgegeben
  3. der intervall passt teilweise (vorne oder hinten). es wird genau ein restintervall zurückgegeben.
  4. der intervall ist größer als der „heu“ intervall. er wird durch das heu gesplittet. es werden 2 reste zurückgegeben.

so, jetzt kommen wir an die stelle, wo der spaß richtig losgeht. wir starten (im einfachsten fall) mit einem intervall (der arbeitszeit) und prüfen es gegen die tarifzeiten. bei jeder prüfung erhalten wir eine neue liste von intervallen, die nicht passen. diese intervalle müssen mit dem rest der liste verglichen werden, während die treffer lediglich gesammelt werden. hier meine erste version:

function match_all_intervals($n, $hay){
    $h = array_shift($hay);
    if(!$h) return array(array(), $n);
    $matched=array();
    $un=array();
    foreach($n as $test){
        list($m, $u) = match_interval($test, $h);
        $matched = array_merge($matched, $m);
        list($m2, $un2)=match_all_intervals($u, $hay);
        $matched=array_merge($matched, $m2);
        $un=array_merge($un, $un2);
    }
    return array($matched, $un);
} 

function p_result($r){
    print "\n\nERGEBNIS zuschlagspflichtige Zeiten:\n";
    print join("\n", array_map("p_ival", $r[0]));
    print "\n   normale zeiten:\n";
    print join("\n", array_map("p_ival", $r[1]));
    print "\n";
}

$r = match_all_intervals_r($zeiten, $tarife);
p_result($r);

diese funktion enthält eine rekursion: list($m2, $un2)=match_all_intervals($u, $hay); der neue rest wird gegen den rest des heuhaufens $hay getestet. die ergebnisse kann man sich mit der p_result() funktion ausgeben lassen.

die foreach schleife kann man auch noch durch eine rekursion ersetzen. das wäre version nummer 2:

function match_all_intervals_r($ns, $hay){
    $mat=array();
    $umat=array();

    $h = array_shift($hay);
    if(!$h) return array(array(), $ns);

    $n = array_shift($ns);
    if(!$n) return array(array(), array());

    list($m, $u) = match_interval($n, $h);
    $mat = array_merge($mat, $m);

    list($m, $u)=match_all_intervals_r($u, $hay);

    $mat=array_merge($mat, $m);
    $umat=$u;

    // hier gehen wir mit den nachbarintervallen ($ns) 
    // original $hay auf den weiter voran
    array_unshift($hay, $h);
    list($m, $u) = match_all_intervals_r($ns, $hay);
    $mat=array_merge($mat, $m);
    $umat = array_merge($umat, $u);

    return array($mat, $umat);
}

$r = match_all_intervals_r($zeiten, $tarife);
p_result($r);

irgendwie ist die funktion garnicht kürzer geworden. ich habe noch etwas mit array_reduce() herumgespielt und bin noch auf diese variante gekommen.

$r = array_reduce($tarife, function($acc, $z){
    $m = $acc['m'];
    $u = array();
    array_map(function($i) use($z, &$m, &$u){
            list($m2, $u2) = match_interval($i, $z);
            $m=array_merge($m, $m2);
            $u=array_merge($u, $u2);
        }, 
        $acc['u']);
    return array('m'=>$m, 'u'=>$u);
}, array("m"=>array(), 'u'=>$zeiten));

p_result(array($r2['m'], $r2['u']));

hmm. 10 zeilen. das ist dann die kürzeste variante. hier kommt eine etwas modfizierte datenstruktur zum einsatz. statt eines arrays [0=>liste_der_treffer, 1=>liste_der_reste] heisst es hier ['m'=>liste_der_treffer, 'u'=>liste_der_reste]

tja. das wars dann schon. evtl. lässt sich das problem noch knackiger lösen. ich bin mir sogar sicher, dass das geht. der geneigte leser möge vorschläge bringen :)


harry is back?

von robert 4. Aug 2009 12:21 (vor 2685 Tagen) ~ comments (0)

Alte und neue Bahnvorstände bekommen viel Geld fürs privatiseren Die in den letzten Wochen und Monaten ausgeschiedenen ehemaligen DB-Vorstände Hartmut Mehdorn, Otto Wiesheu, Norbert Bensel, Norbert Hansen und Margret Suckale haben nach Pressemeldungen Berater-Verträge mit der DB abgeschlossen. Nach neuen Informationen, die Bahn für Alle vorliegen, soll der zurückgetretene Ex-Bahnchef Hartmut Mehdorn im Zusammenhang mit der Vermittlung der Überkreuzbeteiligung mit der RZD für den DB-Vorstand beratend tätig sein. „Dies ist nicht der versprochene Neuanfang mit dem neuen Vorstandsvorsitzenden Rüdiger Grube, sondern die Fortsetzung alter Seilschaften mit dem alten Auftrag zum Ausverkauf der Bahn“, kritisiert Hans-Gerd Öfinger von der gewerkschaftlichen Basisinitiative Bahn von unten. Auf eine Mischung aus Vorteilsnahme und Privatisierungsfanatismus hatte schon der Bonus-Skandal im letzten Herbst hingedeutet: Damals wurde bekannt, dass der Bahnvorstand nur für das reine Faktum “Börsengang” unabhängig vom Verkaufserlös Gratifikationen in Millionenhöhe bekommen sollte. Diese Regelungen wurden nie rückgängig gemacht; sie gelten heute noch. Aus Kreisen von Gewerkschaftern und Parlamentariern wurde nun bekannt, dass mit dem neuen Vorstandsvorsitzenden Grube und den neuen Vorstandsmitgliedern ein ähnlich gelagerter Vertrag ausgehandelt wurde. Dabei sollen die Bonuszahlungen dem gesamten Bahnvorstand gewährt werden.

DeineBahn.de


niemand liebt niemanden

von robert 12. Jun 2009 01:46 (vor 2739 Tagen) ~ comments (0)

die pipilotti rist version des chris isaak klassikers kennt ihr wahrscheinlich alle. es scheint sogar ein video zu geben (eigentlich ja logisch, weil fr rist ja immer videos macht). hier isses.


1 von 812345678>
About
alotta-log is your friendly blogserver. multiuser - multiblog - php/my/xorc based.

currently this is a beta version. stay tuned.
Impressum
Disclaimer
"this site looks best if you come over here and look at my monitor."
 
Themen
Unser T-Shirt
neueste eintraege in diesem blog
mixtape

1 DJ T / Robot Riot - Electric Press Remix

2 Bucci Bag / More Lemonade - Sparkling Version

3 Soto / Hootenanny - Original Mix

4 Joe Galdo / Keef - Original Mix

5 Myagi / Subversion - Price Cuts Remix

6 DJ Fixx / Electric - Original Mix

7 DJ Fixx / Push Em Up - Original Mix

8 Klaus / Big Man - Original Mix

9 Jesse Saunders / Everybody - Slapin Breaks Remix

10 Soto / Manic - Soto Remix

11 Chikinki / Like It Or Leave It

www.flickr.com
Administration

rss/xml xorc based

alotta-less, 2009