<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4468158452018787386</id><updated>2024-09-06T19:39:41.761-07:00</updated><category term="Java"/><category term="Web services"/><category term="BPEL"/><category term="C++"/><category term="Curiosità"/><category term="Iteratori"/><category term="Liste"/><category term="SOAP"/><category term="Tecnologia"/><category term="WSDL"/><category term="Android"/><category term="Apache ODE"/><category term="Axis"/><category term="Bash"/><category term="CPU"/><category term="Concept"/><category term="Cotton Candy"/><category term="DBMS"/><category term="File Handler"/><category term="Hardware"/><category term="Intalio"/><category term="Intel"/><category term="Iterator"/><category term="List"/><category term="MTOM"/><category term="NoSQL"/><category term="Request Asincrone"/><category term="SOA"/><category term="STL"/><category term="Smart Pen"/><category term="Sort"/><category term="Tomcat"/><category term="Trim"/><category term="Virtuoso"/><category term="XML"/><category term="scripting"/><category term="stringhe"/><category term="unix"/><title type='text'>A Programmer Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-4701266081537992800</id><published>2012-12-18T13:44:00.000-08:00</published><updated>2012-12-18T13:44:22.170-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bash"/><category scheme="http://www.blogger.com/atom/ns#" term="scripting"/><category scheme="http://www.blogger.com/atom/ns#" term="stringhe"/><category scheme="http://www.blogger.com/atom/ns#" term="Trim"/><category scheme="http://www.blogger.com/atom/ns#" term="unix"/><title type='text'>Bash shell: trim di una stringa</title><content type='html'>Salve,&lt;br /&gt;
torno a scrivere qualcosina dopo mesi di inattività.. :)&lt;br /&gt;
Non ho scritto più nulla sia perchè non ho avuto granchè da scrivere..sia (e soprattutto) per mancanza di voglia :P&lt;br /&gt;
&lt;br /&gt;
Beh, mi sono trovato a dover estrapolare una parola dall&#39;output di un programma in bash.&lt;br /&gt;
La parola che mi serviva appariva sempre alla prima linea, quindi con &lt;i&gt;head&lt;/i&gt;&amp;nbsp;non ho avuto nessun problema.&lt;br /&gt;
Il problema è stato pulire la stringa risultante. Inizialmente credevo che non ci fosse nulla di più semplice, dopotutto dovevo &lt;i&gt;solo&lt;/i&gt;&amp;nbsp;fare un trim.&lt;br /&gt;
&lt;br /&gt;
Trovare la soluzione non è stato così difficile, basta usare il comando &lt;a href=&quot;http://ss64.com/bash/sed.html&quot; target=&quot;_blank&quot;&gt;&lt;i&gt;sed&lt;/i&gt;&amp;nbsp;&lt;/a&gt;(che ho scoperto in questa occasione)&amp;nbsp;con un&#39;espressione regolare, ma mi aspettavo qualcosa di molto più diretto :)&lt;br /&gt;
&lt;br /&gt;
Per eseguire il trim di una stringa c&#39;è bisogno di utilizzare &lt;i&gt;sed&lt;/i&gt;&amp;nbsp;sia per pulire l&#39;inizio che la fine di essa.&lt;br /&gt;
Per pulire la parte iniziale il comando da utilizzare è questo:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); overflow: auto; padding: 5px; width: 653px;&quot;&gt;$ &lt;span style=&quot;background-color: transparent; color: #333333; line-height: 16.799999237060547px; text-align: justify;&quot;&gt;sed &#39;s/^ *//g&#39;&lt;/span&gt;&lt;/pre&gt;
&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;
Mentre per pulire la coda della stringa:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); overflow: auto; padding: 5px; text-align: justify; width: 653px;&quot;&gt;$&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;line-height: 16.78333282470703px;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #333333; line-height: 16.799999237060547px;&quot;&gt;sed &#39;s/ *$//g&#39;&lt;/span&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: transparent; color: #333333; line-height: 16.799999237060547px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
I comandi devono essere chiamati successivamente in pipe, per esempio in questo modo:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); overflow: auto; padding: 5px; text-align: justify; width: 653px;&quot;&gt;&lt;pre style=&quot;color: #333333; line-height: 16.799999237060547px; padding-left: 30px;&quot;&gt;$ echo &quot;&amp;nbsp; aaaa&amp;nbsp;&amp;nbsp; bbbb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot; | sed &#39;s/^ *//g&#39; | sed &#39;s/ *$//g&#39;
aaaa&amp;nbsp;&amp;nbsp; bbbb&lt;/pre&gt;
&lt;/pre&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: transparent; color: #333333; line-height: 16.799999237060547px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
E così si conclude questo post, pieno di chiacchiere per dire una cosa semplicissima :)&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/4701266081537992800/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/12/bash-shell-trim-di-una-stringa.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/4701266081537992800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/4701266081537992800'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/12/bash-shell-trim-di-una-stringa.html' title='Bash shell: trim di una stringa'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-4915441162170745617</id><published>2012-06-29T13:08:00.001-07:00</published><updated>2012-06-29T13:08:41.086-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Concept"/><category scheme="http://www.blogger.com/atom/ns#" term="Curiosità"/><category scheme="http://www.blogger.com/atom/ns#" term="Tecnologia"/><title type='text'>Bento Book Laptop</title><content type='html'>Salve di nuovo :)&lt;br /&gt;
&lt;br /&gt;
In questo post non voglio scrivere niente di impegnativo, mi va di perdere un po di tempo e allora parlo di una cosa molto figa che ho visto recentemente :D&lt;br /&gt;
&lt;br /&gt;
Parlo del Bento Book Laptop!&lt;br /&gt;
Eccolo...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-LNwO_Edv57M/T-4EPWBGIMI/AAAAAAAABtU/poPBfGkaJfQ/s1600/bento_book.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;http://4.bp.blogspot.com/-LNwO_Edv57M/T-4EPWBGIMI/AAAAAAAABtU/poPBfGkaJfQ/s640/bento_book.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Non è forte?? :D&lt;br /&gt;
&lt;br /&gt;
Il nome, Bento, è ispirato dal &quot;Bento box&quot;, il classico cestino da pranzo giapponese, solitamente riempito con dell&#39;ottimo sushi :P&lt;br /&gt;
Ma cambiamo discorso altrimenti mi viene fame :)&lt;br /&gt;
&lt;br /&gt;
Cosa sarebbe questo apparecchio?&lt;br /&gt;
Un laptop?&lt;br /&gt;
Un tablet?&lt;br /&gt;
Un cellulare?&lt;br /&gt;
Tutto.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://2.bp.blogspot.com/-WbYiwHcBCN8/T-4FbIdIDFI/AAAAAAAABtc/cw6l7EwUSNg/s1600/bento_book2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;http://2.bp.blogspot.com/-WbYiwHcBCN8/T-4FbIdIDFI/AAAAAAAABtc/cw6l7EwUSNg/s640/bento_book2.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Dalla foto si vede:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Il monitor grande è quello di un laptop&lt;/li&gt;
&lt;li&gt;quello nello spazio sottostante è un tablet&lt;/li&gt;
&lt;li&gt;nello spazio piccolino centrale va posizionato un cellulare&lt;/li&gt;
&lt;li&gt;in quello a destra un HD SSD da i Tera&lt;/li&gt;
&lt;li&gt;infine in quello a sinistra un pannellino solare che alimenta una batteria al litio&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Non si sa l&#39;hardware dei vari dispositivi quanto sarà potente, perché anche se è tutto molto bello, è solo un concept. :)&lt;/div&gt;
&lt;div&gt;
Un aggeggio del genere potrebbe essere anche scomodo..per esempio usare un tablet come tastiera touch non è il massimo..e chissà usare il telefono come trackpad..per non parlare del dover appoggiare la mano sull&#39;HD che riscalda, ottimo in inverno ma un po meno in estate :P&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Nonostante sia un concept, però, non sembra irrealizzabile.&lt;/div&gt;
&lt;div&gt;
A mio parere l&#39;elemento più &quot;concept&quot; del Bento Book è la batteria al litio che dovrebbe alimentare tutto questo ambaradam.&lt;/div&gt;
&lt;div&gt;
Un display da 15,4 pollici, un altro di 11, un altro da 4..tutti touch..senza contare l&#39;hardware dentro! (se fosse mai costruito di certo da un aggeggio simile mi aspetto delle prestazioni più che ottime :) )&lt;/div&gt;
&lt;div&gt;
A questo ci si aggiunge il consumo dell&#39;HD.&lt;/div&gt;
&lt;div&gt;
Inoltre il pannellino solare, che sta in una mano, dovrebbe essere tanto efficiente da riuscire a ricaricare a sufficienza la batteria!&lt;/div&gt;
&lt;div&gt;
Beh..forse la batteria invece che al litio dovrebbe essere al plutonio.. il pannellino non so :D&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Però, nonostante questo l&#39;idea è veramente bella!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Non oso immaginare il costo che potrebbe avere un laptop (?) del genere!&lt;/div&gt;
&lt;div&gt;
Anzi, oso :P&lt;/div&gt;
&lt;div&gt;
Parliamo di 3 periferiche con display OLED, touch, il più grande addirittura da 15,4&#39;&#39;!&lt;/div&gt;
&lt;div&gt;
Il laptop da solo, che più di un laptop sembra un tablet particolarmente grande, avrebbe un costo di almeno 1000 euro a mio parere.&lt;/div&gt;
&lt;div&gt;
Il tablet, voglio essere buono, ma almeno 400 € dovrà pur costare..&lt;/div&gt;
&lt;div&gt;
Il telefono, e voglio essere ancora buono, almeno 200€ li costa.&lt;/div&gt;
&lt;div&gt;
Il disco, un SSD da ben 1 Tera..beh, io ne ho visto uno da 750 Giga a più di 2300€, voglio essere ancora buono, quello da 1 Tera ne costa solo 2500 :)&lt;/div&gt;
&lt;div&gt;
Siamo già arrivati a 4100€ non male :)&lt;/div&gt;
&lt;div&gt;
A questo ci si aggiungerebbe il costo della super batteria..e dell&#39;idea originale!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Chissà..magari tra qualche anno i prezzi di queste tecnologie saranno così bassi da poter permettere davvero l&#39;ingresso nel mercato di qualcosa del genere :)&lt;/div&gt;
&lt;div&gt;
Magari non accadrà mai, ma sarebbe forte :D&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ok..dopo queste belle chiacchiere (non mi ero accorto di aver scritto così tanto!) vi saluto!&lt;/div&gt;
&lt;div&gt;
Prima di chiudere il post, però, vi lascio con il resto delle foto che ho trovato..&lt;/div&gt;
&lt;div&gt;
Godetevele! :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://3.bp.blogspot.com/-ZGJtm6t0Wj4/T-4K6v_QK7I/AAAAAAAABto/i46IBzs3IfE/s1600/050611_rg_BentoBook_03.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;http://3.bp.blogspot.com/-ZGJtm6t0Wj4/T-4K6v_QK7I/AAAAAAAABto/i46IBzs3IfE/s640/050611_rg_BentoBook_03.jpg&quot; width=&quot;494&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-giRbz2Bxim4/T-4K9DGV1II/AAAAAAAABtw/A74G_Byn_ow/s1600/050611_rg_BentoBook_04.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;http://4.bp.blogspot.com/-giRbz2Bxim4/T-4K9DGV1II/AAAAAAAABtw/A74G_Byn_ow/s640/050611_rg_BentoBook_04.jpg&quot; width=&quot;488&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/4915441162170745617/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/bento-book-laptop.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/4915441162170745617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/4915441162170745617'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/bento-book-laptop.html' title='Bento Book Laptop'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-LNwO_Edv57M/T-4EPWBGIMI/AAAAAAAABtU/poPBfGkaJfQ/s72-c/bento_book.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-7778300215085257440</id><published>2012-06-27T14:16:00.001-07:00</published><updated>2012-06-27T14:16:49.236-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Iteratori"/><category scheme="http://www.blogger.com/atom/ns#" term="Liste"/><category scheme="http://www.blogger.com/atom/ns#" term="Sort"/><category scheme="http://www.blogger.com/atom/ns#" term="STL"/><title type='text'>C++ e STL: ordinare una lista</title><content type='html'>Salve di nuovo.. :)&lt;br /&gt;
&lt;br /&gt;
Visto che è da un bel po che non scrivo mezza riga di codice C++ voglio scrivere un post e cogliere l&#39;occasione di scrivere qualcosina, seppur semplice.&lt;br /&gt;
Avevo intenzione di scrivere un semplice programmino per ordinare una lista utilizzando il metodo sort().&lt;br /&gt;
&lt;br /&gt;
Innanzitutto la lista è un container di elementi, infatti è implementata nella STL (Standard Template Library) come template. E&#39; implementata come una lista &lt;i&gt;doppiamente linkata&lt;/i&gt;, ovvero ogni nodo è collegato al successivo ed al precedente, inoltre ci sono 2 nodi speciali, &lt;i&gt;head&lt;/i&gt;&amp;nbsp;e &lt;i&gt;tail, &lt;/i&gt;o &lt;i&gt;header&lt;/i&gt;&amp;nbsp;e &lt;i&gt;trailer&lt;/i&gt;, che rappresentano l&#39;inizio (elemento precedente al primo) e la fine (elemento successivo all&#39;ultimo) della lista.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-KOpkFahVab4/T-jTZ56q54I/AAAAAAAABtI/_2LibZn9WH8/s1600/Header_Trailer.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;124&quot; src=&quot;http://4.bp.blogspot.com/-KOpkFahVab4/T-jTZ56q54I/AAAAAAAABtI/_2LibZn9WH8/s640/Header_Trailer.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ok. dopo questa bella immagine passiamo al codice.&lt;br /&gt;
Innanzitutto cosa voglio fare: voglio creare una lista di interi ed ordinarla usando il metodo &lt;i&gt;sort()&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); overflow: auto; padding: 5px; width: 653px;&quot;&gt;#include &amp;lt;iostream&amp;gt;;
#include &amp;lt;list&amp;gt;;

