Sunday, April 10, 2016

Conectar DataDirect a base de datos SQL Server con usuario de Active Directorio vía ODBC

Antecedentes

DataDirect es un software del fabricante Progress el cual permite crear conexiones ODBC, JDBC, Ado.Net, con una eficiencia y performance mayor comparado por ejemplo con el driver Microsoft ODBC para SQL Servers en Linux. Así mismo es el driver que utiliza el TTU de Teradata para crear TPTs pero el punto débil sin lugar a dudas es la documentación. Desde mi punto de vista se tiene que realizar una ardua investigación tanto en su sitio oficial como en otros sitios web para poder encontrar información referente a algún problema.

En este caso, el problema en cuestión es tratar de conectar un TPT con un operador de extracción a una base de datos SQL Server utilizando un usuario de dominio.

Introducción

La conexión al servidor SQL Server desde el TPT utilizando un usuario de SQL es transparente pero al intentar utilizar un usuario de Active Directorio el problema comienza, hasta que encontramos en un foro (no oficial de Progress) los parámetros a agregar y configurar que permitan realizar la conexión al servidor SQL Server con un usuario de Active Directory.

Nota: No se coloca el link del foro debido a que no recuerdo el sitio en donde encontramos la solución.

Solución

En el archivo odbc.ini del DataDirect, se deben agregar los siguientes parámetros en la configuración de la conexión ODBC:

Parámetro a modificar:
-- AuthenticationMethod=9

Parámetro a agregar:
-- Domain={Nombre_Del_Dominio}

Con estos 2 parámetros ajustados, solamente debes realizar la conexión con el usuario (sin dominio) y la respectiva contraseña en el TPT y listo, la conexión se realiza de forma exitosa.





Sunday, October 25, 2015

Tableau | Tableau Server | Puertos a abrir en Firewall

Antecedentes

La empresa para la que ahora contribuyo tomó la decisión de adquirir Tableau y la situación con la que nos enfrentamos previo a la su instalación era la de conocer exactamente los puertos a abrir en para poder establecer conexión hacia Tableau Server vía clientes, esto debido a que el proveedor se apegaba a la documentación oficial del producto, la cual es un listado de 35 puertos a liberar, ¿en verdad?
El control de cambios, tiempo de liberación de puertos y las exigencias de área de seguridad, nos demandan liberar en una sola petición, los puertos a conectarnos desde la red corporativa al servidor de Tableau.

Introducción

Tableau es un software analítico de información, complemento del área de BI. Esta herramienta le da autonomía al usuario final para realizar sus propios análisis de información y no depender de reportes estáticos como se presentan en Repoting Services de Microsoft. 
El servidor donde se instaló se encontraba en un data center co-ubicado, el diagrama se presentaba de la siguiente forma:



Como se podrá observar, el problema era saber exactamente que puertos debíamos de abrir en el Firewall co-ubicado debido a que del otro lado tendríamos:
 - Tableau Desktop
 - Tableau Reader
 - Tebleau iPad

La documentación oficial de Tableau nos da un listado de cerca de 35 puertos que Tableau Server utiliza (ver listado de puertos), a lo que la solución se resumen en realizar una análisis de todos los puertos en un ambiente controlado.

Solución

Para determinar exactamente los puertos, procedemos a crear nuestro ambiente controlado:
  1.- Instalar y configurar Tableau en una maquina virtual.
  2.- Instalar Tableau Desktop en la maquina host para establecer conexión.
  3.- Monitorear las conexiones establecidas desde el host hasta la maquina virtual abiertas por Tableau Desktop.

Comenzamos:
1.- La instalación sobre una maquina virtual con Windows Server es sumamente sencillo, lo único que se debe de tener en cuenta es con asignar los recursos mínimos que Tableau Server requiere para ser instalado. De lo contrario el instalador no nos permitirá continuar.
2.- La instalación de Tableau Desktop es de la misma forma; sencilla. Solo damos "siguiente" a lo que nos muestra en pantalla.
3.1.- Una vez instalado, ejecutamos el comando "netstat" desde la maquina host para determinar las conexiones abiertas:


3.2.- Ejecutamos Tableau Desktop y nos conectamos al servidor


