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 http://www.aulich.org/wplog Thomas Aulich über Softwarethemen Sat, 10 Nov 2012 23:48:03 +0000 http://wordpress.org/?v=2.7 en hourly 1 Jetty unter MAC OS X (10.8.2) als Boot-Daemon einrichten http://www.aulich.org/wplog/?p=402 http://www.aulich.org/wplog/?p=402#comments Sat, 10 Nov 2012 23:45:11 +0000 Thomas Aulich http://www.aulich.org/wplog/?p=402 Ich habe einen Jetty-Server auf unserem Home-Server (MAC MINI) installiert, um darauf ein paar GRAILS-Anwendungen für den Hausgebrauch zu hosten (Kassenbuch, Dokumenten-Archiv etc.). Fraglich ist nun, wie man einen Daemon so einrichten kann, dass der Jetty-Server bei jedem Start des MAC MINI automatisch (und ohne dass sich ein Benutzer dazu anmelden muss) startet.

Zunächst einmal habe ich ein Start-Script (Filename “Users/Shared/jetty/taustart.sh”) geschrieben, dass ich verwende, um den Jetty-Server einfach mit vorher festgelegten Eingenschaften starten zu können:


cd /Users/Shared/jetty
java -Dtau.config.path=/Users/Shared/jetty/tau-config -DSTOP.PORT=8085 -DSTOP.KEY=stopme -jar start.jar

Wie zu erkennen ist befindet sich das Jetty-Home-Verzeichnis in meinem Fall unter “/Users/Shared/jetty”. Außerdem habe ich dem Server mitgeteilt, dass ich ihn bei Bedarf über den STOP.PORT “8085″ mit den STOP,KEY “stopme” stoppen möchte. Das ist nützlich, wenn ich den Server für Wartungsarbeiten beenden muss. Ab jetzt soll er ja schließlich beim Systemstart automatisch gestartet werden.

Der Clou an der Sache besteht nun darin, dem launch-Daemon (”launchd”) mitzuteilen, dass dieses Start-Script beim booten automatisch ausgeführt werden soll. Dazu erstelle ich eine sogenannte “plist” (Filename “/Library/LaunchDaemons/org.aulich.jetty.plist”) wie folgt:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.aulich.jetty</string>
    <key>ProgramArguments</key>
      <array>
        <string>/Users/shared/jetty/taustart.sh</string>
      </array>
    <key>Disabled</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
  </dict>
</plist>

Jetzt kommt noch ein wichtiger Schritt, den ich zunächst vergessen hatte und mich wunderte, warum meine plist nicht ausgeführt wird: Der Eigentümer der neuen plist sollte “root” sein. Daher verwendete ich das folgende command um den Eigentümer entsprechend auf dem plist-File zu setzen:


sudo chown root /Library/LaunchDaemons/org.aulich.jetty.plist

So, dass ist eigentlich auch schon alles, was geschehen muss, um einen entsprechenden Boot-Daemon einzurichten. Abschließend sei noch angemerkt, dass ich das folgende Script benutze, wenn ich den Jetty-Server zwischendurch mal beenden muss:


cd /Users/Shared/jetty
java -Dtau.config.path=/Users/Shared/jetty/tau-config -DSTOP.PORT=8085 -DSTOP.KEY=stopme -jar start.jar --stop
]]>
http://www.aulich.org/wplog/?feed=rss2&p=402
ECM-System für den Hausgebrauch http://www.aulich.org/wplog/?p=392 http://www.aulich.org/wplog/?p=392#comments Wed, 18 Jan 2012 06:37:17 +0000 Thomas Aulich http://www.aulich.org/wplog/?p=392 ECM (Enterprise-Conten-Management) ist zurzeit einer der am schnellsten wachsenden IT-Bereiche. Klassische Archivierung “meets” Web-Content-Management gepaart mit Neben-Disziplinen wie Social-Network, Workflow-Management und dergleichen mehr.

Die Software-Lösungen für diesen Bereich sind bereits vielfältig und einige Dinge gibt es auch unter GNU-Lizenz.

Das Thema interessiert mich schon eine ganze weile und ich möchte mich an einer Low-Cost-Implementierung für den privaten Anwendungsbereich versuchen. Als ECM-System habe ich mir jetzt Alfresco vorgenommen, ein bereits in der vierten Generation aufgelegtes und in der Community-Version frei verfügbares ECM für verschiedene Betriebssysteme.

Als Hardware habe ich mir den hier noch aus früheren Experimenten vorhandenen Zotac Mag-Mini geschnappt und ein 32-Bit-Ubuntu Linux-System installiert, da der Zotac kein 64-Bit System zulässt. Leider gibt es für 32-Bit keinen All-In-One-Installer von Alfresco. Das bedeutete, ich musste alle “Zutaten” (wie z.B. MySQL, Tomcat, PDFToSwf etc) zu Fuß installieren. Zum Glück gab es für diesen Zweck einen schönen Blog, den ich in großen Teilen so wie hier verlinkt nachvollziehen konnte.

Anschließend noch ein Startscript für Alfresco in “/etc/init.d”. Jetzt kann die praktische Arbeit beginnen …

Die Vision ist primär die bessere Abwicklung der häuslichen Papierflut: Belege, die sich sonst wochenlang bis sich mal wieder jemand erbarmt in Sammelkästen türmen sollen künftig zeitnah eingescannt und in das ECM verschoben werden. Die verhasste Ablage der Originale erfolgt dann nur noch chronologisch in herkömmlichen Aktenordnern. Im ECM werden die Belege kategorisiert und zusätzlich Volltext-Indexiert. Damit sollte dann zukünftig die Recherche entsprechend leichter fallen. Sollte man mal für irgendwelche Zwecke den Original-Beleg benötigen kann man diesen über die rein chronologische Ablage im Aktenordner leicht finden.

Eine entscheidende Rolle in der Bewertung der Praxistauglichkeit der Lösung spielt für mich u.A. ein ergonomischer Scanningprozess mit OCR und PDF-Output. Hier habe ich mich für eine Vor-Vor-Version von ABBY-Finereader (Version 9) entschieden, die für “Nüsse” zu haben war. Zusammen mit einem im Büro verfügbaren PANASONIC-Dokumentenscannersollte die Digitalisierung der Papierbelege auch bei größerem Volumen gut gelingen.

Mal sehen, wie sich die Sache entwickelt…

]]>
http://www.aulich.org/wplog/?feed=rss2&p=392
Wie werde ich (zumindest beim Einstieg) ARC los? http://www.aulich.org/wplog/?p=378 http://www.aulich.org/wplog/?p=378#comments Tue, 29 Nov 2011 22:13:17 +0000 Thomas Aulich http://www.aulich.org/wplog/?p=378 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 …

]]>
http://www.aulich.org/wplog/?feed=rss2&p=378
Reguläre Ausdrücke in Java: Extrem nützlich (Java-Regex) http://www.aulich.org/wplog/?p=355 http://www.aulich.org/wplog/?p=355#comments Fri, 11 Nov 2011 16:25:06 +0000 Thomas Aulich http://www.aulich.org/wplog/?p=355 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.

]]>
http://www.aulich.org/wplog/?feed=rss2&p=355
Mit Excel und jQuery Mobile ein Fußballteam mit Onlineinformationen unterstützen… http://www.aulich.org/wplog/?p=341 http://www.aulich.org/wplog/?p=341#comments Sat, 01 Oct 2011 18:33:07 +0000 Thomas Aulich http://www.aulich.org/wplog/?p=341 Die Aufgabenstellung ergab sich aus meiner Tätigkeit als Betreuer einer B-Jugend Fußballmannschaft: Im Laufe der Saison gibt es immer eine Menge Informationen, die zur Koordination von Terminen erforderlich sind: Der Spielplan bestimmt die Spieltage und Spielorte. Fahrten müssen organisiert und abgestimmt werden. Die Spieler verfügen i.d.R. noch nicht über einen eigenen Führerschein und müssen daher Verwandte und Freunde zur Unterstützung mit einbeziehen. Zu allem Ãœberfluss ändern sich dann auch noch Termine oder eingeplante Fahrer fallen kurzfristig aus bzw. Fahrdienste werden getauscht. Das über gedruckte Dokumente aktuell zuhalten bedeutet bei einem 22-Mann-Kader einen hohen Aufwand und ständig geistern Dokumente mit veralteten Informationen herum.

SV20 Webapp der B1-JugendMeine Lösung des Problems besteht hier in der Bereitstellung der Informationen im Internet: Ein paar html-Dateien ergänzt um das JS-Framework jQuery Mobile und relativ wenig individuellen Java-Script-Code bilden den Rahmen einer Webanwendung für mobile Endgeräte. Die Saisondaten werden auf verschiedenen Registern einer Excel-Datei gepflegt. Bei jedem Update wird das Excel-File als XML gespeichert und auf den Webserver geladen.

Innerhalb der Webapp werden die Inhalte mittels AJAX dann aus dem XML-File dynamisch geladen und mit jQuery Mobile aufbereitet. Das geht sehr einfach und sieht auch noch elegant aus.

Eine Einschränkung: Der MS Internetexplorer hat gewisse Schwierigkeiten mit jQuery Mobile (zumindest mit der Art, wie ich es einsetze). Deshalb gilt bei meiner kleinen Webapp: “IE-User müssen leider draußen bleiben ;-)”. Aber wie gesagt: Es ist im Grunde auch eine Wabapp für mobile Devices und deren Browser sollten keine Probleme haben.

Links:

jQuery Mobile, Webapp der B1-Jungend des SV20 Brilon

]]>
http://www.aulich.org/wplog/?feed=rss2&p=341
Familiennetzwerke absichern mit “LPC” http://www.aulich.org/wplog/?p=310 http://www.aulich.org/wplog/?p=310#comments Sat, 08 Jan 2011 19:49:40 +0000 Thomas Aulich http://www.aulich.org/wplog/?p=310 LPC steht für “Live Parental Control”. Es ist ein Service, den NETGEAR bei seinen für den Homebereich konzipierten WLAN-Routern bietet, um das Familiennetzwerk vor unerwünschten Inhalten zu schützen. Es kann aus über 50 Kategorien ausgewählt werden, was ins Haus darf und was nicht. Einzelne Kategorien dabei sind z.B. “Alkohol”, “Pornografie”, “Sexualität”, “Spiele”, “Auktionen”, “Filme”, “File-Sharing”, “Suchmaschinen”, “Foren”, “Pishing” etc. etc…Wird eine unerlaubte Seite angefordert erscheint statt dessen eine Nachricht, warum dieser Inhalt nicht angezeigt werden darf (vgl. Screenshot).

Beispiel einer Blockmessage

Beispiel einer Blockmessage

Das Prinzip: Aus den ca. 50 Kategorien können individuelle Auswahlen der zu blockenden Inhalte zusammengestellt werden (Einstellung “Custom”) bzw. eines der vorkonfigurierten Presets “High”, “Moderate”, “Low”, “Minimal” oder “None” gewählt werden. Das nennt sich dann “filtering level” oder “Profil”.

Aus mehreren dieser Profile kann man nun eine schöne, auf die einzelnen Familienmitglieder abgestimmte Sammlung zusammenstellen:

(1) Im ersten Schritt wird ein allgemeingültiges Profil bestimmt (Default Settings), das für alle gilt, die einen Webzugriff anfordern und über keinerlei Sonderrechte verfügen. Dieses Profil gilt zunächst einmal für jeden und “rund um die Uhr” (”all other times (default)”).

LPC Konfiguration

LPC Konfiguration

(2) Zusätzlich zum Default-Setting für “rund um die Uhr” lassen sich nun beliebig viele weitere Profile mit anderen Filtereinstellungen für bestimmte Uhrzeiten definieren (”time blocks”). Ein solcher Zeitblock sticht dann das Defaultprofil aus. Ein Zeitblock könnte beispielsweise für tagsüber definiert werden, ein anderer für die Abendstunden. Nachts gelten dann in diesem Beispiel die Einstellungen des Default-Profils. Leider können diese Zeitblöcke nicht in Abhängigkeit zum Wochentag bestimmt werden, aber man kann eben nicht alles haben…

