… ist heute nicht mehr zu rekonstruieren. Am Anfang habe http://javainsel.blogg.de/ genutzt, heute schon lange tot, aber blogg.de gibt es immer noch. Im Archiv http://web.archive.org/web/20040321205354/http://javainsel.blogg.de/ geht der erste Eintrag auf den 17.03.2004 zurück, was heißt, dass ich schon über 10 Jahre blogge. Nach blogg.de folgte blogger.com von Google und seit einigen Jahren ist es eine eigene WordPress-Installation.
Autor: Christian Ullenboom
Nebenläufigkeit und Parallelität
Computersysteme lösen Probleme in der echten Welt, sodass wir zur Einstieg auch in der Realwelt bleiben, um uns dem Umfeld der nebenläufigen Programmierung zu nähern.
Gehen wir durch die Welt bemerken wir viele Dinge, die gleichzeitig passieren: Die Sonne scheint, auf der Straße fahren Mofas, Autos werden gelenkt, das Radio spielt, Menschen sprechen, einige essen, Hunde tollen auf der Wiese. Nicht nur passieren diese Dinge gleichzeitig, sondern es gibt mannigfaltige Abhängigkeiten, wie Wartesituation: an der roten Ampel warten einige Autos, während bei der grünen Ampel Menschen über die Strasse gehen – beim Signalwechsel dreht sich das Spiel um.
Wenn viele Dinge gleichzeitig passieren, nennen wir ein interagierendes System nebenläufig. Dabei gibt es Vorgänge, die echt parallel ausgeführt werden können, und bei machen Dingen sieht es so aus, als ob sie parallel passieren, aber in Wirklichkeit passiert es nur schnell hintereinander. Was wir dann wahrnehmen, ist eine Quasiparallelität. Wenn zwei Menschen etwa gleichzeitig essen, ist das parallel, aber wenn jemand isst und atmet, so sieht dass zwar von außen gleichzeitig aus, ist es aber nicht, sondern schlucken und atmen ist sequenziell[1]. Auf Software übertragen: die gleichzeitige Abarbeitung von Programmen und Nutzung von Ressourcen nebenläufig ist; es ist eine technische Realisierung der Maschine (also Hardware), ob diese Nebenläufigkeit durch parallele Abarbeitung – etwa durch mehre Prozessoren oder Kerne – auch wirklich umgesetzt wird.
Nebenläufige Programme werden in Java durch Threads realisiert und im Idealfall findet die Abarbeitung auch parallel statt, wenn die Maschine mehrere Prozessoren oder Kerne hat. Ein Programm, was nebenläufig realisiert ist, kann durch zwei Prozessoren bzw. Kerne in der parallelen Abarbeitung in der Zeit halbiert werden, muss es aber nicht, es ist immer noch Sache des Betriebssystems, wie es die Threads ausführt.
[1] lassen wir Kleinkinder einmal außen vor
Q&A: Wie lässt sich mit JavaMail die Anzahl Mail-Anhänge ermitteln?
Eine gesonderte Methode gibt es nicht, aber man kann die Mail-Teile ja ablaufen und dann zählen:
int nrOfAttachements = 0; Multipart mp = (Multipart) message.getContent(); for (int i=0, n=multipart.getCount(); i<n; i++) { Part part = multipart.getBodyPart(i)); String disposition = part.getDisposition(); if ((disposition != null) && ((disposition.equals(Part.ATTACHMENT) || (disposition.equals(Part.INLINE))) nrOfAttachements++; }
Q&A: Wie kann man die Laufzeit von Programmteilen messen und Statistiken einsammeln?
Hierzu gibt es viele Möglichkeiten, eine davon mit JAMon: http://jamonapi.sourceforge.net/.
Q&A: Gibt es kostenlosen Webspace mit Java-Server?
Mit PHP als Sprache gibt es einiges, im Java-Umfeld sieht es da mau aus. Eine Lösung ist die Google App Engine. Sie ist frei (für normale Quotas), es laufen normale Web-Apps drauf (Jetty), es gibt einen NoSQL-Datastore, und noch mehr. Deployment ist auch sehr einfach, über die IDE.
Q&A: Wie bekommt man Javadoc-Kommentare der Konstruktoren “vererbt”
Ein Konstruktor wird nicht wie Methoden vererbt und überschrieben. Wo also @inheritDoc für sichtbare Methoden der Oberklasse funktioniert, ist das bei Konstruktoren nicht möglich. Eine Lösung wäre, mit @see die Verbindung im Javadoc herzustellen.
Siehe auch http://stackoverflow.com/questions/13327534/details-of-difference-between-see-and-inheritdoc.
Q&A: Wie kann man zwei Datenbanken auf Unterschiede vergleichen?
Dafür gibt es verschiedene Werkzeuge, die auch erst einmal nichts mit Java zu tun haben. Wenn man das jedoch programmieren möchte, so hilft dbUnit, siehe auch http://www.dbunit.org/howto.html.
Q&A: Wird Math.sin(…) auf Maschinencode abgebildet?
Math.sin(double) ist eine native Implementierung, aber wie hier genau optimiert wird, kommt auf die JVM-Implementierung an. Trigonometrische Berechnungen sind echt ein Problem, insbesondere, weil sie alle strictfp durchgeführt werden (siehe Quellcode). Die Berechnung ist zwar native doch muss der Fließkommaprozessor mitunter den IEEE 754 Standard nachbilden, um auf ein exaktes reproduzierbares (eben strictfp) Ergebnis zu kommen auf allen Rechnern zu kommen. Eine oft diskutierte Lösung ist eine native C-Funktion zu nutzen, die direkt SIN vom Fließkommaprozessor nutzt, ohne die in IEEE 754 beschriebene Lösung zu berechnen. (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5005861) Das Problem ist in Java 6 angegangen worden aber nicht abschließend gelöst. Vielleicht gehen auch Sin-Tabellen, aber dass muss man dann ganz genau messen, ob sich das lohnt.
Q&A: Wie kann man die Netzwerkübertragung besser optimieren?
Bei der Client-Server-Kommunikation meines Spiels harkt es und das auch nur bei einem Spieler, was kann man tun?
Es gibt kaum Möglichkeiten zur Optimierung im Java-Umfeld. Die Netzwerkverbindung sollte auf bleiben, sodass keine (große) Zeit für den Neuaufbau anfällt. Serialisierung ist nicht so teuer, GZippen wird auch nicht viel bringen. Im lokalen Netz ist time(UDP) = time(TCP) und bei UDP muss man zu viel selbst machen, da bringt auch ein Protokollwechsel im Grunde nichts. NIO wäre mit Kanonen auf Spatzen und lohnt sich nur bei vielen Verbindungen. Eventuell bringt Nagle noch was: http://www.davidreilly.com/java/java_network_programming/#3.3.
Q&A: JDBC ResultSet aus Text-Datei oder Excel füllen
Frage: Ich möchte ein ResultSet mit Daten aus einem Excel oder einem Textfile laden.
Antwort: Die Möglichkeit besteht. Dazu nutzt man einen JDBC-Treiber, der auf Textdateien arbeitet. http://csvjdbc.sourceforge.net/ (CsvJdbc Home) bietet das für Textdateien (CSV), für Excel gibt es so was auch, http://sourceforge.net/projects/xlsql/ (Excel JDBC Driver | Free Development software downloads at SourceForge.net).
Q&A: Optimiert der Java-Compiler die Multiplikation konstanter Faktoren?
Wenn ich in mein Quellcode schreibe:
int i = 60 * 1000;
Wie kompiliert javac das? Wird die Rechenoperation schon zur Compile-Zeit ausgeführt, oder erst zur Laufzeit?
Antwort: Diese "compile-time constant expression" optimiert der Compiler. Im Bytecode steht dann nur 60000. Siehe dazu auch http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28.
Q&A: Wie kann man eine XML-Datei aus einer bz2-Datei mit StAX ablaufen?
Zunächst liefert org.apache.commons.compress.compressors.bzip2.BZip2InputStream aus dem Apache Commons Compress (https://commons.apache.org/proper/commons-compress/) einen InputStream. Diesen übergibt man dann StAX:
InputStream fis = new FileInputStream( file ); // vielleich noch puffern
InputStream bz2is = new BZip2InputStream( fis );
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader( bz2is );
Q&A: Kann man RandomAccessFile und OutputStream verbinden?
Im Prinzip erst mal nicht, beides sind unterschiedliche Konzepte. Helfen kann aber http://uio.imagero.com/doc/com/imagero/uio/io/RandomAccessOutputStream.html aus der Open-Source Bibliothek Unified I/O. Das verbindet ein RandomAccessFile (auch von Unified I/O!) mit einem java.io.OutputStream.
Q&A: Wie kann man die Foreign Keys einer Tabelle rausfinden
Die Metadaten können direkt erfragt werden. Quelle: https://svn.apache.org/repos/asf/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/DatabaseMetaDataWrapper.java.
/**
* Convenience method to return the foreign key meta data using the configured catalog and
* schema pattern.
*
* @param tableNamePattern The pattern identifying for which tables to return info
* @return The foreign key meta data
* @throws SQLException If an error occurred retrieving the meta data
* @see DatabaseMetaData#getImportedKeys(java.lang.String, java.lang.String, java.lang.String)
*/
public ResultSet getForeignKeys(String tableNamePattern) throws SQLException
{
return getMetaData().getImportedKeys(getCatalog(), getSchemaPattern(), tableNamePattern);
}
Dahinter steckt also http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#getImportedKeys(java.lang.String,%20java.lang.String,%20java.lang.String)
__________________
Q&A: Wie kann man einem Thread eine bestimmte Zeit zur Ausführung geben?
Eine Idee ist, nicht einen eigenen Thread selbst zu starten — was man sowieso nicht so oft macht — sondern einen ThreadPool aus Java 5 mit einzusetzen (Executors#newCachedThreadPool() ), der einen Executer (ExecutorService) implementiert. Der ExecutorService hat eine Funktion submit(Runnable task), die ein Future liefert. Mit diesem Future arbeitest du dann mit get(long timeout, TimeUnit unit).
Code:
package com.tutego; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class ExitAfterATime { public static void main( String[] args ) { ExecutorService es = Executors.newCachedThreadPool(); Future<?> submit = es.submit( new Runnable() { @Override public void run() { try { Thread.sleep( 2000 ); } catch ( InterruptedException e ) { System.out.println("InterruptedException"); } } } ); try { submit.get( 500, TimeUnit.MILLISECONDS ); } catch ( InterruptedException e ) { } catch ( ExecutionException e ) { } catch ( TimeoutException e ) { System.out.println( "Canceling" ); submit.cancel( true ); System.out.println( "Canceling Done" ); } es.shutdownNow(); } }
Es gibt noch andere Lösungen und das concurrent Paket bietet viele Möglichkeiten. Der Programmcode muss aber mitspielen und auch beendet werden können, also cancel(…) unterstützen.
java-forum.org und Burger King
Gestern kam auf ZDFinfo ein "schöner" Beitrag, der mich absolut an den Vorfall hier erinnert — zum Nachschauen: http://www.zdf.de/ZDFmediathek/kanaluebersicht/aktuellste/398#/beitrag/video/1951570/ZDFzoom:-Gewinn-ist-King.
2010 kaufte der New Yorker Finanzinvestor 3G Capital für 4 Milliarden US-Dollar den Burgerbrater und will das Investment nun zu Geld machen. An der Börse zahlt sich das aus, aber auf Kosten der Mitarbeiter und Franchise-Unternehmer. Das ist im Grunde das gleiche wie beim JFO; auch hier kommt ein "Investor" und versucht über Werbung schnell seine Ausgaben wieder reinzuholen. An ein langfristiges Investment geht es den Venture Capitalist gar nicht, denn nach einer kurzen Gewinnphase (die nur die Aktionäre freut) wird ein Unternehmen nach guten Gewinnen in der Regel wieder weiterverkauft, und dann ist es meist kaputt. Beim JFO befürchte ich das gleiche: Wenn das JFO wieder geöffnet ist, und voll von Google Werbung ist, wird Geld reinkommen — dass die Community kaputt geht, ist dem Investor egal, der kann wohl auch nichts mit Java anfangen weiß vermutlich auch gar nicht was das ist. Daher glaube ich auch nicht, dass man dem jetzigen Inhaber die Domain wieder abkaufen kann, denn mit Google Werbung wird auf Jahre hinaus wohl einiges zu verdienen sein, auch wenn das Forum passiv bleibt. Hier geht’s ums Geld, das ist alles, es ist ein Geschäftsmodell. Mit moralischen Appellen kommt man hier nicht weiter.
Siehe auch http://forum.byte-welt.net/showthread.php?t=4636.
Auf Wiedersehen javainsel.blogspot.de
Von November 2005 bis März 2010 betrieb ich meinen Java-Blog bei Google unter der Domain javainsel.blogspot.de. In der Zeit hatte ich an die 300 Posts geschrieben und fast 40.000 Seitenaufrufe gehabt. Im Jahr 2010 habe ich dann eine WordPress-Installation auf meinem Server gesetzt und dort weitergebloggt. Nach einer Migration der alten Artikel in das aktuelle WP-System wurde es nun Zeit, bei Google den alten Blog zu löschen. Bye-Bye Google Blogger, die Daten gehören jetzt wieder mir.
www.java-forum.org ist kaputt
Das Forum wurde geschlossen, zu den Gründen hier: http://forum.byte-welt.net/showthread.php?t=4538 (lange Diskussion) oder kürzer http://www.c-plusplus.de/forum/318939 und https://www.sourceprojects.org/default/2013/08/01/1375340100000.html. Schnell gesagt: Schnelles Geld und Gier ruiniert Communities.
So ein Vorgang macht wieder klar, dass man immer Herr seiner Daten sein sollte. Alle meine Beiträge (>100?) sind nun futsch, die alten Antworten werden keinen mehr erreichen. Meine Konsequenz daraus? Ich werde auf kein Forum mehr Texte stellen, nichts mehr direkt beantworten, nur noch ausschließlich hier im Blog und dann eventuell von Foren aus hier zum Blog verlinken. Mein Server, meine Daten, meine Sicherheit.
Thema der Woche: Collections-Update in Java 7
- Lies http://docs.oracle.com/javase/7/docs/technotes/guides/collections/changes7.html.
- Wie gliedert sich
TransferQueue
undBlockingQueue ein, welche Änderungen an der Typ-Hierarchie gibt es genau? - Was genau ist mit Änderungen am Hashing gemeint? Ist Hashing nun langsamer als vorher? Spielt die eigene Hash-Funktion keine bedeutende Rolle mehr? Werden Attacken wie http://stackoverflow.com/questions/8669946/application-vulnerability-due-to-non-random-hash-functions verhindert?
Transformation von Java nach C# (Java2Cs Translator)
ILOG ist ein Teil von IBM und hat für ein Projekt einen Übersetzer von Java nach C# entwickelt und bei SourceForge gehostet. Eingebunden ist es über Eclipse und dann macht man einfach nur ein File > Export > Other > ILOG Java to CSharp Translator. Es unterstützt alle Java 5 Features wie Generics, Enums, foreach, aber nicht Java 7. Ein paar Dinge können natürlich nicht übertragen werden und auch natürlich wird nicht alles von den Java-Bibliotheken übertragen. Seit einiger Zeit gab es kein Update mehr beim Projekt.