Zumindest in ITunes kopieren und dort *.ogg Dateien anhören geht mit diesem kostenlosen Plugin. Um die Tracks dann auf den iPod zu bekommen, muß man nochmal umkodieren, aber das ist allemal besser als vorher ewig nach einem recoder zu suchen.
Ogg für ITunes
10. Juni 2009Windows 7 RC Download ohne Registrierung
07. Juni 2009wget http://wb.dlservice.microsoft.com/dl/download/release/windows7/3/e/8/3e8c56ac-aa6c-4625-aefe-babca04d7d17/7100.0.090421-1700_x86fre_client_de-de_retail_ultimate-grc1culfrer_de_dvd.iso
Ubuntu Jaunty Jackalope amd64 auf Thinkpad T61 FREEZE
11. Mai 2009Leider hat das schöne neue Ubuntu ein massives Problem mit “ich weiß nicht was”; zumindest aber mit Teilen meines Rechners. Sporadisch friert einfach der komplette Rechner ein, manchmal blinkt noch die Caps-Lock Taste. In jedem Fall hilft nur noch ausschalten.
Nun habe ich bisher zwei Hinweise gefunden, wie man das Problem beheben kann. Zum einen gibt es wohl einen Bug in den Nvidia Treibern in Zusammenhang mit Multicore Prozessoren. Der soll in der Version 180.53 behoben sein. Installieren läßt sich der, indem man eine neue Apt-Source einträgt:
# latest nvidia drivers
deb http://ppa.launchpad.net/ubuntu-x-swat/x-updates/ubuntu jaunty main
deb-src http://ppa.launchpad.net/ubuntu-x-swat/x-updates/ubuntu jaunty main
Details findet man unter https://launchpad.net/~ubuntu-x-swat/+archive/x-updates
Nach dem Eintragen des neuen Repos muß man noch den Schlüssel importieren:
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0x643dc6bd56580ceb1ab4a9f63b22ab97af1cdfa9
Das war Teil eins des Versuches, das allein hat aber bei mir das Problem noch nicht gelöst. Als zweites habe ich den Hinweis gefunden, daß man den Kernel linux-image-2.6.28-12-generic_2.6.28-12 installieren soll. Der ist auch nicht in den Repos zu finden, deswegen habe ich ihn manuell installiert. Damit der Nvidia Treiber klar kommt, darf man auch die Kernel-Headers nicht vergessen:
wget http://launchpadlibrarian.net/26230679/linux-headers-2.6.28-12_2.6.28-12.43_all.deb
wget http://launchpadlibrarian.net/26230935/linux-image-2.6.28-12-generic_2.6.28-12.43_amd64.deb
sudo dpkg -i linux-headers-2.6.28-12_2.6.28-12.43_all.deb
sudo dpkg -i linux-image-2.6.28-12-generic_2.6.28-12.43_amd64.deb
Diese Pakete habe ich hier gefunden:
https://launchpad.net/ubuntu/jaunty/amd64/linux-headers-2.6.28-12/2.6.28-12.43
https://launchpad.net/ubuntu/jaunty/amd64/linux-image-2.6.28-12-generic/2.6.28-12.43
Jetzt bin ich mal gespannt, ob das reicht. Auf jeden Fall erstmal neu starten
Update
Das Kernelupdate hat nichts gebracht. Nach einem Suspend und ein wenig Klickerei ist der Rechner wieder eingefroren. Sieht so aus, als ob das hier das Problem ist, welches ungelöst ist.
Update II
Es geht vorran. Nach weiterer Herumprobiererei hat sich gezeigt, daß das System stabil läuft, so lange Firefox nicht geöffnet ist. Habe sozusagen zur Brechstange gegriffen und Firefox deinstalliert.
sudo aptitude purge firefox-3.0
Da das auch nicht die Superlösung ist, habe ich Firefox 3.5 Beta 4 installiert, welche einwandfrei funktioniert. Wenn man Youtube Videos versucht in den Vollbildmodus zu schalten, dann stürzt Firefox ab, aber nicht das System; akzeptabel.
Außer den Firefox herunterzuladen und zu entpacken muß man nichts tun, daß er funktioniert. Nur das Flashplugin muß man noch reinlinken, damit der Flash-Support funktionert. Angenommen man hat den neuen Firefox nach ~/bin/firefox entpackt, dann muß man in das Verzeichnis ~/bin/firefox/plugins wechseln und dort das Plugin linken:
ln -s /usr/lib/flashplugin-installer/libflashplayer.so .
Update III
Installation des Kernel 2.6.30 scheint zu helfen (mehr als eine Woche Freezefrei):
cd ~ mkdir kernel-2.6.30 cd kernel-2.6.30 wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.30/linux-headers-2.6.30-020630-generic_2.6.30-020630_amd64.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.30/linux-headers-2.6.30-020630_2.6.30-020630_all.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.30/linux-image-2.6.30-020630-generic_2.6.30-020630_amd64.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.30/linux-source-2.6.30_2.6.30-020630_all.deb sudo dpkg -i *
Netzwerkproblem mit Ubuntu Jaunty 64 und Java 32
26. April 2009Ein häßlicher Bug in Ubuntu hat mich etliche Nerven gekostet. Jegliche Netzwerkkommunikation hat funktioniert, alle Java Programme (z.B. auch Grails) konnten sich aber nicht verbinden.
Caused by: java.net.UnknownHostException: repo1.maven.org at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:519) at java.net.Socket.connect(Socket.java:469) at org.apache.tools.ant.taskdefs.Get.doGet(Get.java:158) at org.apache.tools.ant.taskdefs.Get.execute(Get.java:76)
Das Problem löst sich durch nachinstallieren eines Paketes: lib32nss-mdns.
Shii
09. April 2009Wii für Frauen: Shii
Dank für diese Information geht an den Herren hier.
iphone nerd
24. März 2009Wicket Performance
21. März 2009Nachdem ich Grails aufgrund der Performance und der komplett fehlenden statischen Typisierung erstmal nicht mehr so dick finde, beschäftige ich mich gerade mit Wicket (siehe auch vorheriger Post). Im Zuge dessen bin ich auf einen sehr interessanten Performancevergleich gestoßen, der einerseits zeigt, daß Wicket hier gut abschneidet, zusätzlich aber auch die Verwendeten Tools gut darstellt.
Wicket, Spring und Hibernate mit OpenSessionInView und das Ganze optional in der Kommandozeile
16. März 2009Das ist doch mal ne Überschrift.
Als fast noch euphorischer Spring+Hibernate User wollte ich eigentlich nur eine kleine Basisapplikation schreiben, welche ein simples Mapping mit Assoziationen beherbergt. Diese Applikation soll mehrere Transaktionen in einem Request (== in einer Session) beherrschen und seine Funktionalität auch in der Kommandozeile entfalten dürfen. Dann soll noch Wicket als UI Schicht drauf. Klingt einfach, für so ein ausgewachsenes Toolset, nicht war?
So lange wie ich nach einer Lösung gesucht habe, müßte ich jetzt eigentlich erstmal gefühlte 2 Stunden Bildzeitung oder schlimmeres Zitieren. Das erspare ich dem geneigten Leser.
Wir gehen davon aus, es existiert eine Webapp mit Spring 2.5.5, Hibernate 3.2 und Wicket 1.4RC.
Einfachster umzusetzender Fall:
(1) Bean mit JSP und BeanNameMapping
könnte schon alles sein, wenn heutzutage noch jemand freiwillig JSPs in einem neuen Projekt benutzen würde. Trotzdem sei die Möglichkeit hier genannt, weil sie die Minimalform des OpenSessionInViewInterceptor / OpenSessionInViewFilter darstellt.
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="order" value="0"/> <property name="interceptors"> <list> <ref bean="openSessionInViewInterceptor"/> </list> </property> </bean> <bean name="/hello.htm" class="xxx.HelloController"> <property name="trackService" ref="trackService"></property> </bean>
“Oh, das ist ja einfach.” - dachte ich auch. Bis ich das erste mal Versucht habe, in meiner Session mehrere Transaktionen zu benutzen. Dann merkt man nämlich, daß die Session warscheinlich nach dem Commit zu ist. “Wieso das?” fragen wir uns und lesen auf der Hibernate Seite über Sessions und Transactions nach; hier könnte man denken das ist normal so.
Because Hibernate can’t bind the “current session” to a transaction, as it does in a JTA environment, it binds it to the current Java thread. It is opened when getCurrentSession() is called for the first time, but in a “proxied” state that doesn’t allow you to do anything except start a transaction. When the transaction ends, either through commit or roll back, the “current” Session is closed automatically.OK, denken wir uns und vergessen ganz schnell das eingangs erwähnte Session-per-Operation Anti Pattern. Wer sich jetzt keine Waffel weiter macht kommt mit der Lösung wahrscheinlich irgendwie auch zu Daten aus dem ORM, wird zwar gelegentlich ein paar LazyLoadingExceptions fangen, aber da hilft dann ein
lazy="false"
![]()
Nein…
(1.a) Multi-Transaction per Session
Nun wollte ich an der Stelle doch nicht aufgeben und fragte mich die ganze Zeit, wie sich das all die schlauen Leute gedacht haben, wenn man mehrere Transaktionen haben will. Schließlich machen ja die ganze Session und deren Caching Mechanismen keinen Sinn, wenn man nur eine Transaktion darin machen könnte. Ohne Transaktionen arbeiten geht bekanntermaßen auch nicht.
So kam es, daß ich zunächst in irgendeinem JIRA Ticket von Spring in einer Antwort von Jürgen Höller laß, daß man
hibernate.current_session_context_class
nicht auf “thread” stellen darf.
Ah Ja …
Da kann man sich denken was man will (z.B., warum das nur in diesem JIRA Ticket zu finden ist), Fakt ist, daß man direkte Hibernate Konfiguration neben Spring am besten läßt. Kommt dazu, daß IntelliJ Idea eine Excellente Spring-ApplicationContext Code-Completion hat (oder das Schema an der Stelle gut genug ist), auf jeden Fall geht das ganz gut.
Die Konfiguration der Hibernate-Session via Spring führt dazu, daß die “Haupt Session”, welche am Request hängt nicht nach einer Transaktion schließt.
Man gelangt zu einer solchen SessionFactory:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>xx/Track.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider}</prop>
<prop key="hibernate.connection.pool_size">10</prop>
<prop key="hibernate.jdbc.batch_size">1000</prop>
<prop key="hibernate.bytecode.use_reflection_optimizer">${hibernate.bytecode.use_reflection_optimizer}</prop>
</props>
</property>
<!--property name="schemaUpdate" value="${hibernate.schemaUpdate}"/-->
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${hibernate.connection.driver_class}"/>
<property name="url" value="${hibernate.connection.url}"/>
<property name="username" value="${hibernate.connection.username}"/>
<property name="password" value="${hibernate.connection.password}"/>
</bean>
<bean name="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
Damit kann man nun schonmal halbwegs was anfangen, zumindest in dem o.g.
xxx.HelloController
welcher auf “/hello.htm” mappt. Innerhalb dessen - oder innerhalb der Methoden, die dieser Controller verwendet - kann man nun lustig Transaktionen auf- und zu machen.
(1.b) Multi-Transaction by Annotation
Damit man das Transactionhandling nicht manuell tun muß (und auch nicht sollte), kann man unter dem Block SessionFactory gleich noch mit spezifizieren, daß Spring die Transaktionen automatisch nach Annotation auf und zu macht:
<!-- Tell Spring it should use @Transactional annotations --> <tx:annotation-driven/> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> <property name="nestedTransactionAllowed" value="true"/> </bean>
Mit dieser Konfiguration kann man jetzt in einer verwendeten Service-Klasse schreiben:
@Transactional(readOnly = true)
public Track findTrackByFilename(String filename) {
// ...
}
@Transactional(rollbackFor = Exception.class)
public Album findAlbumByNameOrCreate(String name) {
// ...
}
und Spring macht den Rest. Das ist doch schonmal ganz sexy.
(2) Einbindung Wicket
Nachdem nun das Spring-”Minimal” Beispiel funktioniert, sollte man mal weiter nach Vorne im Schichtenmodell gehen. Wir wollen einen Wicket Controller mit OpenSessionInView bestücken. Da fällt auf, daß die Wicket Requests nicht über das Spring Mapping laufen und damit auch nicht von dem HibernateSessionInViewInterceptor greifbar sind. Hier hat Jürgen und sein Team vorgesorgt und gleich einen HibernateOpenSessionInViewFilter mitgeliefert. Den kann man ganz trivial auf die Wicket Requests klemmen.
<servlet>
<servlet-name>WicketApplication</servlet-name>
<servlet-class>org.apache.wicket.protocol.http.WicketServlet</servlet-class>
<init-param>
<param-name>applicationClassName</param-name>
<param-value>xxx.wicket.Application</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WicketApplication</servlet-name>
<url-pattern>/wicket/*</url-pattern>
</servlet-mapping>
<!-- this will be used by wicket only as spring requests use osivInterceptor -->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/wicket/*</url-pattern>
</filter-mapping>
Am Ende passiert hier drin das Gleiche wie in dem Interceptor.
Vielleicht gibt es ja auch eine Variante, wie man Wicket (welches am Ende auch wieder mit Spring bestückt wird) über den OSIV Interceptor filtern kann. Dann hätte man nämlich auch nicht die dumme Notwendigkeit einen extra URL Level (hier: “wicket”) aufzumachen. Comments appreciated…
Mehr zu der eigentlichen Spring-Wicket Integration gibt es übrigens bei DZone, soll aber nicht Inhalt dieses Artikels sein.
(3) Die Kommandozeile
Als ob das nicht schon genug Text wäre, kommt nun hier (meiner Meinung nach) der interessanteste Teil. Wie oben gesagt ist Anforderung an die Applikation, daß man quasi alles auch per CMD bedienen kann. Beispiele wären Batch-Processing (Import) oder Integration Test. Man kann sich jetzt schnell denken, daß es hier keinen OSIV Filter oder Interceptor gibt. Mist. An der Stelle bekommt man nochmal schmerzlich zu spüren, daß Spring-Hibernate nicht gleich Hibernate ist, denn einfach eine Session öffnen reicht hier nicht aus. Spring proxied hier und da noch etwas.
Wenn man jetzt eine CMD Applikation starten würde bekommt man entweder eine solche Exception:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
oder was ich noch verwirrender finde:
java.lang.IllegalStateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
Haben wir nicht weiter oben gelesen, daß man die Session nicht an den Thread binden darf?
Zwei Links haben mich hier zu einer Lösung gebracht: dieser junge Mann hier und der Thread. Dabei kommt eine schlichte SessionKlasse heraus, die man z.B. in einer main-Methode aufrufen könnte oder per AOP an die richtige Stelle binden könnte.
/**
* pretty much a clone of what the hibernate session in view filter does
* User: ab
* Date: Mar 8, 2009
* Time: 9:37:19 AM
*/
public class Session extends HibernateAccessor {
private final Logger log = Logger.getLogger(Session.class);
public void startSession() {
org.hibernate.classic.Session session = getSessionFactory().openSession();
setFlushMode(FLUSH_NEVER);
//Bind the Session to the current thread/transaction
TransactionSynchronizationManager.bindResource(getSessionFactory(), new SessionHolder(session));
//Activate transaction synchronization for the current thread.
TransactionSynchronizationManager.initSynchronization();
}
public void endSession() throws HibernateException {
SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(getSessionFactory());
log.debug("Flushing single Hibernate Session");
try {
flushIfNecessary(sessionHolder.getSession(), false);
}
catch (HibernateException ex) {
throw convertHibernateAccessException(ex);
}
sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(getSessionFactory());
log.debug("Closing single Hibernate Session");
SessionFactoryUtils.releaseSession(sessionHolder.getSession(), getSessionFactory());
}
}
Bei exzessiven Import-Operationen muß man lediglich beachten, daß man regelmäßig die Session flush()t und clear()t. Ansonsten hat man in allen Belangen eine äußerst praktische und vielseitige Basis.
Damit sind alle Anforderungen erfüllt und ich kann mich nun um das (eigentlich popelige) Problem des Mappings kümmern. Wenn das mal kein erfolgreiches Wochenende ist.
Pageant - einfaches SSH Keyhandling
01. Februar 2009Trotz intensiver Nutzung von WinSCP und Putty habe ich erst kürzlich ein chices Tool kennen gelernt, welches unter Windows die Eingabe von SSH-Key Passwörtern auf das Minimum reduzieren kann: einmal pro Sitzung. Das heißt, man hat quasi immernoch die volle Sicherheit, aber weniger Nerverei.
Wie es geht ist einfach: alle Programme (hier kenne ich nur Putty und WinSCP), welche einen oder mehrere SSH-Keys benutzen, werden über Pageant gestartet. Pageant verwaltet die Logon Informationen, es wird mit WinSCP im Untermenu “Key Tools” mit installiert. Um möglichst zentral den Aufruf von beispielsweise WinSCP umzulenken verändert man dessen Startverknüfung:

Der hier blau markierte Bereich ist die geänderte Verknüfung und enthält:
C:\Programme\WinSCP\PuTTY\pageant.exe U:\.ssh\andi.ppk -c C:\Programme\WinSCP\WinSCP.exe
Wie man sieht drei Teile, diese bestehen aus:
- dem Aufruf von Pageant (das genannte Programm zum cachen der Login Informationen)
- dem SSH-Key, welcher das Passwort benötigt (hier kann man auch mehrere Keys hintereinander, mit Space getrennt, angeben)
- dem Programm, welches mit den gecacheten Keys gestartet werden soll. Hier ist das WinSCP, das kann auch genauso gut Putty sein.
Bis auf den Pfad zum Key sollte man diese Zeile bei einer Standardinstallation kopieren und in seine eigene Verknüpfung einfügen können.
Ubuntu Framebuffer Boot @1400×1050
18. November 2008$ sudo nano /etc/initramfs-tools/modules
fbcon
vesafb
vga16fb
$ sudo nano /etc/modprobe.d/blacklist-framebuffer
# blacklist vesafb
# ...
# blacklist vga16fb
$ sudo apt-get install hwinfo
$ sudo hwinfo –framebuffer|grep 1400
Mode 0x0347: 1400x1050 (+1400), 8 bits
Mode 0x0348: 1400x1050 (+2800), 16 bits
Mode 0x0349: 1400x1050 (+5600), 24 bits
$ sudo nano /boot/grub/menu.lst
# defoptions=vga=0x0347 nosplash
# ...
# kernel /boot/vmlinuz-2.6.27-7-server root=UUID=ccde16b6-e33a-4e7c-ae9e-0e9da0974477 ro nosplash vga=0x0347