Ayer mientras trabajábamos en la nueva versión de mivecindad.com tuvimos que importar al modelo de datos el listado de países del mundo en varios idiomas. Esta información la obtuvimos de Geonames en formato XML (también hay otros formatos). La primera opción fue usar LOAD XML de MySQL, pero la versión de MySQL que tenía en mi entorno no soportaba este comando. Fue entonces cuando decidí hacer un pequeño script en PHP para procesar el archivo XML y posteriormente insertarlo en la base de datos. De ahí obtuve el SQL que podré reutilizar en otros proyectos y compartirlo con nuestros compañeros de Toolea.
El motivo de escribir esta pequeña entrada es para que no se me olvide que si queremos trabajar con MySQL y utf-8, y lo hacemos usando en API de PHP (sin librerías ni frameworks) no se nos puede olvidar indicar que nuestra sesión con MySQL (que actúa de cliente) use utf-8. Por muy a pesar de que MySQL tenga configurado en el servidor que su encoding por defecto sea utf-8. Eso sirve, entre otras cosas, para la creación de nuevos esquemas.
Os dejo un ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $xml = simplexml_load_file('/home/recena/countries_es.xml');
$link = mysql_connect('localhost', 'root', '');
mysql_select_db('mivecindad', $link);
if(!$link) {
die('No pudo conectarse: ' . mysql_error());
}
mysql_query("SET NAMES 'utf8';");
foreach($xml as $key => $value) {
$capital = mysql_real_escape_string($value->capital);
$sql = "INSERT INTO MV_PAIS (CAPITAL) VALUES('".$capital."')";
$result = mysql_query($sql);
if(!$result) {
die('Invalid query: ' . mysql_error());
}
}
mysql_close($link); |
La semana pasada, mientras trabajaba en el sitio web de mivecindad.com necesité trabajar con JSON dado que la capa de servicios que tiene la aplicación así lo requiere. La comunicación entre el sitio web y la aplicación es muy básica, un formulario recoge los datos para registrar una comunidad, se genera el JSON, se envía y posteriormente se valida el resultado de la operación.
Para el sitio web estamos usando yii framework y el pequeño modelo (datos) que necesitamos (persona, dirección, comunidad) se construye según la propuesta del framework. Me dejé llevar pensado que luego tendría la posibilidad de generar mi JSON según lo requiere el servicio y me encontré bastante limitado.
En mi entorno de desarrollo tengo compilado PHP con soporte (nativo, parte del core de PHP) para JSON. Lo probé, no conseguí hacer lo que necesitaba sin reinventar la rueda en el framework, y decidí buscar algo de información para conocer qué otras opciones tenía. La idea era encontrar alguna librería que me permitiese manipular JSON con mayor flexibilidad.
- Extensión de PECL. Realmente no es una opción porque esta extensión es la que ahora forma parte del core de PHP y está muy limitada.
- Service JSON. Un paquete de PEAR cuya última versión fue publicada a comienzos de este año. Al igual que la anterior, muy limitada.
- Zend_JSON. Realmente tampoco era una opción porque no estoy usando Zend framework, pero es bueno saber que está ahí.
Hay algunas (pocas) opciones más pero ninguna hacía lo que necesitaba. Tengo que reconocer que vengo muy condicionado porque en Java sí existen librerías que permiten una mayor manipulación en la codificación. Concretamente en nuestros últimos proyectos estamos usando FlexJSON (v.2.0b4, aunque ya está publicada la v2.1).
¿Realicé una mala búsqueda de información o realmente lo que está publicado se limita a decode/encode? Cualquier sugerencia será bienvenida para completar esta pequeña entrada en el blog.
Finalmente decidí hacer algo muy simple pero no por ello menos eficaz. Comprobé que si en lugar de trabajar con objetos, trabajaba con un array asociativo, podía obtener el JSON que necesitaba, por lo tanto, creé dicho array a partir de los datos almacenados en el modelo (clases de yii framework). Dejo una última referencia con una comparativa interesante.
Desarrollando en sitio web de mivecindad.com nos surgió la necesidad de integrar el timeline de la cuenta en twitter de @mivecindad. Para este desarrollo estamos usando Yii Framework y la extensión que hay no soporta OAuth. Hemos decidido modificar la extensión para añadir esta mejora.
Como recordatorio, y por si a alguien le pudiera ser de interés, algunos apuntes sobre la instalación. Indicar que para este entorno de desarrollo estoy usando Ubuntu y tirando de paquetes (nada de compilar por raro que parezca en mi):
- Comprobar que tenéis PEAR y en caso negativo instalarlo.
- Comprobar que tenéis el paquete de desarrollo de PHP (php5-dev). Nos daremos cuenta fácilmente que lo necesitamos porque durante la compilación de la extensión nos dirá que no encuentra la herramienta phpize.
- [opcional] Comprobar que tenéis CURL y su paquete de desarrollo
- Instalación de la extensión: sudo pecl install oauth
- En el directorio /etc/php5/conf.d creamos un archivo llamado oauth.ini (podéis llamarlo como queráis) e incluis la siguiente línea:
extension=/usr/lib/php5/20060613+lfs/oauth.so
- Reiniciamos el servidor web e invocamos al conocido testphp.php con su llamada a phpinfo() para asegurarnos de que la extensión está disponible y se ha cargado correctamente.
Le enviaré al autor de la extensión (yii) nuestros cambios confiando que aplique el parche y publique una nueva versión. Leyendo un poco en su blog he podido comprobar que está trabajando en una herramienta de gestión de proyectos similar a Trac y Redmine. Le seguiré el rastro para ver su evolución.
A finales de agosto del año pasado comencé un nuevo proyecto, un plugin para Trac que permitiese su integración con Alfresco. Desde entonces mucho ha llovido, especialmente este año. Cuando comencé no encontré ninguna librería que facilitase el trabajo con el Restful API que proporciona Alfresco y comencé un pequeño cliente para este proyecto. Más adelante pensé que si el cliente maduraba, quizás me convendría liberarlo de forma independiente al plugin para que otros pudieran evolucionarlo y mejorarlo. Yo sólo quería implementar los métodos más básicos.
Los momentos de standby son realmente malos para cualquier proyecto, pero lo son especialmente para proyectos en los que sólo hay una persona y su planificación no se extiende más allá de tres meses para la primera versión. Con el nacimiento de klicap, decidimos impulsar este plugin y en ello estamos. Antes de retomarlo, analicé el trabajo realizado y me cuestioné algunas decisiones previas. Durante esos días, descubrí cmislib. Según he pedido comprobar, su primer commit tiene fecha de mediados de diciembre de 2009. Su autor es Jeff Potts, presidente y CEO en Metaversant Group, Inc., donde parece que es el único empleado. Esta librería, escrita en python, forma parte del proyecto (en incubación) Apache Chemistry. Éste último tiene como objetivo proporcionar librerías cliente para trabajar con soluciones que implementen la especificación CMIS. La librería no está completa, aun quedan funcionalidades por implementar, pero desde luego su última versión 0.3 publicada es estable y cubre gran parte de la especificación. Teniendo en cuenta que la versión 1.0 de la especificación de CMIS tiene fecha 1 de mayo de 2010, sólo me queda agradecer el excelente trabajo de Jeff.
Esto se traduce en que he dejado de implementar mi propio cliente, y he comenzado a usar esta librería. Esto hace incluso que me planté el nombre del plugin, porque ahora podemos integrar Trac con Alfresco, Nuxeo y otros ECM que implementen CMIS. Desde @klicap haremos lo posible por colaborar en este proyecto.
Para el plugin de Trac que estoy desarrollando (en los huecos que tengo) estoy desarrollando un pequeño cliente en python que me permita trabajar cómodamente con Alfresco REST API, especialmente con CMIS Web Reference. Uno de los métodos que necesitaba para este cliente es aquel que me permitiese comprobar si la configuración para trabajar con el API era correcta. Comprobar eso lleva implícito comprobar que Alfresco está disponible (se tiene acceso HTTP).
La configuración del plugin en relación a Alfresco es muy simple:
- Usuario y contraseña (credenciales)
- URL base en la que se publica RESTful API
Dejo por aquí el fragmento de código:
def is_alive(self):
isAlive_service = self.__url_api + '/login' + '?u=dummy&pw=dummy'
self.__log.debug('Restful Service: ' + isAlive_service)
try:
response, content = self.__http.request(isAlive_service, 'GET')
if response.status == httplib.FORBIDDEN:
self.__log.debug('Alfresco RESTful API is alive')
return True
else:
self.__log.debug('Alfresco RESTful API is not alive')
return False
except:
self.__log.debug('Alfresco RESTful API is not alive')
return False
Cualquier sugerencia será bienvenida.
Recent Comments