Archiv der Kategorie Computer

DCP’s erstellen

Aus Spaß hab ich mir mal angschaut wie man aus beliebigen Video Quellen wohl ein DCP erstellt. Es stellte sich heraus das dies mittels Open Source Tools ar nicht so einfach ist. Ich hatte folgende URL gefunden:

http://bitfilms.blogspot.de/2010/11/making-dcp-entirely-with-open-source.html

Leider hat das bei mir aufgrund eines Fehlers in der opnjpeg Bibliothek nie  funktioniert. Ich habe es aber folgendermaßen geschafft:

Wieder ffmpeg, diemal, um einzelne Bilder zu erhalten:
ffmpeg -r 24 -i ../Trailer.mp4 -f image2 %08d.png
Aber Achtung, mit png braucht man da für 90min irgendwas im Terabyte Bereich an Platten Platz. Normales JPEG dürfte bei 90% der Videoquellen aber  zu keinem Qualitätverlust führen (oder hat jemand ne Sony HDCAM zur Hand?)

Dann die Bilder in 12bit per Channel tiffs wandeln:

for i in *png; do
convert $i -type TrueColor -alpha Off -depth 12 \
-gamma 0.454545 \
-recolor “0.4124564 0.3575761 0.1804375 \
0.2126729 0.7151522 0.0721750 \
0.0193339 0.1191920 0.9503041″ \
-gamma 2.6 $i.tif
done;

Theoretisch könnte man über openjpeg daraus jetzt jpeg2k Bilder machen, wie gesagt, aufgrund eines Speicherlochs hat das bei mir nie funktioniert…

for i in *tif; do
image_to_j2k -cinema2K 24 -i $i -o $i.j2c
done;

Hier hilft aber opendcp.

Jetzt noch den Audiotrack holen…
mplayer -vc null -vo null -nocorrect-pts -ao pcm:waveheader Trailer.mp4

Dann in rechts und links splitten:

sox audiodump.mp3 outfile1 remix 1
sox audiodump.mp3 outfile2 remix 2

Damit hat man dann alle Quellen um mit opendcp das DCP zu erstellen. Schnell noch ne externe Festplatte kaufen, mit ext3 formatieren und los kanns gehen im Kino…

ffmpeg

Ich hatte in letzter Zeit öfter mal die Notwendigkeit zwischen verschiedenen Videoformaten hin und her zu konvertieren. Natürlich gibts da dann das ein oder andere GUI Programm (z.B. sehr zu Empfehlen Handbrake und makemkv) aber ffmpeg is your Friend…

 Konvertiere in DVD Format:
ffmpeg -i Trailer.mp4 -f dvd -target pal-dvd -aspect 16:9 -mbd rd -trellis -mv0 -cmp 0 -subcmp 2 Trailer.mpg

Konvertiere von mxf nach h264:
ffmpeg -i film_j2c.mxf -i film_pcm.mxf -vcodec libx264 -acodec ac3 ../film.avi

DCP 3d Film nach 2d
EIn wenig mehr tricky, aber möglich: Einzelbilder machen
ffmpeg -r 24 -i ../Trailer.mp4 -f image2 -vcodec mjpeg -qscale 1 %08d.jpg

Format png geht zwar auch, aber da braucht man für 90min Terabytes…

Die hälfte der Bilder löschen
rm [0-9]*[0,2,4,6,8].jpg

Dateien umbenennen
cnt=1; for i in *; do mv $i `printf “%08d” $cnt`.jpg; cnt=$((cnt+1)); done

Dann aus den Bildern wieder Film machen…
ffmpeg -r 24 -i %08d.jpg -i ../ton.mxf -acodec ac3 -vcodec libx264 ../film.avi

Die qualität ist erstaunlich gut…

Oracle BPEL und neue Endpoint URLS

