Formattare Disco FAT32 con Mac OS X

Per gli amanti della Command Shell, eccovi il comando per poter formattare un qualsiasi disco utilizzando il File System FAT32 , ma allo stesso modo si potrebbe usare il FAT16 o addirittura il FAT12 ( basta specificare il giusto flag )

[sourcecode language=”bash”]
# newfs_msdos -F 32 /dev/disk2
[/sourcecode]

Il giorno che aspetti da molto…

Keep Calm And Study hard

Di solito, le persone normali si lasciano come ultimo esame universitario uno di quelli “semplici”. Uno di quelli con professori anzianotti, magari quasi alla pensione, che a mala pena ti ascoltano e che alla fine, qualsiasi cosa dirai, ti diranno: forse potevi fare di più, comunque può andare bene così.

Ma non noi… a noi piace soffrire fine alla fine, lo scegliamo con parsimonia tra quelli piu’ tosti. Scegliamo uno dei professori piu’ giovani dell’Ateneo, uno curioso, uno che ti chiede anche il perche’ dell’utilizzo di quel carattere invece che di un altro.

E’ inutile andare a cercare motivazioni particolari da ultimo esame…ormai ci conosciamo, non ci serviranno a nulla, e allora capita che le motivazioni dobbiamo andarle a cercare nei luoghi piu’ disparati: tra gli appunti che sbucano dalle lenzuola del letto, o gli evidenziatori aperti buttati sul divano, oppure semplicemente dal fatto che ormai sei diventato grande!. Lo devi ai tuoi genitori, lo devi a te stesso… lo devi al futuro che ti attende.

L’esame e’ uno di quelli tosti, il nome da solo incute timore: Ingegneria Del Software. Soprattutto per uno come me che predilige l’architettura dei calcolatori e si trova a suo agio cazzeggiando con i puntatori del C piuttosto che analizzare la fase di Requirements Engineering ( non chiedetemi di cosa si tratti, ancora lo devo capire).

Immagino Analisti svegliarsi al mattino e parlare con i Costumers per “elicitare” i requisiti, tavole rotonde di Developer che disquisiscono su come usare l’Integration Testing e se usare una metodologia Bottom-Up o Top-Down, miriade di persone che fanno la gara a chi effettua il Bug Report piu’ dettagliato possibile… credevo che questa gente esistesse solo nella fantasia di chi scrive questi libri, invece debbo ricredermi… di gente strana ce ne molta 😀

Alla fine ci devi trovare qualcosa di interessante, devi andare avanti… e per giunta cercando di prendere un buon voto. Un voto che potrebbe alzarti o abbassarti di un punto la tua media…questa maledetta media che ogni studente universitario ha calcolato almeno un centinaio di volte. Moltiplica il voto per i crediti, fai la media pesata ecc ecc… maledetta matematica, alla fine hai sempre ragione tu.

Un ultimo accenno devo dedicarlo al gruppo con cui ho passato il mio ultimo periodo universitario, mi hanno sopportato e supportato per molti esami :D. Da ognuno di loro ho appreso qualcosa, qualcosa che non trovi scritto nei manuali o sui libri, qualcosa che mi ha reso felice di aver fatto parte del loro gruppo…. del nostro gruppo!

Grazie ad Angela, Maddalena, Mario e Rita.

Si e’ fatto tardi, e’ ora di andare a dormire, domani e’ il giorno che aspettavo da molto…

Python: UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u20ac’

Chiunque abbia fatto un minimo di parsing HTML tramite Python, ha incontrato almeno una volta questo fatidico errore (almeno lo spero, altrimenti sono l’unico pseudo smanettone ad averlo avuto 😛 ), soprattutto se il parsing e’ stato effettuato su pagine web in cui la valuta e’ l’Euro, dato che \u20ac rappresenta il simbolo “” (dannato Euro, anche nel mondo dell’informatica ci da’ problemi).

Il problema deriva avviene quando Python cerca di codificare il simbolo  € con un carattere ASCII.

Codifica?? Uhm?? se sei confuso come me… continua a leggere 😀

Prima di continuare facciamo un piccolo ricapitolazione di “Fondamento di Informatica”…la cosa piu’ importante da sapere e’ che: l’oggetto str in Python memorizza il suo valore come bytes, cioe’ con una sequenza di 8-bit, a.k.a string. Per questo motivo ogni carattere ASCII viene codificato in 8-bit, questo vuol dire che abbiamo a disposizione 0-255 rappresentazioni diverse… ma questo non e’ sufficiente per rappresentare i caratteri Russi, Arabi, Giapponessi… ed il nostro famoso simbolo dell’euro.

Per superare questa limitazione, Python usa unicode che memorizza il carattere con 16-bit o 32-bit dandoci la possibilita’ di rappresentare qualsiasi simbolo in qualsiasi linguaggio.

Voi direste.. Evviva! basta usare l’unicode e risolvo il problema, giusto? NO, non puoi…. ci mancherebbe che il mondo dell’informatica sia cosi’ logico e “clean” 😀

In particolare, non si puo scrivere su un file usando l’unicode, perche’ il file vuole una stringa che sia rappresentata da 8-bit. Dato che Python e’ molto “smart” cerchera’ in automatico di codificare/uniformare il carattere in unicode per la scrittura su file (o qualsiasi altro stream, come la shell), ma ahime’ c’e’ un problema… vediamo meglio con un esempio.

[sourcecode language=”python”]
>>> price_info = u’the price is \u20ac 5′
>>> type(price_info)
<type ‘unicode’>
>>> f = open(‘priceinfo.txt’,’wb’)
>>> f.write(price_info)
Traceback (most recent call last):
File "", line 1, in ?
UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u20ac’ in position 9: ordinal not in range(128)
>>>
[/sourcecode]

What happened?? Quando Python cerca di scrivere nel file “the price is € 5”, egli cerca di trasformare il valore unicode ‘\u20ac‘ in un carattere ASCII ad 8-bit… ma prima abbiamo detto che ASCII non contiene il carattere in questione… per cui… mi stai seguendo?? 😀

La soluzione e’ semplice (dopo che ho passato almeno una nottata su stackoverflow 😛 ):

[sourcecode language=”python”]
>>> price_info_enc = price_info.encode(‘utf-8’) # >> price_info_enc
‘it costs \xe2\x82\xac 5’
>>> type(price_info_enc)
<type ‘str’>
>>> f.write(price_info_enc)
>>> f.close()
[/sourcecode]

Semplice!! abbiamo codificato l’unicode tramite ‘utf-8’, il quale usa una sequenza di 3 caratteri ‘\xe2\x82\xac‘ per rappresentare il simbolo dell’Euro , in questo modo possiamo passare facilmente da ‘utf-8′ ad ASCII.

Ovviamente nel caso volessimo leggere il simbolo al contrario ( cioe’ vedere sullo schermo il simbolo dell’euro) dovremmo procedere con la decodifica dei tre caratteri in ‘utf-8′ e poi effettuare il print 😉

Ma c’e’ davvero gente che legge i miei post??? Mmmm ne dubito… ma come sempre, questo post mi servira’ da qui ad una settimana, visto che la mia memoria e’ scarsa e mi capitera’ di nuovo di imbattermi in questo problema… spero almeno di ricordarmi di aver scritto qualcosa sull’argomento 😛

Xcode 4.5 and iOS6 – linker command failed with exit code 1

Dopo l’aggiornamento a Xcode 4.5 e relativo iOS6 ho riscontrato il seguente problema quando andavo a provare la mia applicazione sul mio device (iPhone 3GS).

[sourcecode language=”bash”]

Ld /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Intermediates/DingUnisannio.build/Debug-iphoneos/DingUnisannio.build/Objects-normal/armv7/Unisannio normal armv7
cd /Users/unicondor/Documents/iosingunisannio-code/DingUnisannio
setenv IPHONEOS_DEPLOYMENT_TARGET 5.0
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk -L/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos -L/Users/unicondor/Documents/iosingunisannio-code/DingUnisannio -F/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos -filelist /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Intermediates/DingUnisannio.build/Debug-iphoneos/DingUnisannio.build/Objects-normal/armv7/Unisannio.LinkFileList -dead_strip -ObjC -fobjc-arc -fobjc-link-runtime -miphoneos-version-min=5.0 /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libTapkuLibrary.a /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libfmdb.a /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libMGSplitViewController.a /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libMWFeedParser.a -framework QuartzCore -framework Foundation -framework UIKit -framework CoreGraphics -framework MapKit -framework MessageUI -framework MediaPlayer -framework AVFoundation -framework SystemConfiguration -framework AddressBook -framework CoreLocation -framework AddressBookUI -lxml2 -lsqlite3.0 -framework CFNetwork -framework Security -framework AudioToolbox -o /Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Intermediates/DingUnisannio.build/Debug-iphoneos/DingUnisannio.build/Objects-normal/armv7/Unisannio

Error:

clang: error: no such file or directory: ‘/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libTapkuLibrary.a’
clang: error: no such file or directory: ‘/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libfmdb.a’
clang: error: no such file or directory: ‘/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libMGSplitViewController.a’
clang: error: no such file or directory: ‘/Users/unicondor/Library/Developer/Xcode/DerivedData/DingUnisannio-czbgknwdwtdvjzfalsaqpvwuqqul/Build/Products/Debug-iphoneos/libMWFeedParser.a’

[/sourcecode]

Il problema e’ dovuto al fatto che le librerie esterne che ho usato nella mia App erano compilate solo per l’architettura armv7 e armv6. Con l’avvento dell’iPhone5 e del suo nuovo processore (armv7s) bisogna ricompilarle anche per la nuova architettura, per questo bisogna modificare il “Targets” associato ad ognuno di essere ed aggiungere l’architecture armv7s

Come viene mostrato nello screenshot in alto, bisogna solamente aggiungere questo nuovo tipo di processore armv7s in “Architettures” e “Valid Architettures” e ricompilare tutto il progetto da capo (cosi’ per tutte le librerie esterne usate dalla nostra app).

Un’ altra soluzione potrebbe essere quella di eliminare armv7s dalla “Valid Architecture” del nostro progetto, ma cosi’ facendo precludiamo la possibilita’ di poter utilizzare la nostra App sui nuovi iphone5 rilasciati da Cupertino.

Finally… iOS Developer Program Member

Rompo il letargo in cui mi ero immerso (un po’ per pigrizia un po’ per il poco tempo a disposizione) per scrivere un post che avrei dovuto scrivere da molto tempo. Finalmente mi sono iscritto all’ iOS Developer Program ( sviluppo applicazioni per iPhone/iPod/iPad).

Erano anni ( il primo libro sullo sviluppo di App iPhone lo comprai nel 2010) che volevo iniziare a sviluppare applicazione per dispositivi mobili, ma qualcosa me lo ha sempre impedito. In una cartella ho ancora la mia prima applicazione di prova: KamaTest, una semplice applicazione che in base all’immagine raffigurate una posizione del Kamasutra bisognava indovinare il numero ad essa associata 😛

Vabbe’ dubito sarebbe mai stata accettata dalla Apple, anche se le immagini che avevo scelto erano molto ‘pudiche’ grazie all’utilizzo di palloncini…

era pur sempre un ottimo inizio per iniziare a masticare un po’ di Objective-C, UIKit, Cocoa ecc… ma soprattutto per imparare qualche posizione nuova nella speranza remota che un giorno mi sarebbe tornato utile lo sforzo di memorizzazione 😀

Devo ammettere che il primo approccio verso un linguaggio di programmazione a messaggi non e’ stato un entangled  dato che ero abituato a linguaggi procedurali come il C o a linguaggi ad oggetti come Java, per cui passare dalla creazione di un oggetto like-Java: Object o = new Object() ad uno Objective-C: Object *o = [[ Object alloc] init] mi sembrava qualcosa di astruso 😛

Superate le prime avversità e grazie al PartTime ed al mio capo ( caro Ingegnere ho una menzione particolare per lei :D) ho iniziato a sviluppare seriamente un paio di App (spero presto siano pronte) sacrificando la maggior parte dell’estate.

Ho creato una Category iOS sul blog, spero di poterla riempire presto con qualche consiglio su come utilizzare certi componenti e sulle metodologie ( Pattern MVC) di programmazione da usare per lo sviluppo su Xcode.

Vi auguro una buona giornata/serata nella speranza di ritornare a scrivere con una cadenza maggiore e con più parsimonia 😀

P.s. sono interessato all’acquisto di un iPhone 3GS, l’emulatore non mi soddisfa più 😛 per cui non esitate a contattarmi nel caso vogliate venderne uno

Quanta banda richiede la visualizzazione di un video su YouTube?

E’ la classica domanda che si pone chi:

1) Ha una tariffazione a KB per navigare con il proprio cellulare

2) Sfigati che come me fanno parte dell’ Anti Digital Divide (ADSL a 640 Kbps), e si chiedono il perche’ non riescono a vedere un video a 360p su YouTube senza aspettare la bufferrizzazione dei pacchetti, che tradotto sarebbe il caricamento del video 😀 .

Partiamo andando a leggere le specifiche che ci mette direttamente a disposizione Google

Risoluzione:

YouTube usa un aspect ratio standard a 16:9, con le principali risoluzione video a:

  • 1080p: 1920×1080
  • 720p: 1280×720
  • 480p: 854×480
  • 360p: 640×360
  • 240p: 426×240
Con un fps ( frame per second) pari a 24/30, dove fps rappresenta il numero di frame (immagini) per secondo
Comparison of YouTube media encoding options
Default container FLV MP4
Video Encoding Sorenson H.263 MPEG-4 AVC (H.264)
Profile Main Baseline High
Resolution progressive 240p 270p 360p 480p 360p 720p 1080p 3072p
Resolution VGA WQVGA HVGA nHD FWVGA nHD WXGA WUXGA HXGA
Max width (pixels) 400 480 640 854 640 1280 1920 4096
Max height (pixels) 240 270 360 480 360 720 1080 3072
Bitrate[2] (Mbit/s) 0.25 0.8 0.5 0.8–1 0.5 2–2.9 3–4.3 3.5–5
Audio Encoding MP3 AAC
Channels 1–2 2 (stereo)
Sampling rate (Hz) 22050 44100
Bitrate[2] (kbit/s) 64 128 96 152 128

