giovedì 17 novembre 2011

mysql workbench su ubuntu 11.10 funziona

Anche se non sembra, perchè a causa dell'aggiornamento di alcune librerie non viene gestita correttamente la chiusura delle finstre. La cosa si risolve premendo alt-f4 quando ci si trova davanti ad una finestra che non si sblocca.
Attenzione solo a non farlo subito, ma aspettare qualche secondo, in modo che le operazioni in background siano completate.

giovedì 10 novembre 2011

un semplice property manager in python

Non vedendo la necessità di installare framework complessi per utilizzare solo poche funzionalità ho scritto una classe che funga da property manager per i miei script python.
Incollo il codice sotto, di seguito una breve spiegazione sul funzionamento:

import string

import os



class PropertyManager:

    

    _propertyDict = dict()

    

    def __init__(self, filename):

        dir=os.path.dirname(__file__)

        fpath=dir+"""/"""+filename

        fp = open(fpath,'r')

        splitLines = [string.split(line, '=') for line in fp.readlines() if "=" in line]

        propertyNames = [tup[0] for tup in splitLines]

        propertyList = map(lambda x: x[1].strip(), splitLines)

        self._propertyDict = dict([(propertyNames[i],propertyList[i]) for i in range(len(splitLines))])

  

    def getValue(self, key):

        return self._propertyDict[key]


A questo punto basta costruire la classe passando il path del file che si desidera utilizzare, ad esempio: pmanager = PropertyManager('''app.properties''').
Il file di properties dovrà contenere entries del tipo: chiave=valore, tutte le altre righe saranno scartate.
Niente di mirabolante, ma sicuramente molto utile e snello.

lunedì 7 novembre 2011

maven e il profilo completo di jboss as7

In jboss as7 è possibile attivare uno stack java ee6 completo (quasi, sarà veramente completo a partire dalle prossime versioni) comprendente vari ammenicoli tra cui timer service, ejb 3.1, webservices e jms, che nella parte web non sono presenti.
Per fare questo bisogna prima di tutto scricare la versione full dell'application server e ricordarsi di avviarlo con il comando: $JBOSS_HOME/bin/standalone.sh -server-config standalone-preview.xml
Standalone-preview.xml è il file di configurazione comprendente tutti i sottosistemi attivati per il profilo full. 
Nella documentazione, però, non è chiaro quale sia la dipendenza corretta da introdurre con maven per avere a disposizione annotazioni e classi. Spulciando nel repository di jboss si nota che la dipendenza corretta è questa:

<dependency>
     <groupId>org.jboss.spec</groupId>
     <artifactId>jboss-javaee-6.0</artifactId>
     <version>2.0.0.Final</version>
     <type>pom</type>
     <scope>provided</scope>
</dependency>


Se prendiamo uno dei quickstart disponibili, basati sul web stack, vediamo che riportano:

<dependency>
     <groupId>org.jboss.spec</groupId>
     <artifactId>jboss-javaee-web-6.0</artifactId>
     <version>2.0.0.Final</version>
     <type>pom</type>
     <scope>provided</scope>
</dependency>

A questo punto basta sostituirlo con l'xml riportato sopra e prendere spunto dal pom di uno dei quickstart per avere un progetto maven pronto per essere utilizzato. Riporto sotto un pom generalizzato con le dipendenze corrette per lo stack full:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mygroup</groupId>
    <artifactId>myArtifact</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>projectName</name>


    <inceptionYear>2011</inceptionYear>
    <description>
        project description
    </description>

    <profiles>
        <profile>
            <id>profilo1</id>
            <properties>
                <targetenv>profilo1</targetenv>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>profilo2</id>
            <properties>
                <targetenv>profilo2</targetenv>
            </properties>
        </profile>
        <profile>
            <id>profilo3</id>
            <properties>
                <targetenv>profilo3</targetenv>
            </properties>
        </profile>
    </profiles>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.spec</groupId>
                <artifactId>jboss-javaee-6.0</artifactId>
                <version>2.0.0.Final</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>



    <dependencies>

        <!-- Import the CDI API, we use provided scope as the API is included in 
            JBoss AS 7 -->
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Import the Common Annotations API (JSR-250), we use provided scope 
            as the API is included in JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.annotation</groupId>
            <artifactId>jboss-annotations-api_1.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Import the Servlet API, we use provided scope as the API is included 
            in JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.servlet</groupId>
            <artifactId>jboss-servlet-api_3.0_spec</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>1.1.1.Final</version>
            <scope>provided</scope>
            <!-- Excluded because it's provided by the Java EE 6 dependencies -->
            <exclusions>
                <exclusion>
                    <groupId>org.hibernate.javax.persistence</groupId>
                    <artifactId>hibernate-jpa-2.0-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Seam Solder provides convenient, portable CDI extensions such as an 
            injectable logger -->
        <dependency>
            <groupId>org.jboss.seam.solder</groupId>
            <artifactId>seam-solder</artifactId>
            <version>3.0.0.Final</version>
        </dependency>

        <!-- JSR-303 (Bean Validation) Implementation -->
        <!-- Provides portable constraints such as @Email -->
        <!-- Hibernate Validator is shipped in JBoss AS 7 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.1.0.Final</version>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Include the JBoss' Java EE 6 APIs -->
        <!-- JBoss distributes a complete set of Java EE 6 APIs including a Bill 
            of Materials (BOM). A BOM specifies the versions of a "stack" (or a collection) 
            of artifacts. We use this here so that we always get the correct versions 
            of artifacts. Here we use the jboss-javaee-web-6.0 stack (you can read this 
            as the JBoss stack of the Java EE 6 Web Profile APIs), and we use version 
            2.0.0.Beta1 which is the latest release of the stack. You can actually use 
            this stack with any version of JBoss AS that implements Java EE 6, not just 
            JBoss AS 7! -->
        <dependency>
            <groupId>org.jboss.spec</groupId>
            <artifactId>jboss-javaee-6.0</artifactId>
            <version>2.0.0.Final</version>
            <type>pom</type>
            <scope>provided</scope>
        </dependency>
        
    </dependencies>

    <build>

        <defaultGoal>install</defaultGoal>
        <finalName>artifactFinalName</finalName>


        <filters>
            <filter>src/main/filters/${targetenv}.filter.properties</filter>
        </filters>

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>org.codehaus.mojo</groupId>
                                        <artifactId>properties-maven-plugin</artifactId>
                                        <versionRange>1.0-alpha-2</versionRange>
                                        <goals>
                                            <goal>read-project-properties</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <execute />
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warSourceExcludes>WEB-INF/lib/*.jar</warSourceExcludes>
                    <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
                    <webResources>
                        <resource>
                            <directory>${basedir}/src/main/webapp</directory>
                            <filtering>true</filtering>
                            <includes>
                                <include>**/*.html</include>
                                <include>**/*.jsp</include>
                                <include>**/*.xml</include>
                                <include>**/*.properties</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.google.code.maven-license-plugin</groupId>
                <artifactId>maven-license-plugin</artifactId>
                <version>1.4.0</version>
                <configuration>
                    <header>../src/etc/license.txt</header>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <version>1.0-alpha-2</version>
                <configuration>
                    <files>
                        <file>${basedir}/src/main/filters/${targetenv}.filter.properties</file>
                    </files>
                </configuration>
                <executions>
                    <execution>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>read-project-properties</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.0-beta-9</version>
                <configuration>
                    <goals>clean compile package install</goals>
                    <autoVersionSubmodules>true</autoVersionSubmodules>
                    <tagBase></tagBase>
                    <releaseProfiles>pro</releaseProfiles>
                </configuration>
            </plugin>
            <!-- JBoss AS plugin to deploy war -->
            <plugin>
                <groupId>org.jboss.as.plugins</groupId>
                <artifactId>jboss-as-maven-plugin</artifactId>
                <version>7.0.0.Final</version>
            </plugin>
        </plugins>
    </build>
    <scm>
        <connection>myconnection</connection>
        <developerConnection>mydevconnection</developerConnection>
        <url>myurl</url>
    </scm>
</project>


Questo pom comprende anche dei filtri. Per utilizzarli bisogna creare un file per ogni profilo in src/main/filters. Il file dovrà essere del tipo nomeprofilo.filter.properties e mettervi all'interno tutte le proprietà che vanno filtrate come chiave=valore, che vanno riferite all'interno dei files di configurazione come ${chiave}. Per attivare i vari profili nella build di maven basta aggiungere l'opzione -P nomeprofilo.

venerdì 4 novembre 2011

Aggiornare la libreria java-hl su Ubuntu 11.10

L'ultima versione del plugin subclipse per indigo richiede la libreria javaHL 1.7, ma sul sistema e nei repositories è presente la 1.6.12.
La procedura per sostituirla è semplice e veloce.

  1. rimuovere le vecchie librerie relative a subversion:  sudo apt-get remove --purge subversion libsvn1 libsvn-java
  2. scaricare le seguenti librerie (testate personalmente e funzionanti) ed installarle nello stesso ordine in cui le si è scaricate. Basta un doppio click sul file o il comando sudo dpkg -i nomefile
A questo punto riavviate eclipse ed è fatta.

definire un datasource in jboss as7

Jboss as7 si stacca completamente dalla tradizione Red Hat, che voleva server monolitici e che comprendessero qualsiasi cosa, con il problema, non da poco, di essere anche molto lenti. In questo caso gli sviluppatori si sono voluti concentrare su modularità e velocità, pur mantenendo uno stack java ee 6 completo.
Questo per fare una piccola introduzione, altre info qui: http://www.jboss.org/as7 dove è anche possibile scaricare l'application server e trovare la documentazione completa.
La configurazione in jboss as 7 è demandata ad un solo file, nel nostro esempio useremo la modalita standalone, ma lo stesso metodo potrebbe anche essere applicato alla domain. Il file in questione è: $JBOSS_HOME/standalone/configuration/standalone.xml.
Prima di andare a definire il nostro datasource, però, bisogna installare i driver jdbc del dbms che ci interessa, in questo caso mysql. I driver in questione verranno installati come modulo dell'application server, anche se ci sono offerte altre possibilità (come si può vedere in una panoramica più ampia qui). Questa modalità non è consigliata nel caso si stia gestendo un dominio, per quello è consigliato il deploy diretto dei driver (che devono essere jdbc-4 compliant, anche se c'è un metodo per renderli tali) tramite cli o web console.


Prendiamo il file mysql-connector-java-5.1.18-bin.jar (o la versione che si desidera, ricordandosi di referenziarla correttamente nel module.xml) che possiamo scaricare qui e copiamolo nella cartella: $JBOSS_HOME/modules/com/mysql/jdbc/main, se non esiste va creata.

A questo punto va creato il file module.xml, nella stessa cartella dove abbiamo copiato i driver. Il file dovrà essere come di seguito:


<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql.jdbc">
  <resources>
    <resource-root path="mysql-connector-java-5.1.18-bin.jar"/>
        <!-- Insert resources here -->
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

Fatto ciò resta l'ultimo passo da fare: definire il datasource vero e proprio. Questo si deve fare nel file standalone.xml. Qui sotto la parte relativa alla configurazione definita nel sottosistema realtivo ai ds:

<subsystem xmlns="urn:jboss:domain:datasources:1.0">
            <datasources>
                <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="H2DS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
                    <connection-url>
                     jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
                    </connection-url>
                    <driver>
                        h2
                    </driver>
                    <pool>
                        <prefill>
                            false
                        </prefill>
                        <use-strict-min>
                            false
                        </use-strict-min>
                        <flush-strategy>
                            FailingConnectionOnly
                        </flush-strategy>
                    </pool>
                    <security>
                        <user-name>
                            sa
                        </user-name>
                        <password>
                            sa
                        </password>
                    </security>
                </datasource>
                <datasource jndi-name="java:jboss/datasources/exampleDS" pool-name="waauDS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
                    <connection-url>
                        jdbc:mysql://localhost:3306/example
                    </connection-url>
                    <driver>
                        mysql
                    </driver>
                    <transaction-isolation>
                        TRANSACTION_READ_COMMITTED
                    </transaction-isolation>
                    <pool>
                        <min-pool-size>
                            10
                        </min-pool-size>
                        <max-pool-size>
                            100
                        </max-pool-size>
                        <prefill>
                            true
                        </prefill>
                        <use-strict-min>
                            false
                        </use-strict-min>
                        <flush-strategy>
                            FailingConnectionOnly
                        </flush-strategy>
                    </pool>
                    <security>
                        <user-name>
                            user
                        </user-name>
                        <password>
                            password
                        </password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>
                            32
                        </prepared-statement-cache-size>
                        <share-prepared-statements/>
                    </statement>
                </datasource>
                <drivers>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>
                            org.h2.jdbcx.JdbcDataSource
                        </xa-datasource-class>
                    </driver>
                      <driver name="mysql" module="com.mysql.jdbc">
                        <xa-datasource-class>
                            com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
                        </xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>



Le parti relativa ad exampleDS e ai driver mysql sono quelle da aggiungere alla configurazione di base del file, ricordandosi di sostituire user e password con i dati relativi all'account e l'host con quello dove risiede il db. Ovviamente in base alle esigenze si può fare tutto il tuning desiderato cambiando i vari parametri, ma per quello vi rimando alla documentazione ufficiale.