6 dic 2017

IBM i : Como comprimir/descomprimir ZIP fácilmente



Desde hace mucho tiempo el IBMi cuenta con una forma súmamente simple de comprimir y descomprimir archivos, usando el formato ZIP.
Lo interesante es que tenemos otros formatos que no usamos simplemente por desconocimiento o falta de interés, como gzip. Sin embargo no es simple el poder comprimir con formatos del mundo Unix, ya que nuestros objetos de la base de datos emplean formato EBCDIC.
Ahora bien, a quien no le gustaría poder generar archivos en TXT, CSV, o simples Save Files y comprimirlos usando ZIP? Como referencia, un archivo TXT suele comprimirse alrededor de 8:1, lo cual no es nada despreciable.
Para poder comprimir acude a nuestro rescate el comando JAR, propio del JAVA. Para poder usarlo recomiendo instalar la versión de Java de 64 bits, la cual soporta archivos de mayor tamaño.
Como primer experiencia iremos a QSHELL , iremos a nuestro directorio dentro del IFS /home/dkesselman (dkesselman es mi usuario y si el directorio no existe podemos crearlo con mkdir /home/dkesselman ) y si no tenemos archivos podemos hacer algo como  system wrkactjob > WAJ.TXT Esto creará un archivo de texto WAJ.TXT con la salida del WRKACTJOB.
Ahora vamos a crear un archivo WAJ.zip con el siguiente comando:
jar - cvfM WAJ.zip WAJ.TXT
Esto significa:
c: Crear archivo , v: De forma verbosa, f: tratar con archivos, M; no crear datos de manifiesto (información que crea por default el comando JAR para aplicaciones JAVA), luego el destino y por último el origen.
Al ejecutarlo nos dará un mensaje similar a este:
añadiendo: WAJ.TXT(entrada = 32150) (salida= 3715)(desinflado 88%)
QSHELL puede ser invocado de forma batch de la siguiente forma:
QSH CMD('jar -cfM /home/dkesselman/WAJ.zip /home/dkesselman/WAJ.TXT')
y esto se podría someter.
Si lo que queremos es descomprimir el contenido:
QSH CMD('jar -xf /home/dkesselman/WAJ.zip')
Existe otros métodos más sofisticados, como P7Zip, que permite encriptar, o APIs para integrar de forma nativa, pero creo que en los equipos de Power7 en adelante y en IBMi V7Rx no deberemos tener problemas de rendimiento.
Feliz compresión de datos.

IBM i (AS/400) y la velocidad de la base de datos - Index Advisor




Como todos sabemos, la base de datos de IBM i llamada DB2 for i tiene capacidades únicas. Nos permite correr programas antiguos contra objetos de base de datos que pueden tener varios miembros usando Record Level Access, así como acceder a la información mediante comandos SQL.
Originalmente los índices se creaban usando DDS, pero desde hace ya unos años podemos crearlos con DDL. Siempre hay quien pregunta si es uno mejor que el otro, y obviamente la respuesta es "depende".
Si vamos a usar RLA obviamente necesitaremos índices basados en lógicos mediante la compilación de DDS. Si nuestra operación se basa en SQL lo ideal siempre ha sido usar índices creados mediante DDL.
El motor de base de datos contaba con CQE o Classic Query Enginne, que permitía crear índices para uno y otro caso. A partir de la introducción del SQE o SQL Query Enginne los índices creados con DDS se pueden usar, cuando las condiciones lo permitan, en instrucciones SQL. Obviamente existen factores de optimización que podrían indicar la conveniencia de usar índices con DDL, debido a lo compacto de estos.
Sin embargo, el punto más importante es que existan índices para satisfacer las necesidades de las aplicaciones que corren en los equipos. He visto casos donde la diferencia entre usar un índice o no es de 36 hs vs 0:01:30 hs (1 minuto y medio).
Debemos recordar que los motores de bases de datos emplean algoritmos para decidir que índices usarán, y DB2 for i no es la excepción. Algunas bases de datos emplean optimización basada en costo, otras basado en reglas.
Optimización basada en reglas: Existen una serie de reglas y patrones que permiten que el optimizador decida cómo ejecutará el query y que índices usará. Esto puede no siempre ser lo más conveniente desde el punto de vista del rendimiento.
Optimización basada en costo: Se basa en el esfuerzo que deberá hacer la base de datos para obtener la información, usando las estadísticas como base para la evaluación. Es el método que emplea DB2 for i
Al basar la optimización en algoritmos basados en costo la base de datos no siempre empleará los índices que esperamos que use, sino los que dicten las estadísticas. Esto puede provocar que el equipo necesite índices adicionales.
Afortunadamente DB2 for i nos provee de una herramienta para determinar que índices nos está recomendando el optimizador.
Existen 2 vistas que nos pueden auxiliar a determinar las tables e índices que necesitamos: QSYS2.SYSIXADV y QSYS2.CONDENSEDINDEXADVICE
Esta última hace un resumen de los índices que necesitamos, evitando índices que están contenidos en otros.
Dentro de ambas vistas podemos ver el tipo de índice que nos recomiendan, la cantidad de veces que fué recomendado, la estructura del índice, si se han creado índices temporales con dicha estructura, el tamaño de la tabla a indexar, etc. Con esta información podremos hacer un filtrado de los índices más significativos, o podemos buscar los que correspondan a las tablas que realmente nos interesan.
Si queremos hacer todo más sencillo podemos usar el IBM Systems Director Navigator for i:
Vamos a "Bases de Datos"->Schemas-><NOMBRE-DE-BIBLIOTECA> y presionamos botón derecho, donde seleccionaremos "Asesor de índices"
Si seleccionamos uno de estos índices recomendados y hacemos click derecho podremos crear el índice de inmediato, sólo debemos darle un nombre.
En el menú de Index Advisor/Asesor de Indices también podremos borrar las estadísticas para que se vuelvan a generar.

