viernes, 27 de enero de 2017

Error de SOAP: couldn't load from file: failed to load external entity


SOAP-ERROR: Parsing WSDL: Couldn't load from 'file:/path/file.wsdl' : failed to load external entity "file:/path/file.wsdl"
En Debian jessy (8), hay un error al llamar un documento WSDL del lado servidor en PHP que vincule a otro documento WSDL con el tag “import”. Por ejemplo:
Sin embargo, esto no sucede en Centos 6.5 por ejemplo. En la especificación de WSDL 1.1 https://www.w3.org/TR/wsdl dice:
 
...
2.1.1 Document Naming and Linking
WSDL documents can be assigned an optional name attribute of type NCNAME that serves as a lightweight form of documentation. Optionally, a targetNamespace attribute of type URI may be specified. The URI MUST NOT be a relative URI.
WSDL allows associating a namespace with a document location using an import statement:
<pre class="western"><definitions ....=""> </definitions></pre>
...
En este caso, para Centos funciona, pero para Debian no.
Mi solución fue del lado servidor cambiar el llamado al WSDL de archivo a una url HTTP:
asi se llamaba:
file://ruta/file.wsdl
y asi se llama ahora
http://localhost/ruta/file.wsdl.
Espero les sirva el tip.

miércoles, 10 de diciembre de 2014

Resolviendo el error "FATAL ERROR: EXCEPTION THROWN WITHOUT A STACK FRAME IN UNKNOWN ON LINE 0"

Recientemente ha resultado un error de código bastante extraño y de difícil solución en nuestro sitio Web. Este error como ven es bastante críptico:

FATAL ERROR: EXCEPTION THROWN WITHOUT A STACK FRAME IN UNKNOWN ON LINE 0

Habla sobre una excepción lanzada y en la linea cero, sin embargo no indica el archivo ni la linea del código, por lo que se hace difícil su depuración.

En varios foros de stackoverflow aparecen posibles soluciones a este problema:
http://stackoverflow.com/questions/10485371/baffled-php-fatal-error-exception-thrown-without-a-stack-frame-in-unknown-on-l
http://stackoverflow.com/questions/5440640/session-saving-problem-getting-php-fatal-error-exception-thrown-without-a-stac
http://stackoverflow.com/questions/4624223/object-in-session-fatal-error-exception-thrown-without-a-stack-frame-in-unknow

Según comentan en estos foros, a veces sucede cuando intervienen las sesiones. Así que busque el código que guarda los datos en sesión y pude aislar el código problema:

$objeto_xml = new  SimpleXmlElement($xml) ;

$_SESSION['id_envio'] =  $objeto_xml->id ;

Como ven se esta asignando un objeto a la sesión. Al terminar el programa, PHP intenta guardar el objeto retornado por simpleXml y al parecer el metodo __destruct de simplexml que lanza una excepcion que produce el error. Pues bien, la solución fue sustituir la segunda linea de código por

$_SESSION['id_envio'] =  (int)$objeto_xml->id ;

y listo, no mas errores en el código.

miércoles, 11 de abril de 2012

WWW.RADIOMACONDO.FM: ¿Qué se aprobó en el proyecto de Ley 201?

WWW.RADIOMACONDO.FM: ¿Qué se aprobó en el proyecto de Ley 201?: Dos días antes de que el presidente de los Estados Unidos, Barack Obama, pise suelo colombiano, tanto el Senado como la Cámara de Representa...

lunes, 9 de abril de 2012

solucionar problemas de sonido en gateway 3522gz en linux

como solucionar problemas de sonido en gateway 3522gz
en linux ubuntu

Fecha: 2012-abril-9

problema:
no hay sonido.

Detalle del problema:
La versión de  ubuntu es oneiric 11.10
el driver esta instalado y el hardware de la tarjeta de sonido son detectados.
No aparecen errores en dmesg o errores al reproducir un sonido.

solución:
Al parecer la instalación por defecto del driver hace que quede activada una opción que no se usa en la configuración de sonido de Ubuntu y esto ocasiona que el sonido este muteado.

Lo que se debe hacer es instalar el programa de configuración de la tarjeta y despues configurarla.

Primero se debe instalar gnome-alsamixer, aplicación que muestra opciones extendidas de configuración de la tarjeta de sonido.

sudo apt-get install gnome-alsamixer

Al iniciar este programa se debe desactivar la casilla que indica "External Amplifier".

si esto no funciona, verificar que exista algun nivel de audio en el canal master, en PCM y en stereo.

Si esto no llegara a funcionar, probar seleccionando y deseleccionando las casillas mostradas una por una.

miércoles, 11 de enero de 2012

Replicación en MySQL

INTRO

Aunque he trabajado con MYSQL desde hace más de 8 años, no había tenido la oportunidad de usar en forma la bien conocida característica de replicación en MYSQL. Esta característica permite duplicar en línea los datos de un servidor a otro y es altamente configurable. Lamentablemente o afortunadamente, he tenido unos tropiezos para configurar los servidores y ajustarlos de la manera en que los necesito. En este escrito resumo la configuración de una replicación de dos servidores maestro-esclavo.

HISTORIA

Inicialmente había la necesidad de disminuir la carga de un servidor cuyas actualizaciones e inserciones eran frecuentes y que esporádicamente se consultaba. El problema consistía en que cuando los registros pasaban del millón, las consultas se hacían supremamente lentas y lo peor del caso era que las consultas hacían que algunos procesos de inserción abortaran por timeout. Al no poder crecer en hardware lo que se hizo fuépensar inmediatamente en alguna forma de copia de la BD a otro servidor. Sin embargo la Base de datos es bastante grande por lo que esto se descartó. Se pensó entonces en usar el sistema de replicación nativa de Mysql y ver como se comportaba.

Replicación remota

Basicamente se hizo todo el proceso desde cero:

  • Se configuró el servidor maestro
  • Se bloqueó la BD para no permitir escritura
  • Se hizo un Dump de la BD
  • Se copió la BD remotamente. Esta parte fue algo demorada.
  • Se desbloqueo la BD
  • Se hizo el import al nuevo servidor
  • Se activó la replicación en el servidor esclavo

Luego de un tiempo se hizo una revisión del servidor esclavo y apareció inicialmente con errores de consultas SQL. Poco tiempo después al poder resolver el problema también aparecía con otro tipo de errores y había que “saltar” ciertas consultas leidas con errores para que continuara la replicación.

El caso es que después de varios saltos hechos manualmente a las consultas y a los logs, la replicación ya no se pudo recuperar y toco empezar de cero la copia y volver a replicar. Despues de varios intentos fallidos con la replicación remota se decidió por cambiar la forma de copiar la información local.

Replicación Local

La conclusión a la que se llegó es que como la replicación se hacía a través de equipos que pertenecen a redes remotas, y como el número de transacciones por segundo es alto, hay una gran probabilidad de que la replicación falle en algún punto. Es decir, la replicación configurada no sirve para redes con pérdida considerable de paquetes de datos.

El método de replicación que funcionó fue dejar el servidor de replica dentro de la misma máquina, aunque supongo que debería funcionar dentro de una LAN, o una red lo suficientemente rápida que permita el transporte confiable de datos.

Se instaló en el mismo equipo un servidor MYSQL en un puerto alterno que serviría como esclavo. A continuación explico la configuraciones paso a paso para complatar la replicación.

PASOS DE CONFIGURACION

Se configura el maestro para que permita la conexión del servidor esclavo:

log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db=exampledb
server-id=1

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY ''; (reemplace con el password real)
FLUSH PRIVILEGES;

Desde una consola del Maestro se ejecuta el comando siguiente para bloquear la escritura de tablas:

USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Lo que muestra una información parecida a:

+---------------+----------+--------------+------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+--------------+------------------+
| mysql-bin.006 | 183 | exampledb | |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Con este comando se verifica el estado de los logs y la posición. Esta información se usará mas tarde.Esta conexión se deja abierta mientras termina el proceso de replicación.

En otra consola, se hace el respectivo backup de la base o bases de datos a replicar:

mysqldump -u root -p --opt exampledb > exampledb.sql (Reemplace con el password real de MySQL)

En el mysql esclavo se ejecuta el siguiente comando para realizar el import de la bd

mysql -u root -p
Enter password:
CREATE DATABASE exampledb;
quit;

mysql -u root -p exampledb < /path/to/exampledb.sql

La consola del maestro inicial se puede cerrar en este momento. Ejecutar en la linea de comandos de mysql:

mysql> UNLOCK TABLES;

Se debe editar el archivo de configuracion/etc/mysql.cnf en el esclavo para activar la replicación:

server-id=2
master-host=192.168.0.100
master-user=slave_user
master-password=secret
master-connect-retry=60
replicate-do-db=exampledb

y después reiniciar el MySQL.

Luego se abre una consola de mysql en el esclavo y se ejecuta este comando con los datos de posición del archivo copiados antes:

STOP SLAVE;

CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='slave_user', MASTER_PASSWORD='', MASTER_LOG_FILE='mysql-bin.006', MASTER_LOG_POS=183;

START SLAVE;

Para verificar el estado de la replicación se ejecuta el sgte comando:

SHOW SLAVE STATUS\G

