domingo, 17 de noviembre de 2013

Symfony doble lista no guarda

Al crear una lista doble en symfony para romper una relación muchos a muchos, estas listas se crean y funciona correctamente el parecer, pero al tratar de guardar, no sale ningún error pero los datos no son almacenados.

Lo primero que hay que tener en cuenta es que ningún dato adicional a las llaves foráneas se guardan por la lista doble. Al parecer no se ejecuta el método save en el archivo tablarelacion.class.php del model.

De todas maneras mi problema era otro, al usar bootstrap se agrega a todos los campos la clase form-control. al revisar el script de la lista doble en la linea 43 se consulta si el nombre de la clase del elemento termina en -selected, al aplicar bootstrap la clase del elemento queda 'miclase-selected form-control' por lo tanto esta condición nunca se cumple y los datos seleccionados no son enviados con el formulario al realizar el submit.

#.../plugins/sfFormExtraPlugin/web/js/double_list.js
.
.
  submit: function(form, className)
  {
    var element;
    for (var i = 0; i < form.elements.length; i++)
    {
      element = form.elements[i];
      if (element.type == 'select-multiple')
      {
        if (element.className == className + '-selected')
        {
          for (var j = 0; j < element.options.length; j++)
          {
            element.options[j].selected = true;
          }
        }
      }
    }
  },
.
.

La solución (temporal) es no agregar una nueva clase al control en el widget así:

        $this->widgetSchema['campo_list']->setOption('renderer_class', 'sfWidgetFormSelectDoubleList');
        $this->widgetSchema['ccampo_list']->setOption('renderer_options', array('label_unassociated' => 'No asignadas:',
            'label_associated' => 'Asignadas:',
            'associated_first' => false,
            'class_select' => 'miclase')); 

En cambio solo se coloca el form-control de bootstrap, obviamente esto solo funciona si en el formulario solo ahí un campo de doble lista, si hay 2 deben tener nombres de clase diferentes.

La segunda opcion es modificar el double_list.js asi:

if (element.className == className + '-selected form-control')

Esto es muy poco flexible, cuando tenga la solución definitiva actualizare esta entrada.

jueves, 14 de noviembre de 2013

Symfony 1.4 Misterioso error Parse error: syntax error, unexpected ''id'' (T_CONSTANT_ENCAPSED_STRING), expecting ')' in ...

Luego de una sincronización un proyecto en symfony 1.4 basado en el admin generator empezó a escribir un caracter extraño en algunos archivos base Base...GeneratorConfiguration.class para mi caso una "y".

Nunca encontré el caracter en ninguna parte del código, ni borrar cache, ni cambiar permisos ayudó. La única solución fue comentar en el archivo Base...calss.php correspondiente el metodo setUp(), ejecutar el módulo y descomentarlo nuevamente, esto repara el archivo de la cache que presenta el error.

Actualización:
Finalmente esta fué una solucion temporal, revisando el proyecto, tenia ese caracter extraño en una de las clases del modelo, no tengo idea de como se propagaba a los otros modulos y no afectaba a ese donde estaba la letra "y".

...class.php
y<?php

lunes, 16 de septiembre de 2013

Renombrando cualquier archivo con su información de modificación

Ya hemos visto el programa pyRenamer que nos ayuda a renombrar archivos, sobre todo imagenes, lamentablemente no nos permite agregar la hora de creación a otro tipo de archivos que no sean imágenes.

Para resolverlo tendremos que usar algo de programación batch y usar este pequeño script:


Leer artículo completo!

lunes, 12 de agosto de 2013

Migrar permisos de mysql

Encontré este script que nos facilita la vida al momento de migrar los permisos de usuarios de mysql de una maquina a otra.

Solo tenemos que crear una pagina php con este código y nos entregara la lista de permisos en sql para ejecutarlos en el servidor destino.

<?php
//connect
mysql_select_db("mysql", mysql_connect("localhost","root",""));

//create grants select statements
$rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS query FROM user");

//iterate through grants
while ($row=mysql_fetch_array($rs)) {
    //run grant query
    $rs2 = mysql_query($row['query']);
    //iterate through results
    while($row2 = mysql_fetch_array($rs2)){
        //print results
        echo $row2[0] . ";<br>";
    }
}

?>

viernes, 12 de julio de 2013

Rotar imagenes segun infromacion exif

Aunque las nuevas cámaras guardan la informacion de rotación de las fotos, algunos visores o en algunos televisores las imágenes se verán mal rotadas, es aquí donde exiftran nos permite rotar las imágenes correctamente con esta informacion, así aseguraremos que las fotos se verán en la dirección correcta en cualquier dispositivo.

Una vez en el folder donde estan las imagenes que queremos rotar solo es necesario ejecutar el comando:

exiftran * -a -i -p

-a rota automáticamente dependiendo de la informacion exif
-i reemplaza las imágenes por las nuevas
-p mantiene la informacion de fecha del archivo

Renombrando imagenes con su informacion meta

El programa pyRenamer nos permite muchas opciones entre ellas renombrar archivos de imagen con su informacion como la fecha de modificación.

Una vez instalado podemos hacerlo en la pestaña "Imágenes"
Patrón de nombre de archivo original: {X}.{X}
Patrón de nombre de archivo nuevo: {imageyear}{imagemonth}{imageday}_{imagetime}.{2}
Patrón para simular las imágenes tomadas con celular android: {imageyear}-{imagemonth}-{imageday} {imagehour}.{imageminute}.{imagesecond}.{2}

Esto nos da como resultado nombre de archivo como "2013-06-27 07_31_47.jpg"

Así nuestras fotos quedarán bien ordenadas según el momento en que se tomo la foto.

lunes, 10 de junio de 2013

Thumbnails en Xubutu

Es necesario hacer un pequeño ajuste para poder ver los thumbnails de videos en el navegador de archivos, solo se necesita ejecutar estos dos comandos.

sudo apt-get install ffmpegthumbnailer -y
wget -q http://goo.gl/KofKV -O- | sudo tee /usr/share/thumbnailers/video.thumbnailer

martes, 28 de mayo de 2013

http-bind no redirecciona al servidor openfire

Cuando se configura el subdominio y se agrega el rewrite rule para la redirección del http-bind, además de activar el modulo rewrite en el apache también es necesario activar el modulo proxy.

lunes, 20 de mayo de 2013

Buscar archivos en Ubuntu modificados en una fecha en especial

El buscador de Ubuntu de verdad que da pena, nunca me ha gustado, cuando tuve problemas para encontrar un archivo sabiendo exactamente la fecha en la que lo modifique encontré esta instrucción:

Archivos modificados el 10 de Mayo de 2013 en el home

$ find /home -type f -newermt 2013-05-10 ! -newermt 2013-05-11

También se pueden buscar los accesados cambiando newermt por newerat

martes, 14 de mayo de 2013

Convertir una carpeta de imágenes en pdf

Esta es una forma fácil y rápida de convertir una carpeta completa de imágenes en un archivo pdf. Solo nombra las imágenes de forma consecutiva pues este orden sera usado para organizar las paginas en el archivo pdf.

Una vez en la carpeta donde se encuentran las imágenes solo debes usar la instrucción:

convert -compress jpeg * resultado.pdf

lunes, 25 de febrero de 2013

ODBC para DB2 en Ubuntu

Estos son los pasos para instalar y configurar odbc para linux hacia una maquina con iSeries DB2

#install odbc
sudo apt-get install unixodbc

#install iSeries driver
# Download driver from http://www-03.ibm.com/systems/i/software/access/linux/downloads.html

sudo apt-get update
sudo apt-get install alien
cd Downloads/
sudo alien -k iSeriesAccess-7.1.0-1.0.i386.rpm
sudo dpkg -i iseriesaccess_7.1.0-1.0_i386.deb
sudo cp /opt/ibm/iSeriesAccess/lib/* /usr/lib

#config odbc
sudo apt-get install php5-odbc
sudo odbcinst -i -d -f /opt/ibm/iSeriesAccess/unixodbcregistration
sudo ODBCConfig
Leer artículo completo!

Symfony2 Db2 Hack

Ok, ya tengo algo funcionando, el acceso básico a base de datos esta funcionando (create/drop table, create/drop column, alter column, insert, update, delete).

Se creo un nuevo driver, schema y platform todos archivos nuevos basados en los construidos para pdo_ibm. El único archivo cambiado es DriverManager.php para poder registrar el nuevo driver.

Este driver se conecta a DB2 iSeries usando  odbc. Si aun no se tiene acceso por odbc debe instalarse el driver para linux (http://www-03.ibm.com/systems/i/software/access/linux/downloads.html) ver instrucciones aqui, y unixOdbc en un Ubuntu server, luego crear DSN que apunta al servidor DB2, el nombre del  DNS debe ser el mismo que el nombre de la base de datos a la cual se conecta.

El nuevo driver se llama "pdo_ibm_i", el parámetro database_host no se usa, este debe definirse en el DSN de odbc .

Los archivos están en vendor.zip.



Leer artículo completo!

martes, 19 de febrero de 2013

LastinsertId no soportado por pdo odbc?

Al parecer PDOOdbc no implementa lastinsertid, aunque la documentacion oficial dice que si.

Lo que hice fue implementar la busqueda usando sql para db2 y cree una nueva clase PDOIbmConnection que hereda de PDOConnection y sobreescribí el método lastInsertId.

    public function lastInsertId($name = null) {
        $stm = parent::prepare("SELECT IDENTITY_VAL_LOCAL() AS VAL FROM SYSIBM.SYSDUMMY1");
        $stm->execute();
        $result = $stm->fetch(parent::FETCH_ASSOC);
        return $result['VAL'];
    }



Leer artículo completo!

miércoles, 13 de febrero de 2013

Alter table no puede colocar not null

Cuando se hace un alter table ya sea para agregar una columna no se puede agregar not null, puede ser debido a que la tabla puede tener datos y se agrega una columna not null y no tiene valor por defecto con que valor lo va a llenar el motor de base de datos?

Lamentablemente parece que Doctrine no permite definir valores por defecto por lo tanto tendremos que ajustar el DB2Platform para que no incluya en la sentencia el not null.

Esto tiene un efecto secundario:
Si agregamos una columna que deba ser no nula a una tabla que ya exista, este parámetro nunca llegara a la base de datos (a menos que borremos la tabla), la comparación del modelo y la base de datos siempre informará que debe alterar la columna para agregar el not null.
Leer artículo completo!

Db2 Drop column en odbc resulta en operacion cancelada

Acabo de encontrar que no es posible borrar una columna en db2 por odbc, esta operación en el 400 demanda una confirmación, la columna se puede borrar por pantalla verde o por iSeriesNavegator luego de darle ignorar al mensaje. Pero en odbc es imposible (Hasta donde he encontrado) responder al mensaje de confirmación que dice que puede haber perdida de datos.

La respuesta del error no dice mucho solo
SQLSTATE[HY008]: Operation canceled: 30071 [IBM][Controlador ODBC de System i Access]Operación cancelada.
La única opción que he encontrado es configurar la base de datos para que no solicite la confirmación de borrado de la columna mediante el comando de pantalla verde :

CHGMSGD MSGID(CPA32B2) MSGF(QSYS/QCPFMSG) DFT('I')
 Este cambio aplica para todas las bases de datos y usuarios de la maquina iSeries donde se ejecute. Esto puede ser valido para un entorno de desarrollo, aqui podremos dejar que symfony cambie el modelo todo lo que quiera, pero en los servidores de producción no podemos hacer los mismo, lo mas seguro es que el dba ejecute las instrucciones SQL una por una en el entorno de producción caso de ser necesario algún cambio.
Leer artículo completo!