Giocare con le partizioni

Oggi avevo la necessità di convertire la partizione Btrfs di un disco in ext4, e purtroppo il roll back del btrfs-convert non ha funzionato.

Operando da CLI (tramite SSH) le opzioni erano poche: neanche GNU parted ha voluto lavorare su btrfs, quindi ho dovuto operare con i soli comandi relativi ai filesystem e cfdisk.

Ridimensionare il filesystem è stato facile: da 2TB l’ ho portato a 200GB con il comando

btrfs filesystem resize 200g /media/sdb1

(il filesystem deve essere montato).

Ma è stato ridotto il solo filesystem, non la partizione.

Per variare la partizione ho fatto una operazione per me nuova: mi tremavano i polsi mentre digitavo !

Prima ho smontato la partizione (/dev/sdb1), quindi con cfdisk l’ ho cancellata e ho creato una nuova partizione da 200GB al suo posto. Con partprobe ho segnalato al S.O. la modifica: e….MAGIA ! Ho montato la nuova partizione sdb1 e tutto era al suo posto !!!!!

Ora con il restante spazio vuoto posso creare la nuova partizione (/dev/sdb2) con ext4, trasferire i dati, e ingrandire questa partizione (con cfdisk e resize2fs) fino ad occupare l’ intero disco:

cfdisk /dev/sdb
# cancellare la partizione da ingrandire e crearla ex-novo con la dimensione desiderata
resize2fs /dev/sdb2

osservare che se non si specifica una dimensione per il filesystem, resize2fs lo estende fino ad occupare l’ intera partizione.
fonte: http://en.positon.org/post/Resize-an-ext3-ext4-partition

P.S.
Ho un dubbio sull’ ingrandimento della partizione: se all’ inizio del disco c’è /dev/sdb1 con btrfs e creo alla fine la /dev/sdb2, se voglio estendere quest’ ultima ad occupare l’ intero disco devo prima cancellare sdb1, poi devo cancellare sdb2 e quindi creare una nuova partizione su tutto il disco; alla fine, quale filesystem sopravvive ?!?!?

http://askubuntu.com/questions/24027/how-to-resize-a-ext4-root-partition-a-runtime

it is critical that the new partition starts at the same block as the old. The Id should also match (83 for Linux systems). Be prepared to lose all your data at the slightest typo.

Ich bin ein Berliner

« […] Sono orgoglioso di venire in questa città ospite del vostro onorevole sindaco, che ha simboleggiato per il mondo lo spirito combattivo di Berlino Ovest. E sono orgoglioso — sono orgoglioso di visitare la Repubblica Federale con il vostro onorevole Cancelliere che da così tanti anni guida la Germania nella democrazia, nella libertà e nel progresso, e di essere qui in compagnia del mio concittadino americano Generale Clay che — che è stato in questa città durante i suoi momenti di crisi, e vi tornerà ancora, se ce ne sarà bisogno.

Duemila anni fa — Duemila anni fa, il più grande orgoglio era dire “civis Romanus sum.” Oggi, nel mondo libero, il più grande orgoglio è dire “Ich bin ein Berliner.”

(Apprezzo l’interprete che traduce il mio tedesco)

Ci sono molte persone al mondo che non capiscono, o che dicono di non capire, quale sia la grande differenza tra il mondo libero e il mondo comunista

Che vengano a Berlino

Ce ne sono alcune che dicono — ce ne sono alcune che dicono che il comunismo è l’onda del progresso

Che vengano a Berlino

Ce ne sono alcune che dicono, in Europa come altrove, che possiamo lavorare con i comunisti

Che vengano a Berlino

E ce ne sono anche certe che dicono che sì il comunismo è un sistema malvagio, ma permette progressi economici

Lass’ sie nach Berlin kommen.

Che vengano a Berlino

La libertà ha molte difficoltà e la democrazia non è perfetta. Ma non abbiamo mai costruito un muro per tenere dentro i nostri — per impedir loro di lasciarci. Voglio dire a nome dei miei compatrioti che vivono a molte miglia da qua dall’altra parte dell’Atlantico, che sono distanti da voi, che sono orgogliosi di poter dividere con voi la storia degli ultimi 18 anni. Non conosco nessun paese, nessuna città, che è stata assediata per 18 anni e ancora vive con vitalità e forza, e speranza e determinazione come la città di Berlino Ovest.

Mentre il muro è la più grande e vivida dimostrazione dei fallimenti del sistema comunista — tutto il mondo lo può vedere — ma questo non ci rende felici; esso è, come il vostro sindaco ha detto, è una offesa non solo contro la storia, ma contro l’umanità, separa famiglie, divide i mariti dalle mogli, ed i fratelli dalle sorelle, divide un popolo che vorrebbe stare insieme

Quello che — Quello che è vero per questa città è vero per la Germania: una pace reale e duratura non potrà mai essere assicurata all’Europa finché ad un quarto della Germania è negato il diritto elementare dell’uomo libero: prendere una decisione libera. In 18 anni di pace e benessere questa generazione di tedeschi ha guadagnato il diritto ad essere libera, incluso il diritto di unire le famiglie, a mantenere la propria nazione in pace, in buoni rapporti con tutti.”

Voi vivete in una isola difesa di libertà, ma la vostra vita è parte della collettività. Consentitemi di chiedervi, come amico, di alzare i vostri occhi oltre i pericoli di oggi, verso le speranze di domani, oltre la libertà della sola città di Berlino, o della vostra Germania, per promuovere la libertà ovunque, oltre il muro per un giorno di pace e giustizia, oltre voi stessi e noi stessi per tutta l’umanità.

La libertà è indivisibile e quando un solo uomo è reso schiavo, nessuno è libero. Quando tutti saranno liberi, allora immaginiamo — possiamo vedere quel giorno quando questa città come una sola e questo paese, come il grande continente europeo, sarà in un mondo in pace e pieno di speranza. Quando quel giorno finalmente arriverà, e arriverà, la gente di Berlino Ovest sarà orgogliosa del fatto di essere stata al fronte per quasi due decadi.

Ogni — Ogni uomo libero, ovunque viva, è cittadino di Berlino. E, dunque, come uomo libero, sono orgoglioso di dire “Ich bin ein Berliner”.
[…] »

Ich bin ein Berliner

find e xargs in bash

Per trovare i file (o anche le directory) secondo una certa proprietà si usa il comando find.
Ad esempio per trovare i file eseguibili si scrive:

find . -executable -type f

in cui -type f specifica di trovare solo i file e non le directory.

Il comando xargs serve invece ad usare i dati passati in stdin (o presi da un file) come argomenti di un comando che viene ripetuto per ciascuno di essi (eventualmente gli argomenti possono essere raggruppati).

Quando ad xargs viene passato l’ output di ls o di find c’è il problema degli spazi vuoti nei path: è necessario combinare i parametri -print0 di find con -0 di xargs:

find . -executable -type f -print0 | xargs -0 chmod -x

Javascript, ancora appunti

Inizializzazione

Seguendo il criterio di separazione del codice dall’ HTML, il codice javascript andrà scritto in head.
Per “inizializzare” una pagina con gli event listeners, si sfrutta l’ evento onload di window:

<script type="text/javascript">
    callback = function(event) {
        event.preventDefault();
        for (prp in event) {
            console.log(prp, event[prp]);
        }
    }
    window.onload = function() {
        document.getElementById("link").addEventListener("click", callback, false);
    }
</script>

Nel precedente esempio vanno notate anche diverse altre cose:

  • alla funzione di callback viene passato da addEventListener l’ oggetto dell’ evento, così scrivendo la funzione di callback possiamo sfruttarne i membri.
  • Per “bloccare” l’ azione predefinita di un evento su un elemento del DOM, si usa event.preventDefault().
  • Per effettuare un “dump” di un oggetto in javascript si può sfruttare una notazione di array, come in questo frammento di codice: for (proprietà in oggetto) console.log(proprietà, oggetto[proprietà]);

Più in generale: l’ evento onload è definito solo per window e non per document.body; scrivere

window.onload = init();

significa chiamare la funzione init() ed assegnare il suo valore di ritorno a window.onload .
L’ assegnazione di una funzione si effettua così:

window.onload = init;

E’ preferibile operare anche così:

window.addEventListener("load", init);

Creazione elementi ed eventi

<div id="container"></div>
<script>
  function imageclick(param) {
    alert("This is the image of: " + param);
  }
  var container = document.getElementById("container");
  var i = document.createElement("IMG");
  i.src="http://some/file/name.jpg";
  container.appendChild(i);
  if(i.addEventListener) {  
    i.addEventListener('click', function(){imageclick('Name');}, false);
  } 
  else {
    i.attachEvent('onclick', function(){imageclick('Name');});  
  }  
</script> 

Fonte: