Freitag, 30. März 2012

Ubuntu: bundle install schlägt fehl

Rails 3.0.11
Ruby 1.9.2
Ubuntu 11.10

Nachdem "bundle install" wegen dem Gem nokogirl fehlgeschlagen ist holt man sich die fehlenden Pakete, die Ubuntu zum kompilieren braucht, so:

sudo apt-get install libxslt-dev libxml2-dev

Dann muckt es bei dem Gem "pg", da installiert man einfach wieder Pakete, die Ubuntu zum kompilieren braucht:

sudo apt-get install libxslt-dev libxml2-dev

Dann gab es noch Probleme mit dem Gem win32console, die mußte aber nur im Gemfile auskommentiert werden.


Links:
http://nokogiri.org/tutorials/installing_nokogiri.html
http://i.justrealized.com/2010/install-pg-gem-postgresql-ubuntu/

Mittwoch, 21. März 2012

Apatana Studio: Terminal einrichten

Aptana Studio 3, build: 3.0.9.201202141038
Git 1.7.6
Windows 7

Der Terminal (Windows/Show View/Terminal) scheint unter Windows nicht von Beginn an zu funktionieren. Lösung war unter Windwos/Preferences/Team/Git den Pfad zu git.exe anzugeben, schon funktioniert der Terminal.



Links
Aptana Studio Support Beitrag

Dienstag, 20. März 2012

RubyOnRails: Projekt anlegen hinter Proxy

RailsInstaller 2.1.0

Will man ein Projekt  anlegen (rails new projectname) hinter einem passwortgeschützen Proxy ist beim "bundle install" Script oft Schluß, da man sich nicht mit rubygems.org verbinden kann.

Abhilfe schafft es, den Proxy in 2 Files einzutragen

  • RailsInstallerOrdner/RubyOrdner/setup_environment.bat
  • ~/.gitconfig

In setup_environment.bat trägt man ein:

set HTTP_PROXY=http://username:password@xxx.xxx.xxx.xxx:xxxx

In .gitconfig fügt man hinzu:

[http]
proxy = http://username:password@@xxx.xxx.xxx.xxx:xxxx

Damit sollte man nun das Projekt anlegen können.

Links:


Sonntag, 18. März 2012

Aptana kann nicht auf github pushen

Aptana Studio 3, build: 3.0.9.201202141038
Git 1.7.6
Windows 7

Obwohl im Aptana Studio unter Windows/Preferences/General/Network Connections/SSH alles korrekt eingetragen ist, auf GitHub der Public Key hinterlegt wurde, läßt sich einfach nicht auf GitHub pushen, es gibt ständig diese Fehlermeldung:
Permission denied (publickey). fatal: The remote end hung up unexpectedly 
Die Lösung war, den Inhalt von ~/.ssh, wo der Public Key abliegt (dessen Pfad auch im Aptana Studio eingetragen war), in das .ssh Verzeichnis der git Installation zu kopieren. Schon funzt es.

Scheinbar ist es Aptana Studio ziemlich schnurz daß man das .ssh Verzeichnis richtig in den Einstellungen angibt, verwendet wird das .ssh Verzeichnis der Git Installation.

Links:
Aptana Studio Support Beitrag

Freitag, 9. März 2012

Problem beim Auslesen eines Blobs aus SQLite: invalid stream header

org.xerial.sqlite-jdbc 3.7.2
mysql-connector-java 5.1.18

Ursprünglich habe ich das Speichern und Auslesen eines Objekts für eine MySql Datenbank geschrieben, aber um das ganze ohne laufenden MySql Server testbar zu machen wollte ich einfach auch eine sqLite Datenbank als Alternative zur Verfügung haben. Ich habe nicht schlecht gestaunt, als derselbe Code, der für MySql einwandfrei funktionierte, bei SQLite beim Auslesen des Blobs eine Fehlermeldung warf:

java.io.StreamCorruptedException: invalid stream header: 61742E75 at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:797) at java.io.ObjectInputStream.(ObjectInputStream.java:294)

Nachlesen in Foren ergab, dass ObjectInputStream nicht funktioniert wenn die Daten nicht zuvor mit ObjectOutputStream der Datenbank übergeben wurden.

Hier mein ursprünglicher Code zum Einspielen des Objects:

public static void insertIntoTable(BigInteger id, SessionData sd, byte[] rtsd, IvissWorker ivissWorker) {
    PreparedStatement pstmt = null;
    Connection con = null;
    try {
        con = getConnection();
        pstmt = con
                .prepareStatement("REPLACE INTO iviss_session_table (id, ivissblob, rtblob, lastaccess) VALUES(?,?,?,?)");
        pstmt.setLong(1, Long.parseLong(id.toString()));
        pstmt.setObject(2, sd);
        pstmt.setObject(3, rtsd);
        pstmt.setDate(4, new Date(System.currentTimeMillis()));
        pstmt.executeUpdate();
    } catch (SQLException e) {
        ivissWorker.getIvissWorkerOutputHandler().addError(Constants.ERROR_205, "", DbConfiguration.getDbUri());
    } finally {
        try {
            if (pstmt != null) {
                pstmt.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Beim Auslesen aus einer SQLite Datenbank schlug dann das Erzeugen des ObjectInputstream fehl:

public static SessionData getIvissSession(BigInteger id) throws IvissDatabaseException {
    SessionData sd = null;
    PreparedStatement pstmt = null;
    Connection con = null;
    try {
        con = getConnection();
        pstmt = con.prepareStatement("SELECT ivissblob FROM iviss_session_table WHERE id =?");
        pstmt.setLong(1, Long.parseLong(id.toString()));
        ResultSet rs = pstmt.executeQuery();
        while (rs.next()) {
            byte[] ivissblob = rs.getBytes("ivissblob");
            ObjectInputStream objectIn = new ObjectInputStream(new ByteArrayInputStream(ivissblob));
            sd = (SessionData) objectIn.readObject();
            objectIn.close();
        }

    } catch (SQLException e) {
        throw new IvissDatabaseException(Constants.ERROR_202);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {

        try {
            if (pstmt != null) {
                pstmt.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    return sd;
}

Gelöst wurde das Problem, indem ich der Datenbank das Object nicht mit .setObject übergeben habe, sondern als byte Array, das byte Array wird wiederrum mit ObjectOutputStream erzeugt, damit kam ObjectInputStream dann zurecht. Warum der MySql Treiber hier weniger Probleme macht und etwas aus dem ResultSet übergibt, mit dem der ObjectInputStream gut zurechtkommt bleibt mir ein Rätsel.

Hier die geänderte Zeile bei der Übergabe:

     pstmt.setBytes(2, IvissUtil.getBytes(sd));

Und hier die Methode die mir das byte Array erzeugt:

public static byte[] getBytes(Object obj) throws java.io.IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(obj);
    oos.flush();
    oos.close();
    bos.close();
    byte[] data = bos.toByteArray();
    return data;
}

Links:
Frage diesbezüglich in stackoverflow