3.3.- Volvemos a revisar las conexiones establecidas pero haciendo énfasis a las conectadas al servidor virtual donde corre Tableau Server.


Conclusión

Con esto comprobamos que las conexiones abiertas por Tableau Desktop hacia Tableau Server son únicamente por el puerto http (80).

Nuestro diagrama finalmente queda:



El cual da la razón al diagrama de arquitectura de Tableau Server:


Wednesday, September 3, 2014

Parámetros y comodines (wildcards) en Excel para SQL Server Express

Antecedentes

Un día no muy lejano se me ocurrió probar la conexión entre MySQL Server y Excel, después de una conexión exitosa, decidí intentar con SQL Server. 
Instalé SQL Server Express 2008 R2 y utilicé ESF Database Migration para mover algunas tablas de MySQL a SQL Server. Todo iba bien hasta que intenté realizar algunas consultas con parámetros establecidos por el usuario desde celdas en Excel. SQL Server respondía error en la consulta pero no me daba pistas del error en especifico, por lo que busqué algún método de rastrear las consultas de SQL Server y esto fue lo que encontré...

Introducción

SQL Server (versión de paga) tiene una herramienta de nombre "SQL Server Managment Studio" (SSMS), la cual sirve para configurar y administrar las bases de datos. Dentro de estas herramientas se incluye un componente de nombre "SQL Server Profiler" el cual captura los eventos de SQL Server, y como tal; las consultas realizas. El problema llega cuando te das cuenta de que este complemento solo está disponible para la versión de paga, dejando a SQL Server Express sin posibilidad oficial de monitorear las consultas.

Solución (Monitorear consultas SQL Server Express)

Dentro de las fabulosas soluciones que se desarrollan en CodePlex, existe una herramienta de nombre ExpressProfiler, la cual está enfocada a ser un sustituto sencillo y siempre para "SQL Server Profiler" y lo mejor es que funciona para "SQL Server Express", entonces:

  1.- Descargamos e instalamos Express Pofiler.
  2.- Ejecutamos la aplicación desde (C:\Program Files (x86)\ExpressProfiler\ExpressProfiler.exe).
  3.- Seleccionamos nuestro servidor e instancia.
  4.- Damos click en "Start Trace".

Listo, con esto podemos monitorear las consultas y ajustar los parámetros de acuerdo a nuestras necesidades.

Solución (Parámetros en Excel para SQL Server)

La solución simplificada de este post, se resume en lo siguiente:

* Cómo podemos observar en Express Profiler, los parámetros en automático incluyen los entrecomillados sencillos, es decir, no es necesario agregar las comillas para los parámetros de texto o fecha.

* Para agregar los wildcards de SQL utilizamos otra celda con referencia y con la ayuda de formulas completamos nuestra consulta.

Ejemplo de consulta desde Microsoft Query:

SELECT p.nombre AS 'Proyecto', u.nombre AS 'Usuario', p.tot_solicitado AS 'Total'
FROM prota2.proyectos_internos p
INNER JOIN prota2.usuarios u ON p.usuario = u.id
INNER JOIN prota2.cuentas_b c ON p.cuenta_b = c.id
WHERE p.fecha_solicitud between ? AND ?
AND p.nombre LIKE ?
AND c.num_cuenta_b LIKE ?
AND u.nombre LIKE ?

Los parámetros editables por el usuario son (agregamos en Excel):

Fig. 1.1 - Parámetros definidos por el usuario en Excel.

Cómo se puede observar, tenemos en este ejemplo:
  - 3 Parámetros de texto.
  - 2 Parámetros de fecha (validados por una lista para evitar problemas de la información que ingrese el usuario).

Las formulas de ayuda para poder utilizar los wildcards de SQL son:

Fig. 1.2 - Formulas de ayuda para wildcards.

En el Express Profiler se puede observar la consulta como:

N'@P1 nvarchar(27),@P2 nvarchar(27),@P3 varchar(100),@P4 varchar(20),@P5 varchar(35)',N'SELECT p.nombre AS ''Proyecto'', u.nombre AS ''Usuario'', p.tot_solicitado AS ''Total''
FROM prota2.proyectos_internos p
INNER JOIN prota2.usuarios u ON p.usuario = u.id
INNER JOIN prota2.cuentas_b c ON p.cuenta_b = c.id
WHERE p.fecha_solicitud between @P1 AND @P2
AND p.nombre LIKE @P3
AND c.num_cuenta_b LIKE @P4
AND u.nombre LIKE @P5',N'20140101',N'20140927','%%','%%','%emir%'

