Chrome, localhost und SecureSocial (Play 2)

Um den Zugang zu Play Applikationen abzusichern bietet sich das Modul SecureSocial an. Mein Problem war, dass im Log zwar angezeigt wurde (und beim Debuggen war auch alles in Ordnung), aber nicht “rein” kam. Mein Problem war der Browser (Chrome) bzw. die verwandte URL, nämlich localhost:9000 . Das Problem wird an einigen Stellen im Web “diskutiert”, auch im chromium-Bug-Tracker. Als Lösungen wird empfohlen die 127.0.0.1 in der hosts-Datei mit localhost.com oder ähnlich zu versehen und dann die URL localhost.com:9000 zu verwenden. Wirklich sehr ärgerlich. Mit Safari und/oder Firefox geht es anstandslos.

Veröffentlicht unter Java, Play, Scala | Kommentare deaktiviert

Gute Nacht … (Maverick)

Über Nacht schalte ich meinen iMac aus. Da ich aber immer zig Anwendungen offen habe ist der Ruhezustand (hibernate) die richtige Wahl. Standardmäßig verbirgt sich hinter dem Menüeintrag aber eine Variante, die mit einem Standby zu vergleichen ist. D.h. die Kiste verbraucht auch jetzt noch Strom. Ich möchte aber einen Tiefschlaf (deep sleep). Und das geht mit:

sudo pmset hibernatemode 25

Danach schläft die Kiste tief und fest, wenn im Menü der Eintrag Ruhezustand ausgewählt wird oder einfach der Ein/Aus-Schalter gedrückt wird.
Zurück zu dem alten Verhalten kommt man im übrigen mit:

sudo pmset hibernatemode 3
Veröffentlicht unter Mac OSX | Kommentare deaktiviert

adb geht nicht …

Die Android Debug Bridge (adb) ist das Tool um seine Apps auf ein Android Phone oder auf den Emulator zu übertragen.
Bislang ging das bei mir auch anstandslos. Nur auf einmal tat sich nichts mehr. adb devices blieb stumm. Aber warum? Im Laufe der Analyse hatte ich herausbekommen, dass mit export ADB_TRACE=all adb ein bisschen auskunftsfreudiger war.

system/core/adb/adb.c::main():Handling commandline()
system/core/adb/adb_client.c::adb_query():adb_query: host:devices
system/core/adb/adb_client.c::_adb_connect():_adb_connect: host:version
system/core/adb/transport.c::writex():writex: fd=3 len=4: 30303063 000c
system/core/adb/transport.c::writex():writex: fd=3 len=12: 686f73743a76657273696f6e host:version
system/core/adb/transport.c::readx():readx: fd=3 wanted=4

Hä? Irgendwas blockierte da. Es hat sich herausgestellt, dass es ein Java-Programm war, was ich mal installiert hatte: traccar. Sehr hilfreich war der Post auf Stackoverflow. Hat allerdings bei mir ein bisschen gedauert bis ich festgestellt hatte, dass ich genau das gleiche Problem hatte.
Stoppen/Entfernen von traccar: sudo /opt/traccar/bin/traccar remove und sudo lsof -i um alle offenen “Internet-Dateien” anzuzeigen.

Veröffentlicht unter Android, Java, Mac OSX | 2 Kommentare

Apache ODF Toolkit, Templates befüllen …

Um z.B. Rechnungen im PDF Format zu erzeugen gibt es in der Java/Scala-Welt verschiedenen Ansätze. Einer ist sicher die Verwendung von iText (Lizenz aber ab 4.2 problematisch) oder JasperReports. Hiermit kann man schicke Sachen machen, aber mal eben so eine Vorlage zu erstellen ist nicht ohne und zumindest für den Laien fast unmöglich.
Da wäre es doch viel besser, wenn man ein Word- oder besser noch OpenOffice-Dokument nehmen könnte, dort Platzhalter definiert, die dann mit Werten gefüllt werden.
Mit Apache ODF Toolkit ist das im Prinzip auch kein Problem. Meine Platzhalter werden von $ eingerahmt, also z.B. $invoice.customer.name$. Folgender Code (Scala) skizziert die Umsetzung:

...
val templateOdt = TextDocument.loadDocument("Template.odt");

val searchItems = new TextNavigation("\\$[a-zA-Z_0-9.%]*\\$", templateOdt);
    
while (searchItems.hasNext()) {
      val placeholder: TextSelection = searchItems.nextSelection() match {
          case x: TextSelection => x
          case _ => null
      }
      val replace = placeholder.getText().replace("$", "") match {
          case "invoice.customer.name" => Some(customer.name)
          ...
          case _ => Some(placeholder.getText() + " not valid.")
      }
      if (replace.isDefined) {
          placeholder.replaceWith(replace.get);
      }
}

