Eine tierische Basic-to-Java Übersetzung

Kürzlich habe ich zwei Bücher im Web wiedergefunden, die mich vor langer Zeit mal beschäftigt haben: BASIC Computer Games und More BASIC Computer Games. Alle Quellcodes sind als GIFs enthalten, so dass man genau wie früher abtippen muss. Sehr nostalgisch...
Dabei helfen die vielen GOTO-Anweisungen nicht gerade beim Verständnis. Nach der Lektüre von Clean Code tun einem die BASIC-Programme geradezu in den Augen weh - und das liegt nicht nur an der niedrigen Scanauflösung der GIFs. Programme sollten beim Durchlesen auch zu verstehen sein, und das mit möglichst wenigen Kommentaren.
Ich habe eines der Spiele herausgepickt und in Java neu geschrieben. Gespielt wird in der Textkonsole, und als kleines Bonbon speichert das Programm seine gesammelten Erfahrungen am Ende des Spiels in eine Neodatis-Datenbank.

Full story »

Tutorial: Erste GUI-Anwendungen mit Scala

Dank Programming in Scala stellen sich nach und nach erste Erfolgserlebnisse mit dieser Programmiersprache ein, und sie macht alles in allem richtig Spaß ? obwohl die Unterstützung in den gängigen IDEs bislang nur rudimentär ist.
Was mich besonders verblüfft: Die extrem kompakte Art, mit Scala grafische Benutzeroberflächen auf Swing-Basis aufzubauen. Vorher hatte ich schon mit JavaFX und Groovy SwingBuilder experimentiert, aber keines von beiden war so überzeugend.
Hier ein paar grundlegende Schritte zur GUI-Erzeugung.

Full story »

Scala-Anwendungen außerhalb von Netbeans starten

Ein Stolperstein, auf den vermutlich jeder schnell trifft, der Scala mit Netbeans ausprobieren möchte: Außerhalb der IDE bekommt man beim Starten der produzierten JAR-Datei eine Fehlermeldung wie

Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject
at java.lang.ClassLoader.defineClass1(Native Method)
(...)
... 13 more

Das kann man sehr leicht lösen, indem man dem Netbeans-Projekt noch die Datei "scala-library.jar" als Library hinzufügt. Diese Datei befindet sich in "lib" im Installationsverzeichnis von Scala.
Wenn man das Scala-Projekt in Netbeans dann nochmal neu kompiliert, enthält auch das "dist"-Verzeichnis die Scala-Library und das Programm kann per Befehlszeile (z.B. java -jar "ScalaApplication.jar") gestartet werden.

JPEG Resizer

Neulich brauchte ich ein Java-Programm, um eine Menge JPEG-Dateien möglichst schnell und automatisiert zu verkleinern. Dazu habe ich ein paar Code-Schnipsel aus verschiedenen Foren zusammengetragen und das hier daraus gemacht:

Code

package jpegresizer;
 
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
 
/**
* JPEG Resizer
* @author Jean-René Thies
*/
public class Resizer {
 
    /**
     * Resize a JPEG file and save it.
     * Either the new width or the new heigth must be greater than zero.
     * If the width is greater than zero, the new height will be calculated.
     * If the width is zero and the height is greater than zero, the width will be calculated.
     *
     * @param inputfile complete path to original jpeg file
     * @param outputfile complete save path
     * @param newWidth width in pixel
     * @param newHeight height in pixel
     * @return success of resize and save
     */
    public static boolean resize(String inputfile, String outputfile, int newWidth, int newHeight) {
        if (newWidth > 0 || newHeight > 0) {
            try {
                Image img = new ImageIcon(ImageIO.read(new File(inputfile))).getImage();
 
                if (newWidth > 0) {
                    float faktor = (float) newWidth / img.getWidth(null);
                    newHeight = (int) (img.getHeight(null) * faktor);
                } else {
                    float faktor = (float) newHeight / img.getHeight(null);
                    newWidth = (int) (img.getWidth(null) * faktor);
                }
 
                Image scaledImage = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
                BufferedImage outImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
                Graphics g = outImg.getGraphics();
                g.drawImage(scaledImage, 0, 0, null);
                g.dispose();
 
                JPEGImageEncoder jpegImageEncoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(outputfile));
                JPEGEncodeParam param = jpegImageEncoder.getDefaultJPEGEncodeParam(outImg);
                param.setQuality(0.9F, true);
                jpegImageEncoder.encode(outImg, param);
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        } else {
            return false;
        }
    }
}

Die "resize"-Methode nimmt den Pfad der Originaldatei und den der zu speichernden Datei an, außerdem die gewünschte Breite oder Höhe - eine der beiden Angaben kann 0 sein, dann wird der andere Wert angenommen und entsprechend proportional skaliert. Die Bildqualität des Outputs ist in der Methode selbst anpassbar.
Wie die Importe zeigen, ist eine Java-Version von Sun nötig.

CatchUp - hinter den Kulissen

Das CatchUp-Projekt läuft seit rund vier Monaten und ist mittlerweile bei Version 3.6 angekommen. Mit den letzten Änderungen hat der Podcast Reciever nochmal an Tempo und Stabilität zugelegt, gleichzeitig bin ich zwangsläufig an Erfahrungen reicher geworden.

CatchUp ist stark auf Multithreading ausgelegt, und das bringt einige Herausforderungen mit sich. Wer sich dafür interessiert, kann gerne mal einen Blick unter die Haube werfen und sich ein paar Lösungen anschauen.

Full story »

CatchUp released!

Die erste Version von CatchUp, dem Groovy-/Java-basierten Podcast Reciever, kann jetzt bei sourceforge.net heruntergeladen werden. Der Sourcecode steht im SVN Repository bereit.

Features:

  • Automatische Lautstärkenanpassung möglich, wenn MP3Gain installiert ist.
  • "One Way" Synchronisation von lokalem Downloadverzeichnis zum MP3-Player.
  • Automatische Bereinigung von lokalem Verzeichnis und MP3-Player nach vorzugebender Anzahl von Tagen.
  • Beliebige Anzahl von Podcast-Abonnements.

CatchUp benötigt Java 1.6.0 oder höher.

Bitte Fragen zum Programm im Hilfe-Forum stellen.

<< Vorherige :: Nächste >>