using namespace std;


bool intComparator(int a, int b) {
 return a &amp;lt;= b;
}


int main() {

 list&amp;lt;int&amp;gt; intList;

 intList.push_front(2);
 intList.push_front(5);
 intList.push_front(7);

 list&amp;lt;int&amp;gt;::iterator intIT;
 cout &amp;lt;&amp;lt; &quot;Original int list: \n&quot;;
 for(intIT = intList.begin(); (intIT != intList.end()); ++intIT)
  cout &amp;lt;&amp;lt; *intIT &amp;lt;&amp;lt; &quot; &quot;;
 cout &amp;lt;&amp;lt; endl;

 intList.sort(intComparator);
 cout &amp;lt;&amp;lt; &quot;Ordered int list: &quot;;
 for(intIT = intList.begin(); (intIT != intList.end()); ++intIT)
   cout &amp;lt;&amp;lt; *intIT &amp;lt;&amp;lt; &quot; &quot;;
 cout &amp;lt;&amp;lt; endl;

 return 0;
}&lt;/pre&gt;
&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;&lt;br /&gt;
&lt;div&gt;
Allora, dopo i classici include, per prima cosa mi dichiaro il mio comparatore. Il comparatore può essere qualsiasi funzione che prende 2 parametri dello stesso tipo e restituisce &lt;b&gt;true&lt;/b&gt;&amp;nbsp;se nell&#39;ordinamento il primo elemento viene &lt;i&gt;prima&lt;/i&gt;&amp;nbsp;del secondo elemento, &lt;b&gt;false&lt;/b&gt;&amp;nbsp;altrimenti.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Subito dopo comincia il main. Dichiaro una lista &lt;i&gt;intList&lt;/i&gt;&amp;nbsp;che farà da container di elementi di tipo intero.&lt;/div&gt;
&lt;div&gt;
Successivamente la riempio con un po&#39; di numeri, li inserisco da &quot;davanti&quot; con &lt;i&gt;push_front()&lt;/i&gt;&amp;nbsp;che inserisce un elemento alla prima posizione della lista, quindi immediatamente dopo l&#39;header. La sequenza ottenuta è quindi [7, 5, 2].&lt;/div&gt;
&lt;div&gt;
Fatto ciò stampo a video la lista disordinata. Dichiaro un iteratore &lt;i&gt;intIT&lt;/i&gt;, che sarà quindi un container per degli elementi di una lista che contiene interi, dunque, sarà a sua volta un container per elementi di tipo intero.&lt;/div&gt;
&lt;div&gt;
L&#39;iteratore viene inizializzato nel for con &lt;i&gt;intList.begin()&lt;/i&gt;&amp;nbsp;che restituisce il puntatore all&#39;&lt;i&gt;header&lt;/i&gt;.&lt;/div&gt;
&lt;div&gt;
Questo, quindi, deve essere incrementato per puntare al primo elemento, ed è la prima cosa che viene fatta nel for.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Dopo di che non viene fatto altro che la stampa a video dell&#39;elemento corrente. L&#39;iteratore è un puntatore all&#39;elemento corrente, quindi, per essere usato, va deferenziato.&lt;/div&gt;
&lt;div&gt;
Il ciclo finisce quando l&#39;iteratore arriva a &lt;i&gt;intList.end()&lt;/i&gt;&amp;nbsp;che corrisponde al &lt;i&gt;trailer&lt;/i&gt;&amp;nbsp;della stessa.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Subito dopo il for avviene l&#39;ordinamento della lista. Il metodo può essere richiamato anche senza parametri, in tal caso viene utilizzato la relazione &quot;&amp;lt;&quot; per il confronto.&lt;/div&gt;
&lt;div&gt;
Il metodo però accetta anche un argomento. Questo è il puntatore alla funzione comparatore scritta, identificato dal nome della funzione ovviamente, in questo caso &lt;i&gt;intComparator&lt;/i&gt;.&lt;/div&gt;
&lt;div&gt;
In questo modo per eseguire il confronto tra gli elementi verrà utilizzata la funzione specificata.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Il programma si chiude stampando di nuovo la lista a video, stavolta ordinata :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ok, questo è un post molto &quot;tranquillo&quot; :)&lt;/div&gt;
&lt;div&gt;
Ma ho intenzione di utilizzarlo come trampolino di lancio per capire un paio di cose e condividerle.&lt;/div&gt;
&lt;div&gt;
Per esempio: se eseguo l&#39;overload della funzione &lt;i&gt;intComparator&lt;/i&gt;, come faccio a passare alla funzione il puntatore &quot;esatto&quot; della funzione che voglio eseguire? Viene deciso a runtime?&lt;/div&gt;
&lt;div&gt;
Inoltre voglio vedere anche come posso passargli un comparatore implementato in un&#39;altra classe.&lt;/div&gt;
&lt;div&gt;
Vediamo che ne esce fuori.. :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Al prossimo post!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/7778300215085257440/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/c-e-stl-ordinare-una-lista.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/7778300215085257440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/7778300215085257440'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/c-e-stl-ordinare-una-lista.html' title='C++ e STL: ordinare una lista'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-KOpkFahVab4/T-jTZ56q54I/AAAAAAAABtI/_2LibZn9WH8/s72-c/Header_Trailer.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-7441906779699410386</id><published>2012-06-22T13:40:00.000-07:00</published><updated>2012-06-22T13:40:04.617-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache ODE"/><category scheme="http://www.blogger.com/atom/ns#" term="BPEL"/><category scheme="http://www.blogger.com/atom/ns#" term="Intalio"/><category scheme="http://www.blogger.com/atom/ns#" term="SOA"/><category scheme="http://www.blogger.com/atom/ns#" term="SOAP"/><category scheme="http://www.blogger.com/atom/ns#" term="Virtuoso"/><category scheme="http://www.blogger.com/atom/ns#" term="Web services"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><title type='text'>BPEL e l&#39;orchestrazione di servizi</title><content type='html'>Salve di nuovo :)&lt;br /&gt;
&lt;br /&gt;
In questo post volevo parlare di un argomento che mi sta facendo penare non poco ultimamente :P&lt;br /&gt;
Intendo parlare di &lt;a href=&quot;http://it.wikipedia.org/wiki/BPEL&quot; target=&quot;_blank&quot;&gt;BPEL&lt;/a&gt;&amp;nbsp;(Business Process Execution Language).&lt;br /&gt;
E&#39; un linguaggio basato su file XML e la struttura del file non serve solo a descrivere i processi di business ma anche per eseguirli, quindi può essere considerato come un linguaggio di programmazione.&lt;br /&gt;
&lt;br /&gt;
Può essere visto come un linguaggio interpretato e gli interpreti sono i &lt;i&gt;motori BPEL.&lt;/i&gt;&amp;nbsp;Questi motori non funzionano come un&#39;interprete per un classico linguaggio di programmazione come potrebbe essere l&#39;interprete Perl, ma piuttosto funzionano come dei container per processi di business.&lt;br /&gt;
Infatti per essere eseguito, un processo BPEL deve essere &quot;deployato&quot; su un motore, che ne controlla la validità e, se conforme alla specifica, lo rende &quot;eseguibile&quot; dai consumer.&lt;br /&gt;
Uso il termine &quot;consumer&quot; perchè BPEL è pensato principalmente per essere utilizzato in architetture &lt;a href=&quot;http://it.wikipedia.org/wiki/Service-oriented_architecture&quot; target=&quot;_blank&quot;&gt;SOA&lt;/a&gt; (Service Oriented Architecture) ed in esse l&#39;utilizzatore di un servizio è chiamato consumer, che in linea di massima può essere considerato il client.&lt;br /&gt;
Personalmente ho fatto alcune prove utilizzando il motore &lt;a href=&quot;http://ode.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache ODE&lt;/a&gt; (Orchestration Director Engine), il motore messo a disposizione da &lt;a href=&quot;http://bpms.intalio.com/&quot; target=&quot;_blank&quot;&gt;Intalio BPMS&lt;/a&gt;&amp;nbsp;(Business Process Management System) ed il motore installabile in &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; target=&quot;_blank&quot;&gt;Virtuoso Universal Server&lt;/a&gt;&amp;nbsp;tramite un&#39;estensione.&lt;br /&gt;
&lt;br /&gt;
BPEL è utilizzato in architetture Service-Oriented perché fondamentalmente un processo è visto come un servizio, o meglio, una volta fatto il deploy di un processo su un motore questo viene esposto verso l&#39;esterno proprio come un web service che espone le proprie informazioni tramite WSDL.&lt;br /&gt;
Il processo, quindi, è un servizio a tutti gli effetti. Ai client che effettuano richieste il fatto che &quot;dietro&quot; la loro richiesta si nasconde un motore BPEL che esegue processi di business è assolutamente trasparente, essi vedono un servizio e nient&#39;altro.&lt;br /&gt;
&lt;br /&gt;
Cosa ha di diverso un processo BPEL, quindi, rispetto ad un normale web service?&lt;br /&gt;
BPEL può essere visto come uno strumento per offrire un servizio che scaturisce dalla composizione di altri servizi. In un&#39;architettura SOA si parla di &lt;i&gt;orchestrazione&lt;/i&gt;&amp;nbsp;di servizi. Un processo BPEL quindi non espone operazioni semplici. Esso non fa altro che richiamare altri servizi per raggiungere un determinato scopo. Ad esempio può richiamare in sequenza diversi servizi utilizzando l&#39;output del precedente come input del successivo, richiamare ciclicamente dei servizi ed eseguire anche parallelamente richieste a servizi diversi.&lt;br /&gt;
Alla fine del suo lavoro può ovviamente restituire un risultato al consumer oppure un fault. Possono essere eseguite sia richieste sincrone che asincrone. Insomma, è un web service :)&lt;br /&gt;
&lt;br /&gt;
E&#39; una cosa utile? comoda?&lt;br /&gt;
Potenzialmente si, praticamente ho i miei dubbi..&lt;br /&gt;
&lt;br /&gt;
Come ogni cosa, ci sono dei pro e dei contro.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pro:&lt;/b&gt;&lt;br /&gt;
L&#39;unico che personalmente abbia trovato è che essendo un linguaggio XML-based, la sua struttura è ben definita, è facile eseguirne il parsing e la validazione. Questo ha reso possibile lo sviluppo di tool molto comodi per lo sviluppo di processi. Editor grafici che permettono di fare il design con il classico drag-and-drop.&lt;br /&gt;
Personalmente ho provato ad utilizzare il plugin per Eclipse &lt;a href=&quot;http://www.eclipse.org/bpel/&quot; target=&quot;_blank&quot;&gt;BPEL Designer&lt;/a&gt;&amp;nbsp;ed Intalio BPMS. Quest&#39;ultimo non è proprio un designer BPEL. E&#39; un designer per processi di business, ma modellati tramite &lt;a href=&quot;http://www.bpmn.org/&quot; target=&quot;_blank&quot;&gt;BMPN&lt;/a&gt; (Business Process Model and Notation) che, a differenza di BPEL, è stato progettato solo per &lt;i&gt;modellare&lt;/i&gt;&amp;nbsp;i processi di business. Intalio comunque dal modello BPMN genera un file BPEL che può essere installato in qualsiasi motore. Ne esistono diversi altri, sia opensource che con licenze commerciali, ma non li ho mai utilizzati.&lt;br /&gt;
Devo dire che soprattutto Intalio è veramente comodo per modellare i processi, anche BPEL Designer lo è, ma richiede una conoscenza maggiore di BPEL per essere utilizzato.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Contro:&lt;/b&gt;&lt;br /&gt;
Purtroppo i contro (sempre riguardo la mia esperienza) sono molti di più dei pro.&lt;br /&gt;
Innanzitutto, come succede in molti editor grafici che cercano di fare ogni cosa dall&#39;interfaccia senza eseguire nessun intervento sul codice, si perde ogni controllo su cosa succede &quot;sotto&quot; il designer. Questo problema l&#39;ho riscontrato soprattutto con Intalio in quanto il loro framework è stato progettato per avere quello che viene chiamato &lt;i&gt;zero-code development&lt;/i&gt;.&lt;br /&gt;
Effettivamente lo scopo è raggiunto, infatti anche volendo non c&#39;è la minima possibilità di modificare a mano il codice dei processi. L&#39;unico modo sarebbe prendere il file BPEL generato e modificarlo con un altro editor.&lt;br /&gt;
Con BPEL Designer, invece, la cosa non è così grave. Nonostante tramite l&#39;editor grafico si possa fare praticamente tutto, è possibile modificare direttamente il codice sorgente del processo. Il problema è che non sempre l&#39;interfaccia grafica &quot;si accorge&quot; delle modifiche fatte a mano.&lt;br /&gt;
&lt;br /&gt;
Un altro problema, che personalmente trovo molto grave, è che siccome c&#39;è un motore che legge il file XML ed in base al suo contenuto esegue delle azioni, è impossibile eseguire il debug di un processo. I tool grafici possono dire se ci sono errori di validazione. A volte si riesce ad eseguire il deploy di processi che non passano la validazione, ma non sempre è così. Questo non è un grosso problema, perché ad esempio ODE al momento del deploy se c&#39;è qualcosa che non va da degli errori di compilazione, indicando dov&#39;è il problema. I messaggi di errore a volte sono chiari, altre volte sono di difficile comprensione, ma almeno da qualche errore subito. Il problema nasce quando ci sono problemi nella logica, come qualche conversione dei dati, qualche assegnamento errato (si, un &lt;i&gt;semplice&lt;/i&gt;&amp;nbsp;assegnamento può essere qualcosa di molto poco semplice in BPEL), una condizione di uscita di un ciclo che non si verifica ecc..&lt;br /&gt;
E&#39; comprensibile che non sia possibile eseguire un vero e proprio debug di un processo, ma il problema è che non si riesce ad avere nessun controllo sul processo installato. Quindi niente log personalizzati, niente messaggi ecc. Anche restituire un fault in base ad una condizione non è una cosa così semplice, ma li è colpa mia che non mi sono visto bene l&#39;argomento :)&lt;br /&gt;
Quindi, per il capire cosa c&#39;è che non va in un processo ci si deve basare sui messaggi di fault e sui log del motore. Ancora una volta, non sempre questi sono immediatamente comprensibili. Nella mia (breve) esperienza ogni volta che c&#39;era qualcosa che non andava dovevo fare diverse ricerche per capire il significato dei messaggi di errore.&lt;br /&gt;
&lt;br /&gt;
Ancora un altro problema: BPEL mal si adatta ai cambiamenti.&lt;br /&gt;
Infatti su diversi post, non necessariamente scritti da detrattori di BPEL (addirittura su un blog di un tipo che dava dei consigli ai neofiti), ho letto che quando c&#39;è da fare qualche cambiamento o c&#39;è qualcosa che non va in un processo, la cosa migliore è rimodellarlo daccapo. O_O&lt;br /&gt;
Ok, è una cosa che posso anche accettare se sto modellando un processo di Hello World, ma che succede se devo modificare un processo che magari richiama 10 servizi in parallelo, per ognuno gestisce i fault ed in base ad i risultati ricevuti decide se e quali altri servizi chiamare?&lt;br /&gt;
&lt;br /&gt;
Ancora. Gli errori di validazione.&lt;br /&gt;
Non so voi, ma in generale ogni volta che c&#39;è un errore di validazione in un file XML è un mal di testa.&lt;br /&gt;
Quando ci sono errori di validazione in file BPEL, o WSDL è ancora peggio.&lt;br /&gt;
Si, a volte si devono modificare anche i file WSDL di altri servizi che magari già sono funzionanti e installati in un web service engine perché per esempio (e mi è capitato con ODE) non supporta una direttiva &lt;i&gt;import &lt;/i&gt;per importare schemi XSD che non siano locali.&lt;br /&gt;
&lt;br /&gt;
Aderenza agli standard.&lt;br /&gt;
Come ho detto alcuni motori fanno i capricci su alcune cose, ad esempio Apache ODE con la questione degli import nei file WSDL.&lt;br /&gt;
Sempre per quanto riguarda Apache ODE (si è capito che è quello che ho utilizzato maggiormente? ) ho dovuto sbattere non poco la testa cercando di usare SOAP 1.2 per poi scoprire che solo l&#39;1.1 è supportata.&lt;br /&gt;
La versione 1.2 è raccomandazione W3C dal lontano giugno 2003... ed ODE è un progetto tutt&#39;altro che morto!&lt;br /&gt;
Infine, mi è capitato di constatare che semplici processi siano eseguiti da alcuni motori e non da altri.&lt;br /&gt;
In particolare mi è capitato che un semplicissimo processo di test funzionasse tranquillamente su Apache ODE ma sul motore di Virtuoso non riuscivo nemmeno a fare il deploy.&lt;br /&gt;
&lt;br /&gt;
Insomma, BPEL 2.0 è standard dal 2004, ma i motori non sono ancora abbastanza maturi.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusioni&lt;/b&gt;&lt;br /&gt;
Dopo alcuni giorni spesi a fare sperimentazioni varie mi sono fatto l&#39;idea che BPEL si presta bene per implementare processi semplici, che utilizzano tipi di dati base e con un&#39;orchestrazione non troppo laboriosa. Però lo standard è stato ideato proprio per implementare orchestrazioni complesse..&lt;br /&gt;
Inoltre non è facile da imparare, soprattutto l&#39;utilizzo degli editor grafici porta a dover trovare un tutorial per ogni cosa che si vuole fare, per capire dove si deve cliccare ecc..&lt;br /&gt;
Infine i tool ed i motori nonostante i molti sforzi ancora non raggiungono un buon livello per essere utilizzati in ambiente industriale, però, io ho utilizzato solo tool opensource, magari le soluzioni proprietarie funzionano meglio.&lt;br /&gt;
&lt;br /&gt;
Nonostante tutto, trovo BPEL un ottimo strumento per la modellazione dei processi. Però, per la &lt;i&gt;modellazione&lt;/i&gt;, non per l&#39;esecuzione.&lt;br /&gt;
Trovo che si possano metter su orchestrazioni di servizi in modo molto più semplice utilizzando altre tecnologie, utilizzando i web service engine per esporli ai client.&lt;br /&gt;
&lt;br /&gt;
Queste sono solo considerazioni mie personali, magari sono dovute alla mia poca esperienza al riguardo, ma ho notato che sono idee abbastanza condivise in rete.&lt;br /&gt;
Chissà, se mi capiterà di acquisire un po&#39; di esperienza (e spero di no) magari capisco tutti gli errori che ho commesso e mi ricredo, però visti i risultati scarsi ottenuti dopo qualche giorno di sperimentazione ne dubito fortemente :)&lt;br /&gt;
&lt;br /&gt;
Ok, direi che si può concludere questo post che sembra più uno sfogo personale.. :P&lt;br /&gt;
Alla prossima :)</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/7441906779699410386/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/bpel-e-lorchestrazione-di-servizi.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/7441906779699410386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/7441906779699410386'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/bpel-e-lorchestrazione-di-servizi.html' title='BPEL e l&#39;orchestrazione di servizi'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-26471572967104338</id><published>2012-06-19T12:35:00.000-07:00</published><updated>2012-06-19T12:38:10.562-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Request Asincrone"/><category scheme="http://www.blogger.com/atom/ns#" term="Web services"/><category scheme="http://www.blogger.com/atom/ns#" term="WSDL"/><title type='text'>Web services: request asincrone</title><content type='html'>Salve di nuovo :)&lt;br /&gt;
&lt;br /&gt;
In questo post voglio parlare di come invocare un web service facendo richieste asincrone.&lt;br /&gt;
Partiamo dal presupposto di aver già implementato un servizio e di aver a disposizione il file WSDL che lo descrive.&lt;br /&gt;
Per la generazione del client ovviamente non si parte da zero, ma si può utilizzare il plugin per Eclipse &lt;a href=&quot;http://axis.apache.org/axis2/java/core/tools/index.html&quot; target=&quot;_blank&quot;&gt;WSDL2Java&lt;/a&gt;&amp;nbsp;per generare la maggior parte del codice necessario.&lt;br /&gt;
&lt;br /&gt;
Con questo tool si possono generare automaticamente le classi per fare request sincrone e asincrone contemporaneamente. Dandogli in pasto il WSDL del servizio da utilizzare, questo genera tutte le classi per eventuali tipi di dati custom che le operazioni del servizio accettano come parametri o che restituiscono.&lt;br /&gt;
&lt;br /&gt;
Supponiamo che il servizio implementato sia&amp;nbsp;&lt;i&gt;MyService&lt;/i&gt;, con una sola operazione, &lt;i&gt;echo,&lt;/i&gt;&amp;nbsp;che prende in input &amp;nbsp;una stringa e la restituisce. Il servizio non lancia eccezioni, per non complicare le cose :)&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Le classi che vengono generate per il client sono:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;L&#39;interfaccia &lt;i&gt;MyService&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;MyServiceResponse&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;La classe astratta&amp;nbsp;&lt;i&gt;MyServiceCallbackHandler&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Echo&lt;/i&gt;&amp;nbsp;(una classe per ogni operazione definita)&lt;/li&gt;
&lt;li&gt;&lt;i&gt;MyService*Exception&lt;/i&gt;&amp;nbsp;(una classe per ogni eccezione che può lanciare il servizio)&lt;/li&gt;
&lt;li&gt;&lt;i&gt;MyServiceStub&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Come per le richieste sincrone, la classe &lt;b&gt;MyServiceStub&lt;/b&gt;&amp;nbsp;viene utilizzata per settare i parametri della request e per invocare il servizio. La classe &lt;b&gt;Echo&lt;/b&gt;&amp;nbsp;(o qualsiasi altra classe corrispondente ad un&#39;operazione)&amp;nbsp;viene utilizzata per contenere i parametri dell&#39;operazione, utilizzati poi dallo stub. Infine la classe &lt;b&gt;MyServiceResponse&lt;/b&gt;&amp;nbsp;ovviamente viene utilizzata per immagazzinare la risposta restituita dal servizio.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Per poter effettuare una request asincrona, è necessario utilizzare &lt;b&gt;MyServiceCallbackHandler&lt;/b&gt;.&lt;/div&gt;
&lt;div&gt;
Questa è una classe astratta contenente dei metodi con implementazione vuota, uno per ogni operazione del servizio ed uno per ogni eccezione che questo può lanciare.&lt;/div&gt;
&lt;div&gt;
Quando la richiesta asincrona viene effettuata, viene lanciato un nuovo thread che si mette in attesa del completamento della request e viene eseguito il metodo associato all&#39;operazione richiamata (o ad una condizione di eccezione) per gestire la risposta del servizio.&lt;/div&gt;
&lt;div&gt;
Infatti, tutti i metodi associati alle operazioni accettano come parametro un oggetto di tipo &lt;b&gt;Response.&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Invece, i metodi corrispondenti alle condizioni di eccezione, come si può immaginare, accettano un parametro di tipo &lt;b&gt;Exception&lt;/b&gt;.&lt;/div&gt;
&lt;div&gt;
Bisogna quindi estendere tale classe ed implementare i metodi che ci interessano. Fortunatamente non c&#39;è bisogno di implementarli tutti: i metodi di &lt;b&gt;MyServiceCallbackHandler&lt;/b&gt;&amp;nbsp;hanno tutti un&#39;implementazione vuota, quindi se il nostro client utilizza una sola delle operazioni offerte da un servizio si può fare l&#39;override dei metodi appropriati.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Supponiamo che la classe che implementa il callback handler si chiami&lt;b&gt;&amp;nbsp;CallbackImplementation&lt;/b&gt;&amp;nbsp;(accorciamo un po il nome :P).&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Giusto per scrivere un po&#39; di codice riporto l&#39;implementazione di questa classe :)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); overflow: auto; padding: 5px; width: 100%;&quot;&gt;public class CallbackImplementation extends clientstubpackage.MyServiceCallbackHandler {

   private boolean complete;

   public CallbackImplementation() {
      complete = false
   }


   @Override
   public void receiveResultecho(
            clientstubpackage.MyServiceResponse result
                ) {
      System.out.println(result.getReturn());
      complete = true;
   }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#39;implementazione del client che chiama il servizio è praticamente uguale ad un client sincrono, cambiano un paio di cose. I passi da seguire per richiamare il servizio sono:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Istanziare un client stub&lt;/li&gt;
&lt;li&gt;Istanziare un oggetto per l&#39;operazione da eseguire&lt;/li&gt;
&lt;li&gt;Istanziare un callback handler&lt;/li&gt;
&lt;li&gt;Settare eventuali parametri per l&#39;operazione&lt;/li&gt;
&lt;li&gt;Richiamare il servizio con il metodo &lt;i&gt;startOperation&lt;/i&gt;&amp;nbsp;dello stub (invece di &lt;i&gt;stub.operazione&lt;/i&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Ecco qui il codice che implementa il client ed esegue tutti i passi descritti:&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); overflow: auto; padding: 5px; width: 653px;&quot;&gt;public class ClientImplementation {

   public static void main(String[] args) {
  
      try {
         //inizializzazione stub
         MyServiceStub stub = new MyServiceStub();
         //inizializzazione handler
         CallbackImplementation handler = new CallbackImplementation();

        //inizializzazione dell&#39;oggetto per l&#39;operazione e settaggio parametri
        Echo echo = new Echo();
        echo.setContent(&quot;Stringa da restituire&quot;);
   
        long start = System.currentTimeMillis();
   
        stub.startecho(echo, handler); //inizio della chiamata asincrona
   
        while(!handler.hasCompleted()) {
           Thread.sleep(1000);
           long now = System.currentTimeMillis();
           System.out.println(&quot;Waiting.. &quot; + ((now - start)/1000));
        }
   
        System.out.println(&quot;Done!&quot;);
       } catch (IOException e) {
          e.printStackTrace();
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
   }

}&lt;/pre&gt;
&lt;br /&gt;
E questo è quanto.&lt;br /&gt;
Ci sono giusto 2 cose da mettere in evidenza, riguardante il metodo &lt;i&gt;startecho&lt;/i&gt;.&lt;br /&gt;
La prima è che, come si vede dal codice, oltre ai parametri dell&#39;operazione esso ha bisogno di un&#39;istanza del callback handler.&lt;br /&gt;
La seconda, molto importante, è che si deve tener presente che al contrario delle request sincrone, quando viene fatta una request asincrona, richiamando il metodo &lt;i&gt;startOperation&lt;/i&gt;&amp;nbsp;dello stub viene lanciato un nuovo thread e l&#39;esecuzione del metodo chiamante continua parallelamente.&lt;br /&gt;
Per questo c&#39;è bisogno di controllare che questo finisca. In questo caso molto semplicemente l&#39;handler quando completa il suo lavoro setta un flag a true, ed il metodo chiamante non fa altro che ciclare e controllare ogni secondo se la richiesta è stata completata (magari l&#39;echo non ha bisogno di aspettare &quot;secondi&quot;.. :P).&lt;br /&gt;
&lt;br /&gt;
Ed anche questo post è finito, era da un po&#39; che non postavo qualcosa..&lt;br /&gt;
Per i prossimi post ancora non ho deciso che scriverò, ho un paio di idee..vedrò il tempo e la voglia cosa mi porteranno a fare :)&lt;br /&gt;
&lt;br /&gt;
Alla prossima!</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/26471572967104338/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/web-services-request-asincrone.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/26471572967104338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/26471572967104338'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/web-services-request-asincrone.html' title='Web services: request asincrone'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-3991894917611820285</id><published>2012-06-06T14:29:00.000-07:00</published><updated>2012-06-06T14:29:31.332-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BPEL"/><category scheme="http://www.blogger.com/atom/ns#" term="DBMS"/><category scheme="http://www.blogger.com/atom/ns#" term="NoSQL"/><category scheme="http://www.blogger.com/atom/ns#" term="Web services"/><title type='text'>Virtuoso Universal Server: un DBMS per tutto</title><content type='html'>Salve :)&lt;br /&gt;
In questo post volevo parlare di un DBMS che ho scoperto recentemente e ho trovato molto interessante.&lt;br /&gt;
&lt;br /&gt;
Parlo di Virtuoso Universal Server (&lt;a href=&quot;http://virtuoso.openlinksw.com/&quot;&gt;http://virtuoso.openlinksw.com/&lt;/a&gt;), un DBMS che, un po come tutti, promette di risolvere tutti i problemi del mondo :)&lt;br /&gt;
La particolarità di questo server è che effettivamente può fare un po&#39; di tutto, nel senso che può essere usato sia come DBMS relazionale, sia come un &lt;a href=&quot;http://nosql-database.org/&quot; target=&quot;_blank&quot;&gt;NoSQL Database&lt;/a&gt;, come &lt;a href=&quot;http://en.wikipedia.org/wiki/XML_database&quot; target=&quot;_blank&quot;&gt;XML Store&lt;/a&gt; e come &lt;a href=&quot;http://en.wikipedia.org/wiki/Triplestore&quot; target=&quot;_blank&quot;&gt;Triple Store&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Come DBMS relazionale offre un po&#39; tutte le caratteristiche che offrono gli RDBMS tipici come MySQL e simili. Ovviamente supporta il linguaggio SQL, inoltre mette a disposizione molte funzioni utili.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda le sue funzionalità come XML Database, Virtuoso non è uno store nativo, cioè il documento XML non è visto come unità fondamentale di memorizzazione e i dati fisicamente non vengono memorizzato secondo la struttura di questi documenti. Infatti questi vengono memorizzati in tabelle SQL, come tipo di dato XML appunto. In pratica questo tipo di dato sarebbe un long varchar, ma utilizzando il tipo XML viene fatto anche il parsing dei documenti, in modo tale che, se durante un inserimento viene passato qualcosa che non è un documento ben formato, viene notificato direttamente un errore.&lt;br /&gt;
Ha diverse funzioni per l&#39;utilizzo dei documenti XML e supporta &lt;a href=&quot;http://it.wikipedia.org/wiki/XPath&quot; target=&quot;_blank&quot;&gt;XPath&lt;/a&gt;, &lt;a href=&quot;http://it.wikipedia.org/wiki/XQuery&quot; target=&quot;_blank&quot;&gt;XQuery &lt;/a&gt;e le trasformazioni &lt;a href=&quot;http://it.wikipedia.org/wiki/XSL_Transformations&quot; target=&quot;_blank&quot;&gt;XSLT&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda invece le sue funzionalità come Triple Store, il modello di dati utilizzato è il modello a grafo, che è quello utilizzato dalla maggior parte dei Triple Store che non si basano su database relazionali. In realtà non so il modello di dati fisico quale sia, ma il modello utilizzato per i dati in memoria è sicuramente a grafo.&lt;br /&gt;
E&#39; possibile interrogarlo tramite il linguaggio &lt;a href=&quot;http://it.wikipedia.org/wiki/SPARQL&quot; target=&quot;_blank&quot;&gt;SPARQL&amp;nbsp;&lt;/a&gt;, eseguire update tramite &lt;a href=&quot;http://en.wikipedia.org/wiki/SPARUL&quot; target=&quot;_blank&quot;&gt;SPARUL&lt;/a&gt;&amp;nbsp;ed è possibile importare ed esportare dati in formato RDF. I formati di serializzazione RDF supportati sono&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 12pt;&quot;&gt;HTML+RDFa, RDF-JSON, N3, Turtle, TriG, TriX e RDF/XML.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
Virtuoso permette di essere utilizzato sia come SQL che NoSQL Database grazie alla virtualizzazione dei dati. Il modello fisico di memorizzazione è comune a tutti i motori DBMS, ma ognuno di essi vede i dati come se fossero memorizzati nel formato che più si adatta a loro.&lt;br /&gt;
La cosa penalizza le prestazioni?&lt;br /&gt;
In teoria potrebbe, ma in pratica leggendo in giro sembra sia abbastanza veloce. Personalmente l&#39;ho provato solo su pochi dati e non ho eseguito nessuno stress test quindi non ho elementi per giudicare.&lt;br /&gt;
Come Triple Store sembra si comporti particolarmente bene. Ho visto diversi benchmark che lo confermano e anche in questa classifica W3C sembra si comporti abbastanza bene:&amp;nbsp;&lt;a href=&quot;http://www.w3.org/wiki/LargeTripleStores&quot;&gt;http://www.w3.org/wiki/LargeTripleStores&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Questa immagine riassume un po la virtualizzazione dei dati e i vari moduli da cui è composto Virtuoso:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://1.bp.blogspot.com/-hHesSWK-ZU8/T8_HiSYixhI/AAAAAAAABsw/kkZld97pmXc/s1600/Virtuoso.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-hHesSWK-ZU8/T8_HiSYixhI/AAAAAAAABsw/kkZld97pmXc/s1600/Virtuoso.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Un&#39;altra caratteristica molto interessante è che è molto semplice esporre le funzionalità di Virtuoso come web services. Infatti supporta può essere interrogato sia utilizzando SOAP che REST.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Si possono scrivere delle stored procedures e pubblicarle direttamente come servizi, con tanto di generazione automatica del WSDL.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Inoltre è possibile in qualche modo riutilizzare anche i web service scritti in Java, modificando un po il codice per eseguire una sorta di wrap. E&#39; possibile riutilizzare anche i servizi scritti in linguaggi della piattaforma .NET.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Infine è disponibile un&#39;estensione per poter utilizzare Virtuoso come motore BPEL4WS!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Grazie a questa è possibile organizzare le orchestrazioni dei servizi facendone il deploy direttamente nel DBMS.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Insomma, a mio parere le potenzialità sono molte, soprattutto negli scenari in cui si ha bisogno di dover gestire diversi tipi di dati ed avere la gestione migliore per ognuno di essi.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Inoltre poter gestire i dati, i servizi e magari anche le orchestrazioni da un unico punto semplifica parecchio la gestione..&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Per concludere, Virtuoso è disponibile sia in versione commerciale che open source. La versione open source ovviamente ha qualche limitazione, non supporta infatti la replicazione dei dati e quello che chiamano &quot;Virtual Database Engine&quot;, che permette di eseguire query SQL su database multipli remoti.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Personalmente ho fatto qualche sperimentazione con la versione opensource. Credo che sia molto più comodo utilizzarlo su sistemi Unix che non su Windows. Su sistemi come Ubuntu, per esempio, sono disponibili già i binari installabili dal gestore di pacchetti. Su Windows invece per poterlo compilare c&#39;è bisogno di strimenti come Visual Studio ed altra roba..&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Bene, direi che ho concluso con questo post pubblicitario :)&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
In questi giorni ho accantonato Virtuoso per fare delle prove con l&#39;XML Database &lt;a href=&quot;http://exist-db.org/&quot; target=&quot;_blank&quot;&gt;eXist&lt;/a&gt;. Se lo trovo interessante magari scriverò qualcosina anche su quello :)&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Al prossimo post!&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/3991894917611820285/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/virtuoso-universal-server-un-dbms-per.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/3991894917611820285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/3991894917611820285'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/virtuoso-universal-server-un-dbms-per.html' title='Virtuoso Universal Server: un DBMS per tutto'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-hHesSWK-ZU8/T8_HiSYixhI/AAAAAAAABsw/kkZld97pmXc/s72-c/Virtuoso.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-5667506695268111087</id><published>2012-06-04T14:10:00.001-07:00</published><updated>2012-06-04T14:10:39.658-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><title type='text'>Java e la ridirezione con processi esterni</title><content type='html'>Salve di nuovo :)&lt;br /&gt;
&lt;br /&gt;
Visto che ultimamente ho scritto un post con tante chiacchiere e 2 righe di codice che servivano ad eseguire il redirect dello standard output e lo standard error su altri stream, ora voglio scrivere un post che parla di una cosa molto simile: eseguire il redirect di standard output e standard error, ma di processi esterni.&lt;br /&gt;
&lt;br /&gt;
Ovviamente la cosa si può fare solo su processi di cui si ha il controllo via codice. per esempio dopo averli eseguiti con il metodo &lt;i&gt;exec()&lt;/i&gt;&amp;nbsp;di &amp;nbsp;&lt;i&gt;java.io.Runtime&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Siccome il processo lanciato è indipendente da quello che l&#39;ha generato allora l&#39;I/O e l&#39;error saranno su stream separati. In poche parole sul video non viene visualizzato nulla di quello che il nuovo processo stampa.&lt;br /&gt;
Quindi per poter ottenere comunque i dati che vengono stampati bisogna catturare lo stream di tale processo e successivamente stamparlo su qualche altro stream, magari lo standard I/O ed error del processo padre.&lt;br /&gt;
&lt;br /&gt;
Il codice per fare tutto ciò è il seguente:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); overflow: auto; padding: 5px; width: 100%;&quot;&gt;try {
   Process p = Runtime.getRuntime().exec(&quot;comando&quot;);
  
   String line;

   BufferedReader in = new BufferedReader(
               new InputStreamReader(p.getInputStream()) );

   while ((line = in.readLine()) != null) 
       System.out.println(line);
        
   in.close();
        
   in = new BufferedReader(
               new InputStreamReader(p.getErrorStream()) );

   while ((line = in.readLine()) != null)
       System.err.println(line);
        
   in.close();
}
catch(IOException | InterruptedException e) {
   e.printStackTrace();
}&lt;/pre&gt;
&lt;br /&gt;
E questo è quanto.&lt;br /&gt;
Ovviamente questo funziona con Java 7, altrimenti non si può fare la cosa figa del multi catch :)&lt;br /&gt;
&lt;br /&gt;
Al prossimo post!</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/5667506695268111087/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/java-e-la-ridirezione-con-processi.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/5667506695268111087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/5667506695268111087'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/06/java-e-la-ridirezione-con-processi.html' title='Java e la ridirezione con processi esterni'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-3777752067737905409</id><published>2012-05-31T14:28:00.001-07:00</published><updated>2012-05-31T14:48:39.339-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="File Handler"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Tomcat"/><title type='text'>Tomcat e i file stream &quot;pendenti&quot;</title><content type='html'>Bene, oggi voglio parlare di un problemino che ho avuto un paio di giorni fa.&lt;br /&gt;
&lt;br /&gt;
Mi ritrovavo a scrivere un web service e come engine usavo il solito Axis (eh si, ultimamente ho lavorato solo sui web services :P).&lt;br /&gt;
Il servizio utilizzava una libreria esterna che doveva fare delle conversioni e come output creava dei file. Dopo la conversione, il servizio creava un archivio zippato dell&#39;output della libreria e cancellava i singoli file creati.&lt;br /&gt;
O almeno, questo era quello che volevo fare.&lt;br /&gt;
Infatti mi sono accorto che alcuni file non venivano cancellati. Sullo stesso output, a volte non riuscivo a cancellare dei file e a volte altri.&lt;br /&gt;
Il dubbio iniziale era che ci potesse essere qualche problema di permessi di Tomcat, ma ho scartato subito questa possibilità perchè altrimenti i file avrebbe dovuto cancellarmeli o tutti o nessuno.&lt;br /&gt;
Quindi ho capito che semplicemente restavano dei file aperti. La conferma l&#39;ho avuta controllando con&amp;nbsp;&lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx&quot; target=&quot;_blank&quot;&gt;Process Explorer&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
In un servlet container come Tomcat, quando restano dei file handler aperti, questi non vengono chiusi per tutta la vita del processo. Solo riavviando Tomcat questi vengono chiusi in quanto muore il processo che li tiene aperti.&lt;br /&gt;
Infatti nel mio caso, la prima esecuzione funzionava benissimo, erano le successive che mi davano problemi!&lt;br /&gt;
&lt;br /&gt;
Ora, la libreria che utilizzavo fortunatamente era opensource, ma visto che non avevo tempo (e soprattutto perchè sono pigro :P), non potevo mettermi a capire quando e come la libreria apriva e chiudeva file, anche perchè non era così semplice il codice..&lt;br /&gt;
&lt;br /&gt;
L&#39;idea che ho avuto è questa: visto che gli handler vengono chiusi quando muore il processo, se questi vengono aperti in un processo esterno, vengono chiusi quando questo muore.&lt;br /&gt;
&lt;br /&gt;
La libreria era un jar eseguibile anche da riga di comando, quindi potevo eseguirla tranquillamente con il metodo &lt;i&gt;exec()&lt;/i&gt; della classe &lt;i&gt;java.io.Runtime&lt;/i&gt;.&lt;br /&gt;
Il codice per fare ciò è questo:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span class=&quot;kwd&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Process&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; p &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Runtime&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;getRuntime&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&quot;java -jar library.jar parameters&quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;
    p&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;waitFor&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;();&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;InterruptedException&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;IOException&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; e&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;
