Connessione ODBC da Linux a IBM iSeries

La connessione verso il database DB2 di IBM su sistema iSeries è resa possibile grazie ad un pacchetto, distribuito da IBM, contenente i driver per la connessione ODBC.
Per installare il pacchetto, occorre scaricare il package direttamente dal portale IBM, per farlo è necessario un IBM id. Dovete cercare il pacchetto IBM iAccess Client Solutions for Linux, al suo interno sono disponibili pacchetti deb e rpm. Installate il pacchetto compatibile con la vostra architettura, ad esempio:

dpkg -i ibm-iaccess-1.1.0.2-1.0.amd64.deb

Potete trovare ulteriori dettagli su come installare correttamente il software iAccess a questo link.
A questo punto troverete sotto /opt/ibm i nuovi file relativi ai driver ODBC. Per configurare correttamente i driver, li installiamo con il seguente comando:

odbcinst -i -d -f /opt/ibm/iSeriesAccess/unixodbcregistration

Perfetto, visualizzando il file /etc/odbcinst.ini dovremmo ottenere una cosa del tipo:

[IBM i Access ODBC Driver]
Description = IBM i Access for Linux ODBC Driver
Driver = /opt/ibm/iaccess/lib/libcwbodbc.so
Setup = /opt/ibm/iaccess/lib/libcwbodbcs.so
Driver64 = /opt/ibm/iaccess/lib64/libcwbodbc.so
Setup64 = /opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 2

[IBM i Access ODBC Driver 64-bit]
Description = IBM i Access for Linux 64-bit ODBC Driver
Driver = /opt/ibm/iaccess/lib64/libcwbodbc.so
Setup = /opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 2

A questo punto però c’è un ulteriore comando da eseguire, poiché sulle distribuzioni più recenti, come Ubuntu 14.04, manca un link simbolico ad una libreria richiesta dal driver ODBC di IBM:

ln -s /usr/lib/x86_64-linux-gnu/libodbcinst.so.1 /usr/lib/x86_64-linux-gnu/libodbcinst.so.2

Perfetto, non resta che configurare la connessione ODBC al vostro sistema, modificando opportunamente il file /etc/odbc.ini:
A questo punto, potete testare la connessione, con un semplice script PHP:

<?php
$user = 'SomeUser';
$pass = 'SomePass';
$Conn = odbc_connect("DRIVER={IBM i Access ODBC Driver};DATABASE=<DBNAME>;SYSTEM=<IP_ISERIES>;HOSTNAME=<IP_ISERIES>;PORT=446;PROTOCOL=TCPIP", $user, $pass);
if($Conn === false){
    die('failed to connect');
}
$sql = "select * from database.table fetch first 10 rows only";

$result=odbc_exec($Conn,$sql);

echo '<pre>';

while(odbc_fetch_array(($result)){
         print_r($result);
    }
}
?>

Trovate qui una guida dettagliata di come connettersi con PDO tramite ODBC.

Avvio di un IBM S/390

Chi mi accusa di avere troppe macchine in casa non ha mai visto la casa di questa persona 🙂
Pubblico questo fantastico video della procedura di accensione di un S/390 IBM.
Buona visione!

P.S.: Per le altre parti, sono sul canale dell’autore su Youtube

Scansione allegati di una casella IMAP in PHP

Come monitorare una casella di posta in attesa di allegati che rispettino un determinato pattern? Ad esempio, potremmo voler permettere di inviare su una casella un file per l’archiviazione elettronica oppure per essere elaborato automaticamente.
Si può fare molto semplicemente sfruttando le funzioni IMAP di PHP. Ecco un esempio di come aprire una casella:

$hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; // accedo al server IMAP, ad esempio GMAIL
$username = 'YOUR_GMAIL_USERNAME'; # e.g somebody@gmail.com
$password = 'YOUR_GMAIL_PASSWORD';
 
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error()); // apro la connessione
 
$emails = imap_search($inbox,'ALL'); // recupero le email (nota: anche quelle marcate come cancellate)
 
if($emails) 
{ 
    $count = 1;
    rsort($emails); // ordino le email

    foreach($emails as $email_number) 
    {
        $overview = imap_fetch_overview($inbox,$email_number,0); // recupero le informazioni della mail
 
...

A questo punto, ottenute le informazioni sulla singola email, possiamo accedere all’allegato:

...
if(isset($structure-&gt;parts) &amp;&amp; count($structure-&gt;parts)) 
{
	for($i = 0; $i parts); $i++) 
	{
		$attachments[$i] = array(
			'is_attachment' =&gt; false,
			'filename' =&gt; '',
			'name' =&gt; '',
			'attachment' =&gt; ''
		);

		if($structure-&gt;parts[$i]-&gt;ifdparameters) 
		{
			foreach($structure-&gt;parts[$i]-&gt;dparameters as $object) 
			{
				if(strtolower($object-&gt;attribute) == 'filename') 
				{
					$attachments[$i]['is_attachment'] = true;
					$attachments[$i]['filename'] = $object-&gt;value;
				}
			}
		}

		if($structure-&gt;parts[$i]-&gt;ifparameters) 
		{
			foreach($structure-&gt;parts[$i]-&gt;parameters as $object) 
			{
				if(strtolower($object-&gt;attribute) == 'name') 
				{
					$attachments[$i]['is_attachment'] = true;
					$attachments[$i]['name'] = $object-&gt;value;
				}
			}
		}

		if($attachments[$i]['is_attachment']) 
		{
			$attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i+1);

			/* 4 = QUOTED-PRINTABLE encoding */
			if($structure-&gt;parts[$i]-&gt;encoding == 3) 
			{ 
				$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
			}
			/* 3 = BASE64 encoding */
			elseif($structure-&gt;parts[$i]-&gt;encoding == 4) 
			{ 
				$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
			}
		}
	}
}

