Mapstraction: librería javascript para generar mapas (Google, Yahoo, etc)

0

Curioseando por la web encuentra esta fantástica librería programada en javascript para generar mapas a través de diferentes APIs: http://mapstraction.com/

 

Disfrutadla xD.

Salarios de alcaldes 2012

0

Para ir abriendo boca este 2012 he decidido poner a disposición de todos una hoja de cálculo que llevo manteniendo desde hace un año con los salarios de los alcaldes de capitales de provincia de España.

Con la crisis, la mayoría se ha bajado el sueldo; otros, al ser también diputados o senadores solo pueden tener un salario y suelen optar por el de diputado o senador.

Me faltarían por conseguir las dietas por asistencia a los plenos que cobran los alcaldes, ya que ahí y dependiendo del municipio se puede incluso igualar el sueldo del alcalde solo con las dietas.

Por último, observareis que hay varias columnas con el texto “Nuevo Salario” tanto anual como mensual, esas columnas se han calculado creando los salarios a partir de un múltiplo del SMI (Salario mínimo interprofesional) y limitados por rangos de habitantes en los municipios. De esta forma puedo conocer qué ocurriría si los salarios fueran más o menos equitativos y si hay ahorro o no (con estos alcaldes el ahorro sería de 1.450.000 €).

Hoja de cálculo salarios de alcaldes: https://docs.google.com/spreadsheet/ccc?key=0ApwGSp0vAe6zdFlOSmw5bGJZWEptNWJTOXZLX2F0Qnc

Si veis cualquier error no dudéis en  dejar un comentario indicándolo.

Ocultar el bloque de contenido principal (main content block) de la página principal en Drupal

0

Primero debes crear un nuevo tipo de contenido, yo lo he llamado ‘home’, además en la descripción he indicado que no se genere ningún contenido de ese tipo.

Segundo, en la configuración del bloque del contenido principal nos vamos al apartado de ‘Tipos de contenido’ y seleccionamos ‘home’ para que muestre solo ese tipo de contenido.

En el bloque node que está dentro del core de Drupal abrimos el archivo node.module y vamos a la linea 2557 o al método node_page_default(), nos aparecerá este código:

  1. <?php
  2.  
  3. drupal_set_title(t('Welcome to @site-name', array('@site-name' => variable_get('site_name', 'Drupal'))), PASS_THROUGH);
  4. $default_message = '<p>' . t('No front page content has been created yet.') . '</p>';
  5. $default_links = array();
  6.  
  7. if (_node_add_access()) {
  8. $default_links[] = l(t('Add new content'), 'node/add');
  9. }
  10.  
  11. if (!empty($default_links)) {
  12. $default_message .= theme('item_list', array('items' => $default_links));
  13. }
  14.  
  15. $build['default_message'] = array(
  16. '#markup' => $default_message,
  17. '#prefix' => '<div id="first-time">',
  18. '#suffix' => '</div>',
  19. );

Bien, coméntalo y añade justo debajo:

  1. <?php
  2. drupal_set_title('');
  3. $build['default_message'] = array(
  4. '#markup' => '',
  5. '#prefix' => '',
  6. '#suffix' => '',
  7. );

El bloque de contenido principal ya no aparecerá en la página principal, aunque esto no es perfecto, lo sé… pero funciona xD.

Cassandra y PHP para desarrolladores SQL: El modelo de datos

0

Si has trabajado con una base de datos relacional tal vez te resulte algo confuso al principio comprender el modelo de datos que usa Cassandra, intentaré ser lo más claro posible, pero si te surgen preguntas no dudes en dejarlas en los comentarios.

 

Columnas

El elemento más básico de la base de datos Cassandra es la columna, se compone de tres elementos: nombre de la columna, valor y timestamp. Os muestro un ejemplo como un array:

 array(
“nombre” => “email”,
“valor” => “webmaster@localhost.com”,

“timestamp” => time()

,

)

 

Super columnas

Es el conjunto de columnas con sus correspondientes valores:

array(
“nombre_superColumna” => array(

 

“usuario1″ => array(
“nombre” => “email”,
“valor” => “webmaster@localhost.com”,
“timestamp” => time()
),
“usuario2″ => array(
“nombre” => “email”,
“valor” => “email@email.com”,
“timestamp” => time()
),

 

“usuario3″ => array(
“nombre” => “email”,
“valor” => “otroemail@otroemail.com”,
“timestamp” => time()
),

),

)

 

Familia de columnas

Es el conjunto de columnas o super columnas. Me explico:

Las column Family o  familia de columnas se puede configurar de dos maneras: como Super o como Simple. Si se elige la opción Simple, en la column family solo se podrán guardar columnas no super columnas. En cambio si la column family está configurada como Super podrá guardar, además de las columnas, las super columnas. Esta flexibilidad permite jugar con la base de datos y adaptarla a nuestras necesidades.

Ejemplo:

 array(
“name” => “ColumnFamily”,
array( “name” => “SuperColumn”,
array( “colums” )
),
)

Keyspace

El keyspace es nuestra base de datos, donde alojaremos todas las columFamilies que necesitemos.

Ejemplo:

array(
“name” => “keyspace”,
array(“name” => “columnFamily”,
array(
[...]
),
),
)

GestAuto 0.0.1.0 pre-alpha, la aplicación de gestión de autoescuelas open source se relanza

2

Pues sí, por fin puedo volver a meterle mano a este proyecto que tenía abandonado por falta de tiempo.

Durante los próximos días comenzaré a corregir todos los errores que existen para lanzar una versión básica y estable de la aplicación lo antes posible.

Para ello me gustaría pedir la colaboración de todos los que estén interesados en el desarrollo de esta aplicación, ya que llevo un tiempo apartado de este mundillo y no estoy al tanto de los cambios del sector (por ejemplo el nuevo carnet A2, que no está en la aplicación).

Os dejo el link para probar la aplicación. Cualquier sugerencia que tengáis, cualquier error que veáis por favor dejarlo en un comentario.

Gestauto: http://sourceforge.net/projects/gestauto/files/GestAuto_0.0.1.x_%20pre-alpha/GestAuto_0.0.1.0_pre-alpha.zip/download

Cassandra y PHP para desarrolladores SQL: Instalación

0

La base de datos No-SQL Cassandra fue creada por Facebook a causa de la necesidad de disponer de una base de datos distribuida de alto rendimiento, flexible, tolerante a fallos, escalable y que fuese capaz de procesar grandes cantidades de datos, más tarde fue liberada bajo licencia Apache y actualmente es utilizada principalmente por empresas de internet con proyectos con un alto uso de base de datos como Twitter.

En esta serie de artículos iré desgranando la instalación, funcionamiento y desarrollo de aplicaciones en PHP con Cassandra, comparando las sentencias utilizadas para insertar, actualizar, etc de SQL con los métodos a utilizar en Cassandra. Por desgracia al ser algo completamente distinto a cualquier base de datos SQL tendré que añadir algo de teoría, pero intentaré que os resulte lo más ameno posible.

Al toro.

 

 

REQUISITOS

Para la realización de esta guía se utilizará Debian Squeeze como sistema operativo. En algunos de los links que dejo como bibliografía al final del artículo existen ejemplos para realizar la instalación en otros sistemas operativos, principalmente CentOS.

Doy por hecho que ya se dispone de un servidor web Apache con PHP instalado en la máquina de testeo que se esté usando. Las aplicaciones que se van a instalar han sido probadas en una máquina virtual Debian utilizando como aplicación de virtualización, VirtualBox instalado en un host Windows XP SP3.

En un servidor de producción recomiendo que tenga bastante RAM (por encima de 1GB, ya veremos más adelante el porqué. En la máquina virtual que uso de testeo dispone de 700 MB y funciona bien, pero en producción no es lo recomendable).