IBM Power Systems: Instalando el OS remotamente en un equipo nuevo y vacío (con dual VIOS)




Estábamos tranquilos trabajando desde casa un viernes, mirando el jardín y pensando en que haríamos ese fin de semana, cuando llaman de la oficina para que instalemos el nuevo servidor de la compañía...
... en el nuevo datacenter a 1000 km de distancia.
Por fortuna encontramos un vuelo para el domingo en el fantástico horario de las 12 de la mañana para ir a instalar el equipo.
La familia nos mira con mala cara, pero trabajo es trabajo, así que preparamos nuestro equipaje de instalador:
Laptop, DVDs con la media, DVDs vírgenes por si tenemos que volver a grabar la media, una unidad de DVD USB (las laptops ya no traen DVD), varios USBs, disco externo, cable de red, cargador, lentes, collarín para el vuelo, una playera para cuando salgamos del datacenter, desodorante y un sinnúmero de por-las-dudas.
Volvemos al portal de la aerolínea de bajo costo que solemos usar en estos casos y en eso recordamos algo que vimos en un anuncio de IBM y que no habíamos terminado de leer.
Eso es!!! Si puedo instalar el VIOS remotamente en mi servidor evitaré divorciarme y que mis hijos me recuerden por fotos!
Comienzo a leer y todo se ve muy lógico. Llamo al datacenter para pedirle a la gente de Hands & Eyes que conecte un cable desde la consola HMC que instaló el técnico hasta el puerto HMC1 del servidor.
Lo guío por teléfono para que asigne la IP de la red de administración y luego de 1 hora de explicar todo con mucha paciencia y haciendo memoria de como luce cada ventana para describirla como si programáramos un robot (perdón chicos), el equipo responde a mi ping. Me conecto por SSH para activar los servicios de acceso web remoto, configurar el firewall y cosas por el estilo, y agrego el equipo que apenas si tiene energía.
Ahora viene lo interesante. Veamos paso por paso:
1) Necesito crear las particiones de los dos VIOS. Las nombre VIOS1 y VIOS2 (perdón por la falta de creatividad, pero sirve a los efectos didácticos)
2) Necesito subir la media a la HMC: Voy a Gestión de HMC -> Gestionar Repositorio de imágenes del servidor de E/S virtual
3) Click en Importar nueva imagen de servidor de E/S virtual
4) Indico toda la información, pero me faltaba subir la imágen a mi servidor de trabajo/jumserver/repositorio donde subiré las imágenes ISO que bajé de IBM ESS o que me facilitó mi partner.
5) Listo. Ahora toca iniciar el VIOS en modo instalación
6) Selecciono la partición del VIOS y le digo activar. Lo importante es que seleccione Instalar el servidor de E/S virtual como parte del proceso de activación?
7) Y ahora comienza lo más importante. Nos pedirá información IP del servidor. Esta información es para que el VIOS pueda ver al servidor y envíe por BOOTP+NFS la imagen a instalar. Es muy importante que la HMC se encuentre dentro de la misma red/VLAN o no funcionará esto.
8) Le decimos que arranque y a esperar. NO DEBEMOS TOCAR NADA. Esto es muy importante. Si pretendemos abrir la ventana de consola o tocar algo el proceso fallará.
9) Una vez que instalamos el VIOS1 y entramos por consola lo siguiente sería configurar el TCP/IP, subir las imágenes de los OS a instalar (IBMi, AIX, Linux, etc) y recomiendo que suban las imágenes de la media del VIOS.
10) Agregamos las imágenes del VIOS al image catalog y ahora nos preparamos para instalar el 2do VIOS.
NOTA: Obviamente podríamos repetir el proceso del VIOS1, pero para fines didácticos prefiero hacerlo más complicado y explicarles un pequeño truco.
Como sabrán, el VIOS al crear un dispositivo VSCSI lo crea como SERVER y no da opción de crearlo como cliente. Si pudiéramos crear el VSCSI del VIOS2 como cliente de un VSCSI server en ambios VIOS podríamos crear un DVD virtual tan simple como
mkvdev -vadapter vhostX -fbo -dev vopt01
En el VIOS1 montamos la imagen del repositorio y al arrancar el VIOS2 podríamos instalar de un VIOS al otro.
Pues existe un truco para crear el VSCSI de VIOS2 como cliente del VIOS1, usando la línea de mandatos de la HMC, a la que podremos acceder usando SSH.
chsyscfg -r prof  -m MyServer -i 'name=VIOS01,lpar_id=1,"virtual_scsi_adapters=99/server/2/VIOS02/99/0"'
chsyscfg -r prof  -m MyServer -i 'name=VIOS02,lpar_id=2,"virtual_scsi_adapters=99/client/1/VIOS01/99/0"'
Aquí estoy agregando un dispositivo 99 en cada VIOS, pero VIOS02 es cliente de VIOS01 , y VIOS01 es server de VIOS02
A partir de acá es simple. Creo los dispositivos de DVD virtual, monto la media en el DVD virtual en VIOS01 y arranco VIOS02 en modo SMS.
La instalación de cada OS es tema aparte.
Si necesitan ayuda pueden avisarme y con gusto veré de apoyarlos.
Buenas noches y eviten tomar ese vuelo.

