Entradas

Mostrando entradas de 2010

Valores aleatorios en MySQL

MySQL tiene la función RAND() para devolver valores aleatorios y en este post lo que voy a comentar es que no es tan óptimo utilizarla en caso de que queramos un registro aleatorio de una tabla. Por ejemplo, imagina que quieres un registro aleatorio de una tabla, utilizando RAND() lo tendríamos con la siguiente query: select * from tabla orde by RAND () limit 1 Esta consulta es mucho menos eficiente que si ejecutamos la siguiente: select * from tabla limit X,1 Dónde X sería un valor aleatorio generado en un lenguaje de servidor entre 1 y el total de registros de la tabla, claro para esto necesitamos saber ese valor máximo pero si lo tienes te recomiendo que utilices la segunda consulta que es una media de 4 a 5 veces más rápida que la primera.

Comprimir y ofuscar código javascript

Imagen
Con el avance de javascript como parte cada vez más importante en el desarrollo de aplicaciones web, el comprimir su contenido y a la vez ofuscarlo para evitar ingeniería inversa son 2 procesos cada vez más habituales, pero, no todo lo que brilla es oro; aquí quiero mostrar las ventajas y desventajas de ofuscar y comprimir el código javascript de una aplicación web. Como todo en programación es relativo aquí solo me limitaré a cosas y características generales, luego cada programador debe decidir realmente lo que quiere. Ventajas de comprimir y ofuscar javascript el código resultante es mucho más ligero de descargar sin penalizar el rendimiento. haces más difícil el proceso de ingeniería inversa (aunque solo es ralentizarlo con las herramientas de desofuscación actuales) Desventajas la corrección de errores y modificación del código resulta casi imposible en código ofuscado por tanto o se tiene el código fuente y se ofusca cada vez que hay un

HTML 5, JQuery y los atributos DATA

Desde que utilizamos jquery muchas veces nos vemos obligados a crearnos atributos con nombres 'raros' dentro de tags HTML para tener almacenadas algunas propiedades extras como por ejemplo: <a id='d' href='x' numero='1' valor='3' /> En este caso numero y valor no son atributos reconocidos por los navegadores aunque con jquery si funciona $('#d').attr('numero') Para estos casos en HTML 5 se han inventado los atributos DATA por ejemplo: <li class="user" data-name="John Resig" data-city="Boston" data-lang="js" data-food="Bacon"> Donde lo que vaya despues de data- nos lo podemos inventar y estos parámetros si son reconocidos por los navegadores y jquery desde la versión 1.4.4 (la última) incorpora una función específica para los mismos: $("li").data("name") === "John Resig"; Incluso pueden definirse objetos json dentro de estos at

Diferencias entre apache 2.0 y 2.2

El otro día estuve instalando apache 2.2 y noté algunas diferencias interesantes respecto a la versión 2.0 del mismo servidor web. Librerías incluidas por defecto en apache 2.2 Ahora apache 2.2 trae instaladas por defecto las librerías xml, zip y mycrypt. Módulos sustituidos en apache 2.2 La nueva versión de apache ha sustituido algunos módulos y los ha unificado con otros que trae instalados por defecto, dichos módulos sustituidos en la versión 2.2 son los siguientes: LoadModule access_module modules/mod_access.so LoadModule auth_module modules/mod_auth.so LoadModule imap_module modules/mod_imap.so

Error ZDS: Bad escape sequence

Un error común, por lo menos para mí, cuando trabajo con el Zend Development Studio (ZDS) es el de Bad escape sequence cuando pongo el caracter “\” dentro de una cadena. Por ejemplo, imagina que tenemos: include_once “c:\archivo.php” Esta instrucción estaría correcta realmente pero el ZDS marca el error como bad escape sequence \a . La solución es muy sencilla, en vez de utilizar comillas dobles “ en la cadena debemos de utilizar comillas simples ‘, de esta forma ya el Zend no identifica esto como un error porque interpreta la cadena de otra manera. ¡Curioso!

Google Chrome intenta hacernos programar bien

Desde las versiones más recientes de Google Chrome se pueden ir observando cambios en la gestión de los códigos javascript, por ejemplo en las redirecciones. Mientras que en versiones anteriores y en otros navegadores como Firefox la siguiente instrucción redirigiría a la página 1, las últimas versiones de Chrome (8 y 9) redirigen a la página 2 en el siguiente código: if ( true ) location.replace = 'pagina1' location.replace = 'pagina2' Lo correcto sería: if ( true ) location.replace = 'pagina1' else location.replace = 'pagina2' Otra de las cosas que podemos notar es que cada vez es más estricto con el HTML y por ejemplo si tenemos unas etiquetas </script> sin cerrar con ‘>’ o sea </script ese archivo en concreto lo cargaría pero los siguientes no, por ejemplo el archivo 2 del siguiente ejemplo no seria cargado: < script type = "text/javascript" src = "archivo1" > </script <script type= &q

MySQL error number 1130

Otro de los errores clásicos al crear una nueva cuenta de hosting en un servidor cloud de 1and1 es MySQL error number 1130 host nombre del host is not allowed to connect to this server . Lo primero que tenemos que comprobar es el firewall y mirar si para el servicio de MySQL están abiertos o cerrados las conexiones externas. En los servidores cloud de 1and1 por defecto el usuario root de mysql no puede acceder remotamente por ello tenemos que crear un usuario con permisos para acceder desde un terminal remoto, esto no es recomendable pues representa una fuente más de ataques posibles a nuestro servidor MySQL pero en caso que queramos acceder desde nuestra casa a través de MySQL Center u otra herramienta remota y el firewall esté correctamente configurado tendríamos que crear un usuario para acceder. Como ejemplo os pongo esta instrucción que desde consola crearía un usuario con poderes: GRANT ALL PRIVILEGES ON *.* TO 'usuario'@'%' IDENTIFIED BY 'contraseña

Error SQL 1040: Too many connections

Imagen
La configuración por defecto de MySQL es de 100 conexiones como máximo, esto viene por defecto al instalarlo y por tanto en cualquier CentOS de 1and1. La opción max_connections la podemos editar en el archivo de configuración de mysql my.cnf que se encuentra en las distro de CentOS en /etc/. Esta opción no viene por defecto en este archivo por lo que debemos agregarla justo en el bloque de configuraciones de [mysqld] max_connections = 500 500 es el número que se pone generalmente en todos lo tutoriales pero algunas veces bastaría con 200 o 300, hay que tener en cuanta la cantidad de memoria RAM que tiene nuestro plan de hosting o servidor pues debe cumplir la siguiente fórmula para que el sistema operativo y el resto de funciones puedan trabajar correctamente: global buffers + (thread buffers * max_connections) < RAM ¿Cuáles son los global buffers de MySQL? key_buffer, innodb_buffer_pool, innodb_log_buffer, innodb_additional_mem_pool, net_buffer ¿Cuáles son los Thre

Agregando repositorios en CentOS 5

Imagen
Con el nuevo servidor cloud que he contratado he necesitado actualizar algunos paquetes por defecto de CentOS y agregar nuevos, la forma más cómoda y compatible es hacerlo con yum porque nos olvidamos de dependencias o de compilar lo que nos haga falta. La única pega de yum es que se basa en repositorios y en CentOS la verdad es que por defecto no van muy sobrados. Aquí os dejo los pasos que he seguido para actualizar mi CentOS 5, agregar nuevos repositorios y actualizar a versiones más actuales de algunos programas como PHP. Actualizando CentOS Lo primero que haremos será actualizar todo con los repositorios por defecto #yum update Luego instalaremos el pluging para yum priorities, con él podremos asignar las prioridades a nuestros repositorios instalados #yum install yum-priorities Una vez instalado tenemos que editar el archivo de configuración que se encuentra en /etc/yum/pluginconf.d/priorities.conf y poner a 1 el valor enable. Luego veremos como editar los re

Calcular el día máximo de un mes

Para celebrar el nuevo diseño del blog, por cierto muy buena la actualización de blogger para cambiar el diseño y las plantillas, os dejo esta función que según el mes te devuelve el día máximo del mes, o sea de enero el 31 y febrero si es un año bisiesto 29 y de lo contrario 28. Espero que os sirva: function dameMaximoDiaMes($mes,$anno = null){ if (is_numeric($mes) && ! empty ($mes) && $mes < 13){ $largos = array (1,3,5,7,8,10,12); $cortos = array (4,6,9,11); if (in_array($mes,$largos)) return 31; if (in_array($mes,$cortos)) return 30; if ( empty ($anno) || !is_numeric($anno) || $anno < 0) return 28; $cualquiera = "$anno-01-01" ; $biciesto = date( "L" ,strtotime($cualquiera)); return (! empty ($biciesto))?29:28; } return false; } ¿Alguna otra forma?

Operadores terciarios en PHP

Existen varias formas de poner condicionales en PHP: if(a){…}else{…} Pero si utilizas operadores terciarios muchas veces es más sencillo: <?=(a)?’HOLA’:’ADIOS’?> Pero lo que no sabía es que el paréntesis es opcional, por tanto la siguiente expresión es tan válida como la primera: <?=a?’HOLA’:’ADIOS’?>

Valores timestamp con MySQL

Aquí os dejo algunas consideraciones sobre los tipos de datos TIMESTAMP en MySQL: Son los únicos campos de fechas que puedes ponerle como valor por defecto CURRENT_TIMESTAMP y también ON CHANGE CURRENT_TIMESTAMP, pero solo puede ser un campo por tabla. NO admiten valores nulos, al primer campo de una tabla cogerá automáticamente el valor CURRENT_TIMESTAMP y los siguientes tendrán el valor 0000-00-00 00:00:00. Almacenan la misma información que un DATETIME. Espero que os sirva pues estos campos son ideales para valores del tipo fecha de actualización o fecha de modificación.

Apache, PHP y SQL Server: VC9 y x86

Imagen
Este manual tiene el objetivo de instalar las últimas versiones de Apache, PHP y el driver de SQL Server de Microsoft para PHP . El software se instalará en una máquina con sistema operativo de 64 bits y se instalarán las versiones compiladas en VC9 y la distribución de PHP Thread Safe (TS). Una traducción un poco literal para las versiones de PHP sería Thread Safe (segura) y otra Non Thread Safe (no segura). Diferencias entre las versiones de PHP Thread Safe y Non-Thread Safe Diferencias entre VC9 y VC6 La diferencia entre las versiones VC6 y VC9 es el compilador usado para generarlas. VC6 (Visual Studio 6 Compiler) y VC9 (Visual Studio 2008 Compiler) Si usas PHP con Apache 1 o Apache2 de apache.org tienes que utilizar la versión VC6 de PHP. Si usas PHP con IIS, debe utilizar las versiones de PHP VC9. Las versiones VC6 se compilan con el antiguo Visual Studio 6 compilador y las versiones VC9 se compilan con el compilador de Visual Studio 2008 y tiene mejoras en el rendimie

Imprimir un texto con echo en PHP

El primer método, <?php. . .?>, el de toda la vida, que permite el uso de PHP en código XML como XHTML. <?php echo "Hola mundo"; ?> El segundo método no siempre está disponible. El formato corto de etiquetas está disponible activando el short_open_tag en el php.ini. Desactivado por defecto en php.ini, se desaconseja el uso del formato de etiquetas cortas cuando no se tiene control sobre el servidor. <?= ‘Hola mundo’ ?> El tercer método es muy largo y lleva a confusiones con código Javascript que tiene casi la misma etiqueta. <script language="php"> echo ("Otro tipo de etiquetas"); </script> El cuarto método sólo está disponible si se han activado las etiquetas ASP en el fichero de configuración: asp_tags. <%= $variable;%>

Joomla y el copyright

Hoy revisando una antigua página hecha en joomla he visto la siguiente línea en el meta tag generator: Joomla! - Copyright (C) 2005 - 2006 Open Source Matters. All rights reserved No sé a vosotros pero a mi me resulta raro ver en una misma oración Open source y copyright.

Controlar la tecla F5 con jquery

Si alguna vez os habéis preguntado cómo controlar la recarga de una página con F5 mediante javascript aquí hay un pequeño código que lo hace utilizando jquery y el plugin jalert para mostrar el cartel de confirmación. El código de la tecla F5 es el 116. Veamos el código para controlar la pulsación de la tecla F5 con javascript y jquery: $( function () { $(document).keydown( function (e){ var code = (e.keyCode ? e.keyCode : e.which); if (code == 116) { e.preventDefault(); jConfirm( '¿Deseas recargar la página?' , 'Confirmación' , function (r) { if (r) location.reload(); }); } }); });

jQuery, ajax, chrome y tabs