En resumen

Los parámetros en Excel incluyen en automático los entrecomilldos y para agregar wildcards debemos utilizar formulas, como "concatenar" o "texto" para establecer formato a un valor.

Tuesday, August 26, 2014

HP Scanjet G3110 hacerlo funcionar con Mavericks

Antecedentes


Una de mis compañeras de trabajo utilizaba como herramienta de trabajo una iMac (Mid-2010), cargada

con Mavericks (10.9.4) y como parte de la renovación de equipo de computo ahora utiliza otra iMac (Late-2012) con la misma versión de Mavericks (10.9.4), no es un gran salto, pero ese no es el tema de este post. Todo funcionó correcto hasta que conectó el escaner HP Scanjet G3110, el cual no era detectado en su "nueva" maquina y en su equipo anterior funcionaba a la perfección.

Introducción


Para resolver este problema, lo primero que hice fue revisé el "reporte del sistema", con el fin de corroborar que Mavericks detectara el scanjet, por lo que pude apreciar que en el sistema operativo aparecía el escaner conectado.

Esto me hizo pensar que el problema sería de drivers. Busqué los controladores para Mavericks en la pagina oficial de HP, pero desfortunadamente encontré de Tiger a Snow Leopard.

Fig. 1.1. "System Report"

Recordando que aun tenía acceso a la maquina anterior (en donde el escaner funciona sin problemas), supuse que no habría mayor problema por obtener los drivers necesarios para Mavericks.

Solución

Mavericks utiliza el software "Image Capture" para administrar aquellos dispositivos de donde puede copiar imagenes como: iPhones, cámaras digitales y escaners. Dentro de la carpeta de la aplicación (/Library/Image Capture/), se encuentra un subfolder de nombre "Devices", la cual contenía los escaners que esa computadora había utilizado, incluyendo uno de nombre "HP Scanner.app".

Copié este paquete a la "nueva" iMac, pegandolo en el mismo directorio y "listo", pude escaner utilizando el Scanjet G3110.

Fig. 1.2. Carpeta de "Image Capture"

En resumen


1.- Descarga este paquete HPScanner.zip
2.- Descomprimelo
3.- Copia su conteniedo "HP Scanner.app" al directorio /Library/Image Capture/Devices.
   Nota: El folder /Library, es el del sistema operativo, NO el del usuario. Para visualizar el folder correcto en el "Finder", da click en el menú: Go -> Go to Folder, en la ventana que pide escribas la ruta solo teclea la diagonal invertida (sin comillas) "/", das enter y navegas a la ruta mencionada.
4.- Ejecutas "Image Capture", esperas un momento a que cargue este nuevo paquete.
5.- Listo, ahora puedes escanear con tu G3110 en Mavericks.

Fig. 1.3. HP G3110 en "Image Capture"


Nota

Dentro de este paquete, encontré que están citados los siguientes escaners:

1.- HP Scanjet G3110
2.- HP Scanjet 200
3.- HP Scanjet 8270
4.- HP Scanjet 300
5.- HP Scanjet G4010
6.- HP Scanjet N6310
7.- HP Scanjet 5590
8.- HP Scanjet G4050

En caso de que no encuentres los drivers de los dispositivos mencionados para Mavericks en la pagina oficial de HP, intenta cargar este paquete y decirnos si funciona también para el modelo en cuestión.

Monday, August 18, 2014

RV042 V3 - Recuperar después de una actualización de firmware fallida

Antecedentes

En una de las empresas hermanas para la que trabajo, se utiliza un router cisco Rv042 V3, principalmente para crear el enlace VPN entre sucursales.

Después de una fallida actualización de firmware (el router iniciaba con el led de DIAG [diagnostic] parpadeando en color rojo), por lo que solicité me mandaran el router para intentar restaurarlo.

Introducción