IBM i: Enviando un correo sin configurar el SMTP y con sólo un comando




Ok, siempre que tenemos que configuar el envío de correos desde IBM i es un dolor de cabeza, porque tenemos que configurar una cuenta de RELAY en el servidor para poder firmarnos sin clave por SMTP.
Pero a nuestro rescate vienen las "Open Source Technologies" dentro de 5733OPS. Obviamente debemos descargarlo de IBM Entitled Software Support e instalarlo correctamente.
Una vez instalado agregará varias herramientas, entre ellas cURL. 
Esta herramienta es sumamente útil y hay cientos de ejemplos en Internet, sobre como descargar o subir archivos, descargar páginas, firmarnos en un WebService, etc.
Lo primero que debemos hacer es crear un archivo de texto al que llamaremos mail.txt con la siguiente estructura. Podemos usar SSH y una vez firmados el vi, o bien podemos crearlo en nuestra PC y subirlo mediante FTP/SCP/SFTP o lo que prefieran. Tiene que ser texto ASCII
From: "Nombre de remitente" <UsuarioRem@gmail.com>
To: "Nombre de destinatario" <UsuarioDest@dominio.com>
Subject: Mensaje de prueba

Este es un mensaje de prueba enviando desde mi IBM i 
sin configurar el SMTP