(3) Jetzt können zusätzlich für jedes Familienmitglied weitere Settings definiert werden (Bypass-Accounts), in denen die Filtereinstellungen jeweils beliebig von den Default-Settings abweichen können. Während die Defaultsettings für alle gelten möchten die Heranwachsenden und die Erwachsenen vielleicht das Internet auch zu anderen Zeiten Nutzen als die jüngeren Kinder. Oder die zur Verfügung stehenden Internetseiten sollen generell zur Altersgruppe des Nutzers passen. Mit den Bypass-Accounts können die Default-Settings umgangen werden. Voraussetzung: Es muss ein kleines Programm auf dem Windows-PC installiert werden, über dass sich die jeweilige BenutzerIn zunächst anmelden muss. Ohne eine Anmeldung mit erfolgreicher Authentifizierung (Benutzername + Password) gilt für jeden das restriktivere Defaultprofil.

LPC ist ein Service, den NETGEAR bei der Firma OpenDNS einkauft. Zur Laufzeit kommuniziert der heimische Router (sofern LPC aktiviert wurde) über das Internet mit OpenDNS und trifft die zum Benutzerprofil passenden Entscheidungen. Die Konfiguration des Dienstes erfolgt über eine Webanwendung online mit dem Internetbrowser (vgl. Screenshot weiter oben).

Bewertung: Natürlich ist auf LPC bzw. OpenDNS kein 100%iger Verlass. Manche Seiten werden auch aus nicht nachvollziehbaren Gründen geblockt, aber die Fehlerquote hält sich in Grenzen. Durch die vielen Kategorien lässt sich das System eigentlich ganz gut justieren.

Sehr schön ist, dass man (bei Verwendung des Defaultprofils) überhaupt keine Software auf den Endgeräten installieren muss. Es handelt sich eben um eine Routerlösung. Das zur Umgehung des restriktiven Defaultprofils erforderliche PC-Programm ist klein und handlich und muss nur bei Bedarf gestartet werden. Leider gibt es dieses Tool nur für Windows-PC-Betriebssysteme. MAC- oder Linux-User bzw. Benutzer von Mobile-Devices (iPod, iPad, Smartphone etc.) müssen sich mit dem Defaultprofil zufrieden geben.

WNDR3700 Router von NETGEAR

WNDR3700 Router von NETGEAR

Fazit: LPC ist ein guter, weil flexibler und effizienter Schutz für das Familiennetzwerk. Eltern sollten sich natürlich trotzdem mit den Nutzungsgewohnheiten ihrer Kinder auseinandersetzen. LPC ersetzt keine Erziehung aber hilft ein bisschen bei der Einhaltung von Regeln. Gerade jüngere Kinder werden gut davor geschützt “aus Versehen” an Dinge zu geraten, die ihnen ernsthaft schaden könnten. NETGEAR hat mit diesem Dienst ein zusätzliches Kaufargument für die Routerpalette geliefert. Das von uns angeschaffte Modell WNDR3700 bietet ohnehin für einen Straßenpreis von knapp 100 € schon so einiges: 2 Frequenzen, 8 (eingebaute) Antennen, 300 MBit+, eine vergleichsweise große Reichweite und eine stabilere Verbindung als die von Unitymedia gelieferte Hardware.

Verbesserungswürdig ist die Definition der “Time Blocks”: Hier wäre eine Differenzierung nach Wochentag wünschenswert. Eine schöne Erweiterung wäre auch die optionale Erkennung der “Bypasser” anhand der MAC-Adresse der Geräte-Netzwerkkarte(n): Dann könnten auch andere Betriebssysteme problemlos am Defaultprofil vorbei surfen (MAC, Linux, Smartphones etc.). Kann ja noch kommen…

]]>
http://www.aulich.org/wplog/?feed=rss2&p=310
ZOTAC MAG MINI ist toll, aber ohne Laufwerk… http://www.aulich.org/wplog/?p=292 http://www.aulich.org/wplog/?p=292#comments Thu, 30 Sep 2010 08:07:17 +0000 Thomas Aulich http://www.aulich.org/wplog/?p=292

Hm…Ich habe das Ding ohne OS bestellt und mir auch eigentlich nichts dabei gedacht, aber plötzlich kam die Box und erst da wurde mir klar: Bei dieser Art Rechner ist die optische Einheit in Folge von Platz-, Kosten- und Trendüberlegungen einfach mal “auf der Strecke” geblieben. Das ist vermutlich nicht schlimm, aber man muss sich erst einmal daran gewöhnen…

Vorbereiten USB-Stick mit UnetBootinFaszinierend finde ich, dass der ZOTAC als vollwertiger Rechner mit immerhin 2 Kernen, 2 GB RAM und verhältnismäßig guter Grafik (Full-HD am HDMI-Ausgang) daher kommt und dabei aussieht, wie eine externe Festplatte. Da ist einfach kein Platz für ein DVD-Laufwerk! Aber wie startet man dann und bekommt das Ding zum arbeiten?

Das Betriebssystem (OpenSuse 11.3) ließ sich trotzdem prima und sehr einfach über einen USB-Stick installieren: Einfach das ISO-Image des gewünschten Betriebssystems herunterladen und mit UnetBootin auf den Stick schreiben. Der MAG MINI erkennt den Stick sofort und ab da läuft es dann wie bei einem optischen Laufwerk.

]]>
http://www.aulich.org/wplog/?feed=rss2&p=292
Schallplatten im MP3-Format konservieren http://www.aulich.org/wplog/?p=274 http://www.aulich.org/wplog/?p=274#comments Tue, 02 Mar 2010 20:58:38 +0000 admin http://www.aulich.org/wplog/?p=274 Tipps und Produkte (also Wege) gibt es viele. Und sicher führen alle zu irgendeinem Ergebnis. Die Frage ist, wie kann eine gute Qualität zu einem gleichzeitig geringen Preis realisiert werden?…

Plattenkonvertierung Hardwareaufbau

Plattenkonvertierung Hardwareaufbau

Wer Spaß an gutem Klang hat wird mit dem Ergebnis, das ihm ein 49 € USB-Billigplattenspieler bietet vermutlich nicht zufrieden sein. Es bietet sich deshalb an, einen evtl. noch verfügbaren guten Plattenspieler herkömmlicher Bauart zu verwenden. Das bedeutet eigentlich auch gleichzeitig, den Einsatz eines entsprechenden Verstärkers mit PHONO-Eingangskanal. Dann kommt es bei der Verbindung zwischen Verstärker und Computer sehr darauf an, wie die dazwischen liegenden Komponenten geschaffen sind. Die Signalqualität leidet bei direkter Verbindung von Verstärker-LINEOUT und dem Mikrofoneingang des Rechners in der Regel sehr. Ich habe ein aus dem Homerecordingbereich stammendes Interface von TASCAM dazwischen geschaltet und hatte so kaum Signalverlust. 

An Stelle des Verstärkers könnte sicher auch ein im Handel erhältlicher PHONO-Vorverstärker mit einer Schnittstelle für den Computer treten. Eventuell muss dieses Teil aber extra für diesen Einsatz angeschafft werden.

Mit dem Stück Hardware, das man zusätzlich zu den “alten” HIFI-Komponenten wohl meistens vor den PC hängen muss wird in der Regel auch eine passende Recordingsoftware geliefert.

In meinem Fall sieht das Aufnahmeequipment wie folgt aus:

  • THORENS-Plattenspieler mit Linn-Abnahmesystem (PROTZ!)
  • YAMAHA Vollverstärker mit PHONO-Eingangsstufe zur Verstärkung des Signals
  • TASCAM USB-Interface US 122L mit Cubase LE  zur Aufnahme

Nach der Aufnahme verwende ich dann mit unterschiedlichen Fall-zu-Fall Einstellungen gern das Programm Rillenputz um vor allem das Knistern und Rauschen der Aufnahme zu dämpfen.

Anschließend muss die Aufnahme noch in einzelne Tracks zerlegt, ins MP3-Format konvertiert und getaggt werden. Alle 3 Dinge kann man sehr gut, kostenlos und einfach mit Audacity in Verbindung mit dem Lame MP3 Encoder des Frauenhofer-Instituts erledigen.

Alles in Allem ist die Aufgabenstellung kein Hexenwerk und das Ergebnis bei der hier beispielhaft erwähnten Komponentenkette recht ordentlich. Was man nicht außer acht lassen sollte ist der Zeitaufwand der bei Schallplattenkonvertierungen unvermeidbar fällig wird.

]]>
http://www.aulich.org/wplog/?feed=rss2&p=274
Reportgenerator? http://www.aulich.org/wplog/?p=264 http://www.aulich.org/wplog/?p=264#comments Thu, 11 Feb 2010 11:42:31 +0000 admin http://www.aulich.org/wplog/?p=264 Ich bin kürzlich über einen Java-Reportgenerator gestolpert, als ich für ein kleines Softwareprojekt eine Möglichkeit der Dokumentenerstellung in PDF gesucht habe: Jasper-Reports.

Kaum zu glauben, aber der bietet alles, was ich mir davon versprochen habe: Sehr flexibel, 100% Java, OpenSource mit kostenloser Lizensierung, gute Integrierbarkeit mit verschiedenen Datenquellen (darunter XML, JDBC, Hibernate etc.) und Unterstützung verschiedenster Dateiformate (darunter DOCX, PDF, html etc.).

Ein Bonbon ist das zugehörige Designertool iReport, mit dem sich die Report-Quelldatei (sie besteht aus XML) visuell und komfortabel generieren lässt.

Zwar scheinen die Tage des Tabellierpapiers gezählt und der geringste Teil der heutigen Reports wird wohl noch tatsächlich ausgedruckt, aber gerade das verlangt ja nach den vielfältigen Ausgabeformaten, die einem hier geboten werden.

Reports können auch alles Mögliche sein. Neben den alt-hergebrachten Auswertungen auf Tabellierpapier kann jedes auf der Basis von strukturierten Daten erzeugte Dokument als Bericht aufgefasst werden. Letztendlich ließe sich mit einem derartigen Berichtsgenerator der gesammte Dokumentenoutput eines ERP-Systems erzeugen…

]]>
http://www.aulich.org/wplog/?feed=rss2&p=264
HSQLDB nicht als “inMemory-DB” nutzen http://www.aulich.org/wplog/?p=256 http://www.aulich.org/wplog/?p=256#comments Wed, 16 Dec 2009 07:18:23 +0000 Thomas Aulich http://www.aulich.org/wplog/?p=256 Auch bei der Entwicklung einer Anwendung und den damit verbundenen Tests kann es recht lästig sein, immer wieder “zu Fuß” Testdaten eingeben zu müssen. Die von GRAILS automatisch verwendete HSQLDB ist in der Data-Source als inMemory-DB konfiguriert und daher gehen alle erfassten Daten bei jeder Beendigung der Anwendung verloren.

Zwar kann man durch entsprechende Einlassungen im Bootstrap auch Testdaten “beim Hochfahren” generierern, aber das ist für flexible Tests auch nicht so prickelnd, zumal die Erfassung über Programmierung auch Mühen bedeutet.

Eine gute Alternative bietet die Möglichkeit, einfach die HSQLDB-Datasource anzupassen:


 development {
  dataSource {
   dbCreate = "update" // one of 'create', 'create-drop','update'
   url = "jdbc:hsqldb:file:/temp/test/mydb;shutdown=true"
  }
 }

In diesem Beispiel auf einem PC mit Windows 7 wird beim ersten Start ein Verzeichnis C:\temp\test mit folgenden Files erstellt: mydb.lck, mydb.log, mydb.script und mydb.properties.  In den Textdateien mydb.script und mydb.log werden die Tabellendefinitionen und die Daten in lesbarer Form gespeichert. Beim Start der Anwendung wird dann jeweils aus diesen Textdateien wieder eine schnelle “inMemory-DB” aufgebaut. Während die Anwendung läuft werden DB-Änderungen in der *.log-Datei protokolliert, sodass die Daten auch bei einem Crash der Anwendung nicht verloren gehen können.

Die Verwendung von HSQLDB in Verbindung mit Textdeateien zur Speicherung der Daten ist eine bequeme und sofort Verfügbare Alternative für jeden GRAILS-Entwickler. Außerdem kann es auch eine Alternative für den Livebetrieb in Anwendungen mit kleinem Datenbestand sein (bei wenigen Hundert Datensätze etwa).

]]>
http://www.aulich.org/wplog/?feed=rss2&p=256