LKN: Bibliografia: differenze tra le versioni

m
nessun oggetto della modifica
mNessun oggetto della modifica
mNessun oggetto della modifica
Riga 1: Riga 1:
Questa pagina raccoglie piccoli suggerimenti per sfruttare al meglio [http://www.vim.org/ Vim] e gVim con il linguaggio di programmazione [http://www.python.org/ Python].
[[Categoria:Sistema]]
=SystemV: il boot di Debian=
==Struttura==
Debian ha scelto, come proprio sistema di boot, il SysV, che si distingue per la propria semplicit� e potenza...
Infatti, � basata su degli script sensibili a determinate azioni, che vengono linkati in delle directory predefinite (rappresentanti determinati init (ovvero livelli o stati a cui si trova la macchina).


== Syntax Higlight ==
Esaminiamo nel dettaglio la struttura di questo interessante sistema, cos� da capire meglio cosa avviene esattamente al boot della macchina.
La prima funzione che generalmente si abilita quando si usa un editor per programmazione � il ''syntax highlight''.
==Gli script di init.d==
Nella directory /etc/init.d sono presenti degli script particolari: il loro compito � quello di gestire i demoni (o servizi, che dir si voglia), quindi di avviarli, fermarli, far rileggere i file di configurazione, controllare lo stato, ... nel modo pi� semplice e comodo.
Di default, infatti, sono sempre presenti 3 opzioni:
; start : che lancia in esecuzione il demone
; stop : che si occupa di fermare correttamente il demone
; restart : che si occupa di riavviare il demone (stop + start)


Per abilitarlo in Vim per i vari linguaggi (incluso pyton) � sufficiente decommentare in<tt>/etc/vim/vimrc</tt> la riga:
a questi si aggiungono, poi:


  syntax on
; reload : permette la rilettura del file di configurazione
; force-reload : come sopra, ma in maniera forzata
; status : mostra a video lo stato del demone
; stats : visualizza delle statistiche sul lavoro del demone...




== Gestire l'indentazione: TAB, spazi e ''autoindent'' ==
Sapere come funziona uno script contenuto in /etc/init.d � utile, in quanto ci permette di utilizzarli anche da shell...
In python � di vitale importanza gestire correttamente l'indentazione dato che (a differenza dei linguaggi ''free-form'' come C) questa � parte integrante della sintassi.
Infatti, se ad esempio volessimo far partire apache, sarebbe necessario lanciare un semplice
<pre>
# /etc/init.d/apache start
</pre>
ed il gioco � fatto!!!
==I vari rcX.d==
Come scrivevo nell'introduzione, gli script sono linkati in alcune directory 'speciali', che ora analizzeremo:
I nomi di queste directory sono sempre nella forma 'rcX.d', dove X rappresenta uno stato tra quelli seguenti:


Il python di per se riconosce ogni tipo di indentazione (TAB, spazi, o un mix dei due). Nei moderni sistemi il TAB ha tuttavia una larghezza variabile ed impostabile a piacere. Per evitare dunque problemi di interoperabilit� tra persone che usano convezione diverse � universalmente consigliato di usare nei file di codice python solamente spazi oppure solamente TAB. Anche l'uso esclusivo di TAB pu� talvolta creare dei problemi di visualizzazione (e quindi difficolt� di lettura) a causa di una diversa larghezza usata. Per tagliare la testa al toro, dunque, il modo pi� robusto e portabile di programmare in python � quello di usare soltanto spazi. &Egrave; possibile impostare qualsiasi editor per programmazione in modo da sostituire automaticamente al TAB un numero di spazi pari alla larghezza dell'indentazione, e ovviamente anche Vim non � da meno. La larghezza per una unit� di indentazione usata quasi universalmente in python � pari ad una larghezza di 4 spazi. Per ricapitolare il nostro scopo � ottenere:
==="0" Shutdown===
Quando la macchina viene messa in questo stato, vengono arrestati tutti i demoni, smontate le periferiche e la macchina viene preparata per lo spegnimento.


* Sostituzione alla pressione del tasto TAB con un numero equivalente di spazi
==="1" Single User===
* Larghezza indentazione pari a 4 spazi.
In questo stato, � consentito l'accesso ad un utente solo, e gran parte dei servizi non vengono avviati; � usato prevalentemente per la manutenzione straordinaria della macchina


Per ottenere questo comportamento in Vim/gVim si pu� inserire il seguente codice nel file di configurazione <tt>/etc/vim/vimrc</tt>:
==="2-5" Modalit� Normali===
In Debian non esistono distinzioni tra gli stati 2, 3, 4 e 5 e viene lasciata all'utente la possibilit� di modificarli... Di default viene utilizzato il 2.


  filetype plugin indent on
==="6" Reboot===
  autocmd FileType python      setlocal sw=4 sts=4 et tw=78 sta
Quando la macchina viene portata in questo stato, viene preparata per un riavvio; avvengono tutte le cose indicate per rc0.d, ma viene inviato un segnale di reboot invece che di shutdown.


La prima riga abilita l'indentazione automatica per i vari linguaggi di programmazione. In particolare per il python, se ad esempio dichiariamo una funzione su una riga, andando a capo avremo gi� il cursore indentato per poter scrivere il corpo della funzione con la giusta indenzatione. Stessa cosa vale per i vari <tt>'''if'''</tt>, <tt>'''for'''</tt>, ecc... Questa funzione utile anche per accorgersi di errori sintattici come la mancanza dei :, poich� la loro assenza fa si che il cursore non venga indentato.
==="S" Boot===
Runlevel speciale, che viene eseguito sempre al boot della macchina, prima di passare al runlevel di default (in Debian � il 2).


La seconda riga associa ai tipi di file python le seguenti impostazioni:
==Configurazione manuale dei runlevel==
===Configurazione del sistema===
Il sistema di gestione dei runlevel � configurabile tramite il file '''/etc/inittab''' (� presente una guida a questo file, accessibile tramite il comando ''man inittab'').


;<tt>tabstop</tt> oppure <tt>ts</tt>: larghezza del ''carattere TAB'', quando incontrato nel file. Noi non useremo ''caratteri TAB'' quindi questa impostazione pu� essere ignorata (e non � riportata infatti nell'esempio precendente). Viene elencata qui solo per chiarezza e completezza.
In questo file vengono definiti i comportamenti principali del sistema.


;<tt>expandtab</tt> oppure <tt>et</tt>: riempe con spazi le indentazioni generate dalla pressione del tasto TAB.
La struttura delle istruzioni � la seguente:
<pre>
id:runlevel:azione:comando
</pre>
con le seguenti informazioni:
; id : rappresenta una voce specifica dell'inittab. Per quanto riguarda la configurazione delle console, viene solitamente usato il numero della console;
; runlevel : viene usato per indicare in quali runlevel deve essere analizzata l'istruzione. Possono essere specificati uno o pi� runlevel:
::*''123'' indica che l'istruzione verr� considerata nei runlevel 1, 2 e 3;
::*''1'' indica che verr� presa in considerazione solo nel runlevel 1.
; azione : indica l'azione da compiere. Le pi� usate sono:
:; wait : il sistema attende il termine dell'esecuzione del comando;
:; respawn : il comando indicato viene eseguito ciclicamente ogni volta che esso termina;
:; boot : il comando viene eseguito durante il boot (il contenuto di ''runlevel'' viene ignorato);
:; initdefault : usato per indicare il runlevel di default;
:; sysinit : il comando viene eseguito durante il boot del sistema, prima di ogni comando con azione uguale a ''boot'';
;: ctrlaltdel : cosa deve essere fatto quando si riceve il segnale ''SIGINT'';


;<tt>softtabstop</tt> oppure <tt>sts</tt>: larghezza di un rientro causato dalla pressione di un TAB. Il rientro � creato inserendo spazi se <tt>'''et'''</tt> � settato, altrimenti viene usata una combinazione di spazi e caratteri TAB (questi ultimi hanno larghezza <tt>'''ts'''</tt>).
; comando : il comando da eseguire.


;<tt>shiftwidth</tt> oppure <tt>sw</tt>: larghezza di un rientro dell'indentazione automatica. &Egrave; usato anche per definire la larghezza del rientro che si aggiunge o toglie ad un blocco di testo quando si seleziona (con '''v''') e poi si indenta/deindenta con '''>''' o con '''<'''.
====Runlevel di Default====
<pre>
# The default runlevel.
id:2:initdefault:
</pre>
In questo esempio (preso da una Debian Box) il runlevel di default � il '''2'''. <br/>
Per modificarlo � sufficiente modificare il numero racchiuso tra i caratteri '':''.


;<tt>smarttab</tt> oppure <tt>sta</tt>: In combinazione con le opzioni precendenti questa impostazione permette di cancellare un rientro (4 spazi ''reali ''nel nostro caso) con una sola pressione del tasto '''BS''' (o '''BackSpace''').
====Script di inizializzazione del sistema====
<pre>
# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS
</pre>
Specifica cosa fare durante l'avvio del sistema (a meno che non venga avviato in modalit� di emergenza).
; si : sta per ''sistem initialization''.


Lo script '''/etc/init.d/rcS''' ha la funzione di invocare tutti gli script '''S*''' contenuti in '''/etc/rcS.d/''' in ordine numerico/alfabetico.


== Folding: le piegature nel codice ==
====Comportamento in Modalit� Singolo Utente====
Una funzione comoda durante la programmazione � la possibilit� di ripiegare del codice (ad esempio una funzione o una classe) in modo di avere una visione pi� compatta del file e facilitare la navigazione.
<pre>
# What to do in single-user mode.
~~:S:wait:/sbin/sulogin
</pre>


Questo possibile in Vim tramite il ''folding'' (''piegature''). Esistono dei plugin per Vim che riconoscono le strutture sintattiche del python e creano automaticamente le piegature. Tuttavia il metodo illustrato di seguito ancora pi semplice: piegature automatiche in base all'indentazione. Nel caso del python questo semplice metodo particolarmente efficace.


Per abilitarlo basta inserire in <tt>/etc/vim/vimrc</tt>:
====Comportamento per ogni Runlevel====
<pre>
# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.


  set foldmethod=indent
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
</pre>


Di seguito sono elencati i principali comandi per gestire le piegature:
In questa parte del file di configurazione vengono specificati gli script da lanciare per ogni runlevel:
'''lX''', con ''X'' un numero rappresentante il runlevel, indica il runlevel (lo stesso numero deve essere indicato anche nel campo ''runlevel'').


;zo oppure Spazio: apre la piegature sotto il cursore (un solo livello)
Lo script '''/etc/init.d/rc''' si occupa di lanciare, in ordine numerico/alfabetico, gli script presenti in '''/etc/rcX.d/''', partendo per quelli '''K*''' per passare a quelli '''S*'''; accetta come parametro il numero del runlevel.
;zO: apre la piegature sotto il cursore e ricorsivamente tutte le piegature in essa contenute
;zc: chiude la piegatura alla quale appartiene il blocco di codice indicato dal cursore (un solo livello)
;zC: chiude la piegatura alla quale appartiene il blocco di codice indicato dal cursore e ricorsivamente tutte le piegature che la contengono
;zr: apre tutte le piegature del file corrente di un livello
;zR: apre completamente le piegature contenute nel file corrente (tutti i livelli)
;zm: chiude tutte le piegature del file corrente di un livello
;zM: chiude completamente le piegature contenute nel file corrente (tutti i livelli)


====Pressione di CTRL + ALT + CANC====
<pre>
# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
</pre>


== Eseguire python da Vim ==
Il comando da eseguire alla pressione della combinazione di tasti '''CTRL + ALT + CANC''' � facilmente personalizzabile tramite l'istruzione sopra riportata. In questo caso viene chiamato il comando ''/sbin/shutdown'' che con quelle opzioni controlla il contenuto di '''/etc/shutdown.allow''' per gli utenti abilitati all'esecuzione del comando (''-a''), esegue un reboot (''-r''), aspetta un secondo prima di iniziare tutta la procedura di spegnimento (''-t1''), esegue il comando subito (''now''). Per maggiori informazioni riguardo la personalizzazione del comando si rimanda alla pagina di manuale di shutdown (''man shutdown'').
Vim possiede caratteristiche avanzate che permettono di impostare i compilatori da usare per ogni linguaggio e il metodo di esecuzione del <code>make</code>.


Nel caso del python propongo una soluzione ''quick and dirty'' che associa ad un tasto l'esecuzione dello script.
� possibile disattivare questa caratteristica commentando la riga.


Aggiungendo nell'ormai famoso <tt>/etc/vim/vimrc</tt>:
====Gestione delle Console====
<pre>
# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6


  map <f5> :w<CR>:!python %<CR>
# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
</pre>


alla pressione del tasto F5 verr� eseguito <tt>python</tt> passando come paramentro il file corrente (indicato da '''%''').
Il numero di console attive in un sistema viene gestito in questa sezione del file di configurazione.  


Ricordando quanto imparato in precedenza capiamo che abbiamo 6 console virtuali nei runlevel 2, 3, 4 e 5 e una sola nei 4 e 5. Se la nostra macchina non ha molta ram e vogliamo risparmiarne un po', possiamo commentare le console 2-6.


== Autocompletamento (aka omnicompletion) e documentazione integrata ==
Se, invece, volessimo abilitare una console virtuale sulla porta seriale, � sufficiente decommentare la riga che inizia con ''T0'' (per averne una in ascolto sulla prima porta seriale).
Dalla versione 7 in Vim � stata inserita una funzione di autocompletamento intelligente per i vari linguaggi simile a quella presente in alcuni degli IDE pi� avanzati.


[[image: Python-gvim-7-omnicompletion.png|thumb|Screenshot della funzione di omnicompletion di Vim 7 con linguaggio di programmazione Python.]]
Per maggiori informazioni sulla personalizzazione delle console virtuali, ''man getty''.


Per il python questa funzione permette di completare i nomi delle classi dei metodi e degli attributi tramite un comodo menu contestuale. Inoltre viene anche visualizzata contemporaneamente la docstring del metodo o della classe che si st� completando.
===Gestione dei runlevel (update-rc.d)===
La gestione ''manuale'' dei runlevel (per gestione intendo, ovviamente, la modifica degli script assegnati ad ogni runlevel) � estremamente semplice, soprattutto con l'ausilio di '''update-rc.d'''.


Una immagine vale pi� di mille parole. Potete notare la funzione di omnicompletion in funzione nello screenshot qui a fianco. Notare come sulla parte superiore della finestra sia apparsa automaticamente la documentazione della classe sulla quale si st� operando l'autocompletamento.
Il suo utilizzo � estremamente semplice.


Per effettuare l'autocompletamento basta premere "CTRL+x o", ma ricordate che necessaria la versione 7 (o successive) di Vim. &Egrave; opportuno scaricare anche la versione aggiornata del file che gestisce l'autocompletamento in python. Ecco un link:
====Sintassi====
La sintassi del comando suddivisibile in tre varianti:


* [http://www.vim.org/scripts/script.php?script_id=1542 pythoncomplete.vim]
<pre>
update-rc.d [-n] [-f] name remove
</pre>
consente la rimozione di tutti i link nei runlevel relativi al demone ''name''


A volte anche comodo effettuare un autocompletamento ''non intelligente'', basato sulle parole presenti nel file corrente. Questo autompletamento si ottiene premendo "CTRL+n". Quest'ultimo metodo pu� risultare utile per completare nomi di variabili o di funzioni.
; -n : non esegue il comando, ma mostra cosa verrebbe svolto;
; -f : forza l'eliminazione dei link anche se ancora presente lo script in '''/etc/init.d/'''.


<pre>
update-rc.d [-n] name defaults [NN | NN-start NN-stop]
</pre>
crea il link di avvio allo script '''/etc/init.d/''name''''' secondo i [[#Valori di default | valori di default]]. possibile sovrascrivere l'ordine con cui verr eseguito lo script specificando le due cifre (''NN''), inoltre possibile fornire valori deversi sia per l'avvio (''NN-start'') che per l'arresto (''NN-stop'').


== Tips and Tricks ==
Alcuni ulteriori consigli nell'uso di Vim:


# '''Commentare un blocco di codice'''
<pre>
#* Premere CTRL+v e selezionare le righe di codice interessate
update-rc.d [-n] name start|stop NN runlevel runlevel ...  .  start|stop NN runlevel runlevel ...  . ...
#* premere <tt>'''I'''</tt> (i grande) e digitare il carattere interessato (solitamente #)
</pre>
#* premere ESC
crea il link di avvio|arresto allo script ''name'' specificando l'ordine (''NN'') e il/i runlevel. Il carattere ''.'' separa dichiarazioni multiple.
# '''Indentare e deindentare un blocco di codice'''
#* Premere <tt>'''V</tt>''' (shift + v) ed entrare in Visual Mode
#* Selezionare la parte di codice da in/deindentare
#* Premere <tt>'''></tt>''' per indentare o <tt>'''<</tt>''' per deindentare di 1 TAB


== Conclusioni ==
Questi sono solo piccoli suggerimenti per programmare in python con Vim. Come al solito, ogni correzione, suggerimento o aggiunta ben accetto e anzi incoraggiato.


Vengono riportati alcuni esempi pratici (script ''xdm''):


== Link ==
====Aggiunta di un link====
* [http://www.vim.org/ Homepage di Vim]
Link per l'avvio
* [http://www.python.org/ Homepage di Python]
<pre>
* [http://mail.python.org/pipermail/python-list/2005-July/330551.html Folding in Vim (thread su python list)]
update-rc.d xdm start 99 2 3 4 5
</pre>
Link per l'arresto
<pre>
update-rc.d xdm stop 01 0 1 6
</pre>


Concatenati
<pre>
update-rc.d xdm start 99 2 3 4 5 . stop 01 0 1 6
</pre>


----
====Rimozione di un link====
Autore iniziale: [[Utente:TheNoise|~ The Noise]]
<pre>
update-rc.d -f xdm remove
</pre>


[[Categoria:Desktop]][[Categoria:Tips&Tricks]]
====Aggiunta di link secondo i Valori di Default====
Valori di default:
<pre>
update-rc.d xdm defaults
</pre>
 
Valori di Default solo relativamente ai runlevel (impostando l'ordine di avvio a 99 e di arresto a 01)
<pre>
update-rc.d xdm defaults 99-start 01-stop
</pre>
 
====Valori di Default====
I valori di default utilizzati sono i seguenti:
* lo script viene lanciato con l'opzione ''start'' nei runlevel 2, 3, 4 e 5;
* lo script viene lanciato con l'opzione ''stop'' nei runlevel 0, 1 e 6
* l'ordine � impostato a 20
 
==Tool per la configurazione dei runlevel==
===sysv-rc-conf===
sysv-rc-conf � una utility basata sulle librerie [[ncurses]] utile per semplificare la gestione dei [[runlevel]] ed avere una panoramica sullo stato di tutti i runlevel.
 
[[Immagine:Sysv-rc-conf.png|thumb|center|Screenshot di sysv-rc-conf]]
 
Il suo utilizzo � semplice quanto immediato: nella schermata di gestione appare una matrice dove sulle righe sono presenti i servizi (� possibile spostarsi coi tasti cursore oppure scorrere la lista con CTRL + n e CTRL + p), la presenza di una '''X''' (modificabile tramite la barra spaziatrice) indica che il servizio verr� avviato per il runlevel indicato nella colonna. Come si nota subito, l'interfaccia non permette di specificare l'ordine con cui verranno lanciati i servizi, inoltre non � possibile specificare eventuali servizi da terminare all'ingresso in un determinato runlevel.
 
Un'altra funzione degna di nota � la possibilit� di avviare e terminare direttamente da questa schermata i servizi. � possibile, infatti, farlo tramite i tasti '''+''' (start, avvio) e '''-''' (stop, arresto) dopo essersi posizionati sulla riga relativa al servizio.
 
===sysvconfig===
Sysvconfig � un tool molto comodo e funzionale, che permette di moficare i vari runlevel visualizzandoli in una comodagriglia. Una volta posizionati sulla casella da modificare � sufficiente cancellarne il contenuto con il tasto [canc] e inserire l'indicazione (Sxx o Kxx (dove il numero ''xx'' rappresenta l'ordine con il quale deve essere eseguito lo script)).
 
[[Immagine:Sysvconfig.png|thumb|center|Screenshot di sysvconfig]]
 
===rcconf===
Rcconf � forse il pi� semplice programma per la gestione dei demoni che vengono lanciati all'avvio del sistema...
 
� in grado, infatti, di generare automaticamente una lista degli script che verranno lanciati all'avvio del sistema, lasciando all'utente solo la possibilit� di attivarli o disattivarli.
 
[[Immagine:rcconf.png|thumb|center|Screenshot di rcconf]]
 
===ksysv===
Un programma di gestione dei runlevel basato sulle librerie qt ed integrato in Kde.
 
Al primo avvio viene chiesto di specificare il sistema sul quale viene eseguito (Linux -> Debian GNU/Linux).
 
La schermata che ci viene proposta � comoda e ben organizzata: a sinistra abbiamo la lista dei servizi disponibili. A seguire la lista dei runlevel (colonne) suddivisi in due celle: in alto i servizi da avviare, in basso quelli da arrestare. Clickando su un servizio in un runlevel si possono modificare le impostazioni. Per inserire un servizio � sufficiente trascinarlo nel runlevel designato, come per cancellarlo da un runlevel � sufficiente spostarlo nel cestino ;) .
 
[[Immagine:Ksysv.png|thumb|center|Screenshot di KsysV]]
 
==rc.local e rc.local_shutdown==
27

contributi