Suerte
Y ahora desde PASE (call QP2TERM) o bien conectados mediante SSH ejecutamos lo siguiente:
curl --url 'smtps://smtp.gmail.com:465' --ssl-reqd --mail-from 'UsuarioRem@gmail.com' --mail-rcp 'UsuarioDest@dominio.com' --user 'UsuarioRem@gmail.com:MyPassword' --insecure --upload-file mail.txt
Esperamos unos segundos y el correo estará enviado. Esto mismo se puede hacer con otros servidores de correo, no tiene que ser específicamente GMAIL como en el ejemplo.
Es importante señalar que tienen que configurar correctamente el DNS para que pueda resolver nombres y el equipo debe poder salir a Internet, o no funcionará.
Podemos hacer el envió desde un CL usando
QSH CMD('curl --url 'smtps://smtp.gmail.com:465' --ssl-reqd --mail-from 'UsuarioRem@gmail.com' --mail-rcp 'UsuarioDest@dominio.com' --user 'UsuarioRem@gmail.com:MyPassword' --insecure --upload-file mail.txt')
Mucha suerte con el envío de correos

IBM i Access for Mobile - Conectándonos desde el celular a nuestro servidor



Como muchos ya habrán comprobado el IBM i Access for Web se convirtió con el tiempo en el IBM Navigator for i, mucho más interesante en características y sin necesidad de hacer configuraciones extrañas.
De pronto un día estamos de vacaciones disfrutando de una deliciosa cerveza helada en un camastro mirando las olas de Cancún o Los Cabos, cuando de pronto suena nuestro teléfono. Y sin importar que son nuestras primeras vacaciones en años sabemos que no podemos dejar de atender.
Abrimos el cliente móvil de VPN y nos conectamos a la red (la seguridad ante todo), y comenzamos a navegar usando el cliente de Mocha TN5250 (lo recomiendo ampliamente).
Lo que no teníamos en cuenta es que las 600 conexiones QZDASOINIT nos complicarían el buscar el proceso que complica el rendimiento, sumado a que mientras escribimos no vemos la pantalla porque el teclado la cubre, y que nuestro dedo índice es algo grueso para en teclado en la pantalla de 5 pulgadas.
Luego de un buen rato batallando con la desconexión de la VPN producto de la intermitencia en el WIFI del hotel, reconectando la pantalla donde estábamos, revisando el WRKACTJOB y el joblog, encontramos el problema.
Definitivamente no es la mejor experiencia, en buena parte por la naturaleza de la emulación 5250 que provoca que se caiga la sesión y la intermitencia o saturación que a veces experimentan las redes o incluso la VPN cuando estamos conectados de forma remota.
Sin embargo, IBM nos ha dado algunas herramientas sumamente útiles para estos casos:
1) 5733-SC1: Podemos usar SSH para una conexión segura (si nos dejan los expertos en redes) y evitar pasar por la VPN en caso de estar saturada, excedida en licencias, o con problemas de filtrado de red en la red que estemos usando. Combinado con JuiceSSH (quien tenga Android NO puede dejar de adquirirlo) nos permite crear un tunnel dinámico o Proxy Socks. Los proxy socks funcionan perfectamente con Firefox para Android, donde incluso podemos instalar plugins para mejorar el cambio de configuración (yo uso Proxy Switcher and Manager)
2) IBM i Mobile Access: Este interesante producto ya viene integrado en el equipo junto con el IBM i Access for Web. Nos permite ver spooles en formato PDF, ver y responder mensajes, abrir una sesión de emulación web 5250, navegar en el IFS, ver trabajos activos, etc. Al ser una conexión web, aún cuando tengamos intermitencia en la red, la conexión no se caerá.

Configuración de IBM i Mobile Access
Primero los pre-requisitos:
  • Debemos tener IBM i Access for Web (5770XH2) instalado
  • IBM i V6R1 o superior
  • PTFs según nuestra versión de OS (los últimos disponibles):
  • V6R1: SF99713
  • V7R1: SF99368
  • V7R2: SF99115
  • Más PTFs, según mi experiencia: Java Group, HTTP Group y el paquete que suelan instalar con el acumulativo, que también es recomendable.
  • Debemos detener el IBM HTTP Server por completo
  • Ejecutar lo siguiente
CFGACCWEB2 APPSVRTYPE(*INTAPPSVR) INSTANCE(*MOBILE)
  • Reiniciar el WebServer
Una vez que hemos hecho todo eso, si todo sale bien deberemos poder conectarnos en la siguiente URL
http://<SERVER_IP>:2001/iamobile
IBM i Access for Mobile funciona perfectamente con dispositivos Android, iPhones, iPads, y prácticamente con cualquier otro dispositivo que tenga un navegador aceptable.
Para la configuración del acceso por JuiceSSH , túneles SSH, Proxy Socks y demás estoy pensando en preparar un artículo dedicado a conexiones remotas.
Espero les sea de utilidad.
Cualquier duda pueden contactarme o dejarme un comentario

IBM i/AS/400 y la nube - Interactuando con DropBox