So weit so gut. Nun wollte ich die Rechnungsposten in einer Tabelle unterbringen. Das sollte so laufen, dass bei einem Treffer eines Rechnungsposten Platzhalters z.B. $invoice.item.text$ die Zeile als Vorlage für alle Posten genommen wird. Denn die Rechnung kann ja beliebige Posten haben, aber dazu sollte es ausreichen im Template nur eine Zeile zu definieren. Auch das funktionierte. Eine Zeile kann man wie folgt kopieren:

val copiedRow = row.getOdfElement().cloneNode(true)
row.getTable().getOdfElement().insertBefore(copiedRow, row.getOdfElement())

Jetzt fehlte ja nur noch, in der kopierten Zeile die Platzhalter mit einem Rechnungsposten bzw. dessen Attributen zu ersetzen. Auch das funktioniert mit replaceWith. Allerdings waren auf einmal die Formatierungen wie rechtsbündig oder fette Schrift verschwunden. Wie sich nach einigem Ausprobieren herausgestellt hat ist replaceWith ein wenig zerstörerisch, wenn es um eine Tabellenzelle geht. Mit folgendem Code habe ich das Problem umschifft:

if (replace.isDefined) {
    if (placeholder.isInstanceOf[CellSelection]) {
        val nodes = placeholder.asInstanceOf[CellSelection].getCell.getOdfElement().getChildNodes()
        for (i <- 0 to nodes.getLength() - 1) {
            nodes.item(i).setTextContent(nodes.item(i).getTextContent().replace(placeholder.getText(), replace.get))
        }
    } else
        placeholder.replaceWith(replace.get);
}
Veröffentlicht unter Java, Scala | Kommentare deaktiviert

Selbstsignierte Zertifikate akzeptieren

Das Einloggen auf einem Mailserver und Verschicken einer E-Mail sollte über eine gesicherte Verbindung erfolgen. Abgesichert werden die Verbindungen mittels Zertifikat. Die müssen aber zertifiziert werden. Das kann man selbst machen – dann wird ihnen aber nicht vertraut (man kennt die Meldungen z.B. im Browser) – oder dafür jedes Jahr Geld ausgeben (es gibt auch die Möglichkeit für lau [SSL für lau] so was zu bekommen, aber halt mit Einschränkungen, die in dem hier geschilderten Zusammenhang nicht wirklich praktikabel sind). Also die Verbindung mit einem selbstsignierten Zertifikat absichern. Immer noch hundertmal besser als unverschlüsselt.
Wenn man nun mit Java eine E-Mail über eine verschlüsselte Verbindung hinter der nur ein selbstsigniertes Zertifikat steckt verschicken will, wird eine Exception geworfen. Es gibt nun zumindest drei Möglichkeiten, das zu umgehen:

  1. Das Zertifikat in dem Truststore zu importieren. Wie das geht -> java java certificate import
  2. Die Standard-Implementierung zu ersetzen, so dass alle (oder bestimmte?) Zertifikate akzeptiert werden: Wie das geht -> java certificate class accept
  3. Oder via Property dafür sorgen, dass einem bestimmten oder allen (*) Servern vertraut wird.

Letzteres geht wie folgt (hier Scala, Apache Commons Email):

import org.apache.commons.mail.{HtmlEmail, DefaultAuthenticator, EmailException, EmailAttachment}
...
val email = new HtmlEmail()

val attachment = new EmailAttachment()

attachment.setPath("attachment.pdf")
attachment.setDisposition(EmailAttachment.ATTACHMENT)

email.attach(attachment)
email.setTLS(true)
email.setSSL(false)
email.setSmtpPort(25)

email.setHostName("smtp.meinedomain.de")

email.setAuthenticator(new DefaultAuthenticator("user","passwort"))

email.getMailSession().getProperties().put("mail.smtp.ssl.trust","smtp.meinedomain.de") // oder eben "*" für alle

email
.setTextMsg("Email Text")
.addTo("marianne.musterfrau@musterstadt.de")
.setFrom("emil.mustermann@musterstadt.de")
.setSubject("Test")
.send()
Veröffentlicht unter Java, Scala | Kommentare deaktiviert

Debugging mit Netbeans PHP bzw. Typo3

Zur Zeit stelle ich von TemplaVoila auf ExtBase, Fluid und Fed um. Da dafür auch eigene Extension zu entwickeln sind stellte sich für mich schnell die Frage nach Debugging von PHP-Anwendungen. Sollte natürlich so komfortable wie unter Java sein. Gestoßen bin ich dann auf XDebug in Verbindung mit Netbeans (PHP-Variante). Die Aptana Version (3) von Eclipse  ist da wohl nicht so weit. Also Xdebug auf meiner Virtuellen Maschine installiert (Debian Squeeze) und via Netbeans eine Debug-Session gestartet. Passierte aber nicht viel – weißer Bildschirm. Nun es lag daran, dass XDebug wohl die zulässigen Rekusionen einschränkt. Mit xdebug.max_nesting_level=1000 diese von 100 auf 1000 gesetzt und siehe da, es geht.