In einem Projekt habe ich das Problem es mit einer ganzen Menge von BPEL Prozessen (in diesem Fall der SOA Suite 10g) zu tun zu haben. Das ganze funktioniert eigentlich ganz gut, das Problem ist nur das die Prozesse in verschiedenen Umgebungen laufen müssen. Nun könnte man im JDeveloper BPEL Editor überall die neuen Endpoint URL’s eintragen. Aber das ist gar nicht so einfach, wenn der Webservice von meiner Entwicklungsumgebung aus nicht erreichbar ist compiliert das ganze nicht und somit wird dann auch kein Deployment File erzeugt. Die einzige Möglichkeit ist das Deployment File zu erstellen und dann, hinterher, in der bpel.xml die Endpoint URL’s zu ersetzten.

Hilfe naht mittels eines kleinen Shell Scripts:


#!/bin/sh

# alter Server
export OLD_SERVER=alter.server.de:8080
# neuer Server
export NEW_SERVER=neuer.server.de
# Verzeichnis in dem die bpel Prozesse liegen
export SOURCE=quelle
# Verzeichnis in das die neuen Dateien geschrieben werden sollen
export DESTINATION=../neuesVerzeichnis

cd quelle
for i in *bpel_*, do
  unzip $i -d ../tmp$$
  sed s/$OLD_SERVER/$NEW_SERVER/g  ../tmp$$/bpel2.xml
  mv ../tmp$$/bpel2.xml ../tmp$$/bpel.xml
  cp $i $DESTINATION

  cd ../tmp$$/
  zip $DESTINATION/$i -D bpel.xml
  cd -
  rm -rf ../tmp$$/*
done;

rm -rf ../tmp$$

Geht mit Cygwin natürlich auch unter Windows…

Mehrere Java Klassen Serialisierbar machen

In einem Projekt, in dem die Migration von einem ollen OC4J (10g 10.1.3.4) auf einen einigermaßen aktuellen (naja, ok, der ist auch schon fast 5 Jahre alt) Bea WebLogic (11g, 10.0.3.4) gemacht werden wird habe ich die Aufgabe ein ganze Reihe von Java Klassen Serialisierbar zu machen. Da es dabei um ca. 50 Klassen geht muss das per Script gehen. Und folgendes Scrip erledigt das auch prima:


#!/bin/sh
for i in *; do
  sed '/import javax.xml.bind.annotation.XmlType/a
import java.io.Serializable;' $i > a.tmp
  sed '{/public class [a-z,A-Z]/s/ / implements Serializable /3}' a.tmp > b.tmp
  cp b.tmp $i
done;
rm a.tmp
rm b.tmp

Klar, das ganz geht natürlich nur mit ner bash und sed, aber das sollte mit Cygwin ja auch unter jedem Windows laufen…

Oracle Startup File für Linux

So, nachdem ich jetzt schon ewig nix mehr geschrieben habe, hier mal was von praktischem Nutzen. Vor langer Zeit schon habe ich mir ein Startup File für die Oracle Datenbank geschrieben das mit einem System V Init die Datenbank(en) die in der /etc/oratab stehen mit Ihren Diensten startet.

Hier mal das Script:

#!/bin/sh
# description: Oracle auto start-stop script.
# chkconfig: - 60 20
#

# Source function library.
if [ -x /etc/rc.d/init.d/functions ]; then
  . /etc/rc.d/init.d/functions
fi

# We need this to determine the oracle user
if [ ! -f /etc/sysconfig/oracle ]; then
  exit 0
fi
. /etc/sysconfig/oracle

# See if ORACLE_OWNER is set
if [ "+" = "+$ORACLE_OWNER" ]; then
  exit 0
fi

case "$1" in
    'start')
        # Look at the /etc/oratab file and start the marked databases
        for i in `grep -v "^#" /etc/oratab`; do
          if [ `echo $i | cut -d: -f 3` = Y ]; then
            ORACLE_HOME=`echo $i | cut -d: -f 2`
            ORACLE_SID=`echo $i | cut -d: -f 1`
            if [ -e $ORACLE_HOME/bin/dbstart ]; then
              su - $ORACLE_OWNER -c "export ORACLE_HOME=$ORACLE_HOME; ORACLE_SID=$ORACLE_SID $ORACLE_HOME/bin/lsnrctl start"
              su - $ORACLE_OWNER -c "export ORACLE_HOME=$ORACLE_HOME; ORACLE_SID=$ORACLE_SID $ORACLE_HOME/bin/dbstart $ORACLE_HOME"
              su - $ORACLE_OWNER -c "export ORACLE_HOME=$ORACLE_HOME; ORACLE_SID=$ORACLE_SID $ORACLE_HOME/bin/emctl start dbconsole"
            fi
            if [ -e $ORACLE_HOME/opmn/bin/opmnctl ]; then
              su - $ORACLE_OWNER -c "export ORACLE_HOME=$ORACLE_HOME; ORACLE_SID=$ORACLE_SID $ORACLE_HOME/opmn/bin/opmnctl startall"
            fi
          fi;
        done
        touch /var/lock/subsys/oracle
        ;;
    'stop')
        # Stop the Oracle databases:
        for i in `grep -v "^#" /etc/oratab`; do
          if [ `echo $i | cut -d: -f 3` = Y ]; then
            ORACLE_HOME=`echo $i | cut -d: -f 2`
            ORACLE_SID=`echo $i | cut -d: -f 1`
            if [ -e $ORACLE_HOME/opmn/bin/opmnctl ]; then
              su - $ORACLE_OWNER -c "export ORACLE_HOME=$ORACLE_HOME; ORACLE_SID=$ORACLE_SID $ORACLE_HOME/opmn/bin/opmnctl stopall"
            fi
            if [ -e $ORACLE_HOME/bin/dbstart ]; then
              su - $ORACLE_OWNER -c "export ORACLE_HOME=$ORACLE_HOME; ORACLE_SID=$ORACLE_SID $ORACLE_HOME/bin/lsnrctl stop"
              su - $ORACLE_OWNER -c "export ORACLE_HOME=$ORACLE_HOME; ORACLE_SID=$ORACLE_SID $ORACLE_HOME/bin/dbshut $ORACLE_HOME"
            fi
          fi;
        done
        rm -rf /var/lock/subsys/oracle
        ;;
    'status')
      for i in `grep -v "^#" /etc/oratab`; do
        if [ `echo $i | cut -d: -f 3` = Y ]; then
            ORACLE_HOME=`echo $i | cut -d: -f 2`
            ORACLE_SID=`echo $i | cut -d: -f 1`
            if [ -e $ORACLE_HOME/opmn/bin/opmnctl ]; then
              echo $i;
              su - $ORACLE_OWNER -c "export ORACLE_HOME=$ORACLE_HOME; ORACLE_SID=$ORACLE_SID $ORACLE_HOME/opmn/bin/opmnctl status"
            fi
            if [ -e $ORACLE_HOME/bin/dbstart ]; then
              echo $i;
              su - $ORACLE_OWNER -c "export ORACLE_HOME=$ORACLE_HOME; ORACLE_SID=$ORACLE_SID $ORACLE_HOME/bin/lsnrctl status"
            fi
        fi
      done
    ;;
esac

Zu beachten gibts noch dass in /etc/sysconfig/oracle der Oracle Benutzer eingetragen werden muss, Beispielsweise so:

ORACLE_OWNER=oracle

Vielleicht hilfts ja dem ein oder anderen…

Solaris

Heute habe ich eine 18 GB Festplatte, die ich letzte Woche bei EBay fuer 6,50 Euro ersteigert habe bekommen.

Sofort habe ich die in meine Sun Ultra 60 eingebaut und OpenSolaris 10 05/08 installiert. Das hat eine weile gedauert, aber versuch mal Windows Vista auf einem 10 Jahre alten PC zu installieren ….

Plan9 (aber nicht from outer Space) Teil 1

Ich bin ja so ein wenig ein Fan der Betriebssysteme mit dem x im Namen (mit zwei ausnahmen: bei Solaris ist kein x im Namen und Mac OS/X kenn ich nicht).

Seit einigen Jahren wird an den Bell Labs, das sind die Nachfolger jener bei welchen ursprünglich mal UNIX auf der PDP11 entwickelt wurde,  ein “Nachfolger” entwickelt. Der hat den Namen Plan9 angelehnt an den Legendären Science-Fiction Film”Plan 9 from outer Space” von Ed Wood. Das Konzept des “alles ist ein File” soll bei diesem Betriebssystem wirklich für alles gelten, z.B. auch für Netzwerkressourcen. Natürlich kann so ein neues Betriebssystem nicht ohne eine grafische Oberfläche daherkommen, deswegen wurde “rio” dazugebaut. Der “root”Benutzer heißt hier glenda, auch in Anlehnung an einen Ed Wood Film.

Hört sich alles ziemlich interessant an, oder? Also gut, gleich mal ausprobieren.

Da das ganze Open Source ist und von http://plan9.bell-labs.com/plan9/download.html heruntergeladen werden kann, stellt auch das kein Hindernis dar.

Also gedacht getan!

Da ich ja nun zwar schon so den einen oder anderen Rechner bei mir zuhause rumstehen habe, aber keinen nur für Plan9 reservieren wollte musst das ganze in einer Virtuellen Maschine laufen.

Als erstes habe ich mich an VirtualBox von Sun versucht. RPM Paket von https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_SMI-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=innotek-1.6-G-F@CDS-CDS_SMI für das entsprechende Host Betriebssystem herunterladen. Dann einfach das Paket installieren (in meinem Fall für Fedora Core 9):

rpm -ivh VirtualBox-1.6.2_31466_fedora9-1.i586.rpm

Jetzt kann mit dem erstellen der Virtuellen Maschine begonnen werden. Das erstellen, verwalten und ändern von virtuellen Maschinen geschieht mit dem Befehlt VBoxManage. VM anlegen:

VBoxManage createvm plan9

Noch eine virtuelle Platte mit 1 GB anlegen:

VBoxManage createvdi -filename plan9.dsk -size 1024

Diese “Platte” muss noch registriert werden:

VBoxManage registerimage disk plan9.dsk

Jetzt der VM noch ein wenig mehr Speicher gönnen

VBoxManage modifyvm -memory 512M

Und schon kann damit gearbeitet werden:

VBoxSDL -hda .VirtualBox/VDI/plan9.dsk -cdrom Download/plan9.iso -vm plan9

Damit startet die Virtuelle Maschine und bootet vom CD Image. Ach ich vergaß: damit ein Benutzer mit VirtualBox arbeiten kann muss er der Gruppe vboxusers angehören.

Auf diese Weise konnte ich plan9 installieren. Allerdings war das ganze ziemlich zäh und die “Load” anzeige die Plan9 bei der Installation zeigt hatte immer ca. 15.000 Interrupt anfragen. Ich habe ein wenig mit den Parametern der virtuellen Maschine rum gespielt, aber ohne erfolg.

Also zweiter Versuch mit qemu-kvm. Die Installation unter Fedora Core 9 ist ziemlich einfach:

yum install kvm

Damit hat man dann schon alles was man benötigt. Natürlich muss auch hier eine Image Datei für die virtuelle Platte erzeugt werden:

dd if=/dev/zero of=plan9.dsk bs=1024 count=1024000

damit bekommt man ein Image von (nicht ganz) 1GB. Gestartet wird die VM nun über:

qemu-kvm -cdrom Download/plan9.iso plan9.dsk -m 512

Und schon gehts los:
plan9_1.pngplan9_2.png

Die Installation kann beginnen. Diesmal gibts auch keine Probleme mit den Interrupts.

Nach der Installation und dem ersten Login (mit dem Benutzer glenda, das ist gewissermaßen der “root” Benutzer von plan9) sieht das ganze dann so aus.

plan9_3.png

So genug für heute. Fortsetzung folgt …

Ich bin nicht allein

Seit einiger Zeit arbeite ich an einem Projekt für einen Kunden. Dort wird die JPA mit der Implementierung Toplink Essentials verwendet.

Was mich das Ding Nerven gekostet hat!!!!!! Manchmal hab ich den Eindruck da sind mehr Fehler als funktionierende Features drin. So ein paar Highlights sind:

  • Die Umsetzung von EJBQL (oder JPQL) in SQL funktioniert nicht fehlerfrei. Wenn man es geschickt anstellt (so wie ich) baut er einen Select der ein kartesisches Produkt zurückliefert.
  • Laut Dokumentation lässt sich über einen Hint festlegen wie gecached werden soll. In einem Master Detail Modell funktioniert das aber immer nur für den Master…
  • Zumindest im OC4J kann ich nur einen persistence Provider verwenden. Das ist ja ganz prima, und was mache ich wenn ich Daten aus mehr als einer Datenbank benötige?
  • Das schreiben über merge funktioniert nicht zuverlässig. Ich hab wirklich an mir gezweifelt, aber es stimmt: Ab und zu vergisst der Toplink Essentials einfach Daten in die Datenbank zu schreiben. Obwohl ich ihm schon mit einem explizitem Merge gesagt habe er soll das tun! Mir war nicht möglich darin in irgendeiner Form einen Determinismus zu erkennen!
  • Und da kommt dann auch schon der nächste Bug: wenn der merge bei einem Detail Objekt einen Update machen soll dann “vergisst” er das auf jeden Fall!

So schön die JPA ist, mit Toplink Essentials kann man das nicht verwenden! Da ist man nur am Workaround bauen.

Ich habe schon einige sachen mit JPA und Hibernate gemacht. Der ist zwar jetzt auch nicht so ganz ohne, aber er hat (zumindest bei mir) immer ohne Probleme funktioniert.

Jetzt habe ich aber heute das hier auf diesem Blog entdeckt:

“For now I’ll keep using OpenJPA until the Glassfish people can make Toplink Essentials stop sucking so damn much. OpenJPA is a bit more pedantic anyway, and that’s a good thing. My code should end up tighter as a result”

Ich glaub ich muss mir mal OpenJPA angucken.

Web Services mit EJB 3.0 und JPA

Ich hab in letzter Zeit mal ein wenig mit durch EJB 3.0 implementierte SOAP Web Services rumgespielt. Alles in allem ist das prima, einfach ein paar Annotationen, und schon hat man einen Web Service.

Wenn man jetzt aber versucht seine JPA Klassen (die können ja serialisiert werden) über diesen Web Service zu schicken dann bekommt man (vorausgesetzt das Datenmodell besteht aus mehr als einer Klasse) die Fehlermeldung das “circular References” vorhanden sind.

Ist ja eigentlich auch klar. Die Java Klassen referenzieren sich ja mit “Zeigern” während im XML (dem SOAP Body) sowas natürlich nicht geht.

Die Frage ist nun ob man dem Container beibringen kann nur entweder die

@OneToMany

oder die

@ManyToOne

Methode zu serialisieren, und die jeweils andere zu ignorieren. Denn dann würds ja funktionieren. Vielleicht find ich da ja noch was …

Update Montag den 07. Juli 2008:
Also ich hab ganz schön lang gesucht und leider nix gefunden. Ich fürchte man kommt um DTO’s in diesem Zusammenhang nicht herum. Schade …

Update Sonntag den 04. Januar 2009:
Mann manchmal stellt man sich an! Ist doch ganz einfach, bevor man die Pojo’s als SOAP Nachricht verschickt löscht man in der EJB einfach die circular Reference raus. Voila, und schon gehts! Also nix mit DTO’s!!!!!

|