Algo que siempre me gustó de servicios como DropBox, Google Drive y OneDrive es el bajo costo por 1TB de disco, sumado a la facilidad que tenemos para acceder desde una PC, smartphone o tablet.
Vuelvo a recalcar que soy un ferviente defensor de los cartucho de cinta, pero hay casos en que es más práctico salvar a disco o mejor aún, a la nube. Tal es el caso de ambientes de desarrollo y/o PoCs, ya que normalmente podemos recuperarnos de un desastre con respaldos en cinta antiguos o incluso podemos reconstruirlos desde SAVF sin mucha dificultad, en la mayoría de los casos.
Lo que si necesitamos es tener esos respaldos a mano, porque nunca falta un programador que quiere una versión de hace 2 meses cuando no había realizado cierto cambio, o cuando decidió depurar información.
Obviamente la capacidad de un cartucho es enorme, pero a veces se vuelve poco práctico cuando queremos simplemente un archivo entre múltiples bibliotecas salvadas, múltiples sesiones de infinidad de días. Muchas veces hay que pedir a los operadores de Iron Mountain/AdeA/AAA/etc que nos envíen los cartuchos, lo cual podría incluso significar un costo de maniobras, y las autorizaciones pueden demorarse, todo por un simple archivo.

No sería fantástico poder salvar a SAVF, comprimir a ZIP o 7ZIP y subir a Dropbox? No sería bueno poder subir reportes en PDF a Dropbox y enviarle la liga al gerente que lo solicita?
En este momento 2TB de Dropbox for Business ronda los 12.50 USD por mes por usuario (mínimo 3) , lo cual lo vuelve una opción muy interesante.

El problema muchas veces con los servicios en la nube son los complejos sistemas de validación, que muchas veces necesitan que nos firmemos mediante un browser para mostrarnos una imagen de captcha o similar. O peor aún, que funcionan con programas o APIs sumamente complejas.
Volviendo a lo que nos interesa, el IBM i , me puse a investigar la forma de emplear Python para subir el archivo, ya que contamos con 5733-OPS, pero fue una decepción... hace algunos meses varios proveedores (Google, Microsoft, Dropbox) cambiaron los mecanismos de autenticación , lo cual volvió obsoletos a los scripts creados para subir información.
Sin embargo, y como no suelo rendirme fácilmente, decidí investigar otros mecanismos como cULR. Este comando es una verdadera maravilla, ya que permite descargar archivos de una página, subir archivos, interactuar con webservices, enviar correos, etc.
Encontré varias referencias de antiguos mecanismos para subir archivos usando cURL, pero ya eran obsoletos. Sin embargo, y luego de investigar un poco, llegué a un ejemplo para Linux de Andrea Fabrizi. Básicamente es un shell script para BASH (si, también tenemos BASH en IBMi) donde emplea cURL y una serie de herramientas adicionales para enviar archivos. Y lo más interesante es que también podría funcionar en AIX.
Este script debí modificarlo dado que algunas herramientas no existen en IBMi, pero realmente han sido pequeños ajustes.
Lo primero que debemos hacer es registrar una aplicación en DropBox, como si fueramos programadores. Esto es para que nos provean de un Token, una cadena de caracteres que nos permitirá firmarnos de forma automática.
1) Ir a la siguiente dirección

2) Hacer click en Create App y seleccionar DropBox API, Full Dropbox, indicar un nombre de la aplicación y aceptar el acuerdo. Luego aceptar

3) En la próxima pantalla dar click en Generate access token y guardar el valor que aparecerá. Ese valor lo necesitaremos la primera vez que corramos el programa. Es el token que nos permitirá firmarnos.
Ahora vamos a conectarnos por SSH a nuestro equipo IBM i. Para ello debemos tener correctamente instalado el producto 5733-SC1 y el servicio iniciado. En un artículo anterior está el detalle IBM i (iSeries, AS/400, i5) , SSH , SFTP y BASH. Agregando la flexibilidad de Linux en IBM i
Lo siguiente es subir el script de la liga al equipo (es muy largo para pegarlo como snippet)
Se debe ejecutar una primera vez de forma manual, para poder asignar el Token que generamos en la página de DropBox Apps. La próxima vez ya no pedirá información.
El uso es bastante simple, como indica Andrea Fabrizi en GITHUB:
Features
  • Cross platform
  • Support for the official Dropbox API v2
  • No password required or stored
  • Simple step-by-step configuration wizard
  • Simple and chunked file upload
  • File and recursive directory download
  • File and recursive directory upload
  • Shell wildcard expansion (only for upload)
  • Delete/Move/Rename/Copy/List/Share files
  • Create share link
  • Monitor for changes
