<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!-- generator="FeedCreator 1.7.2" --><rss version="2.0">
    <channel>
        <title>RainbowBreeze</title>
        <description />
        <link>http://www.rainbowbreeze.it</link>
        <lastBuildDate>Mon, 13 Jul 2009 05:10:13 +0000</lastBuildDate>
        <generator>FeedCreator 1.7.2</generator>
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/RainbowBreeze" type="application/rss+xml" /><item>
            <title>ComInterop in C# e VB.NET</title>
            <link>http://www.rainbowbreeze.it/cominterop-in-c-e-vb.net-2.html</link>
            <description><![CDATA[<p>
<b>Creazione del progetto .NET di base</b>
</p>
<p>
Dopo <a href="index.php?option=com_content&amp;task=view&amp;id=142&amp;Itemid=107" target="_self">essersi letti un po' di teoria</a>,  passiamo alla realizzazione di una vera classe C# da utilizzare all'interno di un programma VB6.
</p>
<p>
Come specificato nel post precedente, se si utilizza VB.NET c'e' gia' un template di progetto pronto per l'interoperabilita'. Utilizzando invece C# (o VB.NET con Visual Studio 2008) occorre farsi le cose a manina. Di seguito uno snippet di codice per creare la classe di base.
</p>
<p>
<i>using System;      <br />
using Microsoft.VisualBasic; </i>
</p>
<p>
<i>namespace TestRegistazioneCom      <br />
{       <br />
&nbsp;&nbsp;&nbsp; [ComClass(TestComInterop.ClassId, TestComInterop.InterfaceId, TestComInterop.EventsId)]       <br />
&nbsp;&nbsp;&nbsp; public class TestComInterop       <br />
&nbsp;&nbsp;&nbsp; {       <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public const string ClassId = &quot;233D23FD-68C0-4da6-9749-8E137127692F&quot;;       <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public const string InterfaceId = &quot;6ACCBB64-3A0A-46ee-B8F8-9537CEBF2136&quot;;       <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public const string EventsId = &quot;B6A186AB-6212-4ab1-B998-7F471C5AE94B&quot;; </i>
</p>
<p>
<i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public TestComInterop()      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {       <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </i>
</p>
<p>
<i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string GetName()      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {       <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;RainbowBreeze&quot;;       <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }       <br />
&nbsp;&nbsp;&nbsp; }       <br />
}</i>
</p>
<p>
I GUID (quelle lunghe stringe di numeri) vanno cambiati e messi nuovi, magari utilizzando il GUID Generator di Visual Studio (<i>Tools -&gt; Create Guid</i>)
</p>
<p>
&nbsp;
</p>
<p>
<b></b>
</p>
<p>
<b>Configurazione del progetto .NET per l'interoperabilita'</b>
</p>
<p>
Andare nelle proprieta' del progetto, tab <b>Application</b>, bottone <b>Assembly Information</b>
</p>
<p>
<b>Title</b>: il titolo dell'assembly, viene messo in HKEY_CLASSES_ROOT ed e' quello che apparira' come nome della libreria creata     <br />
<b>Description</b>: la descrizione che apparira' dentro VB6 quando si andranno ad aggiungere nuove reference     <br />
<b>Version</b>: la versione con cui la libreria .NET viene registrata     <br />
<b>GUID</b>: il GUID utilizzato per registrare l'oggetto all'interno del registry (HK_CR\TypeLib\). Viene generato automaticamente e deve essere univoco per non sovrapporsi ad altri GUID di altre librerie registrate nel sistema     <br />
<b>Make Assembly COM-visible</b>: va flaggata questa opzione
</p>
<p>
&nbsp;
</p>
<p>
<b>Registrazione della nuova DLL nel sistema</b>
</p>
<p>
Se nelle proprieta' del progetto .NET, tab Build, viene impostata la voce &quot;<b>Register for Com Interop</b>&quot;,
quando il progetto viene compilato, Visual Studio pensa anche a
generare il relativo tlb (un proxy per VB6 necessario
all'interoperabilita') e registrarlo all'interno del sistema. Se questo
puo' sembrare un comodo automatismo, in realta'&nbsp; va bene solo per la
macchina di sviluppo, dato che il tlb viene generato all'interno della
cartella <i>bin\debug</i> o <i>bin\release</i> del progetto e registrato in quel percorso.
</p>
<p>
Nella
macchina di deploy, occorre registrare manualmente il tlb generato, per
mezzo del comando <i>regasm.exe</i>: copiare la dll .NET nella cartella dove
andra' a finire in maniera definitiva, e poi eseguire il comando regasm
per generare il tlb e registrarlo nel sistema. Ponendo che la classe da
registrare si chiami <i>TestRegistrazioneCom.dll</i>, la sintassi del regasm sara':
</p>
<p>
<i>regasm TestRegistrazioneCom.dll /tlb:TestRegistrazioneCom.tlb</i>
</p>
<p>
Come
ultimo passo, occorre registrare la DLL .NET della GAC (Global Assembly
Cache), in modo che il tlb sappia chi chiamare quando i suoi metodi
vengono invocati. In alternativa, si puo' anche lasciare la dll .NET nella stessa cartella dell'eseguibile VB6, senza bisogno di registrazioni nella GAC. 
</p>
<p>
&nbsp;
</p>
<p>
<b>Utilizzi avanzati</b>
</p>
<p>
Se
si vuole costruire una nuova classe .NET che deve pero' mantenere la
compatibilita' con un precedente oggetto COM, andandolo a sostituire in
maniera trasparente alle applicazioni che lo utilizzano, si puo' agire
sul GUID e sul Title del nuovo progetto .NET, impostandoli come quelli
della classe da sostituire. Occorrera' poi accertarsi che anche i
metodi esposti siano gli stessi. Con questa attenzione, basta
deregistrare la vecchia libreria VB6 e registrare la nuova libreria .NET
e tutto dovrebbe andare.
</p>
<p>
Altre guide che parlano della COM
Interop, invece di registrare direttamente la classe .NET concreta,
<a href="http://www.codeproject.com/KB/vb-interop/csCom.aspx" target="_blank" title="CodeProject.com - C# Com">registrano un'interfaccia</a>, che poi la classe .NET va ad implementare.
Mi sembra una soluzione piu' pulita, ma alla fine ogni soluzione ha il
suo contesto corretto.
</p>
<p>
&nbsp;
</p>
<p>
References:<br />
<a href="http://www.codeproject.com/KB/vb-interop/VB6InteropToolkit2.aspx" target="_blank" title="Interop Forms Toolkit 2.0 Tutorial">Interop Forms Toolkit 2.0 Tutorial</a> - assolutamente da leggere <br />
<a href="http://www.codeproject.com/KB/vb-interop/" target="_blank" title="VB6 Interop - Bringing VB6 into the .NET fold">VB6 Interop - Bringing VB6 into the .NET fold</a><br />
<a href="http://www.codeproject.com/KB/vb-interop/UsingDotNETControlsInVB6.aspx" target="_blank" title="Using .NET Controls in VB6">Using .NET Controls in VB6</a> <br />
</p>
]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Fri, 10 Jul 2009 23:00:00 +0000</pubDate>
        </item>
        <item>
            <title>Scrolling con la mouse wheel in VB6</title>
            <link>http://www.rainbowbreeze.it/scrolling-con-la-mouse-wheel-in-vb6-2.html</link>
            <description><![CDATA[<p>
<img src="images/blog/2009-images/vb6.jpg" alt="vb6.jpg" title="vb6.jpg" style="border: 0px solid #000000; margin: 2px 4px; float: left; width: 200px; height: 153px" width="200" height="153" />
Se, alle soglie del web semantico e del <i>Software As A Service</i>, siete ancora alle prese con lo sviluppo in Visual Basic 6, allora avrete sicuramente un mouse con rotella di scorrimento che non vi funzionera'&nbsp; all'interno dell'IDE (<i>oltre che la necessita' di fare un punto della situazione della vostra vita al piu' presto</i>).
</p>
<p>
Fortunatamente qualcuno ha avuto compassione di voi e ha realizzato un programmino che risolve il problema:   <br />
Dalla KB Microsoft: <a href="http://support.microsoft.com/kb/837910" title="Mouse wheel events do not work in the Visual Basic 6.0 IDE">Mouse wheel events do not work in the Visual Basic 6.0 IDE</a>    <br />
E dall'autore del programma: <a href="http://www.joebott.com/vb6scrollwheel.htm" title="Scroll Wheel Fix for VB6">Scroll Wheel Fix for VB6</a>
</p>
<p>
Vi sentite gia' meglio, vero? Si, pero' continuate a riflettere sul fatto che state ancora usando VB6. Oggi siamo nel 2009, VB6 si installava da dischetti, neanche tanti poi!
</p>
]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Thu, 18 Jun 2009 16:49:00 +0000</pubDate>
        </item>
        <item>
            <title>Android Developer Challenge 2, proviamo?</title>
            <link>http://www.rainbowbreeze.it/android-developer-challenge-2-proviamo-3.html</link>
            <description><![CDATA[<p><img title="android_adc.png" style="border-right: #000000 0px solid; border-top: #000000 0px solid; float: left; margin: 2px 4px; border-left: #000000 0px solid; width: 232px; border-bottom: #000000 0px solid; height: 54px" height="54" alt="android_adc.png" src="images/blog/2009-images/android_adc.png" width="232" />Google ha lanciato per la seconda volta il suo <a title="Android Developer Challenge" href="http://code.google.com/android/adc/">Android Developer Challenge</a>, una competizione aperta a (quasi) tutti gli sviluppatori del mondo per realizzare applicazioni per il sistema operativo Android, dove verranno premiate le migliori 3 per ogni categoria prevista. Ne ho parlato <a title="Android Developer Challenge 2" href="http://www.onemobile.it/03/06/2009/android-developer-challenge-2/">anche qui</a>. </p>  <p>Io una mezza idea da presentare per categoria social network ce l'avrei pure. E' ormai un annetto che mi interesso a questo specifico settore e le persone a cui ne ho gia' parlato, generalmente, hanno espresso un'impressione positiva su quando ho condiviso con loro. Ho in mente qualcosa che ha a che fare con lo scraping delle informazioni, funzioni semplificate e cross-social network, un po' di sano &quot;pimp my address book&quot;, dati e relazioni semantiche. </p>  <p>Solo che mi serve una mano perche' in due mesi la vedo dura realizzare tutto da solo: client per Android, backend e un'interfaccia degna di questo nome. </p>  <p>Se hai voglia di darmi una mano e hai competenze nel mobile design, nella progettazione di interfacce, nella programmazione in php, .net, java, nell'architettura del sofware, allora magari sentiamoci nella skypechat che sto cercando di organizzare per la settimana prossima. <a href="http://www.doodle.com/3qtqxhsfurqxrz5w">http://www.doodle.com/3qtqxhsfurqxrz5w</a> . Il mio account skype e' alfredo.morresi. </p>  <p>A scanso di equivoci, preciso subito che il progetto sara' portato avanti seguendo un approccio open-source e tipicamente comunitario alla cosa. Se partecipo all'ADC2, lo faccio principalmente spinto dalla passione e dalla voglia di misurarmi con qualcosa di nuovo ed altamente stimolante. Non c'e' un fine di lucro quindi dietro. Ma chi puo' saperlo, se son rose, potrebbero anche fiorire, prima o poi. Di sicuro c'e' un sostanzioso premio da spartire ;) </p>  <p>Puoi anche passare semplicemente a sentire cosa si dice, la presenza non porta a nessun vincolo ;) </p>]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Fri, 05 Jun 2009 16:25:00 +0000</pubDate>
        </item>
        <item>
            <title>Trenitalia e i treni con lo scatto alla risposta</title>
            <link>http://www.rainbowbreeze.it/trenitalia-e-i-treni-con-lo-scatto-alla-risposta-2.html</link>
            <description><![CDATA[<p>
<a href="index.php?option=com_content&amp;task=view&amp;id=198&amp;Itemid=97" target="_self" title="Il sito di Trenitalia non aiuta il consumatore">Anche se non sembra</a>, io non ce l'ho per partito preso con Trenitalia, lo dico a scanso di equivoci. Pero' proprio non posso tollerare, o per lo meno tacere visto che non ci sono alternative praticabili, davanti a certe cose di cui mi accorgo:
</p>
<p>
<b>Bologna - Civitanova Marche</b>, viaggio per il pomeriggio del 7 Giugno
</p>
<img src="images/blog/2009-images/costominutotreni01.png" alt="costominutotreni01.png" title="costominutotreni01.png" style="border: 0px solid #000000; margin: 2px 4px; width: 500px; height: 274px" align="bottom" height="274" width="500" />
<p>
Intercity 715 Manin, costo viaggio in seconda classe <b>23.00 euro</b>, per un totale di <b>2:58 ore</b> di percorrenza. 
</p>
<p>
<b>Ancona - Civitanova Marche</b>, viaggio sempre per il 7 Giugno, stessa fascia oraria
</p>
<p>
<img src="images/blog/2009-images/costominutotreni02.png" alt="costominutotreni02.png" title="costominutotreni02.png" style="border: 0px solid #000000; margin: 2px 4px; width: 490px; height: 249px" align="bottom" height="249" width="490" /> <br />
</p>
<p>
Intercity 715 Manin, costo viaggio in seconda classe <b>8.00 euro</b>, per un totale di <b>28 minuti</b> di percorrenza.
</p>
<p>
Con una semplice divisione, ci si accorge subito che il prezzo al minuto dello stesso treno preso da Bologna e' di <b>0.13 euro</b>, mente preso da Ancona e' di <b>0.29 euro</b>.
Piu' del doppio, e non capisco perche' deve essere cosi': il treno e'
lo stesso, la fermata la fa lo stesso, il personale necessario e'
sempre lo stesso... Insomma, perche' il costo deve essere cosi'
diverso? 
</p>
<p>
Che c'e' lo scatto alla risposta quando salgo in treno? 
</p>
]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Fri, 05 Jun 2009 07:30:09 +0000</pubDate>
        </item>
        <item>
            <title>Da float a stringhe binarie e viceversa con T-SQL</title>
            <link>http://www.rainbowbreeze.it/da-float-a-stringhe-binarie-e-viceversa-con-t-sql-3.html</link>
            <description><![CDATA[<p>
Potrebbe capitare l'esigenza di dover convertire dei float in stringa, ad esempio per memorizzare dei nuovi dati numerici nei campi stringa lasciati liberi in un db legacy, le cui tabelle non possono per nessun motivo essere estese o modificate.
</p>
<p>
La soluzione piu' semplice e' <b>memorizzare i numeri all'interno del campo stringa nella loro rappresentazione numerica</b>. Ad esempio, se devo memorizzare due numeri     <br />
123,4567 e 234,5678     <br />
e considerando almeno 10 caratteri per numero, la corrispondente stringa sar&Atilde;&nbsp;     <br />
&quot;&nbsp; 123,4567&nbsp; 234,5678&quot;     <br />
Per la riconversione al valore originario, leggo la stringa a blocchi da 10 caratteri e la trasformo. Semplice, veloce e leggibile anche ad occhio nudo.
</p>
<p>
Ma questa non sempre non e' la soluzione praticabile se lo spazio che si ha a disposizione e' poco e se i valori dei numeri devono essere preservati nell'interezza del loro range di valori.
</p>
<p>
Prendiamo il caso&nbsp; che debba memorizzare 30 quantita' e 30 prezzi, con un dato di tipo float, per un articolo che ha una scala taglie, come una scarpa, un capo di abbigliamento o altro prodotto fashion.
</p>
<p>
Se usassi la rappresentazione numerica dei valori, e considerando almeno 16 cifre per ogni numero (virgola compresa), avrei bisogno di (30 + 30) * 16 = 960 byte. <b>Memorizzando invece nella stringa la rappresentazione binaria di valori</b>, necessiterei di (30 + 30) * 8 = 480 byte (il float occupa 8 byte). Certo, i dati avrebbero bisogno di una conversione apposita prima di essere trattati e sarebbero illeggibili &quot;ad occhio nudo&quot;, ma risparmierei la meta' dello spazio!
</p>
<p>
Tutto dipende dai casi, ma per quei vecchi db dove ci sono magari 500 caratteri a disposizione per le ulteriori personalizzazione utente, questo giochetto ha preservato la mia sanita' mentale. ;)
</p>
<p>
Memorizzare la rappresentazione binaria di un float in una stringa
non e' difficile: ci pensano la funzione CAST e il tipo BINARY 
</p>
<pre>
<pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff">
<a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=CAST&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99" style="color: #0000ff">CAST</a>( <a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=CAST&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99" style="color: #0000ff">CAST</a>(@number <a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=AS&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99" style="color: #0000ff">AS</a> <a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=BINARY&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99" style="color: #0000ff">BINARY</a>(8)) <a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=AS&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99" style="color: #0000ff">AS</a> <a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=CHAR&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99" style="color: #0000ff">CHAR</a>(8))
</pre>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</pre>
<p>
In pratica, prima casto il numero come binario da 8 byte, e poi ricasto il risultato da binario in una stringa di 8 caratteri.
</p>
<p>
Piu' complessa e' invece l'operazione inversa, ovvero ritrasformare in float la stringa precedentemente ottenuta. <a href="http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81849" title="Convert a binary float to FLOAT datatype">Qui maggiori informazioni</a>.
</p>
<p>
Alla fine, ho 2 funzioni che fanno la conversione/riconversione:
</p>
<p>
<b>Da float a stringa compressa</b>
</p>
<p>
<i>CREATE FUNCTION [dbo].[fnFloatToCompressedString](@number FLOAT)
<br />
RETURNS CHAR(8)
<br />
AS
<br />
BEGIN
<br />
RETURN CAST( CAST(@number AS BINARY(8)) AS CHAR(8))
<br />
END</i>
</p>
<p>
<b>Da stringa compressa a float</b>
</p>
<p>
<i>CREATE FUNCTION [dbo].[fnCompressedStringToFloat](@number CHAR(8))
<br />
&nbsp;&nbsp;&nbsp; RETURNS FLOAT
<br />
AS
<br />
BEGIN
<br />
&nbsp;&nbsp;&nbsp; DECLARE
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @BinaryFloat BINARY(8) </i>
</p>
<p>
<i>&nbsp;&nbsp;&nbsp; SET @BinaryFloat = CAST(@number AS BINARY(8)) </i>
</p>
<p>
<i>&nbsp;&nbsp;&nbsp; RETURN&nbsp;&nbsp;&nbsp; SIGN(CAST(@BinaryFloat AS BIGINT))
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * (1.0 + (CAST(@BinaryFloat AS BIGINT) &amp; 0x000FFFFFFFFFFFFF) * POWER(CAST(2 AS FLOAT), -52))
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * POWER(CAST(2 AS FLOAT), (CAST(@BinaryFloat AS BIGINT) &amp; 0x7ff0000000000000) / 0x0010000000000000 - 1023)
<br />
END</i>
</p>
<p>
E concludo con un grazie ad <a href="http://www.nablasoft.com/alkampfer/" title="Alkampfer's Place">Alk</a> per i suggerimenti!
</p>
]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Mon, 25 May 2009 08:01:00 +0000</pubDate>
        </item>
        <item>
            <title>Hacking facili facili grazie ai motori di ricerca</title>
            <link>http://www.rainbowbreeze.it/hacking-facili-facili-grazie-ai-motori-di-ricerca-2.html</link>
            <description><![CDATA[<p>Partendo da un <a href="http://twitter.com/robconery/status/1857478718" target="_blank">tweet</a> di <a title="Rob Conery on Twitter" href="http://twitter.com/robconery" target="_blank">robconery</a> che mostra quanto sia facile bucare database grazie alla sbadataggine di qualche sviluppatore, ho fatto un po' di prove e ho esteso il concetto.</p>  <p>&#160;</p>  <p>Ottenere la password di sa e tutti gli altri dati necessari per connettersi ad un db (molti risultati riportano db locali, ma basta spulciarseli per trovare gradite sorprese)</p>  <p><a title="http://google.com/codesearch?q=sa+connectionstring+file%3Aweb.config" href="http://google.com/codesearch?q=sa+connectionstring+file%3Aweb.config">http://google.com/codesearch?q=sa+connectionstring+file%3Aweb.config</a>    <br /><a title="http://google.com/codesearch?q=sa+connectionstring+file:app.config" href="http://google.com/codesearch?q=sa+connectionstring+file:app.config">http://google.com/codesearch?q=sa+connectionstring+file:app.config</a></p>  <p>Se poi vi interessano username le password in generale:</p>  <p><a title="http://google.com/codesearch?q=password+connectionstring+file%3Aapp.config" href="http://google.com/codesearch?q=password+connectionstring+file%3Aweb.config">http://google.com/codesearch?q=password+connectionstring+file%3Aweb.config</a>    <br /><a title="http://google.com/codesearch?q=password+connectionstring+file%3Aapp.config" href="http://google.com/codesearch?q=password+connectionstring+file%3Aapp.config">http://google.com/codesearch?q=password+connectionstring+file%3Aapp.config</a></p>  <p>&#160;</p>  <p>Qualche phpMyAdmin aperto senza nessuna protezione, e con l'utente root configurato puo' fare sempre comodo:</p>  <p><a title="http://www.google.it/search?q=&quot;running+on+localhost+as+root&quot;+intitle%3Aphpmyadmin" href="http://www.google.it/search?q=&quot;running+on+localhost+as+root&quot;+intitle%3Aphpmyadmin">http://www.google.it/search?q=&quot;running+on+localhost+as+root&quot;+intitle%3Aphpmyadmin</a></p>  <p>Se poi non si e' interessati all'account di root ma solo ad un generico account, basta modificare la query. Magari anche altri accout hanno ottimi permessi di accesso:</p>  <p><a title="http://www.google.it/search?q=&quot;running+on+localhost+as+root&quot;+intitle%3Aphpmyadmin" href="http://www.google.it/search?q=&quot;running+on+localhost+as&quot;+intitle%3Aphpmyadmin">http://www.google.it/search?q=&quot;running+on+localhost+as&quot;+intitle%3Aphpmyadmin</a></p>]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Wed, 20 May 2009 12:50:00 +0000</pubDate>
        </item>
        <item>
            <title>Mozilla Prism, un alleato per la propria privacy online</title>
            <link>http://www.rainbowbreeze.it/mozilla-prism-un-alleato-per-la-propria-privacy-online-3.html</link>
            <description><![CDATA[<p>
<img src="images/blog/2009-images/icon_prism.gif" alt="Mozilla Prism" title="Mozilla Prism" style="border: 0px solid #000000; margin: 2px 4px; float: left; width: 100px; height: 100px" width="100" height="100" />
Ho provato <a href="http://prism.mozilla.com/" title="Prism" target="_blank">Prism</a>, il nuovo prodotto dei <a href="http://labs.mozilla.com" title="Mozilla Labs" target="_blank">Mozilla Labs</a>, che permette di &quot;staccare&quot; un sito dal proprio browser e eseguirlo come se fosse una vera e propria applicazione, in un contesto separato.
</p>
<p>
Devo dire che, nonostante il programma sia nella sua prima versione beta (<i>anche se, con il Web 2.0, il concetto di beta e' andato ormai perso</i>), sono stato piacevolemente impressionato dalla facilita' di configurazione e dai risultati ottenuti.
</p>
<p>
Uno degli utilizzi a mio avviso interessante di Prism e' quello per la tutula della propria privacy online. Prendiamo il mio caso: al lavoro tengo aperta, nella prima scheda del browser, la mia casella email su GMail. In tutte le altre tab si svolge invece il mio quotidiano uso della rete: ricerca, navigazione, uso di servizi ecc.
</p>
<p>
Tenendo aperta la posta, in tutte queste operazioni Google puo'
raccoglie molti dati che mi riguardano. Tramite i suoi annunci
pubblicitari sparsi un po' ovunque tiene a mente i siti che visito,
impara le mie abitudini dalle ricerche che faccio, dai video che
guardo, in tutte le attivita' dove i suoi servizi arrivano. Tutto
questo grazie al cookie installato nel mio browser, necessario al
corretto funzionamento di GMail.
</p>
<p>
Ora, non e' che questo mi
importi particolarmente, altrimenti eviterei di usare la posta di
GMail, oppure aprirei un'altra istanza del browser, oppure userei un
client di posta. Insomma, le soluzioni sono tante, ma e' cosi' per fare
un esempio chiarificatore.
</p>
<p>
Grazie a Prism, apro la posta in
un'applicazione separata, quindi niente cookie di Google nella mia
navigazione principale. Poi per quest'ultima ci pensa Firefox, ogni
volta che lo chiudo, a ripulire tutto quello che ho raccolto in giro.
</p>
<p>
Semplice e veloce ;)
</p>
]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Wed, 20 May 2009 07:30:00 +0000</pubDate>
        </item>
        <item>
            <title>SourceForge, CodePlex, GoogleCode e GitHub: quale scegliere?</title>
            <link>http://www.rainbowbreeze.it/sourceforge-codeplex-googlecode-e-github-quale-scegliere-3.html</link>
            <description><![CDATA[<p>
Stimolato da una recente conversazione con <a href="http://www.linkedin.com/in/lorenzomassacci" title="Lorenzo Massacci" target="_blank">Lorenzo</a>, ho iniziato seriamente a cercare un code repository dove appoggiare i progetti open-source che di tanto in tanto sviluppo.
</p>
<p>
Di alternative per l'SCM (<i>Source Code Management</i>) ce ne sono diverse, e quelle che ho preso in considerazione sono state: <a href="http://www.codeplex.com" title="CodePlex" target="_blank">CodePlex</a>, <a href="http://code.google.com" title="GoogleCode" target="_blank">GoogleCode</a>, <a href="http://www.sourceforge.net" title="SourceForge" target="_blank">SourceForge</a>, <a href="http://www.github.com" title="GitHub" target="_blank">GitHub</a>. 
</p>
<p>
Alla fine, per ospitare i miei progetti, ho scelto SourceForge, nonostante i pessimi diritti che si arroga sul codice che ospitero' nei loro server e l'indecisione, fino all'ultimo, con GitHub. Motivazioni principali l'ottima molto orientata allo sviluppatore nei servizi offerti (l'rsync per fare il mirror del repository e' fantastico), l'ampio numero di SCM e DSCM supportati, la grande disponibilita' di client nei principali IDE per gestire Subversion&nbsp; e nonostante abbia influito in maniera impercettibile, il fatto che e' il suo nome e' stato, da sempre, sinonimo per l'hosting per progetti open source.
</p>
<p>
Se dovessi fare pero' qualcosa in azienda, non ci penserei due volte a metter su un server con Git e tutto il resto, interfacce web ai progetti comprese.
</p>
<p>
Di seguito riporto le mie considerazioni personali su ognuno dei servizi esaminati, magari potrebbero tornare utili a qualcuno.
</p>
<br />
<p>
<b>CodePlex</b>
</p>
<p>
Made in Microsoft, la scelta e' quasi scontata se si vogliono ospitare applicazioni realizzate per questo ambiente. <a href="http://www.codeplex.com/Legal/Terms.aspx" title="CodePlex Terms of Use" target="_blank">Qui i termini del servizio</a> che governano il tutto.
</p>
<p>
Pro
</p>
<ul>
	<li>Startup
	del progetto facile e veloce, con una fase di creazione dietro le
	quinte e successiva pubblicazione (entro 30 giorni) di quanto fatto.</li>
	<li>Viene
	offerto un servizio di donwload delle release del programma, un forum,
	un Issues tracker e feed RSS per ognuna delle sezioni del progetto.</li>
	<li>Il codice puo' essere gestito via Subversion e Team Foundation Server.</li>
	<li>Approfondito
	controllo dei ruoli e dei permessi alle varie sezioni e azioni
	possibile nel contesto del progetto, che arrivano a gestire, ad
	esempio, chi puo' aprire un nuovo ticket oppure creare una nuova
	release del programma.</li>
	<li>Supporto agli strumenti di Continuous Integration come CruiseControl.NET.</li>
	<li>Presenti
	alcune funzionalita' di community sull'intero sito, come i progetti
	piu' scaricati, una newsletter con le novita' ed altro.</li>
	<li>Pochi i diritti che Microsoft si prende sul codice caricato (il grassetto e' mio): &quot;<i>However,
	by posting, uploading, inputting, providing or submitting (&quot;Posting&quot;)
	your Submission you understand and agree that you're giving a license
	under your intellectual property rights to all authorized users,
	including the rights to download, copy, modify, distribute and repost,
	unless the project licenses specify otherwise. <b>In addition, you're
	giving Microsoft all the necessary rights to make your Submission(s)
	available on this site and to make improvements to the CodePlex site
	based on your suggestions</b></i>&quot;</li>
	<li>&quot;<i>Microsoft is hosting the CodePlex site solely as a web storage site as a service to the developer community.</i>&quot;.
	L'unica che ha messo per iscritto una cosa del genere. Negli altri
	servizi analizzati, il perche' il servizio e' stato realizzato non
	viene mai esplicitato.</li>
</ul>
<p>
Contro
</p>
<ul>
	<li>La licenza GPL v3 non e' ancora supportata.</li>
	<li>Ha solo il supporto a Subversion e Team Foundation Server.</li>
</ul>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<p>
<b>GoogleCode</b>
</p>
<p>
Tra la miriade di servizi offerti da Google, questi i <a href="http://code.google.com/tos.html" title="Google Code TOS" target="_blank">termini del servizio</a>.
</p>
<p>
Pro
</p>
<ul>
	<li>Startup facile e veloce.</li>
	<li>Viene
	offerto nativamente il servizio di donwload delle release del
	programma, un Wiki e un Issues Tracker, e la possibilita' di agganciare
	al progetto una mailing list aperta su Google Groups e le statistiche
	di Analitycs.Il codice puo' essere gestito via Subversion.</li>
	<li>Posso scegliere anche la GPL v3 come tipo di licenza.</li>
	<li>La policy sulla concessione dei diritti sui contenuti pubblicati e', secondo me, accettabile (<i>il grassetto e' mio</i>): <i>&quot;By
	submitting, posting or displaying Content on or through Google services
	which are intended to be available to the members of the public, <b>you
	grant Google a worldwide, non-exclusive, royalty-free license to
	reproduce, adapt, modify, publish and distribute such Content on Google
	services for the purpose of displaying, distributing and promoting
	Google services</b>.&quot;</i></li>
</ul>
<p>
Contro
</p>
<ul>
	<li>Ha solo il supporto a Subversion.</li>
	<li>Il cambio dei termini del servizio puo' essere notificato &quot;<i>by email, regular mail, or postings on Google services</i>&quot;.
	Quindi potrebbero cambiare e dovrei essere io ad andare a controllare
	regolarmente questi termini per vedere se c'&Atilde;&uml; stata qualche modifica,
	senza ricevere nessuna forma di notifica diretta.</li>
	<li>Il mio
	codice non sara' accessibile da Cuba, Iran, Libya, North Korea, Sudan e
	Syria e tutti gli altri paesi sanzionati dallo United States Office of
	Foreign Assets Control.</li>
</ul>
<p>
&nbsp;
</p>
<p>
<b>GitHub</b>
</p>
<p>
Strumento
di grido per quanto riguarda progetti open source (l'ultimo che e'
stato migrato a questo sistema e' stato quello relativo alle librerie
QT). <a href="http://github.com/site/terms" title="GitHub Terms of Service" target="_blank">Qui i termini del servizio</a>.
</p>
<p>
Pro
</p>
<ul>
	<li>E' un <b>DSCM</b> (<i>Distributed Source Code Management</i>), quindi permette di avere un SCM locale che si va a sincronizzare con un SCM su un server centralizzato.</li>
	<li>Pagando qualcosina (a partire da 7 dollari al mese) si possono avere repository privati, oltre che pubblici.</li>
	<li>Viene
	offerto un servizio di donwload delle release del programma, un Issues
	tracker, un wiki, la lista di tutti gli ultimi commit del progetto e
	un'integrazione per le donazioni fatte al progetto.</li>
	<li>Il sito &Atilde;&uml; molto ben fatto ed incentrato sulla caratteristica tipicamente collaborativa e di community che hanno i DSCM.</li>
	<li>Non sembrano esserci particolari diritti garantiti a Logical Awesome LLC riguardo al codice ospitato su GitHub.</li>
</ul>
<p>
Contro
</p>
<ul>
	<li>Per
	gli account gratuiti, lo storage non pu&Atilde;&sup2; eccedere i 300 Mb, anche se,
	da quanto scritto nella pagine con la politica di pricing, &quot;<i>The
	300MB is a soft limit setup to prevent abuse of the service. If your
	open source project needs more space, email us, we're happy to provide
	it.</i>&quot;</li>
	<li>C'e' un limite di utilizzo di banda di 500 Mb al
	mese, oltre i quali il servizio puo' essere sospeso a loro discrezione.
	Quando questo consumo rientrera' nelle medie da loro stabilite, il
	servizio sara' riabilitato.</li>
</ul>
<p>
&nbsp;
</p>
<p>
<b>SouceForge</b>
</p>
<p>
Lo
storico repository per progetti opensource, nato prima di tutti gli
altri e che continua a godere di vita lunga e prosperosa, con un
recente restyle grafico che l'ha reso anche abbastanza carino da
vedere. <a href="http://p.sf.net/sourceforge/terms" title="SourceForge Terms of Use" target="_blank">Qui le condizioni di utilizzo</a>, che prevedono un avviso per email in caso di modifiche.
</p>
<p>
Pro
</p>
<ul>
	<li>Il
	codice puo' essere gestito via Subversion, CVS, Git, Mercurial, Bazaar
	e possono essere abilitarli/disabilitarli in qualunque momento.</li>
	<li>Posso effettuare backup via rsync dell'intero repository, contro eventuali perdite di dati da parte di SourceForge.</li>
	<li>SourceForge &Atilde;&uml; una vera community: statistiche sui progetti piu' attivi, nomination sui migliori progetti e molto altro.</li>
	<li>Possibilita'
	di accettare donazioni direttamente dal sito di SourceForge, anche se
	in questo caso una piccola percentuale la terranno loro.</li>
</ul>
<p>
Contro
</p>
<ul>
	<li>Ogni
	progetto che si vuole creare deve passare per l'approvazione del team
	di SourceForge, che potrebbe anche riservarsi il diritto di bocciarlo a
	sua discrezione. In generale, da quando viene spedita la richesta di
	approvazione, passano come minimo 2-3 giorni lavorativi prima di avere
	una risposta.</li>
	<li>La policy sui contenuti pubblicati sono tra le piu' pessime che ho visto (il grassetto e' mio): <i>&quot;By submitting, posting or displaying Content on or through SourceForge.net, you grant Sourceforge, Inc. a <b>worldwide,
	non-exclusive, irrevocable, perpetual, fully sublicensable,
	royalty-free license to use, reproduce, adapt, modify, translate,
	create derivative works from, publish, perform, display, rent, resell
	and distribute such Content (in whole or part)</b> on SourceForge.net
	and incorporate Content in other works, in any form, media, or
	technology developed by Sourceforge, Inc., though Sourceforge, Inc. is
	not required to incorporate Feedback into any Sourceforge, Inc.
	products or services&quot;.</i> Se non ho capito male, <b>possono rivendere il mio lavoro</b>, anche se continuo a conservarne la paternita'.</li>
	<li>La licenza GPL v3 non e' ancora supportata.</li>
	<li>Il
	mio codice non sara' accessibile da Cuba, Iran, Libya, North Korea,
	Sudan e Syria e tutti gli altri paesi sanzionati dallo United States
	Office of Foreign Assets Control.</li>
</ul>
]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Mon, 18 May 2009 14:46:00 +0000</pubDate>
        </item>
        <item>
            <title>Pecore, pastori e LED: cosa si puo' fare!</title>
            <link>http://www.rainbowbreeze.it/pecore-pastori-e-led-cosa-si-puo-fare.html</link>
            <description><![CDATA[<p>
Video divertentissimo su quello che alcuni pastori sono riusciti a realizzare con le loro pecore e l'aiuto dei cani. Coreografie viventi davvero notevoli!
</p>
<p align="center">
<object height="340" width="560">
	<param name="movie" value="http://www.youtube.com/v/D2FX9rviEhw&amp;hl=it&amp;fs=1">
	</param>
	<param name="allowFullScreen" value="true">
	</param>
	<param name="allowscriptaccess" value="always">
	</param>
	<embed src="http://www.youtube.com/v/D2FX9rviEhw&amp;hl=it&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="340" width="560"></embed>
</object>
</p>
]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Tue, 05 May 2009 21:08:06 +0000</pubDate>
        </item>
        <item>
            <title>Augmenter Reality: una carrellata di idee per il mobile</title>
            <link>http://www.rainbowbreeze.it/augmenter-reality-una-carrellata-di-idee-per-il-mobile-3.html</link>
            <description><![CDATA[<p>Le immagini sono sempre meglio di mille parole, quindi ecco una bella carrellata di video sull'argomento: </p>  <p align="center"><object height="344" width="425"> 	<param name="movie" value="about:blank"> 	</param> 	<param name="allowFullScreen" value="true"> 	</param> 	<param name="allowscriptaccess" value="always"> 	</param> 	<embed src="http://www.youtube.com/v/0HOO80RitVI&amp;hl=it&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed> </object></p>  <p align="center"><object height="344" width="425"> 	<param name="movie" value="about:blank"> 	</param> 	<param name="allowFullScreen" value="true"> 	</param> 	<param name="allowscriptaccess" value="always"> 	</param> 	<embed src="http://www.youtube.com/v/65AAKCnHrTc&amp;hl=it&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed> </object></p>   <p align="center"><object height="344" width="425"> 	<param name="movie" value="about:blank"> 	</param> 	<param name="allowFullScreen" value="true"> 	</param> 	<param name="allowscriptaccess" value="always"> 	</param> 	<embed src="http://www.youtube.com/v/WR2cvkNcZ9s&amp;hl=it&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed> </object></p>  <p align="center"><object height="344" width="425"> 	<param name="movie" value="about:blank"> 	</param> 	<param name="allowFullScreen" value="true"> 	</param> 	<param name="allowscriptaccess" value="always"> 	</param> 	<embed src="http://www.youtube.com/v/T4FAKjfppp0&amp;hl=it&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed> </object></p>  <p align="center">Wikitude AR Travel Guide (Android)</p>  <p align="center"><object height="344" width="425"> 	<param name="movie" value="http://www.youtube.com/v/tpaJBu4BEuA&amp;hl=it&amp;fs=1"> 	</param> 	<param name="allowFullScreen" value="true"> 	</param> 	<param name="allowscriptaccess" value="always"> 	</param> 	<embed src="http://www.youtube.com/v/tpaJBu4BEuA&amp;hl=it&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed> </object></p>  <p align="center"><object height="344" width="425"> 	<param name="movie" value="http://www.youtube.com/v/EL2ByYozGOI&amp;hl=it&amp;fs=1"> 	</param> 	<param name="allowFullScreen" value="true"> 	</param> 	<param name="allowscriptaccess" value="always"> 	</param> 	<embed src="http://www.youtube.com/v/EL2ByYozGOI&amp;hl=it&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed> </object></p>  <p align="center">Sekai Camera (iPhone)</p>  <p align="center"><object height="344" width="425"> 	<param name="movie" value="http://www.youtube.com/v/KgTwSXK_5dg&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1"> 	</param> 	<param name="allowFullScreen" value="true"> 	</param> 	<embed src="http://www.youtube.com/v/KgTwSXK_5dg&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" height="344" width="425"></embed> </object></p>  <p>Sbavo! </p>]]></description>
            <author>Legolas &lt;legolas@rainbowbreeze.it&gt;</author>
            <pubDate>Mon, 04 May 2009 22:30:13 +0000</pubDate>
        </item>
    </channel>
</rss>
