lunedì 15 febbraio 2010

Xmbeans xml without XSD

I receive from a WebService an XML result. I didn’t have a XSD file for the xml, but by documentation and some try i figured out an XSD for generating Xmlbean bean for processing the result.

The problem is that the XML i received from the WebService didn’t have any reference to the XSD. So the XmlBean Documente generated from the XSD can’t parse the XML.

For resolving this you need to create an XmlOption object and pass it to the parse method.

 

Here an example. The Xsd namespace is http://myxsd.acme.it The root element of the XML is MY_RESPONSE.

XmlOptions options = new XmlOptions();
options.setLoadSubstituteNamespaces(Collections.singletonMap("",
    "http://myxsd.acme.it "));
options.setLoadReplaceDocumentElement(new javax.xml.namespace.QName(
    "http://myxsd.acme.it ", "MY_RESPONSE"));
MYRESPONSEDocument myResponseDocument = MYRESPONSEDocument.Factory
    .parse(xmlString options);

I worked this out  with the help of this mailing list thread: archive.com/user@xmlbeans.apache.org/msg03236.html

 

That’s all folks!

How to bypass Array SSL VPN

What I mean about bypass?  Not hacking the VPN and access machine that you haven’t the right to see, but let the machine with the opened VPN see outside or let the machine outside see the VPN.

This work for me with ArraySSL VPN, started from a web page. I think this can work with other VPN that start from a web page.

Why this how-to exists? Well, sometimes when you open a VPN, you can’t access your local network, but only IP on the VPN you have privilege to see. This didn’t always happen, I think depends the VPN setting that are outside client control.

First hint in this case, if you want to access outside the VPN while connected, is to create a virtual machine (I use Microsoft Virtual PC, not the 2007 version, but you can use whatever you want) and use the VPN inside the VM.

This work flawless, but if you want to access the VPN from outside the VM you can’t.

This can be a problem, for example, if your developer machine must access the webservice that the VPN expose.

I connect to the VPN from a web page. I log in, then an ActiveX is downloaded and the VPN is opened.

But I connect to the web by a proxy. When the VPN is open, the proxy must be accessible by the machine, so this particular machine in reachable. And even the Host machine can see the Virtual Machine.

Bingo.

I can tunnel any connection from the VPN outside the VM, and the host machine can expose to other machine.

Here the step. I assume you have a HOST machine (192.168.0.1). Inside it you have a Virtual Machine or VM (192.168.0.2) and you open the VPN on the VM.

  • Start the VM
  • Download Putty or PuttyPortable
  • Download FreeSSHd
  • Installing FreeSSHd on the HOST machine, enable authentication for somene user (or disable it), and enable the local port forwarding tunneling. You must not force to forward to localhost only.
  • Installing Putty on the HOSTmachine (you can try the portable version, if you don’t want to dirty the host machine)
  • Installing FreeSSHd on the VM machine, enable authentication for someone user (or disable it), and enable the local port forwarding tunneling. You must not force to forward to localhost only.

Now you have the HOST with FreeSSHd running and Putty. On the VM you have FreeSSHd running.

 

  • On the HOST machine, use Putty to make a connection (HttpProxyConnection) to the Host machine (localhost), tunneling the HTTP proxy server on one HOST port (4444 for example). Now the HOST machine can act like a HTTP proxy
  • On the HOST machine, use Putty to make another connection (VpnTunnelingConnection) to the VM  machine (192.0.0.2), tunneling the IP and port you need from the VPN. For every service select a port.
  • On the VM change the proxy to refer the HOST machine. If the HOST machine IP is 192.168.0.1 you use the proxy 192.168.0.1 with the port forwarded before (4444). You must use the IP instead of the Host machine name because when the VPN is on, the VM machine cannot access the WINS/DNS on the original network.
  • Now on the VM connect to the VPN by the web page.

Now on the HOST machine you can access the service behind the VPN (through the port you have chosen). The HOST machine can even expose the service for other machine in the network.

It’s a little hard the first time you try it, but it works great.

I have automated the process to make the two Putty connection on the HOST machine with a little batch file.  The load parameter refer to a saved session in Putty. The hard thing here, is Putty exit with an error if you try to connect while another instance of  Putty is trying to connect. The choice code wait five second (enough on my system, I hope in yours too ;-) before starting the second instance of Putty

 

@ECHO OFF

start  /b /min ..\PuTTYPortable\PuTTYPortable.exe -load "localhost_proxy" -l hostuser -pw hostpwd
ECHO .
ECHO Started localhost proxy
ECHO .
ECHO Waiting 5 seconds
ECHO .
choice /T 5 /C wait /D t  /M "wait 5 seconds" > NUL

start  /b /min ..\PuTTYPortable\PuTTYPortable.exe -load "my_vpn" -l vmuser -pw vmpassword

ECHO Started vpn tunneling
ECHO .
pause

exit

That’s all folks!

domenica 3 gennaio 2010

Without them

From Seth godin Blog
Without them

One of the most common things I hear is, "I'd like to do something remarkable like that, but my xyz won't let me." Where xyz = my boss, my publisher, my partner, my licensor, my franchisor, etc.

Well, you can fail by going along with that and not doing it, or you can do it, cause a ruckus and work things out later.

In my experience, once it's clear you're willing (not just willing, but itching, moving, and yes, implementing) without them, things start to happen. People are rarely willing to step up and stop you, and often just waiting to follow someone crazy enough to actually do something.

I'm going. Come along if you like.

sabato 2 gennaio 2010

Little rule

1. Don’t overthink.
2. Just start.
3. Forget perfection.
4. Don’t mistake motion for action.
5. Focus on the important actions. Clear the distractions. Pick the one most important thing you must do today, and focus on that. Exclusively. When you’re done with that, repeat the process.
6. Move slowly, consciously.
7. Take small steps.
8. Negative thinking gets you nowhere.
9. Meetings aren’t action.
10. Talking (usually) isn’t action.
11. Planning isn’t action.
12. Reading about it isn’t action.
13. Sometimes, inaction is better.


From the minimal blog

martedì 22 settembre 2009

domenica 26 luglio 2009

Deploy java usando i batch file di Windows.

Lavorando su un applicazione, mi è capitata la situazione di dover fare il deploy di un applicazione java su una macchina di test con windows, di cui non abbiamo accesso ftp, ma di cui abbiamo accesso tramite Desktop Remoto(la macchina fra l’altro è raggiungibile solo tramite tunneling sul server Proxy). Per trasferire i file dalla macchina di sviluppo alla macchina di test, si usa un server web sulla macchina Temp  accessibile in ftp dalla macchina di sviluppo,  e in http dalla macchina di test. Per trasferire i file dalla macchina di test a quella di sviluppo si usa il server web dell’applicazione di cui facevamo il deploy, facendo il tunneling della porta http usata .

test

Dalla macchina di test avevamo accesso anche al db Oracle di TEST e di PROD. Le operazioni più frequenti erano l’import e l’export e l’esecuzione di script.

Mi sono ritrovato a dover fare manualmente queste operazioni:

  • Zippare il war della macchina di sviluppo, trasferirlo sulla macchina Proxy. Collegarsi in desktop remoto alla macchina di test, scaricare il war, fermare tomcat, estrarlo sotto la cartella di tomcat e copiare due file specifici per il deploy sulla macchina di test e far ripartire tomcat
  • Fare il dump del db di sviluppo, zipparlo e trasferirlo sulla macchina Proxy. Collegarsi in desktop remoto alla macchina di test, scaricare il dump, estrarlo,  fare la drop di tutti gli oggetti dell’user in cui mettere il dump e importarlo
  • Collegarsi in desktop remoto alla macchina di test, fare il dump del db di TEST o PROD, zipparlo e  metterlo sotto una cartella del web server. Scaricarlo dalla macchina di sviluppo, fare la drop di tutti gli oggetti dell’user in cui mettere il dump e importarlo.

Senza contare ovviamente l’uso del tunneling con putty (ma quello è quasi sempre attivo per altri motivi)

