Marzo 4th, 2013

Django 1.5


No, no hablo de la nueva versión de la oscarizada pelicula de Quentin Tarantino. Django 1.5 es el último lanzamiento del mejor framework para Python que podemos encontrar en la Red.

Viene con muchas novedades, entra las que destacaría las siguientes:

  • Modelo de usuario configurable
  • Soporte para salvar un subconjunto de los campos de un modelo (una gozada!)
  • Cacheo de instancias relacionadas de un modelo
  • Soporte para streaming
  • Una nueva etiqueta de bloque llamada verbatim
  • Soporte para Python 3 (El soporte para Python 3 todavía se considera experimental, pero hay disponible una guía para portar nuestro código a Python 3 circulando)

Además corrección de errores y bugs conocidos, y un puñado de mejoras más.

Enlaces | Django 1.5

Noviembre 9th, 2012

Selectores en jquery

Seleccionar todos los tags/elementos:

Todos los elementos ("*")

Seleccionar todos los elementos que estan en proceso de animación:
Extensiones jQuery

:animated Selector

Selecciona los elementos que tienen el atributo especificado con un valor ya sea igual a una cadena determinada o que comience con esa cadena seguida de un guión (-):

Atributo contiene prefijo seleccionado [name|="value"]

Seleccionar elementos que contengan el valor específico, aunque sea parte de una subcadena:

Atributo contiene palabra seleccionada [name*="value"]

Selecciona los elementos que tienen el atributo especificado con un valor que contenga una determinada palabra, delimitado por espacios:

Atributo contiene palabra seleccionada [name~="value"]

Seleccionar los elementos que finalicen con la palabra especificada:

Atributo finaliza con selector [name$="value"]

Selecciona los elementos que tienen el atributo especificado con un valor exactamente igual a un cierto valor:

Atributo igual a selector [name="valor"]

Seleccionar elementos que o bien no tienen el atributo especificado, o tienen el atributo especificado, pero no con un determinado valor:
Atributo, extensiones jQuery

Atributo no [nombre!="Valor"] Igual Selector

Selecciona los elementos que tienen el atributo especificado con un valor comenzando exactamente con una cadena dada:

Atributo comienza con selector de [nombre^="valor"]

Selecciona todos los elementos del botón y elementos de tipo botón:
Forma desuso, Extensiones jQuery

:button Selector

Selecciona todos los elementos de tipo checkbox:
Forma desuso, Extensiones jQuery

:checkbox Selector

Coincide con todos los elementos que están marcados:

:checked Selector

Selecciona todos los elementos secundarios directos especificados por “niño” de los elementos especificados por el “padre”:

Niño Selector ("padre > hijo")

Selecciona todos los elementos con la clase dada:

Selector de Clase (".clase")

Seleccione todos los elementos que contienen el texto especificado:

:contains() Selector

Selecciona todos los elementos que son descendientes de un ancestro determinado:

Descendiente Selector ("descendientes ancestro")

Selecciona todos los elementos que son discapacitados:

:disabled Selector

Selecciona todos los elementos con el nombre de etiqueta dado:

Elemento Selector ("elemento")

Seleccione todos los elementos que no tienen hijos (incluidos los nodos de texto):

:empty Selector

Selecciona todos los elementos que están habilitados:

:enabled Selector

Seleccione el elemento en el índice n en el juego completo:

:eq() Selector

Selecciona los elementos, incluso cero indexados. Ver también impar:
Extensiones Básicas filtro, jQuery

:even Selector

Selecciona todos los elementos del tipo de archivo:
Extensiones Básicas filtro, jQuery

:file Selector

Selecciona todos los elementos que forman el primer hijo de su padre:

:first-child Selector

Selecciona el primer elemento coincidente:
Extensiones Básicas filtro, jQuery

:first Selector

Selecciona el elemento si está actualmente enfocada:

:focus Selector

Seleccionar todos los elementos en un índice mayor que el índice en el juego completo:
Extensiones Básicas filtro, jQuery

:gt() Selector

Selecciona los elementos que tienen el atributo especificado, con cualquier valor:

Tiene un atributo con el texto [nombre], ej: input[type]

Selecciona los elementos que contienen al menos un elemento que coincida con el selector especificado:
Filtro de contenido, extensiones jQuery

:has() Selector