Instalaremos la base de datos Cassandra, el protocolo para conectar con ella y que nos generará el módulo para poder trabajar desde PHP, y PHPCassa que será la abstracción de la base de datos donde tenemos los métodos básicos para trabajar con Cassandra: insertar, actualizar, borrar, crear, etc.

 

PREPARANDO EL SISTEMA

Antes de empezar a instalar debemos actualizar el sistema operativos de la forma habitual:

apt-get update
apt-get upgrade

Una vez actualizado el sistema empezamos a instalar.

 

INSTALANDO CASSANDRA

Lo primero que necesitamos hacer para instalar Cassandra es editar los repositorios de Debian:

  1. nano /etc/apt/sources.list

 

Una vez que se abra el editor añadimos las siguientes lineas:

deb http://www.apache.org/dist/cassandra/debian/ 08x main
deb-src http://www.apache.org/dist/cassandra/debian/ 08x main

Como podrás observar después de la ruta del repositorio se ha añadido “08x” estoy indica el número de versión a obtener, en este caso es la versión actual de cassandra al crear este post. No se indica el número de parche, es decir, actualmente se puede descargar Cassandra 8.4, el “.4″ lo obviamos a la hora de los repositorios.

Si dentro de unos meses sale la versión “9.0″ solo tendrás que cambiar el ocho por el nueve.
Volvemos a consola y actualizamos los repositorios.

apt-get update

Nos dará un error en las claves gpg. Procedemos a actualizarlas con las siguientes instrucciones:

  1. gpg --keyserver pgp.mit.edu --recv-keys F758CE318D77295D
  2. gpg --export --armor F758CE318D77295D | sudo apt-key add -

Ojo con el guión del final, hay que añadirlo sino dará error.

Con el paquete 0.7.5 nos da otro error de clave gpg así que también instalamos esta de la misma manera:

gpg --keyserver pgp.mit.edu --recv-keys 2B5C1B00
gpg --export --armor 2B5C1B00 | sudo apt-key add -

Verificamos que tenemos el sistema actualizado.

Actualizamos todos los paquetes que aparezcan.

Procedemos a instalar el paquete de la base de datos NoSQL Cassandra:

  1. apt-get install cassandra

Cassandra necesita a Java para funcionar para ello, una vez instalado Cassandra instalaremos el paquete sun-java6-jdk de la siguiente manera:

  1. apt-get install sun-java6-jdk

En el caso de que no encuentre el paquete verificar que los repositorios de Debian son correctos. Verifica la versión de Java con:

Debería aparecer algo así:

java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)

Se recomienda usar la versión de Java de Sun (Sun JDK) en vez de Open JDK debido a un bug encontrado en el mismo.

Si os muestra algo distinto a esto, escribid el siguiente comando:

update-alternatives --config javac

Os mostrará un listado con los diferentes paquetes instalados en el sistema que pueden ser utilizados para trabajar con Java. Nosotros usaremos el paquete de Sun, así que pulsa el número del paquete para que Debian lo utilice.

Por último, ejecutamos el siguiente comando para construir las dependencias:

dpkg-buildpackage -uc -us

Una vez instalado procedemos a realizar la configuración de Cassandra:

Creamos varias carpetas necesarias si no han sido creadas automáticamente:

  1. mkdir -p {callouts,commitlog,data,saved,caches,staging}
  2. mkdir /var/log/cassandra

Damos permisos a esta carpeta:

chmod -R 777 /var/log/cassandra/

Creamos el archivo /var/log/cassandra/system.log y le damos permisos:

chmod -R 777 /var/log/cassandra/system.log

 

INSTALANDO THRIFT Y LA EXTENSIÓN PARA PHP

Thrift es tan solo el protocolo de conexión para poder utilizar Cassandra. Aunque en la extensión para PHP existen métodos para poder trabajar con cassandra, requieren bastante código por eso utilizaremos PHPCassa como abstracción de la base de datos.

Primero descargamos Thrift desde su web: http://thrift.apache.org/download/ y descomprimimos

  1. tar -xzvf thrift-0.7.0.tar.gz

Nos colocamos dentro de la carpeta de Thrift.

