giovedì 29 dicembre 2011

openshift: vedere lo spazio disco occupato

[UPDATE]

adesso c'è quota!!

è possibile aggiungerlo negli script client side (tipo post_deploy/pre_deploy) etc.



Al momento non c'è un comando che mostra chiaramente l'occupazione disco...
un domani forse verrà aggiunto tra le informazioni restituite da rhc-user-info -laccountname

Per ora, come recita:

https://www.redhat.com/openshift/community/forums/express/questions-on-express-quota
basta fare un login ssh 
ssh  $UUID@$HOSTNAME 

 e lanciare il comando:
$ du -sh ~ /tmp

( o simili 
http://www.magicmill.net/linux/grap/grap-11.html)
se lo spazio occupato è troppo alto, cominciate con le pulizie di natale con:
rhc-ctl-app -a nomeapplicazione -c tidy  -l account@gmail.com

openshift: vedere host e port

come suggeriscono nel forum:
https://www.redhat.com/openshift/community/forums/express/support-for-standalone-java-app


It'll be a port *and* IP you

It'll be a port *and* IP you need to bind to. Add the following to your .openshift/action_hooks/post_deploy script to see what you should be binding to:
echo "Bind to this port: $OPENSHIFT_INTERNAL_IP:$OPENSHIFT_INTERNAL_PORT"
Then use that IP and port for binding.

utile...

martedì 27 dicembre 2011

openshift: vedere il threaddump

prima eseguire il comando:
rhc-ctl-app -a appname -c threaddump -lxxxxx@gmail.com


e poi per rivedere il threaddump:

rhc-tail-files -f appname/jbossas-7.0/stdout.log -lxxxxx@gmail.com -a appname

verrò fuori qualcosa come:


Heap
 PSYoungGen      total 27136K, used 22338K [0x00000000fe000000, 0x00000000fff90000, 0x0000000100000000)
  eden space 22080K, 99% used [0x00000000fe000000,0x00000000ff588ad0,0x00000000ff590000)
  from space 5056K, 5% used [0x00000000ffa70000,0x00000000ffab8000,0x00000000fff60000)
  to   space 4992K, 0% used [0x00000000ff590000,0x00000000ff590000,0x00000000ffa70000)
 PSOldGen        total 64896K, used 34863K [0x00000000fa000000, 0x00000000fdf60000, 0x00000000fe000000)
  object space 64896K, 53% used [0x00000000fa000000,0x00000000fc20bd88,0x00000000fdf60000)
 PSPermGen       total 78656K, used 78637K [0x00000000f4200000, 0x00000000f8ed0000, 0x00000000fa000000)
  object space 78656K, 99% used [0x00000000f4200000,0x00000000f8ecb6b8,0x00000000f8ed0000)

per capire cosa sono:
http://javandoblog.blogspot.com/2010/08/per-chi-sviluppa-in-java-prima-o-poi.html

lunedì 26 dicembre 2011

openshift: che figata!

Sono anni che sogno di avere un jboss in hosting...e adesso con openshift è possibile!

adesso è possibile avere un virtual server a propria diposizione con mysql, phpmyadmin, 300 mega di ram e 500 mega di spazio disco:

Alcune highlights dell'ultima ora:

1) aggiungere un alias alla propria applicazione:
immaginate di comprare un nome per la vs applicazione su uno dei tanti rivenditori in rete, comprando anche l'uso del dns..a questo punto basta usare il comando:
rhc-ctl-app -a nomeapplicazione -c add-alias --alias www.hostname.org -l account@gmail.com

2) connesioni ssh al ns host:
rhc-user-info -l account@gmail.com

per ogni applicazione ci sarà un url git:
Git URL: ssh://xxxxxxxxxxxxxxxxxxxxxxxxxx@xxxxxx.rhcloud.com

ssh -t xxxxxxxxxxxxxxxxxxxxxxxxxx@xxxxxx.rhcloud.com

e voilà siete dentro la vs macchina:


Welcome to OpenShift shell

    This shell will assist you in managing openshift applications.

    !!! IMPORTANT !!! IMPORTANT !!! IMPORTANT !!!
    Shell access is quite powerful and it is possible for you to
    accidentally damage your application.  Procede with care!
    If worse comes to worse, destroy your application with rhc-ctl-app
    and recreate it
    !!! IMPORTANT !!! IMPORTANT !!! IMPORTANT !!!

    type "help" for more info.


3) pulizia dello spazio disco non +usato (tmp/log/git history)


rhc-ctl-app -a nomeapplicazione -c tidy  -l account@gmail.com


che farà le seguenti mosse:

Stopping app...
Running 'git gc --prune --aggressive'
Emptying log dir: /var/lib/libra/xxxxxxxxxxxxxxxxxxx/nomeapplicazione/logs/
Emptying tmp dir: /tmp/
Emptying tmp dir: /var/lib/libra/xxxxxxxxxxxxxxxxxxx/nomeapplicazione/tmp/
Emptying tmp dir: /var/lib/libra/xxxxxxxxxxxxxxxxxxx/nomeapplicazione/jbossas-7.0/standalone/tmp/
Starting app...


4) riavviare mysql:
rhc-ctl-app -a nomeapplicazione -e restart-mysql-5.1



utilissimi link per cominciare a giocare:



http://www.jboss.org/openshift/articles.html


da cui:
http://community.jboss.org/blogs/scott.stark/2011/08/10/openshift-expressflex-cartridge-comparision
http://community.jboss.org/blogs/scott.stark/2011/08/10/jbossas7-configuration-in-openshift-express
http://community.jboss.org/blogs/scott.stark/2011/08/10/differences-between-the-express-and-flex-jbossas7-configurations
http://community.jboss.org/wiki/TrackingThreadsInJBossAS7
http://community.jboss.org/blogs/scott.stark/2011/08/10/jbossas7-configuration-in-openshift-express
https://www.redhat.com/openshift/blogs/seeing-cdi-working-in-openshift
https://www.redhat.com/openshift/community/blogs/how-to-create-an-openshift-github-quick-start-project