Para una lista de comandos completa les recomiendo ir a la página del script en GITHUB, pero creo que lo más importante es cómo subir archivos, así que les doy un ejemplo:
#Subiendo el archivo myfile.pdf en la carpeta FOLDER1
/home/dkesselm/dropbox_uploader_fori.sh -k upload myfile.pdf FOLDER1

#Creando la carpeta FOLDER1
/home/dkesselm/dropbox_uploader_fori.sh -k mkdir FOLDER1

El parámetro "-k" lo debí agregar para evitar un problema de autenticación desde mi equipo IBMi. Posiblemente a Uds no les ocurra y puedan evitar usarlo.
Espero que les haya sido de utilidad. Como siempre, pueden contactarme por mensaje o dejando un comentario.

IBM i : Creando códigos QR fácilmente



Uno de mis primeros trabajos en sistemas fue dando mantenimiento a un sistema de producción. Este sistema usaba códigos de barras que eran leidos por hand-helds, las cuales enviaban la información al sistema. Obviamente soñaba con códigos de barra.
Cuando teníamos una contingencia soñaba con la posibilidad de que algún día mi celular pudiera leer los códigos de barra para poder trabajar de forma simple y sin depender de los costosos y complejos hand-helds, que tenían una aplicación hecha a pedida.
El tiempo pasó y los celulares incorporaron navegación, luego teclado, finalmente pantallas de múltiples líneas. Desarrollé un sistema simple para la entrega de documentos que nunca se puso en producción, pero seguía pensando que debía existir una forma más elegante o seria de hacer las cosas si usáramos códigos de barras en los documentos/sobres y lectores "pegados" a los teléfono-radios de aquel entonces.
Hasta que un día vi en un cartel un código QR, pero ya no trabajaba en distribución ...
La verdad es que los códigos QR se pueden emplear de muchas formas muy interesantes: compartir contactos, confirmar información en documentos, seguridad en un esquema 2FA, recepción de documentos, etc. Y ya podemos generalos en IBM i.
Como siempre he dicho, IBM i es tan flexible como quieras hacerlo. Hace ya tiempo que alguien se tomó la molestia de compilar herramientas open source para que corran en IBM i, y desarrolló una serie de herramientas para poder usarlas.
Lo que deben hacer es ir a la página http://yips.idevcloud.com/wiki/index.php/pase/opensourcebinaries y descargar las herramientas: download-2.0.tar.zip y setup2.sh y descargarlo en un directorio del IFS, digamos /tmp. Con un usuario *SECOFR debemos hacer lo siguiente:
QSH

cd /tmp
jar -xvf download-2.0.tar.zip
cd /QOpenSys
tar xvf /tmp/download-2.0.tar
cd /QOpenSys/download
cp /tmp/setup2.sh .
./setup.sh
./setup2.sh
Eso instalará las herramientas de descarga de programas open source, antecesores del 5770-OPS.
Ahora viene lo entretenido, debemos instalar el programa "QREnconde". Este programita me permite generar códigos QR en diferentes formatos gráficos (PNG por default). Para poder instalarlo haremos:
QSH

cd /QOpenSys/download
./wwwperzl.sh aix61 wget qrencode-3.4.3-1
./wwwperzl.sh aix61 rpm  qrencode-3.4.3-1
Listo, ya tenemos instalado el qrencode. Qué podemos hacer con él?
QSH

qrencode -o qr-esselware.png http://www.esselware.com.mx

Con esto generamos una imagen qr-esselware.png con la siguiente imagen
O bien, puedo crear una vCard para que sea fácilmente incorporada en la lista de contactos de mi celular, crean un archivo de texto con el siguiente contenido:
BEGIN:VCARD
N:Diego E. KESSELMAN
URL:http://www.esselware.com.mx
EMAIL:dkesselman@esselware.com.mx
TEL:+54-55-9000-1729
END:VCARD
y luego haremos lo siguiente:
cat test.vcard | qrencode -o qr_dkesselman.png 
Esto nos generará la siguiente imagen:
Obviamente esto se puede incorporar en un reporte, en una página web, en una aplicación , etc.
Espero que les sea de utilidad

Cómo conectarme a un servidor remoto en una red protegida - Versión actualizada

En un artículo anterior describí cómo conectarse a un equipo remoto en una red protegida http://diego-k.blogspot.mx/2014/12/como-conectarme...