lunedì 15 dicembre 2014

Ottenere un certificato per la firma per progetti opensource

Per ottenere una firma per il codice per progetti opensource ci sono una marea di siti per la ceritficazione in questo post spiegero come ottenere e attivare un codesign per java in modo gratuito.

Per prima cosa ci si deve iscrivere al sito https://en.sklep.unizeto.pl/certificate/index/index/ o http://certum.eu compilando la form con i propri dati ed inserendo open source developer nel campo Industry.

per ottenere il code signing certificate gratuito come persona individuale seguire i seguenti passi

  1. Andare su Test ID and OpenSource Code Signing certificates, compilare e spedire la form.
  2. Andare su Activate Certificates, e cliccare su Activate.
  3. Seguire il wizard dell'attivazione. Per Organization inserire "Open Source Developer". Per Organizational Unit, inserire Software Publishing.
  4. Verrà inviata una mail che chiedera la verifica della propria identità,rispondere con un link al progetto opensource e una copia di un documento accettato.
  5. In un giorno o poco più si ricewverà una mail contentente il link al certificato.
    NB. si deve aprire il link dallo stesso computer e con lo stesso browser con cui si è iniziato il processo.....
per firmare il file jar vai a firmare un file jar (cooming soon...)

lunedì 19 maggio 2014

Estendere un disco LVM con un disco aggiuntivo

Se si volesse aumentare un volume lvm inserendo un nuovo disco o come nel nostro caso creando un nuovo disco virtuale nella virtual machine

NB. tutti i comandi che dovremmo dare devono essere eseguiti come amministratore e quindi dovremmo anteporre sudo ai comandi o eseguirli da root.

 per prima cosa dobbiamo vedere come è stato montato il nostro disco dando il comando :
fdisk -l
Se il disco non è stato ancora formattato o partizionato fdisk restituirà in uscita un messaggio come il seguente, questo è normale perchè stiamo andando a creare le partizioni necessarie per le fasi successive.


questo significa che il nostro disco è montato su /dev/sdb ci servirà per lanciare fdisk.

(ci sono software che eseguno le seguenti procedure con una interfaccia grafica ad esempio Gparted noi eseguendo la procedura su di un server via ssh utilizzeremo il terminale)
dal terminale lanciare il comando
fdisk /dev/sdb
si aprirà un prompt di fdisk

  inserire i comandi nell'ordine indicato per creare una nuova partizione primaria che utilizzi completamente il disco e renda pronto per LVM.Per creare partizioni multiple di dimensioni diverse consiglio di utilizzare gparted o la guida di fdisk.

NB.le seguenti istruzioni formattano il disco quindi verificare in precedenza che il disco non contenga dati e che sia quello che vogliamo utilizzare.

  • n = creare nuova partizione
  • p = creare una partizione primaria
  • 1 = rendere la partizione la prima sul disco
  • enter = selezioniamo il primo cilindro
  • enter = selezioniamo l'ultimo cilindro

per preparare il disco all'utilizzo di LVM inserire i seguenti 2 comandi
  • t = cambia tipo di partizione
  • 8e = cambia il tipo in LVM
  •  
prima di scrivere le partizioni sul disco controllare che le informazioni saino giuste
  • p = visualizza configurazioni delle partizioni da controllare prima di scriverle sul disco
  • w = scrivi i cambiamenti su disco (non reversibile!!)

 dopo l'ultimo comando si esce da fdisk e si torna al prompt dei comandi

Ci sono tre  strumenti di base che ci permettono di ridimensionare volumi fisici,gruppi di volumi e volumi logici.(ciascuno di questi comandi deve essere preceduto da pv (volume fisico), vg (gruppi di volumi) o lv (volumi logici)in base a cosa si vuole modificare)
  • resize - può ridurre o espandere i volumi fisici e volumi logici ma non gruppi di volumi
  • extend - può ingrandire gruppi di volumi e volumi logici ma non può ridurli
  • reduce - può ridurre gruppi di volumi e volumi logici ma non puòingrandirli
adesso vediamo come aggiungere un uovo disco rigido al volume logico "lvstuff" creato in precedenza .

aggiungiamo il nuovo disco al gruppo di volumi con il comando
vgextend vgpool /dev/sdc1

 per ridimensionare il volume logico dobbiamo dire a LVM di quando vogliamo estendere o la dimensione a cui vogliamo portarlo.
per estendere il disco ad una dimensione di 8GB eseguire il comando
lvextend -L8G /dev/vgpool/lvstuff

 se volessi invece aggiungere 3GB al disco appena creato dovrei usare il comando
lvextend -L+3G /dev/vgpool/lvstuff

adesso come possiamo vedere dal messaggio che viene restituito il disco è da 11GB

se provassimo a dare il comando df -h vedremmo che lo spazio libero è identico a prima questo è dovuto al fatto che il volume logico è di 11GB ma il filesystem su questo volume è ancora della dimensione precedente. Per far utilizzare al filesystem tutto lo spazio che è stato predisposto basta far puntare il comando resize2fs al volume logico e il gioco è fatto.
resize2fs /dev/vgpool/lvstuff

NB. questo comando si riferisce a ext3/4 per filesystem differenti vedere il comando di resize addatto.

lunedì 2 settembre 2013

Avviare al boot un programma con wine che necessita di finestre

Per avviare un software studiato per windows sul proprio server Ubuntu si deve dapprima avere installato wine con il comando
sudo apt-get install wine
se possibile installare l'ultima versione aggiungendo un file col nome ppawine.list (o altro nome la cosa importante è che il file termini con .list) dentro /etc/apt/sources.list.d/ e dentro ci scrivi gli indirizzi del repository cercandoli alla pagina https://launchpad.net/~ubuntu-wine/+archive/ppa (ad oggi NDR l'ultima versione è la 1.4) per la propria distribuzione es.
deb http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu lucid main
deb-src http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu lucid main
se dovesse venir richiesta una chiave si deve aggiungerla con il comando
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com CHIAVE
dove CHIAVE è il numero della chiave pubblica che compare nell'errore dopo aver fatto
sudo apt-get update
lanciare il programma all' avvio con una delle 2 modalità dapprima si crea un file .sh dove verranno inseriti i comandi che ci servono per far partire l'applicazione poi si deve dargli i permessi di esecuzione tramite il comando
sudo chmod a+x nomefile.sh
ed ecco le due strade
  1. Se il programma non ha "urgenza" di essere avviato o per meglio dire non ha priorità specifiche è sufficiente aggiungereal file /etc/rc.local il lancio del nostro file
  2. copiare il file in /etc/init.d/ e succesivamente lanciare
sudo update-rc.d nomescript.sh defaults
per eliminare
sudo update-rc.d nomescript.sh remove
esempio file .sh
/usr/bin/wine /var/provaserver/programma.exe 2>/home/utente/log_provaserver.log
il 2> serve per avere in un file gli eventuali errori
il problema nasce dal fatto che wine o meglio il software che avviamo da wine deve aprire una finestra sul display e quindi lanciandolo dal boot si otterrà questo errore nel file di log
Application tried to create a window, but no driver could be loaded.
Make sure that your X server is running and that $DISPLAY is set correctly.
err:systray:initialize_systray Could not create tray window
per ovviare a questo problema ci viene in aiuto xvfb che tramite il comando xvfb-run avvia ad un server X virtuale il comando, dobbiamo quindi modificare il nostro fle sh nel seguente modo
xvfb-run/usr/bin/wine /var/provaserver/programma.exe 2> /home/utente/log_provaserver.log
risolvendo il problema e facendo funzionare il nostro programma. 

