Programador PHP freelance

Hoy ha sido un día normal. Lo suficientemente duro como para que no haya tenido tiempo de averiguar que se movía por la red.

Al margen de esa inopia, en una mis breves incursiones por Twitter he detectado movimientos interesantes entre la comunidad. En concreto se ha promovido un manifiesto que, como bien dice @suenosdelarazon en su blog, atiende al más puro sentido común. La industria de la ‘cultura’ saca sus garras, el gobierno mueve ficha y ahora la comunidad, de forma espontánea e improvisada, se pone las pilas y decide forjar un arma a modo de manifiesto que contrarreste tanta sinrazón.

Y como no, me veo moralmente obligado a secundarlo y espero además que sirva para hacer despertar del letargo este blog, dicho sea de paso ;-)

Ahí va el manifiesto… y si lo consideráis oportuno re-publícadlo donde queráis.

Ante la inclusión en el Anteproyecto de Ley de Economía Sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…

  1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
  2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
  3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
  4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
  5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
  6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
  7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
  8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
  9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
  10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

18 Feb, 2009

Revivir el 23-F. Una experiencia Twitter

Posted by: admin In: Desarrollo

Unos amigos y yo hemos decidido experimentar sobre las posibilidades de Twitter para ver hasta donde llega y hemos creado un experimento basado en el inminente 23-F.

Aquí tenéis el enlace para engancharse al evento.

Sigue el 23-F minuto a minuto en Twitter

La idea es retransmitir por Twitter el próximo 23-F como si aún estuviéramos en 1981. De hecho, como si en 1981 hubiéramos tenido Twitter. Minuto a minuto. Dando todos los detalles de lo que ocurrió justo en el mismo momento del día en que ocurrió y crear así una experiencia colectiva. Nuestra intención no es para nada abrir debate político sino que la experiencia sirva como plataforma para compartir un momento pasado colectivo a partir de vivencias individuales. Particularmente solo recuerdo que mi madre tenia miedo y que yo no entendía pq no iba al colegio. Cada cual tendrá sus recuerdos y todos pueden ser puestos en común utilizando Twitter.

Creemos que puede ser algo interesante y solo lamentamos no haber tenido más tiempo para su desarrollo (tuvimos la idea este domingo y disponemos de poco tiempo libre)

Cualquier consejo, apoyo o movimiento a favor será recompensado con gratitud, que para la gente de bien, es el mejor de los premios. [ No descartamos invitar a un café a los colaboradores ;-) ]

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

26 Dec, 2008

Un nuevo año que entra

Posted by: admin In: Desarrollo

Ya se acaba este año y ha sido muy divertido y gratificante. Otro año más he tenido la oportunidad de crecer profesional y personalmente.

Hemos tenido de todo. Proyectos complejos, proyectos graciosos, proyectos apasionantes, etc… pero la nota común siempre ha sido el sentimiento de emoción en cada uno de ellos.

Solo por esto ya ha valido la pena pasar este año… y como nada me dice que el año que viene va a ser diferente…

felicitacion 2009

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

08 Oct, 2008

Longitud máxima del title, description y keywords

Posted by: admin In: SEO

El tema ha ido evolucionando bastante y cada vez los crawlers se ponen más duros y restrictivos con sus requisitos. Por eso posteo aquí cuales son las longitudes máximas recomendables para caerles bien a nuestros amigos los buscadores y conseguir mejor posicionamiento.

La longitud máxima del title no debería ser superior a 80 carácteres.

Por otro lado, la longitud máxima del description no debería ser superior a 250 carácteres.

Y para terminar, la longitud máxima de keywords debería de ser de 25 palabras o 500 carácteres.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]
Tags: , ,

Me he visto en la tesitura de intentar cambiar en dinámico el tipo de un input de tipo text a tipo password y viceversa.

Algo tan sencillo como hacer lo siguiente:

obj = document. getElementById('campo_password');
obj.type = 'text';

Todo funciona perfectamente con Firefox pero cuando lo he probado con Internet Explorer 7 el navegador me devuelve un error con el objeto y no hay manera.

He probado a realizar el cambio desde jquery para que el framework se encargara de realizar la modificación pero tampoco ha funcionado. Internet Explorer devuelve el mismo error. Grrrrrrrrrrr

Al final he encontrado este código por Internet que soluciona el problema. Hace más cosas pero seguro que un programador espabilado sabrá aislar la funcionalidad que necesite ;-)

Llamandolo así convertireís el campo a tipo text donde thisInput es el objeto input

changeInputType(thisInput,'text',txtLabel,false,true);
function changeInputType(
  oldElm, // a reference to the input element
  iType, // value of the type property: 'text' or 'password'
  iValue, // the default value, set to 'password' in the demo
  blankValue, // true if the value should be empty, false otherwise
  noFocus) {  // set to true if the element should not be given focus
 
  if(!oldElm || !oldElm.parentNode || (iType.length<4) || 
    !document.getElementById || !document.createElement) return;
  var newElm = document.createElement('input');
  newElm.type = iType;
  if(oldElm.name) newElm.name = oldElm.name;
  if(oldElm.id) newElm.id = oldElm.id;
  if(oldElm.className) newElm.className = oldElm.className;
  if(oldElm.size) newElm.size = oldElm.size;
  if(oldElm.tabIndex) newElm.tabIndex = oldElm.tabIndex;
  if(oldElm.accessKey) newElm.accessKey = oldElm.accessKey;
  newElm.onfocus = function(){return function(){
    if(this.hasFocus) return;
    var newElm = changeInputType(this,'password',iValue,
      (this.value.toLowerCase()==iValue.toLowerCase())?true:false);
    if(newElm) newElm.hasFocus=true;
  }}();
  newElm.onblur = function(){return function(){
    if(this.hasFocus)
    if(this.value=='' || (this.value.toLowerCase()==iValue.toLowerCase())) {
      changeInputType(this,'text',iValue,false,true);
    }
  }}();
 // hasFocus is to prevent a loop where onfocus is triggered over and over again
  newElm.hasFocus=false;
  oldElm.parentNode.replaceChild(newElm,oldElm);
  if(!blankValue) newElm.value = iValue;
  if(!noFocus || typeof(noFocus)=='undefined') {
    window.tempElm = newElm;
    setTimeout("tempElm.hasFocus=true;tempElm.focus();",1);
  }
  return newElm;
}
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

04 Oct, 2008

Configurar el servidor MySQL con UTF8

Posted by: admin In: Desarrollo| Sistemas

Siguiendo con los bricoconsejos para trabajar con MySQL y UTF8, dejo aquí los parámetros que hay que modificar en el fichero de configuración my.cnf para que todo se ejecute por defecto en UTF8.

[mysqld]
character-set-filesystem=UTF8
character-set-server=UTF8
default-collation=UTF8_general_ci
default-character-set=UTF8

[client]
default-character-set=UTF8

[mysqldump]
default-character-set=UTF8
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]
Tags: ,

04 Oct, 2008

Pasar parámetros por defecto en Javascript

Posted by: admin In: Desarrollo

Es una lástima pero Javascript, al contrario que otros lenguajes, no permite pasar parámetros por defecto en sus funciones.

Esto tiene solución mediante un pequeño truco en el código.

Imaginad que tenemos esto:

1
2
3
4
function test(arg) {
  arg = arg || 23;
  return arg;
}

Si llamamos a test() sin parametro nos va a devolver 23. Problema resuelto de forma sencilla ;-)

Pero seamos más puristas.

Si por ejemplo la llamamos pasándole el valor NULL nos vamos a encontrar con que también nos devolverá 23 y en algunos casos nos puede interesar manejar el valor NULL de forma diferente

Si quisieramos corregirlo tendríamos que utilizar esto:

function test(arg) {
  arg = (typeof arg == ‘undefined’) ? 23 : arg;
  return arg;
}

Con esta opción si llamamos a test() sin parámetro nos devuelve 23 pero si llamamos a test(null) nos devolvería null con lo que podriamos manejar el caso de forma diferente.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

La función en principio está pensada para convertir una cadena - el título de un post por ejemplo - en una URL amigable o URL friendly.

Por ejemplo. La cadena Hola mundo! (Continuación) al pasarla por la función quedaría convertida en hola-mundo-(continuacion)
Me encontré con varias funciones por ahí que hacían lo mismo pero me dieron muchos problemas porque trabajaban directamente con caracteres en vez de con el código del carácter.
Por otro lado adaptar la función para que solo elimine los acentos es inmediato por eso lo he puesto en el título del post. Por eso y porque ahora en un proyecto vuelvo a ella para reutilizarla en ese sentido.

Probarla y si os gusta y os funciona podéis dejarme un comentario para que lo sepa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function desaccent($string)
{
$string = strtolower($string) ;$string = str_replace(”?”, “”, $string) ;
$string = str_replace(”¿”, “”, $string) ;
$string = str_replace(!, “”, $string) ;
$string = str_replace(*, “”, $string) ;
$string = str_replace(,, “”, $string) ;
 
return strtr(utf8_decode($string),
“\xe1\xc1\xe0\xc0\xe2\xc2\xe4\xc4\xe3\xc3\xe5\xc5″.
“\xaa\xe7\xc7\xe9\xc9\xe8\xc8\xea\xca\xeb\xcb\xed”.
“\xcd\xec\xcc\xee\xce\xef\xcf\xf1\xd1\xf3\xd3\xf2″.
“\xd2\xf4\xd4\xf6\xd6\xf5\xd5\x8\xd8\xba\xf0\xfa\xda”.
“\xf9\xd9\xfb\xdb\xfc\xdc\xfd\xdd\xff\xe6\xc6\xdf\xf8″..’”,
“aAaAaAaAaAaAacCeEeEeEeEiIiIiIiInNo”.
“OoOoOoOoOoOoouUuUuUuUyYyaAso—”);
}
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

18 Sep, 2008

Generar una fecha aleatoria en MySQL

Posted by: admin In: Desarrollo

Pego aquí una query para insertar fechas aleatorias en una tabla de MySQL.

update mytable
set mycolumn = str_to_date(
concat(
floor(1 + rand() * (12-1)), /* Generate a random month */
'-',
floor(1 + rand() * (28 -1)), /* Generate a random day */
'-',
'2008'
),
'%m-%d-%Y'
);

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

10 Sep, 2008

PEAR DB_DataObject + MySQL + UTF8

Posted by: admin In: Desarrollo

El paquete PEAR::DB_DataObject es uno de mis preferidos. Siempre que puedo lo utilizo en mis proyectos y por ahora con muy buenos resultados. Básicamente me ayuda a clarificar el código ya que paso a tener objetos en vez de registros y propiedades en vez de campos. Por otro lado aprovecho su distribución en sistema de ficheros para codificar la capa de datos, cada método en la clase que hace referencia a la tabla o concepto. Por ejemplo, si tengo un método que marca al usuario como eliminado después de hacer unas comprobaciones previas sé que lo voy a poner en la clase que hace referencia a la tabla ‘usuario’ con lo que resulta muy cómodo a la hora de mantener el código legible y bien organizado.
Además el paquete abstrae el acceso al servidor de forma que puedo cambiar mañana mi aplicación de MySQL a PostgreSQL sin tener que cambiar todas las llamadas a bases de datos. Genial, vaya!!!

Pues este paquete tan genial tiene una pequeña carencia con la que me he encontrado hoy.

Resulta que en una codificación he utilizado un MySQL con el charset en UTF8. Todo funcionaba bien si la carga de los datos se realizaba mediante la interfaz web pero en el momento se insertaba algún registro mediante phpMyAdmin con algún caracter especial, como un acento, este aparecía representado con caracteres extraños en la interfaz web de mi aplicación.

El problema es bastante sencillo, MySQL permite definir el charset a varios niveles de comunicación de forma que podemos enviar los datos en UTF8 pero recibirlos en latin1, por ejemplo. Podéis ver más información aquí

En concreto mi problema se debía a que el charset por defecto para los datos devueltos desde el servidor era latin1 lo que producía el efecto explicado anteriormente. Por otro lado el charset para los datos enviados desde el cliente al servidor también se encontraba en latin1 lo que introducía datos en la base de datos en un charset no deseado. El problema se soluciona fijando todas las comunicaciones en UTF8 para lo cual, la forma más sencilla es lanzando la siguiente query:
‘SET NAMES UTF8′.

Esto debe de lanzarse en cada conexión, lo que resulta bastante sencillo de implementar cuando estás trabajando con DB_DataObject ya que lo único que hay que hacer es sobreescribir el método que realiza la conexión.

Pegó aquí un ejemplo donde he optado por añadir una option más que permite lanzar cualquier comando inmediatamente despues de la conexión.

He puesto un feature request en la página del paquete para que los desarrolladores se planteen añadir una option charset que permita definir el mismo sin tener que sobreescribir la clase.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
require_once ‘DB/DataObject.php’;
 
class DB_DataObject_Custom extends DB_DataObject {
 
  // Overwrite _connect because we add after_connection_command to set charset in mysql
  public function _connect() {
 
    parent::_connect();
 
    if(isset($GLOBALS['_DB_DATAOBJECT']['CONFIG']['after_connection_command'])) {
      $DB = $GLOBALS['_DB_DATAOBJECT']['CONNECTIONS'][$this->_database_dsn_md5];
      if ($DB->phptype ==mysql) {
        $DB->query($GLOBALS['_DB_DATAOBJECT']['CONFIG']['after_connection_command']);
      }
    }
 
    return true;
 
  }
 
}

Gran noticia!!!
En mi caso, mi aplicación utilizaba el paquete DB como driver para el DB_DataObject. Como sabréis este paquete se ha abandonado en pro de MDB2 que sí que permite la definición del charset en el DSN. He cambiado el driver a MDB2, he fijado el charset a UTF8 y a funcionar. Puedo descartar el uso de la clase DB_DataObject_Custom aunque ahí dejo el ejemplo para posibles ampliaciones de los option

Pongo un ejemplo en el que se puede observar como se setea el charset a UTF8 y el driver de la base de datos a MDB2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$DB_DSN = array(
  'phptype' => 'mysql',
  'username' => 'user',
  'password' => 'pass',
  'hostspec' => 'localhost',
  'database' => 'dbname',
  'charset' => 'utf8',
);
 
// DataObject configuration
$options = &PEAR::getStaticProperty('DB_DataObject','options');
$options = array(
  'database'         => $DB_DSN,
  'schema_location'  => './classes/dal',
  'class_location'   => './classes/dal',
  'require_prefix'   => './classes/dal',
  'class_prefix'     => 'DAO_',
  'db_driver' => 'MDB2'
);
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Categories

Publicidad

About

ProgramadorPHP.es es el blog profesional de Vicent González i Castells, programador freelance especializado en desarrollo de aplicaciones web. vigoncas@aaa.upv.es

CURRÍCULUM

Tags