Tutte operazioni abbastanza lunghe, dato che il war e il dump da zippare occupano parecchi minuti e il tempo di download e di upload occupavano altrettanto. Inoltre alcune operazioni erano soggette a errore (se faccio l’export nel db di PROD invece che di TEST? se prendo il dump sbagliato? se mi dimentico di copiare i file specifici di tomcat per l’ambiente?).

Quindi ho deciso di automatizzare questo tipo di operazioni, per semplificare il deploy, e si è rivelata una scelta vincente. Potevo scegliere fra usare ant (o ancora meglio GANT, la versione Groovizzata di ANT), ma ho deciso di addentrarmi nel magico e incantato mondo dei BATCH SCRIPT di WINDOWS!!!

 

Per l’accesso al db ho usato sqlplus e i comandi exp e imp messo a disposizione dall’Oracle Client.

Per il download http ho usato wget, un programma linux che qualche santo uomo ha portato su Windows (non ho trovato alternative windows-like).

Per la compressione ho usato 7Zip, che ha un eseguibile da riga di comando, e offriva una compressione migliore (anche se un po’ più lente) del dump.

Per l’sftp ho usato winscp , che permette di definire degli script per l’upload e il download di file (a me nel caso serviva solo l’upload) .

 

Questa è la struttura delle directory:

  • deploy (andrà a contenere i file temporanei, dump, compressi, etc.)
  • deploy/batch (contiene i file batch)
  • deploy/batch/7zip (contiene l'eseguibile 7za.exe)
  • deploy/batch/sql (contiene gli script sql)
  • deploy/batch/wget (contiene l'eseguibile di wget e le sue librerie)
  • deploy/batch/winscp (contiene l'eseguibile di winscp)
  • deploy/batch/winscp_script (contiene gli script ftp per winscp)
  • deploy/batch/file_war(contiene i file da sostituire nella web-app dopo il deploy)

Gli script sql sono:

  • add_grant_dba.sql (serve per ripristinare le grant dba)
  • remove_grant_dba.sql (serve per rimuovere le grant dba, dato che l’user sul db di TEST e PROD non ha la grant dba
  • statistiche.sql (serve per far far girare l’analyze table su tutte le tabelle dell’user dopo l’import)
declare
Cursor cTables is
select *
from user_tables;

begin
For rTable in cTables Loop
dbms_output.put_line ('analyze table ' || rTable.table_name);
execute immediate 'analyze table ' || rTable.table_name || ' compute statistics';
End Loop;
end;
/
exit;



  • DropUserObjects.sql (serve per fare la drop degli obje ct dell’user prima dell’import)



declare
Cursor cConstraints is
Select *
from user_constraints
where constraint_type = 'R';

Cursor cObjects is
Select *
From user_objects
Where object_type not in ('PACKAGE BODY', 'INDEX', 'LOB');


procedure dropConstraints is
begin
For rConstraints in cConstraints loop
begin
execute immediate
'alter table ' || rConstraints.table_name || ' drop constraint ' || rConstraints.constraint_name
;
exception
When Others Then
dbms_output.put_line(
'alter table '
|| rConstraints.table_name
|| ' drop constraint '
|| rConstraints.constraint_name);
end;
End loop;
end;

procedure dropObjects is
begin
For rObjects in cObjects loop
begin
execute immediate 'drop ' || rObjects.object_type || ' ' || rObjects.object_name;
exception
When Others Then
dbms_output.put_line(
'Errore drop ' || rObjects.object_type || ' ' || rObjects.object_name
);
end;
End loop;
end;

begin
dropConstraints;
dropObjects;
end;

/
exit;


Ecco un esempio di script sftp



# per rispondere negativamente in automatico a tutte le richieste(e non bloccare il batch)
option batch on

# Disable overwrite confirmations that conflict with the previous
option confirm off

# Connessione al db. Senza l'hostkey vi chiederà se accettare l'hostkey, e dato il comando option batch on la risposta sarà no e non vi collegherete. Ricordarsi di mettere l'hostkey tra "". L’hostkey si può ricavare collegandosi con winscp(da interfaccia grafica) e cercare nelle informazioni di sessione
open sftp://user:password@example.com:22 -hostkey="ssh-rsa 1024 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"

# Posizionarsi sulla cartella voluta
cd /web/download

# Remove il file
rm dbDump.7z

# Forzare il trasferimento binario
option transfer binary

# Fare l'upload del file
put ..\dbDump.7z

# Disconnettersi
close

# Uscire da winscp. Se si vuole che lo script batch si blocchi a questo punto, commentare questa riga per far bloccare lo script
exit


Ed ecco qualche esempio di file batch sulla macchina di sviluppo:



upload_war.bat



::@echo off
del ..\war.7z

7zip\7za.exe a -t7z ../war.7z "C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\myWebApp\"

winscp\winscp418.exe /console /script=winscp_script/upload_war.txt

ECHO


upload_db.bat



::@echo off
sqlplus -S user_dba/user_dba_pwd@db @sql\add_grant_dba.sql
sqlplus -S user/user_pwd@db @sql\remove_grant_dba.sql

exp user/user_pwd@db file=../dbDump

sqlplus -S user_dba/user_dba_pwd@db @sql\add_grant_dba.sql

del ..\dbDump.7z

7zip\7za a -t7z ../dbDump.7z "../dbDump.DMP"
winscp\winscp418.exe /console /script="winscpscript/upload_dump_db.txt"


import_db.bat



wget\wget.exe -r -O..\dbDumpTest.7z http://localhost:8090/myApp/download/dbDumpTest.7z

7zip\7za.exe e -y ../dbDumpTest.7z -o../

sqlplus -S user/user_pwd@db @sql\DropUserObjects.sql
imp user/user_pwd@dbfile=../dbDumpTest fromuser=user touser=user
sqlplus -S user/user_pwd@db @sql\statistiche.sql

echo a


 



Ed ecco qualche esempio di file batch sulla macchina di test:



replace_war.bat



del ..\myApp.7z
wget\wget.exe -r -O..\myApp.7z http://proxy/myApp.7z
net stop Tomcat5

rd /S /Q "C:\Programmi\Apache Software Foundation\Tomcat 5.0\webapps\myApp_old"
rd /S /Q "C:\Programmi\Apache Software Foundation\Tomcat 5.0\work\Catalina\localhost\myApp"
ren "C:\Programmi\Apache Software Foundation\Tomcat 5.0\webapps\myApp" myApp_old

7zip\7za.exe x -y ../myApp.7z -o"C:\Programmi\Apache Software Foundation\Tomcat 5.0\webapps"
copy /Y file_war\config.xml "C:\Programmi\Apache Software Foundation\Tomcat 5.0\webapps\myApp\WEB-INF\conf\"
copy /Y file_war\log4j.properties "C:\Programmi\Apache Software Foundation\Tomcat 5.0\webapps\myApp\WEB-INF\classes"

net start Tomcat5
echo


export_db_test.bat



exp user/user_pwd@db file=../dbTest CONSISTENT=Y

del ..\dbTest.7z

7zip\7za a -t7z ../dbTest.7z "../dbTest.DMP"

md "C:\Programmi\Apache Software Foundation\Tomcat 5.0\webapps\myApp\download\"
copy /Y ..\sismiDbaProd.7z "C:\Programmi\Apache Software Foundation\Tomcat 5.0\webapps\dbTest\download\"


 





Le operazioni fondamentali sono descritte in questa guida, sta poi allo sviluppatore combinarle per i propri scopi.



E’ qualche mese oramai che uso questi script e si sono rivelati molto utili, mi hanno fatto risparmiare moltissimo tempo ed errori. Script che automatizzano questo tipo di procedure sono fondamentali in un moderno metodo di lavoro. Per la parte java l’ottimo sarebbe avere un server di continous integration con deploy automatico sulla macchina di test (e manuale su prod o altri ambienti). In questo caso sarebbe stato complicato causa il non accesso diretto alla macchina, ma con un meccanismo di polling e timestamp penso si possa fare senza problemi.



thebol

LiveWriter con spell checker in Italiano

Ecco il link con la spiegazione.

theb0l