Hoy ha ocurrido algo muy curioso, tenemos un código que envía por ajax una petición al servidor y el dato devuelto lo asimila otra función para enviar un formulario, veamos el código: $.ajax({ type: "POST" , url: "carga.php?Accion=Identifica" , data: "variable=" +valor, async: true , contentType: "application/x-www-form-urlencoded" , dataType: "text" , success: function (tipo){ enviarFormulario(tipo,valor); } }); La única desventaja es que enviar un formulario desde dentro de la función success en chrome es identificado como un pop-up no como una nueva ventana o un nuevo tab, en firefox si funciona correctamente, la solución paso por declarar una variable anterior que guarde los datos recogidos del ajax, el ajax declararlo como NO asíncrono y luego enviar el formulario fuera. Curioso sin dudas ¿os ha pasado? Actualización: Código de la función que envía el formulario function enviarFormulario(tipo,dato){ var

Cosas a tener en cuenta

Si, utilizando a Murphy, y vale decirlo, modificándolo un poco, he elaborado un listado de las cosas importantes que hay que tener en cuanta a la hora de diseñar un proyecto nuevo y presentar el presupuesto acertado: Todo lleva más tiempo del que crees. Si existe la posibilidad de que varias cosas vayan mal, la más perjudicial será la única que lo haga. Si crees que hay X posibilidades de que una gestión vaya mal y las evitas, al momento aparecerá espontáneamente una posibilidad no contemplada. Cuando las cosas se dejan a su aire, suelen ir de mal en peor. En cuanto hagas algo, te darás cuenta de que hay otra cosa que deberías haber hecho antes. Cualquier solución entraña nuevos problemas. Es inútil hacer algo a prueba de tontos, porque los tontos son muy ingeniosos. La naturaleza siempre está de parte de la imperfección oculta. Es imposible enseñar algo a alguien que cree saberlo. Cuando se intenta demostrar que algo no funciona, funcionará. Es

¿Cómo describir una función en PHP?

Los comentarios son algo fundamental para tener un control exclusivo de una aplicación en un futuro cuando nos toque modificar algo, sobre todo si son proyectos grandes, existe una notación para hacer esto y que sea compatible con PHPDoc , los parámetros son los siguientes: @abstract @access (public|private) @author Nombre [Email] [, Nombre [Email]] @brother (function(), $variable) @const[ant] descripción @deprec[ated] label @exclude label @final @global @include descripción @link URL [descripción] @magic descripción @module label @modulegroup label @param[eter] (object objectname|type) [$varname] [descripción] @return (object objectname|type) [$varname] @see [(class|module:]function()|$varname [,[(class|module:J]function()|$varname] @since label @static @throws exception [, exception] @todo descripción @var[iable] (object objectname|type) [$varname] [descripción] @version label

Seguimos haciendo las cosas mal

Acabo de ver en un mismo día dos grandes atrocidades en este mundo del posicionamiento web, los editores siguen pensando que al repetir palabras claves en las etiquetas están haciendo algo útil a la hora de posicionar los contenidos, una etiqueta es para agrupar contenidos, para saber que post está relacionado con que post y no para ganar densidad de palabras claves, por ejemplo he visto esto hoy (con otras palabras por supuesto): paco, paco va al mercado, al mercado va paco, paco mercado Esto es una estupidez del tamaño de un pino, pon etiquetas útiles en tu blog, que ayude a los lectores, ¡no repitas! La otra tontería es seguir insistiendo en el intercambio de link ¡no no me interesa intercambiar links! cuando crea que hay algo útil ya lo publicaré yo y enlazaré yo según mi criterio.

Google y el mundial de fútbol

Imagen
No es raro encontrar en Google cuando haces una búsqueda sobre los partidos del mundial de Sudáfrica los datos de los sitios dónde los puedes ver, las últimas noticias e incluso los resultados de los partidos. Esto es un sistema montado por el propio Google sólo para la copa del mundo de 2010 y en él se pueden ver todos los partidos que se emiten cada día y la clasificación de los grupos. Lo que me ha parecido curioso son los resultados que muestra según que buscas, por ejemplo para las búsquedas: partido España , FIFA España , mundial España , copa mundial España , muestra la siguiente imagen: Para la búsqueda España Chile : Y para España vs Chile (nótese como no muestra los lugares dónde se emitirá el partido): ¡Interesante! PD: si buscas España solamente o copa España no muestra ningún resultado referente al mundial de fútbol.

Herramientas útiles en enlaces

En realidad tengo estos enlaces perdidos por varios sitios así que los voy a air agrupando por aquí, más que nada para darme un poco de orden y que si a alguien le sirva pues lo puedan utilizar. Proteger los mail to con PHP contra robots. Validar correos electrónicos comparando también el dominio, además comprueba funciones para saber si está en una lista negra. Código de validación completo , se complementa con la página anterior. Otro validador completo , elegir entre uno y otro. Códigos HTML, tabla de caracteres y símbolos .

Ser agradecidos con los bloggers

Imagen
Cuando nos suscribimos a un blog y leemos sus artículos desde nuestro lector de RSS favorito no estamos visitando la página del blog en cuestión pero si podemos ayudarlo de varias maneras, hoy quiero analizar Google Reader y 3 opciones muy útiles que aunque parezcan lo mismo no lo son: La estrella de destacar : esta opción es para ti, para que organices internamente los post que más te gusten, realmente el autor del blog no se va a enterar de esto. La carita sonriente de me gusta : aquí si se entera el blogger, esto es para él, para que le digas que su artículo ha sido bueno, para darle ánimos a seguir escribiendo. Compartir : esto es para todos, para ti porque lo compartes con tus amigos, para el blogger porque le das publicidad a su artículo y para tus amigos porque se van a beneficiar de lo que has puesto. Bueno después de esto espero que lo uséis ¡no es más que un click!

Errores de herencia en PHP5

Hoy he descubierto que en PHP si tienes una clase abstracta esta clase no puede heredar de ninguna otra. Lo más gracioso es que en la versión 5.2.6 que es la que utilizo no muestra ningún error específico lo único que dice PHP es que no encuentra la clase en cuestión. ¿Por qué una clase abstracta no puede heredar de otra? ¿Por qué PHP no permite la herencia múltiple? ¿Por qué PHP no permite el polimorfismo?

Error con la librería de SSH2 en PHP

Si has instalado la librería de PECL SSH2 y te ha dado el siguiente error: Unable to load php_ssh2.dll La solución es copiar desde el paquete de PHP el archivo libeay32.dll en el directorio bin del directorio de instalación de Apache. Parece que php_ssh2.dll necesita una versión más reciente de la DLL del que viene incluido en Apache, y aunque lo copies a C: \ WINDOWS o C: \ WINDOWS \ System32 siempre intenta cargarlo desde el directorio bin de Apache. Esto es un bug reconocido de PECL #11058 .

Siguiendo con Google

Imagen
En varios artículos de este blog he hablado y analizado las optimizaciones de Google , fundamentalmente las de su página principal, estas, supongo, para no sobrecargar tanto sus servidores con las millones de visitas diarias y de esta manera entregar al usuario una página totalmente optimizada. Pues pensando en eso hay una cifra que me gustaría conocer ¿cuanto ha ganado Google con las barras multifunción de los navegadores? Puede que parezca una tontería pero antes de existir estas yo visitaba la home de Google varias veces al día y ahora si lo hago una es un milagro. Realmente me he dado cuenta de esto porque no me entero de los cambios en su home hasta pasadas unas horas e incluso días. Muy buena estrategia. ¿Alguien tiene alguna teoría de la conspiración para las imágenes de fondo de la home? esto claramente penaliza el rendimiento pero imagino que sea por una causa mayor como la que he escuchado por ahí de adaptarnos a que su home sea nuestro escritorio.

Firmar aplicaciones para symbian

Imagen
He modificado varios tutoriales de internet para firmar aplicaciones en móviles con SO Symbian, añadiéndole algunas funcionalidades como: firmar las aplicaciones con extensión SIS y SISX firmar aplicaciones symbian en nuestro propio PCP y no de manera online correcciones a la hora de introducir el IMEI en la web de la OPDA para evitar errores de Wrong IMEI, please check carefully! Este tutorial lo he realizado en el siguiente PDF: Instalar aplicación en móviles symbian y cuenta con las siguientes partes: configuración previa del móvil solicitar un certificado válido en la web en inglés de la OPDA obtener el IMEI de tú teléfono y como validarlo y saber si es correcto solicitar el certificado firmar las aplicaciones utilizando SignSISTool y signsis.exe Espero que os sirva de utilizad, yo le he probado en mi Samsung Omnia HD I8910 y funciona perfecto. Nota Importante: los errores corregidos con este tutorial a la hora de instalar las aplicacione

Bug en firefox al ordenar arrays

Imagen
Si tenemos el siguiente código javascript: var x; var mycars = new Array(); mycars[2] = "Saab" ; mycars[1] = "Volvo" ; mycars[0] = "BMW" ; for (x in mycars) { document.write(mycars[x] + "<br />" ); } Esto sacaría por pantalla lo siguiente: BMW – Volvo – Saab Sin embargo si la diferencia de índices es muy grande firefox interpreta los índices como cadenas (el resto de navegadores los continúa ordenando bien), por ejemplo si fuera: var mycars = new Array(); mycars[1500] = "Saab" ; mycars[30] = "Volvo" ; mycars[20] = "BMW" ; En vez de sacar por pantalla BMW – Volvo – Saab sacaría Saab – Volvo – BMW ¡Curioso!

Frameworks vs frameworks

Imagen
Los frameworks han llegado al mundo de la programación para quedarse, por su facilidad de uso y el poco conocimiento que se necesita para implementarlos, esto sumado a la gran cantidad de material que se puede encontrar de cada uno de ellos. Existen distintos tipos pero yo los separo en dos grandes categorías los del lado cliente y los del lado servidor. La única pega de estos es el consumo de recursos, al ser procedimientos estándar y estar validados para las más disímiles plataformas el consumo de recursos es mucho más elevado que un software a medida, es por ello que debemos mirar si nos compensa o no utilizarlos. ¿Por qué no utilizo un framework para PHP? Pues básicamente por el consumo de recursos, el hosting es mucho más elevado para servidores potentes e implementar un framework me llevaría casi el mismo tiempo (por el estudio que hay que hacer sobre como funciona) que programar funciones ya conocidas por mí y muchos más eficientes en mi entorno. ¿Por qué utilizo un fr

Librerías útiles en javascript

Imagen
Aparte de jquery que es el framework que utilizo por excelencia tengo algunas librerías imprescindibles para javascript: PHPjs : php.js es un proyecto de código abierto que codifica las funciones PHP de alto nivel para las plataformas Javascript de bajo nivel, tales como navegadores web, extensiones del navegador (Mozilla / Firefox, Chrome), AIR y los motores V8 como SSJS (node.js, v8cgi) , Rhino y SpiderMonkey (CouchDB) JavaScript Time Picker : el primer selector de tiempo que utiliza una interfaz muy fácil de arrastrar y soltar. Con su diseño único, cualquier persona puede arrastrar los minutos o las horas de forma independiente a la hora seleccionar un horario concreto. (modificándolo se puede conseguir un excelente reloj analógico con javascript) gChart : es una librería independiente para crear gráficas con javascript

Fechas, valor por defecto en MySQL

Imagen
Los tipos de datos datetime, date y timestamp en mysql son muy utilizados y tiene un rango de validez entre el 1 de enero del año 1000 y el 31 de diciembre del 9999. Admiten muchos tipos de formatos a la hora de insertar datos, cadenas con distintos separadores y valores numéricos que representen una fecha válida como YYYYMMDDHHIISS. En concreto el tipo de dato timestamp puede tener valores por defecto como CURRENT_TIMESTAMP y también es aplicable al realizar un update sobre la fila con el evento ON CHANGE. Como nota importante de los valores por defecto en timestamp es que no se admiten 2 o más columnas con este valor en mysql, ya sean en la cláusula default o en la cláusula on update, esto provocaría un error del tipo: ERROR: Error 1293: Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause Ejemplo: CREATE TABLE t ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );

Convertir fechas de excel a PHP

Un archivo de Microsoft Excel almacena las fechas en un formato numérico que corresponde a los días desde el 1 de enero de 1900, teniendo en cuenta que php las fechas las guarda a partir de 1970 y en segundos pues es un poco engorroso convertir una fecha de un formato a otro, para ello PHPExcel de codeplex tiene una clase llamada PHPExcel_Shared_Date con una función estática que hace esta operación, la función como tal se llama ExcelToPHP y devuelve la cantidad de segundos correspondientes a la fecha en PHP. Podemos utilizarla de la siguiente forma: // leo el archivo excel $objPHPExcel = HPExcel_IOFactory::load('prueba.xlsx'); // utilizo como activa la hoja 1 $objPHPExcel->setActiveSheetIndex(0); $objWorksheet = $objPHPExcel->getActiveSheet(); // obtengo el valor de la celda $fecha_excel = objWorksheet->getCell('A1')->getValue(); // utilizo la función y obtengo el timestamp $timestamp = PHPExcel_Shared_Date::ExcelToPHP($fecha); $fecha_php = date(&qu

Mis plugins para jQuery

Desde hace mucho vengo utilizando las librerías de jquery y jquery ui por su facilidad de uso y sobre todo por el respiro que me dan a la hora de programar con javascript pues me garantizan la compatibilidad con los navegadores del cliente. Otra de las razones es el innumerable número de plugins que están disponibles para este framework de javascript, yo utilizo los siguientes en mayor o menor medida: jQuery Alert Dialogs : Este plugin jQuery pretende sustituir la funcionalidad básica proporcionada por el estándar de JavaScript para las funciones de alert() confirm() y prompt(). jQuery BlockUI : El plugin de jQuery BlockUI permite simular el comportamiento síncrono utilizando AJAX, sin bloquear el navegador. Cuando se activa, se evitará la actividad del usuario con la página (o parte de la página) hasta que se desactive. BlockUI da la apariencia y el comportamiento de bloqueo a la interacción del usuario. jQuery DataTables : es un plug-in muy flexible

Codeplex excelentes soluciones

Imagen
Desde hace mucho tiempo utilizo la clase PHPExcel para trabajar excel con PHP y crear y leer archivos reales, alojado en este proyecto de hosting para software open source . Hoy he estado buscando un plugin para Windows Life Writer que me permitiera incluir código fuente dentro del blog y para mi sorpresa este proyecto llamado Code Colorizer también está alojado en Codeplex (ver cómo instalar Code Colorizer ). Aquí podemos encontrar muchos proyectos pero los que más me han llamado la atención aparte de los dos anteriores son PHPWord y PHPPowerPoint . ¡Increíble que tengamos tantos recursos para PHP y blogs de manera gratuita, me encanta la comunidad Open Source! Actualización enero 2018  Codeplex ya no existe como tal, ahora es un servicio de sólo lectura que cerró en diciembre de 2017, aún se puede consultar el archivo de proyectos aunque casi todos están ya migrados a Github en incluso algunos sin mantenimiento. Windows Live Writer es ahora Open Li

Evento onchange con jqtransform

En un artículo anterior hablaba sobre las deficiencias del pluging de jquery jqtransform y hoy he descubierto otra más referente al evento onchange. El error en sí es que no se puede aplicar este evento a un select modificado con jqtransform porque realmente este evento nunca es llamado, veamos que crea este plugin: < div > < select > < option > Prueba </ option > </ select > < ul > < li > < a > Prueba </ a > </ li > </ ul > </ div > El plugin se encarga internamente de modificar el evento click sobre el tag a para simular la selección en el select, por lo que nosotros si queremos simular el onchange debemos encontrar el div superior a nuestro select y luego aplicarle los cambios al evento click de los tags a que hay dentro de él. ¡Funciona!

Consejos para diseñar tu blog

Estos puntos y recomendaciones los he ido recopilando a través de la web, pueden faltar muchos pero estos consejos para diseñar tu blog son fundamentales y se deben de tener en cuenta a la hora de crear una nueva bitácora: El cuerpo del texto debe ser grande y con títulos grandes y claros. Dale un toque personal y fácilmente identificable. Hay muchos blogs igual que el tuyo. Tienes que hacer que el usuario reconozca rápidamente tu marca. Dale la máxima importancia al texto. No dejes que nada le robe atención al lector, elementos como banners, GIFs animados, etc. La longitud de la línea de lectura no debe sobrepasar los 700 píxeles, aunque suele ser mejor acortarlo hasta los 500. El usuario no debería mover la barra lateral para encontrar el contenido. Haz que sea lo primero que vea al entrar en tu página. Intenta que tus páginas validen según los protocolos. Si no es posible acércate lo máximo. Haz que sea visible para la mayoría de los navegadores incluyen

¿Por qué eliminamos un blog?

Estas causas que voy a poner a continuación son basadas meramente en mi experiencia personal, imagino que existan más motivos por los que darse de baja de un feed de un blog pero estas son por las que yo me he dado de baja de algunos, las ordenaré por preferencia y gravedad: el blog ha dejado de existir la temática del blog ha cambiado (muchos editores una vez tienen un número de usuarios suelen cambiar la temática original de su blog) en los feeds solamente aparece una muestra del texto y no el artículo completo (a mi personalmente esto me molesta muchísimo, creo que es penalizar a tus usuarios habituales solo por ganar una visita a tu web) saturación de feeds (algunas veces no nos compensa tener tantos feeds diarios de un tema que realmente no nos interesa del todo, si este blog tuviera menos actualizaciones es muy probable que siguiéramos leyéndolo) por discrepancias con los editores del blog o por sentirse ofendido y maltratado por estos (no es muy habitual per

Comparar con cero en php

PHP tiene mucha flexibilidad y muchas herramientas para comparar valores aunque no deja de tener algunas particularidades especiales a la hora de tratar los valores vacíos, por ejemplo si tenemos: a = ‘’; si hacemos a == 0 esto devolverá true y si hacemos (int)a === 0 también devolverá true. Con ello sacamos la conclusión de que el valor vacío de una cadena al llevarlo a valor numérico es cero. Como otro ejemplo si tenemos un formulario el cual tiene valor 0 (un input de texto por ejemplo, aunque es válido para todos) al recibirlo nuestro script en PHP tendríamos que: si hacemos $_POST[‘variable’] === 0 esto daría false tenemos que compararlo de esta forma $_POST[‘variable’] === ‘0’ (como cadena). Concluyendo: si utilizamos el operador == los siguientes valores son iguales 0, ‘0’, (int)’’, ‘’, FALSE, false. En cambio si utilizamos el operador === todos estos valores son distintos salvo (int)’’ que si es igual a 0.

Convertir números romanos en PHP

He reutilizado una clase en PHP de Víctor De la Rocha que convierte números romanos en arábigos y viceversa para agregarles nuevas funciones y compatibilidad con PHP 5, si necesitas una clase que: convierta de números romanos a arábigos (números normales) convierta de decimales a números romanos valide números romanos Entonces esta es tu clase y puedes descargarla en el enlace: clase para convertir números romanos a decimales . Nota: se puede utilizar tanto como un objeto o como funciones estáticas. La función para saber si un número es romano o no utiliza expresiones regulares a la hora de validar los números romanos introducidos.

¿Por qué utilizar PHP 5.3?

PHP 5.3 recién está en sus primeras versiones preliminares, pero para aquellos que corren PHP en servidores Windows, hay algunas importantes novedades en las notas de lanzamiento de sus binarios oficiales: Se abandona el soporte de versiones de Windows anteriores a Windows 2000 . Quienes todavía usen Windows 98, Me o NT y planean usar PHP 5.3 deberán primero actualizar su sistema operativo. Hasta ahora, PHP para Windows ha sido compilado con Visual C++ 6 (VC6), que fue lanzado en 1998. A partir de PHP 5.3 habrá dos binarios de PHP para Windows: si uno usa extensiones hechas por terceros o el servidor Apache, necesita usar el binario compilado con VC6. De otra manera puede usar el compilado con VC9. Los binarios de las futuras versiones de PHP serán compiladas solo con VC9. Binarios de 64 bits serán ofrecidos en forma experimental y todavía no deberían ser usados en entornos de producción.

PHP Non-Thread Safe vs Thread Safe

Actualmente las versiones de PHP se están distribuyendo como Non-Thread Safe (NTS) y Thread Safe (TS), veamos en que consiste cada una: Thread Safe (TS) es una característica que permite optimizar PHP para un entorno MultiHilo (Windows) y no Multiproceso (Linux) , siendo así mas efectivo en Apache para Windows ya que permite, dicho de una forma totalmente ambigua, cargar todo el ambiente de PHP y mantenerlo en la memoria para todos los hilos que lo necesiten. Esto sin embargo generaba problemas varios en ISS al ejecutar PHP como ISAPI ya que muchas extensiones estaban hechas pensado en el modelo Multiproceso (Linux) y obligaba a utilizar PHP como CGI, esto lo hacía más estable pero exageradamente más lento debido a que tiene que cargar y descargar de la memoria el ambiente completo de PHP en cada requerimiento o proceso. Lo que Non-Thread Safe (NTS) permite es configurar ISS y otros servidores basados en el modelo de Windows (MultiHilo) para que usen PHP como CGI pero mejorando

Plugin jquery jqtransform, errores

Embellecer formularios es una tarea bastante dura con HTML, actualmente hay innumerables plugins para hacer este tipo de tareas pero el que he encontrado más sencillo de implementar y utilizar es jqtransform para jquery, aunque no está exento de fallos o de deficiencias notables, por ejemplo: al cargarse los estilos de los formularios si un select es modificado por ajax los nuevos option no se muestran, hay que crear un código especial para agregar los nuevos option de manera que sean compatibles (yo no lo he hecho) el plugin autocomplete de jquery ui no muestra la imagen de carga al procesar los datos, esto supongo que sea porque sobre escribe los estilos y no muestra la imagen. el mismo plugin anterior no redimensiona correctamente el tamaño del input dejándolo más pequeño, a un tamaño de 16 px por lo que antes de escribir debemos utilizar el método width de jquery para cambiar el tamaño del input a uno más grande. Para solucionar el punto 1

Plugin de jquery ui: autocomplete

Me gustó mucho que en la nueva versión de jquery incluyesen esta nueva funcionalidad autocomplete pero aún me parece un poco escasa la documentación en castellano para ella, la he utilizado y no es difícil pero lo malo es que en caso de error no se puede visualizar nada para saber a que se debe, algunas cosas que me he topado son las siguientes: en la distribución oficial no está incluido el archivo ui-anim_basic_16x16.gif necesario en el estilo de este plugin cuando está buscando los datos en archivo search.php de la demo incluye una función array_to_php que es posible utilizarla con versiones de php anteriores a la 5, pero para 5+ es mejor utilizar la propia función de json_encode de PHP. admite 2 tipos de array para convertirlos a json, el array normal de toda la sin índices y un array con cada valor que es un array con 3 claves id, label y value (ejemplo[] = array (‘hola’,’hi’,’hello’) ó array_push(array(‘id’=>’MAD’,’label’=>’Madrid, Españ

Claves externas en mysql, notas

No cabe duda que para garantizar la integridad en una base de datos es imprescindible utilizar claves extranjeras (foreign keys, claves externas, etc.), pero a la par con su importancia está su difícil manejo en algunas ocasiones y sumado esto a la escases de información referente a errores de mysql muchas veces nos encontramos desamparados a la hora de crear tablas con este tipo de claves. Para evitar errores del tipo Can't create table (errno: 121), que no te dicen nada, debemos tener en cuenta los siguientes aspectos a la hora de crear foreign keys: los campos de origen y destino deben ser del mismo tipo, misma longitud y con los mismos atributos (si uno es unsigned el otro también, si es int (3) el otro debe ser int y con longitud 3 también) los campos de origen y destino ambos deben ser índices (algunas aplicaciones al crear la clave ya te crean el índice en el campo origen pero el campo de destino siempre tienes que crearlo como índice, no es necesario

Errores con load data infile en mysql

Hoy he tenido que utilizar este comando para importar un simple archivo csv del estilo: campo1;campo2\r\n Todo sería muy sencillo si este comando no fuera tan flexible y a la vez complicado de utilizar. Lo primero que me pasó fue el ERROR 1045: Access denied for user: 'x@%' (Using password: YES), esto e sun problema de permisos del usuario en cues´tión, para ahorrar tiempo cambie el usuario y puse el root y solucionado, si alguien sabe el permiso específico por favor que lo ponga. Otro problema es la ruta del archivo que debe ser absoluta porque sino mysql toma por defecto el directorio de instalación de mysql, por ejemplo si pones ../import/file.csv en interpreta que está en c:\wamp\bin\mysql\mysql5.1.34\import\file.csv siendo c:\wamp\bin\mysql\mysql5.1.34\ la ruta de mi instalación de mysql y nos daría un error del tipo: 29: File 'c:\wamp\bin\mysql\mysql5.1.34\import\idiomas.csv' not found (Errcode: 2) En caso de que estés sobre Windows y lo hagas desde un s

Orkut otro amigable de Google

Imagen
Hoy haciendo pruebas con Orkut la red social de Google, me he dado que si se toman muy en serio lo de la edad de sus usuarios, en el formulario de alta me llamó la atención que en el año de nacimiento pudiera poner 85 ó 1985, y claro me picó el bichito y puse 10 para ver si Google lo identificaba como 2010 y tengo 2 noticias, una buena y una mala: La buena es que si Google me identificó como que era 2010 y por tanto que tengo 0 años. La mala es que aún poniendo esto y que sabía que tengo 0 años marqué la casilla de que tengo más de 13 años y me dejo crear mi cuenta, pero pero aún es que al tener menos de 13 años no tengo acceso a ningún servicio una vez dentro, lo cual es lógico, pero no puedo cambiar mi año de nacimiento , en resumen que tengo cuenta de Orkut pero no puedo acceder a nada dentro.

Google el gracioso

No me cabe la menor duda que entre el equipo de Google tiene que existir un departamento de psicólogos para hacer las interfaces de sus aplicaciones tan amigables, Google ha revolucionado la forma de interactuar con el usuario haciendo preguntas serias de la forma más divertida. hoy mismo he borrado la papelera de gmail y me ha puesto lo siguiente: No existe ninguna conversación en la papelera. ¿Quién necesita suprimir cuando se tienen 7000 MB de capacidad de almacenamiento? Vale he quedado como un friki borrando la papelera de gmail pero en fin me ha llamado mucho la atención.

Tus datos personales en internet

Mis tarjetas de crédito están dadas de alta en unos cuantos sitios, algunos de dudable reputación por su nombre como quierounputomovil.com (excelente servicio por cierto) pero todos bajo un protocolo seguro https, lo que no entiendo es que aún nos parezca normal que empresas privadas nos pidan información referente a nuestras tarjetas y pretendan que se los enviemos por email o por fax. Estoy hablando del caso concreto de una empresa canadiense con sucursal en La Habana, la cual administra el sitio compradtodo.com , en el que se pueden recargar móviles en Cuba. Hasta hace poco días se podía hacer esto bajo un protocolo https pero concretamente el día 12 de abril recibí un correo de ellos en el cual me comentaban lo siguiente: Como parte  de las mejoras que se vienen realizando a Recarga Móviles en cuanto a seguridad; a partir del 15ro de Abril para ser usuario del servicio debe haber completado formulario adjunto y enviado debidamente firmado a la dirección: pedidos@compra-

Cadenas en facebook

Imagen
Los grandes males del correo electrónico se están extendiendo a las redes sociales también, ahora las odiosas cadenas de correos comienzan a propagarse por redes como facebook , hoy he recibido un mensaje que dice lo siguiente: Debemos informarle que facebook conoce una disminución de la velocidad, a causa de la demasiada cantidad de miembros no activos presentes. Enviamos este mensaje hoy con el fin de verificar la actividad de los miembros del sitio. Se ruega que se transmita este mensaje a 15 otros usuarios, utilizando la función Copiar y Pegar con el fin de probar su actividad. Si usted no envía este mensaje en las 2 semanas siguientes, automáticamente será suprimido con el fin de dejar sitio a los miembros activos. Cordialmente: Facebook Administrators System"" Realmente espero que se tomen medidas al respecto porque sino se puede volver un infierno el navegar por tu red social favorita, en este caso facebook, os dejo la imagen del correo: De más está decir

Youtube Search Stories

Imagen
Youtube search stories es el nuevo juguete de Google que demuestra su genialidad en marketing, aunque más que centrarme en como crear un sencillo pero potente video de utilidades inimaginables y de sencillez característica de Google, me voy a centrar en lo que más me impactó: el mensaje cuando se está creando el video, aquí os dejo la imagen: El texto viene a decir lo siguiente: Esto llevará unos minutos. Es probable que tenga tiempo suficiente para tomar un café. O ir al baño. Pero no ambos. Me encanta Google!!!! Aquí os dejo el enlace al video que he creado sobre Camagüey, mi ciudad natal . ¿Os animáis a hacer uno?

DOMPDF y codificaciones utf-8

Algunas veces cuando generamos con dompdf un archivo a partir de un html si este contiene caracteres en castellano como acentos, etc; es muy posible que no se muestren partes del texto en el archivo generado, para corregir esto solo basta con utilizar la función de php utf8_encode de la siguiente manera: $dompdf = new DOMPDF(); $dompdf->load_html(utf8_encode($htmlbuffer)); $dompdf->render(); $dompdf->stream("file.pdf"); No ocurre siempre que no se muestren todos los caracteres, es posible que una misma frase se muestre unas veces sí y otras no, es más bien un bug de esta clase en php pero de esta manera es muy sencillo corregirlo.

Expresiones regulares para fechas

He encontrado un sin número de páginas que validan mediante expresiones regulares las fechas en javascript pero en concreto no encontró una que validara el formato de las bases de datos, 2010-04-08 18:33:23 por ejemplo, la expresión regular sería la siguiente: var RegExPattern = /^\d{4}-\d{2}-\d{2} (0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$/; Otros sitios interesantes: para formatos de expresiones regulares de fechas en javascript y para expresiones más comunes . Actualización: La expresión regular anterior no es válida para las horas 00, esta sería la expresión correcta: var RegExPattern = /^\d{4}-\d{2}-\d{2} ([0-1]\d|2[0-3]):([0-5]\d):([0-5]\d)$/;

Wamp 2 no funciona en Windows 7

Instalé el otro día wamp en mi ordenador con Windows 7 de 64 bits y para mi sorpresa al ejecutarlo no terminaban de levantar los servicios, buscando por internet la solución es bastante sencilla y es debido el fallo a una incompatibilidad en el trío WAMP + Windows 7 + Skype. La solución la encontré en encodez y la traduzco al castellano, lo único que hay que hacer es modificar el archivo de configuración de apache en el wamp (conf.ini) con los siguientes cambios: El archivo por defecto aparece de la siguiente manera: #Listen ------:80 Listen 80 Dónde ------ es una dirección ip. El archivo tendría que quedar así: Listen 127.0.0.1:80 #Listen 80

Autentificación MySQL en PHP

Hay diferencias entre las DLL de PHP 5.2.6 y 5.3 a la hora de tratar las claves de mysql para conectarse a la base de datos pudiéndonos dar el siguiente error: mysqlnd cannot connect to MySQL 4.1+ using old authentication En PHP 5.3 serían necesario realizar cambios en la base de datos que están muy bien explicados en el manual de referencia de mysql . Las versiones de PHP anteriores, por lo menos la última que testee es la 5.2.6 no da este error de conexión.

Variables por referencia y por defecto

En PHP es posibles pasar variables por referencia (punteros) a una función y también en una función a los parámetros darles valores por defecto en caso de que no se pasen estos, mi pregunta era ¿pueden estos dos casos convivir en una misma variable? Y la respuesta es sencilla, en PHP sí, se puede tener un parámetro de una función que sea por referencia y a su vez que tenga un valor por defecto. Gráficamente sería lo siguiente: function miFuncion(&$parametro = “valor por defecto”) con lo cual podríamos llamar a la función de la siguiente forma: miFuncion() Yo le encontré utilidad ¿vosotros?