sabato 22 ottobre 2011
Rivoluzione del concetto di fotografia
sabato 8 ottobre 2011
Più veloci della luce?
Cosa sono i neutrini? Particelle elementari, cioè "mattoncini" che compongono e "fanno funzionare" tutto l'universo. Alcuni tipi di questi "mattoncini" sono più noti: protoni, neutroni, elettroni,... I neutrini, come si può intuire dal nome, sono elettricamente neutri e sono "piccolini". Queste caratteristiche li rendono le particelle più "sfuggenti" tra quelle note, perché non interagiscono praticamente con nulla: noi stessi siamo costantemente "bombardati" da un flusso di neutrini provenienti dal Sole che attraversano tutta la Terra come se fosse trasparente. Se ipoteticamente avessi 100 neutrini e volessi costruire una barriera che ne fermi almeno 50 dovrei costruire un muro di piombo spesso un anno luce cioè circa 10000000000000 Km (sono 13 zeri)!
sabato 20 agosto 2011
Rinnovamento
mercoledì 6 gennaio 2010
Sostituzione di un hard disk senza re-installazione del sistema
lunedì 4 gennaio 2010
Un tarlo su internet
mercoledì 30 dicembre 2009
Parole, parole, parole
mercoledì 25 marzo 2009
Super javascript
In questi giorni ho scoperto una evoluzione, per me nuova, di html e javascript che la dice lunga sulla direzione che sta prendendo questa tecnologia: da semplice sistema per la creazione di ipertesti si sta trasformando sempre più in una vera e propria "piattaforma" per la programmazione di applicazioni che non hanno nulla da invidiare a quelle "classiche" che abbiamo installato sul pc. In particolare ho scoperto che le ultime specifiche dell'HTML5 prevedono la gestione diretta della grafica mediante javascript: in parole semplici è possibile avere una "tela" su cui disegnare quello che si vuole. Il tutto dipende dall'introduzione del tag <canvas> (che significa appunto "tela") e di alcune funzioni javascript per disegnare linee, rettangoli, cerchi, ... ma anche immagini nei formati supportati dal browser. Il tag è supportato, per ora, solo dalle più recenti versioni di Firefox, Safari, Opera e, ovviamente, Chrome. Internet Explorer, anche nella versione 8 (che è uscita recentemente in beta) non lo supporta.
Il funzionamento è procedurale, non dichiarativo; in pratica il disegno viene costruito "dicendo" al browser come deve procedere per farlo: "sposta la matita qui", "traccia una linea da qui a là", "cambia il colore della matita", "fai un cerchio", "riempi il cerchio di colore", ... Non voglio entrare in discussioni (filosofiche) sul fatto se sia meglio un approccio dichiarativo o procedurale ma voglio fare subito alcuni semplici esempi per capire.
Per iniziare c'è bisogno di una semplicissima pagina html con un tag <canvas> al quale associamo un attributo "id" per poterlo identificare semplicemente. Inserirò poi nella pagina una funzione javascript disegna() che viene eseguita al caricamento della pagina stessa (onload) e "disegnerà" nel canvas. Questo è il codice di base della pagina:
<html>
<head>
<title>Test canvas tag</title>
<style type="text/css">
#mycanvas {border-style:solid; border-width:1px; border-color:black;}
</style>
<script>
function disegna()
{
//Qui inseriremo le istruzioni per fare il disegno
}
</script>
</head>
<body onload="disegna();">
<canvas id="mycanvas" width="200" height="200">
Tag <canvas> non supportato da questo browser
</canvas>
</body>
</html>
Notare che qualsiasi contenuto del tag <canvas> non verrà visualizzato se il browser lo supporta: scrivere al suo interno è quindi un ottimo sistema per informare l'utente che sta usando un browser a cui manca questa funzionalità.
Faccio qualche prova di codice javascript nella funzione disegna().
Prima di tutto occorre ottenere l'oggetto che permette di disegnare e metterlo in una variabile:
var foglio = document.getElementById('mycanvas').getContext('2d')
Notare che il metodo getContext() per ora supporta solo il tipo '2d' (disegno bidimensionale) ma in futuro potrebbe anche supportare grafica in uno spazio tridimensionale (3d).
La tela è come un piano cartesiano con le coordinate che hanno origine nell'angolo in alto a sinistra, quindi il punto (0,0) sarà l'angolo in alto a sinistra, il punto (200,200), nel caso di esempio, sarà invece l'angolo in basso a destra.
la funzione moveTo permette di spostare la "matita" senza disegnare
foglio.moveTo(0,150)
La funzione lineTo disegna una linea retta fino al punto indicato
foglio.lineTo(200,150)
La funzione stroke() visualizza le linee fatte
foglio.stroke()
Cambio il colore della matita, ne prendo una rossa:
foglio.strokeStyle = 'red'
Inizio una linea (spezzata)
foglio.beginPath()
Mi sposto (senza disegnare)
foglio.moveTo(50,50)
Faccio due linee...
foglio.lineTo(150,50)
foglio.lineTo(100,0)
E "chiudo" la linea spezzata sul punto di partenza:
foglio.closePath()
foglio.stroke()
Riprendo la matita nera:
foglio.strokeStyle = 'black'
Disegno un rettangolo (i primi due parametri indicano il punto di partenza (angolo in alto a sinistra) e gli altri due indicano rispettivamente la larghezza e l'altezza del rettangolo
foglio.strokeRect(50,50,100,100)
Imposto il colore per lo riempimento delle figure:
foglio.fillStyle = 'brown'
Disegno un rettangolo colorato:
foglio.fillRect(100,120,20,30)
Il risultato, mettendo tutto insieme, è in questa pagina (visualizzate l'HTML per vedere com'è). Vi sembra banale? Allora guardate questo esempio fatto sfruttando (anche) l'elemento canvas: http://www.chromeexperiments.com/hosted/gravity/index.html
oppure quest'altro:
sabato 28 febbraio 2009
Reale e virtuale mescolati
mercoledì 11 febbraio 2009
Recupero accesso di amministratore
venerdì 9 gennaio 2009
Recupero di dati da un volume FAT32 corrotto
- Un PC con hard disk danneggiato
- Una chiavetta USB da almeno 1Gb
- Un hard disk esterno USB con abbastanza spazio libero da contenere i dati da recuperare.
- Un altro PC funzionante con connessione a internet.
Avvio del sistema
Verifica dei problemi
Recupero dei dati
domenica 21 dicembre 2008
memoria storica di internet
domenica 23 novembre 2008
Un occhio su internet

domenica 2 novembre 2008
Riflessione sui social network
martedì 9 settembre 2008
Old news

mercoledì 3 settembre 2008
Google lancia il suo nuovo browser: Chrome

giovedì 10 gennaio 2008
Macchina virtuale per VMware "da zero" (parte II)
- il link può utilizzare un singolo extent oppure l'insieme di più piccoli extent
- lo spazio utilizzato può essere allocato tutto in fase di creazione del disco, oppure può crescere dinamicamente nel momento in cui c'è l'esigenza di archiviare i dati.
version = 1Successivamente devono essere inseriti due parametri che definiscono un identificativo univoco del link (CID) e l'identificativo del link padre (parentCID). Gli identificativi sono valori casuali a 32bit e nel file di configurazione sono espressi in forma esadecimale. Nel mio caso il disco base non ha un link padre, quindi parentCID deve essere impostato ad un valore predefinito che da specifiche è (~0x0) (cioè la negazione di uno zero che nella rappresentazione esadecimale diventa ffffffff). In pratica i parametri da impostare sono:
CID=fffffffe parentCID=ffffffffIl parametro successivo consente di definire il tipo di disco. Tra le varie opzioni possibili scelgo "twoGbMaxExtentSparse" che genera, per ogni link, diversi extent (con una dimensione massima di 2Gb ciascuno) e alloca lo spazio dinamicamente (così non ho bisogno di occupare effettivamente tutto lo spazio del disco virtuale. Scrivo quindi: createType="twoGbMaxExtentSparse" Ora devono essere definiti i singoli extent. Vorrei un disco da 10Gb, quindi lo costruisco con 5 extent di 2Gb l'uno. La sintassi per definire un extent è la seguente:
modalità dimensione tipo nome
modalitàindica se è in scrittura o in sola lettura, imposto RW (lettura e scrittura)
dimensioneè la dimensione dell'extent espressa in settori, 1 settore = 512 byte. Se voglio un extent da 2 Gb scrivo 2 * 1024 * 1024 * 1024 / 512 = 4194304
tipouso SPARSE che indica che lo spazio viene allocato solo quando serve
nomeè il nome del file che contiene i dati. Utilizzando la sintassi consigliata lo chiamo xubuntu-s0001.vmdk la "s" indica che è di tipo SPARSE mentre 0001 è un numero progressivo. Riassumendo scrivo:
RW 4194304 SPARSE "xubuntu-s0001.vmdk" RW 4194304 SPARSE "xubuntu-s0002.vmdk" RW 4194304 SPARSE "xubuntu-s0003.vmdk" RW 4194304 SPARSE "xubuntu-s0004.vmdk" RW 4194304 SPARSE "xubuntu-s0005.vmdk"L'ultima parte del file di descrizione del disco definisce come sarà visto l'hardware dalla macchina virtuale. È necessario definire il tipo di interfaccia (adapterType) che imposto a "ide" e la geometria del disco; uest'ultima mi risulta un po' più complessa da capire, e deve essere coerente con la dimensione effettiva del disco. Un'altra volta proverò ad approfondire il significato dei parametri, per ora mi limito ad utilizzare questa tabella. Quindi, copiando, scrivo:
ddb.adapterType = "ide" ddb.geometry.sectors = "63" ddb.geometry.heads = "16" ddb.geometry.cylinders = "16383"Ora il file di configurazione dovrebbe essere completo. Mi resta solo un dubbio. I file del disco (xubuntu-s0001.vmdk) vengono generati direttamente da VMPlayer all'avvio o devono già esistere? Proviamo a partire senza. Niente: non parte! Proviamo a partire generando dei file vuoti... non parte! Probabilmente è necessario generare i file degli extent già nel formato corretto. La cosa è diventata un po' più complessa del previsto. Ma penso che questa sarà un'altra puntata!
mercoledì 9 gennaio 2008
OpenID
sabato 5 gennaio 2008
Macchina virtuale per VMware "da zero" (parte I)
- VMWare Player (scaricabile dal sito di VMWare)
- Immagine ISO del CD di installazione di XUbuntu Linux (Ho scelto la distribuzione Xubuntu al posto della "sorella maggiore" Ubuntu poiché è più leggera.
config.version = "8" virtualHW.version = "6" guestOS = "ubuntu"Provo a far partire la macchina: non farà nulla ma almeno vediamo se parte. Tutto OK: mi dice che non trova il sistema operativo :). Dopo aver eseguito VMware Player con la configurazione creata, vengono aggiunte automaticamente alcune righe al file .vmx: in particolare
floppy0.fileName = "A:"Questa non mi piace: ha impostato di default un lettore floppy mappato sul drive A: del mio PC reale, siccome non ho il floppy, per evitare problemi la sostituisco con:
floppy0.present = "false"Inizio ad aggiungere "pezzi" alla macchina. Per la scheda di rete scelgo la modalità NAT che permette di condividere semplicemente la connessione a internet del PC reale e imposto "e1000" come modello di scheda siccome è consigliato per sistemi operativi "moderni":
ethernet0.present= "true" ethernet0.startConnected = "true" ethernet0.virtualDev = "e1000" ethernet0.connectionType = "nat"La RAM (deve essere un multiplo di 4) la imposto a 256 Mb... meglio non esagerare, altrimenti mi occupa tutta quella reale!
memsize = "256"La scheda audio (impostazioni minimali consigliate):
sound.autodetect = "TRUE" sound.fileName = "-1" sound.present = "TRUE"Ora aggiungo il lettore CD-ROM mappandolo sull'immagine ISO di Xubuntu:
ide1:0.present = "true" ide1:0.deviceType = "cdrom-image" ide1:0.filename = "xubuntu-7.10-desktop-i386.iso" ide1:0.startConnected = "TRUE"Provo di nuovo ad avviare la macchina: manca ancora l'hard disk ma il CD di Xubuntu parte anche come "live CD" e posso comunque vedere se funziona. Anche questa volta la fortuna mi assiste: funziona perfettamente, compreso l'accesso a internet. Ora viene la parte che mi sembra più difficile: aggiungere un hard-disk. Nella configurazione aggiungo
ide0:0.present = "TRUE" ide0:0.deviceType = "disk" ide0:0.filename = "xubuntu.vmdk"e dovrebbe essere sufficiente. Ora devo costruire il file di configurazione del disco (.vmdk)... ma meglio rimandare alla prossima puntata!