Questa tabella presa da Wikipedia riassume le varie risoluzioni e i relativi dettagli per ogni configurazione ( compresa la banda che a noi interessa), vediamo assieme come interpretare i numeri  per la risoluzione a 360p.

Video:

Encoding: MPEG-4 AVC (H.264) è il codec usato per la compressione del video ( vedremo più avanti a cosa serve)

Resolution: 360p è la risoluzione del video

Max width (pixel): 640 sono i pixel in larghezza del video

Max height(pixel): 360 sono i pixel in altezza del video

Bitrate (Mbit/s): 0.5 è il parametro che mi interessava, in poche parole dice che per visualizzare correttamente ( senza bufferrizzare ) il video abbiamo bisogno di almeno di una banda pari a 500 Kbps ( la mia ADSL è di poco superiore)

Audio:

Encoding: AAC è il codec audio usato

Channels: 2(stereo)  abbiamo la registrazione a due canali (stereo)

Sampling rate (Hz): 44100 è il rate usato per il campionamento dell’audio

Bitrate (kbit/s): 128 è la banda utilizzata dalla sola traccia audio.

Calcolo Bitrate (Datarate)

Con il termine Bitrate si intende il numero di kilobits per secondi (kbps) che dobbiamo trasferire/ricevere per vedere un video. Più il valore è alto, più la qualità del video migliora.

La formula per il calcolo del Bitrate è molto semplice:

Total Bitrate (bps) = altezza del frame (pixel)  x  profondità del frame (pixel)  x  frame rate (fps)  x  numero di bit per rappresentare un pixel

Nel nostro caso avremo

Bitrate(360p)= 360 x 640 x 24 x 4 = 22118400 (bps)   che sarebbero all’incirca 22 Mbps

Ma non avevamo detto che il Bitrate per la 360p era di appena 0.5 Mbps ??

Ed ecco che entra in gioco il codec che abbiamo citato prima: MPEG-4 AVC (H.264), il numero che è uscito fuori dalla formula precedente si riferisce al video “un-compressed”.

Tramite il codec MPEG-4 ( tra i migliori in circolazione) abbiamo un Compression Ratio 50:1, significa che il fattore di compressione farà si che il Bitrate uncompressed venga diviso per 50.

Per tale motivo il Bitrate del video compresso sarà uguale a:

BitRate Video Compressed = Bitrate Uncompressed / Compression Ratio MPEG-4   —>  Bitrate Compressed = 22 Mbps / 50 = 0.44 Mbps

Perfetto! ora ci troviamo con il valore in tabella 😉

Spero di aver fatto un pò di chiarezza su come calcolare il Bitrate di una sorgente Video e di come leggere correttamente i dato che ci mettono a disposizione i vari siti di Hosting Video.

Sperando che presto… anche i nostri piccoli comuni vengano raggiunti da una connessione semi-decente 🙁

Riferimenti:

http://en.wikipedia.org/wiki/YouTube

http://adterrasperaspera.com/blog/2010/05/24/approximate-youtube-bitrates

http://blog.jimmyr.com/High_Quality_on_Youtube_11_2008.php

http://neuron2.net/LVG/ratesandsizes.html

http://support.google.com/richmedia/bin/answer.py?hl=en&answer=2462489

http://www.kanecomputing.co.uk/pdfs/compression_ratio_rules_of_thumb.pdf

Tesi “La Desktop Virtualization: studio delle caratteristiche e delle sue concrete potenzialità”

Come neofita di questo blog vi allego la mia tesi appena discussa che ha il compito di illustrare questa nuova, ma non troppo, tecnologia che consente di contenere i costi nel settore IT e di garantire flessibilità nell’utilizzo worldwide (grazie al cloud) del proprio sistema operativo con dati annessi.

Se non volete entrare nel puro mondo della virtualizzazione vi consiglio di passare subito al secondo capitolo.

Pubblico la tesi urbi et orbi nella speranza di attrarre l’interesse di qualcuno (poco ci credo 🙂 ) o aiutare chi già è a conoscenza della tecnologia a comprendere meglio lo stato d’arte della tecnologia.

Ecco il pdf: La Desktop Virtualization: studio delle caratteristiche e delle sue concrete potenzialità

Riporto qui l’indice:

Sommario

Introduzione

1.     CAPITOLO     “Overview sulla Virtualizzazione di Sistemi Operativi”

1.1.       Panoramica generale

2.1.       Il Ruolo dell’Hypervisor

3.1.       Hardware Virtualization

1.3.1.  Vantaggi della Virtualizzazione

1.3.2.  Tipologie

2.     CAPITOLO     “Studio della tecnologia VDI”

2.1.       Analisi della Virtual Desktop Infrastructure

2.2.       Storia e stato dell’arte

2.3.       Vantaggi e svantaggi

3.     CAPITOLO     “Piattaforme a supporto della Desktop Virtualization”

3.1.       VmWare vSphere

3.2.       Citrix XenServer

3.3.       Microsoft Hyper-V

3.4.       Panoramica riepilogativa

4.          Conclusioni

Appendice A     “White paper Georgia State University”

Bibliografia

 

Non mi resta che augurarvi (ottimisticamente) buona lettura!

Oracle: Creazione di un Database Link e di un Synonyms

Uno dei motivi per cui ho iniziato ad interessarmi al Database sviluppato da Oracle, è la sua semplicità nell’accesso agli schemi ed alle tabelle su sistemi distribuiti.

Vediamo subito un immagine che spero ci chiarirà subito lo scopo di questo articolo ( almeno spero :P).

Supponiamo di avere due database Oracle 11g, chiamati nel mio caso ( mi riferisco all’hostname ):

  1. oracle_dbschool
  2. oracle_db1
Lo scopo è quello di fare una partizione funzionale del database ( come potete vedere dal diagramma E-R), cioè suddividere le mie tabelle su due database fisici distinti in modo da ripartire il carico computazionale. Vi rimando al mio primo articolo sulla creazione manuale di un Database Oracle nel caso ne aveste bisogno.
Su oracle_dbschool avrò le tabelle: “utente”, “familiare”, “insegnamento” e “partecipazione”
Su oracle_db1 avrò solamente la tabella “bacheca”
Lo scopo del Database Link e della Synonyms è quello di rendere trasparente l’accesso alla tabella “bacheca” da parte di un utente che ha accesso solo al database oracle_dbschool ( database Master)
Dalla figura spero che lo scopo dell’articolo sia più chiaro, l’utente flavio ha accesso solo a oracle_dbschool, e da esso accede alla tabella “bacheca” che in realtà è  presente su un altro database oracle, il tutto avviene in modo trasparente rispetto all’utente, in quanto viene nascosto dal nodo Master ( oracle_dbschool ) il fatto che la tabella è distribuita.
Dopo questo piccolo preambolo vediamo i vari passi che ho eseguito per far si che la cosa funzionasse… decentemente 😀

I) Modifica di tnsnames.ora

Per prima cosa dobbiamo specificare gli hostname e gli indirizzi IP a loro associati, in modo tale da permettere loro di comunicare. Il file che andremo a modificare su entrambi i database è chiamato tnsnames.ora ed è possibile trovarlo nell path:  $ORACLE_HOME/network/admin

In oracle_dbschool:

[sourcecode language=”bash”]

unicondor@oracle_dbschool:~$ cat $ORACLE_HOME/network/admin/tnsnames.ora

REMOTE_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.103)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = db1)
)
)
[/sourcecode]

in questo caso ho specificato su oracle_dbschool che oracle_db1 ha un Database di nome db1 all’indirizzo 192.168.1.103 ed è in ascolto sulla porta 1521.

II) Creazione del Database Link

Il Database Link e’ un mezzo molto potente che Oracle ci mette a disposizione per accedere/inserire/cancellare  un oggetto su un altro database, per di piu’ tale database non deve per forza essere Oracle ma puo’ essere qualsiasi altro database ( Ex. mysql ).

Tramite l’utility sqlplus su oracle_dbschool

[sourcecode language=”bash”]
SQL> create public database link remote_db connect to flavio identified by flavio using ‘remote_db’;
Database link created.
[/sourcecode]

grazie a questo semplice comando, stiamo dicendo al nostro database (oracle_dbschool) di creare un link simbolico ad oracle_db1, e tale link sara’ chiamato “remote_db”.

ora potremmo effettuare le query sulle tabelle di oracle_db1 direttamente da oracle_dbschool . Supposto che tu oracle_db1 abbiamo una tabella di nome “t1″:

In oracle_dbschool:

[sourcecode language=”bash”]
SQL> select * from t1@remote_db;

A
———-
3
1
2
[/sourcecode]

III) Creazione di un Synonyms

Potremmo fermarci anche a questo punto, ma essendo dei cinici possiamo spingerci oltre ed usare anche i Synonyms 😛

Lo scopo dei Synonyms e’ quello di usare un nome alternativo per l’accesso a tabelle, schemi ecc.. che possono risiedere anche su database remote ( come nel nostro caso).

In oracle_dbschool:

[sourcecode language=”bash”]
SQL> create public synonym t1 for t1@remote_db;

Synonym created.

[/sourcecode]

Abbiamo creato un alias chiamato “t1” per la tabella “t1” che era presente sul database remoto oracle_db1 e che in precedenza abbiamo creato un Database Link chiamato “remote_db“. Spero sia tutto chiaro… nonostante la mia intrinseca mal predisposizione all’italiano 😛

Tramite il Synonyms possiamo eseguire la query della tabella t1 come se fosse fisicamente presente sul database oracle_dbschool ( in realta’ e’ presente solo su oracle_db1).

Esempio su oracle_dbschool:

[sourcecode language=”bash”]
SQL> select * from t1;

A
———-
3
1
2

SQL> insert into t1 values(30);
SQL> commit;

[/sourcecode]

In questo caso, dopo aver fatto una select, abbiamo effettuato anche un inserimento nella tabella.. il tutto come se fosse fisicamente presente nel Db.
Per gli approfondimenti, vi rimando alle guide ufficiali che potete trovare sul sito di Oracle che sono molto piu’ complete e chiare dei miei articoli 😀

Solving Problem Installing xen-4.1.2 on CentOS-6.2

Little Tips and Tricks while installing ( make world ) xen-4.1.2 on CentOS-6.2

Problem

[sourcecode language=”bash”]
Checking check_uuid_devel:
*** check_uuid_devel FAILED: missing uuid headers (package uuid-dev)
Checking check_x11_devel: OK
Checking check_xgettext: OK
Checking check_xml2: unused, OK
Checking check_zlib_devel: OK
Checking check_zlib_lib: OK

[/sourcecode]

Solution

[sourcecode language=”bash”]
# yum install libuuid-devel
[/sourcecode]

Problem

[sourcecode language=”bash”]
make[3]: Entering directory `/home/ashwin/Project_21_12_2010/xen-4.0.1/tools/firmware’Require dev86 rpm or bin86 & bcc debs version >= 0.16.14 to build firmware!
(visit <a href="http://www.debath.co.uk/dev86/" target="_blank">http://www.debath.co.uk/dev86/</a> for more information)

make[3]: *** [all] Error 1
[/sourcecode]

Solution

[sourcecode language=”bash”]
# yum install dev86
[/sourcecode]

Problem

[sourcecode language=”bash”]
ACPI ASL compiler (iasl) is needed
Download and install Intel ACPI CA from
http://acpica.org/downloads/

make[9]: *** [iasl] Error 1
make[9]: Leaving directory `/home/unicondor/Tesi/xen-4.1.2/tools/firmware/hvmloader/acpi’
make[8]: *** [subdir-all-acpi] Error 2
make[8]: Leaving directory `/home/unicondor/Tesi/xen-4.1.2/tools/firmware/hvmloader’
make[7]: *** [subdirs-all] Error 2
make[7]: Leaving directory `/home/unicondor/Tesi/xen-4.1.2/tools/firmware/hvmloader’
make[6]: *** [subdir-all-hvmloader] Error 2
make[6]: Leaving directory `/home/unicondor/Tesi/xen-4.1.2/tools/firmware’
make[5]: *** [subdirs-all] Error 2
make[5]: Leaving directory `/home/unicondor/Tesi/xen-4.1.2/tools/firmware’
make[4]: *** [all] Error 2
make[4]: Leaving directory `/home/unicondor/Tesi/xen-4.1.2/tools/firmware’
make[3]: *** [subdir-install-firmware] Error 2
make[3]: Leaving directory `/home/unicondor/Tesi/xen-4.1.2/tools’
make[2]: *** [subdirs-install] Error 2
make[2]: Leaving directory `/home/unicondor/Tesi/xen-4.1.2/tools’
make[1]: *** [install-tools] Error 2
make[1]: Leaving directory `/home/unicondor/Tesi/xen-4.1.2′
make: *** [world] Error 2
[/sourcecode]

Solution

[sourcecode language=”bash”]
# wget http://acpica.org/download/acpica-unix-20120320.tar.gz
# tar -zxvf acpica-unix-20120320.tar.gz
# cd acpica-unix-20120320/source/compiler/
# make
# make install
[/sourcecode]

Problem

[sourcecode language=”bash”]
xen/lowlevel/xc/xc.c:7:20: error: Python.h: No such file or directory
xen/lowlevel/xc/xc.c:39: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
xen/lowlevel/xc/xc.c:42: error: expected specifier-qualifier-list before ‘PyObject_HEAD’
xen/lowlevel/xc/xc.c:47: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
xen/lowlevel/xc/xc.c:50: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
xen/lowlevel/xc/xc.c:89: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
xen/lowlevel/xc/xc.c:107: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
xen/lowlevel/xc/xc.c:155: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
xen/lowlevel/xc/xc.c:169: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
[/sourcecode]

Solution

[sourcecode language=”bash”]
# yum install python-devel
[/sourcecode]

Problem

[sourcecode language=”bash”]
WARNING: `makeinfo’ is missing on your system. You should only need it if
you modified a `.texi’ or `.texinfo’ file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy `make’ (AIX,
DU, IRIX). You might want to install the `Texinfo’ package or
the `GNU make’ package. Grab either from any GNU archive site.
[/sourcecode]

Solution

[sourcecode language=”bash”]
# yum install texinfo
[/sourcecode]

Personalizzare Asterisk Web Manager con i Log Custom di Asterisk

Dopo aver visto come automatizzare il logratate dei file di log di Asterisk, passiamo alla visualizzazione dei file di Log ( cdr-custom)  Custom,  che Asterisk ci mette a disposizione, tramite l’interfaccia web di Asterisk WEB/PHP Management Interface.

Step I

Per prima cosa dobbiamo abilitare il Mappings del custom config file editando il seguente file: /etc/asterisk/cdr_custom.conf

il quale creera’ il file /var/log/asterisk/cdr-custom/Master.cvs con i campi che a noi interessano.

cdr_custom.conf

[sourcecode language=”bash”]

unicondor@server:~$ cat /etc/asterisk/cdr_custom.conf
;
; Mappings for custom config file
;
; To get your CSV output in a format tailored to your liking, uncomment the
; following lines and look for the output in the cdr-custom directory (usually
; in /var/log/asterisk). Depending on which mapping you uncomment, you may see
; Master.csv, Simple.csv, or both.
;
[mappings]
Master.csv =>${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(duration)})},${CSV_QUOTE(${CDR(disposition)})},${CDR(sequence)},${CVS_QUOTE(${CDR(start)})}

[/sourcecode]

La modifica del file riporato il alto servirà a creare un file di log customizzato per le nostre neccessità. Il path ( installazione di default di Asterisk ) dove potete trovare il file è il seguente:

/var/log/asterisk/cdr-custom/Master.csv

Al seguente indirizzo potete trovare le info riguardanti i campi che ho usato per creare il mio file di Log Custom
Ora non ci resta altro che effettuare un bel reload dalla console di Asterisk per fargli vedere le modifiche

[sourcecode language=”bash”]

server*CLI> realod

[/sourcecode]

Step II

Fatto questo, andiamo a modificare il file logs.php che si trova nella directory web del WEB/PHP Management Interface, aggiungendo la voce che riguarda il file di log appena creato

[sourcecode language=”php”]
[rot@server asterisk]# cat /var/www/html/asterisk/logs.php
<?php <br ?>
if (isset($_POST[‘radio’])) {
if ($_POST[‘radio’] == "cdrformat") {
if (isset($_POST[‘pattern’])) $pattern = $_POST[‘pattern’];
header("Location: cdr.php?pattern=$pattern");
// header("Location: http://$_SERVER/asterisk/cdr.php?pattern=$pattern");
}
}

if (isset($_POST[‘radio’])) {
if ($_POST[‘radio’] == "cdrformat_custom") {
if (isset($_POST[‘pattern’])) $pattern = $_POST[‘pattern’];
header("Location: cdr_custom.php?pattern=$pattern");
// header("Location: http://$_SERVER/asterisk/cdr.php?pattern=$pattern");
}
}

include(‘header.php’);
include(‘files.php’);
include(‘functions.php’);

