<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Miro Mannino</title>
	<atom:link href="http://miromannino.it/feed/" rel="self" type="application/rss+xml" />
	<link>http://miromannino.it</link>
	<description>Web Site</description>
	<lastBuildDate>Tue, 21 May 2013 19:53:33 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Integrare PeerSim con Eclipse</title>
		<link>http://miromannino.it/integrare-peersim-con-eclipse/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=integrare-peersim-con-eclipse</link>
		<comments>http://miromannino.it/integrare-peersim-con-eclipse/#comments</comments>
		<pubDate>Mon, 06 May 2013 12:48:35 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[PeerSim]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=1221</guid>
		<description><![CDATA[PeerSim, per chi non lo conoscesse, è un noto simulatore per reti P2P, scritto in Java. Potete trovare qui la pagina ufficiale di tale progetto. Soprattutto quando si parla di Java sappiamo che è molto comodo utilizzare Eclipse. In questo articolo parlerò infatti di come poter configurare quest&#8217;ultimo per poter lavorare con PeerSim. Ho deciso &#8230; <a href="http://miromannino.it/integrare-peersim-con-eclipse/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>PeerSim, per chi non lo conoscesse, è un noto simulatore per reti P2P, scritto in Java. Potete trovare <a href="http://peersim.sourceforge.net/" title="PeerSim Home Page" target="_blank">qui</a> la pagina ufficiale di tale progetto.</p>

<p>Soprattutto quando si parla di Java sappiamo che è molto comodo utilizzare Eclipse. In questo articolo parlerò infatti di come poter configurare quest&#8217;ultimo per poter lavorare con PeerSim. Ho deciso di scriverlo dopo aver letto uno dei pochi post che tratta dell&#8217;argomento, e che risolve la cosa in un modo alquanto bizzarro.</p>

<span id="more-1221"></span>

<h3>Download di PeerSim</h3>
<p>Per prima cosa occorre scaricare il pacchetto messo a disposizione da <a href="http://sourceforge.net/projects/peersim/" title="PeerSim Download" target="_blank">Sourceforge</a>.</p>

Estraendo tale archivio avrete una cartella chiamata <code>peersim-1.0.5</code> che conterrà tutti i file di PeerSim. Potete mettere questa cartella dove volete, ad esempio nella vostra home directory (cartella Documenti per chi usa Windows).</p>

<h3>Configurazione del progetto</h3>
<p>
Per prima cosa create il vostro progetto andando su <code>File -> New -> Java Project</code>. 
</p>
<p>
Una volta creato tale progetto, cliccate con il tasto destro sul nome del vostro progetto che c&#8217;è nella lista (<code>Package Explorer</code>) di tutti i progetti del vostro Workspace. Successivamente andate sulle sue proprietà. Una volta aperta la relativa finestra, andate su <code>Java Build Path</code>, e poi su <code>Libraries</code>. In questo modo potete includere le librerie di PeerSim. 
</p>
<p>
Per fare ciò, cliccate su <code>Add External JARs</code>, navigate fino a giungere nella cartella di PeerSim che avete estratto precedentemente e selezionate quindi le seguenti librerie:
<ul>
 <li>peersim-1.0.5.jar</li>
 <li>jep-2.3.0.jar</li>
 <li>djep-1.0.0.jar</li>
</ul>
</p>
<p>Adesso importate la documentazione, espandendo per prima cosa la voce relativa alla libreria di PeerSim.

<div style="margin-top:10px; margin-bottom:10px">
<img src="http://miromannino.it/wp-content/uploads/2013/05/peersim-conf-1.png" alt="peersim-conf-1" width="481" height="227" class="size-full wp-image-1232 colorbox-1221" />
</div>

Fate doppio click sulla voce relativa alla documentazione e si aprirà una finestra dove potrete scegliere la locazione della documentazione della libreria. Cliccate su <code>Javadoc URL</code> e successivamente su <code>Browse</code>, navigate ancora una volta fino a giungere nella cartella di PeerSim, e selezionate la cartella &#8220;doc&#8221; che trovate al suo interno.
</p>

<h3>Configurare un Run</h3>
<p>Per configurare PeerSim in modo da avviare una simulazione, aprite la finestra di configurazione dei Run, andando su <code>Run -> Run Configurations...</code>, cliccate poi con il tasto destro la voce del menu chiamata &#8220;Java Application&#8221; e create una nuova configurazione. Assegnategli il titolo che volete.
<p>
<p>Nella parte relativa alla Main Class, cliccate su <code>Search</code>, e selezionate la voce &#8220;Simulator &#8211; peersim&#8221;, che è la main class di PeerSim (essa si trova nella libreria che avete importato nel punto precedente).

<div style="margin-top:10px; margin-bottom:10px">
<img src="http://miromannino.it/wp-content/uploads/2013/05/peersim-conf-2.png" alt="peersim-conf-2" width="923" height="271" class="size-full wp-image-1241 colorbox-1221" /></div>
<p>

<p>Per configurare invece gli argomenti per avviare la simulazione, in modo da poter specificare a PeerSim i propri file di configurazione, potrete specificarli andando nella voce <code>Arguments</code> e cambiando il campo chiamato &#8220;Program Arguments&#8221;.
</p>
<p>
Per fare una prima prova potrete creare una cartella chiamata &#8220;configs&#8221; all&#8217;interno del vostro progetto, e copiare al suo interno il file &#8220;example/config-example1.txt&#8221; che trovate all&#8217;interno della cartella di PeerSim. Dopo potete modificare il campo &#8220;Program Arguments&#8221; inserendo &#8220;configs/config-example1.txt&#8221;.

<div style="margin-top:10px; margin-bottom:10px">
<img src="http://miromannino.it/wp-content/uploads/2013/05/peersim-conf-3.png" alt="peersim-conf-3" width="690" height="122" class="size-full wp-image-1242 colorbox-1221" />
</div>
</p>

<div class="button"><a href="http://miromannino.com/integrating-peersim-with-eclipse/" target="_blank">English Version</a></div>]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/integrare-peersim-con-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Algoritmo del Ruzzle Solver</title>
		<link>http://miromannino.it/algoritmo-del-ruzzle-solver/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=algoritmo-del-ruzzle-solver</link>
		<comments>http://miromannino.it/algoritmo-del-ruzzle-solver/#comments</comments>
		<pubDate>Tue, 05 Mar 2013 07:51:57 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Progetti]]></category>
		<category><![CDATA[Algoritmi]]></category>
		<category><![CDATA[Ottimizzazione]]></category>
		<category><![CDATA[Ruzzle]]></category>
		<category><![CDATA[Strutture Dati]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=1138</guid>
		<description><![CDATA[Con il successo di Ruzzle Solver, molti utenti mi hanno più volte richiesto di pubblicarne il codice sorgente, o semplicemente delle informazioni su come se ne potesse fare uno simile. Altri ancora erano particolarmente interessati, visto che avrebbero dovuto fare un progetto simile per un esame universitario. In questo post cercherò solamente di valutare brevemente &#8230; <a href="http://miromannino.it/algoritmo-del-ruzzle-solver/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>
Con il successo di <a href="http://miromannino.it/ruzzle-solver/" title="Trucchi per Ruzzle: Ruzzle Solver" target="_blank">Ruzzle Solver</a>, molti utenti mi hanno più volte richiesto di pubblicarne il codice sorgente, o semplicemente delle informazioni su come se ne potesse fare uno simile. Altri ancora erano particolarmente interessati, visto che avrebbero dovuto fare un progetto simile per un esame universitario.
</p>
<p>
In questo post cercherò solamente di valutare brevemente alcuni metodi per poter realizzare un algoritmo di questo tipo. Sicuramente scriverò altri articoli che tratteranno di temi più specifici in futuro. I test che vedrete in seguito sono stati eseguiti con algoritmi scritti in C, ed su un MacBook Pro con processore Intel Core i5 da 2.3 Ghz; altre implementazioni potranno quindi riportare risultati differenti, anche se mi aspetto che il rapporto tra di esse sia identico.
</p>
</p>

<span id="more-1138"></span>

<h2>Algoritmi</h2>
<p>
Il nostro dizionario (consideriamo quello italiano), è composto di circa 600.000 parole. Essendo la nostra matrice fissa a 4&#215;4, in realtà abbiamo una prima osservazione da fare, dal punto di vista asintotico stiamo parlando di un problema O(1). Nonostante questo, non possiamo dire che in qualunque modo lo facciamo vada comunque bene, teoria e pratica sono cose diverse.
</p>

<h3>Full Enumeration</h3>
<p>
Supponiamo che questo insieme sia memorizzato su una hashmap. Come sappiamo, questo tipo di struttura dati ci fornisce una funzione lookup che, nel caso medio, richiede tempo O(1). Visto che il nostro dizionario è statico, possiamo anche assumere che la nostra hashmap sia semplicemente un vettore abbastanza grande per contenere tutte le nostre parole, e che la funzione di hash sia perfetta (ovvero iniettiva); in questo modo riusciamo ad avere sempre tempo O(1). Quest&#8217;ultima struttura dati in realtà è già nota e viene comunemente chiamata Direct Access Table.
</p>
<p>
Il primo algoritmo che può venire in mente avendo questo tipo di struttura è quello di cercare tutte le possibili combinazioni presenti nella griglia, e per ognuna di esse vedere se è presente o meno nel dizionario.
</p>
<p>
Per calcolare la complessità di un simile algoritmo supponiamo di avere una griglia con tutte lettere distinte. In questo modo però non contiamo più volte le parole che possono essere formate in modi diversi (questo comunque influisce in maniera minima). 
</p>
<p>
Per prima cosa dobbiamo scegliere una delle 16 celle, questa formerà la prima lettera della nostra parola. Adesso dobbiamo scegliere una cella vicina per continuare. Ogni cella centrale ha 8 vicini, quelle negli angoli 3, mentre quelle negli spigoli 5. In media quindi abbiamo (8*4+5*8+3*4)/16 = 5,25 vicini. Le possibili parole di due lettere che si possono formare sono quindi 16 * 5,25 = 84. Da questo punto in poi ogni vicino ne avrà almeno un&#8217;altro già visitato, facendo scendere la nostra media a 4,25. Le possibili parole di tre lettere che si possono formare sono quindi 16*5,25*4,25 = 357. Ovviamente la media del numero dei vicini tenderà a diminuire sempre di più all&#8217;aumentare del numero delle lettere. Con questo ragionamento, con parole di al massimo 7 lettere il numero di combinazioni supera già il milione. 
</p>
<p>
Con un semplice algoritmo ricorsivo, sulla falsa riga di quello del solver, possiamo determinare con esattezza il numero di combinazioni della griglia: 12.029.624.
</p>
<p>
Un simile algoritmo ha pertanto bisogno di circa dodici milioni di lookup al dizionario. L&#8217;algoritmo più semplice che calcola solamente il numero di combinazioni viene eseguito in circa <strong>2.5 secondi</strong>.
</p>

<h3>Active Dictionary</h3>
<p>
Visto il numero eccessivo calcolato precedentemente in realtà viene in mente un&#8217;altro algoritmo, che capovolge il ruolo del dizionario: da passivo ad attivo.
</p>
<p>
Supponiamo di avere il nostro dizionario e leggiamo una parola alla volta, per ognuna verifichiamo se è presente o meno nella griglia.
</p>
<p>
Quest&#8217;ultima verifica è in realtà abbastanza veloce. La parola guida la strada escludendo i percorsi sbagliati. Le operazioni da fare sono poi dei semplici confronti tra le lettere della parola in esame e quelle della matrice. Inoltre, in questo caso, non dobbiamo neanche costruire l&#8217;hashmap, possiamo leggere il nostro file del dizionario in maniera sequenziale, confrontando una parola dopo l&#8217;altra. 
</p>
<p>
Infatti in questo caso, il tempo medio per trovare tutte le parole presenti nella matrice è di <strong>150 millisecondi</strong>.
</p>

<h3>Branch and Bound</h3>
<p>
Riguardando il primo metodo però osserviamo qualcosa. Se abbiamo costruito la parola &#8220;attr&#8221;, questa fallirà nel lookup, ma ciò non vuol dire che che dobbiamo arrestare la nostra ricerca, infatti proseguendo nella costruzione di parole più grandi possiamo costruire parole come &#8220;attrito&#8221; che invece sono parole presenti nel dizionario. 
</p>

<figure>
<a href="http://miromannino.it/wp-content/uploads/2013/03/enumeration.png">
<img class="colorbox-1138"  src="http://miromannino.it/wp-content/uploads/2013/03/enumeration-300x208.png" width="300" height="208" /></a>
</figure>

<p>
Se non fosse già chiaro dalle considerazioni fatte prima, anche osservando il grafico, notiamo che il numero di possibili parole cresce esponenzialmente; ma il vero incremento lo notiamo dalla quinta lettera in poi. <em>Per velocizzare la ricerca, sarebbe utile sapere già dalle prime lettere che la parola non è prefisso di nessuna parola tra quelle presenti nel dizionario, in modo da fermarci in tempo</em>. Ad esempio, con &#8220;xts&#8221; è inutile continuare a cercare parole più grandi di quella, non troveremo mai nulla.
</p>
<p>
Abbiamo bisogno allora di un &#8220;hashmap&#8221; un po&#8217; più intelligente, alla quale possiamo chiedere anche se esiste, nel dizionario, una parola che inizia per &#8220;attr&#8221;; ed allo stesso modo che non esiste nessuna parola che inizi per &#8220;xts&#8221;. Questo tipo di strutture dati in realtà è molto utilizzato, come ad esempio in information retrieval, nella correzione ortografica del testo o nel word completition. 
</p>
<p>
Con questo algoritmo ci aspettiamo che il tempo sia molto poco, poiché l&#8217;enumerazione delle possibili parole viene rigorosamente guidata, escludendo percorsi sbagliati, ed utilizzando un lookup decisamente veloce. Per testare questo algoritmo, ho implementato una versione abbastanza ottimizzata dei Trie, risaputi essere onerosi in termini di memoria. Ricordo che esistono comunque strutture dati più efficienti in termini di memoria.
</p>
<p>
Questo algoritmo richiede, in media,<strong> meno di 1ms</strong> per calcolare tutte le parole presenti nella griglia
</p>

<h2>Conclusioni</h2>
<p>
Abbiamo visto tre metodi generali per risolvere questo problema, ognuno con i propri pregi e difetti. Ecco una piccola tabella riassuntiva.
</p>

<table>
<tr>
	<th>Algoritmo</th>
	<th>Tempo</th>
	<th>Tempo con costruzione struttura dati</th>
	<th>Memoria Richiesta</th>
</tr>
<tr>
	<td>1</td>
	<td>2,5sec+</td>
	<td>2,5sec+</td>
	<td>~6MB</td>
</tr>
<tr>
	<td>2</td>
	<td>150ms</td>
	<td>170ms</td>
	<td>~0MB</td>
</tr>
<tr>
	<td>3</td>
	<td>1ms</td>
	<td>300ms</td>
	<td>~140MB</td>
</tr>
</table>

<p>
Il secondo, nonostante il suo tempo di calcolo di 150ms, è molto pratico, non è infatti richiesto di memorizzare il dizionario in una qualche struttura dati. Infatti, il tempo richiesto dall&#8217;algoritmo che legge anche tutte le parole da un file, è abbastanza simile a quello dove tutte le parole sono già state caricate in memoria. Questo è consigliato in quei casi in cui il programma nasce e muore risolvendo solamente una configurazione.
</p>
<p>
Il terzo è sicuramente molto più veloce, ma bisogna considerare che è necessaria una fase di popolazione della struttura dati che può essere lunga, e che la memoria necessaria per la sua memorizzazione può essere consistente. E&#8217; sicuramente consigliato in tutti quei casi dove possiamo far partire il programma, lasciandolo in esecuzione in attesa di risolvere qualcosa. Inoltre, la memoria necessaria per questo algoritmo si può ridurre utilizzando altre strutture dati.
</p>]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/algoritmo-del-ruzzle-solver/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Intelligenza Artificiale: Markov Decision Process</title>
		<link>http://miromannino.it/artificial-intelligence-markov-decision-process/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=artificial-intelligence-markov-decision-process</link>
		<comments>http://miromannino.it/artificial-intelligence-markov-decision-process/#comments</comments>
		<pubDate>Sat, 01 Dec 2012 18:09:23 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Linguaggi]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Intelligenza Artificiale]]></category>
		<category><![CDATA[Markov Decision Process]]></category>
		<category><![CDATA[Matematica]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=781</guid>
		<description><![CDATA[In Intelligenza artificiale, in alcune situazioni, hai bisogno di una semplice sequenza di azioni per raggiungere in determinato obiettivo, partendo da uno stato noto; in tutti quegli ambienti dove invece le azioni non sono deterministiche (non deterministiche o stocastiche), questo non è più sufficiente: c&#8217;è bisogno di una policy, ovvero di una politica che ci &#8230; <a href="http://miromannino.it/artificial-intelligence-markov-decision-process/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>
In Intelligenza artificiale, in alcune situazioni, hai bisogno di una semplice sequenza di azioni per raggiungere in determinato obiettivo, partendo da uno stato noto; in tutti quegli ambienti dove invece le azioni non sono deterministiche (non deterministiche o stocastiche), questo non è più sufficiente: c&#8217;è bisogno di una <strong>policy</strong>, ovvero di una politica che ci dice qual&#8217;è l&#8217;azione giusta da fare in ogni stato.
</p>

<p>
Le <a href="http://www.wikipedia.org/wiki/Markov_decision_process" title="Markov Decision Process" target="_blank">Markov Decision Process</a> sono una struttura matematica che ci aiuta a costruire queste policy in ambienti stocastici dove si conoscono le probabilità che si verifichino determinati risultati.
</p>

<p>
In questo post, io vi darò una brevissima introduzione e poi vi mostrerò le parti essenziali della mia implementazione, in python, dei più importanti algoritmi che vi possono aiutare per trovare le policy in ambienti stocastici. Potete trovare una più dettagliata descrizione delle Markov Decision Process <a href="https://dl.dropbox.com/u/12453849/miromannino/MDP.pdf" title="Markov Decision Process - Slides">nelle mie slide</a> che ho preparato per un seminario nella mia università.
</p>

<span id="more-781"></span>

<p>
Per spiegarvi cosa siano, utilizziamo lo stesso esempio del libro &#8220;<a href="http://aima.cs.berkeley.edu/" title="Artificial Intelligence: A Modern Approach (3rd ed.)" target="_blank">Artificial Intelligence: A Modern Approach (3rd ed.)</a>&#8220;. Questo ambiente viene chiamato dagli autori: Grid World, una semplice griglia dove le possibili azioni sono NORTH, SOUTH, EAST, WEST. Questo ambiente non è deterministico, ma stocastico; assumiamo però delle probabilità ben definite. La probabilità di compiere l&#8217;azione che abbiamo deciso di intraprendere è dello 0.8, mentre la probabilità di andare nella cella di sinistra e nella cella di destra sono dello 0.1. Ad esempio se ci troviamo nella cella (2,1) e vogliamo fare l&#8217;azione NORTH, i possibili risultati potrebbero essere rappresentati in questo modo: 

<figure>
<img class="colorbox-781"  src="http://miromannino.it/wp-content/uploads/2012/11/MDP-GridWorld0.png" width="250" />
</figure>

Queste probabilità potrebbero modellare ad esempio il movimento di un robot, che ogni tanto, a causa dell&#8217;attrito del terreno sul quale poggia, può andare leggermente a sinistra o leggermente a destra rispetto a dove volevamo andare.
</p>

<p>
Abbiamo bisogno anche di un goal, il grid world ha infatti un uscita con un reward positivo di +1. Inoltre, ci sono alcuni fossi che hanno un reward negativo di -1. Sia l&#8217;uscita che il fosso sono stati finali, cioè non possiamo fare nessuna azione partendo da quello stato. Non possiamo uscire fuori dalla griglia e possiamo avere altre limitazioni spaziali avendo delle celle che fungono da muro; in questo modo possiamo creare dei percorsi di lunghezza diversa per arrivare al nostro goal.
</p>

<figure>
<img class="colorbox-781"  src="http://miromannino.it/wp-content/uploads/2012/11/MDP-GridWorld1.png" width="250" />
</figure>

<p>
Per costruire la policy, abbiamo bisogno di una stima delle utility di ogni cella. Possiamo calcolare queste utility usando un metodo simile a <a href="http://www.wikipedia.org/wiki/Minimax" title="Minimax" target="_blank">minimax</a>: questo metodo viene chiamato <a href="http://www.wikipedia.org/wiki/Expectiminimax_tree" title="Expectiminimax" target="_blank">expectiminimax</a>. Ma per la maggior parte delle applicazioni questo metodo è infattibile, per esempio perché non ci sono stati terminali o perché memorizzare tutto l&#8217;albero richiede moltissima memoria.
</p>

<p>
Le Markov Decision Process ci aiutano a calcolare queste utility con metodi più performanti.
</p>
]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/artificial-intelligence-markov-decision-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flickr Photostream e Justified Gallery</title>
		<link>http://miromannino.it/flickr-photostream-e-justified-gallery/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=flickr-photostream-e-justified-gallery</link>
		<comments>http://miromannino.it/flickr-photostream-e-justified-gallery/#comments</comments>
		<pubDate>Sat, 27 Oct 2012 17:28:04 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[Platform]]></category>
		<category><![CDATA[Progetti]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Galleria Immagini]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=722</guid>
		<description><![CDATA[Un problema comune, per le persone che creano siti, è infatti creare una galleria di immagini elegante che è in grado di gestire le varie dimensioni delle immagini. Flickr e Google+ affrontano queste situazioni in maniera eccellente, il mio proposito è proprio quello di offrire la potenza di queste soluzioni, con un efficiente algoritmo. Pochi &#8230; <a href="http://miromannino.it/flickr-photostream-e-justified-gallery/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Un problema comune, per le persone che creano siti, è infatti creare una galleria di immagini elegante che è in grado di gestire le varie dimensioni delle immagini. Flickr e Google+ affrontano queste situazioni in maniera eccellente, il mio proposito è proprio quello di offrire la potenza di queste soluzioni, con un efficiente algoritmo.
</p>

<p>
Pochi mesi fa, ho scritto un plugin per WordPress che mostrava il Photostream di Flickr in una griglia giustificata. Adesso, ho deciso di fare un plugin più astratto (jQuery) che potesse essere utilizzato ovunque!
</p>

Guarda tutta la documentazione nella sua <a href="http://miromannino.com/projects/justified-gallery/" target="_blank">pagina del progetto</a>. O scaricalo da <a href="https://github.com/miromannino/Justified-Gallery/zipball/master" target="_blank">github</a>.]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/flickr-photostream-e-justified-gallery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Miro Rubix è tornato!</title>
		<link>http://miromannino.it/miro-rubix-comes-back/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=miro-rubix-comes-back</link>
		<comments>http://miromannino.it/miro-rubix-comes-back/#comments</comments>
		<pubDate>Sat, 15 Sep 2012 18:25:18 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[Progetti]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PSP]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=526</guid>
		<description><![CDATA[Ho rimesso online un gioco che ho fatto alcuni anni fa, chiamato Miro Rubix. Lo potete utilizzare sia per PC che per PSP! Un semplice puzzle, ispirato dal famoso gioco chiamato Rubik’s Cube. Il puzzle inizia con due figure iniziali dove solamente quella di sinistra è mescolata in vari quadranti. Muovendo solamente le colonne e &#8230; <a href="http://miromannino.it/miro-rubix-comes-back/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>
Ho rimesso online un gioco che ho fatto alcuni anni fa, chiamato Miro Rubix. Lo potete utilizzare sia per PC che per PSP!

Un semplice puzzle, ispirato dal famoso gioco chiamato Rubik’s Cube. Il puzzle inizia con due figure iniziali dove solamente quella di sinistra è mescolata in vari quadranti. Muovendo solamente le colonne e le righe della figura di sinistra, bisogna riuscire a comporre la figura originale mostrata sulla destra. Il gioco ha a disposizione varie immagini per i puzzle, oppure si può giocare con i puzzle classici, questi ultimi sono immagini particolari che hanno solamente alcuni quadranti colorati. Inoltre potrete utilizzare le vostre immagini per creare i puzzle!
</p>
<span id="more-526"></span>

<div style="margin-top:20px">

<div class="pf-entry">

<div class="pf-entryAttrList">  <div class="entryImage">   <img src="http://miromannino.it/wp-content/uploads/2012/09/mirorubix-image-300x195.png" class="size-medium description-image colorbox-526" />  </div>  <div class="entryData">
<div class="pf-entryAttr"><span class="attrLabel">Categoria: </span> <span class="attrValue">PC Puzzle Game</span></div>
<div class="pf-entryAttr"><span class="attrLabel">Data di rilascio: </span> <span class="attrValue">09/2009</span></div>
<div class="pf-entryAttr"><span class="attrLabel">Tecnologie: </span> <span class="attrValue">Java, Java2D, Swing</span></div>
<div class="pf-entryAttr"><span class="attrLabel">Download: </span> <span class="attrValue">
<a href="https://dl.dropbox.com/u/12453849/miromannino/projects/mirorubix/mirorubix_1-0_win.exe">Windows</a> |
<a href="https://dl.dropbox.com/u/12453849/miromannino/projects/mirorubix/mirorubix_1-0_utuntu.deb">Ubuntu</a> |
<a href="https://dl.dropbox.com/u/12453849/miromannino/projects/mirorubix/mirorubix_1-0_all.zip">All Platforms</a>
</span></div>

<div class="pf-entryLinks"><span class="attrValue">
<span class="entryLink"><a href="http://miromannino.it/projects/miro-rubix/">Pagina del Progetto</a></span>
</span></div>
  </div></div><div class="pf-columnsBottomer">&nbsp;</div>

</div>

<div class="pf-entry">

<div class="pf-entryAttrList">  <div class="entryImage">   <img src="http://miromannino.it/wp-content/uploads/2012/09/mirorubixforpsp-screenshot-0-300x170.jpg" class="size-medium description-image colorbox-526" />  </div>  <div class="entryData">
<div class="pf-entryAttr"><span class="attrLabel">Categorie: </span> <span class="attrValue">PSP Puzzle Game</span></div>
<div class="pf-entryAttr"><span class="attrLabel">Data di rilascio: </span> <span class="attrValue">06/2008</span></div>
<div class="pf-entryAttr"><span class="attrLabel">Tecnologie: </span> <span class="attrValue">C, Oslib, PSP<sup>®</sup></span></div>
<div class="pf-entryAttr"><span class="attrLabel">Download from: </span> <span class="attrValue">
<a href="https://dl.dropbox.com/u/12453849/miromannino/projects/mirorubix/mirorubix_1-0_PSP.zip">Dropbox</a>
</span></div>
<div class="pf-entryLinks"><span class="attrValue">
<span class="entryLink"><a href="http://miromannino.it/projects/miro-rubix-for-psp/">Pagina del progetto</a></span>
</span></div>
  </div></div><div class="pf-columnsBottomer">&nbsp;</div>

</div>



</div>]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/miro-rubix-comes-back/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flickr Photostream</title>
		<link>http://miromannino.it/flickr-photostream/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=flickr-photostream</link>
		<comments>http://miromannino.it/flickr-photostream/#comments</comments>
		<pubDate>Wed, 01 Aug 2012 19:31:44 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[Platform]]></category>
		<category><![CDATA[Progetti]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=427</guid>
		<description><![CDATA[Il mio primo plugin per WordPress! Questo plugin per WordPress vi permette di mostrare il Photostream di Flickr nel vostro blog. Utilizzando Justified Gallery, questo vi permette una stupenda disposizione delle miniature delle immagini. Ci sono varie configurazioni per settare l’altezza delle righe e il comportamento dell’ultima riga. Puoi mostrare le foto utilizzando un lightbox, &#8230; <a href="http://miromannino.it/flickr-photostream/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>
Il mio primo plugin per WordPress! <br/>

Questo plugin per WordPress vi permette di mostrare il Photostream di Flickr nel vostro blog. Utilizzando Justified Gallery, questo vi permette una stupenda disposizione delle miniature delle immagini. Ci sono varie configurazioni per settare l’altezza delle righe e il comportamento dell’ultima riga. Puoi mostrare le foto utilizzando un lightbox, o aprendo le pagine direttamente con un link a Flickr. Potrete configurare il numero delle foto da mostrare in ogni pagina, e poi, navigare tra le varie pagine. Il plugin sceglie la giusta risoluzione delle immagini, utilizzando i suffissi di Flickr, in questo modo le miniature avranno sempre la massima risoluzione.
</p>
Guardalo meglio su <a href="http://miromannino.com/projects/flickr-photostream/" title="Flickr Photostream">pagina ufficiale</a>.]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/flickr-photostream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rimuovere gli Exif dalle immagini jpeg con exiftool</title>
		<link>http://miromannino.it/exif-remover-with-exiftool/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=exif-remover-with-exiftool</link>
		<comments>http://miromannino.it/exif-remover-with-exiftool/#comments</comments>
		<pubDate>Fri, 20 Jul 2012 12:46:16 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Linguaggi]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[Platform]]></category>
		<category><![CDATA[Fotografia]]></category>
		<category><![CDATA[Mac OS X]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=335</guid>
		<description><![CDATA[Ciao a tutti! Io utilizzo Flickr per condividere le mie foto, e so quanto i dati Exif presenti nelle immagini jpeg possano essere considerati dei dati sensibili. Per queste ragioni, ho realizzato un semplice script in bash che rimuove tutti i tag Exif superflui, lasciando solamente quelli che ritengo fondamentali per una fotografia. Lo script &#8230; <a href="http://miromannino.it/exif-remover-with-exiftool/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ciao a tutti! Io utilizzo Flickr per condividere le mie foto, e so quanto i dati Exif presenti nelle immagini jpeg possano essere considerati dei dati sensibili. Per queste ragioni, ho realizzato un semplice script in bash che rimuove tutti i tag Exif superflui, lasciando solamente quelli che ritengo fondamentali per una fotografia.</p>

<span id="more-335"></span>

<p>
Lo script ha due opzioni:
<br/>
<ul>
	<li><strong>-s</strong>: mostra tutti i dati Exif</li>
	<li><strong>-m</strong>: rimuove i dati Exif, lasciando solamente quelli importanti</li>
</ul>
<p>

<p>
Per esempio, puoi modificare una jpg con questo comando:
<code>./ExifRemover.sh -m MyImg.jpg</code>
</p>

<p>
Questo è lo script:

<pre class="brush: bash; title: ; notranslate">
#! /bin/bash

function usage {
	echo &quot;usage: $0 -ms path_of_file&quot;
	echo &quot;	-m to remove useless exif entries&quot;
	echo &quot;	-s to show current exit entries&quot;
	exit -1
}

if [ $# != 2 ]; then
	usage
fi

OP=$1
SRC=$2

if [ ! -f $SRC ]; then
	echo &quot;error: file not found&quot;
	exit -2
fi

if [ $OP = &quot;-m&quot; ]; then 

	cp &quot;$SRC&quot; &quot;$SRC&quot;.&quot;_tmp&quot;
	exiftool -all= &quot;$SRC&quot;
	exiftool -overwrite_original \
			-TagsFromFile &quot;$SRC&quot;.&quot;_tmp&quot; \
			-ExposureTime \
			-FNumber \
			-ExposureProgram \
			-ISO \
			-DateTimeOriginal \
			-CreateDate \
			-ExposureCompensation \
			-MaxApertureValue \
			-MeteringMode \
			-LightSource \
			-Flash \
			-FocalLength \
			-SubSecTime \
			-SubSecTimeOriginal \
			-SubSecTimeDigitized \
			-ColorSpace \
			-ExifImageWidth \
			-ExifImageHeight \
			-SensingMethod \
			-CustomRendered \
			-ExposureMode \
			-WhiteBalance \
			-DigitalZoomRatio \
			-FocalLengthIn35mmFormat \
			-SceneCaptureType \
			-GainControl \
			-Contrast \
			-Saturation \
			-Sharpness \
			-SubjectDistanceRange \
			-GPSVersionID \
			-GPSLatitudeRef \
			-GPSLatitude \
			-GPSLongitudeRef \
			-GPSLongitude \
			-Make \
			-Model \
		&quot;$SRC&quot;

	exiftool -delete_original! &quot;$SRC&quot;
	rm -f &quot;$SRC&quot;.&quot;_tmp&quot;

else 
	if [ $OP = &quot;-s&quot; ]; then
		exiftool &quot;$SRC&quot;
	else
		usage
	fi
fi
</pre>
</p>

<p>
Download: <a href="https://dl.dropbox.com/u/12453849/miromannino/ExifRemover.sh" title="ExifRemover.sh">ExifRemover.sh</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/exif-remover-with-exiftool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Richiesta Network Time Protocol in C#</title>
		<link>http://miromannino.it/network-time-protocol-request-in-c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=network-time-protocol-request-in-c</link>
		<comments>http://miromannino.it/network-time-protocol-request-in-c/#comments</comments>
		<pubDate>Fri, 29 Jun 2012 08:51:20 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Linguaggi]]></category>
		<category><![CDATA[Platform]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[NTP]]></category>
		<category><![CDATA[Reti di calcolatori]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=317</guid>
		<description><![CDATA[Di recente, ho scritto un&#8217;applicazione in C# che ha bisogno di conoscere se il sistema ha il tempo corretto. Ho perciò fatto una classe che recupera il tempo utilizzando i server NTP. La classe è scritta per fare in modo che non vengano richiamati sempre gli stessi server, utilizzando un semplice vettore circolare. Per i &#8230; <a href="http://miromannino.it/network-time-protocol-request-in-c/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Di recente, ho scritto un&#8217;applicazione in C# che ha bisogno di conoscere se il sistema ha il tempo corretto. Ho perciò fatto una classe che recupera il tempo utilizzando i server NTP. La classe è scritta per fare in modo che non vengano richiamati sempre gli stessi server, utilizzando un semplice vettore circolare. Per i dati che vengono ritornati dal server, vi invito a leggere <a href="http://tools.ietf.org/html/rfc2030" title="RFC-2030" target="_blank">RFC-2030</a>.</p>

<span id="more-317"></span>

<pre class="brush: csharp; title: ; notranslate">
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Net;
using System.Net.Sockets;


public class NoServerFoundException : System.Exception {
	public NoServerFoundException() : base() { }
	public NoServerFoundException(string message) : base(message) { }
	public NoServerFoundException(string message, 
			System.Exception inner) : base(message, inner) { }
	protected NoServerFoundException(SerializationInfo info,
		System.Runtime.Serialization.StreamingContext context) { }
}

class NetworkTime {
	/* For more info, see:
	 *	NTP (RFC-2030) 
	 *	http://tools.ietf.org/html/rfc2030
	 */

	private const int requestTimeout = 3000;
	private const int timesForEachServer = 5;
	private const byte offTime = 40; //Transmit Time (see RFC-2030)
	private uint lastSrv;

	//NIST Servers
	public static string[] srvs = {
		&quot;time.nist.gov&quot;,
		&quot;pool.ntp.org&quot;,
		&quot;europe.pool.ntp.org&quot;,
		&quot;asia.pool.ntp.org&quot;,
		&quot;oceania.pool.ntp.org&quot;,
		&quot;north-america.pool.ntp.org&quot;,
		&quot;south-america.pool.ntp.org&quot;,
		&quot;africa.pool.ntp.org&quot;,
		&quot;ntp1.inrim.it&quot;,
		&quot;ntp2.inrim.it&quot;
	};

	public NetworkTime() {
		Random rnd = new Random(DateTime.Now.Millisecond);
		lastSrv = (uint)rnd.Next(0, srvs.Length);
	}

	private IPAddress getServer() {
		lastSrv = (uint)((lastSrv + 1) % srvs.Length);
		IPAddress[] address = Dns.GetHostEntry(srvs[lastSrv]).AddressList;
		if (address == null || address.Length == 0) 
			throw new NoServerFoundException(&quot;no ip found&quot;);
		return address[0];
	}

	public DateTime GetDateTime() { return GetDateTime(false); }
	public DateTime GetDateTime(bool utc) {	
		//Examine all servers until we find a server that responds
		for (int st = 0; st &lt; srvs.Length * timesForEachServer; st++) {
			try {
				IPAddress ip = getServer();
				IPEndPoint ipEndP = new IPEndPoint(ip, 123);

				Socket sk = new Socket(AddressFamily.InterNetwork, 
									  SocketType.Dgram, 
									  ProtocolType.Udp);
				sk.ReceiveTimeout = requestTimeout;

				sk.Connect(ipEndP);

				/* Request
				 * VN: 4 = NTP/SNTP version 4
				 * Mode: 3 = client
				 */
				byte[] data = new byte[48];
				data[0] = 0x23;
				for (int i = 1; i &lt; 48; i++) data[i] = 0;
				sk.Send(data);

				/* Response
				 * we read the integer part and fraction part
				 * of transmit time (see RFC-2030)
				 */
				sk.Receive(data);
				byte[] integerPart = new byte[4];
				integerPart[0] = data[offTime + 3];
				integerPart[1] = data[offTime + 2];
				integerPart[2] = data[offTime + 1];
				integerPart[3] = data[offTime + 0];
				byte[] fractPart = new byte[4];
				fractPart[0] = data[offTime + 7];
				fractPart[1] = data[offTime + 6];
				fractPart[2] = data[offTime + 5];
				fractPart[3] = data[offTime + 4];
				long ms = (long)(
							(ulong)BitConverter.ToUInt32(integerPart, 0) * 1000
						 + ((ulong)BitConverter.ToUInt32(fractPart, 0) * 1000) 
							/ 0x100000000L);
				sk.Close();

				/* DateTime*/
				DateTime date = new DateTime(1900, 1, 1);
				date += TimeSpan.FromTicks(ms * TimeSpan.TicksPerMillisecond);
				
				return utc ? date : date.ToLocalTime();

			} catch (Exception ex) { }
		}

		throw new NoServerFoundException(&quot;no working server has been found&quot;);
	}
}
</pre>

<p>
Download: <a href="https://dl.dropbox.com/u/12453849/miromannino/NetworkTime.cs" title="NetworkTime" target="_blank">NetworkTime.cs</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/network-time-protocol-request-in-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MExpr</title>
		<link>http://miromannino.it/mexpr/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mexpr</link>
		<comments>http://miromannino.it/mexpr/#comments</comments>
		<pubDate>Sat, 16 Jun 2012 13:38:23 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[Platform]]></category>
		<category><![CDATA[Progetti]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Matematica]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=298</guid>
		<description><![CDATA[Finalmente, ho rilasciato la mia prima versione della libreria MExpr! Una libreria C++ che analizza delle espressioni matematiche, traducendole da stringhe a strutture facilmente manipolabili. La libreria è stata realizzata utilizzando bison e flex. La valutazione viene fatta attraverso un Abstract Syntax Tree, navigandolo ricorsivamente. Se si necessita di valutare più volte la stessa espressione, &#8230; <a href="http://miromannino.it/mexpr/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Finalmente, ho rilasciato la mia prima versione della libreria MExpr!</p>

<p>
Una libreria C++ che analizza delle espressioni matematiche, traducendole da stringhe a strutture facilmente manipolabili. La libreria è stata realizzata utilizzando bison e flex. La valutazione viene fatta attraverso un Abstract Syntax Tree, navigandolo ricorsivamente. Se si necessita di valutare più volte la stessa espressione, ad esempio per disegnare una funzione cambiando solamente il valore di una variabile, Si può anche compilare l’espressione in bytecode; quest’ultimo utilizza una pila per valutare l’espressione, risultando molto performante. La libreria supporta le variabili e funzioni parametriche con un qualunque numero di parametri. Si possono definire funzioni con stesso nome ma con numero diverso di parametri, lasciando al parser il compito di gestire l’overloading delle funzioni. Inoltre supporta le moltiplicazioni implicite, permettendo di scrivere espressioni in maniera naturale come: “-3xy^2″. Mette anche a disposizione un set di funzioni standard prese dalla libreria math.h.
</p>

<p>
<a title="MExpr" href="http://miromannino.com/projects/mexpr/">Guarda la pagina ufficiale</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/mexpr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExitWindowsEx in C#</title>
		<link>http://miromannino.it/exitwindowsex-in-c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=exitwindowsex-in-c</link>
		<comments>http://miromannino.it/exitwindowsex-in-c/#comments</comments>
		<pubDate>Thu, 31 May 2012 10:47:34 +0000</pubDate>
		<dc:creator>Miro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Linguaggi]]></category>
		<category><![CDATA[Platform]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://miromannino.it/?p=218</guid>
		<description><![CDATA[Vi posto una semplice classe per spegnere, riavviare e fare logoff in Windows utilizzando il famoso ExitWindowsEx. Per ogni metodo viene fatto overloading con un altro che può forzare l&#8217;azione. In altre parole, l&#8217;azione viene eseguita proibendo a Windows di mandare il messaggio WM_QUERYENDSESSION. In questo modo l&#8217;utente non potrà mai annullare l&#8217;azione. Ecco il &#8230; <a href="http://miromannino.it/exitwindowsex-in-c/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Vi posto una semplice classe per spegnere, riavviare e fare logoff in Windows utilizzando il famoso ExitWindowsEx.
Per ogni metodo viene fatto overloading con un altro che può forzare l&#8217;azione. In altre parole, l&#8217;azione viene eseguita proibendo a Windows di mandare il messaggio WM_QUERYENDSESSION. In questo modo l&#8217;utente non potrà mai annullare l&#8217;azione.</p>

<span id="more-218"></span>

<p>
Ecco il codice:

<pre class="brush: csharp; title: ; notranslate">
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

static class ExitWindows {

	private struct LUID {
		public int LowPart;
		public int HighPart;
	}
	private struct LUID_AND_ATTRIBUTES {
		public LUID pLuid;
		public int Attributes;
	}
	private struct TOKEN_PRIVILEGES {
		public int PrivilegeCount;
		public LUID_AND_ATTRIBUTES Privileges;
	}

	[DllImport(&quot;advapi32.dll&quot;)]
	static extern int OpenProcessToken(IntPtr ProcessHandle,
		int DesiredAccess, out IntPtr TokenHandle);

	[DllImport(&quot;advapi32.dll&quot;, SetLastError = true)]
	[return: MarshalAs(UnmanagedType.Bool)]
	static extern bool AdjustTokenPrivileges(IntPtr TokenHandle,
		[MarshalAs(UnmanagedType.Bool)]bool DisableAllPrivileges,
		ref TOKEN_PRIVILEGES NewState,
		UInt32 BufferLength,
		IntPtr PreviousState,
		IntPtr ReturnLength);

	[DllImport(&quot;advapi32.dll&quot;)]
	static extern int LookupPrivilegeValue(string lpSystemName,
		string lpName, out LUID lpLuid);

	[DllImport(&quot;user32.dll&quot;, SetLastError = true)]
	static extern int ExitWindowsEx(uint uFlags, uint dwReason);

	const string SE_SHUTDOWN_NAME = &quot;SeShutdownPrivilege&quot;;
	const short SE_PRIVILEGE_ENABLED = 2;
	const short TOKEN_ADJUST_PRIVILEGES = 32;
	const short TOKEN_QUERY = 8;

	const ushort EWX_LOGOFF = 0;
	const ushort EWX_POWEROFF = 0x00000008;
	const ushort EWX_REBOOT = 0x00000002;
	const ushort EWX_RESTARTAPPS = 0x00000040;
	const ushort EWX_SHUTDOWN = 0x00000001;
	const ushort EWX_FORCE = 0x00000004;

	private static void getPrivileges() {
		IntPtr hToken;
		TOKEN_PRIVILEGES tkp;

		OpenProcessToken(Process.GetCurrentProcess().Handle,
			TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out hToken);
		tkp.PrivilegeCount = 1;
		tkp.Privileges.Attributes = SE_PRIVILEGE_ENABLED;
		LookupPrivilegeValue(&quot;&quot;, SE_SHUTDOWN_NAME,
			out tkp.Privileges.pLuid);
		AdjustTokenPrivileges(hToken, false, ref tkp,
			0U, IntPtr.Zero, IntPtr.Zero);
	}

	public static void Shutdown() { Shutdown(false); }
	public static void Shutdown(bool force) {
		getPrivileges();
		ExitWindowsEx(EWX_SHUTDOWN |
			(uint)(force? EWX_FORCE : 0) | EWX_POWEROFF, 0);
	}

	public static void Reboot() { Reboot(false); }
	public static void Reboot(bool force) {
		getPrivileges();
		ExitWindowsEx(EWX_REBOOT |
			(uint)(force ? EWX_FORCE : 0), 0);
	}

	public static void LogOff() { LogOff(false); }
	public static void LogOff(bool force) {
		getPrivileges();
		ExitWindowsEx(EWX_LOGOFF |
			(uint)(force ? EWX_FORCE : 0), 0);
	}
}
</pre>
</p>

<p>
Download: <a title="ExitWindows.cs" href="http://dl.dropbox.com/u/12453849/miromannino/ExitWindows.cs" target="_blank">ExitWindows.cs</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://miromannino.it/exitwindowsex-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