Selecciona todos los elementos que son cabeceras, como h1, h2, h3 y así sucesivamente:
Extensiones Básicas filtro, jQuery

:header Selector

Selecciona todos los elementos que están ocultos:
Extensiones jQuery, Visibilidad Filtro

:hidden Selector

Selecciona un solo elemento con el atributo id indicado:

Selector de ID ("#id")

Selecciona todos los elementos de imagen tipo:
Forma desuso, Extensiones jQuery

:image Selector

Selecciona todo input, textarea, select y elementos del botón:
Forma desuso, Extensiones jQuery

:input Selector

Selecciona todos los elementos que son el último hijo de su padre:

:last-child Selector

Selecciona el último elemento coincidente:
Extensiones Básicas filtro, jQuery

:last Selector

Seleccionar todos los elementos en un índice menor que el índice en el juego completo:
Extensiones Básicas filtro, jQuery

:lt() Selector

Seleccionar elementos que coincidan con todos los filtros de atributos:

Selector multiple de atributos [name="valor"][name2="valor2"]

Selecciona los resultados combinados de todos los selectores específicos:

Selector múltiple ("selector1, selector2, selectorN")

Selecciona todos los elementos siguientes que coinciden con “next” que son inmediatamente precedido por un hermano “prev”:

Selector adyacente siguiente ("prev + next")

Selecciona todos los elementos del mismo nivel que siguen después de la “prev” elemento, tienen el mismo padre, y que coincida con el filtro “hermanos” selector:

Hermanos Siguiente Selector ("prev ~ hemanos")

Selecciona todos los elementos que no coinciden con el selector dado:

:not() Selector

Selecciona todos los elementos que constituyen el enésimo hijo de su padre:

:nth-child () Selector

Selecciona elementos extraños, cero indexados. Ver también incluso:
Extensiones Básicas filtro, jQuery

:odd Selector

Selecciona todos los elementos que son el único hijo de su padre:

:only-child Selector

Seleccionar todos los elementos que son los padres de otro elemento, incluidos los nodos de texto:
Filtro de contenido, extensiones jQuery

:parent Selector

Selecciona todos los elementos de tipo contraseña:
Forma desuso, Extensiones jQuery

:password Selector

Selecciona todos los elementos de la radio tipo:
Forma desuso, Extensiones jQuery

:radio Selector

Selecciona todos los elementos de reposición tipo:
Forma desuso, Extensiones jQuery

:reset Selector

Selecciona todos los elementos que están seleccionados:
Forma, Extensiones jQuery

:selected Selector

Selecciona todos los elementos de tipo a presentar:
Forma desuso, Extensiones jQuery

:submit Selector

Selecciona todos los elementos de tipo text:
Forma desuso, Extensiones jQuery

:text Selector

Selecciona todos los elementos que son visibles:
Extensiones jQuery, Visibilidad Filtro

:visible Selector

Noviembre 8th, 2012

Desactivar solicitud de privilegios/permisos Administrador (UAC) en Windows 8

Es bastante molesto este recuadro que nos bloquea las demás aplicaciones, para desactivarlo:

Panel de Control -> Cuentas de Usuario y Protección Infantil
-> Cuentas de Usuario -> Cambiar configuración de control
de cuentas de usuario.

Ahí desplazamos la barra a nuestro gusto.

Octubre 1st, 2012

Ocultar y mostrar elementos con jquery

En jquery, cuando intentamos ocultar y hacer aparecer elementos de nuestro html con un click, a veces caemos en el error de crear una función que haga un $().hide(), y a través de una variable global detectar que nuestro elemento está oculto y hacer un $().show().
jquery nos proporciona un método para realizar este gesto en una sola función:

$().slideToggle()

slideToggle nos permite realizar nuestro ocultar/mostrar definiendo nuestro gesto en un solo click:

<a onclick="$('#div_mostrar_ocultar').slideToggle()">
      Mostrar/Ocultar
</a>
<div id="div_mostrar_ocultar">Mostrado</div>

Link | slideToggle

Marzo 30th, 2012

Finalizar querys molestas

Uno de los mejores placeres llegados en PostgreSQL 8.4 es la función pg_terminate_backend.
En el pasado, cuando queríamos matar consultas fuera del control de postgres, llamabamos a pg_cancel_backend. El problema de esto, es que muchas veces postgres reejecutaba la query cuando la llamabamos, y no lograbamos acabar con ella.

