Strict Standards: Declaration of Walker_Page::start_lvl() should be compatible with Walker::start_lvl(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1199

Strict Standards: Declaration of Walker_Page::end_lvl() should be compatible with Walker::end_lvl(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1199

Strict Standards: Declaration of Walker_Page::start_el() should be compatible with Walker::start_el(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1199

Strict Standards: Declaration of Walker_Page::end_el() should be compatible with Walker::end_el(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1199

Strict Standards: Declaration of Walker_PageDropdown::start_el() should be compatible with Walker::start_el(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1244

Strict Standards: Declaration of Walker_Category::start_lvl() should be compatible with Walker::start_lvl(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1391

Strict Standards: Declaration of Walker_Category::end_lvl() should be compatible with Walker::end_lvl(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1391

Strict Standards: Declaration of Walker_Category::start_el() should be compatible with Walker::start_el(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1391

Strict Standards: Declaration of Walker_Category::end_el() should be compatible with Walker::end_el(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1391

Strict Standards: Declaration of Walker_CategoryDropdown::start_el() should be compatible with Walker::start_el(&$output) in /www/htdocs/v167612/wplog/wp-includes/classes.php on line 1442

Strict Standards: Redefining already defined constructor for class wpdb in /www/htdocs/v167612/wplog/wp-includes/wp-db.php on line 306

Strict Standards: Redefining already defined constructor for class WP_Object_Cache in /www/htdocs/v167612/wplog/wp-includes/cache.php on line 433
iFool » 2011 » November

Archiv

Archiv für November, 2011

Wie werde ich (zumindest beim Einstieg) ARC los?

29. November 2011

ARC steht für Automatic Reference Counting und soll Objektive-C-Neulingen (wie mir) den Einstieg in die Anwendungsentwicklung in der MAC-Welt (MAC OS X & IOS) erleichtern.

Im Grunde genommen geht es dabei darum, dass der Compiler wohl einige Schritte zum Speichermanagement selber in den kompilierten Code einfügt. Da ist es dann hinderlich, wenn eben derartige Dinge vom Programmierer noch manuell im Sourcecode eingebaut werden.

Gerade der Einsteiger greift natürlich auf Internetfunde wie Beispielcode, Tutorials und Bücher zurück, in denen ARC noch kein Thema war. Was ist also zu tun, wenn man mit einer Version >= 4 von XCode arbeitet und hier bei neu erstellten Projekten ARC zu so merkwürdigen Fehlermeldungen führt? Ganz einfach:  Abschalten!

Ausschalten ARC in XCode

Und so geht es: Projekt markieren (1) Reiter Build Settings wählen (2) und hier unter ”Combined” (3) im Abschnitt “Objektive-C Automatic Reference Counting”  (4) von “Yes” auf “No” (5) stellen. Das ist alles …

Allgemein

Reguläre Ausdrücke in Java: Extrem nützlich (Java-Regex)

11. November 2011

Ich hatte neulich in einem Projekt zur automatischen Rechnungserkennung (OCR) die Anforderung, dass Texte (Artikelnummern) in Abhängigkeit vom Lieferanten nach Musterzeichenfolgen durchsucht werden sollten und dann mit den erkannten Mustern verschiedene Dinge passieren sollten: Zeichen(ketten) entfernen, abändern oder hinzufügen. Das ganze sollte über ein Benutzerinterface konfigurierter und maximal variabel sein.

Die einfachste und wirklich sehr elegante Lösung bestand in der Schaffung einer entsprechenden Tabelle mit den Stammdaten:

  • Lieferantennummer
  • Artikelnummer
  • Muster-Zeichenfolge
  • Erstetzungszeichenfolge

Anschließend habe ich dann einen kleinen Eingriff nach der OCR-Erkennung mit den zu verarbeitenden Zeichenketten vorgenommen. Der Programmieraufwand war an dieser Stelle unter Verwendung der Regulären Ausdrücke in Java (Regex) minimal.

Hier dazu ein Codebeispiel:


import java.util.regex.*;
public class RegexTester {
  public static void main(String args[]) {
    String sourceString = "12345X67890A12XB123X12";
    String patternString = "([0-9])([0-9])([0-9])X";
    String replacementString = "$2$3X";
    Matcher matcher = Pattern.compile(patternString).matcher(sourceString);
    StringBuffer targetString = new StringBuffer();
    while (matcher.find())
      matcher.appendReplacement(targetString, replacementString);
    matcher.appendTail(targetString);
    System.out.println(targetString);
  }
}

In diesem kleinen Beispiel wird im Quellstring “12345X67890A12XB123X12″ nach denjenigen Stellen gesucht, in denen ein X auf 3 Ziffern folgt. Dieses Suchmuster wird dabei durch diesen Regulären Ausdruck definiert: “([0-9])([0-9])([0-9])X”. Wenn so eine Stelle gefunden wird soll die erste der 3 Ziffern eliminiert werden. Die beiden Folgeziffern und das X sollen hingegen im Ergebnis erhalten bleiben. Diese Vorschrift wird durch diesen Regulären Ausdruck definiert: “$2$3X”.

Die kleine Routine gibt dann das Ergebnis folgerichtig in Zeile 12 aus: “1245X67890A12XB23X12″

Ich bin begeistert, wie leistungsfähig die Regulären Ausdrücke sind und wie leicht die Implementierung in Java zu machen ist.

Allgemein, IT, Software