&amp;nbsp; &amp;nbsp; e&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;();&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt; &lt;/pre&gt;
&lt;br /&gt;
In caso non sia possibile eseguire il jar da linea di comando basta creare un jar composto da una semplice classe che fa da wrapper ed utilizza il jar.&lt;br /&gt;
&lt;br /&gt;
Magari questa non è la migliore soluzione a questo tipo di problemi..però è quella che mi è venuta in mente, ha funzionato e la condivido :)</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/3777752067737905409/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/05/tomcat-e-i-file-stream-pendenti.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/3777752067737905409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/3777752067737905409'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/05/tomcat-e-i-file-stream-pendenti.html' title='Tomcat e i file stream &quot;pendenti&quot;'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-6243174614488444241</id><published>2012-05-30T12:52:00.002-07:00</published><updated>2012-12-28T03:59:15.760-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Axis"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="MTOM"/><category scheme="http://www.blogger.com/atom/ns#" term="SOAP"/><category scheme="http://www.blogger.com/atom/ns#" term="Web services"/><category scheme="http://www.blogger.com/atom/ns#" term="WSDL"/><title type='text'>Invio e ricezione di file da web services</title><content type='html'>Eccomi qui con un nuovo posto..&lt;br /&gt;
Ultimamente sto tenendo una bella media, chissà se riuscirò a tenere questa costanza.. :)&lt;br /&gt;
&lt;br /&gt;
Bene, oggi volevo scrivere un post sull&#39;invio e la ricezione di file verso e da un web service, visto che è una cosa che mi sono ritrovato a fare solo recentemente.&lt;br /&gt;
&lt;br /&gt;
In questo post sia i servizi1 che i client saranno scritti in Java. Il web service engine che utilizzato è &lt;a href=&quot;http://axis.apache.org/axis/&quot; target=&quot;_blank&quot;&gt;Apache Axis&lt;/a&gt; (installato su Tomcat 7) ed il protocollo di comunicazione è SOAP.&lt;br /&gt;
&lt;br /&gt;
Per la generazione del pacchetto .aar contenente le classi per &quot;deployare&quot; il servizio in Axis è stato utilizzato il plugin per Eclipse &quot;Service Archiver&quot;, mentre per creare il file WSDL dal codice del servizio e generare il client dal WSDL creato sono stati utilizzati Java2WSDL e WSDL2Java, entrambi contenuti nel plugin &quot;Code Generator&quot;. Questi tool sono disponibili all&#39;indirizzo: &lt;a href=&quot;http://axis.apache.org/axis2/java/core/tools/index.html&quot; target=&quot;_blank&quot;&gt;http://axis.apache.org/axis2/java/core/tools/index.html&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Prenderemo in considerazione un servizio, &lt;b&gt;FileService&lt;/b&gt; che mette a disposizione 2 operazioni: &lt;b&gt;UploadFile&lt;/b&gt; e &lt;b&gt;GetFile&lt;/b&gt;.&lt;br /&gt;
La cosa importante affinchè le cose funzionino è definire la firma dei metodi corrispondenti alle operazioni affinchè il Code Generator possa generare un file WSDL con il giusto mapping tra i tipi.&lt;br /&gt;
&lt;br /&gt;
Una prima prova potrebbe essere fatta specificando come parametro dell&#39;operazione &lt;b&gt;UploadFile&lt;/b&gt; e come tipo restituito dall&#39;operazione &lt;b&gt;GetFile&lt;/b&gt; semplicemente &lt;i&gt;java.io.File.&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
Purtroppo questa non è una buona soluzione. Se si prova ad utilizzare Java2WSDL con i metodi così definiti, verrà generato un correttamente il file WSDL desiderato. Il problema, però, nasce quando si utilizza WSDL2Java per generare il client. Dalle classi create si vede che il mapping dei tipi è abbastanza sballato, infatti ci sono delle classi come &lt;i&gt;java.io.xsd.File&lt;/i&gt; che per essere utilizzate come minimo dovrebbero essere incluse in un package diverso, in quanto l&#39;uso del nome &lt;i&gt;java.io&lt;/i&gt; per un package è ovviamente proibito.&lt;br /&gt;
Non so se sia possibile utilizzare comunque &lt;i&gt;java.io.File&lt;/i&gt; per il trasferimento dei dati, probabilmente definendo a mano i tipi complessi nel WSDL e costruento i messaggi SOAP tramite codice è possibile, ma se uno non ha tempo, o non ha voglia, o una combinazione delle 2, allora sarebbe preferibile percorrere un&#39;altra strada :) &lt;br /&gt;
&lt;br /&gt;
Bene, dopo aver visto questa non-soluzione passiamo alle 2 che ho sperimentato:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;trasferire dati tramite array di &lt;i&gt;byte&lt;/i&gt; e &lt;i&gt;DataHandler&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;trasferire dati tramite &lt;i&gt;DataHandler&lt;/i&gt; utilizzando MTOM per gli allegati SOAP &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Array di Byte&lt;/b&gt;&lt;br /&gt;
Questo metodo è abbastanza intuitivo, per fare l&#39;upload di un file si passa un&#39;array di byte che rappresenta il contenuto del file e il web service che lo riceve lo scrive su file. Lato client, però, non si può passare semplicemente un array di byte, ma dev&#39;essere passato un &lt;i&gt;DataHandler&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Il servizio può essere per esempio il seguente:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;public class ImportService { 
  public String importSingleFile(String name, byte[] content) {
&amp;nbsp;    try {
       File f = new File(name); 
       BufferedWriter out = new BufferedWriter(new FileWriter(f));
       out.write(s);
       out.close();

       return &quot;Import Successful!&quot;;
    }&amp;nbsp;
    catch(IOException e) {
       e.printStackTrace();
    }
  } 