Encontré en los foros oficiales de Cisco que puedes iniciar el router en modo "Boot Loader" de tal forma que puedes volver a cargar el firmware via TFTP. En los posts comentan que existe una herramienta oficial de Cisco para recuperar el firmware pero desafortunamente todos los links apuntaban para el RV042 v1/v2.

Al seguir "googleando" encontré la herramienta de recuperación de firmware para la V3, en este link la puedes descargar:

Aplicando la solución oficial - fallida

La solución oficial de Cisco se detalla de la siguiente forma:

1.- Descargar la utileria de recuperación de firmware a tu computadora.
2.- Fijar tu tarjeta de red con IP fija en el siguiente rango de red: 192.168.1.0/24.
3.- Desconectar el router de la toma de corriente:
 3.1.- Presionar y mantener presionar el botón de reset.
 3.2.- Conectar el router a la tomar de corriente (manteniendo presionar el botón de reset), por 5 segundos.
4.- Realizar un ping a la IP del router (192.168.1.1) para cerciorarnos que se encuentra en modo "boot loader".
5.- Ejecutar la aplicación de recuperación de firmware (.exe).

En mi caso, llegué hasta el punto #4 con éxito, pero al intentar restaurar el firmware con la aplicación, me mostraba el siguiente error:

Firmware Rescue Utility (error).

Solución exitosa

TFTP es un protocolo de transferencia de archivos sumamente simple, se utiliza para cargar configuraciones, no requiere autenticación y funciona sobre el puerto UDP 69.

Por lo que puedes actualizar el firmware utilizando otra aplicación:

1.- Descargas TFTP32 by Ph. Jounin (Windows Vista en adelante también tiene integrado su cliente de TFTP via consola de commandos).
2.- Configuras el equipo hasta el punto #4 de la solución anterior.
3.- Ejecutas TFTP y seleccionas la pestaña "TFTP Client", para agregar los siguientes parámetros:
 3.1.- Host: 192.168.1.1
 3.2.- Local file: seleccionas la imagen del firmware que intentaste cargar (con la que comenzó todo este problema), también puedes restaurar otra versión de firmware.
  3.3.- Block size: default
4.- Das click en "PUT".
5.- Esperas a que el software cargue la imagen (se muestra una barra de progreso).

TFTP32

Una vez concluida la carga del firmware, en automático el router se reinicia, por lo que solo es cuestion de esperar a su restauración/reinicio.

Listo, hemos recuperado un RV042 V3 de una imagen de firmware dañada.

Fuentes:


  • https://supportforums.cisco.com/discussion/11080591/rv042-diag-led-blinking
  • https://supportforums.cisco.com/discussion/11081721/rv042-firmware-flash-utility

Wednesday, July 9, 2014

SQUID / No se puede acceder a Interjet

Antecedentes

Uno de los usuarios argumentó que no podía acceder a la pagina de Interjet. Este usuario utilizaba una pagina de convenio, la cual, al ingresar un código correctamente, redirecciona a una sección dentro de http://www.interjet.com.mx la cual todos los vuelos incluyen cierto  porcentaje de descuento.

Introducción

Ingresando al sitio de convenio con proxy, al rediccionar a Interjet, este manda a un sitio de nombre:
  • http://200.57.159.179/SorryPage/
El famoso "SorryPage" redirecciona a una pequeña sección de búsqueda de vuelos pero sin descuento.

Y cabe señalar que ingresando directamente al sitio de interjet con proxy redirecciona a esta misma sección de "SorryPage".

Por otro lado, ingresando al sitio de convenio sin proxy, este redirecciona correctamente a la sección de buscar vuelos con descuento, dentro del sitio web de Interjet.

Solución

Al ingresar a http://ww.interjet.com.mx, se puede apreciar que detecta el lenguaje del "User-Agent" (navegador) para desplegar sitio en el idioma y el país de compra. Lo cual no se me hace correcto, ya que es de lo más normal utilizar el navegador en otro idioma (sobre todo en Ingles).
Para esto, los programadores de Interjet hacen uso del request header "HTTP_ACCEPT_LANGUAGE".

Esto me hizo pensar en que estarían utilizando algún request header para filtrar el acceso.

Para saber que "request headers" manda SQUID, podemos utilizar un pequeño script de PHP el cual lea todos estos valores accediendo a el sin proxy y con proxy.

El sencillo script de PHP se muestra como:

// Leemos todos las variables del servidor
foreach ($_SERVER as $name => $value){ 
  if (substr($name, 0, 5) == 'HTTP_') 
               $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 
  }
// Imprimimos los resultados
var_dump($headers); 

El resultado de este script entrando desde Chrome sin proxy es:

array(8) {
  ["Accept"]=>
  string(74) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
  ["Accept-Encoding"]=>
  string(17) "gzip,deflate,sdch"
  ["Accept-Language"]=>
  string(45) "es-419,es;q=0.8,en-US;q=0.6,en;q=0.4,fr;q=0.2"
  ["Cache-Control"]=>
  string(9) "max-age=0"
  ["Connection"]=>
  string(10) "keep-alive"
  ["Cookie"]=>
  string(58) "PHPSESSID=776d3499930de3eea3027f76d3bee0ba; __atuvc=2%7C25"
  ["Host"]=>
  string(16) "paralizabal.com"
  ["User-Agent"]=>
  string(109) "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
}

Y el resultado del mismo script desde Chrome pero con proxy es:

array(10) {
  ["Accept"]=>
  string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  ["Accept-Encoding"]=>
  string(21) "identity,gzip,deflate"
  ["Accept-Language"]=>
  string(59) "es-MX,es-ES;q=0.8,es-AR;q=0.7,es;q=0.5,en-US;q=0.3,en;q=0.2"
  ["Cache-Control"]=>
  string(14) "max-age=259200"
  ["Connection"]=>
  string(10) "keep-alive"
  ["Cookie"]=>
  string(172) "_ga=GA1.3.1925363739.1393444304; __utma=88164442.1925363739.1393444304.1399225959.1399482628.2; __utmz=88164442.1399225959.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
  ["Host"]=>
  string(16) "paralizabal.com"
  ["User-Agent"]=>
  string(72) "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0"
  ["X-Forwarded-For"]=>
  string(7) "192.168.1.100"
}

Con esto podemos apreciar que la diferencia es el encabezado "X-Forwarded-For", el cual indica la IP original del cliente conectado a un servidor web mediante un HTTP-Proxy o Load balancer, estándar sugerido, precisamente, por los desarrolladores de SQUID.

 Así que la solución final es deshabilidar este encabezado en SQUID, de forma muy sencilla, agregamos en el archivo squid.conf la siguiente línea:

forwarded_for on

Reiniciamos SQUID y listo!, podemos entrar al sitio principal de http://ww.interjet.com.mx.

Friday, July 4, 2014

Dado un string, analizarlo y convertirlo a palindrome en caso que sea posible

Antecedentes

En una entrevista de trabajo me pidieron realizar la siguiente actividad: "Desarrollar una función la cual recibirá un string, analizarlo y tratar de convertirlo a palindrome". No precisamente el string estará en el mismo orden, por ejemplo, la función puede recibir ->  SSUUG la cual en su versión palindrome sería SUGUS.

Introducción

El error que cometí fue el estar pensando en el detalle de las posibles combinaciones, en mi mente estaba:

Posibilidades de crear una palabra palindrome dependiendo su longitud

2 -> 2
3 -> 2-1
4 -> 4, 2-2
5 -> 2-2-1
6 -> 6, 4-2, 2-2-2
7 -> 6-1, 4-2-1, 2-2-2-1
8 -> 8, 6-2, 4-4, 4-2-2, 2-2-2-2
9 -> 8-1, 6-2-1, 4-4-1, 4-2-2-1, 2-2-2-2-1
10 -> 10, 8-2, 6-4, 4-4-2, 4-2-2-2-2, 2-2-2-2-2

Por lo que después de haber creado la función en base a la lógica más complicada, pensé en lo que el entrevistador me dijo al final: "Solo puede haber un fallo".

En efecto, las letras se deben presentar en pares y si se tiene 2 letras individuales diferentes, no es posible convertirla a palindrome.

Solución

La solución queda detallada de la siguiente forma:

1.- Crear un array con las letras únicas y las veces en que se repite (desde aquí se puede hacer la validación de palindrome pero yo decidí hacerlo en el paso #2).
2.- Imprimir las palabras del array en forma palindrome.

El código en javascript se ve así:




Y aquí un pequeño demo: