miércoles, 28 de diciembre de 2011

5 tipos de usuarios de linux muy molestos ¿cuál eres tú?

Hoy he visto un post entretenido que no deja de ser muy cierto, que muestra algunos tipos de usuarios de linux que resultan ser muy molestos.

¿Cuál será el más molesto? Yo debo decir que de casi todos tengo o he tenido al menos un poco :D

Leánlo acá

jueves, 8 de diciembre de 2011

Construir SQL dinámicos en PostgreSQL con PL/pgSQL

A veces queremos ejecutar un SQL dentro de una función (como en un trigger) en el que los nombres de los campos o de la tabla a consultar varian, es decir que es dinámico.

Si estamos usando el lenguaje procedimental de PostgreSQL (PL/pgSQL), esto puede hacerse a través de concatenación de cadenas de texto.

Para el ejemplo, supongamos que queremos una función que nos genere el código siguiente para un campo y tenemos la misma estructura para diferentes tablas, así que queremos que la función sea reutilizable. El código es muy sencillo: tomar el último valor para el campo, sumarle 1 y devolver el resultado:

martes, 6 de diciembre de 2011

Uso de LIKE con campos de tipo numérico en PostgreSQL

El operador LIKE de SQL sirve para comparar expresiones según un patrón (más info acá). Pero funciona sólo con campos tipo texto (CHAR, VARCHAR, TEXT). Si se quiere hacer una comparación sobre un campo tipo INTEGER no va a funcionar (tuve que hacer dicha comparación al configurar un campo de formulario con autocompletado con Symfony).

Sin embargo se puede hacer y el truco es muy sencillo, ya que simplemente debemos 'convertir' el campo de tipo entero a una cadena de texto. Esto se hace con la función TO_CHAR. Veamos un ejemplo de consulta sencilla con esta función:

martes, 11 de octubre de 2011

Comando para eliminar una línea de un archivo de texto según expresión regular

Si queremos eliminar una sola línea de texto de un archivo de texto, podemos usar el comando sed de la siguiente forma:

$ sed -i '/regexp/d' /ruta_del_archivo

La opción -i le indica a sed que edite y guarde los cambios hechos al archivo. Veamos un ejemplo práctico:

sábado, 24 de septiembre de 2011

Comandos para obtener información del sistema en Linux

Esta es una compilación de algunos comandos muy básicos que uso habitualmente para obtener información sobre el sistema en el que esté trabajando:
  • Información del sistema operativo:

    $ uname -a

  • Información de particiones:

    # fdisk -l
    o
    $ df -h

Campos únicos de tipo entero en Doctrine 1.2

He comprobado personalmente en un par de proyectos que curiosamente Doctrine no genera las restricciones UNIQUE sobre campos de tipo entero (int) en la base de datos, aunque sí lo hace con campos tipo texto. Por ejemplo, si tenemos una clase definida así:

Mascota:

  connection: doctrine
  tableName: mascota
  actAs: [Timestampable]
  columns:
    id:
      type: integer(4)
      primary: true
      autoincrement: true
    dueno_id:
      type: integer(4)
      unique: true
    descripcion:
      type: string()
      notnull: true

jueves, 8 de septiembre de 2011

Comando para filtrar el historial de la consola

El comando history es un comando muy sencillo pero que resulta muy útil, ya que nos muestra todo el historial de líneas de comando y nos puede ahorrar unos cuantos tecleos, pero a veces podemos gastar más tiempo buscando esa línea de comando que el que demoraríamos escribiéndola. Pues yo uso esta forma muy sencilla de filtrar los resultados de history. Podemos escribir parte del comando que buscamos, si por ejemplo buscamos un comando symfony:
  $ history | grep 'symfony'
O si buscamos un comando que hayamos usado de svn:
  $ history | grep 'svn

División entre enteros en PL/pgSQL

La división entre enteros elimina automáticamente la parte decimal del resultado. Esto puede ser contraproducente si necesitamos cálculos que hagan uso de la parte decimal, incluso si simplemente queremos redondear y obtener un entero, ya que obtendremos un resultado erróneo cuando la parte decimal sea mayor a 0.5. Consideremos por ejemplo que vamos a almacenar el valor del salario mensual de un contrato y queremos calcular el valor del día como valor entero y guardarlo para posteriores operaciones:

DECLARE
  ...
BEGIN
  ...
  NEW.salario_base_diario := NEW.salario_base_mensual / 30;

sábado, 13 de agosto de 2011

Configuración básica de PostgreSQL

Luego de tener PostgreSQL instalado hay que realizar una configuración básica (o más bien mínima) a nuestro entorno de trabajo, en particular si vamos a usar ciertas herramientas (como PgAdmin o Symfony) que deben poder conectarse al servidor postgres. Los pasos serían los siguientes:
  • Cambiar password al usuario de sistema postgres (no es estrictamente necesario, pero yo prefiero hacerlo):

    $ su -
    # passwd postgres

  • Cambiar password al usuario admin dentro de postgres en la bd template1:

    $ su postgres
    $ psql template1
    template1=# ALTER USER postgres WITH PASSWORD 'nuevo_password';

    Este método no me gusta mucho porque se puede ver la contraseña en el historial. Yo prefiero hacerlo así:

lunes, 8 de agosto de 2011

Problema de arranque de PostgreSql en Fedora 12 y Fedora 14

Luego de instalar nuestro sistema Fedora y PostgreSQL, veremos que este último no puede arrancarse ni configurarse para arrancar con el sistema usando system-config-services. Por alguna razón el clúster de postgresql no es inicializado al instalarlo y esto no lo dice el error que nos genera al tratar de iniciar el servicio por consola:

# /etc/init.d/postgresql start

El error nos dice que ejecutemos el siguiente comando para inicializar el cluster:

# service postgresql initdb

Ahora sí podremos iniciar el daemon por consola o con system-config-services.

sábado, 23 de julio de 2011

Warning: require(): Unable to allocate memory for pool

Trabajando en unos proyectos con symfony simultáneamente me encontré con este error en algunos pero no en todos ellos:
Warning: require(): Unable to allocate memory for pool

La solución fue sencilla, simplemente limpiar la caché de symfony:

symfony cc

Pero obviamente lo importante es saber porqué ocurrió tal error. Luego de buscar un poco dí con este enlace en el que indican que al parecer se debe a un bug de algunas combinaciones de versiones de APC y PHP (yo tengo APC 3.1.9 y PHP 3.5.6), pero no hay solución definitiva. Será estar pendiente y estar limpiando la caché de vez en cuando.

martes, 19 de julio de 2011

Buscar y reemplazar un texto de forma recursiva

Las maravillosas tuberías (pipes) en linux nos permiten hacer maravillas como estas en la consola. Acá dejo varios casos de buscar y reemplazar:

  • Buscar y Reemplazar un texto recursivamente:

    $ find . -name "*.php" -print | xargs sed -i 's/texto_a_buscar/texto_nuevo/g'

  • Igual que el anterior pero para poder buscar saltos de línea:

Obtener resultado con un solo valor en Doctrine 1.2

Si se construye una consulta que nos entrega un valor y no queremos o no se obtiene un objeto como tal, habrá que cambiar el hidratador de la consulta, ya que por defecto Doctrine creará un objeto de la clase correspondiente a la clase principal en la consulta.

Por ejemplo, si queremos obtener la sumatoria de una columna numérica, no sólo no necesitamos el objeto, sino que la consulta no generará información para crear uno. La consulta y el getter podrían quedar así:

Instalar APC en Fedora 14 y Debian 6

APC es un acelerador de código PHP y cuando tenemos un entorno de producción cualquier ayuda que nos permita ganar unos segundos en tiempo de ejecución es muy valiosa. Su instalación es muy sencilla, pero difiere un poco según la distribución, en mi caso mi máquina de desarrollo tiene Fedora 14 y mi servidor de producción tiene Debian 6.

Instalación en Fedora 14:

lunes, 11 de julio de 2011

Symfony no toma el valor por defecto para un campo booleano

Si todo parece funcionar bien con un campo booleano (el sql de creación de la base de datos es correcto, la inserción y actualización funciona) excepto que los formularios no toman el valor por defecto definido en el archivo schema.yml, es muy probable que el problema se deba a que el valor por defecto esté definido de la siguiente forma:

    campo:
      type: boolean(1)
      notnull: true
      default: 'false'

viernes, 24 de junio de 2011

Actualizar firefox en Fedora 14 tiene pega

Bueno, desafortunadamente si queremos usar las últimas versiones de firefox en Fedora deberemos instalarlas a mano, ya que en los repositorios oficiales sólo está disponible la rama 3.6.x.

Weboniando encontré este post, pero el procedimiento es sencillo, así que lo transcribo. Evidentemente tendremos que usar el usuario root o el comando sudo, si es que lo tenemos configurado:

Configurar servicios o 'demonios' en Debian

Debian es una gran distribución pero, viniendo de Fedora, extraño ciertas cosas y una de ellas es poder configurar los daemons (servicios o demonios, como quieran decirles) con una herramienta gráfica. En Debian hay que crear el archivo y copiarlo en el nivel de arranque adecuado de init y blablabla.
Para aquellos que disfrutan de esas pequeñas cosas que nos facilitan la vida, en Debian hay disponibles un par de aplicaciones que nos permitirán iniciar, detener y programar el arranque automático de aplicaciones de forma gráfica, eso sí desde la consola (aunque esto es aún mejor si estamos trabajando con un servidor sin entorno gráfico), estas aplicaciones son rcconf y sysv-rc-conf (cualquiera funciona bien), las cuales podremos instalar con un simple apt-get:

$apt-get install rcconf
$apt-get install sysv-rc-conf

Espero sea de ayuda para alguien. Hasta pronto.

sábado, 18 de junio de 2011

Corregir error de PHP warning date()

Si al ejecutar comandos o aplicaciones se obtiene el siguiente mensaje:

Warning: date(): It is not safe to rely on the system's timezone settings...

Hay que editar el(los) archivos de configuración php.ini del sistema y agregar la siguiente línea especificando la zona a usar por defecto.:

date.timezone = America/Bogota

Para conocer la zona apropiada, el mismo mensaje de advertencia ofrece la zona que usó para ejecutar la función que da el problema, y si el sistema correctamente configurado, podemos usar esa zona. Si no aparece o prefiere cambiarla, hay un listado de zonas válidas en este enlace.

Índices y llaves foráneas sobre atributos heredados en archivo de schema en doctrine 1.2

Aunque la herencia en doctrine ofrece grandes posibilidades y en muchos casos nos ahorrará bastante tiempo y código, no viene sin sus particularidades. Una de ellas se presenta cuando queremos definir un índice o una llave foránea en una clase usando atributos de la clase 'madre'. Así, si tenemos un modelo como el siguiente, el índice no funcionará:

sábado, 11 de junio de 2011

Otra forma de definir relaciones 1 a 1 en Doctrine 1.2 para Symfony

La mejor forma de definir relaciones 1:1 en doctrine 1.2 está descrita en el manual "Doctrine ORM for PHP" (pag. 71), pero hay otra forma de hacerlo y que tendrá un comportamiento ligeramente diferente. Esta es la configuración normal sugerida en el libro:

Email:
columns:
user_id: integer
address: string(150)
relations:
User:
local: user_id
foreign: id
foreignType: one

Si en cambio lo hacemos con esta configuración:

Hidratación de objetos con Doctrine en Symfony no funciona con RIGHT JOIN

Al crear un método de consulta para obtener un listado de objetos haciendo JOIN con otras tablas (como para cambiar el table_method para un módulo de Admin Generator), se debe hacer con LEFT JOIN, ya que de lo contrario no agrega a los objetos la información adicional deseada.

jueves, 9 de junio de 2011

Parpadeo de la imagen con gnome-shell en Fedora 14

Algunas veces, al hacer uso de gnome-shell, el mutter sufrirá un error y aunque podremos seguir usando el sistema se puede observar un molesto parpadeo en la imagen. Para solucionarlo sin tener que reiniciar podemos hacer lo siguiente:
  1. Abrir una terminal.
  2. Buscar el proceso mutter, ejecutando:

    $ ps -A

    Obtendremos algo como esto:

        PID TTY          TIME CMD
          1 ?        00:00:00 init
      .....
      20813 pts/2    00:00:00 bash
      20837 ?        00:00:00 gnome-shell
      20842 ?        00:00:01 mutter
      20876 pts/0    00:00:00 ps

  3. Anotamos el número del proceso y lo matamos:

    $ kill 20842

  4. Reiniciamos gnome-shell, lo ejecutamos con & para poder ejecutar más comandos y salimos de la consola:

    $ gnome-shell --replace &
    $ exit

    Hay que salir con exit, no cerrando la ventana de la terminal.
Este truco es bueno porque si estamos guardando las aplicaciones de la sesión, luego de reiniciar cuando se presenta este error todas las aplicaciones aparecerán en el primer escritorio y si tenemos bastantes (como en mi caso) es molesto tener que ordenarlas de nuevo.

martes, 24 de mayo de 2011

Servicios haldaemon y pcscd no arrancan en Fedora 14

Hace poco mi Fedora empezó a mostrarme un mensaje de error al arranque: los servicios haldaemon y pcscd no arrancaban. En la práctica esto no permite cargar ciertos dispositivos en el entorno gráfico (p.e.: la unidad de DVD) y no muestra los rostros en la pantalla de login de entorno gráfico.

Culpé a la última actualización y estuve a punto de 'desactualizar' los paquetes, pero decidí hacer una búsqueda en Mr Google primero. Finalmente encontré este post en el que dicen que la razón de este error se debe a borrar el contenido de /var/cache y recordé que efectivamente había hecho eso porque pensé: "Hey, para qué quiero toda esa basura en la caché". Pues grave error, no lo hagan.

La solución fue ejecutar:

yum -y reinstall hal

Con esto tanto haldaemon como pcscd inician ahora correctamente y los dispositivos se pueden cargar en el entorno gráfico, sin embargo las foticos no salen en la pantalla de login :( pero como no es crítico no he hecho nada para solucionarlo.

sábado, 14 de mayo de 2011

Comando para encontrar archivos de forma recursiva buscando por una cadena de texto

Este es uno de mis comando favoritos. Usando la habilidad de find para ligarse con otro, en este caso grep, podemos buscar en un directorio por todos los archivos que contengan cierta cadena de texto:

$ find ruta_directorio -exec grep -li 'texto' {} \; -exec grep -ni 'texto' {} \;

En el primer grep usamos -l para listar los archivos, en el segundo usamos -n para mostrar la línea en la que está la ocurrencia del texto.
La opción -i sirve para ignorar diferencia entre mayúsculas y minúsculas.

Yo suelo usarlo filtrando el tipo de archivo:

$ find ruta_directorio -name "*.php" -exec grep -li 'texto' {} \; -exec grep -ni 'texto' {} \;

Simplemente maravilloso!

sfGuard no funciona al copiar o exportar el proyecto

Si al copiar o exportar el proyecto, este plugin no funciona, incluso si funciona bien el entorno de desarrollo; tal vez dando un error como:

500 | Internal Server Error | Doctrine_Record_UnknownPropertyException
Unknown method SfGuardUser::checkPassword

Es muy probable que se deba al haber generado el archivo schema.yml a partir de la base de datos existente DESPUÉS de haber instalado el sfGuard. Al hacer esto se duplican las clases cuando se usan los subcomandos de symfony doctrine:build-model, doctrine:build-form y doctrine:build-filter o doctrine:build --all. Los nuevos archivos creados tienen nombre con formato *SfGuard*.php, a diferencia de los que vienen con el plugin cuyo formato es *sfGuard*.php (con 's' minúscula).

La solución es:

Tips sobre internacionalización en symfony

Cuando trabajemos en una aplicación en la que necesitemos algo de internacionalización (i18n), es bueno tener siempre presentes un par de cosas (que por cierto podemos encontrar en la documentación oficial):
  • La internacionalización no es posible sin un usuario. Cuando el website está disponible en varios idiomas o regiones del mundo, el usuario es el responsable de escoger aquel que se le ajusta mejor.
  • Durante el desarrollo, puede sorprenderse de ver que un cambio de cultura en el archivo settings.yml no cambia la cultura actual en el navegador. Esto es porque la sesión ya tiene una cultura de páginas anteriores. Si quiere ver la aplicación con la nueva cultura debe limpiar las cookies del dominio o reiniciar el navegador.
  • Para ver los cambios en textos traducidos, hay que limpiar la cache de symfony.

Corregir error "Class XxxFormFilter not found" en symfony

Si al trabajar en nuestro proyecto, nos encontramos con un error como este:

Fatal error: Class 'XxxFormFilter' not found in ...

Seguramente se debe a que cambiamos nuestro esquema y no actualizamos todos los componentes importantes (model, forms, filters). Así que habrá que reconstruirlos todos, ya sea uno por uno:

./symfony doctrine:build-model
./symfony doctrine:build-forms
./symfony doctrine:build-filters

o todo a la vez:

./symfony doctrine:build --all-classes

Corregir advertencia de función date() de php en symfony

Si al ejecutar comandos o aplicaciones de symfony se obtiene el siguiente mensaje:

Warning: date(): It is not safe to rely on the system's timezone settings...

Hay que editar el(los) archivos de configuración php.ini del sistema y agregar la siguiente línea especificando la zona a usar por defecto.:

date.timezone = America/Bogota

Para conocer la zona apropiada, el mismo mensaje de advertencia ofrece la zona que usó para ejecutar la función que da el problema, y si el sistema está correctamente configurado, podemos usar esa zona. Si no aparece o si se quiere cambiar, hay un listado de zonas válidas en http://nl3.php.net/manual/en/timezones.php

El comando symfony no muestra mensajes con resaltado en color

Una forma de forzar el resaltado con color en la línea de comandos (CLI) con symfony es usar la opción color, por ejemplo:

./symfony doctrine:build --all --color

Pero eso es algo engorroso. Este pequeño error seguramente se debe a que hace falta instalar la extensión posix de php, para estar seguros habrá que ejecutar el script check_configuration.php que nos ofrece symfony para conocer el estado de nuestra instalación:

php lib/vendor/symfony/data/bin/check_configuration.php

Si es así veremos una línea como esta:

[[WARNING]]         The posix_isatty() is available:  FAILED

Así que habrá que buscar este paquete en el repositorio de nuestra distribución. En Fedora 14 la extensión php_posix (usada por Symfony para dar resaltado de colores en la CLI) se instala dentro de la extensión php-process.

yum install php-process

Y listo! Ya veremos bonitos colores en nuestra línea de comandos con symfony.