Pillola Oracle

logo-oracle-large

Oggi la pillola parla di Oracle.

Più volte mi sono trovato a gestire errori Oracle che hanno origini diverse.

In questo sito ho trovato quasi tutti i casi a cui mi sono trovato di fronte. In questo caso però affrontiamo solo l’aspetto fondamentale del collegamento tra un client e un server.

Caso d’uso

La situazione è raffigurata qui di seguito, un client Oracle (C) cerca di collegarsi ad un server Oracle (S):

Oracle: collegamento client-server
Oracle: collegamento client-server

In realtà più che due macchine fisiche, client e server sono due processi che possono anche coesistere nella stessa macchina.

Quando il client chiama il server, viene eseguita una serie di operazioni: devono infatti essere instradati da TCP/IP dei pacchetti di informazioni; occorre stabilire qual è l’host da chiamare, qual è il nome del servizio in ascolto e della porta in cui è in ascolto.

Il descrittore TNS

Queste informazioni sono contenute in architetture diverse: può essere un LDAP, un servizio Oracle di risoluzione dei nomi (Oracle Names Server) oppure, nel caso più semplice, un file che risiede in un filesystem accessibile dalla macchina in cui viene eseguito il client. Questo file si chiama tnsnames.ora ed è un elenco di descrittori simili a quello che segue:

ora_descriptor_name =
(DESCRIPTION =
    (ADDRESS_LIST =
        (ADDRESS = 
            (PROTOCOL = TCP)(HOST = ora_host_name)(PORT = 1521)
        )
    )
    (CONNECT_DATA =
        (SERVICE_NAME = ora_service_name)
    )
)

I parametri fondamentali sono

  • il nome del descrittore (ora_descriptor_name) che è quello che sarà utilizzato dal programma che vuole effettuare la chiamata (ad esempio sqlplus, oppure un programma PHP o Java)
  • il nome dell’host (ora_host_name) che ospita il server (il nome ora_service_name deve essere presente nel file /etc/hosts della macchina che ospita il client, oppure deve esistere un nome DNS nella rete a cui accede il client)
  • la porta (1521)
  • il nome del servizio in ascolto nel server (ora_service_name)

I nomi ora_descriptor_name, ora_host_name, ora_service_name sono nella realtà dei nomi di fantasia (pur secondo un determinato schema di nomi) che possono essere dati a macchine e servizi; ad esempio

  • ora_descriptor_name = alberghi.mydomain.com
  • ora_host_name = oracle1.mydomain.com
  • ora_service_name = alberghi

Errori che possono accadere

1) non c’è una voce ora_descriptor_name nel tnsnames.ora

    => “ORA-12154: TNS:could not resolve the connect identifier specified”

2) c’è la voce MA ora_host_name non c’è nel dns né nel file etc/hosts

    => “ORA-12545: Connect failed because target host or object does not exist”

3) c’è la voce, c’è ora_host_name in /etc/hosts MA punta ad un ip inesistente

    => “ORA-12545: Connect failed because target host or object does not exist”

4) c’è la voce, c’è ora_host_name, l’IP è corretto MA lato server non c’è un listener in ascolto

    => “ORA-12541: TNS:no listener”

5) c’è la voce, c’è ora_host_name, IP corretto, listener in ascolto MA in una porta diversa dalla 1521

    => “ORA-12560: TNS:protocol adapter error”

6) c’è la voce, c’è ora_host_name, IP corretto, listener in ascolto sulla porta giusta MA non esiste ora_service_name

    => “ORA-12514: TNS:listener does not currently know of service requested in connect descriptor”


Analisi di log con Elasticsearch “Kibana”

Sto prendendo un po’ di confidenza con questo sistema di analisi di file log che sembra molto potente e flessibile.

Nello specifico, la pillola di oggi consiste nello scrivere un filtro per data che estragga tutti i record da una certa data in poi.

La linea di log ha un aspetto simile:

{"ID":"9ec1468a-c200-469f-8586-31e30b0043fb","sequence_id":"10942701","source":null,"type":"result",
"@timestamp":"2015-02-13T11:36:29.218Z","status":"ERROR","raw_data":"<result>...

Quello che voglio fare è applicare il filtro sul campo @timestamp quindi dalla lista in basso a sx:

kibana1

Successivamente occorre personalizzare il filtro come nella figura seguente (usare le parentesi quadre se si vogliono includere gli estremo di ricerca, cioè >= o <=, le graffe nel caso NON si vogliano includere, cioè > o <):

kibana2

In questo caso, per esempio, seleziono tutte le righe di log dal 2 febbraio 2015 (giorno incluso) in poi.

Yii pillole

yiiContinuiamo la nostra serie di pillole su piccoli ma spesso fastidiosi task, questa volta sul gestore di design pattern Yii. Come realizzare un menu a tendina, o combo box, o casella di selezione o dropdown menu con Yii, prendendo i valori da una tabella di un database.

In sostanza ciò che vogliamo realizzare è una cosa del genere:

dropdownIl dettaglio delle operazioni da fare è nel Wiki.

Bluefish: come salvare i parametri di configurazione

800px-PHP-n_logo PNGUso Bluefish editor per scrivere codice PHP/JavaScript e HTML.

Consente anche di gestire progetti un po’ come fa Eclipse, ma lo uso sostanzialmente come editor.

Da un po’ di tempo avevo questo comportamento fastidioso: impostavo come carattere di default dell’editor un Monospace 9pt

 

(Modifica > Preferenze > Caratteri e colori > caratteri dell’editor)

ma dopo che avevo chiuso il programma, alla prossima riapertura mi ritrovavo il font a 10pt.

Evidentemente non riuscivo a scrivere nel file di configurazione.

Lanciando da consolle bluefish infatti avevo questo output:

 marcob@jsbach:~/.bluefish$ bluefish
 error reading list 1 Errore nell'aprire il file: File o directory non esistente
 
 ** (bluefish:4731): WARNING **: no configfile rcfile-2.0, try to convert config 
 files from older versions
 
 config file migration error 1:Errore nell'aprire il file: File o directory non esistente
 error reading list 1 Errore nell'aprire il file: File o directory non esistente
 cleanup_scanner, memory scancache 0(0Kb+0Kb) found 0(0Kb) fcontext 0(0Kb) = 0Kb
 error reading list 14 Errore nell'aprire il file: Permesso negato
 
 ** (bluefish:4731): WARNING **: failed to delete recovered autosave_journal /home/marcob/.bluefish/autosave_journal.32486: Errore nel rimuovere il file: Permesso negato

I problemi erano due (no config file e failed to delete) ma la causa comune era nella ownership della cartella ~/.bluefish, che era di root e scrivibile solo da lui. Quindi è stato sufficiente far acquisire all’utente “normale” la proprietà della cartella:

  $ sudo chown -R marcob:marcob .bluefish/

 

Design patterns

Webtreats Free Tileable Tropical Abstract Patterns Part 1-5Ho raccolto e organizzato un po’ di materiale per studiare una prassi progettuale, quella degli schemi architetturali (design patterns), ormai consolidata (a partire dagli anni ’70) nell’ingegneria del software.

Durante la mia visita da osservatore al CERN nell’estate 1991, il prof. Morando, mentre ci guidava in una visita al progetto ALEPH, mi disse “Il software di solito ce lo scriviamo da soli, noi fisici, ma è scritto così male che quando lo diamo in mano agli ingegneri questi si mettono le mani nei capelli”.

Ecco, i design patterns sono gli strumenti che evitano di metterci le mani nei capelli quando dobbiamo far funzionare un software.

Link al Wiki

Installazione di Oracle 11g su Ubuntu 14.04 su macchina 64 bit

 

Ubuntu Wallpaper Plain

logo-oracle-large

Ho scritto un howto sull‘installazione di Oracle 11g su Ubuntu 14.04 64 bit nel mio Wiki per chi dovesse essere interessato.

Ho preso spunto dall’ottimo blog: http://meandmyubuntulinux.blogspot.it, i particolari nel Wiki

 

Nightmare before (the night before) Christmas

ubuntu-trusty-logoAvanzamento a Ubuntu 14.04 LTS Trusty Tahr, da 13.10 Saucy Salamander, mi ha provocato un bel po’ di guai.

Dopo il primo riavvio dal termine dell’installazione (e dopo tutti i riavvii seguenti) Il pc si arresta una volta nella schermata di login.

Cercando di seguire i log (Alt+F2 dopo il boot) vedo che /val/log/syslog mi riporta righe simili alla seguente:

[timestamp] BUG: soft lockup - CPU#1 stuck fopr 22s! [procname]

Googleando un po’ mi pare di capire che il problema sia molto serio. A quanto pare si tratta della versione del Kernel.

Ho risolto in modo provvisorio selezionando il kernel all’avvio (SHIFT premuto dopo il boot) e rilanciando il 3.11.

La mia CPU:

Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 37
Stepping: 5
CPU MHz: 1197.000
BogoMIPS: 5053.50
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
NUMA node0 CPU(s): 0-3

Il kernel attualmente operativo:

Linux js 3.11.0-26-generic #45-Ubuntu SMP Tue Jul 15 04:02:06 UTC 2014 
 x86_64 x86_64 x86_64 GNU/Linux

La versione di Ubuntu:

LSB Version: core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:core-3.0-noarch:
 core-3.1-amd64:core-3.1-noarch:core-3.2-amd64:core-3.2-noarch:
 core-4.0-amd64:core-4.0-noarch:core-4.1-amd64:core-4.1-noarch
Distributor ID: Ubuntu
Description: Ubuntu 14.04.1 LTS
Release: 14.04
Codename: trusty

Che dire?

Buon Natale!

PS Angelo Branduardi lo dice meglio di me in questa canzone:

Aggiornamento

Il problema era più serio e la soluzione poteva essere da molte parti, ma alla fine si trattava della scheda video. Praticamente non potevo lavorare con la versione vecchia del kernel. Quindi ho dovuto fare un full backup e reinstallare il sistema operativo (con la complicazione che potevo lavorare solo da linea di comando, per cui mi sono aiutato con il Macbook per masterizzare l’immagine iso del disco di installazione).

Reinstallato il sistema operativo, non funziona ancora: soltanto in modalità debug.

Ho chiesto aiuto alla comunità in questo thread e mi sono stati forniti parecchi suggerimenti, tra cui quello corretto: installare i driver proprietari per la scheda video (questo mi ricorda qualcosa…)

$ sudo apt-get install nvidia-331

Dopo tre riavvii mi sento confidente per dire che il problema è risolto. Mi ricorderò del Natale 2014.

Campionato internazionale di innovazione per PHP e JS

elePHPant reading php|architectIl premio Innovazione è una iniziativa nata nel 2004 dal sito PHP Classes. Lo scopo è incoraggiare più sviluppatori a creare e condividere componenti innovative, come anche fornire componenti che hanno lo stesso scopo a riguardo di altre già pubblicate in passato. L’iniziativa è stata estesa anche al sito JSClasses nel 2013.

La novità per quest’anno è questa: è proprio l’Italia in testa alla classifica, con 8 pacchetti rilasciati, 56 punti totalizzati davanti a Iran e Francia. La blasonata India è solo all’ottavo posto.

Leggi l’articolo completo di Manuel Lemos sul sito PHPClasses

Il sorriso di Samantha Cristoforetti

Impagabile la realizzazione del sogno di una bambina.

CryptoPHP – backdoor infestante per CMS come Joomla, Drupal e WordPress

Black Hat SEO and CryptoPHPQuesto articolo, prodotto da FoxIt NV (una società olandese) e rilasciato il 20 novembre 2014, riporta lo studio di un software malevolo scaricabile come se si trattasse di un prodotto per la sicurezza di Joomla (jSecurity) ma che include una backdoor, che è stato battezzato CryptoPHP, il cui cuore si trova in un file che apparentemente è una immagine PNG ed invece contiene un frammento PHP oscurato con le istruzioni per effettuare la comunicazione fraudolenta con i server di riferimento. La comunicazione avviene su una connessione cifrata con l’adozione dello schema RSA (crittografia asimmetrica) con una chiave a 2048 bit. Il plugin è scaricabile da una ventina di siti, ovviamente una versione gratuita del vero jSecurity che invece prevede il pagamento di un costo licenza.

Il software di backdoor è ben scritto e si adatta ad una varietà di scenari diversi; innanzitutto funziona su tre CMS molto diffusi; comunica con il server di comando e controllo usando crittografia a chiave pubblica; prevede meccanismi di invio posticipati, come l’email, nel caso non riuscisse ad aprire una connessione SSL; automantiene una lista dei server di comando e controllo disponibili.

Lo scopo di questa backdoor è di consentire ad operatori remoti di falsare i dati dei Search Engine Optimization (SEO) tramite la pratica malevola del BlackhatSEO.

Leggi il report completo di Fox-IT BV