Di seguito gli interventi pubblicati in questa sezione, in ordine cronologico.
Appena messo sul mio sito l'installer di BitmapToPolar 1.0b1.
E' necessario avere Microsoft .NET Framework 2.0 installato, ma chi ha da tempo gli aggiornamenti di Windows attivi da tempo, ce lo ha di sicuro. Anche chi ha Windows Vista o Windows 7, non ha nessuno problema.
Clicca qui per scaricare l'installer (file ZIP, 514 KB)
L'altroieri per questioni professionali mi sono imbattuto nel problema di stabilire computazionalmente un qualsiasi punto interno di un poligono. Supponiamo che vi si dia un poligono P costituito da N vertici: voi dovete rispondere con P_int, cioè dovete dotarmi di una procedura computazionale (cioè un algoritmo) che consenta di stabilire le coordinate di un punto (P_int) che si è certi essere contenuto nel poligono e non sul bordo. Tengo a precisare che la procedura deve funzionare con un qualsiasi poligono, cioè anche con uno concavo, altrimenti è troppo facile.
Nel caso di un poligono convesso, la soluzione sarebbe semplicemente di rispondere con la formuletta del calcolo del centroide (punto medio tra tutti i vertici) o del baricentro.
Tra le varie ipotesi fantasiose, verosimili ed inverosimili, la più stupida che ho trovato nella rete è stata questa: "basta guardarlo il poligono e indicare un punto interno". A dir poco geniale!
Le soluzioni algoritmiche più comuni a questa problematica si basano di solito sul ragionamento dell'attraversamento: provo ad attraversare il poligono. Alla prima intersezione entro nel poligono, alla successiva esco. Se il poligono è convesso, sono sicuro che entro una sola volta ed esco una sola volta. Se il poligono è concavo, a seconda della retta di attraversamento, potrei entrare ed uscire più volte, pertanto basta contare il numero di volte che ho incontrato un segmento del perimetro per dire se sono dentro o fuori. Se ne ho già incontrato un numero dispari di segmenti, mi trovo dentro il poligono; se invece ho incontrato i segmenti del poligono per un numero pari di volte, sono certamente fuori.
In una versione algoritmica la cosa difficile è proprio stabilire bene una buona retta di attraversamento:
- costruisco il bounding box (rettangolo contenitore) che contiene completamente il poligono (AABB)
- stabilisco un punto di prova che si trova dentro uno degli quattro quadranti al di fuori del bounding box: tale punto è sicuramente fuori dal poligono
- stabilisco la retta di attraversamento congiungendo tale punto ed il centro del bounding box
- determino tutte le intersezioni tra i segmenti del poligono e la retta di attraversamento
- se ho scelto opportunamente la retta di attraversamento, avrò sicuramente almeno un paio di intersezioni
- il risultato della computazione, cioè la risposta al problema, è il punto medio tra la prima e la seconda intersezione
Questo approccio algoritmico è però da evitare, perché potrebbe essere necessario dover cambiare la retta di attraversamento alcune volte. In più la retta di attraversamento potrebbe incrociare "malamente" qualche segmento, perché le è esattamente parallela, con tutti i problemi del caso. In tal caso non riusciamo a stabilire se l'intersezione che non è puntuale, ma è a tutti gli effetti un segmento vero e proprio, ci faccia entrare o uscire dal poligono. La gestione di questa casistica porterebbe a scrivere del codice specifico e comunque saremmo in presenza di approssimazioni nella valutazione dell'intersezione tra due segmenti pressoché paralleli.
Ce l'avete voi un'idea migliore per trovare una semplice soluzione al problema? Vi dico subito che c'è - è elegante e molto affascinante - e che l'ho già implementata, però ve la espongo più avanti.
Nei giorni scorsi sono incappato in un'incompatibilità tra la funzione glLineStipple dell'implementazione ATI di OpenGL ed il chipset grafico installato nel mio portatile, cioè la ATI Mobility Radeon HD 3470.
Purtroppo per me la Sony non autorizza aggiornamenti a tale chipset grafico, utilizzato anche per altri portatili in circolazione nel 2009, pertanto sono costretto a tenermi il driver 8.583.2.2000, rilasciato ancora il 14/5/2009, quando invece la ATI è già arrivata alla versione 11.12 dei propri driver ed il relativo gestore ATI Catalyst.
Ho provato anche ad utilizzare Mod Cat - Ati Mobility Modder, ossia un software che consente di craccare i file dell'installazione di ATI (ora di proprietà di AMD), in modo da riuscire nell'intento di installare i driver più recenti, bypassando così il controllo di Catalyst, ma al momento non ci sono ancora riuscito.
Son pertanto costretto a tenermi per un po' l'ATI OpenGL driver in versione 6.14.10.8501, che porta la data del 15/5/2009, le cui dimensioni sono di circa 10,8 MB. L'unica versione, alla data odierna, è decisamente più grande nelle dimensioni, 18,1 MB, ed è arrivata alla 6.14.10.11318 rilasciata al 10/11/2011.
Evidentemente in quei 7 MB in più di codice macchina ci sono sicuramente non solo il supporto di un più cospicuo numero di schede grafiche, ma sicuramente anche un workaround per gestire il problema in cui mi ritrovo.
Attualmente quando si va a disegnare linee o poligoni usando il mode glLineStipple e questi poligoni si sovrappongono ad altre facce, l'implementazione di ATI non solleva alcun bug, ma diventa pesantemente lenta, impiegando 2 o 3 ordini di grandezza per eseguire gli stessi compiti di rendering. E' praticamente inaccettabile, tanto che sto pensando di non usare tale prestazione di OpenGL, presente sin dagli esordi della più famosa libreria 3D cross-platform.
This week I incurred in an issue of glLineStipple implementation of ATI's OpenGL and the graphic chipset installed in my laptop computer, powered by an ATI Mobility Radeon HD 3470.
Sony doesn't let ATI release newer driver updates for such graphic board, used also with other notebooks on the market since 2009, so I have to keep driver 8.583.2.2000 released on 5/14/2009, although ATI reached release 11.12 for its drivers' collection and its ATI Catalyst manager.
I gave a chance also to Mod Cat - Ati Mobility Modder, which a modder that claims to jailbreak the ATI setup (formerly AMD), in order to install newer drivers and bypass the Catalyst pass check, but I wasn't able to succeed.
The latter 8 megabytes of machine code inside the DLL contain support for a more extensive list of graphic chipset, and even a workaround to circumvent the bug I can't fix.
At now when you draw lines or polygons using the glLineStipple mode, with some polygons overlapping other triangles, the ATI implementation doesn't throw any exception, but it hangs, taking about 100 or 1,000 times the standard rendering time. You can accept such performance decrease, so that I'm going to exclude such OpenGL feature, available since the first releases of the most cross-platform 3D library.
E' proprio vero che a volte mancano le parole per esprimere sentimenti e concetti che sono difficili da esternare. Altre volte invece sono gli stessi sentimenti e le emozioni ad essere così forti a togliere le parole di bocca; sono talmente forti che lasciano basiti.
Ci sono al contrario delle situazioni in cui le parole si sprecano e forse sarebbe il caso di parlare o di scrivere un po' meno, ma ci sono tanti momenti in cui bisogna anche saper leggere tra le righe, bisogna saper cogliere un secondo significato, un'intenzione più profonda che va oltre le semplici lettere di sterili parole.
E' così che stasera sono partito alla ricerca di una nuove dimensione letteraria, la terza. Ho provato un po' a cercare quel qualcosa che non sono riuscito ancora a carpire, ho provato a guardare tra le lettere, ho provato ad analizzare alla radice ogni parola, ma che dico, sono andato alla radice di ogni singola lettera per comprendere una volta per tutte cosa si celasse dietro ogni parola e sotto ogni lettera.
C'era una strana sensazione nelle ultime parole che ho scritto, c'era quel non so che che non riuscivo a realizzare fino in fondo e solo il senso dell'olfatto è riuscito ad aiutarmi in questa incontentabile ricerca cha spazia dall'indagine lessicografica arrivando a quella etimologica.
Cosa ci ho trovato? Il rigurgito di latte di Tommaso!
Più di un mese fa avevo sollevato la questione su come trovare un metodo per stabilire un punto interno ad un poligono qualsiasi. La questione era stata posta in questo articolo, anche se più di qualcuno aveva confuso questo tipo di problema col problema di stabilire se un punto si trovi o meno dentro un poligono.
Ripeto ancora una volta la questione: il problema algoritmico è proprio quello di trovare un punto completamente contenuto in un poligono ed il poligono può essere indifferentemente convesso o concavo. Il punto deve trovarsi internamente e non sul bordo, altrimenti basterebbe prendere uno qualsiasi dei vertici del perimetro o il punto medio di un qualsiasi lato.
La soluzione più elegante ed al tempo stesso molto pratica da implementare algoritmicamente si basa sul fatto che qualsiasi poligono è sempre suddivisibile in triangoli e, grazie a questa cosa, si può dimostrare per induzione che una soluzione valida al problema è il punto medio di una diagonale del poligono. E' chiaro che a questo punto la parte "difficile" è trovare una diagonale "interna" al poligono, cioè un segmento che congiunge una coppia qualsiasi di lati. Probabilmente in un poligono possono essere tante le diagonali completamente contenute nel poligono, ma ci limiteremo a trovare la prima.
Supponiamo per un attimo di pensare ad un algoritmo molto semplice per pervenire a soluzione:
- ciclare da 1 ad n per costruire preventivamente l'insieme dei lati del poligono
- prendere ad uno ad uno ogni vertice (i) da 1 fino a n, se n è il numero di vertici del poligono
- prendere ad uno ad uno un altro vertice (j) da i+1 fino ad n, con cui andare a formare una diagonale di prova, che non deve appartenere all'insieme dei lati del poligono
- prendere ad uno ad uno uno lato k nell'insieme dei lati costituenti il poligono
- controllare se la diagonale di prova che congiunge il vertice i al vertice j interseca il lato k
- se la diagonale di prova non interseca alcun altro lato, essa potrebbe essere completamente contenuta nel poligono, come potrebbe anche essere completamente esterna al poligono
- controllare se il punto medio della diagonale di prova è dentro o fuori il poligono e se è dentro, abbiamo la soluzione al problema
Come potete vedere questa implementazione è relativamente semplice, ma tutto fuorché efficiente, visto che la sua complessità polinomiale è O(n3).
Arriviamo pertanto al dunque, cioè illustro rapidamente il metodo che è basato sulla dimostrazione che esiste sempre una diagonale interna in un poligono [O'Rourke 13-14]. L'idea è appunto che il punto medio di una diagonale interna è sicuramente interno al poligono.
La dimostrazione per induzione la possiamo fare considerando il numero di vertici/lati di un poligono. Se c'è la soluzione per un poligono di N lati, si può trovare anche la soluzione per un poligono di N+1 lati.
Nel caso del triangolo, base dell'induzione perché è il poligono con numero minimo di lati (3), la soluzione al problema la troviamo banalmente utilizzando il centroide tra i tre vertici.
Per un quadrilatero, se esso è convesso, abbiamo due diagonali interne, quindi sicuramente entrambe vanno bene, se invece il quadrilatero è concavo, abbiamo una sola diagonale interna, ma abbiamo comunque la soluzione. C'è da notare che una diagonale interna è proprio il lato che è condiviso tra due triangoli contigui di una possibile triangolarizzazione di un poligono, cioè basta considerare in una triangolarizzazione proprio uno dei lati contigui dei triangoli come diagonale interna.
Passiamo ora all'algoritmo:
- individuare un vertice convesso v del poligono e consideriamo a e b i vertici adiacenti a v
- per ogni altro vertice q del poligono:
- se il vertice q è dentro il triangolo avb, calcolare la distanza di v ortogonale al segmento ab
- tenere per buono il vertice q se la sua distanza è minima rispetto alle altre calcolate
- se non esiste alcun punto q dentro il triangolo avb, allora considerare come soluzione il punto medio del segmento ab o il centroide di avb
- se invece qualche punto q è dentro il triangolo avb, allora la diagonale qv è sicuramente interna ed in tal caso la soluzione è il suo punto medio
Nell'immagine qui a lato potete notare che il punto più vicino alla retta ab, non cade dentro al triangolo avb, quindi la soluzione al problema è proprio data dal centroide del triangolo avb o il punto medio del segmento ab, in quanto diagonale interna.
Potete notare che la complessità dell'algoritmo è O(n), quindi non si può desiderare niente di meglio dal metodo: esso è ottimale anche come performance.
Generalmente dovrebbe essere il template corrente a prevedere di avere una propria favicon da mostrare a fianco della barra degli indirizzi o come etichetta dentro il pannello del browser.
In Joomla! 2.5 è pertanto necessario andare dentro la cartella del template:
templates/il_tuo_template/
e sostituire il favicon preimpostato con una nuova icona sempre di nome favicon.ico. Tale icona dovrebbe contenere auspicabilmente tre versioni dell'icona, in attesa di vedere cosa succederà tra breve nell'evoluzione dei browser:
- icona 32x32 pixel a 32 bit
- icona 16x16 pixel a 32 bit
- icona 16x16 pixel a 256 colori
Apple, col rilascio di Mac OS X 10.7, conosciuto più comunemente come Lion, ha deciso di non mettere più a disposizione il front-end per accedere al computer via FTP, principalmente per motivi di sicurezza e di affidabilità generale del protocollo di trasferimento file.
In realtà dentro Lion c'è ancora tutto quanto; è solo il front-end che è stato eliminato, basta solo smanettare un po' per riattivare il server ftp (ftpd):
sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist
Per spegnerlo invece, usate questo:
sudo -s launchctl unload -w /System/Library/LaunchDaemons/ftp.plist
Anche Apple stessa nell'area di supporto del proprio sito ha trattato l'argomento qui.
Se invece non avete confidenza con la linea di comando, può esservi di aiuto questo AppleScript della Troncept, OS X Lion FTPD Enable App, che attiva nella barra del menu uno menu specifico che serve proprio a questo.
E' disponibile anche un'applicazione molto più ricca per manovrare le leve del sipario di Lion, cioè Lion Tweaks, sviluppata da uno studente norvegese, che tra le tante operazioni, consente di riabilitare proprio ftpd in Lion.
Spesso mi capita di dover accedere attraverso l'interfaccia grafica web based di alcuni dispositivi presenti sulla mia rete locale (applicazioni WebDAV su iPhone, NAS).
Da questo punto di vista Vista è molto più utile ed efficace per accedere a tali servizi. Esso monitora costantemente la rete e mostra le risorse condivise nella finestra Rete. Se avete per esempio una NAS o un modem router ADSL/Wifi configurabile, vi ritroverete tra le icone specifiche per accedere a tali servizi.
In Lion (OS X 10.7), da quel poco che ne so io, non c'è una cosa analoga. Dovete conoscere i numeri IP dei dispositivi per aprire subito il browser. Siccome ad Apple quasi sempre non sfugge nulla, ho pensato che troppi dettagli forse non è il caso di mostrarli all'utente finale e magari elementari aspetti di privacy anche su una rete locale vanno salvaguardati, tanto l'amministratore di una rete locale sa sempre come fare per configurare e sistemare problematiche di varia natura.
Neanche qui le informazioni di Finder sono utili, perché non è indicato nemmeno il numero IP del dispositivo trovato sulla rete locale.
Potete sempre arrangiarvi con svariati strumenti come:
- lanciare Utility Network dalla cartella Utility in Applicazioni: basterà dare una pingata per scovare un po' di roba, per esempio chiedendo il ping 192.168.1.255
- potete provare Bonjour Browser di Tildesoft
In rete ho trovato qualcuno che ha sondato un po' l'argomento, ma al momento niente di esaustivo e risolutivo.
E' ovvio che l'argomento è apertissimo e che prossimamente proseguirò in questa analisi.
Tutte le NAS della QNAP, in primis la famiglia TS come la TS-212 o la TS-219, prevedono sul retro un bottone di reset, che può essere premuto per un certo lasso di tempo a seconda dell'operazione che si vuole intraprendere.
Può succedere che, a causa di un'improvviso blackout, la NAS si riaccenda e non utilizzi più il numero IP che le era stato assegnato in precedenza da qualche server DHCP della rete locale, col risultato che la NAS risulta a tutti gli effetti irraggiungibile.
Basic system reset (3 sec)
Dopo aver premuto il bottone reset per 3 secondi, si dovrebbe sentire un beep. Questi che seguono sono i parametri che vengono riportati alle impostazioni iniziali:
- password dell'amministratore di sistema: reimpostazione ad "admin" da qualsiasi altra impostazione
- configurazione TCP/IP: viene ottenuto un nuovo numero IP automaticamente via DHCP
- configurazione TCP/IP: disabilitazione del Jumbo Frame
- configurazione TCP/IP: se è stato abilitato il port trunking (presente solo sui modelli con doppia Ethernet), la modalità di port trunking viene resettata ad "Active Backup (Failover)"
- Porta di sistema: 8080 (porta di servizio di sistema)
-
- Livello di sicurezza: basso (consentite tutte le connessioni)
- password del pannello LCD: nessuna
- VLAN disabilitata
- Service binding: tutti i servizi NAS tornano a funzionare su tutte le interfacce di rete
|