/* iterate through each attachment and save it */
foreach($attachments as $attachment)
{
	if($attachment['is_attachment'] == 1)
	{
		$filename = $attachment['name'];
		if(empty($filename)) $filename = $attachment['filename'];

		if(empty($filename)) $filename = time() . ".dat";

		/* prefix the email number to the filename in case two emails
		 * have the attachment with the same file name.
		 */
		$fp = fopen($email_number . "-" . $filename, "w+");
		fwrite($fp, $attachment['attachment']);
		fclose($fp);
	}
}
...

I file verranno salvati nella cartella locale di PHP, verificare di avere i permessi necessari.
Trovate il codice completo a questo link.

Problemi di codifica UTF-8 in MySQL

Sono “inciampato” in un problema abbastanza fastidioso con MySQL e PDO. In pratica, una istruzione INSERT contenente dei caratteri speciali (nel mio caso una e acuta) non veniva correttamente recepita. La stringa contenuta nella istruzione di inserimento era correttamente codificata in UTF-8, ma una volta scritta nel relativo campo del database risultava corrotta, come se fosse stata utilizzata una codifica diversa. A complicare le cose, nella stringa di connessione al DB utilizzata era specificato il charset corretto.
Soluzione:

$pdo = new PDO(
'mysql:host=mysql.example.com;dbname=example_db',
"username",
"password",
array(PDO::MYSQL_ATTR_INIT_COMMAND =&gt; "SET NAMES utf8"));

Come potete vedere, passiamo al costruttore dell’oggetto PDO un comando specifico per MySQL, che imposta il charset corretto, mentre in precedente costruttore definito come segue:

$pdo = new PDO('mysql:host=mysql.example.com;dbname=example_db;charset=utf8',"username","password");

nonostante fosse sintatticamente corretto non funzionava.
Maggiori dettagli a questa pagina.

I log di Qmail

Finalmente, di nuovo online!
Scusate l’assenza, mi ero perso in una vita che non era la mia 🙂

Questa volta parliamo di log, in particolare i log di Qmail. La directory di default per questi log è solitamente /var/log/qmail, ma se aprite questi file vedrete che la parte di timestamp non è in un formato leggibile, almeno per un essere umano:

@40000000433225833b6e1a8c tcpserver: status: 5/30
@40000000433225833b6e2644 tcpserver: pid 26162 from 194.206.24.40
@40000000433225840c85ba04 tcpserver: ok 26162 a.mx.jms1.net:209.114.200.128:25 :194.206.24.40::1521
@40000000433225840c8f0cbc rblsmtpd: 194.206.24.40 pid 26162: 451 We do not accept mail from IP addresses without reverse DNS.

Il formato che vediamo è chiamato TAI64N, che può essere convertito in un formato leggibile, ad esempio UTC, con il seguente comando:

$ cat mail.log | tai64nlocal
2005-09-21 23:31:05.997071500 tcpserver: status: 5/30
2005-09-21 23:31:05.997074500 tcpserver: pid 26162 from 194.206.24.40
2005-09-21 23:31:06.210090500 tcpserver: ok 26162 a.mx.jms1.net:209.114.200.128:25 :194.206.24.40::1521
2005-09-21 23:31:06.210701500 rblsmtpd: 194.206.24.40 pid 26162: 451 We do not accept mail from IP addresses without reverse DNS.

Ulteriori dettagli si possono trovare a questa pagina.

Prince of Persia, versione MegaCD

Ecco a voi un filmato di gameplay sulla versione per Sega MegaCD di Prince of Persia. Credo che sia una delle versione del gioco originale meglio riuscite, all’epoca il Sega MegaCD era in grado di fornire una grafica eccezionale e delle animazioni impensabili fino ad allora. Questo era possibile grazie al fatto che il gioco era memorizzato su CDROM invece che in una cartuccia, il costo dello storage era quindi molto inferiore e ciò permetteva di inserire all’interno del gioco addirittura dei filmati.

Serve una clessidra?

spin
Attendere prego …
Nelle applicazioni web moderne, basate fortemente su Javascript e l’interazione diretta della pagina con dei servizi web, è fondamentale dare all’utente un feedback sul fatto che la pagina è in attesa di una operazione di input/output, esattamente come se si trattasse di un software tradizionale. Per dare un feedback di operatività all’utente si possono utilizzare diversi metodi, dalla clessidra presente fin dalle prime versioni di Windows alle moderne progress bar. Per il web può essere interessante utilizzare uno spin, come ad esempio quello che vedete nell’immagine in alto a sinistra.
Questo componete Javascript, scaricabile a questa pagina, si integra facilmente ed è molto customizzabile. Eviterete così click inutili e ridurrete al minimo le classiche email contenti frasi del tipo “Il sito è rimasto inspiegabilmente bloccato!!!” 😉