Se come nel nostro caso il computer dovesse non proseguire con il boot a causa del programma che abbiamo avviato dovremmo inserire la & dopo il comando ma prima di 2> e per sicurezza utilizziamo anche nohup che ci permette di avviarlo senza creare un terminale riducendo le possibilità di terminare involotariamente l'esecuzione del programma:
nohup xvfb-run/usr/bin/wine /var/provaserver/programma.exe & 2> /home/utente/log_provaserver.log

martedì 25 settembre 2012

Connettersi ad un database remoto con mysql

Qualche volta si ha la necessità di connettersi a dati (tabelle) che si trovano su di un server MySQL remoto, MySQL ci mette a disposizione un tipo federated che fa proprio al caso nostro.

Il tipo FEDERATED ci da la possibilità di accedere ai dati che risiedono su di un'altro database remoto senza dover replicare il database. Quando utilizziamo una tabella definita FEDERATED, le query eseguite sul server locale vengono eseguite automaticamente sulle tabelle remote questo ci consente di non avere alcun dato salvato sulla tabella locale.


Per prima cosa si deve verificare che il protocollo federated sia abilitato utilizzando il seguente comando da riga di comando Mysql.

mysql> show engines;

+------------+---------+----------------------------------------------------------------+
| Engine     | Support | Comment                                                        |
+------------+---------+----------------------------------------------------------------+
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) |
| CSV        | YES     | CSV storage engine                                             |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      |
| FEDERATED  | YES     | Federated MySQL storage engine                                 |
| ARCHIVE    | YES     | Archive storage engine                                         |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         |
+------------+---------+----------------------------------------------------------------+


se nella colonna support non dovesse essere abilitato si deve aggiungere federated=ON nella sezione [mysqld] del file di configurazione my.cnf e riaviarre il server

Per creare una tabella FEDERATED si devono seguire i seguenti passi:
  1. Creare la tabella sul server remoto. In alternativa si prenda nota della definizione della tabella esistente che si può vedere tramite il comando SHOW CREATE TABLE .
  2. Creare la tabella sul server locale utilizzando la stessa definizione aggiungendo però le informazioni di connessione che collegano alla tabella remota.
il collegamento alla tabella remota si può eseguire in 2 modi usando una connection string (contente il nome del server, utente, password) oppure creando precedentemente una connessione al server remoto

vediamo le due alternative.

Per esempio creiamo la seguente tabella sul server remoto:

CREATE TABLE test_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
) 
  1. Creazione tabella FEDERATED usando CONNECTION 
    
    

Per usare questo metodo si deve specificare la CONNECTION string dopo aver speficato il parametro ENGINE nel  CREATE TABLE .
Per esempio:
CREATE TABLE federated_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';

Note

La CONNECTION string contiene tutte le informazioni che servono per collegarsi al computer remoto ovvero specifica il nome del server, le credenziali di accesson il numero della porta e le informazioni relative al database e la tabella di riferimento.
Nell'esempio la tabella remota è sul server  remote_host, usa la porta 9306 (il nome server e porta possono essere sostituiti anche dall'indirizzo IP) l'utenet è fed_user, il dabase è federated e la tabella remota si chiama test_table

 La sintassi della CONNECTION STRING è:

scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name 
 
Dove:
  • scheme: Protocollo di connessione conosciuto. Solo mysql è supportato come valore di questo attributo. 
  • user_name: Il nome utente per la connessione che deve essere creato sul server remoto e deve avere i privilegi per eseguire le azioni richieste (SELECT, INSERT, UPDATE) sulla tabella remota.
  • password: (facoltativo) la password corrispondente all'utente user_name.
  • host_name: Il nome dell'host o l'indirizzo IP dello stesso.
  • port_num: (facoltativo) Il numero di porta del server. Di default è 3306.
  • db_name: Il nome del database che contiene la tabella che ci interessa.
  • tbl_name: Il nome della tabella remota. Il nome della tabella remota e quella locale non devono necessariamente coincidere.
Esempi di connection strings:
CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'
  1. Creazione tabella FEDERATED usando CREATE SERVER 
 Se si devono creare più di una tabella FEDERATED sullo stesso server o semplicemente se si vuole semplificare il processo di creazione si può usare CREATE SERVER per definire i parametri di connesione al server, 

Il formato di CREATE SERVER è:


CREATE SERVERserver_name
FOREIGN DATA WRAPPER wrapper_name
OPTIONS (option [, option] ...)
 
 per esempio per creare un server identico alla CONNECTION string:

CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';
 
 Si usa il seguente codice:

CREATE SERVER fedlink
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'fed_user', HOST 'remote_host', PORT 9306, DATABASE 'federated');
 
Per creare un tabella FEDERATED che usa questa connesionne si deve utilizzare la keyword  CONNECTION specofocando il nome che si ha utilizzato nella creazione del server

CREATE TABLE test_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='fedlink/test_table';
 
Nel parametro CONNECTION dell'esempio si trova il nome della connessione al server (fedlink) e il nome della tabella remota (test_table)separate da /.
Se si specifica solo il nome della connessione senza il nome della tabella viene preso
Per maggiori informazioni CREATE SERVER Syntax”.

CREATE SERVER accetta gli stessi parametri della connction string.
Queate informazioni vengono inserite nella tabella mysql.servers, nella tabella seguente ci sono le corrispondenze con i valori inseriti nella connection string e quelli inseriti nella tabella.
la connection string di rifermineto è :

scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name 
 
Description CONNECTION string CREATE SERVER option mysql.servers column
Connection scheme scheme wrapper_name Wrapper
Remote user user_name USER Username
Remote password password PASSWORD Password
Remote host host_name HOST Host
Remote port port_num PORT Port
Remote database db_name DATABASE Db