&amp;nbsp;}&amp;nbsp;&lt;/code&gt; &lt;/pre&gt;
&lt;br /&gt;
Con Java2WSDL si può creare il file che descrive il servizio e con WSDL2Java si può generare il client che lo interroga. Il client sarà composto da una serie di classi,tra cui &lt;i&gt;ImportStub&lt;/i&gt; e &lt;i&gt;ImportSingleFile&lt;/i&gt; che corrispondono rispettivamente al servizio ed all&#39;operazione da richiamare.&lt;br /&gt;
&lt;br /&gt;
Il client, per poter trasferire il file al servizio, dovrà:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;aprire il file che vuole trasferire&lt;/li&gt;
&lt;li&gt;associare il file ad un &lt;i&gt;DataSource&lt;/i&gt; (presente in &lt;i&gt;javax.activation&lt;/i&gt;)&lt;/li&gt;
&lt;li&gt;associare il &lt;i&gt;DataSource&lt;/i&gt; ad un &lt;i&gt;DataHandler&lt;/i&gt; (sempre in &lt;i&gt;javax.activation&lt;/i&gt;)&lt;/li&gt;
&lt;li&gt;richiamare il servizio&lt;/li&gt;
&lt;/ul&gt;
Ecco il codice:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;public class Client { 
  public static void main(String args[]) {
&amp;nbsp;    try {
       ImportStub stub = new ImportStub(); 
       ImportSingleFile single = new ImportSingleFile();
       
       File f = new File(&quot;upload.txt&quot;);
       FileDataSource ds = new FileDataSource(f);
       DataHandler dh = new DataHandler(ds);

       single.setName(f.getName());
       single.setContent(dh);

       ImportSingleFileResponse res = stub.importSingleFile(single);

       System.out.println(res.get_return());
    }&amp;nbsp;
    catch(IOException | AxisFault e) {
       e.printStackTrace();
    }
  } 
&amp;nbsp;}&amp;nbsp;&lt;/code&gt; &lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;E questo è quanto.&lt;br /&gt;
Il problema con questa soluzione è che i dati binari vengono codificati come testo per poi venire spediti in messaggi SOAP. Per ovviare a questo problema è possibile utilizzare MTOM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;MTOM e DataHandlers&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/Message_Transmission_Optimization_Mechanism&quot; target=&quot;_blank&quot;&gt;MTOM&amp;nbsp; &lt;/a&gt;(Message Transmission Optimization Mechanism) è una raccomandazione W3C per inviare e ricevere dati binari da web services. Altri meccanismi possono essere utilizzati per lo stesso scopo, come &lt;a href=&quot;http://en.wikipedia.org/wiki/SOAP_with_Attachments&quot; target=&quot;_blank&quot;&gt;SwA&lt;/a&gt; (SOAP with Attachments) e i DIME Attachments, ma a MTOM sembra sia migliore di questi ultimi.&lt;br /&gt;
&lt;br /&gt;
Per poterlo utilizzare in Axis è necessario abilitarlo: bisogna editare il file di configurazione &lt;b&gt;axis/WEB-INF/conf/axis2.xml&lt;/b&gt; e settare a true il parametro &lt;b&gt;enableMTOM&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Fatto ciò si può scrivere il servizio. In realtà cambia molto poco: invece di un array di byte come parametro prende un &lt;i&gt;DataHandler&lt;/i&gt;. Ecco il codice:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;public class ImportService { 
  public String importSingleFile(String name, DataHandler dh) {
&amp;nbsp;    try {
       File f = new File(name); 
       FileOutputStream fos = &lt;/code&gt;&lt;code&gt;new FileOutputStream(f)&lt;/code&gt;;
&lt;code&gt;
       dh.writeTo(fos);
       fos.close();

       &lt;/code&gt;&lt;code&gt;return &quot;Import Successful!&quot;;&lt;/code&gt;&lt;code&gt;
    }&amp;nbsp;
    catch(IOException e) {
       e.printStackTrace();
    }
  } 
&amp;nbsp;}&amp;nbsp;&lt;/code&gt; &lt;/pre&gt;
&lt;br /&gt;
Il client invece resta esattamente uguale.&lt;br /&gt;
&lt;br /&gt;
E così si conclude questo post..spero di scrivere qualche altra cosa presto! :)</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/6243174614488444241/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/05/invio-e-ricezione-di-file-da-web.html#comment-form' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/6243174614488444241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/6243174614488444241'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/05/invio-e-ricezione-di-file-da-web.html' title='Invio e ricezione di file da web services'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-3080449619174176452</id><published>2012-05-26T11:03:00.000-07:00</published><updated>2012-05-26T11:03:36.004-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><title type='text'>Java e la redirezione</title><content type='html'>Salve :)&lt;br /&gt;
Eccomi qui con un nuovo post. Voglio parlare di una questione che ho affrontato pochi giorni fa.&lt;br /&gt;
&lt;br /&gt;
In C in ambiente Unix è molto semplice fare la ridirezione di flussi come lo Standard I/O o lo Standard Error. In Java, come si può immaginare, è altrettanto semplice :)&lt;br /&gt;
Mi sono ritrovato ad utilizzare la ridirezione utilizzando delle librerie in un progetto. Era una libreria opensource per eseguire delle conversioni di manualistica che segue lo standard S1000D. Funziona bene, fa il suo sporco lavoro, ma sfortunatamente quando c&#39;è qualcosa che non va invece di lanciare eccezioni, restituire qualcosa in particolare o qualsiasi altra cosa, scrive semplicemente sullo Standard IO l&#39;eccezione avvenuta.&lt;br /&gt;
Questo fin quando la si utilizza da riga di comando è tranquillamente accettabile, ma quando la si utilizza attraverso un web service deployato sotto Axis fallisce &quot;silenziosamente&quot;, infatti non è possibile visualizzare eventuali messaggi di errore.&lt;br /&gt;
Da bravo pigro e per sbrigarmi non sono stato a modificare i sorgenti della libreria, ma ho rididezionato l&#39;I/O e gli errori su file.&lt;br /&gt;
&lt;br /&gt;
E&#39; un&#39;operazione estremamente semplice, facile anche da cercare su google, ma visto che avevo voglia di scrivere un post, che non fosse troppo lungo o impegnativo, la riporto qui :)&lt;br /&gt;
&lt;br /&gt;
I passi da seguire sono 2:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Aprire un PrintStream sul file nel quale si desidera siano scritti i contenuti&lt;/li&gt;
&lt;li&gt;Settare il System.out affinchè utilizzi lo stream&lt;/li&gt;
&lt;/ol&gt;
Di seguito c&#39;è un esempio su come ridirigere lo standard I/O e lo standard error su 2 file diversi:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;PrintStream ioStream = new PrintStream(new File(&quot;IO.txt&quot;));&amp;nbsp;
PrintStream errorStream = new PrintStream(new File(&quot;error.txt&quot;)); &amp;nbsp;