Desde PostgreSQL 8.4 hay una nueva función llamada pg_terminate_backend. Esta función no reemplaza a pg_cancel_backend, pero basicamente hace lo que tu quieres cuando entras en el administrador de tareas de windows y haces un kill a determinado proceso. Tampoco corres el riesgo de cargarte el proceso root de postgres y tirar abajo todas las queris cuando te cargas el PID (que era la opción definitiva que teníamos antes para matar una query).

Ejemplos:

pg_cancel_backend vendría a ser un golpe en la muñeca

SELECT pg_cancel_backend(procpid);

pg_terminate_backend sería como darle con un palo en la cabeza.

SELECT pg_terminate_backend(procpid);

Mayo 2nd, 2011

Buscar diferencias entre dos ficheros

A la hora de comparar dos ficheros que en un principio eran iguales y en los cuales se han hecho algunas modificaciones, estos comandos nos serán de total utilidad:

diff encuentra las diferencias entre los dos ficheros y las muestra por pantalla, no importa que las frases que se repitan estén en distintas lineas.

diff fichero1 fichero2

join hace lo contrario, muestra lo que tienen en común los dos ficheros.

join fichero1 fichero2

Enero 29th, 2011

FATAL: Ident authentication failed for user XXXXX

He instalado postgres en un servidor CentOS, luego he creado el usuario, contraseña y bbbdd. Pero si me intento conectar por PHP, shell o navicat usando la siguiente sintaxis:

psql -d mibbdd -U usuario -W 

Me devuelve el siguinte error:

psql: FATAL: Ident authentication failed for user "username"

¿Como corregir este error?
Abrimos el fichero de configuración de postgres: /var/lib/pgsql/data/pg_hba.conf :

# vi /var/lib/pgsql/data/pg_hba.conf

El fichero controla

  1. Desde que host se permite conectar.
  2. Que clientes están autentificados.
  3. Que usuario the postgres pueden usar.
  4. A qué BBDD pueden acceder

Por defecto, PostgreSQL usa autentificación basada en IDENT. Todo lo que debes hacer es permitir al usuario y contraseña que utilizas para tu conexión. IDENT nunca permitirá que entres a través de las opciones -U y -W. Concatena el permiso al fichero para que puedan entrar todos los usuarios del localhost.

local	all	all	trust
host	all	127.0.0.1/32	trust

Guarda y cierra el fichero, luego restaura el servicio postgreSQL:

# service postgresql restart

Ahora, deberías ser capaz de entrar usando el comando:

# psql -d myDb -U username -W

Julio 27th, 2010

Frases celebres del desarrollo

Las 3 grandes mentiras del programador
1. El programa está completamente probado y libre de errores
2. Estamos trabajando en la documentación
3. Por supuesto que podemos modificarlo
– Anónimo

“Debugging es dos veces más difícil que escribir el código en primer lugar. Entonces si escribes el código tan astutamente como sea posible, no eres -por definición- tan listo como para debugearlo.”
– Brian Kernighan

“Sólo hay dos tipos de lenguajes: aquellos de los que la gente se queja y aquellos que nadie usa.”
– Bjarne Stroustrup

“Cualquier tonto puede escribir código que un ordenador entiende. Los buenos programadores escriben código que los humanos pueden entender.”
– Martin Fowler

“Hay dos formas de diseñar software: la primera es hacerlo tan simple que obviamente no hay deficiencias y la segunda es hacerlo tan complicado que no hay deficiencias obvias. La primera forma es mucho más difícil.”.
– C.A.R. Hoare

“Mucho del software hoy en día se parece a una pirámide egipcia: con millones de ladrillos apilados uno encima del otro, sin integridad estructural y hecho por pura fuerza bruta y miles de esclavos.”
– Alan Kay

“Medir el progreso de la programación por líneas de código es como medir el progreso en la construcción de aviones por el peso.”
– Bill Gates

“Si deseas empezar y desarrollar algo grandioso, no necesitas millones de dólares de capitalización. Necesitas suficiente pizza y Diet Coke en la nevera, una PC barata y trabajo y dedicación para realizar tu idea.”
– John Carmack

“Los programas deben ser escritos para que la gente los lea y sólo incidentalmente, para que las máquinas los ejecuten.”
– Abelson / Sussman

“Pregunta: ¿Cómo se atrasa un año un proyecto grande de software? Respuesta: Un día a la vez.”
– Fred Brooks

“Nadie debe empezar un proyecto grande. Empiezas con uno pequeño y trivial y nunca debes esperar que crezca; si lo haces solamente sobre-diseñarás y generalmente pensarás que es más importante de lo que lo es en esta etapa. O peor, puedes asustarte por el tamaño de lo que tu esperas que crezca. Así que empieza pequeño y piensa en los detalles. No pienses acerca de la foto grande y el diseño elegante. Si no resuelve una necesidad inmediata, seguramente está sobre-diseñado. Y no esperes que la gente salte a ayudarte, no es así como estas cosas funcionan. Primero debes tener algo medianamente usable y otros dirán “hey, esto casi funciona para mí” y se involucrarán en el proyecto.”
– Linus Torvalds

Añadidos:
“Programa siempre tu código como si el tipo que va a tener que mantenerlo en el futuro fuera un violento psicópata que sabe donde vives.”
– Martin Goldin

“La mayoría de expertos coinciden en que la forma más probable de que se destruya el mundo es por accidente. Ahí es donde entramos los informáticos. Nosotros causamos accidentes.”
– Nathaniel S. Borenstein (Programming as If People Mattered)

El problema de las soluciones “provisionales” es que pueden convertirse en “definitivas”, porque aplicar la solución “definitiva” viola el principio de “si funciona, no lo toques”
–Miguel Armas (Kuko)

“Si pagas cacahuetes, obtienes monos”
– James Goldsmith

“Si la depuración es el proceso de eliminar errores, entonces la programación debe ser el proceso de introducirlos”
– Edsger Dijkstra

“Cuando evaluamos un producto, las personas solemos dar una importancia ridículamente alta a la belleza y a la estética. Esta es una de las razones por las que los iPods, y ya que estamos, Keanu Reeves, son tan enormemente populares.”
– Joel Spolsky

“Emplea tu tiempo cultivándote a través de los escritos de otros, así ganarás fácilmente lo que para nosotros ha sido una dura tarea”
- Sócrates, parece que ya picaba código por el 400 a. C.

Julio 27th, 2010

Módelo Vista Controlador y algunas variantes

Flex es un framework creado para poder llegar a usar otros frameworks. Nos centraremos en este artículo en la base de otros frameworks, como PureMVC o Cairngorm, esta característica es el patrón Módelo Vista Controlador (MVC). Analizaremos este patrón que tanto nos gusta y entonces veremos algunas otras aproximaciones para compararlas y adjuntaré proyectos de ejemplo para entender el concepto que representa cada uno.

Módelo Vista Controlador (MVC)

El Módelo Vista Controlador es el patrón arquitectural más usado en la ingeniería del software. Este patrón nos separa el modelos de datos, el modelo de la capa de presentación (vista) y de la parte de control.

De este modelo podemos decir, que gestiona la información y advierte a las otras capas de cambios en sus datos. Representa el dominio de datos. La vista representa gráficamente el modelo para que el usuario pueda interactuar él, es la interfaz de datos. El controlador recibe las peticiones de la vista y le responde actualizando el modelo de datos. Debido a que la vista observa los cambios en el modelo de datos, esta actualiza sus componentes en función de éstos.

La finalidad de este patrón será la de conseguir un bajo acoplamiento en sus aplicaciones. Este lo logra desacoplando los modelos de las vistas, reduce la complejidad en el diseño arquitectural e incrementando la flexbilidad y mantenimiento del código.

La aplicación para el ejemplo será esta:

Módelo Vista Presentación (MVP)

Módelo Vista Presentación

Este patrón es un derivado del anterior. Está centrado en la interfaz de usuario y también pensado para facilitar el la unidad de testeo y mejorar la separación conceptos en la presentación de la lógica del programa. Genera una implementación limipia del patrón Observer entre el modelo y la vista.

El modelo funciona como una interface que define los datos que serán mostrados luego en la vista. La vista es una interface que nos muestra los datos del modelo y lanza llamadas a la capa presentacion para que luego actúe con los datos. La presentacion recupera los datos del modelo y los modera y hacia la vista.

Normalmente, la vista instancia su objecto presentacion con el que se relacionará y luego le proporciona una referencia suya.
El grado de lógica permitida en las vistas variara en función de la implementación que usemos: podremos hacer que la vista sea totalmente pasiva, alegando todas las operaciones a la presentacion. Otras versiones del MVP nos permiten más autonomía a la vista.