if (isset($_POST[‘submit’])) {
$submit = $_POST[‘submit’];
if (isset($_POST[‘loglines’])) $loglines = $_POST[‘loglines’];
else $loglines = 0;
if (isset($_POST[‘pattern’])) $pattern = $_POST[‘pattern’];
else $pattern = "";
if (isset($_POST[‘radio’])) $radio = $_POST[‘radio’];
if ($submit =="SUBMIT") {
if ($pattern != "") $cmd = "/bin/grep $pattern ";
else {
if ($loglines == 0) $cmd = "/bin/cat ";
else $cmd = "/usr/bin/tail -$loglines ";
}
if ($radio == "syslog") $cmd .= $SYSTEMMESSAGES;
if ($radio == "cdr") $cmd .= $CDRMASTER;
if ($radio == "events") $cmd .= $ASTEVENTLOG;
if ($radio == "messages") $cmd .= $ASTMESSAGESLOG;
if ($radio == "queue") $cmd .= $ASTQUEUELOG;
echo "
";
mysystem($cmd);
echo "
";
echo "
";
echo $cmd;
echo "
";
echo "Done !";
}
}
else
{
?></pre>
<div align="center"><form action="<?php echo $_SERVER[‘PHP_SELF’]; ?><br />" method="post">
<table>
<tbody>
<tr>
<td>Search String <input type="text" name="pattern" /></td>
<td>
Lines to List [0=All] <input type="text" name="loglines" value="50" /></td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td><input type="radio" name="radio" value="events" /> Asterisk Event Log</td>
<td> </td>
</tr>
<tr>
<td><input type="radio" name="radio" value="messages" /> Asterisk Message Log</td>
<td> </td>
</tr>
<tr>
<td><input type="radio" name="radio" value="queue" /> Asterisk Queue Log</td>
<td> </td>
</tr>
<tr>
<td><input type="radio" name="radio" value="cdr" /> Asterisk CDR Log</td>
<td> </td>
</tr>
<tr>
<td><input type="radio" name="radio" value="cdrformat" /> Asterisk CDR Log [Table Formatted]</td>
<td> </td>
</tr>
<tr>
<td><input type="radio" name="radio" value="cdrformat_custom" checked="checked" /> Asterisk CDR ***Custom*** Log [Table Formatted]</td>
<td> </td>
</tr>
<tr>
<td><input type="radio" name="radio" value="syslog" /> System Log [SYSLOG]</td>
<td> </td>
</tr>
</tbody>
</table>
<input type="submit" name="submit" value="SUBMIT" />

<input type="reset" name="reset" value="RESET" /></form></div>
<pre>
<?php } ?>

[/sourcecode]

Ora non ci resta altro che andare a creare la pagina php cdr_custom.php , responsabile della lettura del file log custom di Asterisk e la sua stampa in una tabella html

[sourcecode language=”php”]

[unicondor@server asterisk]$ cat /var/www/html/asterisk/cdr_custom.php
<?PHP <br ?>/* Modified by Flavio Pace
*/
include("header.php");
include("files.php");

//Fields of the CDR in Asterisk
//—————————–
//
// 1. accountcode: What account number to use, (string, 20 characters)
// 2. src: Caller*ID number (string, 80 characters)
// 3. dst: Destination extension (string, 80 characters)
// 4. dcontext: Destination context (string, 80 characters)
// 5. clid: Caller*ID with text (80 characters)
// 6. channel: Channel used (80 characters)
// 7. dstchannel: Destination channel if appropriate (80 characters)
// 8. lastapp: Last application if appropriate (80 characters)
// 9. lastdata: Last application data (arguments) (80 characters)
// 10. start: Start of call (date/time)
// 11. answer: Answer of call (date/time)
// 12. end: End of call (date/time)
// 13. duration: Total time in system, in seconds (integer), from dial to hangup
// 14. billsec: Total time call is up, in seconds (integer), from answer to hangup
// 15. disposition: What happened to the call: ANSWERED, NO ANSWER, BUSY
// 16. amaflags: What flags to use: DOCUMENTATION, BILL, IGNORE etc,
// specified on a per channel basis like accountcode.
// 17. user field: A user-defined field, maximum 255 characters

if (isset($_GET[‘pattern’])) $pattern = $_GET[‘pattern’];
else $pattern = "";

$fname = $CDRCUSTOM;
$fd = fopen ($fname, "r");
if (!$fd) {
echo "Error opening $fname";
exit(0);
}
echo "</pre>
<table border="1" align="center">";echo "
<tbody>
<tr>";echo "
<th>Src</th>
";echo "
<th>Dst</th>
";echo "
<th>Duration</th>
";echo "
<th>Disposition</th>
";echo "
<th>User Field</th>
";echo "
<th>Start</th>
";echo "</tr>
";$limit = 0;$d = 0;while (!feof ($fd)) { $buffer = fgets($fd, 4096); $l = trim($buffer); if ($pattern != "") { if (!strstr($l,$pattern)) continue; } $badcommapat = ‘/\"[^\"]+,[^\",]+\"/’; if (preg_match($badcommapat,$l,$matches)) { $fixcomma = str_replace(",","-",$matches[0]); $l = str_replace($matches[0],$fixcomma,$l); } $e = explode(",",$l); $len = sizeof($e); echo "
<tr>"; for ($c=0;$c echo "
<td nowrap="nowrap">";
$e[$c] = trim($e[$c],"\r\n \"");
if ($c == 4) $e[$c] = str_replace ("\"", "", $e[$c]);
if ($e[$c] == "") echo " ";
else echo htmlspecialchars($e[$c]);
echo "</td>
"; }while ($c < 6) { echo "
<td> </td>
"; ++$c; } echo "</tr>
\n"; flush(); ++$d; if ($limit != 0) { if ($d >= $limit) break; }}echo "</tbody>
</table>
<pre>
";
fclose ($fd);
?>

[/sourcecode]

Alcuni Screenshot dell’interfaccia grafica customizzata