System.setOut(ioStream); 
System.setErr(errorStream);
&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;
&lt;br /&gt;
Bene, un post intero per 4 righe di codice!&lt;br /&gt;
Ma avevo voglia di scrivere, cosa alquanto rara e non avevo voglia di scrivere niente di impegnativo :)&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/3080449619174176452/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/05/java-e-la-redirezione.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/3080449619174176452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/3080449619174176452'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/05/java-e-la-redirezione.html' title='Java e la redirezione'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-3525175674871164479</id><published>2012-05-25T15:37:00.001-07:00</published><updated>2012-05-25T15:37:20.953-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Cotton Candy"/><category scheme="http://www.blogger.com/atom/ns#" term="Smart Pen"/><category scheme="http://www.blogger.com/atom/ns#" term="Tecnologia"/><title type='text'>Cotton Candy, una smart pen Android!</title><content type='html'>E&#39; da una vita che non scrivo qualcosa su questo blog...&lt;br /&gt;
Ogni tanto però ritorno :)&lt;br /&gt;
&lt;br /&gt;
Ultimamente mi sono trovato ad affrontare molte problematiche interessanti in ambito lavorativo e spero di avere tempo e soprattutto voglia di scrivere qualcosa sulle problematiche che mi sono trovato ad affrontare e che mi hanno fatto impazzire.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Per ora voglio buttare giù 2 righe su questa Cotton Candy (&lt;a href=&quot;http://www.fxitech.com/products/&quot;&gt;http://www.fxitech.com/products/&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Praticamente un mini PC in una chiavetta, che permette di utilizzare un qualsiasi televisore che abbia una porta HDMI come un PC, con la comodità di poterla portare sempre con sè viste le ridotte dimensioni.&lt;br /&gt;
La cosa interessante è che le caretteristiche tecniche non hanno nulla da invidiare agli smartphone più avanzati:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;CPU &lt;b&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;ARM Cortex-A9&lt;/b&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;, 1.2GHz (non so se dual o &lt;/span&gt;&lt;/b&gt;quad core)&lt;/li&gt;
&lt;li&gt;GPU ARM &lt;b style=&quot;font-weight: normal;&quot;&gt;Mali&lt;b&gt;&lt;b&gt;, &lt;/b&gt;&lt;/b&gt;400MP Quad Core&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;1 GB di Ram&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;Storage fino a 64GB con micro SD&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp;I sistemi operativi a che può montare sono Ubuntu o Android, ma dispone persino di un client per la virtualizzazione per Windows e Mac OS!&lt;br /&gt;
Inoltre ha connettività Bluetooth e Wifi b/g e persino n.&lt;br /&gt;
&lt;br /&gt;
Questo apparecchietto dovrebbe essere commercializzato in italia a fine estate, il costo approssimativo si stima essere intorno ai 200 dollari..&lt;br /&gt;
In &lt;a href=&quot;http://android.hdblog.it/2012/05/15/cotton-candy-la-chiavetta-pc-con-ics-nel-cuore-pronta-alla-commercializzazione/&quot; target=&quot;_blank&quot;&gt;questo articolo&lt;/a&gt; è presente anche un bel video dove dimostrano il suo utilizzo.&lt;br /&gt;
&lt;br /&gt;
Intanto che l&#39;apparecchio venga commercializzato, la FXI permette di preordinare la Cotton Candy :)&lt;br /&gt;
&lt;a href=&quot;http://www.fxitech.com/2012/02/fxi-launches-cotton-candy-developers-site-take-pre-orders/&quot; target=&quot;_blank&quot;&gt;http://www.fxitech.com/2012/02/fxi-launches-cotton-candy-developers-site-take-pre-orders/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Beh, sarebbe molto interessante poter &quot;giocare&quot; con un apparecchietto simile, chissà in Italia se e a che prezzo verrà messo in vendita!!&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/3525175674871164479/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/05/cotton-candy-una-smart-pen-android.html#comment-form' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/3525175674871164479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/3525175674871164479'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2012/05/cotton-candy-una-smart-pen-android.html' title='Cotton Candy, una smart pen Android!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-6805539414229751959</id><published>2011-04-15T14:53:00.000-07:00</published><updated>2011-04-15T14:53:22.885-07:00</updated><title type='text'>Gladinet - Montare dischi remoti come cartelle locali</title><content type='html'>Salve a tutti!&lt;br /&gt;
Sono mesi che non scrivo nulla su questo blog e ho scritto pochissimi post...colpa degli impegni ma soprattutto della mia pigrizia..&lt;br /&gt;
&lt;br /&gt;
Beh, ho appena scoperto un programmino molto utile, si chiama Gladinet ed è disponibile all&#39;indirizzo: &lt;a href=&quot;http://www.gladinet.com/&quot;&gt;http://www.gladinet.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Come il titolo del post suggerisce, questo programma consente di montare dischi remoti come se fossero cartelle locali, modificarne i contenuti, avere copie da utilizzare offline e sincronizzare il contenuto su diversi pc.&lt;br /&gt;
La cosa che personalmente ho trovato molto utile è che permette di montare localmente servizi di storage come &lt;a href=&quot;docs.google.com/ &quot;&gt;Google Docs&lt;/a&gt;, &lt;a href=&quot;picasaweb.google.com&quot;&gt;Picasa&lt;/a&gt;, &lt;a href=&quot;http://skydrive.live.com&quot;&gt;Microsoft Skydrive&lt;/a&gt; e molti altri ancora.&lt;br /&gt;
Io ho provato la versione free e sembra che non manchi nulla di necessario :)&lt;br /&gt;
Certo, magari ce ne sono altri 1000 di programmi che fanno la stessa cosa..ma io ho provato questo e mi sono trovato bene :P&lt;br /&gt;
&lt;br /&gt;
Beh..il minipost finisce qui..vi saluto sperando di scrivere qualcosa di più interessante al più presto.. :)</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/6805539414229751959/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2011/04/gladinet-montare-dischi-remoti-come.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/6805539414229751959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/6805539414229751959'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2011/04/gladinet-montare-dischi-remoti-come.html' title='Gladinet - Montare dischi remoti come cartelle locali'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-7053778331261477364</id><published>2010-10-10T15:33:00.000-07:00</published><updated>2012-06-25T13:32:55.317-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Iterator"/><category scheme="http://www.blogger.com/atom/ns#" term="Iteratori"/><category scheme="http://www.blogger.com/atom/ns#" term="List"/><category scheme="http://www.blogger.com/atom/ns#" term="Liste"/><title type='text'>C++ liste e iteratori...</title><content type='html'>Salve a tutti :)&lt;br /&gt;
&lt;br /&gt;
In questo post volevo scrivere qualcosa sul come navigare una lista usando gli iteratori in C++.&lt;br /&gt;
Cominciamo con un piccolo programma di esempio:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: auto;&quot;&gt;
&lt;/div&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;list&amp;gt;