Veröffentlicht unter Debug, Keine Kategorie, PHP | Kommentare deaktiviert

Arduino Entwicklung mit Eclipse auf Mac OSX 10.7 (64 Bit)

Mein neues “Spielzeug” ist der Arduino. Z.Z. entwickle ich damit zusammen mit ein paar Mitstreitern eine Heizungssteuerung. Aber dazu ein andermal mehr …

Da das Hauptprogramm in Java und damit mit Eclipse entwickelt wird, hatte ich ein Recherche gemacht, ob es nicht möglich ist auch den Arduino-Part mit Eclipse zu programmieren. Mit dem Arduino eclipse plugin bin ich fündig geworden. Leider klappte ds nicht so ganz. Ich konnte das Programm nicht auf mein Board übertragen. Dank der Hilfe des Entwicklers Jantje (siehe Github) hab’ ich das Problem aber schnell einkreisen können. Die rxtx Library, die mit dem Plugin installiert wird, läuft nicht unter einem 64Bit OSX (s. auch z.B. hier). Also nachgeschaut, wo die Lib liegt und diese ausgetauscht (den Pfad entsprechend anpassen, ist mit aller Wahrscheinlichkeit anders als bei mir):

$ cd /Applications/eclipseCPP/configuration/org.eclipse.osgi/bundles/318/1/.cp
$ mv librxtxSerial.jnilib librxtxSerial.jnilib.old
$ mv <64Bit-Lib> .

Eclipse neu gestartet und es läuft.

Short english note:

Just replace the 32-bit rxtx lib with the 64-bit version. Explanation why and how to get the 64-bit version e.g. here. The path may be adjusted.

Veröffentlicht unter Arduino, Eclipse, Mac OSX | Kommentare deaktiviert

Dic avis tonitri (Thunderbird): Ubi es, fenestra?

Das man beim Schreiben von E-Mails mit Thunderbird Probleme bekommen kann, hätte ich auch nicht gedacht. Unter Mac OS X Lion öffnete sich das Bearbeitungsfenster auf einmal nicht mehr. Im Menü des Thunderbird-Icons im Dock tauchte der Dialog auch nicht auf, allerdings wurde er im Menü Fenster gelistet. Nach ein bisschen googlen bin ich auf diesen Forumseintrag gestoßen. Mein Problem ist, dass ich zwei Monitore verwende und Thunderbird das wohl irgendwie nicht gebacken bekommt. Wenn der Fehler auftritt, rufe ich unter den Einstellungen den Monitor-Anordnen Dialog auf (s.u.) und platziere den linken Monitor auf die rechte  Seite (Maus auf betroffenen Bereich, Klick halten und entsprechend verschieben).

Mac OS X Lion Monitore anordnen

Mac OS X Lion Monitore anordnen

Veröffentlicht unter Mac OSX | Verschlagwortet mit , | Kommentare deaktiviert

Automator Script als Dienst/Service speichern

Mein Automator Script zum einfachen Hinterlegen meiner Korrespondenz mit meinem Briefpapier wollte ich auf einen neuen Rechner übertragen. Automator weigerte sich aber beharrlich dieses zu speichern. Woran lag es? Automator speichert die Dienste im Verzeichnis /Users/<Login des Users>/Library/Services . Dieses Verzeichnis gehörte bei mir aber root (warum auch immer). Also mit sudo chown <Login des User> Services das geändert und siehe da, ich konnte den Dienst abspeichern.

Veröffentlicht unter Automator, Mac OSX, Script | Kommentare deaktiviert

Settings.bundle und Xcode

Das Erstellen einer lokalisierten Settings.bundle mit Xcode 4.1 unter Lion hat so seine Tücken. Mich hat das einiges an Zeit gekostet dahinter zu kommen, wie man diese lokalisiert.
Von Anfang: Mit New->File iOS->Resource Settings Bundle eben dies erzeugt. Dann zeigt sich auch brav der Ordner en.lproj . Nun wollte ich die Settings lokalisieren, habe es aber nicht geschafft Xcode dazu zu überreden einen de.lproj Ordner anzulegen. Nirgends war was zu finden, mit dem die Lokalisierung durchzuführen gewesen wäre. Selbst im Finder sah man nur eine Datei Settings.bundle. Das dass eine einfaches Verzeichnis ist, war so nicht ersichtlich. Irgendwann bin ich auf die Idee gekommen mit einer Shell zu versuchen “in” die Datei aka Verzeichnis zu kommen. Und siehe da, das ging. Also dort mit mkdir das Verzeichnis de.lproj angelegt und schon ging alles.

Veröffentlicht unter Mac OSX, Xcode | Kommentare deaktiviert