Si nos centramos en un punto de vista de capas, la presentacion se consideraría la capa de aplicación entre el modelo y la vista.

El creador del patrón MVP, Martin Fowler, decidió separarlo en dos patrones de presentación que ya hemos tratado en madeinflex, son el supervising presenter y el passive view.

MVC vs MVP

Los une la idea de que el modelo alberga los datos y la vista los representa. Tanto el controller como el presenter se encargan de coordinar la aplicación y es en estas clases donde está la diferencia: el Presenter tiene más responsabilidades, maneja los datos del modelo y trata las propiedades de la vista que recibirá como parámetro.

Modelo Vista Adaptación (MVA)

Como en los dos patrones anteriores, se pretende separar el modelo de datos de la vista para poder realizar cambios en la vista y que estos no afecten al modelo de datos.

MVA y MVC intentan solucionar este problema con dos aproximaciones diferentes:

  • MVC mantiene un estructura triangular entre el modelo, la vista y el controller, en la cual las tres entidades serían los vértices del triángulo y las aristas las vías de comunicación entre éstas.
  • MVA lo soluciona de otra forma, lo hace mediante una estructura lineal en la cual en una punta estará la vista, en la otra el modelo y en el centro el adapter o mediating controller, pero se evita la comunicación directa entre la vista y el modelo.

Así pués, en este modelo, la vista está totalmente separada del modelo de datos y estas entidades sólo se pueden comunicar a través el adapter, dicho de otro modo, sólo el adapter tiene conocimiento del modelo y de la vista.

Con esta separación de comportamientos, conseguiremos que una amplia variedad de vistas puedan acceder indirectamente al modelo de datos mediante el mismo adapter. Las vistas también se olvidan del modelo de datos, ya que es el adapter quien las comunica con éste.

Esto también nos permite poder usar diferentes adapters para cada par vista / modelo. Un ejemplo podría ser la aplicación de una entidad bancaria, para cada una de sus delegaciones, puede ser que con los mismos datos y la misma vista se tengan que manipular los datos de maneras diferentes, para eso podremos tener diferentes adapters sin tener que modificar ni la vista ni el modelo de los datos.

MVA también es conocido como “mediating-controller”. Hay quien cree que como base sigue la misma idea que MVP, aunque hay gurús del software que se matan y defienden diferencias entre ellos.

Aquí os dejo un enlace de un proyecto de ejemplo para que podais analizarlo vosotros mismos.

Autor: Sergi Dote Teixidor

Abril 10th, 2010

Optimizando nuestro código PHP

1 – Inicializa las variables antes de utilizarlas. Estás, se inicializan solas, pero con un coste de tiempo.

2 – Debes estar en constante aprendizaje, cada vez el lenguage PHP se hace más fuerte, y salen nuevas características interesantes sobre este..

3 – Incrementar una variable en el método de una clase es lo mas rápido, que incrementar una variable global.

4 – Incrementar una variable global a un fichero puede llegar a ser hasta dos veces más lento que en un entorno local.

5 – Incrementar una variable local en un método es lo más rápido. Casi lo mismo que llamar a una variable local en una función.

6 – Incrementar una variable indefinida puede ser hasta 9 ó 10 veces más lento que una ya declarada.

7 – Declarar una variable global, a pesar de que no la llegues a utilizar en ninguna función hace más lento tu script, PHP tiene que chequear si la variable existe.

8 – Llamar a una función a una función con un parametro puede tomar aproximadamente el mismo tiempo que de 7 a 8 operaciones con variables locales, y esa misma llamada a un método supondrían unas 15 operaciones. Aún así, es más rapido que usar variables globales.

9 – Si necesitas saber el timestamp (tiempo de ejecución) de acceso a un script, considera utilizar la variable $_SERVER['REQUEST_TIME'] en lugar de time(), es mucho más rapido.

10 – $row['id'] es hasta 7 veces más rápido que el mecanismo $row[id].

11 – $localvar++ es hasta 15 veces más rápido que function inc(){ $localvar++; }, debido a que debe acceder a la función.

12 – Los scripts PHP se compilan/interpretan cada vez que son ejecutados, a no ser se guarde el código objeto en un cache. Las herramientas de compilación de PHP pueden incrementan el rendimiento hasta un 100%.