Entre las cosas mas importantes a verificar en esta salida es verificar que estas dos líneas estén en Yes:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Referencias:

http://www.howtoforge.com/mysql_database_replication

http://www.howtoforge.com/how-to-set-up-database-replication-in-mysql-on-ubuntu-9.10

http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html


miércoles, 16 de febrero de 2011

About CodeIgniter

Between the frameworks I have managed, I consider CodeIgniter is one of the most to develop quality web sites quickly. It shows great versatiliy, is fast because not load too much libraries at beginning and has a rapid learning curve.

I’m working for more than two years with this tool and I thinks is very useful to create web sites, mainly if they use a database. Once you learn to work with it, the developing of the application is immediately.

Basically, CodeIgniter is a tool what uses OOP or Object Oriented Programming and uses MVC (Model/View/Controller) design pattern that let us to divide the developing segments in individual parts. The model let us create the queries to the database, the view is used to visualize and organize the HTML code; and the controller controls all the logic of interaction with the user. This division lowers the errors when you are debugging code and permits a better organization to the code structure.

Advantages

Between the advantages I can mention the faster loading. Because uses few libraries when is starting, CodeIgniter can load the controllers faster.

It owns a quick learning curve. If you know about OOP of course, You can handle this tool more faster in a intuitive manner, since the libraries and functions are few. The manual provided with the application is clear and it explains its internal functionally and the description of main library methods directly.

It manages Active Record. This functionality let make logic sequences of simple queries, which eases time developing.

Interaction with new libraries. It’s easy to develop custom libraries that are called by different controllers.

Disadvantages

Lack of plugin to create CRUD libraries automatically. I suggest should exist such tool in professional editors like Aptana, so one can generate the PHP code from a database model.

Use of CLI to run commands on shell, for example crontabs. Although, according to news, some future version will include this feature.

Suggested Editors

Aptana is a PHP versatile editor that supports from 4 to 5.3 PHP versions. It identifies the PHP language structure and detects syntax errors. Is very useful.

If you need an WYSIWYG editor, you can try Dreamweaver.

CodeIgniter can be downloaded from the website: http://codeigniter.com

Acerca de CodeIgniter

Entre los frameworks que he manejado considero que CodeIgniter es uno de los mejores a la hora de desarrollar rápidamente sitios web de calidad. Presenta una gran versatilidad, es rápido por su baja carga de librerías y tiene una curva rápida de aprendizaje.

Llevo más de 2 años trabajando con esta herramienta y me ha parecido muy útil a la hora de crear sitios web que interactúen con bases de datos. Una vez se aprende a trabajar con la herramienta, el desarrollo de la aplicación es inmediato.

Basicamente CodeIgniter es una herramienta que usa POO, o Programación Orientada a Objetos y utiliza el patrón de diseño MVC(modelo/vista/controlador) que permite separar los segmentos de desarrollo en partes independientes. El modelo permite crear las consultas a bases de datos, La vista permiten el manejo del código HTML y parte visual básica, y el controlador permite el manejo de toda la lógica de interacción con el usuario. Esta separación minimiza los errores a la hora de depurar el código y le da una mayor organización a la estructura de código.

Ventajas

Dentro de las ventajas que posee este framework se pueden mencionar su rapidez de carga. Al llamar a pocas librerías en el momento de arrancar, permite cargar velozmente las páginas.

Posee una curva rápida de aprendizaje. Si se tiene conocimiento previo de POO claro esta, se puede aprender a manejar la herramienta rápidamente y de manera intuitiva, pues las librerías y funciones a manejar no son muchas. El manual es muy claro y explica su funcionamiento interno y la descripción de los métodos de las librerías principales.

Maneja Registro Activo en BD. Esto permite crear secuencias lógicas de consultas simples, lo que facilita el tiempo de desarrollo.

Interacción con nuevas librerías. Es fácil crear librerías personalizadas que interactúen con varios controladores.

Desventajas

Falta de plugins para la creación de Librerías CRUD. Sugiero que debe existir en editores profesionales tales como Aptana algún plugin que permita crear código de CodeIgniter a partir de un modelo de BD.

Uso de CLI(command line input). Es necesario el uso de CLI para ejecutar comandos que deben correr por un Shell, como por ejemplo crontabs. Sin embargo, según noticias, en próximas versiones lo piensan incluir.

Editores sugeridos

Aptana es un editor de PHP versátil, que soporta versiones de php desde la 4 hasta la 5.3. Reconoce la estructura de lenguaje de PHP e incluso detecta errores de sintaxis.

Si se necesita un editor WYSIWYG, se puede optar usar como complemento a DreamWeaver.

Esta aplicación la pueden descargar en http://codeigniter.com