using namespace std;

int main(int argc, char **argv) {

    list&amp;lt;int&amp;gt; l;

    for(int i = 0; i &amp;lt; 10; i++)
        l.push_back(i);

    list&amp;lt;int&amp;gt;::const_iterator it;
    for(it = l.begin(); it != l.end(); ++it)
        cout &amp;lt;&amp;lt; *it &amp;lt;&amp;lt; endl;

}

&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: auto;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Bene, nelle prime righe ci sono i soliti include, nello specifico &lt;i&gt;iostream&lt;/i&gt;&amp;nbsp;serve per poter utilizzare &lt;i&gt;cout;&lt;/i&gt;&amp;nbsp;&lt;i&gt;list&lt;/i&gt;&amp;nbsp;come si può intuire serve per poter utilizzare il tipo &lt;i&gt;list&lt;/i&gt;&amp;nbsp;dell&#39;STL.&lt;br /&gt;
Le successive righe del programma non fanno altro che inizializzare la lista e riempirla con un po&#39; di numeri.&lt;br /&gt;
&lt;br /&gt;
Dalla riga 13 in poi si comincia a scorrere la lista.&lt;br /&gt;
Per prima cosa viene dichiarato un &lt;b&gt;const_iterator&lt;/b&gt;, un &lt;b&gt;iteratore&lt;/b&gt;, cioè un oggetto che permette di accedere ai membri di una classe &lt;i&gt;container&lt;/i&gt;&amp;nbsp;(un contenitore di oggetti), in questo caso di una lista. Esso può essere visto come un puntatore agli elementi della classe container, nel nostro caso, esso è il puntatore all&#39;elemento corrente della lista.&lt;br /&gt;
&lt;br /&gt;
Successivamente, l&#39;iteratore viene inizializzato. L&#39;istruzione &lt;b&gt;l.begin()&lt;/b&gt;&amp;nbsp;restituisce l&#39;iteratore agli elementi della lista, precisamente un iteratore che punta all&#39;elemento &lt;i&gt;begin&lt;/i&gt;.&lt;br /&gt;
Gli elementi &lt;i&gt;begin &lt;/i&gt;e &lt;i&gt;end&lt;/i&gt;&amp;nbsp;non sono il primo e l&#39;ultimo elemento della lista, ma sono dei valori sentinella, l&#39;&lt;i&gt;header&lt;/i&gt;&amp;nbsp;e il &lt;i&gt;trailer &lt;/i&gt;della stessa. Essi sono cioè l&#39;elemento che precede il primo elemento della lista e quello successivo all&#39;ultimo.&lt;br /&gt;
Infatti l&#39;iteratore appena inizializzato non viene subito utilizzato per leggere gli elementi, ma la prima cosa che viene fatta è incrementarlo per poter puntare al primo elemento della lista, con l&#39;istruzione.&lt;br /&gt;
Fatto ciò esso può essere utilizzato come se fosse un puntatore all&#39;elemento della lista, in questo caso un puntatore a intero.&lt;br /&gt;
Ovviamente l&#39;output del programma è l&#39;elenco dei numeri da 0 a 9.&lt;br /&gt;
&lt;br /&gt;
Una cosa da notare è che l&#39;iteratore in questione è un &lt;b&gt;const_iterator&lt;/b&gt;, questo significa che può essere utilizzato in sola lettura e non è possibile modificarne gli elementi.&lt;br /&gt;
Per poter modificare gli elementi puntati dall&#39;iteratore basta modificare leggermente il programma precedente:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;list&amp;gt;