Antes de hacer nada ahí instalamos algunos paquetes que nos serán necesarios:

  1. apt-get install libboost-dev automake libtool flex bison pkg-config g++

Una vez instalados esos paquetes configuramos y construimos Thrift:

  1. ./configure
  2. make

Construimos la interfaz de PHP Thrift para Cassandra:

  1. ./compiler/cpp/thrift -gen php ../ruta-a-cassandra/interface/cassandra.thrift

Copiamos archivos necesario para que PHPCassa funcione:

  1. mkdir -p /usr/share/php/Thrift
  2. cp -R gen-php/ /usr/share/php/Thrift/packages/
  3. cp -R lib/php/src/* /usr/share/php/Thrift/

Cambiamos al directorio del protocolo de Thrif: ruta-a-thrift/lib/php/src/ext/thrift_protocol.

Instalamos el paquete para construir las extensiones de PHP:

  1. apt-get install php5-dev

Construimos la extensión:

  1. phpize
  2. ./configure --enable-thrift_protocol
  3. make

Copiamos la extensión a la siguiente carpeta (cuidado: dependiendo del sistema el nombre de la carpeta de destino puede variar):

  1. cp modules/thrift_protocol.so /usr/lib/php5/20060613/

Habilitamos el módulo creando el archivo /etc/php5/conf.d/thrift_protocol.ini con el siguiente texto:

  1. extension=thrift_protocol.so

Comprobamos la instalación:

  1. php -i | grep -v "PWD" | grep "thrift_protocol"

Si todo ha ido bien, reiniciamos Apache:

  1. /etc/init.d/apache2 restart

Iniciamos Cassandra:

  1. /opt/cassandra/bin/cassandra -f

Y probamos la consola para comprobar que todo ha ido correctamente:

  1. /opt/cassandra/bin/cassandra-cli -host localhost -port 9160

Debería indicarte algo así:

  1. Connected to: "Test Cluster" on localhost/9160
  2. Welcome to cassandra CLI.

 

INSTALANDO PHPCassa

Bajamos PHPCassa desde github: https://github.com/thobbs/phpcassa

Al descomprimir verás cuatro archivos PHP, copia esos archivos a una carpeta del proyecto en el que estés trabajando.

Abre el archivo “connection.php”, la primera línea será una variable global: $GLOBALS['THRIFT_ROOT'], modifica su valor con la ruta hacia los archivos Thrift que copiamos con anterioridad. En mi caso se quedaría así:

  1. <?php
  2. $GLOBALS['THRIFT_ROOT'] = '/usr/share/php/Thrift/';

Con esto finalizamos la instalación de Cassandra para que pueda ser utilizada por PHP.

Os dejo algunas páginas de interés:
CASSANDRA
http://cassandra.apache.org/
http://cassandra.apache.org/download/
http://wiki.apache.org/cassandra/
http://www.apache.org/dist/cassandra/debian/dists/
http://wiki.apache.org/cassandra/DebianPackaging
http://wiki.apache.org/cassandra/CloudConfig
http://cassandra-user-incubator-apache-org.3065146.n2.nabble.com/Cannot-connect-to-Cassandra-td6463518.html
http://sentidoweb.com/2010/03/18/instalar-cassandra-en-ubuntu.php
http://gettingstartedwithcassandra.blogspot.com/2011/06/exception-connecting-to-localhost9160.html
https://wiki.fourkitchens.com/display/PF/Using+Cassandra+with+PHP
http://es.paperblog.com/instalar-cassandra-en-ubuntu-78327/
http://www.unixmen.com/linux-tutorials/960-install-nosql-cassandra-db-in-ubuntu-via-ppa-repository
http://wiki.apache.org/cassandra/ClientOptions

THRIFT
http://thrift.apache.org/

 



PHPCassa
https://github.com/thobbs/phpcassa
http://groups.google.com/group/phpcassa?pli=1

logo unidadesdemedida.com

unidadesdemedida.com: ¿Cuántas piscinas olímpicas es un campo de fútbol?

0

Desde hace bastante tiempo, los medios de comunicación han utilizado unidades de medida diferentes a las del Sistema Internacional (SI) para medir las nuevas infraestructuras o vehículos que el ser humano crea. Últimamente se ve incluso la utilización de unidades de medida especiales para el coste de los fichajes de deportistas, principalmente en el fútbol.

 

Para aquellos que desean saber cuántas piscinas olímpicas es un campo de fútbol entre otras unidades, no os perdáis mi nuevo proyecto que espero os guste aunque aun le quedan muchas unidades que añadir.

 

Cualquier sugerencia o crítica será bienvenida.

 

Link: http://www.unidadesdemedida.com

Symfony: Enrutamiento (II)

0

Por defecto Symfony no muestra el archivo que hace de controlador (index.php, frontend_dev.php, etc) para cambiarlo vamos al archivo settings.yml aquí podemos indicar que no se muestre el nombre del controlador de la siguiente manera:

  1. prod:
  2. .settings:
  3. no_script_name: off

 

Hiperenlaces, botones y formularios

  1. / Opciones adicionales como array asociativo
  2. <?php echo link_to('Mi artículo', 'articulo/ver?titulo=Economia_en_Francia', array(
  3. 'class' => 'miclasecss',
  4. 'target' => '_blank'
  5. )) ?>
  6.  
  7. // Opciones adicionales como cadena de texto (producen el mismo resultado)
  8. <?php echo link_to('Mi artículo', 'articulo/ver?titulo=Economia_en_Francia','class=miclasecss target=_blank') ?>
  9. => <a href="/url/con/enrutamiento/a/Economia_en_Francia" class="miclasecss" target="_blank">Mi artículo</a>
  1. // URI interna
  2. <?php echo link_to('Mi artículo', 'articulo/ver?titulo=Economia_en_Francia') ?>
  3. => <a href="/url/con/enrutamiento/a/Economia_en_Francia">Mi artículo</a>
  4.  
  5. // URI interna con parámetros dinámicos
  6. <?php echo link_to('Mi artículo', 'articulo/ver?titulo='.$articulo->getTitulo()) ?>
  7.  
  8. // URI interna con anclas (enlaces a secciones internas de la página)
  9. <?php echo link_to('Mi artículo', 'articulo/ver?titulo=Economia_en_Francia#seccion1') ?>
  10. => <a href="/url/con/enrutamiento/a/Economia_en_Francia#seccion1">Mi artículo</a>
  11.  
  12. // URL absolutas
  13. <?php echo link_to('Mi artículo', 'http://www.ejemplo.com/cualquierpagina.html') ?>
  14. => <a href="http://www.ejemplo.com/cualquierpagina.html">Mi artículo</a>
  1. // Enlace simple de texto
  2. <?php echo link_to('Mi artículo', 'articulo/ver?titulo=Economia_en_Francia') ?>
  3. => <a href="/url/con/enrutamiento/a/Economia_en_Francia">Mi artículo</a>
  4.  
  5. // Enlace en una imagen
  6. <?php echo link_to(image_tag('ver.gif'), 'articulo/ver?titulo=Economia_en_Francia') ?>
  7. => <a href="/url/con/enrutamiento/a/Economia_en_Francia"><img src="/images/ver.gif" /></a>
  8.  
  9. // Boton
  10. <?php echo button_to('Mi artículo', 'articulo/ver?titulo=Economia_en_Francia') ?>
  11. => <input value="Mi artículo" type="button" onclick="document.location.href='/url/con/enrutamiento/a/Economia_en_Francia';" />
  12.  
  13. // Formulario
  14. <?php echo form_tag('articulo/ver?titulo=Economia_en_Francia') ?>
  15. => <form method="post" action="/url/con/enrutamiento/a/Economia_en_Francia" />
  1. <?php echo link_to('Borrar elemento', 'item/borrar?id=123', 'confirm=¿Estás seguro?') ?>
  2. => <a onclick="return confirm('¿Estás seguro?');"
  3. href="/url/con/enrutamiento/a/borrar/123.html">Borrar elemento</a>
  4.  
  5. <?php echo link_to('Añadir al carrito', 'carritoCompra/anadir?id=100', 'popup=true') ?>
  6. => <a onclick="window.open(this.href);return false;"
  7. href="/url/con/enrutamiento/a/carritoCompra/anadir/id/100.html">Añadir al carrito</a>
  8.  
  9. <?php echo link_to('Añadir al carrito', 'carritoCompra/anadir?id=100', array(
  10. 'popup' => array('popupWindow', 'width=310,height=400,left=320,top=0')
  11. )) ?>
  12. => <a onclick="window.open(this.href,'popupWindow','width=310,height=400,left=320,top=0');return false;"
  13. href="/url/con/enrutamiento/a/carritoCompra/anadir/id/100.html">Añadir al carrito</a>

 

Symfony: El enrutamiento (I)

0

Continuo con el libro de Symfony 1.4 en esta ocasión toca el enrutamiento.

Normalmente las urls que escribimos son así:

http://www.ejemplo.com/web/galeria/album.php?nombre=mis%20vacaciones

http://www.ejemplo.com/web/weblog/publico/post/listado.php

http://www.ejemplo.com/web/general/contenido/pagina.php?nombre=sobre%20nosotros

Y deberían ser así:

http://www.ejemplo.com/articulos/economia/2006/sectores-actividad.html

Principalmente porque son mucho más legibles para los usuarios y buscadores, y además evitamos mostrar información a un posible atacante.

El sistema de enrutamiento utiliza un archivo de configuración especial, llamado routing.yml, en el que se pueden definir las reglas de enrutamiento.

  1. articulo_segun_titulo:
  2. url: articulos/:tema/:ano/:titulo.html
  3. param: { module: articulo, action: permalink }

Todas las peticiones realizadas a una aplicación Symfony son analizadas en primer lugar por el sistema de enrutamiento (que es muy sencillo porque todas las peticiones se gestionan mediante un único controlador frontal). El sistema de enrutamiento busca coincidencias entre la URL de la petición y los patrones definidos en las reglas de enrutamiento. Si se produce una coincidencia, las partes del patrón que tienen nombre se transforman en parámetros de la petición y se juntan a los parámetros definidos en la clave param:.

Después, la petición se pasa a la acción permalink del módulo articulo, que dispone de toda la información necesaria en los parámetros de la petición para obtener el artículo solicitado.

El mecanismo de enrutamiento también funciona en la otra dirección. Para mostrar las URL en los enlaces de una aplicación, se debe proporcionar al sistema de enrutamiento la información necesaria para determinar la regla que se debe aplicar a cada enlace. Además, no se deben escribir los enlaces directamente con etiquetas <a> (ya que de esta forma no se estaría utilizando el sistema de enrutamiento) sino con un helper especial:

  1. // El helper url_for() transforma una URI interna en una URL externa
  2. <a href="<?php echo url_for('articulo/permalink?tema=economia&ano=2006&titulo=sectores-actividad') ?>">pincha aquí</a>
  3.  
  4. // El helper reconoce que la URI cumple con la regla articulo_segun_titulo
  5. // El sistema de enrutamiento crea una URL externa a partir de el
  6. => <a href="http://www.ejemplo.com/articulos/economia/2006/sectores-actividad.html">pincha aquí</a>
  7.  
  8. // El helper link_to() muestra directamente un enlace
  9. // y evita tener que mezclar PHP y HTML
  10. <?php echo link_to(
  11. 'pincha aqui',
  12. 'articulo/permalink?tema=economia&ano=2006&titulo=sectores-actividad'
  13. ) ?>
  14.  
  15. // Internamente link_to() llama a url_for(), por lo que el resultado es el mismo
  16. => <a href="http://www.ejemplo.com/articulos/economia/2006/sectores-actividad.html">pincha aquí</a>

Sintel | Corto de animación 3D hecho en Blender

0
Imagen de previsualización de YouTube
Ir arriba