Verfügbaren Speicher von SmartSVN erhöhen (macOS)

SmartSVN wird in der default-Einstellung mit für große Projekte zu wenig Speicher gestartet. Diese Einstellung lässt sich aber über die Systemvariable „$SMARTSVN_MAX_HEAP_SIZE“ überschreiben.

Die Variable kann man beispielsweise in der Datei ~/.profile setzen, wie hier gezeigt:

export PATH=~/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
export EDITOR=vi
export SMARTSVN_MAX_HEAP_SIZE=1024m

Interessant in dem Zusammenhang ist auch das Script, das SmartSVN startet, und zwar die Datei

/Applications/SmartSVN 7.0.6/SmartSVN 7.app/Contents/MacOS/SmartSVN

In diesem Script wird die beschriebene Systemvariable ausgelesen und das Java-Programm gestartet.

UTF-8 mit Hibernate und MySQL

Damit MySQL mit Hibernate UTF-8 kodierte Zeichen richtig speichert, muss man die jdbc-URL um ein paar Parameter erweitern, so dass sie ungefähr so aussieht:

jdbc:mysql://127.0.0.1:3306/meine_datenbank?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8

Ohne diese Modifikation werden UTF-8 Sonderzeichen als Fragezeichen abgespeichert.

Gefunden auf: http://www.isocra.com/2007/01/utf-8-with-hibernate-30-and-mysql/

Den Speicher erhöhen, den NetBeans zur Verfügung hat

Um auch größere Projekte mit NetBeans programmieren zu können, ist es sinnvoll, den für NetBeans verfügbaren Speicher zu erhöhen. Die hier beschriebene Methode habe ich unter OS-X Leopard ausprobiert. Mit anderen Betriebssystemen ist die Vorgehensweise wahrscheinlich ähnlich.

In dem Verzeichnis

/Applications/NetBeans/NetBeans 6.5.app/Contents/Resources/NetBeans/etc

findet man die Datei „netbeans.conf„, in der auch Parameter der Java-Laufzeitumgebung konfiguriert werden können. Die dafür zuständige Zeile ist:

netbeans_default_options="-J-client -J-Xverify:none -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true"

Mit

netbeans_default_options="-J-client -J-Xverify:none -J-Xss16m -J-Xms384m -J-Xmx768m -J-XX:PermSize=64m -J-XX:MaxPermSize=256m -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true"

startet die Virtual-Machine mit 384 MB Speicher und erlaubt maximal 768 MB. Je nach RAM des Computers kann man so den vom NetBeans-Java genutzten Speicher sinnvoll einstellen.

Zur Website von NetBeans

Leerzeichen und leere Zeilen automatisch aus Tomcat-JSPs entfernen

Bei der Erstellung von JSPs entstehen im generierten HTML oft viele sinnlose Leerzeichen und leere Zeilen. Ab Tomcat 5.5 kann man diesen überflüssigen Whitespace automatisch per Konfiguration heraus filtern.

Dazu kann, wie in folgendem Code-Ausschnitt gezeigt, in der $CATALINA_HOME/conf/web.xml dem „jsp“-Servlet der init-param „trimSpaces“, hinzugefügt werden.

<init-param>
    <param-name>trimSpaces</param-name>
    <param-value>true</param-value>
</init-param>

Das Resultat ist kompakteres HTML. Etwas Vorsicht ist allerdings geboten, da sich durch das Trimmen der Leerzeichen, vor allem in älteren Browsern, auch das Erscheinungsbild der Seite ändern kann.

Problem mit Boolean in Hibernate mit MySQL

Wenn Hibernate mit MySQL und MySQLDialect oder MySQL5Dialect genutzt wird, kann es sein, dass der Datentyp Boolean nicht richtig funktioniert. Und zwar legt Hibernate ein Boolean-Feld in MySQL als BIT(1) an, womit scheinbar der JDBC-Treiber nicht klarkommt.

Damit Boolean-Felder mit Hibernate/MySQL richtig funktionieren, kann und sollte man den Datentyp des Feldes auf TINYINT(1) setzen. Mit Annotations geht das beispielsweise so:

@Column(columnDefinition="TINYINT(1)")
private boolean disabled;

Zum Nachlesen: Der Bugreport HH-468 von Hibernate über diesen Fehler.

Doppeltes Formular-Absenden in Spring-MVC verhindern

Jeder, der Web-Anwendungen erstellt oder betreibt, kennt es. Wenn ein Web-Formular nach 2 Sekunden noch nicht verarbeitet ist, klickt der Benutzer gerne ein weiteres mal auf den „Senden“-Button und erzeugt so einen weiteren Request. Da HTTP asynchron und verbindungslos ist, ist es gar nicht so einfach eine solche doppelte Formularversendung zu erkennen.

Session synchronisieren und Session-Form aktivieren

Im Spring-MVC lassen sich Formular-Requests bezüglich der Session synchronisieren. Dazu setzen wir das Controller-Attribut „synchronizeOnSession“ auf true. Es wird so verhindert, dass ein Formular nebenläufig verarbeitet wird.

setSynchronizeOnSession(true);

Ausserdem wird ein weiteres Controller-Attribut, und zwar „sessionForm“ auf true gesetzt, was Spring MVC dazu veranlasst, die Formulardaten in der Session zu speichern und, falls ein Formular doppelt abgesendet wurde, die Methode „handleInvalidSubmit(HttpServletRequest request, HttpServletResponse response)“ aufzurufen.

setSessionForm(true);

Falls jetzt ein Formular doppelt versendet wird, oder falls ein Benutzer ein Formular mit dem „zurück“-Button erneut anzeigen und absenden möchte, wird also nun „handleInvalidSubmit“ aufgerufen. Diese Methode lässt sich in unserem Controller überschreiben, um so zu bestimmen, wie sich der Controller im Falle einer doppelten Datensendung verhalten soll.

@Override
protected ModelAndView handleInvalidSubmit(HttpServletRequest request, HttpServletResponse response) throws Exception
{
    return new ModelAndView(getSuccessView()); // einfach weiter, da das Formular ja schon abgeschickt wurde
} 

Es muss übrigens nicht immer richtig sein, doppelte Formularversendungen zu verbieten. Wenn wir beispielsweise ein Suchformular erstellen, kann es sinnvoll sein, dem Nutzer zu erlauben, mit der Browser-Navigation zurück zum Formular zu gehen und eine Suche erneut abzuschicken.

Siehe hierzu auch: Doppeltes Formular-Absenden mit jQuery verhindern

Quine in Java

Ein Quine ist ein Programm, welches sich selbst ausgibt. Dieses hier ist von mir in Java.

class Q
{
    static void p(String a)
    {
        char c = 34;
        System.out.print(a + c + a + c + ')' + ';' + '}' + '}');
        System.exit(0);
    }

    static
    {
        p("class Q{static void p(String a){char c=34;System.out.print(a+c+a+c+')'+';'+'}'+'}');System.exit(0);}static{p(");
    }
}

Zahlen konvertieren in Java

Verschiedene Methoden, um in Java Zahlen zu konvertieren. 

Zahl zu String

String str = "" + i;

String zu Zahl

int i = Integer.parseInt(str); // Integer
float f = Float.parseFloat(str); // Float

Dezimal zu Binär

String binstr = Integer.toBinaryString(i);

Binär zu Dezimal

int i = Integer.parseInt(binstr, 2);

Dezimal zu Hexadezimal

String hexstr = Integer.toString(i, 16);  // oder
String hexstr = Integer.toHexString(i);

Hexadezimal zu Dezimal

int i = Integer.parseInt(hexstr, 16);

Zeichen eines ASCII-Codes

String aChar = new Character((char)i).toString();

ASCII-Code eines Zeichens

char c = 'A';
int asciiCode = (int) char;

ASCII-Codes der Zeichen eines Strings

String text = "ABCD";
for (int i = 0; i < text.length(); i++) 
{
    char c = text.charAt(i);
    int asciiCode = (int) c;
    System.out.println(asciiCode);
}