Alcune cose importanti da ricordare :


  • Le tabelle FEDERATED possono essere replicate sui server slave previo verifica che il server slave possa utilizzzare la combinazion euser/password definite nella connection string (o nel record della tabella mysql.servers ) per connettersi al server remoto.
  • il server remoto deve essere un server MySQL .
  • La tabella remota a cui si fa riferimento deve esistere prima che si tenti l' accesso via tabella FEDERATED.
  • una tabella FEDERATED può puntare ad un'altra tabella dello stesso tipo facendo attenzione a non creare un loop tra le connessioni.
  • Una tabella FEDERATED non supporta gli indice perchè l'accesso alla tabella è definito in remoto, e deve essere la tabella remota che ha il supporto per gli indici.
    Si deve prestare attenzione quando si crea una tabella FEDERATED in quanto la definizione dell'indice da un equivalente MyISAM o di altra tabella potrebbero non essere supportate
    Ad esempio, la creazione di una tabella FEDERATED con indice su una colonna VARCHAR, TEXT o BLOB avrà esito negativo. La seguente definizione in MyISAM è valida


    CREATE TABLE `T1`(`A` VARCHAR(100),UNIQUE KEY(`A`(30))) ENGINE=MYISAM;
     
    La definizione della chiave in questo esempio non è compatibile con il motore FEDERATED, e la dichiarazione equivalente avrà esito negativo:
     
    CREATE TABLE `T1`(`A` VARCHAR(100),UNIQUE KEY(`A`(30))) ENGINE=FEDERATED
      CONNECTION='MYSQL://127.0.0.1:3306/TEST/T1';
     
    Se possibile, si dovrebbe cercare di separare la definizione di colonna e indice per creare tabelle sia sul server remoto e il server locale per evitare questi problemi di indice.
  • Il protocollo FEDERATED supporta SELECT, INSERT, UPDATE, DELETE, TRUNCATE TABLE, e gli indici. Non supporta ALTER TABLE, o qualsiasi istruzione DDL che modifichi la struttura della tabella come DROP TABLE. La corrente implementazione non supporta l'uso di funzioni preparate e nemmeno le transizioni sono supportate.
  • il protocollo FEDERATED accetta inserimento ... con chiavi duplicate , ma se vi èuna violazione di chiave duplicata il la chiarazione fallisce con un errore
  • La velocità di una tabella FEDERATED per inserimenti massivi (per esempio, INSERT INTO ... SELECT ...) è più lenta di ogni altro tipo di tabella perche ogni riga selezionata viene trattata come un INSERT individuale sulla tabella FEDERATED.
  • Prima di MySQL 5.1.21, per un inserimento di righe multiple in una tablella FEDERATED, se l'inserimento creava un errore su di una riga dovuto ad una violazione di un vincolo, la tabella remota contenteva un aggiornamento parziale contenente le righe precendi a quella che ha causato l'errore invece di una cancellazione totale questo è dovuto al fatto che ogni INSERT è un'operazione a se stante. DopoMySQL 5.1.21, il protocollo FEDERATED consente inserimenti di massa che vengono spediti in remoto.Questo permette miglioramenti di prestazioni e se la tabella remota e di tipo transactional, è possibile il ripristino completo al verificarsi di un errore.
    Questa possibilità ha le seguenti limitazioni:
    • La dimensione degli inserimenti non deve superare la dimensione massima di un pacchetto per il server altrimenti verrà diviso in più pacchetti che renderebbero il ripristino problematico.
    • l'inserimento massivo non avviene per INSERT ... ON DUPLICATE KEY UPDATE.
  • Non c'è modo per il protocollo FEDERATED di sapere se la tabella remota ha subito cambiamenti.Il motivo è che queste tabelle sono utilizzate come file di dati che non possono essere modificate dal sistema. l'integrità dei dati nel database locale può rompersi se ci fossero cambiamenti al database remoto. (There is no way for the FEDERATED engine to know if the remote table has changed. The reason for this is that this table must work like a data file that would never be written to by anything other than the database system. The integrity of the data in the local table could be breached if there was any change to the remote database.)
  • Se usi una CONNECTION string, non puoi usare il carattere '@' nella password. Si può ovviare al problema creando una connessione via CREATE SERVER.
  • le opzioni insert_id e timestamp non vengono riportate sul server
  • Qualsiasi DROP TABLE su una tabella FEDERATED cancella solo la tabella locale e non la remota.
  • le tabelle FEDERATED non funzionano con le query nella cache
  • User-defined partitioning is not supported for FEDERATED tables. Beginning with MySQL 5.1.15, it is no longer possible to create such tables at all. 

giovedì 9 febbraio 2012

Installazione pacchetto ted per la conversione di rtf in pdf

Ted è una Gui per la visualizzazione e la modifica di file Rtf che grazie a degli script permette di convertire tali Rtf in Pdf , Html ecc..

Le dipendenze di questo pacchetto sono:

Per installare il pacchetto ted si deve inanzitutto installare la libreria lesstif2 ( le altre dipenze solitamente sono già soddisfatte


sudo aptitude install lesstif2
 scaricare i pacchetti .deb da launchpad
  • prima di tutto il file ted-common ( al momento siamo alla versione 2.17)

    wget http://launchpadlibrarian.net/11313542/ted-common_2.17-1ubuntu1_all.deb


    sudo dpkg -i ted-common_2.17-1ubuntu1_all.deb
  • nel mio caso devo installare il pacchetto per processore 64bit
    wget https://launchpad.net/ubuntu/+source/ted/2.17-1ubuntu1/+build/489695/+files/ted_2.17-1ubuntu1_amd64.deb

    sudo dpkg -i
    ted_2.17-1ubuntu1_amd64.deb
  • Con i seguenti script è possibile convertire tramite shell i documenti rtf in vari formati.

  1. rtf2pdf.sh
    #!/bin/sh
    
    ########################################################################
    #
    #  Convert an rtf document to pdf format using 'Ted' and 'GhostScript'.
    #
    #  Usage rtf2pdf.sh --paper paper something.rtf something.pdf
    #  Or  rtf2pdf.sh something.rtf something.pdf
    #
    #  Valid values for paper are a4, a5, a6, letter, legal and executive
    #
    #  This is an example. Refer to http://www.nllgg.nl/Ted/index.html for the
    #  'Ted' documentation.
    #
    #  If you want 'Ted' to set configurable resources, use
    #  Ted  --printToFilePaper --setProperty ... in the Ted way. E.G:
    #  Ted  --setProperty usePostScriptFilters 1 \
    # --setProperty usePostScriptIndexedImages 1  \
    # --setProperty afmDirectory /usr/share/ghostscript/fonts  \
    # --setProperty fontDirectory /usr/share/ghostscript/fonts  \
    # --setProperty ghostscriptFontmap \
    #    /usr/share/ghostscript/6.53/lib/Fontmap \
    # --setProperty ghostscriptFontToXmapping \
    #    /usr/share/ghostscript/6.53/lib/fonts.dir \
    # --printToFilePaper .....
    #  This has the advantage over the ++printToFilePaper call and X11 
    #  resource settings with -xrm Ted.usePostScriptFilters:1 style arguments 
    #  that it does not require an X11 server.
    #  The settings can also be stored in /etc/Ted.properties or in 
    #  $(HOME)/.Ted.properies files. Refer to the Ted documentation for 
    #  more details.
    #
    #  The file /usr/share/ghostscript/version/doc/Ps2pdf.htm documents 
    #  many settings for ghostscript that influence the generation of pdf.
    #  The actual meaning of the parameters is explained in Adobe technical 
    #  note #5151: "Acobat Distiller Parameters". With some effort, note #5151 
    #  can be found using the search facility on www.adobe.com.
    #
    #  To disable jpeg compression of 8 bit per component images:
    #      -dAutoFilterColorImages=false -dEncodeColorImages=false
    #  or
    #      -dAutoFilterColorImages=false -sColorImageFilter=FlateEncode
    #  to enable: (default)
    #      -dAutoFilterColorImages=true
    #
    #  To produce uncompressed pdf:
    #      -dCompressPages=false
    #  To produce compressed pdf: (default)
    #      -dCompressPages=true
    #
    #  Depending on your temper, you could also have a look at the pdfopt script
    #
    ########################################################################
    
    PAPER=
    PARAMS="--setProperty usePostScriptFilters 1 --setProperty usePostScriptIndexedImages 1"
    
    ps=/tmp/$$.ps
    trap "rm -f ${ps}" 0
    
    case $# in
        1|2)
     ;;
        3|4)
     case $1 in
         --paper)
      ;;
         *)
      echo $0: '$1='$1 'Expected --paper'
      exit 1
      ;;
     esac
    
     case $2 in
         a4|a5|a6|letter|legal|executive)
      PAPER=$2
      ;;
         *)
      echo $0: '$2='$2 'Expected a4|a5|a6|letter|legal|executive'
      exit 1
      ;;
     esac
     shift; shift;
     ;;
        *)
     echo $0: '$#='$#
     exit 1
     ;;
    esac
    
    case $# in
        1)
     rtf="$1";
     pdf=`basename "$1" .rtf`.pdf
     ;;
        2)
     rtf="$1";
     pdf="$2";
     ;;
        *)
     echo $0: '$#='$#
     exit 1
     ;;
    esac
    
    case $PAPER in
        ?*)
     Ted ${PARAMS} --printToFilePaper "$rtf" "$ps" $PAPER
    
     gs -q -dNOPAUSE    \
      -sDEVICE=pdfwrite   \
      -sPAPERSIZE=$PAPER   \
      -sOutputFile="$pdf"   \
      "$ps"     \
      -c quit
     ;;
        *)
     Ted ${PARAMS} --printToFile "$rtf" "$ps"
    
     gs -q -dNOPAUSE    \
      -sDEVICE=pdfwrite   \
      -sOutputFile="$pdf"   \
      "$ps"     \
      -c quit
     ;;
    esac
  2. rtf2ps.sh
    #!/bin/sh
    
    ########################################################################
    #
    #  Convert an rtf document to PostScript format using 'Ted'.
    #
    #  Usage rtf2ps.sh --paper paper something.rtf something.ps
    #  Or  rtf2ps.sh something.rtf something.ps
    #
    #  Valid values for paper are a4, a5, a6, letter, legal and executive
    #
    #  This is an example. Refer to http://www.nllgg.nl/Ted/index.html for the
    #  'Ted' documentation.
    #
    #  If you want 'Ted' to set configurable resources, use
    #  Ted  --printToFilePaper --setProperty ... in the Ted way. E.G:
    #  Ted  --setProperty usePostScriptFilters 1 \
    # --setProperty usePostScriptIndexedImages 1  \
    # --setProperty afmDirectory /usr/share/ghostscript/fonts  \
    # --setProperty fontDirectory /usr/share/ghostscript/fonts  \
    # --setProperty ghostscriptFontmap \
    #    /usr/share/ghostscript/6.53/lib/Fontmap \
    # --setProperty ghostscriptFontToXmapping \
    #    /usr/share/ghostscript/6.53/lib/fonts.dir \
    # --printToFilePaper .....
    #  This has the advantage over the ++printToFilePaper call and X11 
    #  resource settings with -xrm Ted.usePostScriptFilters:1 style arguments 
    #  that it does not require an X11 server.
    #  The settings can also be stored in /etc/Ted.properties or in 
    #  $(HOME)/.Ted.properies files. Refer to the Ted documentation for 
    #  more details.
    #
    ########################################################################
    
    PAPER=
    
    case $# in
        1|2)
     ;;
        3|4)
     case $1 in
         --paper)
      ;;
         *)
      echo $0: '$1='$1 'Expected --paper'
      exit 1
      ;;
     esac
    
     case $2 in
         a4|a5|a6|letter|legal|executive)
      PAPER=$2
      ;;
         *)
      echo $0: '$2='$2 'Expected a4|a5|a6|letter|legal|executive'
      exit 1
      ;;
     esac
     shift; shift;
     ;;
        *)
     echo $0: '$#='$#
     exit 1
     ;;
    esac
    
    case $# in
        1)
     rtf="$1";
     ps=`basename "$1" .rtf`.ps
     ;;
        2)
     rtf="$1";
     ps="$2";
     ;;
        *)
     echo $0: '$#='$#
     exit 1
     ;;
    esac
    
    case $PAPER in
        ?*)
     Ted --printToFilePaper "$rtf" "$ps" $PAPER
     ;;
        *)
     Ted --printToFile "$rtf" "$ps"
     ;;
    esac
    
  3. rtf2txt
    #!/bin/sh
    
    ########################################################################
    #
    #  Convert an rtf document to plain text format using 'Ted'.
    #
    #  Usage rtf2txt.sh something.rtf something.txt
    #
    #  This is an example. Refer to http://www.nllgg.nl/Ted/index.html for the
    #  'Ted' documentation.
    #
    ########################################################################
    
    case $# in
        1)
     rtf="$1";
     txt=`basename "$1" .rtf`.txt
     ;;
        2)
     rtf="$1";
     txt="$2";
     ;;
        *)
     echo $0: '$#='$#
     exit 1
     ;;
    esac
    
    Ted --saveTo "$rtf" "$txt"
  4. rtftohtml
    #!/bin/sh
    
    ########################################################################
    #
    #  Convert an rtf document to plain text format using 'Ted'.
    #
    #  Usage rtf2txt.sh something.rtf something.txt
    #
    #  This is an example. Refer to http://www.nllgg.nl/Ted/index.html for the
    #  'Ted' documentation.
    #
    ########################################################################
    
    case $# in
        1)
     rtf="$1";
     txt=`basename "$1" .rtf`.html
     ;;
        2)
     rtf="$1";
     html="$2";
     ;;
        *)
     echo $0: '$#='$#
     exit 1
     ;;
    esac
    
    Ted ++saveTo "$rtf" "$html"


Creare .deb da un .tar.gz con checkinstall

Checkinstall è una utilità molto utile per creare pacchetti .deb per Debian o Ubuntu da file .tar.gz (o .tgz) di sorgenti dopo averli compilati nella tua distribuzione.
Praticamente si prepara il pacchetto per un successivo utilizzo senza il bisogno di compilare il tutto sulla tua macchina linux.
Un'altra applicazione di checkinstall è la disinstallazione del pacchetto dopo averlo installato dai sorgenti.
Come avrete notato non tutti i programmi aggiungono la regola "uninstall" al Makefile e quindi il comando "make uninstall" non andrebbe a buon fine.
La soluzione migliore è utilizzare checkinstall pre preparare i pacchetti dai sorgenti e installarli e disinstallarli con dpkg.
Questa procedura spiga come preparare il .deb di clamav dai sorgenti
  1. installare checkinstall
    sudo aptitude -y install checkinstall
    (Ubuntu, Debian e derivate)
  2. Reperire i sorgenti da installare
    wget http://mesh.dl.sourceforge.net/sourceforge/clamav/clamav-0.81.tar.gz (per esempio)
  3. Installare le dipendenze e le librerie che servono per il funzionamento del pacchetto
    sudo aptitude install libgmp3 libgmp3-dev
  4. Compilare i sorgenti
    tar xvfz clamav-0.81.tar.gz
    cd clamav-0.81/
    ./configure --sysconfdir=/etc
    make
  5. Esegui checkinstall e segui le istruzioni (descrizione pacchetto ecc..):
    sudo checkinstall -D make install
  6. Quando sarà finito avremo clamav-0.81_0.81-1_i386.deb e si potrà installarlo con sudo dpkg -i clamav-0.81_0.81-1_i386.deb oppure copiarlo su un'altro computer per un'altra installazione.

lunedì 19 dicembre 2011

Autenticarsi ad un dominio Active directory con PHP e Open LDAP

Per prima cosa si deve verificare che ci sia il supporto LDAP installate.
Per verificare questo basta creare un pagina informazioni con:
echo phpinfo();
 Se eseguiamo la pagina e si vede il supporto LDAP allora siamo pronti altrimenti si deve ricompilare php con il supporto LDAP aggiungendo l'opzione --with-ldap[=DIR] per configurarlo.
Utilizzando Ubuntu in alternativa si possono installare i pacchetti occorrenti tramite i comandi:
sudo apt-get install slapd ldap-utils
andare nella configurazione di php
/etc/php5/apache/php.ini
aggiungendo :
extension=mod_ldap.so
poi riavviare apache sudo /etc/init.d/apache2 restart
sudo apt-get install php5-gd php5-ldap
sudo /etc/init.d/apache2 restart
dopodichè siamo pronti per creare la pagina di collegamento ad Active directory