importante:
http://jaitechwriteups.blogspot.com/2011/08/deploy-java-ee-application-on-openshift.html


pannello di controllo
https://openshift.redhat.com/app/control_panel




martedì 20 settembre 2011

jboss 7: non ci sono i quartz mdb..ma c'è @Schedule

come dicono sul forum ufficiale, " TimerService is already available in 7.0.1 "

http://community.jboss.org/thread/172213?tstart=60

I would suggest to change the MDBs to singletons (EJB3.1) and use the EJB3.1 Timer Service of JEE6. The migration should be quite simple if you do not rely too much on quartz


Per chi non avesse mai provato i nuovi timer in jee6:
http://blogs.oracle.com/arungupta/entry/totd_146_understanding_the_ejb

provare!!!

jboss7: creare servizi rest - json

In jboss7 è semplice creare servizi rest!

Per iniziare basta dare un okkio al progetto di esempio distribuito come applicazione di esempio:
https://docs.jboss.org/author/display/AS7/Kitchensink+quickstart

L'unica difficoltà incontrata, nasce nel voler generare contenuti di tipo json, ovvero segnando i metodi con: @Produces("application/json")
Il problema riscontrato nasce nel mapping di relazioni di tipo @OneToMany, o meglio nell'escludere queste relazioni dal mapping del risultato (evitando l'errore:
org.codehaus.jackson.map.JsonMappingException: failed to lazily initialize a collection of role
date un okkio a questo post sul jbo7 forum: http://community.jboss.org/thread/169352 )

Facciamo un esempio pratico...
Immaginiamo di avere due entity Percorso, Punto (un percorso ha una relazione @OneToMany con i punti che lo costituiscono).

@Table(name = "percorsi")
@Entity
@XmlRootElement
public class Percorso implements Serializable {
private Long id;
private String nome;
        private List<Punto> punti;
.....

        @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

       @OneToMany(fetch = FetchType.LAZY, mappedBy = "percorso")
@XmlTransient
@JsonIgnore
public List<Punto> getPunti() {
if (punti == null)
this.punti = new ArrayList<Punto>();
return this.punti;
}

public void setPunti(List<Punto> punti) {
this.punti = punti;
}
}

@Table(name = "punti")
@Entity
@XmlRootElement
public class Punto implements Serializable {
private Long id;
private Percorso percorso;


       @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}


        @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_percorso")
@XmlTransient
@JsonIgnore
public Percorso getPercorso() {
return percorso;
}

public void setPercorso(Percorso percorso) {
this.percorso = percorso;
}
}

Immaginiamo di generare un servizio rest,

@Path("/v1/percorsi")
@RequestScoped
public class PercorsiREST {

.....

che permette di recuperare un percorso:

        // repository che gestisce il caricamento da db dei dati
        @Inject
PercorsiRepository percorsiRepository;

@GET
@Path("/{id:[0-9][0-9]*}")
@Produces("application/json")
public Percorso getPercorsoById(@PathParam("id") long id) {
Percorso percorso = percorsiRepository.fetch(id);
if (percorso == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
return percorso;
}

Saremo in grado di invocarlo all'indirizzo: http://localhost:8080/primetracks/rest/v1/percorsi/3 e restituirà una risposta json del tipo:
 
 [{"id":3,"nome":"04-08-2011"}]

Dato che la collezione di punti è stata annotata con @JsonIgnore i punti non verranno restituiti nel corpo della risposta.
Conoscendo l'id del percorso andremo ad invocare un secondo metodo, che fornisce i punti che lo compongono:

        @GET
@Path("/{id:[0-9][0-9]*}/punti")
@Produces("application/json")
public List<Punto> getPuntiByPercorsoId(@PathParam("id") long id) {
Percorso percorso = percorsiRepository.fetch(id);
if (percorso == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
return percorso.getPunti();
}
Che invocheremo all'indirizzo: http://localhost:8080/primetracks/rest/v1/percorsi/3/punti e restituirà una risposta json del tipo:

[{"id":130}, {"id":131}]

Do notare come l'annotazione @XmlTransient , svolge la stessa funzione nel caso si voglia mostrare il risultato in formato xml, usando @Produces("text/xml") al posto  di @Produces("application/json").

Ultima nota, per usare l'annotazione @JsonIgnore va aggiunto in maven:
                 <dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.6.3</version>
</dependency>
Inoltre per usare a runtime questa libreria, presente tra i moduli di jboss7, va aggiunto nel META-INF/MANIFEST.MF:
Dependencies: org.codehaus.jackson.jackson-core-asl


Provate!!



sabato 10 settembre 2011

recupero files eliminati

se vi capita di cancellare dei files per sbaglio, date un okkio qui:

http://ubuntumanual.org/posts/357/recover-your-deleted-files-in-ubuntu

io non ci sono riuscito..e alla fine mi sono riscritto il codice perso...

comunque provate questo:
Photorec


Scaricato il tar.gz, usate il comando:
./photorec_static


seguendo il wizard e l'artcioletto citato sopra, si riesce a lanciare il recupero che produce una serie di cartelline, da setacciare per recuperare il/i file perso/i. I files vengono ripristinati in ordine non ben definito nelle cartelline, e diventa difficila recuperare un file/un tipo di files...


andate di shell con qualche comando simile a questo (immaginate di avere nella cartella test5 il risultato del ripristino e di copiare i file .java in una cartella .java):

find test5 -name \*.java -exec  cp {} test_java/ \;



in bocca al lupoo!

cercare data più vicina in una lista di date

Immaginate di avere una lista ordinata di date.
Immaginate di dover trovare la data nella lista + vicina alla data proposta.


  • Utilizziamo un TreeSet per le funzioni lower e higher (per trovare la data nella lista che la precede e la data nella lista successiva) e joda-time per calcolare gli intervalli tra le date
  • calcoliamo la distanza tra la data  proposta e le due date precedente e successivo
  • restituiamo come risultato la data che genera intervallo di minore durata.
Ecco l'esempio intero...si capisce al volo.. [nel codice vanno gestite le eccezioni ...es. lista date vuota...]



package by.giava.mytrips.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TreeSet;

import org.joda.time.DateTime;
import org.joda.time.Interval;

public class DateTree {
private TreeSet<Date> treeset;

public DateTree() {
this.treeset = new TreeSet<Date>();
}

public void reset() {
this.treeset = new TreeSet<Date>();
}

public void add(Date data) {
getTreeset().add(data);
}

public TreeSet<Date> getTreeset() {
return treeset;
}

public void setTreeset(TreeSet<Date> treeset) {
this.treeset = treeset;
}

public Date nearest(Date data) {
DateTime dataF = new DateTime(data);

Date dataMin = getTreeset().lower(data);
DateTime dataMinJ = new DateTime(dataMin);

Date dataMax = getTreeset().higher(data);
DateTime dataMaxJ = new DateTime(dataMax);

Interval periodMin = new Interval(dataMinJ, dataF);
Interval periodMax = new Interval(dataF, dataMaxJ);

if (periodMin.toDurationMillis() <= periodMax.toDurationMillis()) {
return dataMin;
} else {
return dataMax;
}
}

public static void main(String[] args) throws ParseException {
SimpleDateFormat form = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
DateTree dat = new DateTree();
dat.add(form.parse("01-01-2011 10:30:00"));
dat.add(form.parse("01-01-2011 10:50:00"));
dat.add(form.parse("01-01-2011 11:00:00"));

Date result = dat.nearest(form.parse("01-01-2011 10:56:00"));
System.out.println(result);
}
}

lunedì 29 agosto 2011

creare una sitemap senza troppo penare

Dopo aver girato e rigirato ho trovato un tool giavoso:

http://www.auditmypc.com/xml-sitemap.asp

Funziona e ci fa anche vedere gli url inesistenti!!

Da provare..

domenica 28 agosto 2011

come creare un motore di ricerca interno al sito...in google style

immaginate di avere un sito complesso, con tante sezioni e con tante fonti informative (tante tabelline con contenuti tipizzati) e una serie di pagine statiche da indicizzare..

Creare un meccanismo di ricerca globale, potrebbe essere una soluzione fattibile...ma utilizzare quello che si trova in giro, potrebbe essere + sensato!!

Consiglio (dopo averlo provato su macchina virtuale..):

In breve:
- necessita di apache, tomcat (per il crawler e motorino di ricerca), solr per indicizzazione dei contenuti e interfaccia per query.

Si installa facilmente...

Buona ricerca integrata!

links utili:
ajax + solr
tutorial solr:


esempio di commercializzazione del prodotto...

mercoledì 17 agosto 2011

jboss7 JSF error after AS6 to AS7 migration: java.lang.ClassNotFoundException: sun.util.calendar.ZoneInfo

vedi questo post:

http://community.jboss.org/thread/169938?tstart=0

jboss7: aggiungere le dipendenze nel manifest del war/jar con maven


come suggerito da Shane Bryzak,

nella seam-dev mailL:

per aggiungere jboss-logging in AS7 va aggiunto nel file manifest (META-INF/MANIFEST.MF) del ns war/jar:

Dependencies: org.jboss.logging,org.jboss.logmanager

E' possibile usare "manifestEntries" di maven per automatizzare la scrittura nel file:

<build>
<finalName>seam-university</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifestEntries>
<Dependencies>org.slf4j.impl,org.jboss.logging,org.jboss.logmanager</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>

lunedì 15 agosto 2011

jboss7: rendere il sever accessibile non solo da localhost


per fare ascoltare jboss7 non soltanto su 127.0.0.1:

http://community.jboss.org/thread/168789?tstart=120

ecco qui le modifiche da fare su standalone.xml:

<interfaces>
<interface name="management">
<inet-address value="127.0.0.1"/>
</interface>
<interface name="public">
<inet-address value="127.0.0.1"/>
</interface>

<!-- IPv4 -->
<interface name="any">
<any-ipv4-address/>
</interface>
</interfaces>

<!-- Use the any interface -->
<socket-binding-group name="standard-sockets" default-interface="any">
<socket-binding name="http" port="8080"/>
<socket-binding name="https" port="8443"/>
<socket-binding name="jmx-connector-registry" port="1090"/>
<socket-binding name="jmx-connector-server" port="1091"/>
<socket-binding name="jndi" port="1099"/>
<socket-binding name="osgi-http" port="8090"/>
<socket-binding name="remoting" port="4447"/>
<socket-binding name="txn-recovery-environment" port="4712"/>
<socket-binding name="txn-status-manager" port="4713"/>
</socket-binding-group>

jboss7: alziamo il livello del log a INFO

seguendo la guida:

https://docs.jboss.org/author/display/AS7/Logging+configuration


per visualizzare qualche info in +, alziamo il livello del log:

<subsystem xmlns="urn:jboss:domain:logging:1.1">
<console-handler name="CONSOLE" autoflush="true">
<level name="INFO"/>
<formatter>
<pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
</formatter>
</console-handler>
<periodic-rotating-file-handler name="FILE" autoflush="true">
<level name="INFO"/>
<formatter>
<pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<logger category="com.arjuna">
<level name="WARN"/>
</logger>
<logger category="org.apache.tomcat.util.modeler">
<level name="WARN"/>
</logger>
<logger category="sun.rmi">
<level name="WARN"/>
</logger>
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
</subsystem>

jboss7: domini sicurezza usando pagina login jsf

In jboss7 è possibile utilizzare una pagina jsf come pagina di login:

<login-config>
<auth-method>FORM</auth-method>
<realm-name>Login</realm-name>
<form-login-config>
<form-login-page>/login.jsf</form-login-page>
<form-error-page>/login.jsf</form-error-page>
</form-login-config>
</login-config>

jboss7: domini sicurezza usando database

Uno dei jaas "classici" è l'uso del database per autenticazione/autorizzazione.
istruzioni veloci per l'uso:

1) tabelle su database (schema ultra semplificato non consigliabile in produzione - usare 3 tabelle - utenti [id, username, pwd], ruoli[id, ruolo], utenti_ruoli[id, id_utente, id_ruolo]):
CREATE TABLE IF NOT EXISTS `user_auth` (
`USERNAME` varchar(100) NOT NULL DEFAULT '',
`PASSWORD` varchar(100) DEFAULT NULL,
`EMAIL` varchar(200) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`USERNAME`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `user_role` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ROLE_NAME` varchar(100) DEFAULT NULL,
`USERNAME` varchar(100) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=122 ;


2) inserire dei dati di prova (utente fiorenzino con pwd '12345678' e ruolo admin):
INSERT INTO `user_auth` (`USERNAME`, `PASSWORD`, `EMAIL`) VALUES
('fiorenzino', 'JdVa0oOqQAr0ZMdtcTwHrQ==', 'fiorenzino@gmail.com');

INSERT INTO `user_role` (`ROLE_NAME`, `USERNAME`) VALUES
('admin', 'fiorenzino');

3) creare un datasource nel file standalone.xml (si presume che ci sia già un modulo con i driver mysql):
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
<datasources>
<datasource jndi-name="java:jboss/datasources/GiavaByDS" pool-name="GiavaByDS_Pool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>
jdbc:mysql://localhost:3306/bygiava
</connection-url>
<driver-class>
com.mysql.jdbc.Driver
</driver-class>
<driver>
mysql
</driver>
<pool>
<min-pool-size>
2
</min-pool-size>
<max-pool-size>
30
</max-pool-size>
<prefill>
true
</prefill>
<use-strict-min>
false
</use-strict-min>
<flush-strategy>
FailingConnectionOnly
</flush-strategy>
</pool>
<security>
<user-name>
bygiava
</user-name>
<password>
bygiava
</password>
</security>
<validation>
<validate-on-match>
false
</validate-on-match>
<background-validation>
false
</background-validation>
<use-fast-fail>
false
</use-fast-fail>
</validation>
<statement>
<prepared-statement-cache-size>
100
</prepared-statement-cache-size>
<share-prepared-statements/>
</statement>
</datasource>
<drivers>
<driver name="mysql" module="com.mysql"/>
</drivers>
</datasources>
</subsystem>

4) creare il dominio di sicurezza che valida username e pwd usando il datasource e carica i ruoli per l'utente loggato (in grassetto le query per verifica username/pwd e caricamento ruoli):


<subsystem xmlns="urn:jboss:domain:security:1.0">
<security-domains>
<security-domain name="giavaby">
<authentication>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/GiavaByDS"/>
<module-option name="principalsQuery" value="select password from user_auth where username=?"/>
<module-option name="rolesQuery" value="SELECT B.ROLE_NAME,'Roles' FROM user_role as B where B.username = ?"/>
<module-option name="hashAlgorithm" value="MD5"/>
<module-option name="hashEncoding" value="BASE64"/>
</login-module>
</authentication>
</security-domain>
</security-domains>
</subsystem>

Notare come basta indicare code="Database", piuttosto che indicare la classe org.jboss.security.auth.spi.DatabaseServerLoginModule

5) creare un war con WEB-INF/web.xml contentente:


<security-constraint>
<web-resource-collection>
<web-resource-name>web autentication</web-resource-name>
<description>An example security config </description>
<url-pattern>/private/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>FORM</auth-method>
<realm-name>Login</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/login.jsp</form-error-page>
</form-login-config>
</login-config>

<security-role>
<role-name>admin</role-name>
</security-role>


6) aggiungere il file WEB-INF/jboss-web.xml :


<?xml version='1.0' encoding='UTF-8'?>
<jboss-web>
<security-domain>giavaby</security-domain>
</jboss-web>


7) la pagina di login.jsp manda su pagina html contenente:

<form action="j_security_check" method="post"><br />
<label for="j_username">username:</label><br />
<input type="text" id="j_username" name="j_username" /> <br />
<br />
<br />
<label for="j_password">password:</label><br />
<input type="password" id="j_password" name="j_password" /> <br />
<br />
<input type="submit" value="accedi" />
</form>


8) provate ad accedere ad una risorsa nella cartella private/, verrete indirizzati alla pagina di login.

provare...

venerdì 12 agosto 2011

google docs in nautilus - ubuntu


scaricare http://code.google.com/p/nautilus-gdoc/downloads/list il file zippato:
nautilus-gdoc.tar.gz

estrarre il file SendToGDoc e copiarlo nella cartella .gnome2/nautilus-scripts contenuta nella propria home:
/home/{USER}/.gnome2/nautilus-scripts

installare le librerie python per google data:
sudo apt-get install python-gdata


aprire il file:
sudo vim /usr/share/pyshared/gdata/docs/service.py

ed aggiungere il tipo di files PDF ai SUPPORTED_FILETYPES (estratto dal file):

# File extensions of documents that are permitted to be uploaded.
SUPPORTED_FILETYPES = {
'CSV': 'text/csv',
'TSV': 'text/tab-separated-values',
'TAB': 'text/tab-separated-values',
'DOC': 'application/msword',
'ODS': 'application/x-vnd.oasis.opendocument.spreadsheet',
'ODT': 'application/vnd.oasis.opendocument.text',
'RTF': 'application/rtf',
'SXW': 'application/vnd.sun.xml.writer',
'TXT': 'text/plain',
'XLS': 'application/vnd.ms-excel',
'PPT': 'application/vnd.ms-powerpoint',
'PPS': 'application/vnd.ms-powerpoint',
'HTM': 'text/html',
'HTML' : 'text/html',
'PDF': 'application/pdf'}

a questo punto riavviare nautilus!

facendo tasto dx sul file da trasferire nella voce "script -> Send to Gdoc". come nella immagine allegata!


martedì 9 agosto 2011

lunedì 8 agosto 2011

java login oauth

http://blog.enterpriselab.ch/tdmarti/2011/04/06/openid-in-a-web-application-based-on-java-ee-and-jsf-2-0/

http://www.richardnichols.net/2010/06/implementing-facebook-oauth-2-0-authentication-in-java/


http://t-machine.org/index.php/2007/08/13/how-to-make-facebook-apps-using-java-part-2/


http://code.google.com/p/socialauth/source/checkout

http://www.9lessons.info/2011/07/login-with-google-account.html

http://www.9lessons.info/2011/02/login-with-facebook-and-twitter.html


lunedì 1 agosto 2011

Picasa Web Albums Data API maven

utilissimo per usare le api di google, nello specifico con picasa:

http://code.google.com/p/mandubian-mvn/wiki/HowTo

http://code.google.com/p/mandubian-mvn/wiki/AvailableVersions



mandubian-mvn
http://mandubian-mvn.googlecode.com/svn/trunk/mandubian-mvn/repository





com.google.api.client
google-api-client
1.4.1-beta



com.google.gdata
gdata-photos-2.0
1.41.5




http://rat86.netsons.org/blog/2008/05/creare-una-galleria-sul-proprio-sito-da-picasa-con-pwajs/

lubuntu - creare icone personalizzate su desktop e su menuù

utilissimo articolo:
http://wiki.lxde.org/en/Main_Menu


in ordine:
1) creare la cartella /usr/local/share/applications/
2) darle i diritti in scrittura per utente principale
3) creare in quella cartella un file col nome della app da linkare .desktop:
es: eclipse.desktop
4) avviare l'editor (al posto del gedit qui c'è leafpad)
leafpad /usr/local/share/applications/eclipse.desktop
5) incollare qualcosa tipo:

[Desktop Entry]
Encoding=UTF-8
Exec=/home/fiorenzo/java/eclipse/eclipse
Icon=/home/fiorenzo/java/eclipse/icon.xpm
Type=Application
Terminal=false
Name=Eclipse
GenericName=eclipse
StartupNotify=false
Categories=Development

il gioco è fatto!

a questo punto sarà visibile nel menu principale nella voce Programmazione (ho lubuntu italiana) e quindi si potrà aggiungere sia come icona sul desktop che sulla barra in basso...

lubuntu - creare icone personalizzate su desktop e su menu

domenica 31 luglio 2011

javascritp per manipolare immagini (filtri..)

Immaginate di voler fare un'applicazione che consente di gestire le foto in ogni fase:
1) upload massivo
2) ridimensionamento massivo o mirato
3) applicazione di filtri...

Ecco per la III terza parte si puo usare http://camanjs.com/


provare !!!!

guardate il preset example:

http://camanjs.com/examples/presets

vi ricorda un po instagram e affini?

instagram from java

se avete un iphone e vi piace fare foto, non potetet non provare instagram..l'ultimo ritrovato dello scatto istantaneo (stile polaroid) solo per iphone (questo non piace...) con una serie di filtri per abbellire, rendere + strane le vs immagini...

a noi interessa usare le api da java...
è possibile soltanto il recupero delle foto/informazioni/commenti/amici...
non si può caricare nulla....

ho provato questa libreria, ancora poco organizzata
https://github.com/sachin-handiekar/jInstagram

(va checkoutata e compilata ion locale, non ci sono librerie..no maven...no ant)...


una guida minimale per muovere i primi passi:
https://github.com/sachin-handiekar/jInstagram/wiki/jInstagram-Usage

per fare i test vi serve la registrazione sul sito:
http://instagram.com/developer/

per fare dei test da client (eclipse), fate cosi:
1) create una paginetta (che magari scrive solo ciao!) su un server pubblico:

basta che sia raggiungibile:
es http://giava.by/instaflower/oauth/index.html

2) da browser chiamate questo indirizzo:
http://instagram.com/oauth/authorize/?client_id=CLIENT_ID&redirect_uri=REDIRECT-URI&response_type=token

sostituite nell'url il CLIENT_ID che avete ricevuto nel registrarvi sul sito sviluppatori e il vs indirizzo pubblico (REDIRECT-URI)

3) prendete il token che vi è stato assegnato:

es: http://giava.by/instaflower/oauth/#access_token=xxxxxx.xxx.1926f93543824d95bb83d3a9805874df

access_token=xxxxxx.xxx.1926f93543824d95bb83d3a9805874df

ecco un esempio rapido per avere tutte le vs foto:

import java.util.List;

import org.jinstagram.Instagram;
import org.jinstagram.auth.model.Token;
import org.jinstagram.entity.common.Caption;
import org.jinstagram.entity.common.Comments;
import org.jinstagram.entity.common.ImageData;
import org.jinstagram.entity.common.Images;
import org.jinstagram.entity.common.Likes;
import org.jinstagram.entity.common.Location;
import org.jinstagram.entity.users.basicinfo.UserInfo;
import org.jinstagram.entity.users.basicinfo.UserInfoData;
import org.jinstagram.entity.users.feed.MediaFeed;
import org.jinstagram.entity.users.feed.MediaFeedData;
import org.jinstagram.entity.users.feed.UserFeed;
import org.jinstagram.entity.users.feed.UserFeedData;
import org.jinstagram.exceptions.InstagramException;

public class First {

static String your_client_secret = "172460d1932b4393b2097f67dfd78ff1";
static String access_token="xxxxxx.xxx.1926f93543824d95bb83d3a9805874df";
static String nickname ="pippoPluto";

public static void main(String[] args) throws InstagramException {

Token accessToken = new Token(
access_token,
your_client_secret);
Instagram instagram = new Instagram(accessToken);
UserFeed userFeed = instagram.searchUser(nickname);
List userList = userFeed.getUserList();
long userId = 0;
for (UserFeedData userFeedData : userList) {
userId = userFeedData.getId();
}
UserInfo userInfo = instagram.getUserInfo(userId);

UserInfoData userData = userInfo.getData();
System.out.println("id : " + userData.getId());
System.out.println("first_name : " + userData.getFirst_name());
System.out.println("last_name : " + userData.getLast_name());
System.out
.println("profile_picture : " + userData.getProfile_picture());
System.out.println("website : " + userData.getWebsite());

MediaFeed mediaFeed = instagram.getUserFeeds();
List mediaFeeds = mediaFeed.getData();

for (MediaFeedData mediaData : mediaFeeds) {
System.out.println("id : " + mediaData.getId());
System.out.println("created time : " + mediaData.getCreatedTime());
System.out.println("link : " + mediaData.getLink());
System.out.println("tags : " + mediaData.getTags().toString());
System.out.println("filter : " + mediaData.getImageFilter());
System.out.println("type : " + mediaData.getType());

System.out.println("-- Comments --");
Comments comments = mediaData.getComments();

System.out.println("-- Caption --");
Caption caption = mediaData.getCaption();

System.out.println("-- Likes --");
Likes likes = mediaData.getLikes();

System.out.println("-- Images --");
Images images = mediaData.getImages();

ImageData lowResolutionImg = images.getLowResolution();
ImageData highResolutionImg = images.getStandardResolution();
ImageData thumbnailImg = images.getThumbnail();

Location location = mediaData.getLocation();
if (location != null)
System.out.println(location.getName());
System.out.println("****************************************");
}

}
}

mercoledì 27 luglio 2011

jboss7: domini sicurezza custom

alla ricerca di come far funzionare il cas+ldap come moduli di sicurezza a cascata:

http://community.jboss.org/message/613183

http://community.jboss.org/thread/168118

non vera, ma scoraggiante:
http://stackoverflow.com/questions/5046122/how-do-you-specify-the-security-domain-for-a-war-under-jboss-7

jsf: grafici ed excel

riporto una piccola chattata...

argomenti: creare grafi belli e avanzati in jsf.

soluzioni valutabili:
primefaces demo 3 carina sia nell'uso di excel che di chart (ma sono poche)
http://www.primefaces.org/showcase-labs/ui/chartsHome.jsf
http://www.primefaces.org/showcase-labs/ui/sheet.jsf

extjs (molto bella ma tutto javascript)..possibile jsf integrazione:
http://j2flower.blogspot.com/search/label/EXTJS

varie librerie jsf/chart
http://code.google.com/p/jsflot/

ecco la ns conversazione...
[16.25.33] Fulvio : extjs spacca, lo sto usando, anche se con JS faccio fatica
[16.25.39] flower: lo so, ma che deve fare? tutto quello che fa excel? hai visto l'ultima demo di primefaces?


[16.26.37] Fulvio: è un gestionale, c'è bisogno di fare tanti grafici per visualizzare dei dati. abbiamo bisogno di un tipo di chart molto particolare (onde quadre)..
[16.28.22] flower: questo: http://code.google.com/p/jsflot/


[16.30.07] Fulvio : no, che disegni come volgio io... ora vedo se le classiche line chart possono fare onde quadre
[16.32.26] flower: non comprendo, se esiste bene... se no, non è che lo crei tu! è da matti! chi si mette li a farlo?
[16.32.49] Fulvio: ecco appunto :)

[16.30.23] flower: dovresti usare quella libreria che wrappa flex da jsf, quella della exadel, e ti tieni flex (fai animazione flash e passi parametri da jsf)
[16.30.55] flower: http://livedemo.exadel.com/fiji-demo/

[16.33.08] flower: qui li hai tutti
[16.33.05] flower: http://webification.com/php-js-flash-chart-libraries-roundup

jboss6: creare datasource di default

per sostituire il datasource di default (che è su hsqldb):

http://wiki.openscg.com/index.php/JBoss_AS_6_with_PostgreSQL_9

l'esempio è in postgresql, ma vale anche per gli altri...

jboss6: tuning [per velocizzare il boot...]

non esistendo ancora una pagina ufficiale, qui si pososno trovare utili informazioni:

http://community.jboss.org/thread/159648?start=0&tstart=0

lunedì 25 luglio 2011

foto panoramiche: hugin

indispensabile usare hugin:
http://hugin.sourceforge.net/tutorials/index.shtml

http://www.linuxfocus.org/Italiano/September2004/article348.shtml

http://grigio.org/come_creare_foto_panoramiche_magnifiche

http://www.geekissimo.com/2008/08/31/hugin-come-creare-un-panorama-da-una-serie-di-scatti-digitali/

http://gerlos.altervista.org/book/export/html/229

http://www.torinoacolori.it/hugin.html

http://caprasilana.wordpress.com/tag/hugin/

http://thejoe.it/wordpress/2010/06/02/hugin-e-le-foto-panoramiche-alcuni-consigli-per-iniziare/

http://www.volalibero.it/creare_foto_panoramiche.html

http://www.flickr.com/groups/hugin/

http://www.flickr.com/photos/asbruff/sets/72157626013072992/

utile

http://www.bryanhansel.com/2007/a-quick-and-dirty-hugin-panoramic-stitcher-tutorial/

http://shutterexperiments.com/2011/02/06/equirectangular-panoramas/#more-65

creare custom streetview

partiamo dall'esempio massimo..irragiungibile:

http://www.googleartproject.com/museums/reinasofia

come creare un sistema simil google:

http://spectrum.ieee.org/geek-life/hands-on/diy-streetview-camera/0

un cavalletto per fare foto:
http://www.wikihow.com/Build-a-Panoramic-Tripod-Head

tanti consigli utili su foto panoramiche:
http://www.panohelp.com/

come generare foto zommabili di varie dimensioni:
http://helmi-blebe.blogspot.com/2010/10/custom-street-view-panorama-using.html

ottimo e completo (da copiare)
http://www.theveganrobot.com/robotview/sv05/willow_pirate.html

esempi pratici:
http://helmi03.com/pano/titiwangsa/tt.html

http://alecmgo.googlecode.com/svn/trunk/streetviewpano/streetview-custom-simple.html

http://raphaelcruzeiro.com/2011/05/08/creating-a-custom-street-view-panorama/

http://oa-samples.googlecode.com/svn/trunk/presentations/io-2011/samples/streetview-custom.html

http://blog.mridey.com/2010/05/how-to-create-and-display-custom.html

pubblicare suoni di un luogo

interessante progetto...


http://aporee.org/maps/

cdi: recoruce bundle...

si potrebbe fare qualcosa di simile:

http://john-ament.blogspot.com/2010/03/dyanmic-resourcebundles-in-cdi.html

jsf richfaces viewscope

forse non serve +...


http://mkblog.exadel.com/2009/07/view-scope-in-richfaces/

jsf: datatable con query a vista

non male l'idea:
http://code.google.com/p/topless-jsf/


id="m"
binding="#{complexRequest.toplessTable}"
dataSource="#{appConfig.dataSource}"
query="select * from widgets"
includes="#{tfn:jsonArrayToList(requestScope.includes)}"
rows="10">

EXTENDED PERSISTENCE CONTEXT

letture utili.... prima di incontrare seam persistence (che lo fa bene)...


http://seamframework.org/Community/EXTENDEDPersistenceContextProduces

http://azajava.blogspot.com/2009/09/introduction-i-decided-to-share-special.html


http://thatjavathing.blogspot.com/2009/04/extended-persistence-context.html

EXTENDED PERSISTENCE CONTEXT

letture utili.... prima di incontrare seam persistence (che lo fa bene)...


http://seamframework.org/Community/EXTENDEDPersistenceContextProduces

http://azajava.blogspot.com/2009/09/introduction-i-decided-to-share-special.html


http://thatjavathing.blogspot.com/2009/04/extended-persistence-context.html

jsf excel (EXTJS)

sembra sia possibile, anche se primefaces..fa tante belle cose ...


http://thus-spoke-the-computer.blogspot.com/2009/12/proof-of-conceptpoc-using-richfaces-and.html

http://code.google.com/p/extjs-richfaces

birt e i suoi report

molti lo usano e non sembra nemmeno male:

http://www.lebirtexpert.com/bestof.php

http://www.ibm.com/developerworks/data/library/techarticle/dm-0708tomlyn/

integrate BIRT with Hibernate:

http://www.eclipsezone.com/eclipse/forums/t65535.html

creare database gerarchici

se vi venisse in mente di creare un social (come g+ o f+), ci vogliono strutture db performanti....

http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

http://shirky.com/writings/ontology_overrated.html

http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html#nodes_edges_paths_model

http://shirky.com/writings/ontology_overrated.html

http://www.alandelevie.com/2008/07/12/recursion-less-storage-of-hierarchical-data-in-a-relational-database/

http://articles.sitepoint.com/article/hierarchical-data-database

java ldap (io lo odio)

qui ci sono tanti esempietti da cui iniziare (ad odiare ldap):

http://developer.novell.com/documentation/samplecode/jldap_sample/index.htm
http://developer.novell.com/documentation/jldap/jldapenu/api/

applet: per accedere al filesystem in download

E se qualche cliente vi dicesse:

le foto devono essere scaricate in una cartella ben precisa...
tornano buone le vecchie care applet...firmate...


http://www.developer.com/java/other/article.php/3303561/Creating-a-Trusted-Applet-with-Local-File-System-Access-Rights.htm

http://www.java-forums.org/java-applets/5998-reading-dir-java-applets.html

http://bytes.com/topic/java/answers/634415-read-directory-applet

scala ejb3: si può fare!

per un po mi sono fatto prendere...
ma poi il limite degli strumenti (plugins eclipse) ho lasciato..ma prima o poi ci torneremo...

http://blog.excilys.com/2010/02/04/java-ee-6-en-scala-partie-2-ejb-3-1/

http://blog.mmrath.com/2010/01/jsf-20-cdi-scala-28-using-eclipse-maven.html

http://weblogs.java.net/blog/cayhorstmann/archive/2010/09/04/scala-jsf-2-and-netbeans

http://blog.mmrath.com/2010/01/jsf-20-cdi-scala-28-using-eclipse-maven.html

http://blogs.sourceallies.com/2010/02/java-ee-6-and-scala/

http://vikasrao.wordpress.com/2009/06/

http://scala-enterprise.blogspot.com/2010/10/named-beans-in-ejb-31-using-scala.html

text to speech using java

la vecchia idea...applicazioni parlanti...


http://www.hiteshagrawal.com/java/text-to-speech-tts-in-java


http://half-wit4u.blogspot.com/2011/01/text-to-speech-using-java-api.html

facebook da java e non

Se un cliente vi chiedesse:

...vorrei pubblicare sul mio sito ma contemporaneamente su facebook..

si può fare...

http://restfb.com/

http://code.google.com/p/batchfb/

http://woork.blogspot.com/2009/05/how-to-implement-post-to-wall-facebook.html


http://www.moskjis.com/other-platforms/publish-facebook-page-wall-from-your-site


http://blog.theunical.com/facebook-integration/5-steps-to-publish-on-a-facebook-wall-using-php/

http://info.zapevent.com/blog/bid/37515/ZapEvent-Publish-to-Facebook-Feature-Release

maven: come organizzare i progetti

nei grandi progetti, il dilemma è come spezzare il progetto in tanti moduli, come versionare i singoli moduli---

http://www.waltercedric.com/java-j2ee-mainmenu-53/framework-mainmenu-137/apache-maven/1363-maven-multi-module-support-in-m2eclipse.html

http://out-println.blogspot.com/2008/10/maven-modules-with-independent-versions.html

jsf validator

un link:

http://www.coderanch.com/t/210563/JSF/java/Passing-parameters-attributes-custom-validator

jsf2 composite components

I primi esperimenti non sono andati un granchè bene...

comunque qualche links:

http://weblogs.java.net/blog/edburns/archive/2009/09/02/jsf2-composite-component-metadata

http://digitaljoel.nerd-herders.com/2009/12/14/sharing-jsf-2-composite-components/


http://stackoverflow.com/questions/4561753/jsf2-0-el-are-not-resolved-in-a-composite-component-taglib


http://kpachar.blogspot.com/2010/06/tinymce-as-jsf-2-composite-component.html

http://smartfaces.org/smartfaces/faces/showcase.xhtml

http://jsflive.wordpress.com/2011/03/24/custom-component-library/

http://javaserverfaces.java.net/nonav/docs/2.0/pdldocs/facelets/

http://code.google.com/p/primefaces-extensions/

android utils: altri links

Altri links:

http://libresoft.es/Members/rocapal/ar-interface-in-android-using-phonegap

http://www.ibm.com/developerworks/websphere/zones/portal/portletfactory/proddoc/phonegap/


https://github.com/purplecabbage/phonegap-plugins/tree/master/Android/BarcodeScanner


http://www.mobiledevelopersolutions.com/home/start/twominutetutorials/tmt3

IOException: Too many open files [utilità]

ricordarsi di controllare il num max numero di files su macchina linux:

http://www.netadmintools.com/art295.html

lsof | wc -l

IOException: Too many open files

alle volte ritornano...

qualche utile link per correggere il malfunzionamento:

dove mi ha fatto venire in mente che non facevo:

Finally destroy() your Process.

ma infine utilissimo:


vanno chiusi anche gli stream....

public class ProcDemo {

public static void main(String[] args) throws
InterruptedException, IOException {
Process proc = null;
try {
ProcessBuilder pb = new ProcessBuilder(args);
proc
= pb.start();
proc
.waitFor();
} finally {
if (proc != null) {
close
(proc.getOutputStream());
close
(proc.getInputStream());
close
(proc.getErrorStream());
proc
.destroy();
}
}
}

private static void close(Closeable c) {
if (c != null) {
try {
c
.close();
} catch (IOException e) {
// ignored
}
}
}
}

mercoledì 6 luglio 2011

appunti android - e se volessimo raccogliere la firma di un cliente tramite app

Immaginiamo una bella app in cui si richiede di far firmare il nostro utilizzatore..
sto pensando ai corrieri ups che consegnano a casa i pacchi..e con il loro dispositivo mobile ci fanno firmare l'avvenuta consegna del pacco...
forse non avrà grande validità legale...ma uno schizzo su carta verrebbe fuori...

bene come facciamo da un app android a fare la stessa cosa?

tralasciando le librerie a pagamento, ho trovato una libreria web che usa html5 e qualche artificio magico da approfondire che fa quello che ci serve...

http://thomasjbradley.ca/lab/signature-pad#require-drawn

nel frattempo la ricerca sui forum continua.. e qualche idea javosa viene fuori:


appunti android - usiamo html css e js per creare la nostra app

Invece di scrivere il codice alla vecchia.. vediamo se è possibile scrivere una app che usa le funzioni di basso liverllo del nostro android, senza dover scrivere il codice java necessario..
Ebbene si! Si puo fare:


un bel progetto..scaricata la mini libreria.. provata su due android, con differenti risultati:

android 1.6 (non funziona bene..continui popup di errore..anche se qualche funzione la esegue lo stesso.. LASCIARE PERDERE)
android 2.2/2.3 funziona alla grande...

e parte la soffisfazione nel vedere che da una paginetta web, si riesce a scattare una foto e la si rivede nel dom della pagina html...
aggancia i contatti...aggancia le connessioni wifi/umts... si localizza...

insomma funziona!!

(chiaramente per ora mi interessa solo android..ma pare si possa usare anche su iphone/backberry/etc.. proveremo...)

links utili (progetti riusabili..idee preziose)

un po di documentazione...

i mitici plugins...


bella app da vedere e leggere per imparare uso avanzato..

e qui la possiamo vedere:

plugins...

come gestire l'update della app sviluppata con phonegap (in realtà sono opzioni generali android)..

come scalare la app in base alla grandezza del dispositivo dispositivo..


ottimo esempio..

come lanciare un browser in una nuova finestra..

come inviare sms da phonegap html pages...