jueves, 18 de octubre de 2012

PHP has encountered an Access Violation at 00000000 openssl

Un amigo después de tener trabajando en un servidor una aplicación con manejo de openssl y php (para facturas electrónicas), el equipo falló entonces tuvo que mudarlo a otro servidor el cuál ya tenía instalado PHP pero al pasarlo al otro servidor nos topamos con el siguiente error:

- PHP has encountered an Access Violation at 00000000 -

Después de que estuvo revisando nos encontramos que el error se producía cuando trataba de ejecutar el comando openssl_sign() a pesar de que al correr un phpinfo parecía que todo estaba configurado correctamente (ya se imaginarán nuestra frustración sin poder generar facturas).

Tuvimos que hacer varias cosas para poder resolver este problema (quizá alla otras mejores pero esta fue la que nos funciono):

1 - Instalación del OpenSSL

La instalación del OpenSSL, no estaba funcionando, por lo que tuvimos que desinstalar por completo la aplicación y reinstalarla, en este sitio http://slproweb.com/products/Win32OpenSSL.html se puede descargar la versión que utilizamos fue la Win32 OpenSSL v0.9.8x.

2 - Hacer utilizando el comando directamente

Intentamos nuevamente utilizando el comando openssl_sign() pero siguió fallando, entonces cambiamos de utilizarlo de esa forma y mejor llamar directamente al comando utilizando shell_exec() pero el problema es que al ejecutar la instruccion openssl dgst ... etc., no pasaba absolutamente nada, no marcaba error ni tampoco existía alguna entrada en el log.

El problema eran dos cosas:
a) El comando que se debe utilizar para los ejecutables para tener un poco de control en el proceso es popen() aquí algo de info del comando:  http://php.net/manual/es/function.popen.php .

La forma en que lo utilizamos fue:
------- error_reporting(E_ALL); $gestor = popen($ComandoOpenSSL.' 2>&1', 'r'); //Estos comandos son para depurar solamente // $leer = fread($gestor, 2096); // echo " --> contenido: $leer "; pclose($gestor); -----


b) Los permisos de usuario el shell_exec y el popen no funcionaban o no hacían nada debido a los permisos de usuario, la aplicación esta montada sobre un IIS por lo que era necesario darle permisos al usuario de invitado de internet, es decir al clásico IUSR_NOMBREEQUIPO para esto encontramos este sitio: http://www.somacon.com/p255.php.

Básicamente se trata que al archivo si al cmd.exe y al directorio c:\OpenSSL se le den permisos de lectura y ejecución al usuario IUSR_NOMBREEQUIPO es posible dependiendo de lo que haga su aplicación si requieren en uno u otro darle permiso de escritura.


Una vez realizado lo anterior por fin logramos reactivar el servicio :)


Espero te sea de utilidad.

Otras Referencias:
http://www.madboa.com/geek/openssl/
http://www.openssl.org/
http://www.php.net/manual/es/openssl.requirements.php
http://actron.wordpress.com/2010/11/16/facturacion-electronica-sello-openssl-php/
http://actron.wordpress.com/2010/11/18/facturacion-electronica-sello-php-y-openssl-mas-rapido/


miércoles, 17 de octubre de 2012

Python :: Obtener de la Fecha Actual el Día, Mes y Año

El manejo de Fechas en Python considero es de lo más sencillo por lo pronto he necesitado saber el día, mes y año.

Es muy simple aquí el código:


dimefecha.py
__________________________

# -*- coding: utf8 -*- 

from datetime import date
d = date.today()
print "Día: ",d.day
print "Mes: ",d.month
print "Año: ",d.year
__________________________

NOTA: La parte que tiene # -*- coding: utf8 -*-  es para que acepte caracteres especiales en UTF-8 como acentos y ñ.


Genial así de simple, dejo algo más de info, ojalá te sea de utilidad.



Referencias:
http://docs.python.org/library/datetime.html
http://effbot.org/librarybook/datetime.htm
http://stackoverflow.com/questions/6289474/working-with-utf-8-encoding-in-python-source

martes, 9 de octubre de 2012

Django + GraphViz + Mountain Lion

GraphViz es una herramienta muy útil para generar automáticamente diagramas UML de las clases que se tienen en un proyecto, tuve algunos detalles para instalarlos en Mountain Lion, y al final los pasos se resumen en lo siguiente:

  • Instalar GraphViz la herramienta que nos permitirá ver los diagramas, el cuál se puede descargar desde aquí: http://www.graphviz.org/Download_macos.php
    • En mi caso descargue la versión: graphviz-2.29.20121009.0445.pkg, que esta en el área de desarrollo.
  • Posteriormente es necesario instalar PyGraphViz que es la herramienta que enlaza a Python con GraphViz aquí fue donde tuve algunos detalles, por lo que tuve que descargarlo utilizando el siguiente comando:
    • $sudo svn co https://networkx.lanl.gov/svn/pygraphviz/trunk pygraphviz
  • Con lo anterior se creará un directorio en el equipo es importante que modifiques los permisos al directorio como lectura y escritura.
  • Posteriormente modificar el archivo setup.py, esto es las líneas:
# OSX, Linux, alternate location
library_path='/usr/local/lib/graphviz'
include_path='/usr/local/include/graphviz' 
NOTA: Se debe quitar el # para descomentar, una vez realizado esto guardar el archivo.
    • Posteriormente ejecutar el siguiente comando:
      • $ python setup.py build
    • Y Finalmente utilizar:
      • $ python setup.py install
    Con lo anterior deberá quedar instalado la herramienta, para generar el diagrama dentro del directorio de proyecto se puede utilizar:

    $ python manage.py graph_models --all-applications -g --output=miproyecto_uml.dot

    Una vez ejecutado el comando se generará el archivo miproyecto_uml.dot que se puede abrir con el programa GraphViz que quedo instalado en el segundo paso.

    Con la siguiente instrucción solo realizará el diagrama de la aplicación miaplicacion:

    $ python manage.py graph_models miaplicacion -g -o miaplicacion_uml.dot

    Utilizando $ python manage.py graph_models --help se puede ver un listado de comandos que se pueden utilizar.


    Saludos y espero te sea de utilidad.


    jueves, 4 de octubre de 2012

    Python y MySQL en OS X Mountain Lion

    Primero debe descargar el MySQL para Mac e instalarlo.

    Posteriormente deberá descargar la utilidad de http://sourceforge.net/projects/mysql-python/, también para los amantes de la terminal pueden utilizar los siguientes comandos:

    $ wget http://superb-dca2.dl.sourceforge.net/project/mysql-python/mysql-python-test/1.2.4b4/MySQL-python-1.2.4b4.tar.gz 

    $ tar -xf MySQL-python-1.2.4b4.tar.gz

    Una vez desempaquetado el archivo se debe editar el archivo de nombre site.cfg ubicando la línea que dice:

    #mysql_config = /usr/local/bin/mysql_config

    por:

    mysql_config = /usr/local/mysql/bin/mysql_config

    Es importante quitar el símbolo # para que deje de ser comentario y por otro lado verificar que el archivo mysql_config se encuentre en ese directorio como en mi caso. Una vez realizado lo anterior ahora se procede a correr el comando:

    $ sudo python setup.py build 

    Si no marco ningún warning o algún error quiere decir que vamos bien, ahora ejecutamos el siguiente comando:

    $ sudo python setup.py install 

    Finalmente corremos el siguiente comando:

    $ sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib 


    Este último comando debe arreglar un problema que se genera al querer utilizar la librería MySQLdb.
    -----------
    Traceback (most recent call last):
    File "", line 1, in
    File "/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/MySQLdb/__init__.py", line 19, in
    import _mysql
    ImportError: dlopen(/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib Referenced
    Referenced from: /Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/_mysql.so Reason
    Reason: image not found
    En este sitio fue donde encontre como arreglarlo:
    (http://stackoverflow.com/questions/13440147/mysqldb-for-python-2-7-on-osx-10-8-2-and-both-are-64-bit)

    -----------


    Para ver si quedo bien podemos entrar nuevamente a la consola de python con el comando $ python, y luego teclear:

    >>> import MySQLdb

    Si no aparecen errores entonces quedo listo !

    Espero te sea de utilidad.



    Referencias:
    http://luauf.com/2008/04/24/conectar-python-con-mysql/
    https://groups.google.com/forum/?fromgroups=#!topic/django-es/_NRYFHVSgtA
    http://nisthaonweb.com/blog/2012/02/setting-up-django-with-mysql-with-and-without-mamp/


    NOTA:

    Este post fue modificado el 17/01/2013 debido a que si se utilizaba la línea
    export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH

    Se generaba un error en OSX ML con la siguiente leyenda:
    dyld: DYLD_ environment variables being ignored because main executable (/usr/bin/sudo) is setuid or setgid

    martes, 2 de octubre de 2012

    Firebird campos multivalorados o con multivalores (multivalue) combinado con case


    El día de hoy me enfrente al detalle de obtener un reporte con multi-valores, esto es en una fila colocar los datos de una tabla y posteriormente en una sola celda aparezcan datos de otra tabla donde esta vinculada del tipo foreign key, dejo aqui la consulta para que sirva de referencia...


    select
    factura, fecha,

    case motivoservicio
    when 1 then 'Falla en Software'
    when 2 then 'Garantía'
    when 3 then 'Mantenimiento Preventivo'
    end as servicio,

    (select nombre from sucursales where CLAVE=r.clave) as sucursal,

    (select list(case id_tipo
    when 1 then 'Reinstalación'
    when 2 then 'Virus'
    when 3 then 'Configuración'
    when 4 then 'Otro'
    end,' / ')
    from tipos_soporte a
    where r.factura = a.factura group by a.factura) as soporte,

    from registro_servicios r
    where
    cancelado = 0 and
    fecha = '2012-10-02'


    Esto producirá un resultado como el siguiente:
    facturafechaserviciosucursalsoporte
    102912012-10-02Falla en SoftwareVallartaReinstalación / Virus
    102922012-10-02Falla en SoftwareVallartaVirus / Configuración
    103012012-10-02GarantíaCihuatlánOtro
    103062012-10-02GarantíaGuadalajaraVirus



    Es importante hacer mención que esta consulta será compatible con firebird versión 2.1 en delante, por el uso de LIST().

    Espero les sea de utilidad.


    Referencias:
    http://www.janus-software.com/fbmanual/manual.php?book=psql&topic=56
    http://www.developeando.com/2009/02/firebird-21-list-function.html
    http://www.firebirdsql.org/refdocs/langrefupd20-select.html#langrefupd20-aggregates
    http://www.firebirdsql.org/file/documentation/reference_manuals/user_manuals/html/migration-mssql-syntax.html
    http://www.firebirdsql.org/manual/nullguide-aggrfunc.html