che sarà:
// basic sequence with LDAP is connect, bind, search, interpret search
// result, close connection
$ldapserver="indirizzo ip o nome host del server Active Directory";
$ldaprdn ="Nome Utente";
$ldappass ="Password relativa all'utente"; //questi ultimi 2 dati si possono prenderre anche da
                                                                //una form HTML
$filter ="mail=*";

echo "

LDAP query test

";
echo "Connesione ...";
//connessione al server
$ds=ldap_connect($ldapserver);  //  deve essere un nome server LDAP valido!
echo "risultato di connessione : " . $ds . "
";

if ($ds) {
    echo "Autenticazione ...";
    $utente=$ldaprdn ."@". $ldapserver; //spesso il nome utente deve essere seguito da nome del
                                                             //server es. Utente@Server_LDAP
    echo $utente;
    $lv = ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
    $r=ldap_bind($ds,$utente,$ldappass);
    echo "Risultato della connessione: " . $r . "
";
<--------------------------------da verificare --------------------------->
    echo "Searching for (sn=S*) ...";
    // Search surname entry
    $sr=ldap_search($ds,"dc=provincia,dc=tn,dc=it",$filter);
    echo "Search result is " . $sr . "
";

    echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "
";

    echo "Getting entries ...";
    $info = ldap_get_entries($ds, $sr);
    echo "Data for " . $info["count"] . " items returned:
";

    for ($i=0; $i<$info["count"]; $i++) {
        echo "dn is: " . $info[$i]["dn"] . "
";
        echo "first cn entry is: " . $info[$i]["cn"][0] . "
";
        echo "first email entry is: " . $info[$i]["mail"][0] . "

";
    }
    echo" get DN
";
    $dn = ldap_get_dn ($ds,$resource);
    echo "result is " . $dn;
    $informazioni=ldap_get_entries ($ds);
    echo "- numero entrate ".$informazioni['count'];
    echo "
";
    echo "Closing connection";
    ldap_close($ds);

} else {
    echo "

Unable to connect to LDAP server

";
}
?>

da verificare e spiegare le funzioni.

mercoledì 5 ottobre 2011

Come autenticarsi in Linux senza password con le chiavi SSH

SSH è un fantastico strumento per gli amministratori di sistema. Consente di eseguire comandi da remoto, copiare file in rete, creare dei tunnel e tutto sfruttando i più robusti algoritmi di cifratura. Inoltre consente di stabilire delle rigide politiche riguardo l'autenticazione, come gli host o i PC da autenticare, utenti, ecc.
Quello di cui vi vorremmo parlare oggi è la possibilità di OpenSSH di autenticare un utente in base a uno scambio di chiavi, senza che venga richiesta la password e senza che questo possa rendere meno sicuro il nostro sistema. Di solito infatti siamo abituati a inserire una password per accedere a un sistema. Il concetto è quello di inserire una chiave pubblica (possedendo solo noi la corrispondente chiave privata) all'interno della configurazione di SSH sull'host remoto sul quale vorremmo autenticarci. In questo modo al tentativo di connessione SSH controllerà se la nostra chiave privata e la chiave pubblica lì presente fanno parte della stessa coppia e, in caso positivo, ci darà accesso al sistema.
Trovare una chiave privata a partire da una pubblica è infatti praticamente impossibile, e certamente più difficile di trovare una password. Se la mancanza di richiesta di password vi sconvolge pensate che comunque per assegnarla al server sarà necessario il login: non è quindi un'operazione che possono svolgere tutti, ma solo coloro che hanno già le giuste credenziali di accesso.
In pratica genereremo una coppia di chiavi, una pubblica e una privata. Quella pubblica verrà copiata sul server. Quando il server ci chiederà chi siamo, il nostro client genererà una firma a partire dalla nostra chiave pubblica. Il server, in possesso della chiave pubblica, può controllare se quella firma è stata generata da una chiave privata corrispondente alla chiave pubblica in suo possesso. In caso positivo verrà dato accesso al sistema.
Generiamo quindi la coppia di chiavi con il comando ssh-keygen, ci verrà chiesto di inserire un percorso (va bene anche quello proposto di default) e una passphrase (che sarà bene inserire e non usare una vuota a me no che non si voglia utilizzare degli automatismi in tale caso è opportuna lasciarla vuota) per la generazione delle chiavi:
[utente@linuxbox1 ~]$ ssh-keygen -b 2048 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/utente/.ssh/id_rsa):
Created directory '/home/utente/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/utente/.ssh/id_rsa.
Your public key has been saved in /home/utente/.ssh/id_rsa.pub.
The key fingerprint is:
90:98:4f:f5:69:39:57:5d:46:83:a4:a2:d6:63:3c:25 utente@linuxbox1

A questo punto dovremmo copiare la chiave pubblica sul server SSH. Questa essendo pubblica può essere letta da chiunque, senza problemi di sicurezza. Per copiarla possiamo usare anche scp, programma per la copia di SSH. Ipotizzando che il server si chiami linuxbox2 e che l'utente si chiami utente2, il comando sarà:
[utente@linuxbox1 ~]$ scp /home/utente/.ssh/id_rsa.pub utente2@linuxbox2:.

Ci verrà chiesta la password di utente2 e il file id_rsa.pub, contenente la chiave pubblica, verrà copiata nella home di utente2 su linuxbox2. A questo punto facciamo il login su linuxbox2 (ovviamente come utente2), e copiamo il contenuto del file appena copiato nel file /home/utente2/.ssh/authorized_keys:


cat /home/utente2/id_rsa.pub >> /home/utente2/.ssh/authorized_keys
altro sistema per copiare la mia chiave pubblica su un server remoto (al quale ho un accesso):

ssh-copy-id -i ~/.ssh/id_rsa.pub username@macchina.remota
oppure utilizzando il protocollo ssh
creare una directory ~/.ssh come utente2 su Linuxbox2. (La directory potrebbe gia' esistere, il che va bene...):
utente@linuxbox1:~> ssh utente2@linuxbox2 mkdir -p .ssh
utente2@linuxbox2's password:
Ora appendi la nuova chive pubblica di utente su utente2@linuxbox2:.ssh/authorized_keys ed inserisci la password di utente2 per l'ultima volta:
utente@linuxbox1:~> cat .ssh/id_rsa.pub | ssh utente2@linuxbox2 'cat >> .ssh/authorized_keys'
utente2@linuxbox2's password:


A questo punto basterà provare a collegarsi dall'host linuxbox1 su linuxbox2 per connettersi a patto di inserire la passphrase scelta :
ssh utente2@linuxbox2

Backup incrementale con tar

Una funzionalità di tar non molto usata è quella degli archivi incrementali. E’ invece una funzionalità che può risultare molto utile in alcune strategie di backup, quando, ad esempio, si esegue un ciclo di backup su base settimanale ma non si vuole o non si può fare un backup completo ogni giorno.
Supponiamo ad esempio di voler fare il backup della directory /home/documenti salvando l’archivio in /var/backup. Il comando da dare è:
tar zcvf /var/backup/documenti-`date +%s`.tgz --listed-incremental=/var/log/documenti.tarlog /home/documenti
Viene cioè creato un’archivio dal nome documenti-.tgz (per esempio: documenti-1180427502.tgz), che contiene tutto quello che c’è in /home/documenti. La scelta di aggiungere la data in formato unix è totalmente arbitraria e serve solo come promemoria. Può essere usata al suo posto la data in formato normale usando +%F al posto di +%s.
Viene inoltre creato un file di log (/var/log/documenti.tarlog) che servirà a tar nei successivi backup per capire cosa è cambiato in /home/documenti e cosa va quindi inserito nei successivi backup.
Nei successivi archivi creati con lo stesso comando verranno inseriti solo i file nuovi o modificati e verrà aggiornato il file di log.
Cancellando il file di log e rilanciando il comando viene ricreato un archivio completo. Tutti gli archivi creati, quelli completi e quelli incrementali, hanno il grosso vantaggio di poter essere trattati individualmente, cioè non c’è bisogno della presenza del file di log per poter estrarre i files e le directory in essi contenuti.

Nella pratica se la directory /var/backup viene salvata ogni notte dei giorni lavorativi su supporto esterno (tape, cd/dvd, nas etc.) un semplicissimo script /usr/local/bin/backup_documenti.sh che utilizzi la funzionalità incrementale di tar potrebbe essere scritto in questo modo:

#!/bin/sh
# Cancella i vecchi archivi presenti
rm /var/backup/documenti-*.tgz
# prepara il nuovo archivio, completo se il file di log
#non esiste, altrimenti incrementale
tar zcvf /var/backup/documenti-`date +%s`.tgz --listed-incremental=/var/log/documenti.tarlog /home/documenti

Ovviamente se serve avere il file completo e gli incrementali la cancellazione degli archivi la facciamo nello script che parte il lunedì.
Lo scipt va lanciato tramite cron ogni giorno prima che il sistema di backup archivi la directory sul supporto esterno. Il primo giorno della settimana, prima che venga archiviata la directory dei documenti, sempre tramite cron, viene cancellato il file di log, in modo che il primo backup della settimana sia sempre completo.
Le righe da inserire in un crontab possono essere simili a queste:


#lunedì sera alle 21 cancello il file di log prima
#che cominci l'archiviazione
0 21 * * 1 rm -f /var/log/documenti.tarlog
# dal lunedì al venerdì alle 22 viene preparato
#il file archivio
0 22 * * 1-5 /usr/local/bin/backup_documenti.sh

martedì 4 ottobre 2011

Come rimuovere la password per le Macro VBA da Excel
Pubblicato da Alberto Armida | sabato 28 agosto 2010 | | Etichette: software, sviluppo
Un mio cliente mi contatta, chiedendomi di modificare un Excel utilizzato in azienda composto da alcune paginette più alcune Macro di VBA. Cerco di accedere alle Macro e... sorpresa! Richiesta di password di protezione VBA di Excel!!!

"Poco male" - penso. Contatto il cliente e mi sento rispondere: "Eh no... la password non gliela so dire. Questo foglio è stato fatto da una persona che ora non lavora più per noi. Ma tanto voi informatici ci mettete 10 minuti..." (chissà come mai la gente pensa che noi programmatori abbiamo la bacchetta magica o il dono dell'onniscienza... mah!)

Mi metto quindi alla ricerca di un modo per sproteggere questo dannato file: rivolgo una preghiera a San Google, che mi ritorna una serie di link che rimandano tutti a software a pagamento... no, grazie! Non intendo sborsare un minimo di 39$ per togliere una password!
Analizzando il file ed utilizzando quel poco di documentazione circa il formato XLS che Microsoft ha rilasciato... mi si accende una lampadina!!!

Aprite con il vostro editor esadecimale preferito il documento "vittima" (io utilizzo Notepad++ con il plugin Hex Editor)
Dal menù "Plugins", selezionate "Hex Editor", quindi "View in HEX" (CTRL+ALT+SHIFT+H, se preferite le scorciatoie da tastiera)
Dal menù "Cerca", selezionate "Cerca" e compilate la maschera come indicato in figura (cercate quindi "DPB" in formato Unicode)
Una volta localizzata la stringa, cambiatela in "DPx" (attenzione alle maiuscole e minuscole, è importante)
Salvate e chiudete l'editor
Aprite ora il vostor file Excel e rispondete "Sì" a questo messaggio di errore

Ora premete ALT+F11 per accedere al codice VBA del progetto. Vi verrà mostrato un "Errore imprevisto (40230)", non ve ne preoccupate e cliccate "OK" sino a che non si aprirà la maschera dell'editor VB di Excel
Ora dovreste già vedere gli oggetti VBA che compongono il progetto, ma non abbiamo ancora finito. Dal menù "Strumenti" selezionate "Proprietà di VBA Project", scheda "Protezione" e, se selezionato, deselezionate "Proteggi progetto dalla visualizzazione" ed inserite una nuova password per proteggere il foglio. (di fatto, state forzando Excel a riscrivere correttamente la sezione del file relativa alla protezione).
Confermate premendo "OK", salvate e chiudete il foglio di lavoro.
Ora potete riaprire il foglio e, se lo reputate neccessario, eliminate la password (tornando nella maschera sopra riportata), in modo da non avere più la richiesta quando cercate di visualizzare le proprietà del progetto.

Semplice, efficace... e soprattutto economico! Almeno 39$ risparmiati. :)

PS: ovviamente quando sopra riportato è puramente a fini didattici o per accedere a vostri Excel dei quali avete dimenticato la password o per i quali siete stati esplicitamente autorizzati dal legittimo proprietario.

Eseguire automaticamente script all'avvio di Ubuntu

Per poter creare uno script che venga automaticamente lanciato ad ogni avvio di Ubuntu, dobbiamo creare un file .sh nella cartella /etc/init.d/ che però deve avere come intestazione un blocco di sintassi rigida compreso tra

### BEGIN INIT INFO
### END INIT INFO
questo è il blocco di codice che deve essere inserito

### BEGIN INIT INFO
# Provides: scriptname
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO

Quindi:
sudo nano /etc/init.d/nomescript.sh
Scriviamo all’interno del file lo scirpt che vogliamo sia lanciato, diamo i permessi di esecuzione:
sudo chmod a+x /etc/init.d/nomescript.sh
ed infine lo lanciamo:
sudo update-rc.d -f nomescript.sh defaults

Ora lo script verrà eseguito ad ogni avvio della macchina e fermato al suo spegnimento

se noi volessimo invece che lo script venga solo avviato all'avvio (99 è il numero di priorità più alto il numero più tardi viene eseguito)
sudo update-rc.d -f myscript.sh start 99 2 3 4 5.
se volessimo che sia avviato al riavvio e allo spegnimento
sudo update-rc.d -f myscript.sh start 90 0 6.
oppure che venga fermato al riavvio e allo spegnimento
sudo update-rc.d -f myscript.sh stop 90 0 6.
altra possibilità è inserire lo script direttamente in /etc/rcN.d ovvero in rc2.d rc3.d ... rc5.d per avviarlo alla partenza e in rc0.d rc1.d rc6.d per il reboot e shutdown chiamando il file con S per start k per stop seguito dalla priorità.

In genere su Linux sono utilizzati i seguenti livelli:

Runlevel 0 : /etc/rc.d/rc0.d Questo runlevel avvia la sequenza di arresto del sistema (shutdown)
Runlevel 1: /etc/rc.d/rc1.d Questo runlevel rappresenta la modalità singolo utente, nessun altro utente può collegarsi, il servizio di rete è disabilitato.
Runlevel 2: /etc/rc.d/rc2.d Rappresenta lo stato multiutente, il servizio rete è attivo ma è disabilitato il file sharing.
Runlevel 3: /etc/rc.d/rc3.d In genere è quello predefinito quando si opera in modalità testuale, tutti i servizi sono attivi.
Runlevel 4: /etc/rc.d/rc4.d Inutilizzato. Può essere dedicato ad usi personali
Runlevel 5: /etc/rc.d/rc5.d E' il runlevel predefinito quando si vuole avviare Linux in modalità grafica
Runlevel 6: /etc/rc.d/rc6.d Il runlevel 6 è quello di reboot.  

Lo script /etc/rc.d/rc gestisce quali processi far partire a seconda del runlevel, andando ad analizzare le singole directory /etc/rc.d/rc#.d. In queste directory esistono una serie di symlink con nomi del tipo S12syslog o K65identd che puntano a degli script con nomi tipo /etc/rc.d/init.d/syslog o /etc/rc.d/init.d/identd.
/etc/rc.d/rc a seconda della directory corrispondente al runlevel da caricare fa partire tutti gli script che iniziano con S e fa chiudere tutti quelli che iniziano con K, eseguendoli nell'ordine indicato dal numero presente nei nomi dei file.
Gli script che di fatto permettono di gestire l'avvio o lo stop di un servizio sono quindi nella directory /etc/rc.d/init.d/ e possono essere utilizzati direttamente dall'utente per gestire i singoli processi.

es: S99nomescript.sh o K99nomescript.sh

altra possibilità di avviare uno script al completo riavvio del pc e inserire il nome dello script in /etc/init.d/rc.local che viene avviato dopo il completo avvio del pc ma comunque prima del login.

un esempio di script con funzioni avanzate si trova nel file /etc/init.d/skeleton che può servire come base di partenza per script d'avvio anche complessi

per ulteriori informazioni si veda il comando man update-rc.d

giovedì 14 aprile 2011

Rimuovere la password dai progetti VBA office

Per esigenze di ufficio ho dovuto modificare vecchi database access creati da un collega che ora è andato via dopo aver scaricato una infinità di programmi in versione demo(che ovviamente non hanno funzionato) e passato (il PC non io per fortuna) giornate a provare a forzare la password ho trovato un articoletto su internet che faceva al caso mio (Come rimuovere la password per le Macro VBA da Excel) ripercorro il procedimento visto che era testato su excel.


  1. Apro il programma con un qualsiasi editor esadecimale, come nell'articolo originale io uso notepad++  con il plugin Hex editor (io uso laversione unicode)

  2. Dal menù "Plugins", selezionate "Hex Editor", quindi "View in HEX" (CTRL+ALT+SHIFT+H, se preferite le scorciatoie da tastiera)

  3. Dal menù "Cerca", selezionate "Cerca" e compilate la maschera come indicato in figura (cercate quindi "DPB" in formato Unicode)

  4. Una volta localizzata la stringa, cambiatela in "DPx" (attenzione alle maiuscole e minuscole, è importante)Salvate e chiudete l'editor

  5. Aprire il file Access poi con ALT + F11 aprire il progetto VBA e dare ok quando si presenta l'errore al database come segue (non preoccupatevi sono le nostre modifiche...)

  6. Vi verrà mostrato un "Errore imprevisto (40230)", non ve ne preoccupate e cliccate "OK" sino a che non si aprirà la maschera dell'editor VB
  7. Ora dovreste già vedere gli oggetti VBA che compongono il progetto, ma non abbiamo ancora finito. Dal menù "Strumenti" selezionate "Proprietà di Access9", scheda "Protezione" e, se selezionato, deselezionate "Proteggi progetto dalla visualizzazione" ed inserite una nuova password per proteggere il foglio. (di fatto, state forzando Access a riscrivere correttamente la sezione del file relativa alla protezione).
    Confermate premendo "OK", salvate e chiudete il Database.
  8. Ora potete riaprire il Database e, se lo reputate neccessario, eliminate la password (tornando nella maschera sopra riportata), in modo da non avere più la richiesta quando cercate di visualizzare le proprietà del progetto. 

PS: ovviamente quando sopra riportato è puramente a fini didattici o per accedere a vostri Database dei quali avete dimenticato la password o per i quali siete stati esplicitamente autorizzati dal legittimo proprietario.
Non si risponde di eventuali danni o perdite di dati dovuti all'esecuzione di quanto sopra riportato.

    martedì 22 marzo 2011

    nfs su ubuntu

    Introduzione

    NFS sta per Network File System e indica un filesystem distribuito, ovvero condiviso fra un certo numero di nodi di una rete.

    Alla base di questa tecnica c'è la necessità di accedere e lavorare sulle proprie risorse anche se non si è davanti al proprio computer.

    La delocalizzazione delle informazioni porta tuttavia con sè tutta una serie di problematiche, prima delle quali vi è la coerenza dello stato delle informazioni ed il controllo della sincronizzazione delle modifiche effettuate (poichè UNIX è un sistema operativo multiutente ad un dato istante di tempo N utenti possono tentare di accedere in scrittura ad uno stesso file).

    Installazione

    Per installare il supporto per nfs lato kernel digitare:

    sudo apt-get install nfs-kernel-server


    Configurazione di NFS lato server

    Il pacchetto necessario per il setup del servizio NFS di filesystem distribuito su Linux è nfs-kernel-server che viene gestito con i comandi da shell

    /etc/init.d/nfs-kernel-server start|stop|restart|status


    I servizi correlati con nfs sono :

    /sbin/portmap: gestibile con il comando

    /etc/init.d/portmap start | stop | restart

    /etc/init.d/nfs-common

    /etc/init.d/nfs-kernel-server


    Il file di configurazione lato server è /etc/exports la cui sintassi è della seguente forma:

    [directory da esportare] [host a cui esportarla] ([permessi])

    Un esempio è il seguente :

    /home/administrator *.pascal.org(ro) sola lettura sostituire ro con rw per lettura scrittura


    Questo dice al server NFS di permettere a tutti i client del dominio pascal.org di accedere al filesystem in /home/administrator in modalità di sola lettura.

    Il comando da usare per esaminare i fs montati è :

    showmount



    Per aumentare la sicurezza e la protezione del vostro server NFS dovrete definire la protezione servizi RPC lato server. Il file da editare è /etc/hosts.allow. Il formato di questo file è il seguente:

    Programma:hosts:permissions

    Ad esempio:

    portmap:ALL EXCEPT .org:DENY

    Nega a tutti gli hosts tranne quelli del dominio org l'accesso via RPC al file system distribuito NFS.

    Configurazione dei clients


    Il client che voglia accedere ad una risorsa NFS deve soltanto decidere come montare tale risorsa , se manualmente tramite il comando mount oppure automaticamente ad ogni avvio inserendo mount point e host nel file /etc/fstab.

    Personalmente non consiglio quest'ultima soluzione poichè anche cercando di ottimizzare si va incontro a notevoli problemi di stabilità e sicurezza dei propri sistemi.

    Come montare le risorse esportate:

    Esempio: host B vuole temporaneamente montare la directory /home/administrator condivisa da host A sul suo fs locale /media/exported.

    Il Comando su host B :

    mount -t nfs hostA:/home/administrator /media/exported




    La cartella /media/exported deve essere già creata e disponibile, come questa lo deve essere qualsiasi altra cartella che si desideri utilizzare.

    Come fare se host B vuole montare sempre al boot la directory remota condivisa da host A?

    Modificare il file /etc/fstab su hostB aggiungendo la seguente riga:

    hostA:/home/administrator /media/exported nfs ro 0 0

    martedì 1 marzo 2011

    Collegare .Net a postgresql

    Per collegare .net a Postgresql si deve aprire un nuovo progetto windows form (o terminale se si desidera).
    Scaricare Npgsql da qui e poi dopo aver estratto i file aggiungere il riferimento al file Npgsql.dll in visual studio ricordandosi di inserire
    using Npgsql;
    dopo le dichiarazioni ad inizio della parte codice della form.
    Procedere inserendo un dataGridView che noi chiameremo dataGridView1.
    Poi si vada nel codice del form in cui si vuole visualizzare i dati e si inserisca la parte di codice in grassetto(inserisco la parte completa del codice di Form1.cs),
    Ricordandosi di inserire ; all'interno della stringa alla fine di ogni coppia di valori
    Parola chiave=Valore;
    sapendo che i valori sono
    # Server - specifies the server location
    # User Id - the database user
    # Port - default is 5432
    # Password - the password for the database user
    # Database - the database name

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Npgsql;

    namespace WindowsFormsApplication1
    {
    public partial class Form1 : Form
    {

    private DataSet ds = new DataSet();
    private DataTable dt = new DataTable();

    public Form1()
    {
    InitializeComponent();
    try
    {
    //creazione stringa di connessione ricordandosi;
    string connstring = "Server=prova;";
    connstring = connstring + "Port=5432;";
    connstring += "User Id=pippo;";
    connstring += "Password=pluto;";
    connstring += "Database=test;";

    //creazione connessione con Npgsql
    NpgsqlConnection conn = new NpgsqlConnection(connstring);
    conn.Open();

    //creazione di una query sql
    string sql = "select * from coimaimp order by cod_impianto limit 100";
    //creazione dataset dalla connsessione
    NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);


    // resetto il DataSet per essere sicuro che sia vuoto
    ds.Reset();

    // riempio il DataSet con il risultato di NpgsqlDataAdapter
    da.Fill(ds);

    //Selezionamo la prima tabella dato che C# è in grado di gestire più tabelle
    dt = ds.Tables[0];

    //Collego il datagrid al DataTable per visualizzare i dati
    dataGridView1.DataSource = dt;

    //Chiudo la connessione(se non devo fare altre operazioni)
    conn.Close();

    }
    catch (Exception msg)
    {
    //Visualizzo una finestra per sapere cosa è andato storto in caso di errore
    MessageBox.Show(msg.ToString());
    throw;
    }

    }
    }
    }

    giovedì 30 luglio 2009

    disinstallare grub2 e installare grub ubuntu 9.04

    Prima di tutto scaricate una distribuzione live tipo Ubuntu 9.04 o succcessive (obbligatorio in caso di filesystem ext4) dopo aver verificato la presenza del collegamento internet eseguire quanto segue
    Code:
    sudo fdisk -l
    
    Dispositivo Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1        2496    20049088+  83  Linux
    /dev/sda2            2497        2610      915705    5  Esteso
    /dev/sda5            2497        2610      915673+  82  Linux swap / Solaris
    con questo comando si riesce a vedere su quale disco viene eseguito il boot nel nostro caso su sda1

    dopo aver verificato questo eseguire i seguenti comandi:
    Code:
    sudo mount /dev/sda1 /mnt
    sudo mount --bind /dev /mnt/dev
    sudo mount --bind /proc /mnt/proc
    sudo chroot /mnt
    apt-get purge grub2
    apt-get install grub
    Se i comandi in precedenza non creano errori si continua così:
    Code:
    mv /boot/grub/menu.lst /boot
    rm -fr /boot/grub
    grub-install /dev/sda
    update-grub
    cat /boot/grub/menu.lst
    exit
    Dopo aver lanciato update-grub alla richiesta premere "S" o "y" per creare un nuovo menu.lst, se anche questo termina correttamente si può riavviare ed il gioco è fatto.

    Reply With Quote

    giovedì 16 aprile 2009

    Macro per formule automatiche su riga

    Lo scopo di questo post è spiegare come inserire una riga di formule in vba in excel.
    questo può venire applicato per ad esempio creare una serie di righe contenenti ad esempio formule e valori ripetute per n righe secondo un criterio stabilito o proveniente dalle elaborazioni...
    le funzioni da utilizzare sono:

    • ActiveCell.Offset(rowOffset:="spostamento righe",columnOffset:="spostamento colonne").select
      questo comando serve per rendedre attiva una cella dando lo spostamento dalla corrente
    • ActiveCell.FormulaR1C1 = "=R[-1]C+1"
      questo comando serve per inserire una formula in luguaggio magro utilizzando il riferimento riga colonna per le celle
    • ActiveCell.FormulaR1C1Local = "=somma(r[1]c:r[4]c)
      questo comando a differenza del presente utilizza il linguaggio excel con i riferimenti riga colonna
    Un esempio dell'utilizzo delle precedenti formule in un foglio dove si calcola il piano di ammortamento di un mutuo.

    ActiveCell.FormulaR1C1 = "=R[-1]C+1"
    ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Select
    ActiveCell.FormulaR1C1Local = "=ASS(RATA(rc[6]/r6c2;r7c2--R[-1]C[-1];R[-1]C[5]))+RC[1]"
    ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Select
    ActiveCell.FormulaR1C1Local = "0"
    ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Select
    ActiveCell.FormulaR1C1Local = "=R[-1]C[3]*(RC[4]/R6C2)"
    ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Select
    ActiveCell.FormulaR1C1 = "=RC[4]-RC[-1]"
    ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Select
    ActiveCell.FormulaR1C1 = "=R[-1]C+RC[-1]"
    ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Select
    ActiveCell.FormulaR1C1 = "=R[-1]C-RC[-2]"
    ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Select
    ActiveCell.FormulaR1C1 = "=R[-1]C"
    ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Select
    ActiveCell.FormulaR1C1 = "=R[-1]C"

    venerdì 10 aprile 2009

    Aprire una form"figlia"

    Per aprire una form figlia per esempio da un menu il codice è il seguente:

    Dim frm As New <nome form>
    frm.MdiParent = Me
    frm.Show()

    se invece dopo la realizzazione della form si volesse inserila in un contenitore TabControl
    dopo aver impostato la proprietà FormBorderStyle dei vari form che devono essere inclusi a None si deve lavorare da codice, non con l'editor di WF... inserire nel costruttore del form che contiene il TabControl codice di questo genere:

    Dim frm As New Form3 'o come si chiama il form da inserire nella
    prima TabPage
    frm.TopLevel = False
    frm.Visible = True
    TabPage1.Controls.Add(frm) 'o come si chiama la prima TabPage
    frm = New Form4 'o come si chiama il form da inserire nella
    seconda TabPage
    frm.TopLevel = False
    frm.Visible = True
    TabPage2.Controls.Add(frm) 'o come si chiama la seconda TabPage
    'eccetera

    Eventualmente, se i form dovessero risultare più grandi delle TabPages, impostare la proprietà AutoScroll delle varie TabPages a True perché si possano scorrere.

    Creare finestre Mdi vb.net 2008

    Per creare una struttura di finestre "Padre - Figlio" innanzitutto si deve aggiungere al progetto una nuova form MDI andando su Esplora Soluzioni tasto destro sul nome del progetto selezionare aggiungi e poi Windows Form... . Nella finstra che si presenta selezionare Form Padre MDI" impostarne il nome (molto importante) e il gioco è fatto.
    Se invece la form padre fosse già stata creata impaginata, per evitare di dover rifare tutto il lavoro e sufficiente andare nelle prorietà della form e impostare a true la proprietà IsMdiContainer.

    Iniziamo questo viaggio

    Questo blog è una raccolta delle procedure informatiche relative a vari programmi che utilizzo, che raccolgo dopo ricerche in internet e forum e per potermene ricordare per un successivo utilizzo.A volte sono cose basilari ma preferisco scriverle così le ricordo...