domenica 1 gennaio 2012

Usare i link simbolici nell'apache incluso in osx

Ogni tanto capita di dover fare progetti che prevedano solo l'uso di apache, vuoi perchè si stanno scrivendo e testando degli script o, magari, perchè stiamo lavorando solo su contenuti statici, come la grafica o i css. In questi casi è molto comodo usare dei link simbolici, piuttosto che copiare ogni volta i file nella directory del webserver o lavorarci direttamente.

Per fare questo basta aprire un terminale e usare il comando:

ln -s [origine] [destinazione]

Tipicamente, se stiamo usando il webserver integrato in osx, la destinazione sarà una cartella nel percorso /home/[utente]/Sites/[miosito], dove utente sarà il nome dell'utente e miosito sarà la cartella contenente il sito su cui stiamo lavorando.

A questo punto, andando all'indirizzo http://localhost/~[utente]/[miosito], si riceve un 403 forbidden. Il motivo è semplice: apache è impostato di default per non seguire i link simbolici, questo per motivi di sicurezza. Per attivare questa funzionalità basta intervenire sul file di configurazione [utente].conf, che si trova in: /etc/apache2/users/

si può editare il file: sudo vim [utente].conf (per sapere come usare vim qui). A questo punto basta modificare questa riga:

Options Indexes MultiViews

in questo modo:

Options Indexes MultiViews FollowSymLinks

e riavviare il server andando in preferenze di sistema->condivisione. La spunta da togliere e rimettere è quella di condivisione web.

giovedì 15 dicembre 2011

La crema al mascarpone della nonna

Non di solo java vive l'uomo e poi nel mio profilo c'è scritto chiaramente: java e pasticcini. Visto che il periodo è carico di impegni e il tempo per provare novità tecnologiche è poco, vi lascio questa ricetta, che di certo allieterà le vostre vacanze di Natale.
La tradizione vuole che il giorno di Natale, sulla nostra tavola, non manchi mai la crema al mascarpone, compendio meraviglioso, nonchè supercalorico, per panettoni e pandori. La preparazione è semplicissima, basta saper mescolare con un certo vigore e, nel caso non se ne abbia abbastanza, ci si può sempre far aiutare da uno sbattitore elettrico.
Vi lascio la ricetta della nonna, perchè le ricette delle nonne sono sempre insuperabili. Seguitela per bene, che la pasticceria è una scienza esatta.

Ingredienti per 4/6 persone:

- mascarpone (500 g)
- 4 uova grandi (cat. A)
- zucchero (170 g)
- cioccolato fondente (50 g)

Preparazione:

In una ciotola mettete i tuorli e lo zucchero. Le uova devono essere a temperatura ambiente e non estratte direttamente dal frigorifero, basta toglierle una ventina di minuti prima di iniziare la preparazione per essere tranquilli.
Lavorate i due ingredienti con una frusta, anche elettrica, in modo da incorporare aria, finchè non iniziano a montare. Il composto sarà pronto quando il volume sarà raddoppiato e avrà assunto un colore chiaro.
Incorporate il mascarpone in due passaggi, in modo che non sia troppo pesante da mescolare. Continuate a miscelare fino a quando non otterrete una crema fluida e priva di grumi.
A questo punto potete aggiungere un tappino di liquore (cognac o marsala), personalmente non mi fa impazzire, ma la nonna lo mette.
Per il gran finale tritate il cioccolato, meglio se a coltello, così evitate di scaldarlo. Il trito dev'essere molto fine, altrimenti rovinerà la consistenza. L'operazione è lunga, nell'ordine di qualche minuto, ma necessaria. Aggiungete alla crema e mescolate il tutto.
Ora siete pronti per affogare qualsiasi tipo di dolciume natalizio in questa buonissima preparazione, ma non dimenticatevi di farla riposare almeno un'ora in frigorifero, coprendola con della pellicola per evitare che si indurisca in superficie.

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.