<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
<channel>
<title>Etnablog.com :)</title>
<link>http://etnablog.altervista.org/index.php</link>
<description>Feed di Etnablog.com :)</description>
<item>
<title>Ma che fine ho fatto?..</title>
<link>http://etnablog.altervista.org/etna/ma-che-fine-ho-fatto/</link>
<description> <![CDATA[<p><i>Avete tutti ragione, ma non vi ho abbandonato..</i></p>
 <br /> E' vero sono un stato pò assente ultimamente, fra la laurea, l'abilitazione, il lavoro, la musica, il fatto che sono stato in viaggio, e i vari pensieri non ho più fatto escursioni sull'Etna degne di nota.<br />
<br />
<img src="http://etnablog.altervista.org/immagini/Etnablog/img_big/ufo.jpg" alt="ufo" title="ufo" /><br />
<br />
Ho alcuni progetti comunque, che conto di realizzare non appena possibile, non appena sentirò la necessità di dovere disintossicare lo spirito...<br />
<br />
..Perchè per me andare sull'Etna è spesso una evasione, la voglia di stare a contatto con qualcosa di immenso.<br />
<br />
Avete presente quei tardi pomeriggi in cui ci siete solo voi a camminare per i sentieri, non c'è nessuno per chilometri.. Sentite solo il vento, il fruscio tra i rami ed il suono dei vostri passi?..<br />
E' un'esperienza che non tutti hanno mai fatto nella vita, penso che solo chi l'ha fatta possa capire di cosa sto parlando.. E' qualcosa di più persino del "turismo", inteso come andare sul posto, farsi due foto, essere spennati in un bar per una bottiglietta d'acqua di un quarto di litro e una coca cola, e poi ritirarsi giù a casa..<br />
<br />
Il 99% della gente crede che il massimo del turismo che l'Etna possa offrire sia lo sci o lo snowboard domenicale, o le palle di neve, la risalita con la funivia, la discesa giù (con l'esperienza unica di farlo guardando la costa Ionica a distanza..), la carne arrostita in un rifugio non lontano dall'auto. E' il turismo delle strutture ben organizzate, servono parcheggi, servono strutture di risalita, per qualcuno serve persino un "terzo polo".. Contrari? Favorevoli?.. Santo Dio non fatemi entrare nel merito di questa discussione, sopra cui immagino già flame e orde di gente che si scannerà per imporre la propria opinione su quella degli altri..<br />
<br />
Mi diverte ogni tanto prendere gli sci e sciare, ma so anche quale incalcolabile valore abbia avuto in certi momenti della mia vita ascoltare in silenzio e pace il respiro della montagna..<br />
<br />
Non sono ancora andato a visitare l'attuale eruzione, ma è probabile che lo farò.. Per ora mi sto limitando ad osservarla col binocolo dal balcone di casa.. Devo trovare la giusta "ispirazione"..<br />
..E' qualcosa di diverso.. E' una visita più "turistica", che mi fa piacere fare con gli amici, quelli giusti..<br />
<br />
SantoVip, mi scriveva, in un commento in un'altra discussione, che sarebbe una buona idea aggiugere un forum di discussione nel sito... Sai ci ho pensato ma non lo farò, per diverse ragioni.<br />
<br />
I montanari spesso i loro trucchetti per godersi al meglio le loro escursioni, i loro posti più belli, tendono spesso a tenerseli per se, segreti, un pò per proteggere dagli sciacalli quelle zone, un pò per quella sensazione di dire "ho scoperto un posto troppo bello che non conosce nessuno", un pò per egoismo.. E il motivo per cui è nato questo sito era proprio questo, condividerne un poco di questa conoscenza, almeno quella mia.. Perchè contrariamente a quanto si possa credere se nessuno li conosce questi posti, non c'è nessuno che si batterà mai per proteggerli..<br />
<br />
L'Etna mette una certa paura al turista.. Ed ha ragione, segnaletica sui sentieri approssimativa ed essenziale, le cartine militari ormai vecchie di 15 anni, rifugi su cui spesso manca la legna, non si capisce che tempi di percorrenza ci sono tra un punto ed un altro.. Ecco perchè scrivo sempre i miei thread sul sito come rivolti a gente ignorante, che vorrebbe cimentarsi, ma ha paura a farlo.<br />
<br />
In realtà per la maggior parte delle domande del tipo "quale è la strada giusta per arrivare al monte X", bastano un paio di ricerche con la funzione search del sito ed osservare una cartina semiseria per avere la risposta che si cerca..<br />
<br />
Un forum presuppone la moderazione di uno staff, che ne vigili sul rispetto delle regole, e che sia preparato e competente...E io in questo momento non ho nè la voglia nè il tempo di starci dappresso, e, ti dirò, nemmeno le reali competenze per farlo ed essere d'aiuto in pieno..<br />
<br />
Non mi tengo aggiornato sugli orari della funivia, nemmeno quelli dei pulmini, non vado con regolarità in montagna purtroppo, e già chiunque, se vuole, può aprirsi la sua discussione nuova, come nuova pagina nel sito, purchè sia utile ed interessante a tutti.. ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/etna/ma-che-fine-ho-fatto/</guid>
</item>
<item>
<title>Itinerario: Da ingresso &quot;Bosco chiuso&quot; a monte Guardirazzi</title>
<link>http://etnablog.altervista.org/etna/itinerario-da-ingresso-bosco-chiuso-a-monte-guardirazzi/</link>
<description> <![CDATA[ <br /> Il territorio di Maletto colpisce senz'altro per i suoi splendidi boschi.<br />
Questo itinerario si compie in due giorni, con un pernottamento al <strong>rifugio Monte Maletto</strong>.<br />
<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/Etna-da-strada-Bronte.jpg"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/Etna-da-strada-Bronte.jpg" id="thumb06" longdesc="http://etnablog.altervista.org/immagini/Etnablog/longdesc/Etna-da-strada-Bronte.txt"  title="Etna, dalla statale 284" alt="Etna, dalla statale 284" width="100" /></a> <span class="display_none">[<a href="http://etnablog.altervista.org/immagini/Etnablog/longdesc/Etna-da-strada-Bronte.txt" title="Descrizione foto Etna-da-strada-Bronte.txt">D</a>]</span> <br />
<br />
Il punto di partenza dell'escursione è il cancello d'ingresso &quot;<strong>bosco chiuso</strong>&quot;, raggiungibile lasciando la statale 284 e percorrendo una strada sterrata, percorribile senza particolari difficoltà anche con vetture non particolarmente potenti.<br />
<br />
Lasciammo la vettura proprio di fronte al cancello d'ingresso &quot;bosco chiuso&quot; alle ore 17 e 30, da qui il cammino sale, compie un dislivello complessivo di circa <strong>500 metri</strong> fino al rifugio Maletto (ore 20.00 circa), dove abbiamo trascorso la notte.<br />
<br />
L'indomani siamo partiti da rifugio Maletto alle 08:00, e ci incamminammo verso la nostra direzione: monte Guardirazzi (dislivello, dal rifugio al monte Guardirazzi, circa 300 metri).<br />
<br />
Il sentiero, come si può osservare dalla cartina IGMI, è interrotto dalle <strong>lave del 1976</strong>, che bisogna quindi attraversare, seguendo la traccia solcata e gli omini in pietra, proprio sulla colata.<br />
<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/Dalla-sciara-per-monte-Guardirazzi.jpg"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/Dalla-sciara-per-monte-Guardirazzi.jpg" id="thumb16" longdesc="http://etnablog.altervista.org/immagini/Etnablog/longdesc/Dalla-sciara-per-monte-Guardirazzi.txt"  title="Etna, dalla sciara per monte Guardirazzi" alt="Etna, dalla sciara per monte Guardirazzi" width="100" /></a> <span class="display_none">[<a href="http://etnablog.altervista.org/immagini/Etnablog/longdesc/Dalla-sciara-per-monte-Guardirazzi.txt" title="Descrizione foto Dalla-sciara-per-monte-Guardirazzi.txt">D</a>]</span> <br />
<br />
Attraversate la sciara e raggiungete quindi il bosco dall'altra parte. A questo punto la cartina mostra un sentiero che corre lungo il bordo della colata, e si porta in su fino a raggiungere il monte Guardirazzi; in realtà non abbiamo trovato traccia di questo sentiero, nè omini in pietra nè altro. <br />
Sicchè abbiamo abbandonato il tracciato visibile (presi i dovuti riferimenti) e ci siamo portati in maniera decisa in direzione del Guardirazzi, muovendoci lungo il bordo della sciara.<br />
<br />
Abbiamo raggiunto la sommità di monte Guardirazzi alle 09:45 circa.<br />
<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/Panorama-da-monte-Guardirazzi.jpg"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/Panorama-da-monte-Guardirazzi.jpg" id="thumb26" longdesc="http://etnablog.altervista.org/immagini/Etnablog/longdesc/Panorama-da-monte-Guardirazzi.txt"  title="Panorama da monte Guardirazzi" alt="Panorama da monte Guardirazzi" width="100" /></a> <span class="display_none">[<a href="http://etnablog.altervista.org/immagini/Etnablog/longdesc/Panorama-da-monte-Guardirazzi.txt" title="Descrizione foto Panorama-da-monte-Guardirazzi.txt">D</a>]</span> <br />
<br />
Trascorso un pò di tempo sul monte, siamo ritornati al rifugio Maletto, dove abbiamo consumato un pasto, e poi giu di ritorno, fino all'automobile. ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/etna/itinerario-da-ingresso-bosco-chiuso-a-monte-guardirazzi/</guid>
</item>
<item>
<title>Spaghetti al pesto genovese (con patate)</title>
<link>http://etnablog.altervista.org/cucina-rapida/spaghetti-al-pesto-genovese-con-patate/</link>
<description> <![CDATA[ <br /> Cucinare è un dovere verso se stessi, ma anche un divertimento e un piacere spesso, ma resta comunque il fatto che ritirandomi alle 16:00 circa ogni giorno, e spesso digiuno, ho fame ma anche voglia di un pasto sbrigativo ma decente..<br />
<br />
Oggi mi sono cimentato nella preparazione di un normalissimo piatto di <strong>spaghetti al pesto</strong>.<br />
<br />
Anzitutto: amo gli spaghetti barilla, ma odio i &quot;numero 3&quot;, troppo sottili, e non mi piace la consistenza che assumono al palato.<br />
<br />
Adoro invece gli spaghetti &quot;numero 5&quot; che, se da un lato richiedono non meno di 8 minuti di ebollizione, dall'altro sono decisamente più consistenti e gradevoli al palato, inoltre durante gli 8 minuti che questi richiedono per la cottura, voi potete tranquillamente dedicarvi alla preparazione del condimento.<br />
<br />
Le mie ricette sono sempre rivolte alla preparazione di un piatto per <strong>una sola persona</strong>.<br />
<br />
Ingredienti del piatto da me e per me preparato oggi:<br />
- 170 grammi di spaghetti barilla &quot;numero 5&quot; (occhio, è un piatto MOLTO abbondante)<br />
- una confezione di pesto buitoni (160 grammi)<br />
- due patate di piccole dimensioni (ahime.. Non avevo una patata &quot;media&quot;)<br />
<br />
<br />
Procedimento:<br />
- Mettete nella pentola un quantitativo di acqua sufficiente a contenere gli spaghetti<br />
- Prendete una delle due patate e sbucciatela.<br />
- Accendete il fuoco e cominciate a mettete in ebollizione l'acqua.<br />
- Mentre l'acqua si riscalda, tagliate la seconda patata, e quindi tagliate entrambe le patate sbucciante in cubetti di circa un centimetro per lato. Insomma una sorta di spezzatino.<br />
- Gettate i cubetti di patata nella pentola con l'acqua che si scalda.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/pelapatate.jpg"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/pelapatate.jpg" title="pelapatate.jpg" alt="pelapatate.jpg" width="100"/></a><br />
- Chiudete la pentola con il suo coperchio, così bollirà prima.<br />
- Prendete gli spaghetti e pesatene 170 grammi.<br />
- Preparatevi la tovaglia con il piatto, il bicchiere, l'acqua, e l'immancabile buon vino di casa.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/tavola.jpg"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/tavola.jpg" title="tavola.jpg" alt="tavola.jpg" width="100"/></a><br />
- L'acqua bolle? Gettatevi dentro i vostri spaghetti. <strong>Non spezzateli</strong>. Spezzare gli spaghetti equivale più o meno ad un sacrilegio..<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/spaghetti%20in%20pentola.jpg"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/spaghetti%20in%20pentola.jpg" title="spaghetti in pentola.jpg" alt="spaghetti in pentola.jpg" width="100"/></a><br />
- Durante gli otto minuti che seguiranno finite di sistemare la vostra tavola e preparate lo scolapasta sul lavandino.<br />
- Mettete il sale nell'acqua in ebollizione!<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/cottura%20spaghetti.jpg"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/cottura%20spaghetti.jpg" title="cottura spaghetti.jpg" alt="cottura spaghetti.jpg" width="100"/></a><br />
- All'ottavo minuto scolate la pasta e....<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/spaghetti%20al%20pesto.jpg"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/spaghetti%20al%20pesto.jpg" title="spaghetti al pesto.jpg" alt="spaghetti al pesto.jpg" width="100"/></a><br />
- Buon appetito  <img src="http://etnablog.altervista.org/grafica_sito/4all/wink.gif" title="wink.gif" alt="wink.gif"/> ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/cucina-rapida/spaghetti-al-pesto-genovese-con-patate/</guid>
</item>
<item>
<title>Modificare la tonalità di un brano</title>
<link>http://etnablog.altervista.org/informatica/modificare-la-tonalita-di-un-brano/</link>
<description> <![CDATA[ <br /> Tanto tempo era trascorso da quando, per motivi di studio, ho mollato il mio vecchio basso e non ho più suonato.. Ma da allora quel basso, dall'alto del chiodo in cui era appeso, mi guardava con aria saggia e stava lì a ricordarmi chi fosse (..o chi fossi io?..) e che il legame non era ancora spezzato..<br />
<br />
Bene.. Da poco tempo ho riabbracciato il mio <strong>YAMAHA BBG4AII</strong>  <img src="http://etnablog.altervista.org/grafica_sito/4all/wink.gif" title="wink.gif" alt="wink.gif"/> . <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/Yamaha%20BBG4AII.jpg"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/Yamaha%20BBG4AII.jpg" id="thumb16" longdesc="http://etnablog.altervista.org/immagini/Etnablog/longdesc/Yamaha%20BBG4AII.txt"  title="Il mio basso" alt="Il mio basso" width="100" /></a> <span class="display_none">[<a href="http://etnablog.altervista.org/immagini/Etnablog/longdesc/Yamaha%20BBG4AII.txt" title="Descrizione foto Yamaha BBG4AII.txt">D</a>]</span> <br />
Adesso ho un nuovo gruppetto e ci dilettiamo a fare cover... Ma è presto sopraggiunto un problema: la tonalità originale della canza che dobbiamo interpretare non si adatta a quella della voce della cantante. Ho allora cercato un programma che mi permettesse di risolvere il problema.<br />
<br />
Bene, l'ho trovato, è opensource, multipiattaforma, è <strong>Audacity</strong>.<br />
<br />
La versione che sto usando è quella fornita nei repository di Linux Ubuntu Gutsy, la <strong>1.3.3</strong> (ma, ripeto, è multipiattaforma, quindi potete anche scaricare <strong>gratuitamente</strong> audacity dal suo  <a href="http://audacity.sourceforge.net/">sito</a>  per usarlo su Windows.<br />
<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/audacity.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/audacity.png" title="audacity.png" alt="audacity.png" width="100"/></a> <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/audacity_semitoni.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/audacity_semitoni.png" title="audacity_semitoni.png" alt="audacity_semitoni.png" width="100"/></a><br />
Semplicemente aprite l'mp3 di cui volete modificare la tonalità con audacity, quindi fate &quot;modifica&quot; --&gt; &quot;Seleziona tutto&quot;, e poi &quot;effetti&quot; --&gt; &quot;cambia intonazione&quot;, quindi impostate il numero di semitoni in su o in giu verso cui dovete portare l'mp3..<br />
<br />
Buona musica a tutti.. ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/informatica/modificare-la-tonalita-di-un-brano/</guid>
</item>
<item>
<title>Che fine ha fatto Piero Ricca?</title>
<link>http://etnablog.altervista.org/varie/che-fine-ha-fatto-piero-ricca/</link>
<description> <![CDATA[ <br /> Seguivo il suo  <a href="http://www.pieroricca.org/chi-sono/">blog</a>  praticamente da sempre.. E sinceramente sono mesi che ormai mi manca non potere più leggervi novità...<br />
<br />
Dopo l'ultima vicenda con Emilio Fede, il sito è stato infatti oscurato dalla finanza..<br />
<br />
Non mi ritengo molto d'accordo con questo modo di reprimere la libertà d'espressione...Che chiudano anche questo blog se non gli fa piacere.<br />
<br />
Il blog di Ricca faceva migliaia e migliaia di ingressi ogni giorno.. Forse non sapevano neanche loro che chiudendo un blog del genere buttavano giu una pietra miliare sulla repressione della libertà di esprimersi.<br />
<br />
Adesso Piero scrive su:  <a href="http://www.quimilanolibera.net/">http://www.quimilanolibera.net/</a>  .<br />
<br />
Qualche link, in modo da salvare dal tempo quello che è successo:<br />
<br />
 <a href="http://www.quimilanolibera.net/index.php/2007/07/11/il-mio-blog-bloccato-dalla-finanza/">http://www.quimilanolibera.net/index.php<br />
/2007/07/11/il-mio-blog-bloccato-dalla-f<br />
inanza/</a> <br />
<br />
 <a href="http://www.quimilanolibera.net/index.php/2007/07/12/il-mio-blog-bloccato-dalla-finanza2/">http://www.quimilanolibera.net/index.php<br />
/2007/07/12/il-mio-blog-bloccato-dalla-f<br />
inanza2/</a> <br />
<br />
 <a href="http://www.quimilanolibera.net/index.php/2007/07/13/il-mio-blog-bloccato-dalla-finanza3/">http://www.quimilanolibera.net/index.php<br />
/2007/07/13/il-mio-blog-bloccato-dalla-f<br />
inanza3/</a> <br />
<br />
 <a href="http://www.unita.it/view.asp?idContent=67349">http://www.unita.it/view.asp?idContent=6<br />
7349</a> <br />
<br />
 <a href="http://www.youtube.com/watch?v=5KbGNQwO7es">http://www.youtube.com/watch?v=5KbGNQwO7<br />
es</a> <br />
<br />
Vedremo come andrà a finire.. ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/varie/che-fine-ha-fatto-piero-ricca/</guid>
</item>
<item>
<title>Connettersi ad un database mysql con C</title>
<link>http://etnablog.altervista.org/programmazione-c/connettersi-ad-un-database-mysql-con-c/</link>
<description> <![CDATA[ <br /> Nel mio pc ho un server  <a href="http://it.wikipedia.org/wiki/LAMP_(piattaforma)">LAMP</a>  su cui tengo una copia del sito e faccio esperimenti prima di portare on line le modifiche.<br />
<br />
Mi domandavo: e se volessi manipolare il mio database mysql con un programma C? E' una cosa difficile da fare?<br />
<br />
Ebbene, non è difficile  <img src="http://etnablog.altervista.org/grafica_sito/4all/smile.gif" title="smile.gif" alt="smile.gif"/> . Sono incappato su questa ottima guida, di cui indico il link per esteso:<br />
<br />
 <a href="http://www.linuxdidattica.org/docs/prg_C/cgiprg24.html">http://www.linuxdidattica.org/docs/prg_C<br />
/cgiprg24.html</a> <br />
<br />
Da lì ho tratto questo ottimo codice, che è stato semplicissimo modificare per le mie esigenze:<br />
<br />
<pre><code>#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;mysql/mysql.h&gt;const char* host = &quot;localhost&quot;; // host di connessioneconst char* database = &quot;mydb&quot;;  // database di connessioneconst char* db_user = &quot;myuser&quot;; // nome utente per la connessioneconst char* db_pass = &quot;mypass&quot;; // password non cifrataint main (){        MYSQL mysql;        MYSQL_ROW row;        // la riga        MYSQL_RES* result;        MYSQL_FIELD* field;     // il campo ritornato        char* query = &quot;SELECT * FROM nome_tabella;&quot;;        int i = 0, j = 0, n_rows = 0;        // restituisce NULL se non avviene con successo        if (! mysql_init (&amp;mysql)) {                printf (&quot;Errore nella allocazione di memoria.n&quot;);                exit (EXIT_FAILURE);        }        if (! mysql_real_connect (&amp;mysql, host, db_user, db_pass, &quot;&quot;,                        0, NULL, 0)) {                printf (&quot;Errore nella connessione.n&quot;);                goto error;        }        // restituisce zero se avviene con successo        if (mysql_select_db (&amp;mysql, database)) {                printf (&quot;Errore nella selezione del database.n&quot;);                goto error;        }        printf (&quot;Connessione avvenuta.n&quot;);        // restituisce zero se avviene con successo        if (mysql_select_db (&amp;mysql, database)) {                printf (&quot;Errore nella selezione del database.n&quot;);                goto error;        }        // esegue la query        if (mysql_query (&amp;mysql, query)) {                printf(&quot;Errore nella query.n&quot;);                goto error;        }        result = mysql_store_result (&amp;mysql);        n_rows = mysql_num_rows (result);        for (j = 0; j &lt; n_rows; j++) {                i = 0;                mysql_field_seek (result, 0);           // sposta a inizio riga                row = mysql_fetch_row (result);      // preleva i dati della riga                while ((field = mysql_fetch_field (result))) {                        printf (&quot;%s: &quot;, field-&gt;name);     // visualizza il campo                        printf (&quot;%sn&quot;, row[i++]);          // visualizza il dato del campo                }                printf (&quot;n&quot;);        }       mysql_free_result (result);error:        mysql_close (&amp;mysql);   // chiusura del database        exit (EXIT_SUCCESS);}
</code></pre><br />
<br />
Dovete anzitutto avere un database mysql gia installato e funzionante, con almeno una tabella gia pronta.<br />
<br />
Il programmino in questione semplicemente si connette al db e vi mostra il contenuto della tabella.<br />
<br />
Modificate nel codice i giusti parametri per connettersi al database (user, password, nome database...), modificate la query indicando il giusto nome della tabella, quindi salvate il file di testo col nome &quot;prova_mysql.c&quot;.<br />
<br />
Quindi installatevi da Synaptic il pacchetto <strong>libmysql++-dev</strong> (vi ricordo che la distro che uso è Ubuntu), che vi installerà le librerie di sviluppo per mysql e compilate il tutto con:<br />
<br />
gcc -lmysqlclient -o mysqlapp prova_mysql.c<br />
<br />
Quindi eseguite facendo, da shell:<br />
./mysqlapp<br />
A me funziona perfettamente, mostrandomi su shell tutto il contenuto della tabella indicata nella query :) ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/programmazione-c/connettersi-ad-un-database-mysql-con-c/</guid>
</item>
<item>
<title>Ruotatore automatico di tutte le foto in una cartella...con GUI GTK!</title>
<link>http://etnablog.altervista.org/programmazione-c/ruotatore-automatico-di-tutte-le-foto-in-una-cartellacon-gui-gtk/</link>
<description> <![CDATA[<p><i>Il mio primo VERO programma in C :)</i></p>
 <br /> Questo è il mio primo vero programma in C.<br />
<br />
In sostanza si tratta di un programma che vi permette di scegliere, con una comoda interfaccia in GTK, una cartella del vostro PC, e di applicare, sulla cartella scelta, il comando di autorotazione delle foto di cui vi ho parlato la scorsa volta.<br />
<br />
Sembra funzionare bene.<br />
<br />
Il programma COMPILATO e anche i SORGENTI COMPLETI sono scaricabili da qui:<br />
<br />
 <a href="http://etnablog.altervista.org/misc/script-c/gira_tutte_le_foto_con_gui.tar.gz">http://etnablog.altervista.org/misc/scri<br />
pt-c/gira_tutte_le_foto_con_gui.tar.gz</a> <br />
<br />
Vi ricordo che perchè il programma possa funzionare, è necessario installare da Synaptic il comando &quot;<strong>jhead</strong>&quot;.<br />
<br />
In realtà, quel codice è per me un buon esercizio e riferimento su come:<br />
- Creare una interfaccia con GLADE e GTK da cui scegliere una CARTELLA e NON un FILE.<br />
- Eseguire da una GUI un comando per SHELL.<br />
- Concatenare stringhe e farne un &quot;escape&quot; degli apici (caratteri &quot;pericolosi&quot;..).<br />
- Usare gprintf e la sua gprintf.h<br />
- Superare un errore di tipo &quot;incompatible pointer type&quot;.<br />
- Tenere conto della codifica UTF-8 delle GTK.<br />
- eliminare gnome.h in favore invece di gtk/gtk.h . Non so bene perchè ma preferisco non usarlo..<br />
<br />
Se avete qualche consiglio su come migliorarlo...<br />
Eccovi il codice principale. Lo scrivo qui per tante ragioni, tra cui il fatto che così sarà indicizzato, oltre che dai motori di ricerca, anche dal motore di ricerca interno al sito:<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#include &lt;config.h&gt;#endif#include &lt;gtk/gtk.h&gt;#include &lt;stdlib.h&gt;#include &lt;glade/glade.h&gt;#include &lt;glib/gprintf.h&gt;/*    NELLA GUIDA DI RIFERIMENTO DELLE GLIB SI LEGGE:	&quot;Note that the functions g_printf(), g_fprintf(), g_sprintf(), g_snprintf(), g_vprintf(), g_vfprintf(), g_vsprintf() 	and g_vsnprintf() are declared in the header gprintf.h which is not included in glib.h 	(otherwise using glib.h would drag in stdio.h), so you'll have to explicitly include &lt;glib/gprintf.h&gt; 	in order to use the GLib printf() functions.*///gchar selezione[]= &quot;&quot;;gchar* selezione = NULL; /*    INVECE DI METTERE gchar* selezione = NULL;    PRIMA AVEVO USATO: gchar* selezione = g_strdup(&quot;a string&quot;);    NE OTTENEVO UN ERRORE IN COMPILAZIONE: Il C non ammette di inizializzare variabili con una funzione*/voidon_button1_clicked (GtkButton *button, gpointer user_data){	/* 	     Avevo scritto:	     GtkWidget *window1;	     window1 = gtk_widget_get_toplevel(button);	     compilando mi dava un warning: passing argument 1 of 'gtk_widget_toplevel' from incompatible pointer type.	     Questo perchè ho passato un GtkButton* invece di un GtkWidget*. 	     Ho risolto il problema facendo un &quot;casting&quot; con GTK_WIDGET.	*/		GtkWidget *window1 = gtk_widget_get_toplevel(GTK_WIDGET (button));		gchar *filename;		GtkWidget *dialog;   dialog = gtk_file_chooser_dialog_new (&quot;Open File&quot;,				      GTK_WINDOW (window1),				      GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,				      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,				      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,				      NULL);  /*       Anzichè scrivere GTK_WINDOW(window1) prima c'era scritto solo &quot;window1&quot;, e beccavo un warning in compilazione tipo &quot;incompatible pointer type&quot;..	  Ho risolto facendo il casting con GTK_WINDOW.	  Se vedi nella guida di riferimento delle gtk vedi che la sintassi di gtk_file_chooser_dialog_new è:	  GtkWidget* gtk_file_chooser_dialog_new (const gchar *title, GtkWindow *parent, GtkFileChooserAction action,const gchar *first_button_text, ...);	  	  Passando solo window1 passavo un GtkWidget e NON la &quot;parent window&quot;.  */        if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)     {		  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); 		 /*		      AVREI POTUTO USARE:		      filename = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); 		      gtk_file_chooser_get_uri OTTIENE IL FILE PER &quot;URI&quot;. Gli spazi vengono sostituiti, ad esempio, da &quot;%20&quot;.		      Ottenere il valore per URI sarebbe utile per un fatto di sicurezza, nel caso avrei dovuto passare il file a fopen (ad esempio).		      Nel nostro caso invece, il file lo passerò a g_spawn_sync (vedi piu avanti)		 */		 		 selezione = g_strdup(filename);		  /*		      PER SETTARE &quot;SELEZIONE&quot; PRIMA AVEVO USATO strcpy(selezione, &quot;pippoasdfasdf&quot;);		      POI MI AVEVANO CONSIGLIATO INVECE DI USARE:		 	  sprintf(selezione, &quot;%s&quot;, filename); 		      ALL'INIZIO DEL PROGRAMMA PERO' &quot;selezione&quot; era inizializzata così: gchar selezione[]= &quot;&quot;;		      QUINDI NON AVEVO UN PUNTATORE COME ADESSO		      SINTASSI: int sprintf(char *str, const char *format, ...);		      La funzione sprintf() differisce dalla funzione printf()  in quanto i caratteri vengono scritti nell'area puntata da str.		 		      AVREI POTUTO USARE, AL POSTO DI SPRINTF, ANCHE IL COMANDO:		      strcpy(selezione, filename);		      STRCPY FUNZIONA COSI':		      SINTASSI: ptr = strcpy( s1, s2 );		      La funzione strcpy() copia la stringa s1 sull'area puntata da s2 la quale deve essere sufficientemente ampia ad accogliere tutti i caratteri di s1 compreso il terminatore '&amp;#65533;'.		 		 */       g_printf(&quot;DIRECTORY SELEZIONATA: %s n&quot;, selezione);     }   else filename = &quot;&quot;;	      gtk_widget_destroy (dialog);		/*  Ho preferito ricercare la GtkLabel a partire da window1, per esigenze di &quot;esperimento&quot;, 	*   ma avrei potuto direttamente scrivere:	*   GladeXML *self = glade_get_widget_tree(GTK_WIDGET(button));    */    GladeXML *self = glade_get_widget_tree(GTK_WIDGET(window1));	GtkWidget *label = glade_xml_get_widget (self, &quot;etichetta&quot;);      filename = g_filename_display_name (filename);      /*   			Voglio stampare a video il file ottenuto.             Le GUI GTK, in generale, usano la codifica UTF-8 ma l'encoding dell'utente potrebbe non essere UTF-8, e così             anche i nomi dei suoi file potrebbero non essere UTF-8.            Quindi bisogna assicurarsi di convertire il nome del file ottenuto in UTF-8 per essere certi di mostrarlo a video correttamente.            Usiamo allora il comando g_filename_display_name che ha questa sintassi:            gchar*      g_filename_display_name         (const gchar *filename);     */	gtk_label_set_text (GTK_LABEL(label), filename);    }voidon_button_ruota_clicked (GtkButton *button, gpointer user_data){		/* 	     IL COMANDO CHE PASSERO' ALLA SHELL E': 			 find 'percorso/cartella' -type f -iname '*.jpg' -print0 | xargs -0 jhead -autorot		     -print0: i singoli file restituiti da find verranno passati ad xargs in modo che vengano correttamente interpretati nonostante vi siano spazi vuoti o apici in mezzo.         Print0 separa i singoli file da un carattere speciale detto &quot;NULL&quot;, in modo che xargs non faccia confusione tra spazi bianchi nei nomi dei file e la separazione dei file stessi.         Se find trova troppi file si corre il rischio che la stringa sia troppo lunga ed ecceda il limite di caratteri ammesso nella riga di comando.         Per questo motivo usiamo xargs che se la sbrigherà lui a fare in modo che questo non succeda. Inoltre, tramite il parametro -0, diciamo ad xargs che riconosca i singoli file perchè separati da un carattere &quot;NULL&quot;. Per questo prima abbiamo usato -print0!   */		gchar* selezione_escape = g_shell_quote (selezione);    gchar* comando = g_strconcat(&quot;find &quot;, selezione_escape,&quot; -type f -iname '*.jpg' -print0 | xargs -0 jhead -autorot&quot;, NULL);	g_printf(&quot;COMANDO ESEGUITO: %s nn&quot;, comando);		system(comando);		/*	     Il comando system esegue su shell un comando. Piu o meno allo stesso scopo possono servire anche i comandi	     g_spawn_sync e g_spawn_command_line_sync. Non sono riuscito ad implementarli con successo.	 */}int main (int argc, char *argv[]){	GtkWidget *window1, *button1, *button_ruota;	GladeXML *xml;		if (selezione == &quot;&quot; || selezione == NULL) g_printf(&quot;SELEZIONE ATTUALE: NESSUNAn&quot;);	else g_printf(&quot;SELEZIONE ATTUALE: %s n&quot;, selezione);		    // PACKAGE è definito in config.h	//gnome_init (PACKAGE, VERSION, argc, argv);	gtk_init (&amp;argc, &amp;argv);	//glade_gnome_init ();			xml = glade_xml_new (&quot;gira_tutte_le_foto_con_gui.glade&quot;, NULL, NULL);	/* Ho ESCLUSO l'autoconnect, faccio le callback manualmente */	// glade_xml_signal_autoconnect (xml);	window1 = glade_xml_get_widget (xml, &quot;window1&quot;);	button1 = glade_xml_get_widget (xml, &quot;button1&quot;);	g_signal_connect (G_OBJECT (button1), &quot;clicked&quot;,                    G_CALLBACK (on_button1_clicked),                    NULL);			button_ruota = glade_xml_get_widget (xml, &quot;button_ruota&quot;);    g_signal_connect (G_OBJECT (button_ruota), &quot;clicked&quot;,                    G_CALLBACK (on_button_ruota_clicked),                    selezione);    g_signal_connect (G_OBJECT (window1), &quot;delete_event&quot;,                    G_CALLBACK (gtk_main_quit), NULL);		 gtk_widget_show (window1);	gtk_main ();		return 0;}
</code></pre> ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/programmazione-c/ruotatore-automatico-di-tutte-le-foto-in-una-cartellacon-gui-gtk/</guid>
</item>
<item>
<title>Ruotare in automatico le foto scaricate dalla fotocamera digitale</title>
<link>http://etnablog.altervista.org/linux/ruotare-in-automatico-le-foto-scaricate-dalla-fotocamera-digitale/</link>
<description> <![CDATA[<p><i>Il comando jhead e le proprietà exif</i></p>
 <br /> Scaricando le foto dalla mia fotocamera digitale, spesso mi era necessario perdere un pò di tempo a dovere raddrizzarle una ad una..<br />
<br />
Su Windows le foto, al momento del download dalla mia fotocamera Canon, queste venivano direttamente ruotate, in automatico, dal software fornito in dotazione con la fotocamera, che ne leggeva le proprietà exif di orientamento.<br />
<br />
E su Linux?<br />
<br />
Semplice! Dopo avere scaricato tutte le foto, da shell portatevi nella cartella ove si trovano le foto e scrivete il comando:<br />
jhead -autorot *<br />
Il comando <strong>jhead</strong>, va scaricato da Synaptic.<br />
<br />
*      *      *      *      *      *<br />
<br />
Complichiamoci la vita adesso:<br />
<br />
Se volessimo fare in modo di ruotare tutte le foto in una cartella, comprese le foto contenute in eventuali sottocartelle, potremmo servirci del potentissimo comando "find". Ve lo presento in tre salse:<br />
<br />
<strong>Prima forma:</strong><br />
<br />
jhead -autorot $(find . -type f -iname '*.jpg')<br />
In sostanza, prima esegue il comando find su riga di comando e mette il suo output in pasto al comando jhead. Questo può dare qualche problema se la riga di comando è molto lunga.<br />
<br />
<strong>Seconda forma:</strong><br />
find . -type f -iname '*.jpg' -exec jhead -autorot {} ;<br />
In questa forma, viene eseguito UN comando jhead per OGNI file. Questo significa che se avete 100 file, verrà aperto 100 volte il comando jhead.<br />
-type f -iname '*.jpg' letteralmente vuol dire "ogni file (non directory nè simlink o altro), che finisce per  .jpg o .JPG o .JpG o .jPG (-iname, la "i" serve a renderlo case insensitive, cioè insensibile a minuscole-maiuscole).   <br />
<br />
<strong>Terza soluzione:</strong><br />
find . -type f -iname '*.jpg' | xargs -l 100 jhead -autorot<br />
La lista dei file trovati da find, per quanto lunga sia, viene letta in blocchi di 100 files, e fa partire UN jhead per 100 files alla volta.<br />
<br />
<strong>Quarta soluzione:</strong><br />
Ed ecco, infine, la soluzione che attualmente ritengo migliore ed attualmente è quella che uso:<br />
<br />
find . -type f -iname '*.jpg' -print0 | xargs -0 jhead -autorot<br />
<br />
Cosa vuol dire?<br />
-print0: i singoli file restituiti da find verranno passati ad xargs in modo che vengano correttamente interpretati nonostante vi siano spazi vuoti o apici in mezzo. <br />
<br />
Print0 separa i singoli file da un carattere speciale detto "NULL", in modo che xargs non faccia confusione tra spazi bianchi nei nomi dei file e la separazione dei file stessi.<br />
	<br />
Se find trova troppi file si corre il rischio che la stringa sia troppo lunga ed ecceda il limite di caratteri ammesso nella riga di comando.<br />
Per questo motivo usiamo xargs che se la sbrigherà lui a fare in modo che questo non succeda. Inoltre, tramite il parametro -0, diciamo ad xargs che riconosca i singoli file perchè separati da un carattere "NULL". Per questo prima abbiamo usato -print0!<br />
<br />
<br />
<br />
<br />
ps: thanks a lot to  <a href="http://n-dimensional.de">ndim</a>  for helping me writing this post  <img src="http://etnablog.altervista.org/grafica_sito/4all/wink.gif" title="wink.gif" alt="wink.gif"/> ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/linux/ruotare-in-automatico-le-foto-scaricate-dalla-fotocamera-digitale/</guid>
</item>
<item>
<title>Imagemagick: come ottenere da una immagine .gif una thumbnail .png</title>
<link>http://etnablog.altervista.org/programmazione-c/imagemagick-come-ottenere-da-una-immagine-gif-una-thumbnail-png/</link>
<description> <![CDATA[<p><i>imagemagick e le sue API</i></p>
 <br /> Ho preso lo script che segue da questo sito:  <a href="http://www.imagemagick.org/script/magick-wand.php">http://www.imagemagick.org/script/magick<br />
-wand.php</a> <br />
<br />
Anzitutto bisogna procurarsi gli strumenti (le librerie) che ci permetteranno di manipolare le immagini, quindi scaricate da Synaptic i seguenti e pacchetti:<br />
<br />
- imagemagick<br />
- libmagick9-dev<br />
<br />
A questo punto, con un qualsiasi programma di testo, creiamo un file di testo, lo chiamiamo <strong>wand.c</strong> e copiategli dentro questo script:<br />
<br />
<pre><code>#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;wand/MagickWand.h&gt;int main(int argc,char **argv){#define ThrowWandException(wand) {   char     *description;    ExceptionType     severity;    description=MagickGetException(wand,&amp;severity);   (void) fprintf(stderr,&quot;%s %s %ld %sn&quot;,GetMagickModule(),description);   description=(char *) MagickRelinquishMemory(description);   exit(-1); }  MagickBooleanType    status;  MagickWand    *magick_wand;  /*    Read an image.  */  MagickWandGenesis();  magick_wand=NewMagickWand();    status=MagickReadImage(magick_wand,&quot;image.gif&quot;);  if (status == MagickFalse)    ThrowWandException(magick_wand);  /*    Turn the images into a thumbnail sequence.  */  MagickResetIterator(magick_wand);  while (MagickNextImage(magick_wand) != MagickFalse)    MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);  /*    Write the image as PNG and destroy it.  */  status=MagickWriteImages(magick_wand,&quot;image.png&quot;,MagickTrue);  if (status == MagickFalse)    ThrowWandException(magick_wand);  magick_wand=DestroyMagickWand(magick_wand);  MagickWandTerminus();  return(0);}
</code></pre><br />
<br />
A questo punto, da internet, servendovi di google, scaricate una qualsiasi immagine gif, bella grande possibilmente, e chiamatela "image.gif" (tutto minuscolo).<br />
<br />
A questo punto compiliamo lo script usando questo comando:<br />
<br />
<pre><code>  cc `Wand-config --cflags --cppflags` wand.c `Wand-config --ldflags --libs`
</code></pre><br />
<br />
Otterrete così un file eseguibile chiamato a.out, eseguitelo scrivendo:<br />
<br />
 ./a.out <br />
<br />
<br />
otterete una piccola immagine .png , miniatura della vostra .gif. ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/programmazione-c/imagemagick-come-ottenere-da-una-immagine-gif-una-thumbnail-png/</guid>
</item>
<item>
<title>Nascondere il file .glade</title>
<link>http://etnablog.altervista.org/programmazione-c/nascondere-il-file-glade/</link>
<description> <![CDATA[ <br /> Se, per un motivo o per un altro, state cercando un modo per nascondere il file xml con estensione ".glade", ovvero cercate di nascondere l'interfaccia grafica e il suo sorgente, un modo è quello di inserire la vostra interfaccia grafica in un file di inclusione (.h), e poi richiamarla con un apposito comando.<br />
<br />
Esempio: file "ui.h":<br />
<br />
<pre><code>char *uistr = &quot;&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt; &lt;!--*- mode: xml -*--&gt;&quot;&quot;&lt;!DOCTYPE glade-interface SYSTEM &quot;http://glade.gnome.org/glade-2.0.dtd&quot;&gt;&quot;&quot;&quot;&quot;&lt;glade-interface&gt;&quot;&quot;&quot;&quot;&lt;widget class=&quot;GtkWindow&quot; id=&quot;window1&quot;&gt;&quot;&quot; &lt;property name=&quot;visible&quot;&gt;True&lt;/property&gt;&quot; &quot;  &lt;property name=&quot;title&quot; translatable=&quot;yes&quot;&gt;window1&lt;/property&gt;&quot; &quot;  &lt;property name=&quot;type&quot;&gt;GTK_WINDOW_TOPLEVEL&lt;/property&gt;&quot; &quot;   &lt;property name=&quot;window_position&quot;&gt;GTK_WIN_POS_NONE&lt;/property&gt;&quot; &quot;   &lt;property name=&quot;modal&quot;&gt;False&lt;/property&gt;&quot; &quot;   &lt;property name=&quot;default_width&quot;&gt;500&lt;/property&gt;&quot; &quot;   &lt;property name=&quot;default_height&quot;&gt;400&lt;/property&gt;&quot; &quot;   &lt;property name=&quot;resizable&quot;&gt;True&lt;/property&gt;&quot; &quot;   &lt;property name=&quot;destroy_with_parent&quot;&gt;False&lt;/property&gt;&quot; &quot; &quot; &quot;   &lt;child&gt;&quot; &quot; 	&lt;placeholder/&gt;&quot; &quot;   &lt;/child&gt;&quot; &quot; &lt;/widget&gt;&quot; &quot; &lt;/glade-interface&gt;&quot; &quot; &quot;;
</code></pre><br />
<br />
Ed ecco il vostro "main.c":<br />
<br />
<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#  include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;glade/glade.h&gt;#include &quot;ui.h&quot;int main (int argc, char *argv[]){	GtkWidget *window1;	GladeXML *xml;	#ifdef ENABLE_NLS		bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);		textdomain (PACKAGE);	#endif	gnome_init (PACKAGE, VERSION, argc, argv);	glade_gnome_init ();	/*	 * The .glade filename should be on the next line.	 */	//xml = glade_xml_new (PACKAGE_SOURCE_DIR&quot;/ceiling_gui.glade&quot;, NULL, NULL);	xml = glade_xml_new_from_buffer(uistr,strlen(uistr),&quot;window1&quot;, NULL);	/* This is important */	glade_xml_signal_autoconnect (xml);	window1 = glade_xml_get_widget (xml, &quot;window1&quot;);	gtk_widget_show (window1);	gtk_main ();	return 0;}
</code></pre><br />
<br />
L'intero progetto è scaricabile da qui:<br />
<br />
 <a href="http://etnablog.altervista.org/misc/script-c/ceiling_gui.tar.gz">http://etnablog.altervista.org/misc/scri<br />
pt-c/ceiling_gui.tar.gz</a>  ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/programmazione-c/nascondere-il-file-glade/</guid>
</item>
<item>
<title>Le sezioni informatiche (semi)&quot;nascoste&quot; di Etnablog</title>
<link>http://etnablog.altervista.org/informatica/le-sezioni-informatiche-seminascoste-di-etnablog/</link>
<description> <![CDATA[ <br /> Come da numerose richieste arrivatemi via email, aggiungo questa sottosezione off-topic "<strong>informatica</strong>".<br />
<br />
Gli argomenti contenuti in questa sezione (e nelle sue sottosezioni) non sono visibili nella pagina principale del sito dato che in fin dei conti sono pur sempre dei fuoritema, su quello che invece è il tema cardine del sito, cioè la promozione del rispetto verso ciò che è naturale, sano, e degno di tutela in Sicila.<br />
<br />
Le pagine delle sottosezioni nascoste sono comunque visibili ai motori di ricerca e sono sempre presenti nel  feed RSS del sito.<br />
<br />
All'interno di questa sezione "informatica" ho aperto altre due sottosezioni:<br />
- "<strong>Linux</strong>": si tratta dei miei appunti personali in Linux. A quanto sembra la mia guida è stata utile per molti (sono veramente contento di questo  <img src="http://etnablog.altervista.org/grafica_sito/4all/smile.gif" title="smile.gif" alt="smile.gif"/>), quindi ho deciso di raggruppare il tutto in una sezione dedicata.<br />
<br />
- "<strong>Programmazione C</strong>": questa sezione è utile a chi vorrebbe cominciare a programmare interfacce grafiche in C, usando le GTK, glade e il programma Anjuta. Gli argomenti presuppongono un minimo di conoscenza di base di C, o quantomeno sperano di stimolare l'interesse all'approfondimento. ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/informatica/le-sezioni-informatiche-seminascoste-di-etnablog/</guid>
</item>
<item>
<title>Programmazione C: La concatenazione di stringhe</title>
<link>http://etnablog.altervista.org/programmazione-c/programmazione-c-la-concatenazione-di-stringhe/</link>
<description> <![CDATA[ <br /> Una cosa apparentemente banale come concatenare stringhe, può non essere semplicissima in linguaggio C.<br />
<br />
Un esempio di come NON si dovrebbe fare, è questo:<br />
<br />
<pre><code>char frase[200] = &quot;parola1 &quot;;strcat(strcat(frase, &quot;parola2&quot;),&quot; parola3&quot;);g_print (&quot;La frase è :  %s\n&quot;,  frase);
</code></pre><br />
<br />
Un ottimo metodo è questo, è nelle gtk:<br />
<br />
<pre><code>#include &lt;gtk/gtk.h&gt;[...]//g_strconcat: serve ad unire piu stringhe. Ricordarsi il NULL alla fine!gchar *stringa = g_strconcat(&quot;parola1&quot;, &quot; parola2&quot;,&quot; parola3&quot;, NULL);
</code></pre><br />
<br />
Un altro ottimo sistema è questo (sorgente completo):<br />
<br />
<pre><code>#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;stdarg.h&gt;#include &lt;string.h&gt;char *SuperStringsCat (char *String1, ...){	va_list List;		va_start (List, String1);		unsigned int Size;		Size = strlen (String1) + 1;		char *s;	s = String1;		do	{		Size += strlen (s) + 1;	}while ((s = va_arg (List, char*)) != NULL);		char *Merge;	Merge = (char*)malloc (sizeof (char) * Size);	char *sMerge = Merge;	va_end (List);	va_start (List, String1);	s = String1;		do	{		strcpy (Merge, s);		Merge += strlen (s);	}while ((s = va_arg (List, char*)) != NULL);		va_end (List);		return sMerge;}int main (int argc, char *argv[]){	char *p;	p = SuperStringsCat (&quot;prova&quot;, &quot; 1,&quot;, &quot; 2,&quot;, &quot; 3&quot;, &quot;...&quot;, NULL);	printf (&quot;%s\n&quot;, p);		return 0;}
</code></pre><br />
<br />
N.B. : Per l'ultimo metodo ringrazio l'utente "uno" del forum di Ubuntu. ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/programmazione-c/programmazione-c-la-concatenazione-di-stringhe/</guid>
</item>
<item>
<title>Glade 3 e Anjuta: Sviluppo (guida glade3-gtk quarta parte)</title>
<link>http://etnablog.altervista.org/programmazione-c/glade-3-e-anjuta-sviluppo-guida-glade3-gtk-quarta-parte/</link>
<description> <![CDATA[ <br /> Ho deciso di raggruppare tutti gli script elementari fatti fino ad ora in un unico e più consultabile archivio. L'archivio è questo:<br />
<br />
 <a href="http://etnablog.altervista.org/misc/script-c/programmi_c.tar.gz">http://etnablog.altervista.org/misc/scri<br />
pt-c/programmi_c.tar.gz</a> <br />
<br />
<br />
Non mi dilungherò a darvi spiegazioni particolari su come agiscono gli script dato che sono abbastanza commentati. <br />
Vi sono cinque script, ve li accenno:<br />
<br />
<h2>prova1</h2><br />
Prova1, è semplicemente un bottone che premuto chiude la sua finestra.<br />
<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#  include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;glade/glade.h&gt;voidok_button_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Thanks for trying out my program.n&quot;);  gtk_main_quit ();}intmain (int argc, char *argv[]){  GladeXML  *main_window;  GtkWidget *widget;  gtk_init (&amp;argc, &amp;argv);  /* Carica l'interfaccia utente */  main_window = glade_xml_new (&quot;example-1.glade&quot;, NULL, NULL);	/* Predispone la gestione del bottone chiamato &quot;OKButton&quot; */  widget = glade_xml_get_widget (main_window, &quot;OKButton&quot;);  g_signal_connect (G_OBJECT (widget), &quot;clicked&quot;,                    G_CALLBACK (ok_button_clicked),                    NULL);	  /* Chiusura del programma quando l'utente chiude la finestra */  widget = glade_xml_get_widget (main_window, &quot;MainWindow&quot;);  g_signal_connect (G_OBJECT (widget), &quot;delete_event&quot;,                    G_CALLBACK (gtk_main_quit), NULL);  /* Avvia il ciclo */  gtk_main ();  return 0;}
</code></pre><br />
<br />
<h2>prova2</h2><br />
Prova2: lo script mostra alcune interazioni tra una finestra realizzata con glade e la shell, quindi va eseguito da shell. Questo script mostra:<br />
- come usare strcmp (comparazione di stringhe)<br />
- come inserire testo in grassetto con glade<br />
- come usare i cicli if-else, <br />
- come gestire un campo dove l'utente inserisce il testo, leggerne il contenuto e stamparlo su shell<br />
- come leggere il contenuto di una label e cambiarlo<br />
Attenzione però: in questo script la gestione delle callback avviene usando l'autoconnect cioè mediante glade_xml_signal_autoconnect (xml);<br />
<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#  include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;gtk/gtk.h&gt;#include &lt;glade/glade.h&gt;on_button1_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Bau n&quot;);}on_button2_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Arrivederci n&quot;);  gtk_main_quit ();}on_button3_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Hai premuto button3 nn&quot;);  gchar stringa2[80]=&quot;&lt;span size=&quot;x-large&quot;&gt;Ciao&lt;/span&gt;&quot;;  GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));  GtkWidget *label = glade_xml_get_widget (self, &quot;label2&quot;);    gchar *stringa1 = gtk_label_get_label(label);    //gchar *stringa1 = gtk_label_get_text (label);   //serve a prendere solo il testo, senza tag di stile  //invece gtk_label_get_label prende anche i tag di stile (se ci sono)  printf (&quot;Il contenuto di &quot;label1&quot; è &quot;%s&quot;n&quot;, stringa1);  printf (&quot;stringa1: %s ; stringa2: %sn&quot;, stringa1, stringa2);  /*  In C per comparare due stringhe fare: if (strcmp (string1, string2) == 0)   o if (g_str_equal (string1, string2))   o if (g_utf8_collate (string1, string2) == 0)  */  if (strcmp (stringa1, stringa2) == 0) {	  gtk_label_set_markup (GTK_LABEL(label), &quot;&lt;span size=&quot;x-large&quot;&gt;è uguale a output&lt;/span&gt;&quot;);	  //gtk_label_set_text(GTK_LABEL(label),&quot;è uguale a output&quot;);  }  else {	  gchar *saluto = &quot;Ciao&quot;;	  //g_strconcat: serve ad unire piu stringhe. Ricordarsi il NULL alla fine!	  gchar *stringa3 = g_strconcat(&quot;&lt;span size=&quot;x-large&quot;&gt;&quot;,saluto,&quot;&lt;/span&gt;&quot;, NULL);	  gtk_label_set_markup (GTK_LABEL(label), stringa3);	  //invece avrei usato:	  //gtk_label_set_text(GTK_LABEL(label),stringa2);	  //Se non avevo tag di stile &lt;span&gt;  }}void on_entry1_activate (GtkWidget *widget, gpointer user_data){   printf (&quot;Hai scritto il tuo nome.n&quot;);     gchar output[80]=&quot;Ciao &quot;;   strcat(output,gtk_entry_get_text(GTK_ENTRY(widget)));   printf (&quot;%s n&quot;,output);}int main (int argc, char *argv[]){	GtkWidget *window1;	GladeXML *xml;	#ifdef ENABLE_NLS		bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);		textdomain (PACKAGE);	#endif	gnome_init (PACKAGE, VERSION, argc, argv);	glade_gnome_init ();	/*	 * The .glade filename should be on the next line.	 */	xml = glade_xml_new (&quot;provalibglade.glade&quot;, NULL, NULL);	/* This is important */	glade_xml_signal_autoconnect (xml);	window1 = glade_xml_get_widget (xml, &quot;window1&quot;);	gtk_widget_show (window1);	gtk_main ();	return 0;}
</code></pre><br />
<br />
<h2>prova3</h2><br />
Prova3: questo script vi mostra come:<br />
- Creare con glade una finestra "notebook"<br />
- Come usare una textview con scroller verticale<br />
- come inserire immagini nelle finestre di glade e scrollarle<br />
- Come cambiare il puntatore del mouse al passaggio sopra un widget<br />
<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#  include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;gtk/gtk.h&gt;#include &lt;glade/glade.h&gt;on_button1_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Bau n&quot;);}on_button2_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Arrivederci n&quot;);  gtk_main_quit ();}on_button3_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Hai premuto button3 nn&quot;);  gchar stringa2[80]=&quot;&lt;span size=&quot;x-large&quot;&gt;Ciao&lt;/span&gt;&quot;;  GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));  GtkWidget *label = glade_xml_get_widget (self, &quot;label2&quot;);    gchar *stringa1 = gtk_label_get_label(label);    //gchar *stringa1 = gtk_label_get_text (label);   //serve a prendere solo il testo, senza tag di stile  //invece gtk_label_get_label prende anche i tag di stile (se ci sono)  printf (&quot;Il contenuto di &quot;label1&quot; è &quot;%s&quot;n&quot;, stringa1);  printf (&quot;stringa1: %s ; stringa2: %sn&quot;, stringa1, stringa2);  /*  In C per comparare due stringhe fare: if (strcmp (string1, string2) == 0)   o if (g_str_equal (string1, string2))   o if (g_utf8_collate (string1, string2) == 0)  */  if (strcmp (stringa1, stringa2) == 0) {	  gtk_label_set_markup (GTK_LABEL(label), &quot;&lt;span size=&quot;x-large&quot;&gt;è uguale a output&lt;/span&gt;&quot;);	  //gtk_label_set_text(GTK_LABEL(label),&quot;è uguale a output&quot;);  }  else {	  gchar *saluto = &quot;Ciao&quot;;	  //g_strconcat: serve ad unire piu stringhe. Ricordarsi il NULL alla fine!	  gchar *stringa3 = g_strconcat(&quot;&lt;span size=&quot;x-large&quot;&gt;&quot;,saluto,&quot;&lt;/span&gt;&quot;, NULL);	  gtk_label_set_markup (GTK_LABEL(label), stringa3);	  //invece avrei usato:	  //gtk_label_set_text(GTK_LABEL(label),stringa2);	  //Se non avevo tag di stile &lt;span&gt;  }}void on_entry1_activate (GtkWidget *widget, gpointer user_data){   printf (&quot;Hai scritto il tuo nome.n&quot;);     gchar output[80]=&quot;Ciao &quot;;   strcat(output,gtk_entry_get_text(GTK_ENTRY(widget)));   printf (&quot;%s n&quot;,output);}int main (int argc, char *argv[]){	GtkWidget *window1;	GladeXML *xml;	#ifdef ENABLE_NLS		bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);		textdomain (PACKAGE);	#endif	gnome_init (PACKAGE, VERSION, argc, argv);	glade_gnome_init ();	/*	 * The .glade filename should be on the next line.	 */	xml = glade_xml_new (&quot;provalibglade.glade&quot;, NULL, NULL);	/* This is important */	glade_xml_signal_autoconnect (xml);	window1 = glade_xml_get_widget (xml, &quot;window1&quot;);	gtk_widget_show (window1);	gtk_main ();	return 0;}
</code></pre><br />
<br />
<h2>prova4</h2><br />
Prova4: mostra come fare ad aprire altre finestre, e a convertire un intero in una stringa.<br />
Questo sarà probabilmente l'ultimo script che realizzerò usando la funzionalità di autoconnect di glade. D'ora in poi cercherò sempre di usare Glade per la parte grafica soltanto, mentre per tutto il resto cercherò di scrivere il codice delle callback manualmente... Lo preferisco.<br />
<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#  include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;glade/glade.h&gt;void on_risultato1_clicked (GtkWidget *widget, gpointer user_data) {   GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));   GtkWidget *label = glade_xml_get_widget (self, &quot;label3&quot;);     char buffer[50];    int a=2, b=2;    g_snprintf(buffer, 49, &quot;%d&quot;, a+b);   //g_snprintf converte l'intero in stringa. E' piu sicuro di usare sprintf.	   gtk_label_set_text(GTK_LABEL(label),buffer);	}void on_risultato2_clicked (GtkWidget *widget, gpointer user_data) {   GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));   GtkWidget *label = glade_xml_get_widget (self, &quot;label3&quot;);     char buffer[50];    int a=4, b=8;    g_snprintf(buffer, 49, &quot;%d&quot;, a*b);	   gtk_label_set_text(GTK_LABEL(label),buffer);	}void on_risultato3_clicked (GtkWidget *widget, gpointer user_data) {   GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));   GtkWidget *label = glade_xml_get_widget (self, &quot;label3&quot;);     char buffer[50];    int a=12, b=4;    g_snprintf(buffer, 49, &quot;%d&quot;, a/b);	   gtk_label_set_text(GTK_LABEL(label),buffer);	}void on_info_button_clicked (GtkWidget *widget, gpointer user_data) {  GtkWidget *window2;  GladeXML *xml;    xml = glade_xml_new (&quot;provaglade4.glade&quot;, NULL, NULL);  glade_xml_signal_autoconnect (xml);  window2 = glade_xml_get_widget (xml, &quot;window2&quot;);  gtk_widget_show (window2);}void on_exit_button_clicked (GtkWidget *widget, gpointer user_data) {  printf (&quot;Arrivederci!n&quot;);  gtk_main_quit ();	}int main (int argc, char *argv[]){	GtkWidget *window1, *widget;	GladeXML *xml;	#ifdef ENABLE_NLS		bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);		textdomain (PACKAGE);	#endif	gnome_init (PACKAGE, VERSION, argc, argv);	glade_gnome_init ();	/*	 * The .glade filename should be on the next line.	 */	xml = glade_xml_new (&quot;provaglade4.glade&quot;, NULL, NULL);	    // Questo servirebbe a fare in modo di modificare tutti i caratteri     //della finestra (escludendo la scelta di default fatta dall'utente 	//nelle impostazioni di GNOME. In realtà è preferibile che sia l'utente 	//a scegliere il carattere che preferisce.	//g_object_set(gtk_settings_get_default(), &quot;gtk-font-name&quot;, &quot;Sans 20&quot;, NULL);//gtk_label_set_use_markup(label, TRUE); gtk_label_set_markup(label, &quot;&lt;b&gt;Your label&lt;/b&gt;&quot;);			/* This is important */	glade_xml_signal_autoconnect (xml);	window1 = glade_xml_get_widget (xml, &quot;window1&quot;);	gtk_widget_show (window1);		/* Chiusura del programma quando l'utente chiude la finestra */    widget = glade_xml_get_widget (xml, &quot;window1&quot;);    g_signal_connect (G_OBJECT (widget), &quot;delete_event&quot;,                    G_CALLBACK (gtk_main_quit), NULL);	gtk_main ();	return 0;}
</code></pre><br />
<br />
<h2>prova5</h2><br />
Prova5:<br />
- NON usa autoconnect<br />
- Mostra come cambiare il testo in una GtkLabel (<strong>senza usare autoconnect</strong>).<br />
- Mostra come prendere un file mediante il gtk_file_chooser_dialog.<br />
<br />
<pre><code>#ifdef HAVE_CONFIG_H#include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;glade/glade.h&gt;voidon_button1_clicked (GtkButton *button, gpointer user_data){	GtkWidget *window1;	window1 = gtk_widget_get_toplevel(button);		char *filename;		GtkWidget *dialog;   dialog = gtk_file_chooser_dialog_new (&quot;Open File&quot;,				      window1,				      GTK_FILE_CHOOSER_ACTION_OPEN,				      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,				      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,				      NULL);   if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)     {       //char *filename;       filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));       //open_file (filename);       // g_free (filename);     }   else filename = &quot;&quot;;	   gtk_widget_destroy (dialog);		/*  Ho preferito ricercare la GtkLabel a partire da window1, per esigenze di esperimento, 	*   ma avrei potuto direttamente scrivere:	*   GladeXML *self = glade_get_widget_tree(GTK_WIDGET(button));    */    GladeXML *self = glade_get_widget_tree(GTK_WIDGET(window1));	GtkWidget *label = glade_xml_get_widget (self, &quot;etichetta&quot;);	gtk_label_set_markup (GTK_LABEL(label), filename);    return 0;  }int main (int argc, char *argv[]){	GtkWidget *window1, *button1;	GladeXML *xml;	    // PACKAGE è definito in config.h	gnome_init (PACKAGE, VERSION, argc, argv);	glade_gnome_init ();		xml = glade_xml_new (&quot;scelta_file.glade&quot;, NULL, NULL);	/* Ho ESCLUSO l'autoconnect, faccio le callback manualmente */	// glade_xml_signal_autoconnect (xml);	window1 = glade_xml_get_widget (xml, &quot;window1&quot;);	button1 = glade_xml_get_widget (xml, &quot;button1&quot;);	g_signal_connect (G_OBJECT (button1), &quot;clicked&quot;,                    G_CALLBACK (on_button1_clicked),                    NULL);  g_signal_connect (G_OBJECT (window1), &quot;delete_event&quot;,                    G_CALLBACK (gtk_main_quit), NULL);			gtk_widget_show (window1);	gtk_main ();	return 0;}
</code></pre><br />
 <img src="http://etnablog.altervista.org/grafica_sito/4all/attention.gif" title="attention.gif" alt="attention.gif"/> Piccola chicca che ancora devo provare: se volete che la vostra interfaccia vi permetta di selezionare directory e NON files, sostituite GTK_FILE_CHOOSER_ACTION_OPEN con GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/programmazione-c/glade-3-e-anjuta-sviluppo-guida-glade3-gtk-quarta-parte/</guid>
</item>
<item>
<title>Glade 3 e Anjuta: Il codice di base</title>
<link>http://etnablog.altervista.org/programmazione-c/glade-3-e-anjuta-il-codice-di-base/</link>
<description> <![CDATA[<p><i>Guida Glade e Anjuta (terza parte)</i></p>
 <br /> Qualche giorno fa abbiamo sviluppato un semplice progettino che rappresentava semplicemente un bottone che chiudeva il programma.<br />
<br />
Oggi dobbiamo parlare un pò di codice. Chi non ha mai programmato mi seguirà a stento ma cercherò di descrivere le cose nel modo più semplice possibile, giusto per fornire un input che dovrebbe avviare verso uno studio un attimino più approfondito facendo uso di guide più strettamente dedicate al codice C.<br />
<br />
In rete ve ne sono tante di guide, come anche nei negozi.<br />
<br />
Ecco il codice di main.c del progetto realizzato:<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#  include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;glade/glade.h&gt;void ok_button_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Grazie per aver provato il programma :)&quot;);  gtk_main_quit ();}intmain (int argc, char *argv[]){  GladeXML  *main_window;  GtkWidget *widget;  gtk_init (&amp;argc, &amp;argv);  /* Carica l'interfaccia utente */  main_window = glade_xml_new (PACKAGE_SOURCE_DIR&quot;/progetto_bottone.glade&quot;, NULL, NULL);	/* Predispone la gestione del bottone chiamato &quot;okbutton&quot; */  widget = glade_xml_get_widget (main_window, &quot;okbutton&quot;);  g_signal_connect (G_OBJECT (widget), &quot;clicked&quot;,                    G_CALLBACK (ok_button_clicked),                    NULL);	  /* Chiusura del programma quando l'utente chiude la finestra */  widget = glade_xml_get_widget (main_window, &quot;window1&quot;);  g_signal_connect (G_OBJECT (widget), &quot;delete_event&quot;,                    G_CALLBACK (gtk_main_quit), NULL);  /* Avvia il ciclo */  gtk_main ();  return 0;}
</code></pre><br />
Vediamo di capire cosa significa quel codice.<br />
<br />
Tanto per cominciare il testo contenuto fra /* e */ è considerato un commento, è messo lì per essere letto da voi e non dalla macchina (che non lo compila).<br />
<br />
Il commento è seguito poi da tre comandi preceduti dal segno "#" (detto "sharp").<br />
<br />
I comandi preceduti da quel segno sono particolari, sono "direttive del preprocessore".<br />
<br />
Letteralmente quei tre comandi stanno a significare:<br />
"Se HAVE_CONFIG_H  è stato definito, allora includi config.h nella compilazione.<br />
<br />
Successivamente (osservate il codice) sono stati inclusi nella compilazione "gnome.h" (che contiene le librerie gtk) e le librerie glade.h (per disporre dei comandi che gestiscono il file .xml prodotto da glade).<br />
<br />
void ok_button_clicked invece è una funzione, che come potete vedere si chiama con lo stesso "ok_button_clicked" che avevate indicato in glade tra le proprietà del bottone.<br />
<br />
Saltiamo per ora questa funzione, e andiamo al cuore del programma, cioè che è contenuto in  "int main ()".<br />
<br />
GladeXML  *main_window; --> In sostanza i file .glade vengono letti dinamicamente mediante la classe "GladeXML". In sostanza quel comando è il primo passo da fare.<br />
<br />
GtkWidget *widget; --> Parlando di programmazione, un "widget" è un elemento di una interfaccia, che permette all'utente di interagirvi. Le Finestre, i bottoni, ogni cosa che avete aggiunto "all'albero" della vostra GUI creata con Glade, è un "widget". Noi possiamo avere accesso ad ogni widget usando "GtkWidget". Nel caso specifico accederemo ad un widget, che, per nostra comodità, chiameremo appunto "*widget".<br />
<br />
L'asterisco di fronte a *widget non è messo a caso, è infatti un "puntatore", e i puntatori sono preceduti da  un asterisco.<br />
<br />
gtk_init --> Passo fondamentale, si occupa di inizializzare l'ambiente ed esaminare gli argomenti della linea di comando (&argc, &argv);<br />
<br />
Le righe successive sono dedicate alla gestione del bottone che avevamo creato e chiamato "ok_button". E' la gestione del tasto.<br />
<br />
Le righe ancora successive servono a chiudere definitivamente il programma quando l'utente clicca sul bottone di chiusura della finestra ("delete_event").<br />
<br />
Queste ultime due operazioni sono dette "callback", cioè richiamano delle funzioni. Se specifichiamo i "segnali" in glade, possiamo omettere queste "callback" manuali e mettere al loro posto un solo comando: glade_xml_signal_autoconnect (xml);<br />
<br />
infine abbiamo gtk_main che serve ad avviare il "ciclo" e infine "return 0".<br />
<br />
Da ora in poi viene il difficile: cercate con google il sito delle GTK e prendete la "reference" (guida di riferimento) dove sono spiegate le sintassi per la gestione della grande quantità di segnali che potete applicare ai widget.<br />
<br />
Per oggi finiamo qui. Scaricate dal sito gnome (gtk in particolare) l' ultima guida aggiornata sulle GTK e ristudiate da lì le sintassi dei comandi che abbiamo usato.<br />
<br />
Qualche link:<br />
 <a href="http://www.gtk.org/">http://www.gtk.org/</a> <br />
 <a href="http://www.gtk.org/tutorial/">http://www.gtk.org/tutorial/</a>  ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/programmazione-c/glade-3-e-anjuta-il-codice-di-base/</guid>
</item>
<item>
<title>Glade 3 e Anjuta: creazione di un bottone</title>
<link>http://etnablog.altervista.org/programmazione-c/glade-3-e-anjuta-creazione-di-un-bottone/</link>
<description> <![CDATA[<p><i>Guida Glade (seconda parte)</i></p>
 <br /> Nella puntata precedente di questa guida, avevamo visto semplicemente come si crea una semplice finestra con un pò di testo dentro, ed avevamo visto come rappresentarla e come compilare il tutto.<br />
<br />
C è infatti un linguaggio che và compilato, cioè il codice scritto dal programmatore, in un linguaggio a lui comprensibile, va tradotto in un formato comprensibile alla macchina.<br />
<br />
Una volta tradotto ("compilato") si ottiene un file detto "eseguibile" che da noi non è più modificabile.<br />
<br />
Il linguaggio "Python" non è "compilato" ma "interpretato", detto in parole povere, non avete bisogno, con Python, di compilare il vostro script per eseguirlo.<br />
<br />
Nel tutorial di oggi, cercherò di essere più rapido rispetto l'altra volta, nel senso che non mi dilungherò a spiegare dettagli già trattati nella scorsa puntata della guida... Però aggi imparerete a fare mooolte cose :)<br />
<br />
Senza indugio, quindi aprite Anjuta e create un nuovo progetto "LibGlade 2.0" servendovi del Wizard, e chiamate questo progetto "progetto_bottone".<br />
<br />
Quindi aprite Glade: manipoliamo il file "progetto_bottone.glade" creato da Anjuta.<br />
<br />
Dividete la finestra (ancora grigia e vuota) in due celle orizzontali (strumento vbox o "casella verticale" <img src="http://etnablog.altervista.org/grafica_sito/varie/casella_verticale.png" alt="casella verticale"/>).<br />
<br />
Nelle proprietà del vbox settate "spaziatura" a 12, otterrete questo:<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez-2-1.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez-2-1.png" title="lez-2-1.png" alt="lez-2-1.png" width="100"/></a><br />
Avete quindi adesso una finestra divisa in due celle, una in alto ed una in basso.<br />
<br />
 <img src="http://etnablog.altervista.org/grafica_sito/4all/attention.gif" title="attention.gif" alt="attention.gif"/> <strong>Se cliccate sulle foto di questo blog le ingrandirete. Se una volta ingrandite cliccate nell'angolino in basso a destra della foto, sarà ancora più grande </strong> <img src="http://etnablog.altervista.org/grafica_sito/4all/smile.gif" title="smile.gif" alt="smile.gif"/><br />
<br />
Adesso con lo strumento hbox (<img src="http://etnablog.altervista.org/grafica_sito/varie/hbox.png" alt="casella orizzontale"/>) dividete la cella in alto in due, e settate anche qui la "spaziatura" a 12.<br />
Otterrete questo:<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_2.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_2.png" title="lez2_2.png" alt="lez2_2.png" width="100"/></a><br />
Osservate nel vostro "albero degli oggetti" (ispettore), come hbox sia un ramo al di sotto di vbox.<br />
<br />
Adesso prendete lo strumento immagine (<img src="http://etnablog.altervista.org/grafica_sito/varie/Immagine.png" alt="strumento immagine"/>) e piazzate una immagine nella cella in alto a sinistra.<br />
Cliccateci sopra e preparatevi a modificarne le proprietà:<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_3.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_3.png" title="lez2_3.png" alt="lez2_3.png" width="100"/></a><br />
Modifichiamo le proprietà dell'immagine, in "Modifica tipo" selezionate "stock", e in "Immagine stock selezionate il segnale di pericolo.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_4.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_4.png" title="lez2_4.png" alt="lez2_4.png" width="100"/></a><br />
Inoltre, sempre nelle proprietà dell'immagine, modifichiamo "Dimensione icona" e impostatela a 6.<br />
<br />
Adesso mettete una label (<img src="http://etnablog.altervista.org/grafica_sito/varie/label.png" alt="strumento label"/>) nella cella accanto all'immagine.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_5.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_5.png" title="lez2_5.png" alt="lez2_5.png" width="100"/></a><br />
Adesso modificate il contenuto nella label e scrivetegli dentro questo:<br />
<pre><code>&lt;span weight=&quot;bold&quot; size=&quot;larger&quot;&gt;Questo programma non fa nulla di importante&lt;/span&gt;Non è stato aggiunto codice al programma se non quello sufficiente a mostrare il pulsante, che chiuderà il tutto.
</code></pre><br />
Il risultato sarà questo:<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_6.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_6.png" title="lez2_6.png" alt="lez2_6.png" width="100"/></a><br />
A questo punto, sempre nelle proprietà, premete il bottone "usa i marcatori".<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_7.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_7.png" title="lez2_7.png" alt="lez2_7.png" width="100"/></a><br />
Adesso selezionate lo strumento "dialog-action-area" (<img src="http://etnablog.altervista.org/grafica_sito/varie/dialog-action-area.png" alt="strumento dialog-action-area"/>), mettetelo nella cella rimasta libera e, dalle proprietà di questo, impostate come "Numero di elementi" il numero 1.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_8.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_8.png" title="lez2_8.png" alt="lez2_8.png" width="100"/></a><br />
Prendete a questo punto un bottone (<img src="http://etnablog.altervista.org/grafica_sito/varie/bottone.png" alt="strumento bottone"/>) e piazzatelo lì dove lo spazio è rimasto libero.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_9.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_9.png" title="lez2_9.png" alt="lez2_9.png" width="100"/></a><br />
Adesso rendete questo bottone, agendo sulle sue opzioni, un bottone di tipo "stock" e scegliete per lui il tipo "OK".<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_10.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_10.png" title="lez2_10.png" alt="lez2_10.png" width="100"/></a><br />
Adesso nelle proprietà del bottone, andate dove c'è "segnali" e selezionate "clicked" e nel campo accanto scrivete "ok_button_clicked" (come nella foto) e assicuratevi di confermarne la modifica con invio.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_11.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_11.png" title="lez2_11.png" alt="lez2_11.png" width="100"/></a><br />
Adesso modificate il nome del bottone e chiamatelo "okbutton".<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_12.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/lez2_12.png" title="lez2_12.png" alt="lez2_12.png" width="100"/></a><br />
Bene! con Glade abbiamo finito, adesso prendiamo di nuovo Anjuta e modifichiamo <strong>main.c</strong><br />
<br />
main.c dovrebbe presentarsi così ai vostri occhi:<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#  include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;glade/glade.h&gt;int main (int argc, char *argv[]){	GtkWidget *window1;	GladeXML *xml;	#ifdef ENABLE_NLS		bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);		textdomain (PACKAGE);	#endif	gnome_init (PACKAGE, VERSION, argc, argv);	glade_gnome_init ();	/*	 * The .glade filename should be on the next line.	 */	xml = glade_xml_new (PACKAGE_SOURCE_DIR&quot;/progetto_bottone.glade&quot;, NULL, NULL);	/* This is important */	glade_xml_signal_autoconnect (xml);	window1 = glade_xml_get_widget (xml, &quot;window1&quot;);	gtk_widget_show (window1);	gtk_main ();	return 0;}
</code></pre><br />
<br />
Modificatelo e fatelo diventare così come sto per mostrarvi (sostituite tutto main.c):<br />
<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#  include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;glade/glade.h&gt;void ok_button_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Grazie per aver provato il programma :)&quot;);  gtk_main_quit ();}intmain (int argc, char *argv[]){  GladeXML  *main_window;  GtkWidget *widget;  gtk_init (&amp;argc, &amp;argv);  /* Carica l'interfaccia utente */  main_window = glade_xml_new (PACKAGE_SOURCE_DIR&quot;/progetto_bottone.glade&quot;, NULL, NULL);	/* Predispone la gestione del bottone chiamato &quot;okbutton&quot; */  widget = glade_xml_get_widget (main_window, &quot;okbutton&quot;);  g_signal_connect (G_OBJECT (widget), &quot;clicked&quot;,                    G_CALLBACK (ok_button_clicked),                    NULL);	  /* Chiusura del programma quando l'utente chiude la finestra */  widget = glade_xml_get_widget (main_window, &quot;window1&quot;);  g_signal_connect (G_OBJECT (widget), &quot;delete_event&quot;,                    G_CALLBACK (gtk_main_quit), NULL);  /* Avvia il ciclo */  gtk_main ();  return 0;}
</code></pre><br />
<br />
<br />
Bene a questo punto salvate, fate "genera" (o "make") e infine esegui (o se preferite premete F11 e poi F3).<br />
<br />
Dovrebbe funzionare :) se non funziona riguardatevi qualche passaggio.<br />
<br />
Ha funzionato? Bene, adesso, con Glade, modificate di nuovo il vostro "progetto_bottone.glade".<br />
<br />
Dobbiamo modificare un "segnale" nella nostra finestra (window1). Quindi selezioniamo "window1" e in "segnali" scegliere "GtkWidget" e in questo selezionare "delete-event". Qui inserite "gtk_main_quit".<br />
<br />
A questo punto salvate progetto_bottone.glade, riaprite Anjuta e modificate così il vostro file main.c :<br />
<br />
<pre><code>/* Created by Anjuta version 1.2.4a *//*	This file will not be overwritten */#ifdef HAVE_CONFIG_H#  include &lt;config.h&gt;#endif#include &lt;gnome.h&gt;#include &lt;glade/glade.h&gt;void ok_button_clicked (GtkWidget *widget, gpointer user_data){  printf (&quot;Grazie per aver provato il programma :)&quot;);  gtk_main_quit ();}intmain (int argc, char *argv[]){  GladeXML  *main_window;  GtkWidget *widget;  gtk_init (&amp;argc, &amp;argv);  /* Carica l'interfaccia utente */  main_window = glade_xml_new (PACKAGE_SOURCE_DIR&quot;/progetto_bottone.glade&quot;, NULL, NULL);  glade_xml_signal_autoconnect (main_window);  /* Avvia il ciclo */  gtk_main ();  return 0;}
</code></pre><br />
<br />
Ha funzionato anche adesso? Studiate le differenze tra questo ultimo script e il precedente: capirete come il comando "glade_xml_signal_autoconnect" abbia per voi fatto quella che si chiama "callback" verso la funzione "gtk_main_quit" (che serve a chiudere tutto). :)<br />
<br />
Ad ogni modo potete scaricare l'intero progetto appena realizzato da qui:<br />
 <a href="http://etnablog.altervista.org/misc/script-c/progetto_bottone.tar.gz">http://etnablog.altervista.org/misc/scri<br />
pt-c/progetto_bottone.tar.gz</a> <br />
<br />
Nella prossima puntata parleremo un pò di "codice" :)<br />
<br />
A presto! ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/programmazione-c/glade-3-e-anjuta-creazione-di-un-bottone/</guid>
</item>
<item>
<title>Guida alla creazione di programmi in C, con Glade, Anjuta, LibGlide</title>
<link>http://etnablog.altervista.org/programmazione-c/guida-alla-creazione-di-programmi-in-c-con-glade-anjuta-libglide/</link>
<description> <![CDATA[<p><i>Guida alla programmazione C con GTK+ di Etnablog : Prima parte</i></p>
 <br /> <h2>Introduzione a Glade 3 e le Libglide</h2><br />
Glade Interface Designer (o semplicemente "Glade") è un software per la creazione di GUI (Graphics User Interface, interfacce utente) basato su GTK+.      <br />
      <br />
E' troppo definire Glade un IDE (Integrated Development Enviroment, cioè un ambiente integrato di sviluppo), ma è giusto definire Glade un buon RAD (Rapid Application Developer) per quel che riguarda la parte "grafica" di una GUI..      <br />
      <br />
Grazie a questo software è possibile, in punta di click, costruire facilmente tutta la parte grafica relativa ad un vostro programma.      <br />
Una volta realizzata la vostra interfaccia, Glade la salverà in un file con estensione .glade , che è in formato XML, che verrà poi letto ("parsato") grazie alle librerie "libglide".      <br />
      <br />
Questo sistema è così versatile che, procurandosi tutte le librerie che servono, è possibile ricompilare il vostro software per essere usato anche con Windows.<br />
Per ulteriori informazioni riguardo la compatibilità con Windows vedi:  <a href="http://gladewin32.sourceforge.net/modules/wfdownloads/">http://gladewin32.sourceforge.net/module<br />
s/wfdownloads/</a>       <br />
      <br />
Glide rende enormemente piu piacevole la vostra esperienza di programmazione.      <br />
      <br />
A me piace sviluppare in linguaggio C, e uso Glade per le mie interfacce grafiche.      <br />
      <br />
Si impara presto ad usare Glade, ma per creare delle buone interfacce utente non è sufficiente sapere usare soltanto Glade, occorre infatti conoscere le GTK+ che è un "toolkit", cioè un insieme molto ricco di comandi utilissimi a sviluppare interfacce utente, che supporta numerosi linguaggi fra cui Java, Python, C, C++ (e altri!).      <br />
In realtà però, per cominciare a sviluppare delle interfacce utente decenti, usando Glade, è sufficiente conoscere soltanto alcuni comandi e regole essenziali di GTK+.      <br />
      <br />
Se avete voglia di creare delle GUI complicate e con funzioni dinamiche, le vostre conoscenze di GTK+ dovranno crescere di pari passo con la vostra voglia di esagerare.   <br />
<br />
Questa guida è diretta a chi non ha mai programmato C, per chi invece è già esperto si tratterà di certo di un utile ripasso.<br />
<br />
Non posso purtroppo descrivere nei dettagli le basi della programmazione C, andrebbe oltre lo scopo di questa guida, ma spero di indurre in ogni novizio la voglia di approfondire da sè l'argomento.<br />
<br />
Sarò molto dettagliato e lento inizialmente, già dopo le prime lezioni mirerò più al sodo :)<br />
      <br />
<br />
<h2>Anjuta</h2><br />
Anjuta è un IDE (cioè un ambiente di sviluppo integrato) per sviluppare programmi C e C++.      <br />
      <br />
Una volta costruita, usando Glade, la parte grafica del nostro programma, serve Anjuta per dare un senso a tutto quanto, per dire al sistema cosa deve fare di tutti quei bottoni e accessori che abbiamo inserito nelle nostre finestre con Glade.<br />
<br />
<h2>Installiamo Glade, Anjuta e gli altri accessori</h2><br />
<br />
La distribuzione che ho usato è una Ubuntu Feisty.<br />
<br />
Cercate in Synaptic ed installate i pacchetti:<br />
<br />
- glade-3<br />
- glade-gnome-3<br />
- libglade2-dev<br />
- libgtk2.0-dev<br />
- anjuta<br />
- anjuta-common<br />
- g77<br />
- autoconf<br />
- devhelp<br />
- devhelp-common<br />
<br />
Eventuali altri pacchetti dovrebbero essere installati in automatico da Synaptic: siete pronti per cominciare.<br />
<br />
<h2>Sviluppare la prima applicazione</h2><br />
<br />
Completata l'installazione, dovreste trovarvi Glade e Anjuta già nel menu di GNOME (magari in una apposita sezione "programmazione").<br />
<br />
Aprite Anjuta e "create un nuovo progetto" servendovi del "wizard di applicazioni".<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/1-wizard.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/1-wizard.png" title="1-wizard.png" alt="1-wizard.png" width="100"/></a><br />
Selezionate che volete creare un "LibGlade 2.0 Project".<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/2-libglade.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/2-libglade.png" title="2-libglade.png" alt="2-libglade.png" width="100"/></a><br />
Quindi andate avanti e scrivete il nome del vostro primo progetto, ad esempio "primo_programma" (è preferibile che il nome non sia interrotto da spazi, piuttosto usate l'underscore.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/3-primo_programma.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/3-primo_programma.png" title="3-primo_programma.png" alt="3-primo_programma.png" width="100"/></a><br />
A questo punto vi chiede una piccola descrizione del vostro progetto, scrivete una cosa qualsiasi e andate ancora avanti e avanti ancora senza fare modifiche fino a cliccare su  "Applica".<br />
<br />
A questo punto Anjuta fa una prima "autogenerazione". Nella parte bassa dello schermo lo osservate fare alcune operazioni. Aspettate che termini.<br />
<br />
Alla fine, se tutto è andato bene, terminerà con un "Completed ... Successful".<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/4-pronti_per_cominciare.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/4-pronti_per_cominciare.png" title="4-pronti_per_cominciare.png" alt="4-pronti_per_cominciare.png" width="100"/></a><br />
Se il vostro risultato non è questo e qualcosa è andato storto, ricontrollate le operazioni che ha eseguito e osservate di quali pacchetti ancora mancate per potere lavorare, ed installateli con Synaptic.<br />
<br />
Osservate: sulla sinistra avete un elenco dei file che compongono il vostro progetto. Cercate la directory "source - src" ed aprite il file "main.c".<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/5-iniziamo.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/5-iniziamo.png" title="5-iniziamo.png" alt="5-iniziamo.png" width="100"/></a><br />
<strong>main.c</strong> è il file principale, da cui partirà il nostro progetto. Tanto per cominciare, guardate nel menu in alto e dal sottomenu "genera" selezionate il tasto "genera" (o direttamente premete il F11 nella vostra tastiera).<br />
<br />
Premendo su "genera", quello che lui in realtà fa è eseguire un comando "make", e crea un eseguibile del vostro programma, che eseguirete poi con il tasto "esegui" dello stesso menù (o premete F3 nella vostra tastiera). Fatelo, dovreste vedere la vostra prima finestra vuota, tutta da riempire a vostra fantasia. :)<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/6-prima_finestra.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/6-prima_finestra.png" title="6-prima_finestra.png" alt="6-prima_finestra.png" width="100"/></a><br />
Bene, a questo punto mettiamo da parte anjuta (non chiudetelo però) ed apriamo Glade.<br />
<br />
Osservate l'interfaccia di Glade. Sulla sinistra ci sono gli strumenti utili alla creazione, sulla sinistra avete la finestre "ispettore" e proprietà, capiremo presto a cosa servono.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/7-interfaccia_glade.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/7-interfaccia_glade.png" title="7-interfaccia_glade.png" alt="7-interfaccia_glade.png" width="100"/></a><br />
Con Glade, dovrete modificare un file con estensione .glade, che si trova nel progetto che avete creato poco fa con Anjuta, che dovrebbe trovarsi in una apposita cartella "Projects" generata da Anjuta stesso nella vostra home.<br />
<br />
Cercate questo file .glade e selezionatelo (se avevate chiamato il vostro progetto "primo_programma", dovrebbe essere "primo_programma.glide".<br />
<br />
A questo punto dovreste vedere spuntare nella finestra "ispettore" un oggetto "window1" o simile, cliccatevi sopra due volte ed ecco la vostra finestra iniziale, grigia e vuota.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/8-finestra_vuota.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/8-finestra_vuota.png" title="8-finestra_vuota.png" alt="8-finestra_vuota.png" width="100"/></a><br />
Indugiando col mouse, senza cliccare, su ogni strumento in Anjuta, vedrete comparire una finestrella (detta "tooltip") che vi spiega a cosa serve lo strumento che state puntando.<br />
<br />
Prendete lo strumento "casella verticale" (<img src="http://etnablog.altervista.org/grafica_sito/varie/casella_verticale.png" alt="casella verticale"/>) e cliccate sulla vostra finestra grigia e vuota.<br />
Potete impostare il numero di divisioni della vostra finestra, 3 vanno bene.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/9-casella-verticale.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/9-casella-verticale.png" title="9-casella-verticale.png" alt="9-casella-verticale.png" width="100"/></a><br />
Adesso prendete Lo strumento "label" (<img src="http://etnablog.altervista.org/grafica_sito/varie/label.png" alt="label"/>) e inseritelo in mezzo.<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/10-label.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/10-label.png" title="10-label.png" alt="10-label.png" width="100"/></a><br />
Adesso guardate la finestra "ispettore" ed aprite quello che è "l'albero" della vostra finestra ed evidenziate "label".<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/11-label2.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/11-label2.png" title="11-label2.png" alt="11-label2.png" width="100"/></a><br />
Modificate adesso le proprietà della vostra "label" con l'apposito pannello e ne cambierete così facilmente il contenuto.<br />
<br />
A questo punto, visto che "già state imparando a muovervi", modificate da voi stessi la dimensione di "Window1" agendo sulle sue proprietà. Impostate 300 sia come "larghezza predefinita", sia come "altezza predefinita"  :)<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/12-window1-size.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/12-window1-size.png" title="12-window1-size.png" alt="12-window1-size.png" width="100"/></a><br />
Bene, a questo punto salvate il vostro lavoro e tornate su Anjuta.<br />
<br />
Cliccate su esegui e voilà :)<br />
 <a href="http://etnablog.altervista.org/immagini/Etnablog/img_small/13-esecuzione.png"><img src="http://etnablog.altervista.org/immagini/Etnablog/img_small/13-esecuzione.png" title="13-esecuzione.png" alt="13-esecuzione.png" width="100"/></a><br />
La prima lezione finisce qui. La prossima volta aggiungeremo bottoni e altro :) ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/programmazione-c/guida-alla-creazione-di-programmi-in-c-con-glade-anjuta-libglide/</guid>
</item>
<item>
<title>Il passaggio da Windows a Linux</title>
<link>http://etnablog.altervista.org/linux/il-passaggio-da-windows-a-linux/</link>
<description> <![CDATA[<p><i>Guida: Passare da Windows a Linux (Sedicesima parte)</i></p>
 <br /> Se avete letto tutta la parte precedente di questa guida, sono certo che una minima idea su cosa voglia dire passare da Windows a Linux ve la sarete fatta.<br />
Se può esservi sembrato tutto troppo complicato sappiate e ricordatevi che:<br />
<ul><li>Le guide sembrano molto più difficili lette sullo schermo di quanto non lo siano stampate su carta. E' questo uno dei motivi per cui vi consiglio di stampare questa guida e leggerla con calma.</li><br />
<li>Si fa presto l'abitudine ad entrare nei meccanismi che regolano Linux, vi sembrerà incredibile ma è così, ed una volta entrati nel meccanismo vi sentirete così padroni del vostro sistema che ve lo adatterete come un guanto.</li><li>Se non siete laureati in informatica ma avete sempre e solo usato Windows e le vostre conoscenze di Linux sono pari a zero, come così era per me, in una settimana di Linux avrete di certo configurato tutto il sistema, ed in un mesetto saprete tutto quello che c'è da sapere per usarlo in serenità, senza essere dei grandi esperti.</li><li>Ricordate che quasi per ogni problema che incontrerete qualcuno, nel sito della vostra distribuzione e in centinaia di altri siti, blog e forum in rete, gratuitamente vi ha pensato ed ha scritto per voi una guida per risolvere il vostro problema.</li></ul><br />
Se nel vostro pc vi è ancora solo Windows e non avete ancora installato Linux, ma pensate di farlo, vi dò alcuni suggerimenti per una migrazione da Windows a Linux quanto più possibile serena:<br />
<br />
Cominciate ad abituarvi, in Windows stesso, ad usare del software libero, in particolare quel software che ritroverete uguale da Windows a Linux.<br />
<br />
Questo basterà già da solo a rendere il vostro passaggio più amichevole e meno traumatico.<br />
<br />
Siete ancora in Windows giusto? Tanto per cominciare: <br />
<ul><li>Smettetela di usare <strong>Internet Explorer</strong> ed installatevi <strong>Firefox</strong>: è gratis</li><li>Smettetela di usare <strong>Outlook</strong> per la posta elettronica, ed installatevi <strong>Thunderbird</strong>: è gratis.</li><li>Smettetela di usare <strong>Windows Media Player</strong> per vedere i vostri film ed ascoltare musica, ed installatevi <strong>VLC</strong>: è gratis.</li><br />
</ul>E' tutto software che potete <strong>scaricare gratis dai rispettivi siti</strong>.<br />
<br />
Considerate che tutti i "siti preferiti" che avete salvato in Firefox su Windows, potrete tranquillamente passarli nel Firefox in Linux, e lo stesso vale per <strong>Thunderbird</strong>: <strong>tutta la vostra posta elettronica, gli account, potrete ripassarli da Windows a Linux</strong>.<br />
<br />
Non appena avrete preso confidenza con questi tre software su Windows, che vi ritroverete uguali in Linux, scaricatevi una distribuzione Linux.<br />
<br />
Quale fra le tante distribuzioni? Qui di campane ce ne sono tante, io personalmente vi consiglio <strong>Ubuntu Feisty</strong>, ma in molti consigliano, almeno per ora, di usare la versione "<strong>Dapper</strong>", che è la versione di Ubuntu più collaudata ed a lungo termine di supporto ("LTS").<br />
<br />
Ubuntu Feisty è attualmente la versione di Ubuntu più avanzata al momento.<br />
<br />
Io ho due hard disk nel mio pc, uno da 80 giga ed uno da 20 giga.<br />
<br />
Ho lasciato Windows XP nell'hard disk da 80 ed ho dedicato l'intero HD da 20 giga ad Ubuntu.<br />
<br />
Se però avete un solo, grosso Hard Disk nel vostro pc, dovrete fare in modo di liberare un pò di spazio per Linux.<br />
<br />
Al momento dell'installazione sarà Linux stesso che vi chiederà quanto spazio, del vostro hard disk, volete dedicare a Linux e quanto volete rimanga a Windows. Così Linux stesso creerà la sua partizione.<br />
<br />
Mi raccomando: Prima di fare QUALSIASI operazione sulle partizioni, <strong>prima di installare Linux, fatevi una copia di ogni dato importante che avete in Windows</strong>. Se combinate qualche sciocchezza durante la procedura di partizionamento e formattazione, rischiate di perdere tutti i dati.<br />
<br />
Sicchè salvatevi l'archivio della posta, i vostri mp3 e divx preferiti, documenti importanti, ecc. ecc..<br />
<br />
Piccola nota: se il vostro hard disk è ancora vuoto e volete installare sia Windows XP che Linux, <strong>installate sempre prima Windows</strong> perchè Windows vuole sentirsi sempre la prima donna nel vostro pc, e non accetta di essere installato in una partizione secondaria.<br />
<br />
Personalmente, dopo avere avviato il pc dal CD di Ubuntu, <strong>ho semplicemente seguito i passaggi del programma di installazione</strong>, che mi formattò l'hard disk e vi installò rapidamente Ubuntu.<br />
<br />
Il mio primo avvio di Ubuntu fu per me sorprendente: già tutto funzionava alla perfezione, porte USB, HUB USB, scheda grafica (ma senza accelerazione 3d), audio, scheda di rete e connessione ad internet mediante il mio router, e persino la webcam.<br />
<br />
Se avete avuto la mia stessa fortuna, la prima cosa da fare è di cercarvi subito, in Synaptic, i pacchetti di installazione di <strong>Firefox, Thunderbird, VLC</strong> (Firefox dovreste trovarlo già attivo di default, gli altri non credo, quindi scaricateli con Synaptic).<br />
<br />
Se tutto andrà bene, come lo è stato per me bsterà poco tempo dal vostro iniziale entusiasmo che vi renderete conto che ci sono delle cosine che non vanno.<br />
<br />
Ecco i primi problemi in cui vi potreste imbattere:<br />
<ul><li><strong>Connessione ad internet non funzionante</strong>. Soluzione: cercate nel sito della distribuzione su come configurare il vostro modem e la connessione ADSL.</li><li><strong>Avviate un gioco 3d o google Earth e scoprite che non vi funziona l'accelerazione 3d</strong>. Soluzione: prima guardate la sezione di questa guida relativa alle schede grafiche e poi cercate nel sito della vostra distribuzione come fare ad installare i driver giusti.</li><li><strong>Non funzionano i file midi</strong>. Soluzione: vedi l'apposita sezione in questa stessa guida.</li><li><strong>Non funziona la riproduzione dei filmati o di qualche filmato, mpg, avi, DVD o altro</strong>. Soluzione: Dovrebbe partire in automatico un tentativo di installazione del codec video giusto. Se questo non succede, leggi la sezione sulle schede grafiche in questa guida e poi vai al sito della distribuzione per cercare le soluzioni all'ultimo grido, fatte apposta per la tua distribuzione, per installare tutti i codec video.</li><li><strong>Non funzionano le applet in JAVA ed i siti in FLASH su Firefox</strong>: Soluzione: problema comune e di facile soluzione. Fai una ricerca nel sito della tua distribuzione su come installare Java e flash.</li><li><strong>Non si sente l'audio nei siti in flash su Firefox</strong>. Soluzione: vedi sezione "cartelle utilizzate da linux" in questa stessa guida( cerca "/etc/firefox/firefoxrc")</li></ul><br />
Per quanto riguarda il <strong>cominciare</strong> ad utilizzare Linux tutto quello che è scritto in questa guida dovrebbe essere sufficiente.<br />
<br />
La mia personale raccomandazione è questa: siate pazienti. Linux è una grande comunità ed è piena di gente che vuole aiutarvi.<br />
<br />
Visitate il forum della vostra distribuzione e non esitate a chiedere lì le vostre perplessità. <br />
<br />
Abituatevi inoltre ad usare Google, Yahoo e gli altri motori di ricerca, compresi quelli dei forum della vostra distribuzione, per risolvere i vostri problemi quando questi si presentano.<br />
<br />
Una ultima cosa: In questa guida vi sono elencati tutti i <strong>principali problemini</strong> a cui va incontro un utente che passa a Linux (in particolare Ubuntu), credetemi questa <strong>è la guida che tanto avrei voluto avere io al momento del grande salto</strong>.<br />
<br />
 Avete visto come per molti problemi la soluzione è stata dirvi "cercate nel forum" o "fate riferimento al sito della vostra distribuzione". Questo non per mia pigrizia o perchè mi annoiassi a spiegarvi le soluzioni ai vostri problemi, ma perchè i ragazzi dei forum tengono aggiornate le guide da loro scritte, specificatamente, per la distribuzione che avete voi, e vi danno il necessario supporto.<br />
<br />
Nessuno mi ha pagato per scrivere questa guida, spero vi sia stata utile, e spero anche, che se riporterete dei brani di questa guida nei vostri siti, ne citerete la fonte.. Non è solo un fatto di onestà intellettuale, ma un fatto di.. Cuore.<br />
<br />
Un buon linux a tutti da <strong>Etnablog.com</strong><br />
<br />
<br />
 <a href="http://etnablog.altervista.org/linux/passare-da-windows-a-linux-prima-parte/">Torna al menù principale della "Guida su Linux"</a> <br />
 ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/linux/il-passaggio-da-windows-a-linux/</guid>
</item>
<item>
<title>Gli script di shell, i file .sh</title>
<link>http://etnablog.altervista.org/linux/gli-script-di-shell-i-file-sh/</link>
<description> <![CDATA[<p><i>Guida: Passare da Windows a Linux (Quindicesima parte)</i></p>
 <br /> Questi file .sh sono dei file di testo in cui vengono immesse delle operazioni da riga di comando.      <br />
Un esempio di "rudimentale" file .sh:<br />
<br />
#!/bin/sh<br />
#Questo è un commento e non viene interpretato<br />
echo "Questo verrà scritto"<br />
     <br />
Il primo rigo (<strong>#!/bin/sh</strong>) precisa che il file dovrebbe essere processato dall'interprete <strong>sh</strong>, che normalmente si trova appunto nella cartella <strong>/bin/sh</strong>.      <br />
La seconda riga è un semplice commento.      <br />
In terza riga vi è il comando <strong>echo</strong> che stampa il testo contenuto tra le virgolette.      <br />
      <br />
Questi script .sh possono essere lanciati da una finestra di terminale facendo:      <br />
sh /percors/verso/ilfile.sh<br />
      <br />
oppure, se il file è "eseguibile", si può fare:      <br />
/percors/verso/ilfile.sh <strong>(se il file è "eseguibile")</strong><br />
oppure, se ci troviamo gia nella cartella, si può eseguire semplicemente facendo:      <br />
./ilfile.sh <strong>(se il file è "eseguibile")</strong><br />
      <br />
Per essere il file "<strong>eseguibile</strong>" bisogna renderlo tale facendo:      <br />
chmod +x ilfile.sh<br />
<br />
 <a href="http://etnablog.altervista.org/linux/passare-da-windows-a-linux-prima-parte/">Torna al menù principale della "Guida su Linux"</a> <br />
 ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/linux/gli-script-di-shell-i-file-sh/</guid>
</item>
<item>
<title>Cominciare a programmare C con GTK e Java</title>
<link>http://etnablog.altervista.org/linux/cominciare-a-programmare-c-con-gtk-e-java/</link>
<description> <![CDATA[<p><i>Guida: Passare da Windows a Linux (Quattordicesima parte)</i></p>
 <br /> Giusto due accenni sul cominciare a programmare in C, su cosa sono le GTK e come si potrebbe fare ad usarle in C.      <br />
      <br />
Il <strong>GTK+</strong> (acronimo che sta per GIMP ToolKit) è un toolkit (insieme di strumenti, di cui il principale è la libreria <strong>libgtk</strong>) che serve per programmare usando le finestre, nello stile di GNOME.      <br />
Per sviluppare facendo uso delle gtk, qui su Ubuntu, dovete installare da synaptic il pacchetto <strong>libgtk2.0-dev</strong>.      <br />
      <br />
Il vostro programma, realizzato per essere compatibile con le GTK, va compilato con una istruzione simile a questa:<br />
gcc -Wall -g primo.c -o primo `pkg-config --cflags --libs gtk+-2.0`<br />
<strong>GCC</strong> (GNU Compiler Collection, in origine GNU C Compiler) è il compilatore C di linux. Alcuni parametri importanti:      <br />
-Wall : abilita tutti i messaggi di warning.      <br />
-g : aggiunge informazioni aggiuntive utili per il debugging.      <br />
-o nomefile : è il nome di come si chiamerà il file compilato.      <br />
pkg-config : è uno strumento che serve a comunicare al compilatore i percorsi giusti (PATH) che servono alle librerie. Nel nostro caso il comando pkg-config e i suoi argomenti sono contenuti fra degli apici storti che sono detti "backquotes". Questi vanno fatti premendo il tasto <strong>ALTGR + '</strong> (apice). Fra gli apici reversi va un comando (esattamente come se lo stessimo eseguendo da shell).<br />
<br />
pkg-config pesca le informazioni "gtk+-2.0" dall'apposito file che si trova nella cartella /usr/lib/pkgconfig/<br />
<br />
Nel sito ho dedicato una apposita sezione alla programmazione con C e glade (designer di GUI).<br />
<br />
Una piccola curiosità:<br />
Invece di usare il comando gcc, spesso si usa il comando "cc", che in realtà è un link ad una versione del compilatore gcc che abbiamo installato (potremmo anche averne installata piu di una).<br />
<br />
Lo stesso comando gcc è un link.<br />
<br />
Osservate:<br />
<pre><code>attorianzo@attorianzo-desktop:~$ which gcc/usr/bin/gccattorianzo@attorianzo-desktop:~$ ls -lah /usr/bin/gcclrwxrwxrwx 1 root root 7 2007-04-20 17:45 /usr/bin/gcc -&gt; gcc-4.1
</code></pre><br />
Come potete vedere, "gcc" punta alla versione 4.1.<br />
<br />
Per quanto riguarda cc:<br />
<pre><code>attorianzo@attorianzo-desktop:~$ which cc/usr/bin/ccattorianzo@attorianzo-desktop:~$ ls -lah /usr/bin/cclrwxrwxrwx 1 root root 20 2007-04-20 17:45 /usr/bin/cc -&gt; /etc/alternatives/ccattorianzo@attorianzo-desktop:~$ ls -lah /etc/alternatives/cclrwxrwxrwx 1 root root 12 2007-07-05 17:10 /etc/alternatives/cc -&gt; /usr/bin/gcc
</code></pre><br />
Quindi "cc" punta a "gcc". (fonte:  <a href="http://forum.ubuntu-it.org/index.php?topic=75375.0">forum Ubuntu</a> )<br />
<br />
<br />
</p><div style="white-space:pre; margin:left:auto;margin-right:auto; margin-top:1em; margin-bottom:1em; text-align:center">*			*			*</div><p><br />
Per quanto riguarda il cominciare a sviluppare JAVA, scaricatevi da Synaptic il pacchetto <strong>j2sdk1.4</strong> (o versione piu avanzata, se l'avete)      <br />
</p><div style="white-space:pre; margin:left:auto;margin-right:auto; margin-top:1em; margin-bottom:1em; text-align:center">*			*			*</div><p><br />
      <br />
Vi consiglio di scaricare anche il pacchetto "<strong>python-wxgtk2.6</strong>" (o versione piu avanzata, se l'avete) che serve per installare le "<strong>wxwidget</strong>".<br />
<br />
 <a href="http://etnablog.altervista.org/linux/passare-da-windows-a-linux-prima-parte/">Torna al menù principale della "Guida su Linux"</a> <br />
 ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/linux/cominciare-a-programmare-c-con-gtk-e-java/</guid>
</item>
<item>
<title>Boot del sistema e avvio automatico di applicazioni</title>
<link>http://etnablog.altervista.org/linux/boot-del-sistema-e-avvio-automatico-di-applicazioni/</link>
<description> <![CDATA[<p><i>Guida: Passare da Windows a Linux (tredicesima parte)</i></p>
 <br /> Cosa succede quando accendete il vostro pc?      <br />
      <br />
L'avvio del pc viene detto "<strong>boot</strong>" o "<strong>bootstrap</strong>".      <br />
      <br />
La prima cosa che fa il "<strong>BIOS</strong>" del pc all'avvio è di cercare le periferiche avviabili leggendo i "settori di avvio" (o "<strong>MBR</strong>") di floppy e hard disk.      <br />
      <br />
L'<strong>MBR</strong> (Master Boot Record) è un'area molto piccola del vostro hard disk, in cui linux posiziona un programmino detto "boot loader".      <br />
      <br />
Il "<strong>boot loader</strong>" si occupa di caricare il "kernel", ovvero il cuore del vostro sistema operativo.      <br />
      <br />
I due principali "boot loader" di linux sono "<strong>LILO</strong>" e "<strong>GRUB</strong>" (GNU GRand Unified Bootloader). Ubuntu Feisty usa GRUB ed è proprio di GRUB che vi parlerò adesso.      <br />
      <br />
L'MBR contiene lo "<strong>stage 1</strong>" di GRUB, che passa immediatamente la palla allo "stage 2" che invece è collocato nel disco vero e proprio (in una cartella tipo <strong>/boot/grub/</strong>).      <br />
      <br />
Lo <strong>stage 2</strong> contiene il menù di avvio con la lista (<strong>/boot/grub/menu.lst</strong>) dei kernel avviabili.      <br />
      <br />
Considerate che Linux aggiorna molto spesso i suoi kernel, o perchè ne correggono difetti, o perchè vi aggiungono nuovi driver, o perchè vi introducono nuove funzionalità; quindi una volta al mese è probabile che, fra gli aggiornamenti che scaricherete in automatico del vostro linux, vi ritroverete kernel nuovi, pronti per essere usati da voi.      <br />
      <br />
Ogni volta che voi installate un kernel Linux nuovo, questo verrà posizionato nella directory "<strong>/boot/</strong>" ed automaticamente verrà aggiornata anche la lista dei kernel disponibili per GRUB (file "<strong>/boot/grub/menu.lst</strong>").      <br />
      <br />
Nella lista dei kernel da avviare, potete persino inserire Windows. In questo modo potrete sempre scegliere se avviare da Win o da Linux, liberamente.      <br />
      <br />
<div style="background:#EFEBE7; margin-left:1em; padding:1em"><br />
Mi sembra doveroso aggiungere due cosette ancora su GRUB:      <br />
      <br />
quando voi installate Ubuntu installate anche GRUB.      <br />
      <br />
..Ma se installate Windows (o effettuate un ripartizionamento che spinge Windows a ricontrollare la MBR) DOPO avere installato GRUB (e Linux), Windows modificherà e renderà inutilizzabile GRUB.      <br />
      <br />
Il problema però si risolve facilmente riavviando il sistema dal vostro LiveCD (il cd usato per installare Ubuntu) e facendo una apposita sequenza di comandi di  <a href="http://wiki.ubuntu-it.org/RipristinoGrub?action=show&redirect=RecuperareGrub">ripristino di GRUB</a> .      <br />
      <br />
State tranquilli comunque perchè GRUB è affidabilissimo. L'<strong>unica</strong> volta che mi ha dato questo problema è stato (così come vi ho appena detto..) proprio quando ho cercato di ridimensionare la partizione di Windows per dare più spazio a Linux (operazione svolta peraltro egregiamente dal programma "<strong>gparted</strong>"). All'avvio di Windows (per provare se funzionava tutto a posto) lui mi sconvolse GRUB ma ripristinai tutto in pochi minuti con l'apposita procedura. La colpa purtroppo non è nè di Linux nè di GRUB, è Windows che è geloso e vuole avere per se tutti i miei dischi di sistema..      <br />
</div><br />
Una volta scelto da GRUB il kernel da caricare, il suo lavoro finisce qui, e da qui in poi il lavoro di avvio è svolto dal kernel, che cercherà di accedere a tutti i componenti dell'hardware, hard disk, schede di rete, scheda audio e tutto il resto.      <br />
      <br />
In pratica il kernel cerca tutte le periferiche che sono compatibili con i suoi "drivers", che sono le "interfacce attraverso cui vengono pilotate le periferiche" (solo le periferiche compatibili col kernel possono funzionare).      <br />
      <br />
Infine il kernel caricherà le applicazioni presenti nel "<strong>runlevel</strong>" tra cui vi è anche "<strong>GDM</strong>" (il "gestore di login" o "Gnome Display Manager") che è quella pagina in cui si può effettuare il login dell'utente (vedi oltre in questa sezione).      <br />
      <br />
Da <strong>GDM</strong> mettendo il nome utente e password si può finalmente accedere a GNOME o altra "sessione" (vedi oltre in questa sezione).      <br />
      <br />
Completato l'avvio, ecco alcuni comandi utili che potremmo eseguire da shell per avere qualche informazione riguardo alle operazioni di avvio del kernel:      <br />
      <br />
<table border="1"><tr><td style="white-space:nowrap">dmesg | less</td><td>Il comando dmesg ripropone i messaggi visualizzati dal kernel durante l'avvio del sistema, consentendo di controllarli con tutta calma. Il comando less invece viene utilizzato, in generale quando si vuole velocemente prendere visione di un lungo file di testo.</td></tr><tr><td class="com">who -r</td><td>Mostra quale è l'attuale runlevel in esecuzione.</td></tr><br />
<tr><td class="com">runlevel</td><td>Come who -r, ci mostra il runlevel in esecuzione.</td></tr></table><br />
      <br />
Se il vostro avvio è diventato lento, potrebbe essere utile per voi cercare di capire dove è che il vostro sistema perde tempo in avvio. C'è un modo per farvi mostrare tutte le operazioni che il vostro sistema compie durante l'avvio.      <br />
      <br />
Fate <strong>gedit /boot/grub/menu.lst</strong> per modificare GRUB.      <br />
      <br />
Individuate la riga in cui è specificato il kernel, dovrebbe essere simile a questa:       <br />
kernel          /boot/vmlinuz-2.6.17-10-generic root=UUID=5ee00750-e638-423f-9d5d-44fdd7<br />
42c7ba ro quiet splash       <br />
Commentatela e riscrivetela sotto senza "<strong>quiet</strong>" e "<strong>splash</strong>" facendola quindi diventare:<br />
<br />
#kernel          /boot/vmlinuz-2.6.17-10-generic root=UUID=5ee00750-e638-423f-9d5d-44fdd7<br />
42c7ba ro quiet splash       <br />
kernel          /boot/vmlinuz-2.6.17-10-generic root=UUID=5ee00750-e638-423f-9d5d-44fdd7<br />
42c7ba ro<br />
<br />
      <br />
In questo modo all'avvio di linux potete osservare e studiare in quale operazione il sistema perde piu tempo all'avvio.       <br />
Se volete visualizzare tali operazioni ma nel contempo non volete rinunciare alla barra di scorrimento tipica dell'avvio, togliete quiet ma lasciate splash.      <br />
      <br />
<div style="background:#EFEBE7; margin-left:1em; padding:1em"><br />
Come avrete visto, in quel codice scritto sopra, vi uno strano "<strong>UUID</strong>" seguito da codici strani. L'UUID è una sigla che serve ad identificare univocamente una periferica, nel nostro caso identifica la partizione che contiene il kernel considerato.      <br />
      <br />
Si sarebbe potuto mettere, al posto di quel codice, anche "/dev/hda1" o "/dev/hdc1" o altro ma francamente a me ha dato meno problemi GRUB indicando direttamente l'UUID.      <br />
      <br />
L'UUID della partizione che vi interessa ("/dev/hda1" o "/dev/hdc1" o altro) potete vederlo dal pannello in Gnome "<strong>Gestione periferiche</strong>", cercando nella partizione che vi interessa (o da shell, facendo " <strong>sudo vol_id -u /dev/XXX</strong> ". Se non avete il comando <strong>vol_id</strong> installate da Synaptic il pacchetto "<strong>volumeid</strong>").      <br />
      <br />
L'unica accortezza da tenere è che se modificate le partizioni (le ridimensionate con "gparted" o simili) è probabile che l'UUID cambi e quindi anche il file /boot/grub/menu.lst andrà risistemato manualmente.      <br />
</div><br />
      <br />
<div style="white-space:pre; margin:left:auto;margin-right:auto; margin-top:1em; margin-bottom:1em; text-align:center">*			*			*</div><br />
Potete scegliere voi stessi di mettere delle applicazioni che voi usate spesso in avvio "automatico" quando accendete il pc.      <br />
      <br />
In generale, non conviene avviare in automatico applicazioni che non vi servono sempre, non tanto perchè possono rallentare inutilmente il sistema, anche di poco, ma quanto per i problemi di <strong>sicurezza</strong> che potrebbero portarvi.      <br />
Per controllare, disabilitare o abilitare applicazioni all'avvio, scaricate da synaptic e usate il pacchetto <strong>bum</strong> (boot up manager).      <br />
      <br />
Se vi interessa mettere le mani sul boot di linux, in generale, è bene che sappiate cosa sono i <strong>runlevels</strong>.      <br />
Un runlevel è uno stato del sistema in cui possono venire compiute solo determinate operazioni. I runlevel sono sette, enumerati da 0 a 6, sebbene esistano anche il 7, l'8 ed il 9 che però i normali Unix (e Linux con loro) non utilizzano.       <br />
      <br />
Runlevel 0: <strong>/etc/rc0.d</strong> Questo runlevel avvia la sequenza di arresto del sistema (shutdown).      <br />
Runlevel 1: <strong>/etc/rc1.d</strong> Questo runlevel rappresenta la modalità singolo utente, nessun altro utente può collegarsi, il servizio di rete è disabilitato.      <br />
Runlevel 2: <strong>/etc/rc2.d</strong> Per l'utente, Il 2 è il runlevel di default qui su Feisty.      <br />
Runlevel 3: <strong>/etc/rc3.d</strong> Per l'utente.      <br />
Runlevel 4: <strong>/etc/rc4.d</strong> Per l'utente.      <br />
Runlevel 5: <strong>/etc/rc5.d</strong> Per l'utente.      <br />
Runlevel 6: <strong>/etc/rc6.d</strong> Il runlevel 6 è quello di reboot.      <br />
      <br />
Lo 0, l'1 ed il 6 sono riservati e corrispondono rispettivamente a: arresto del sistema (0), single-user mode (1) e reboot (6).      <br />
I runlevels dal 2 al 5 qui su ubuntu sono uguali, e potete modificarli se ne avete l'esigenza.      <br />
In Feisty c'è un sistema tutto nuovo per l'avvio del sistema, che non si basa più, come di solito in linux, sul file <strong>/etc/inittab</strong> (sistema "sysvinit"), ma su un sistema noto come <strong>upstart</strong>, che gestisce i demoni secondo le configurazioni impostate nella cartella <strong>/etc/event.d/</strong>.      <br />
      <br />
Il runlevel di avvio usato di default in Feisty è il 2. Per cambiarlo bisogna editare manualmente il file <strong>/etc/event.d/rc-default</strong>.      <br />
In questo file /etc/event.d/rc-default infatti vi è il comando "telinit" che è serve a impostare il runlevel.<br />
      <br />
Gli script che di fatto permettono di gestire l'avvio o lo stop di un servizio sono in realtà nella directory <strong>/etc/init.d/</strong> (in questa cartella sono conservati i file binari, eseguibili, dei demoni installati) e possono essere utilizzati direttamente dall'utente per gestire i singoli processi.      <br />
      <br />
I file presenti nelle cartelle dei runlevels <strong>/etc/rcX.d</strong> (X è il numero del runlevel) sono in realtà dei link ("symlink") agli script nella cartella <strong>/etc/init.d/</strong>.      <br />
Tali link sono preceduti da una S ("start") o una K ("Kill"), seguite da un numero. Le applicazioni precedute da "S" verranno avviate nel relativo runlevel.      <br />
      <br />
Attualmente la documentazione in rete per upstart è piuttosto scarsa, ed in realtà, a meno che non abbiate delle necessità particolari, è piuttosto difficile che abbiate mai la necessità di ritoccare i file di configurazione di upstart e i demoni da avviare.      <br />
<br />
<div style="white-space:pre; margin:left:auto;margin-right:auto; margin-top:1em; margin-bottom:1em; text-align:center">*			*			*</div><br />
Qualunque sia il runlevel usato, vi possono essere delle operazioni che voi eseguite spesso in riga di comando, e magari preferireste che il sistema all'avvio le eseguisse in automatico.      <br />
      <br />
Aggiungete il comando che vi interessa nel file <strong>/etc/rc.local</strong> inserendolo prima della riga "Exit 0".      <br />
<br />
<div style="white-space:pre; margin:left:auto;margin-right:auto; margin-top:1em; margin-bottom:1em; text-align:center">*			*			*</div><br />
C'è un altro metodo per avviare applicazioni in automatico in GNOME, è un metodo molto semplice ed è quello che più vi consiglio.      <br />
      <br />
Basta andare nel menu "Sistema --> Preferenze --> Sessioni --> Programmi d'avvio" e qui aggiungere il comando che intendiamo avviare.      <br />
      <br />
Il sistema automaticamente aggiungerà il comando da voi inserito in un file nella cartella "<strong>/home/NomeUtente/.config/autostart/</strong>".      <br />
      <br />
Ad esempio, basta aggiungergli "<strong>/usr/bin/gdesklets</strong>" per fare in modo che le <strong>gdesklets</strong> (sono dei piccoli tools per GNOME, da installare con Synaptic), vengano avviate in automatico ad ogni avvio di GNOME.<br />
<br />
 <a href="http://etnablog.altervista.org/linux/passare-da-windows-a-linux-prima-parte/">Torna al menù principale della "Guida su Linux"</a> <br />
 ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/linux/boot-del-sistema-e-avvio-automatico-di-applicazioni/</guid>
</item>
<item>
<title>Audio, midi su Linux</title>
<link>http://etnablog.altervista.org/linux/audio-midi-su-linux/</link>
<description> <![CDATA[<p><i>Guida: Passare da Windows a Linux (Dodicesima parte)</i></p>
 <br /> Driver comunemente usati da linux per comunicare con la vostra scheda audio sono i driver "<strong>ALSA</strong>" (Advanced Linux Sound Architecture).      <br />
ALSA è un componente del kernel volto a sostituire le <strong>OSS</strong> (Open Sound System), che sono meno avanzate.<br />
Le ALSA possono comunque, se ve ne è esigenza, emulare le OSS mediante il programma "<strong>aoss</strong>" che fa parte del pacchetto "<strong>alsa-oss</strong>".<br />
<br />
Il controllo dei volumi potete visualizzarlo con il comando <strong>alsamixer</strong>.<br />
<br />
Se non riuscite a sentire i file <strong>midi</strong>, molto probabilmente questo succede perchè non avete il modulo installato.<br />
Fate riferimento al sito della vostra distribuzione (in questo caso Ubuntu) per risolvere il problema, che potrebbe eventualmente spiegarvi come installare un software che si chiama <strong>Timidity</strong> che ha anche una interfaccia grafica molto carina, visualizzabile con un apposito paramentro (" <strong>timidity -ig file.mid</strong> ").      <br />
      <br />
Timidity può fare uso di un file <strong>.sf2</strong> ("<strong>soundfont</strong>", è in pratica un archivio con i suoni degli strumenti) che potete salvare in qualsiasi posto del vostro HD, io l'ho messo nella mia <strong>home</strong>.      <br />
      <br />
Per fare questo, bisogna configurare Timidity per riprodurre Soundfont esterni.      <br />
Queste sono le ultime righe del mio file di configurazione di Timidity, adattate per fare funzionare, a titolo di esempio, il soundfont Unison.sf2:      <br />
      <br />
<br />
# source /etc/timidity/freepats.cfg      <br />
dir /home/attorianzo      <br />
soundfont unison.sf2 order=0      <br />
<br />
      <br />
Se l'audio in riproduzione del midi è gracchiante o si sente male, provate a cambiare soundfont.      <br />
      <br />
<div style="white-space:pre; margin:left:auto;margin-right:auto; margin-top:1em; margin-bottom:1em; text-align:center">*			*			*</div><br />
Se non riuscite a far funzionare Timidity ma avete una <strong>scheda audio Soundblaster</strong> potete tuttavia provare questa strada:      <br />
      <br />
Anzitutto vi serve un file <strong>.sf2</strong> (<strong>soundfont</strong>), se avete una partizione con windows, potete prelevarne uno da li, ad esempio "windows/system32/drivers/2gmgsmt.sf2".      <br />
      <br />
Prendete quel file, copiatevelo dove vi fa comodo, e fate da riga di comando:<br />
sfxload 2gmgsmt.sf2<br />
Per quanto riguarda i file midi poi, nel pacchetto "<strong>alsa-utils</strong>" vi sono due utility: <strong>aplaymidi</strong> e <strong>arecordmidi</strong>.      <br />
Sfruttano i driver ALSA per riprodurre e registrare file midi.      <br />
      <br />
Con il comando "<strong>aplaymidi -l</strong>"  ci viene mostrata la  lista di porte  di uscita MIDI presenti nel sistema (per dubbi, fai "<strong>man aplaymidi</strong>" sulla riga di comando).      <br />
      <br />
"<strong>arecordmidi -l</strong>"  analogamente ci mostra  le porte MIDI  di ingresso.      <br />
      <br />
Una volta letta la porta attraverso "<strong>aplaymidi -l</strong>", potete ascoltare un file midi (nel mio caso la porta che mi interessava era la 25:0, quella di "<strong>Emu10k1 WaveTable</strong>") facendo:      <br />
aplaymidi -p 25:0 'filemidi.mid'<br />
Nel mio caso la porta midi era la 25:0, ma può essere diversa ( <strong>-p serve a specificare la porta</strong>).<br />
<br />
 <a href="http://etnablog.altervista.org/Informatica/passare-da-windows-a-linux-prima-parte/">Torna al menù principale della "Guida su Linux"</a> <br />
 ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/linux/audio-midi-su-linux/</guid>
</item>
<item>
<title>Schede grafiche e Linux</title>
<link>http://etnablog.altervista.org/linux/schede-grafiche-e-linux/</link>
<description> <![CDATA[<p><i>Guida: Passare da Windows a Linux (Undicesima parte)</i></p>
 <br /> "<strong>xorg X11</strong>" (o "<strong>server X</strong>") è il server grafico per il desktop di linux, derivato (open source) da Xfree86 (che invece non ha licenza GPL).      <br />
E' usato da GNOME, KDE e Xfce.      <br />
Il file di configurazione di xorg è <strong>/etc/X11/xorg.conf</strong>. E' possibile qui configurare video, tastiera, mouse ed altro.      <br />
      <br />
Settando il "protocol" del mouse su "IMPS/2", il "device" su "/dev/psaux" ho risolto un problema del mio mouse PS/2 che sembrava inspiegabilmente ogni tanto impazzire sullo schermo.      <br />
      <br />
Se il mouse non funziona, per prima cosa bisogna accertarsi che venga rilevato correttamente dal kernel.      <br />
      <br />
I mouse di <strong>tipo PS/2</strong> sono visti come il device <strong>/dev/psaux</strong>. Altri mouse (per esempio gli <strong>USB</strong>) sono visti come <strong>/dev/input (o /dev/input/mice)</strong>.      <br />
      <br />
In ogni caso è possibile controllare se un device rappresenta il mouse scrivendo in shell "<strong>cat /dev/psaux</strong>" (se è PS/2 per esempio) controllando l'output del device e muovendo il mouse. Per terminare la sessione premere <strong>Ctrl-C</strong>.      <br />
      <br />
E' molto facile che la vostra scheda video, Nvidia o ATI abbia il 3D disabilitato in automatico qui su Ubuntu perchè il produttore non ne ha rilasciato dei driver open source.      <br />
      <br />
In questi casi cercate nel sito di Ubuntu le istruzioni specifiche su come fare per abilitarla.       <br />
      <br />
Altre cosucce da sapere, in pillole, sulle schede grafiche in generale: <br />
<ul><br />
<li><strong>XGL</strong> : acronimo di X over OpenGL. In sostanza è un'architettura creata per sfruttare l'accelerazione hardware 3d delle schede grafiche.</li><br />
<li><strong>AIGLX</strong> : Accelerated Indirect GLX ("AIGLX"). e' simile a XGL ma è opensource. Almeno fino al momento in cui vi sto scrivendo, le cose stanno così:      <br />
						AiGLX <strong>funziona solo con gli ultimi driver beta di Nvidia</strong>, per le <strong>ATI funziona solo con i driver open</strong> inclusi in Xorg ("mesa"), per cui per ora niente supporto da parte dei driver propretari ATI nei riguardi di AiGLX.      </li><br />
<li><strong>Compiz</strong> : E' un desktop 3d. Serve a creare degli effetti in 3d molto belli nel vostro schermo, che si abilitano dall'apposita opzione presente nel menù Preferenze -->Effetti Desktop</li><br />
<li><strong>Beryl</strong> : Era un progetto analogo e derivato da Compiz. Non più supportato       <br />
<li><strong>fglrx</strong> : è il driver proprietario di ATI, per le sue schede video. Mi pare di capire che XGL funziona bene con fglrx, lo stesso non si può dire, almeno per ora, di AIGLX.</li><li><strong>mesa</strong> : è un driver driver grafico (come fglrx), che è opensource. Questo driver è molto utile per fornire l'accelerazione 3d alle schede di cui non si hanno driver proprietari e/o che siano vecchie (e quindi magari non più supportate dai proprietari).</li><li><strong>Driconf</strong> :  è un tool grafico, per la configurazione del Direct Rendering Infrastructure (DRI). Consente di personalizzare i settaggi di prestazione e qualità video del driver opengl. Esso consente di personalizzare i settaggi di prestazione e qualità video del driver opengl .</li></ul> <br />
<br />
I comandi che seguono, nella tabella, sono molto importanti:      <br />
      <br />
<table border="1"><tr><td class="com">/etc/init.d/gdm restart</td><td>Serve a riavviare GNOME senza riavviare il computer.<br />
<br />
GNOME è l'interfaccia grafica in Ubuntu. Se, per un motivo o per un altro sembra essere impazzita, non c'è bisogno di riavviare completamente il computer, riavviate solo GNOME con questa istruzione.<br />
<br />
Potete anche utilizzare la scorciatoia <strong>Ctrl-Alt-Backspace</strong>, ma questa scorciatoia potrebbe essere disabilitata.<br />
<br />
Per abilitarla, bisogna aggiungere ad xorg.conf le righe:<br />
<br />
Section  "ServerFlags"<br />
Option   "DontZap"   "yes"<br />
EndSection<br />
</td></tr><tr><td class="com">fglrxinfo</td><td>Restituisce informazioni sul driver della scheda grafica ATI, se è installata correttamente</td></tr><tr><td class="com">glxinfo | grep rendering</td><td>Se restituisce direct rendering: Yes vuol dire che l'accelerazione 3D è funzionante.</td></tr><tr><td class="com">fgl_glxgears</td><td>Test per vedere se l'accelerazione 3D della scheda grafica è attiva.</td></tr><tr><td class="com">fireglcontrol</td><td>Pannello di controllo per scheda grafica ATI.</td></tr><tr><td class="com">dpkg-reconfigure xserver-xorg</td><td>E' il pannello di configurazione di <strong>Xorg</strong>. Se modificate questo file, attenzione ai valori <strong>HorizSync</strong> e <strong>VertRefresh</strong> nella sezione "<strong>Monitor</strong>". Non modificate questi due valori a meno che non abbiate dato un'occhiata al manuale con le specifiche tecniche del vostro monitor, in quanto <strong>rischiate di danneggiarlo</strong>.</td></tr></table><br />
<br />
 <a href="http://etnablog.altervista.org/Informatica/passare-da-windows-a-linux-prima-parte/">Torna al menù principale della "Guida su Linux"</a> <br />
 ]]>
</description>
<author>etnablog@altervista.org (Hattori Hanzo)</author>
<guid>http://etnablog.altervista.org/linux/schede-grafiche-e-linux/</guid>
</item>
<item>
<title>Montare-smontare partizioni</title>
<link>http://etnablog.altervista.org/linux/montare-smontare-partizioni/</link>
<description> <![CDATA[<p><i>Guida: Passare da Windows a Linux (Decima parte)</i></p>
 <br /> Ogni sistema operativo ha il suo "<strong>filesystem</strong>", ovvero il suo "modo di scrivere scrivere sull'hard disk" del pc.      <br />
      <br />
Diciamo che il filesystem di Windows 9x (Windows 95,98 ecc..) si chiama "<strong>FAT</strong>", quello di Windows XP si chiama <strong>NTFS</strong>.      <br />
      <br />
In Linux attualmente il più diffuso filesistem è il "<strong>ext2</strong>" e si sta gia cominciando ad usare il sistema "<strong>ext3</strong>", che è usato ad esempio da Ubuntu Feisty.      <br />
      <br />
Linux è capace di leggere e scrivere facilmente un filesystem FAT, per l'NTFS invece sono necessari dei "programmini" che permettano di leg