using namespace std;

int main(int argc, char **argv) {

    list&amp;lt;int&amp;gt; l;

    for(int i = 0; i &amp;lt; 10; i++)
        l.push_back(i);

    &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;list&amp;lt;int&amp;gt;::iterator it;&lt;/span&gt;
    for(it = l.begin(); it != l.end(); ++it) {
        &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;*it *= 2;&lt;/span&gt;
        cout &amp;lt;&amp;lt; *it &amp;lt;&amp;lt; endl;
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Come mostrato, in questo modo è possibile modificare gli elementi della lista.&lt;br /&gt;
&lt;br /&gt;
Ovviamente in una lista possono essere contenuti diversi tipi di dati, non solo interi.&lt;br /&gt;
Si può scorrere tranquillamente una lista usando gli iteratori anche con altri tipi di strutture dati, quali classi o struct.&lt;br /&gt;
Vediamo ora un semplice esempio nell&#39;uso di un iteratore per scorrere una lista che contiene una struct, per poi vederne uno in cui la lista contiene degli oggetti che sono istanze di classi:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;list&amp;gt;

using namespace std;


struct myStruct {
    string something;
};


int main(int argc, char **argv) {

    list&amp;lt;myStruct&amp;gt; l;

    myStruct *s1 = new myStruct();
    myStruct *s2 = new myStruct();
    s1-&amp;gt;something = &quot;hello &quot;;
    s2-&amp;gt;something = &quot;world&quot;;

    l.push_back(*s1);
    l.push_back(*s2);

    list&amp;lt;myStruct&amp;gt;::const_iterator it;
    for(it = l.begin(); it != l.end(); ++it)
        cout &amp;lt;&amp;lt; (*it).something;

}

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Qui invece di un intero, la lista contiene una semplice struttura che al suo interno contiene solo una stringa.&lt;br /&gt;
Come prima cosa si inizializzano due variabili di tipo &lt;i&gt;myStruct&lt;/i&gt;&amp;nbsp;e ci si mette qualcosa dentro.&lt;br /&gt;
Visto che ogni tutorial quando ci sono delle stringhe è sempre presente &quot;hello world&quot;, questo è quello che è stato inserito nelle strutture :-P&lt;br /&gt;
Successivamente si inseriscono le due variabili nella lista. Siccome la lista è stata dichiarata &lt;b&gt;list&amp;lt;myStruct&amp;gt;&lt;/b&gt;&amp;nbsp;i riferimenti alle strutture devono essere deferenziati prima di poterli inserire. Ovviamente è possibile inserire direttamente i riferimenti, dichiarando la lista come &lt;b&gt;list&amp;lt;*myStruct&amp;gt;&lt;/b&gt;.&lt;br /&gt;
Come prima, il passo successivo consiste nell&#39;inizializzare l&#39;iteratore.&lt;br /&gt;
La cosa da notare qui è come si accede agli elementi della lista. L&#39;iteratore è un puntatore all&#39;elemento corrente della lista, quindi bisogna innanzitutto deferenziarlo&amp;nbsp;per accedere all&#39;elemento contenuto.&lt;br /&gt;
L&#39;istruzione &lt;b&gt;(*it)&lt;/b&gt;&amp;nbsp;restituisce quindi l&#39;oggetto di tipo &lt;i&gt;myStruct&lt;/i&gt;&amp;nbsp;corrente, si può quindi accedere ai suoi membri semplicemente usando l&#39;operatore punto.&lt;br /&gt;
Nel caso in cui nella lista fossero stati inseriti i riferimenti alle strutture, l&#39;istruzione &lt;b&gt;(*it)&lt;/b&gt;&amp;nbsp;avrebbe restituito un altro puntatore, cioè un puntatore di tipo &lt;i&gt;myStruct *&lt;/i&gt;.&lt;br /&gt;
In questo caso per accedere all&#39;elemento in esso contenuto si sarebbe dovuto usare l&#39;operatore -&amp;gt; in questo modo:&amp;nbsp;&lt;b&gt;(*it)-&amp;gt;something.&lt;/b&gt;&lt;br /&gt;
Su questo vorrei sottolineare una cosa...se utilizzate Eclipse CDT (io ci sono capitato con Helios), potreste essere tratti in inganno dall&#39;autocompletamento. Se scrivete &lt;b&gt;it-&amp;gt;some&lt;/b&gt;&amp;nbsp;e poi utilizzate l&#39;autocompletamento, questo vi mostrerà comunque &quot;something&quot; o qualsiasi altro elemento della struttura. E&#39; un bug che mi ha fatto perdere un bel po di tempo :-) &lt;br /&gt;
&lt;br /&gt;
Per concludere vediamo ora come accedere agli elementi di un iteratore quando in essi è contenuto un oggetto di tipo class. Come vedremo, è praticamente uguale al caso precedente.&lt;br /&gt;
Ecco il codice di esempio:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;list&amp;gt;

using namespace std;


class Persona {

private:
    string nome;
    string cognome;

public:

    Persona(string nome, string cognome): nome(nome), cognome(cognome){};

    string getNome() { return nome; }
    string getCognome() { return cognome; };
};


int main(int argc, char **argv) {

    list&amp;lt;Persona&amp;gt; l;

    Persona *p1 = new Persona(string(&quot;Ajeje&quot;), string(&quot;Brazorf&quot;));
    Persona *p2 = new Persona(string(&quot;Maccio&quot;), string(&quot;Capatonda&quot;));

    l.push_back(*p1);
    l.push_back(*p2);

    list&amp;lt;Persona&amp;gt;::const_iterator it;
    for(it = l.begin(); it != l.end(); ++it)
        cout &amp;lt;&amp;lt; it-&amp;gt;getNome() &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; it-&amp;gt;getCognome() &amp;lt;&amp;lt; endl;

}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Qui vediamo una semplice classe chiamata &lt;i&gt;Persona&lt;/i&gt;. Ha due variabili istanza che vengono inizializzate nel costruttore e due metodi per accedervi.&lt;br /&gt;
Il procedimento è molto simile agli esempi precedenti, cambia solo il fatto che questa volta la lista conterrà oggetti di tipo Persona.&lt;br /&gt;
Anche l&#39;inizializzazione è uguale all&#39;esempio precedente.&lt;br /&gt;
Quello che cambia è che in questo caso non c&#39;è bisogno di deferenziare l&#39;iteratore per accedere ai metodi dell&#39;oggetto. In questo caso l&#39;iteratore può essere considerato esattamente come un puntatore all&#39;oggetto, dunque può essere usato come tale per accedere ai suoi membri pubblici.&lt;br /&gt;
&lt;br /&gt;
Bene..con questo direi che vi ho annoiati abbastanza e posso chiudere il post :-)&lt;br /&gt;
Spero che qualcuno trovi utili le cose che ho scritto!&lt;br /&gt;
Arrivederci al prossimo post! ^_^&lt;br /&gt;
&lt;span id=&quot;goog_895613266&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_895613267&quot;&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/7053778331261477364/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2010/10/c-liste-e-iteratori.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/7053778331261477364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/7053778331261477364'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2010/10/c-liste-e-iteratori.html' title='C++ liste e iteratori...'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-5672752349631920268</id><published>2010-09-29T14:46:00.000-07:00</published><updated>2010-09-29T14:46:31.983-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CPU"/><category scheme="http://www.blogger.com/atom/ns#" term="Curiosità"/><category scheme="http://www.blogger.com/atom/ns#" term="Hardware"/><category scheme="http://www.blogger.com/atom/ns#" term="Intel"/><title type='text'>Intel e i processori depotenziati</title><content type='html'>Riporto qui un interessante articolo che ho trovato su Hardware Upgrade:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.hwupgrade.it/news/cpu/aggiornare-il-processore-senza-sostituirlo_33790.html&quot;&gt;http://www.hwupgrade.it/news/cpu/aggiornare-il-processore-senza-sostituirlo_33790.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
L&#39;idea è quella di fare un upgrade del processore senza sostituirlo.&lt;br /&gt;
In pratica lo vendono con le strozzature, poi, quando si ha intenzione di aggiornare il pc, si paga un tot per sbloccare tutte le potenzialità della CPU tramite un &quot;upgrade card&quot;...&lt;br /&gt;
A quanto pare questa card aggiunge 1Mb di cache e abilita l&#39;Hyper Threading.&lt;br /&gt;
Non so se prenderà piede questa cosa..mi sembra come vendere una Ferrari che non può superare i 100 km/h :-P&lt;br /&gt;
&lt;br /&gt;
Beh dopo questo mini post spero di finire al più presto il prossimo dove parlerò di qualcosa di più utile e interessante.. purtroppo ci sto mettendo un po per scriverlo ma il tempo purtroppo scarseggia :-)&lt;br /&gt;
&lt;br /&gt;
A presto! ^_^</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/5672752349631920268/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2010/09/intel-e-i-processori-depotenziati.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/5672752349631920268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/5672752349631920268'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2010/09/intel-e-i-processori-depotenziati.html' title='Intel e i processori depotenziati'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4468158452018787386.post-7063303202356464505</id><published>2010-09-25T16:31:00.000-07:00</published><updated>2010-09-26T16:00:31.404-07:00</updated><title type='text'>Benvenuti</title><content type='html'>Benvenuti nel mio blog :)&lt;br /&gt;
&lt;br /&gt;
Da come potete capire dal nome, questo blog si occuperà di programmazione.&lt;br /&gt;
Il nome non sarà molto originale..ma è buona regola dare sempre nomi significativi no? :)&lt;br /&gt;
Intendo trattare svariate tematiche, in particolare dei problemi e cose interessanti che incontro durante la mia esperienza di programmatore, ma anche di argomenti che riguardano l&#39;informatica in generale, curiosità e tutto ciò che suscita il mio interesse.&lt;br /&gt;
&lt;br /&gt;
Inoltre penso che un blog in più che riguarda l&#39;informatica in lingua italiana non guasti mai, soprattutto quando si trattano argomenti avanzati, visto che il 99% delle risorse che si trovano sono in inglese.&lt;br /&gt;
Personalmente considero la conoscenza della lingua inglese fondamentale per un informatico, ma per molti è un bel problema ed inoltre leggere qualche documento in italiano piuttosto che in inglese è sempre più comodo :)&lt;br /&gt;
&lt;br /&gt;
Spero di non aggiornare questo blog troppo raramente e spero che le mie esperienze che condividerò possano essere utili a qualcuno...di sicuro saranno utili a me come ripasso e come diario degli appunti :-P&lt;br /&gt;
&lt;br /&gt;
Beh, non mi resta salutarvi e pensare a scrivere qualcosa per il mio primo post serio!&lt;br /&gt;
Buona lettura! :)</content><link rel='replies' type='application/atom+xml' href='http://aprogrammerblog.blogspot.com/feeds/7063303202356464505/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://aprogrammerblog.blogspot.com/2010/09/benvenuti.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/7063303202356464505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4468158452018787386/posts/default/7063303202356464505'/><link rel='alternate' type='text/html' href='http://aprogrammerblog.blogspot.com/2010/09/benvenuti.html' title='Benvenuti'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>