Pubblicato da teox78 su Febbraio 8, 2008
Credo che una delle difficoltà principali nel creare applicativi web sia la velocità di sviluppo degli stessi. Flex viene in contro a noi sviluppatori mettendo a disposizione un potente framework che permette di creare applicazioni web in breve tempo e soprattutto con delle funzionalità non supportate dall’html (drag and drop, sliders, …). Non mi dilungo nello spiegare il suo funzionamento nel dettaglio, anche perchè è un mondo a me nuovo e quindi sono ancora inesperto , bensì vi mostro le potenzialità di tale framework grazie a qualche applicativo di esempio.
Raccolta di applicazioni web
Flex 3 è già in beta, ecco qualche video che mostre alcune delle nuove funzionalità :
Advanced Datagrid
OlapDatagrid
Charting Enhancements
Flex 3
L’unica “pecca” è che per il momento non ci sono IDE freeware che ti permettano di sviluppare in flex quindi o si usa un editor di testo qualunque (tornando però ad avere tempi di sviluppo lunghissimi ) o si acquista Flex Builder (a partire da €220 circa ) per il momento disponibile solo per Windows e Mac (dicono che sia prevista anche una versione Linux). Per chi usa eclipse invece c’è il plugin (compatibile con eclipse 3.1 ; con flex 3 invece sarà compatibile con eclipse 3.3).
Pubblicato su Flex | Contrassegnato da tag: Flex, RIA, Web | Non ci sono Commenti »
Pubblicato da teox78 su Gennaio 23, 2008
Ecco una breve classe java che permette di lanciare un qualsiasi processo del sistema operativo da Oracle.
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED “FileHandler” AS
import java.io.*;
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;
class StreamReader extends Thread {
InputStream inputStream;
String prefix;
StreamReader(InputStream inputStream, String prefix) {
this.inputStream = inputStream;
this.prefix = prefix;
}
public void run() {
try {
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream);
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(prefix + ” ” + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class StreamWriter extends Thread {
OutputStream outputStream;
String prefix;
StreamWriter(OutputStream outputStream) {
this.outputStream = outputStream;
}
public void run() {
try {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
while (true) {
bufferedWriter.newLine();
}
} catch (IOException e) {
}
}
}
public class FileHandler {
public static int run (String command) {
Runtime runtime = Runtime.getRuntime();
Process process;
int exitValue = -1;
try {
process = runtime.exec(command);
StreamReader errorReader = new StreamReader(process.getErrorStream(), “<<ERROR>>”);
StreamReader outputReader = new StreamReader(process.getInputStream(), “<<OUTPUT>>”);
StreamWriter inputWriter = new StreamWriter(process.getOutputStream());
errorReader.start();
outputReader.start();
inputWriter.start();
exitValue = process.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return exitValue;
}
};
La classe StreamReader serve per poter catturare lo standard output e lo standard error del processo lanciato e loggarli : in questo caso verranno scitti all’interno di trace file nella directory user dump di Oracle ma nulla ci vieta di inserire il tutto in una tabella per una consultazione più rapida. La classe StreamWriter invece impedisce che il processo si blocchi nel caso quest’ultimo sia in attesa sullo standard input. Nel mio caso ero solo interessato al fatto che il processo non si bloccasse quindi non faccio altro che simulare un invio da tastiera, però si potrebbero inviare delle informazioni tramite lo standard input se il processo lo richiedesse.
Il metodo run all’interno della classe FileHandler non fa altro che lanciare il processo e restituire il valore ritornato dal processo, solitamente 0 significa ‘terminato con successo’ e tutto il resto significa che si sono verificati degli errori.
Adesso creiamo una stored procedure che punti a questo metodo :
create or replace FUNCTION OSCommand_Run(Command IN STRING) RETURN NUMBER IS LANGUAGE JAVA NAME 'FileHandler.run(java.lang.String) return int';
Diamo i permessi necessari
EXEC DBMS_JAVA.grant_permission('SCHEMA-NAME', 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');
EXEC DBMS_JAVA.grant_permission(’SCHEMA-NAME’, ‘SYS:java.lang.RuntimePermission’, ‘writeFileDescriptor’, ”);
EXEC DBMS_JAVA.grant_permission(’SCHEMA-NAME’, ‘SYS:java.lang.RuntimePermission’, ‘readFileDescriptor’, ”);
A questo punto possiamo lanciare e monitorare un qualsiasi processo del sistema operativo da una stored procedure o package.
Pubblicato su Java, Oracle | Contrassegnato da tag: Java, Oracle, os process | Non ci sono Commenti »
Pubblicato da teox78 su Dicembre 4, 2007
In ufficio sono costretto ad utilizzare un proxy con autenticazione per accedere ad internet.
Quindi, dopo aver installato Opensuse 10.3 apro Yast Control Centre, vado sotto Network Services -> Proxy : inserisco l’url del proxy http, il nome utente e la password. Faccio il test e ottengo un esito positivo.
Quando però cerco di andare sotto Yast Control Centre -> Software -> Community Repositories mi viene restituito un messaggio di errore che dice di non poter scaricare la lista dei repositories. Baco ??
Dopo aver fatto un po’ di prove, per risolvere il problema in maniera abbastanza ‘pulita’ ho deciso di editare a mano il file /etc/sysconfig/proxy impostando HTTP_PROXY, HTTPS_PROXY, FTP_PROXY con un valore così composto :
http://domain\username:password@host:port
Pubblicato su Linux | Contrassegnato da tag: openSuse, proxy | 1 Commento »
Pubblicato da teox78 su Novembre 27, 2007
In questi giorni ho iniziato a sviluppare un nuovo processo che ha come database Oracle.
Prima di caricare alcuni file csv,l’utente deve avere la possibilità di vedere il contenuto di alcune directory non sempre visibili dalla macchina dell’utente quindi ho deciso che la soluzione ottimale fosse avere questo elenco all’interno di Oracle, ad esempio tramite una vista che interrogasse direttamente il filesystem. Ecco come fare tutto ciò :
CREATE OR REPLACE TYPE StringArray AS TABLE OF VARCHAR2(512);
-
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "FileHandler" AS
import java.io.*;
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;
public class FileHandler {
public static oracle.sql.ARRAY list(String dirName) throws SQLException {
Connection conn = null;
int ret_code;
String[] files = null;
File file = new File(dirName);
if (file.exists()) {
if (file.isDirectory()) {
if (file.canRead()) {
files = file.list();
}
}
}
try {
conn = new OracleDriver().defaultConnection();
ArrayDescriptor x_ad = ArrayDescriptor.createDescriptor(
“STRINGARRAY”, conn);
ARRAY x_array = new ARRAY(x_ad, conn, files);
return x_array;
} catch (SQLException e) {
ret_code = e.getErrorCode();
System.err.println(ret_code + e.getMessage());
conn.close();
return null;
} finally {
closeConnection(conn);
}
}private static void closeConnection(Connection connection) {
if (connection == null) {
return;
} else {
try {
connection.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
connection = null;
}}
};
/
CREATE OR REPLACE FUNCTION list (p_path IN VARCHAR2) RETURN StringArray AS LANGUAGE JAVA NAME 'FileHandler.list (java.lang.String) return oracle.sql.ARRAY';
-
EXEC DBMS_JAVA.grant_permission('SCHEMA-NAME', 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');
EXEC DBMS_JAVA.grant_permission(’SCHEMA-NAME’, ‘SYS:java.lang.RuntimePermission’, ‘writeFileDescriptor’, ”);
EXEC DBMS_JAVA.grant_permission(’SCHEMA-NAME’, ‘SYS:java.lang.RuntimePermission’, ‘readFileDescriptor’, ”);
GRANT JAVAUSERPRIV TO SCHEMA-NAME;
A questo punto sarà sufficiente fare una query come quella seguente per ottenere tutti i file e directory presenti sul disco C della macchina sulla quale c’è il database.
SELECT * FROM TABLE(LIST('C:\'))
Naturalmente questo è solo un esempio che mostra la strada che ,secondo me, è meglio seguire; si potrebbero creare strutture più complesse che oltre al nome del file restituiscano la dimensione o la data dello stesso.
Pubblicato su Java, Oracle | Contrassegnato da tag: directory, file handling, Java, Oracle, PL/SQL | Non ci sono Commenti »
Pubblicato da teox78 su Novembre 16, 2007
Ieri mattina, arrivo in ufficio e scopro che uno dei database oracle di produzione è giù! Vado nell’alert a vedere se c’è qualche errore e incappo in un
ORA-04030: memoria di processo esaurita nel tentativo di allocare 1483316 byte
La macchina virtuale ha 2.5 Gb di memoria virtuale e ha Windows 2003 Server 32 bit ; il task manager indica che l’occupazione in ram è di soli 2.1 Gb, e poi anche se superasse i 2.5Gb avrebbe ancora tutto lo swap.
Per farla breve, su windows Oracle non crea più processi come fa su uno Unix bensì fa tutto capo al processo oracle.exe che poi al suo interno avrà svariati thread; di conseguenza tutta la memoria allocata fa capo ad un solo processo che , su Windows 2003 server 32 bit , non può superare i 2 Gb di RAM allocata !!! A questo punto sono stato costretto ad abbassare la SGA_MAX_SIZE affinchè la somma di SGA e PGA non superassero i 2Gb.
Quindi, se già sapete di dover creare un database oracle che avrà bisogno di parecchia ram (più di 2 Gb), secondo me, le soluzioni possibili sono :
- Passare alla versione 64 bit di Windows 2003 Server (ecco le migliorie)
- Usare un sistema operativo Unix/Linux (scelta da me consigliata)
- Se si è obbligati ad usare Windows a 32 bit ma il database può essere diviso,allora si possono creare due istanze sulla stessa macchina così i processi oracle diventano 2 e ognuno di loro potrà allocare 2 Gb.
Pubblicato su Oracle, Windows | Contrassegnato da tag: ora-04030, | 1 Commento »
Pubblicato da teox78 su Novembre 14, 2007
Ho da poco comprato una scheda di rete wireless USB per il mio portatile, una Asus WL-167G
Inserisco la chiavetta nello slot USB e dopo pochi secondi mi accorgo che la mia openSuse 10.3 appena installata riconosce la scheda; dentro di me penso che sia stato fin troppo semplice e infatti……quando cerco di collegarmi usando KNetworkManager la connessione fallisce
iwconfig restituisce delle informazioni valide per l’interfaccia di rete ma se faccio ifconfig mi accorgo che l’interfaccia è giù; quindi provo
ifconfig wlan0 up che mi restituisce il seguente errore :
SIOCSIFFLAGS: No buffer space available
Quindi vado sul sito del costruttore e scarico i driver per linux; tramite yast installo i sorgenti del kernel , seguo le istruzioni presenti nel readme ma quando arrivo al punto di dover compilare ecco un altro errore :
make -C /lib/modules/2.6.22.12-0.1-default/build SUBDIRS=/home/matteo/download/Linux/rt73/RT73_Linux_STA_Drv1.0.3.6/Module modules
make[1]: Entering directory `/usr/src/linux-2.6.22.12-0.1-obj/i386/default’
make -C ../../../linux-2.6.22.12-0.1 O=../linux-2.6.22.12-0.1-obj/i386/default modules
CC [M] /home/matteo/download/Linux/rt73/RT73_Linux_STA_Drv1.0.3.6/Module/rtmp_main.o
/home/matteo/download/Linux/rt73/RT73_Linux_STA_Drv1.0.3.6/Module/rtmp_main.c: In function ‘usb_rtusb_probe’:
/home/matteo/download/Linux/rt73/RT73_Linux_STA_Drv1.0.3.6/Module/rtmp_main.c:2065: error: ‘struct net_device’ has no member named ‘get_wireless_stats’
/home/matteo/download/Linux/rt73/RT73_Linux_STA_Drv1.0.3.6/Module/rtmp_main.c:2085: warning: unused variable ‘device’
make[4]: *** [/home/matteo/download/Linux/rt73/RT73_Linux_STA_Drv1.0.3.6/Module/rtmp_main.o] Error 1
make[3]: *** [_module_/home/matteo/download/Linux/rt73/RT73_Linux_STA_Drv1.0.3.6/Module] Error 2
make[2]: *** [modules] Error 2
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.22.12-0.1-obj/i386/default’
make: *** [all] Error 2
Evidentemente il compilatore non trova il metodo “get_wireless_stats” allora mi metto alla ricerca su google e trovo che questa funzione non è più presente nei sorgenti del kernel ed è stata rimpiazzata da “get_stats”, quindi è sufficiente aprire il file rtmp_main.c , andare alla riga 2065 e sostituire get_wireless_stats con get_stats. A questo punto la compilazione termina con successo e possiamo proseguire con le istruzioni del readme.
Abbiamo finito ?? No, non ancora !!! Di default quando attacco la chiavetta carica anche il modulo standard che non funziona rt73usb, quindi editiamo /etc/modprobe.conf.local e aggiungiamo la seguente riga blacklist rt73usb per evitare che il modulo venga caricato.
Finalmente riesco a collegarmi all’access point !
Pubblicato su Linux, wireless | Contrassegnato da tag: asus, kernel, Linux, rt73, wireless | 1 Commento »
Pubblicato da teox78 su Novembre 12, 2007
E’ da pochi giorni che ho formattato il portatile passando da Gentoo a Opensuse 10.3.
Ripristinando l’ambiente di sviluppo, ho installato Eclipse 3.3 e ,sotto consiglio di un mio collega, ho deciso di installare il plugin Aptana che permette uno sviluppo/debug più agile di applicazioni web.
Dopo aver installato il plugin, eclipse andava in crash,chiudendosi brutalmente, quando cercavo di utilizzare il nuovo plugin. L’errore sul terminale era :
eclipse.bin: xcb_xlib.c:52: xcb_xlib_unlock: Assertion `c->xlib.lock’ failed
Per risolvere il problema ho dovuto :
- impostare la variabile MOZILLA_FIVE_HOME ad una installazione di firefox o mozilla ( nel mio caso /usr/lib/firefox/). Nel mio caso non era impostata, in altri casi potrebbe già esserlo.
- impostare la variabile LIBXCB_ALLOW_SLOPPY_LOCK=1
Per comodità ho creato un piccolo script per lanciare eclipse :
#!/usr/bin/sh
export MOZILLA_FIVE_HOME=/usr/lib/firefox/
export LIBXCB_ALLOW_SLOPPY_LOCK=1
eclipse
Pubblicato su Eclipse, Linux | Contrassegnato da tag: openSuse, Eclipse, Aptana, Linux | 1 Commento »
Pubblicato da teox78 su Novembre 12, 2007
Ciao a tutti,
sono uno sviluppatore di 29 anni che lavora in Italia in una multinazionale che offre servizi.Principalmente ho aperto questo blog per condividere strumenti,pezzi di codice, script e tutto ciò che concerne lo sviluppo.
Altri argomenti che mi piacerebbe trattare sono Linux, auto, cinema, musica e qualche evento particolare della mia vita.
Posso iniziare col dirvi che io e la mia ragazza ci siamo da poco trasferiti in un bel paese fuori Milano (dove prima abitavamo) ; adesso siamo alle prese con le mille cose che bisogna fare quando si trasloca in una casa nuova. In compenso siamo entusiasti del cambiamento perchè ci troviamo benissimo e soprattutto abbiamo trovato due grandi amici!
Dopo questa breve introduzione su di me, passiamo subito a parlare di “developing”…
Pubblicato su personal | Contrassegnato da tag: intro, personal | Non ci sono Commenti »