sábado, 31 de marzo de 2012

Case insensitive Mysql: sensibilidad a mayúsculas y minúsculas en MySQL


A continuación incluyo un pequeño artículo donde habla de como MySQL es sensible a mayúsculas y minúsculas en función del sistema operativo que lo esté conteniendo. Como es bien sabido Linux es sensible a mayúsuculas, por lo tanto en un servidor MySQL corriendo en Linux se presentará éste caso. En uno corriendo en Windows al parecer no será así, porque Windows no es sensible a mayúsculas. En el artículo se da una breve descripción del porqué. 

Tuve un problema similar al del artículo utilizando Hibernate con anotaciones en una aplicación Java, donde se nos había ocurrido poner los nombres de tablas con mayúsucula inicial, como por ejemplo: "Usuarios", quienes usábamos Linux tuvimos que resolverlo porque nos creaba por ejemplo la tabla "usuarios" vacía. 

Me voy directo a la manera para resolverlo, transcribiendo del artículo:
Afortunadamente, MySQL contempla el problema. Basta arrancar con mysqld –lower_case_table_names=1 y así cuando creemos cualquier base de datos o tabla, automáticamente la pondrá en minúsculas, haciendo que aparentemente se convierta en "case insensitive". No es totalmente cierto, porque lo que hace en realidad es convertirlo todo a minúsculas.
Aquí el artículo completo. Espero les sea de utilidad:


Aprovecho para agradecer al autor, muy recomendable su blog

¡Saludos Javer@s!

domingo, 4 de marzo de 2012

Recursos en la red: CMS's

¡HOla Javer@s!

Hoy con la intención simplemente de poner sobre la mesa un interesante tema. En la red hay múltiples sitios que comparten características de manera general. Claro que a alguien se le ocurrió un día desarrollar herramientas que automatizaran la creación de algún tipo de sitios. Así fueron apareciendo los famosísimos CMS (Content Management System) o editor de contenidos como comúnmente solemos referirnos.

Los hay para toda clase de contenidos: publicación de artículos, catálogos de productos, blogs, páginas personales, e inclusive contenidos mas complejos e interacciones más específicas. 

Nombres y productos hay muchos: Joomla, Drupal, Moodle, Fork, Wordpress, Mambo, Calipso, y un interminable etc...

A continuación incluyo una lista donde aparecen algunos de los CMS de código abierto más populares:

¿Alguna sugerencia o experiencia con estas interesantes herramientas?  Bienvenidos los comentarios.

¡Saludos Javer@s!

Hasta la próxima...

jueves, 1 de marzo de 2012

Obtener videos Flash desde cache en Linux

Hoy les platico algo que es más como una curiosidad que en ocasiones es útil. Parafraseando una entrada en internet cuya fuente sito al final, pude resolver algo que a mi me ha servido para guardar un respaldo de los videos Flash que veo de repente por la red.

Con las versiones anteriores del plugin de Flash Player de Adobe en Linux era posible ver directamente el archivo que se quedaba en cache de disco al ver nuestros archivos Flash en algún navegador. Entonces sin necesidad de usar herramienta adicional podiamos copiar un video accediendo al directorio tmp de nuestro sistema de archivos, escribiendo en la consola algo como esto:
$ cp /tmp/FlashXasdf ~/video.flv
En ese entonces identificábamos fácilmente un archivo Flash por el prefijo "Flash" presisamente... que difícil ¿verdad?

Sin embargo los chivos de Adobe pensaron que esto no debería suceder y en las versiones siguientes de su plugin han quitado este comportamiento. Ahora lo que hacen es borrar el archivo del sistema de archivos sin embargo se sigue descargando y sigue ocupando espacio en el disco duro, por lo tanto mantiene una liga para poder accederlo. Mientras exista un hilo de ejecución que tenga referencia a ese archivo (en nuestro caso el plugin de Flash, ¡cuidado! si cierras el plugin o el navegador esta referencia desaparecerá llevándose el archivo consigo), el archivo permanece en el sistema de archivos en Linux. A grandes rasgos algo así es lo que sucede.

Ahora, para acceder a este archivo y copiarlo a nuestro directorio haremos uso de un par de herramientas en linux. La clave de este descubrimiento es que se sigue creando en un primer momento el archivo como /tmp/Flash* así que de esa manera lo buscamos:
$ lsof | grep Flash 
COMMAND   PID   USER      FD  TYPE DEVICE SIZE/OFF NODE NAME 
firefox-b 23230 vagabundo 84u REG  254,0  1065348  929 /tmp/FlashXXQCasdK (deleted)
El header esta agregado, asi que el comando lsof solo les mostrará lo campos de la parte de abajo, para que no se vayan a asustar. De los datos que aparecen los que nos interesan en particular son el PID y el FD que son con los que podremos hacer referencia al archivo en cuestión.

Para continuar usaremos el directorio /proc del sistema de archivos. Éste directorio tiene varias gracias, ofrece mucha información del sistema que se esta ejecutando actualmente y esta presente por lo general en todas las distribuciones Linux. También mantiene archivos utilizados por las aplicaciones. En este caso con los datos que hemos recolectado antes (PID=23230 ,FD=84). Estos datos apuntan a una referencia que seria /proc/23230/fd/84 . Sin embargo no podemos acceder directamente a nuestro video, es necesario hacer un truco más escribiendo en nuestra consola:
$ cat /proc/23230/fd/84 > ~/video.flv
Y .... ya tenemos nuestro video C: 

Espero les sea útil. Este prcedimiento es, como lo comenté en un pricnipio, para Linux. En Windows no se si se pueda hacer algo similar, pero seguramente también hay alguna manera, ¿Alguien conoce alguna?

Anexo aquí el tutorial original de donde parafraseé el contenido de arriba, a cuyo autor se le agradece enormemente. Viene un poco más explicado aunque en inglés:


¡Saludos Javer@s!... hasta la próxima...

sábado, 25 de febrero de 2012

Agregar Sintax Highlighting a blogger o a web

Desde que conocí el concepto de "sintaxhighlighting" y lo vi funcionando en un editor de algún lenguaje - el primero que conocí lo vi en el editor de c++ de Borland en modo texto... ¡uy nostalgia! - me dí cuenta que era una de esas herramientas para desarrolladores que difícilmente podría dejar de utilizar. Te cambia completamente el panorama de haber escrito programas en editores planos, aburridos y sin chiste. Los desarrolladores pasamos horas y horas a veces en frente de una pantalla de algún editor, es gratificante cualquier cosa que pueda hacer más llevadero este tiempo, sobre todo si se está programando algún módulo o sistema engorroso o enfadoso.

En la actualidad cualquier editor de texto pueda considerarse medianamente decente tiene la opción para hacer resaltado de sintaxis (sintaxis highlighting) de los archivos fuentes más comunes (c, c++, java, php, basic, html, xml, c#, etc). Conste que hablo de editores de texto planos, los procesadores de texto son otro cuento muy diferente.

Al poco tiempo el resaltado también se ha utilizado en las páginas web, y no había razón alguna porque aquí en ésta bitácora no hiciéramos uso de esta notable herramienta.

Aquí una manera muy sencilla de implementación para Blogger que a su vez puede utilizarse en cualquier página web que estén desarrollando. Esta es la alternativa que estoy usando por cierto:

Tutorial usar Syntax Highlighting en Blogger

Ésta alternativa se puede utilizar para cualquier página que estén desarrollando, definitivamente creo el syntax highlighting se ve bien.

Aqui un ejemplo de como se ve y a la vez de como se puede usar en una página html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns='http://www.w3.org/1999/xhtml'>

  <head>
      <base href="http://alexgorbatchev.com/"/>
    <title>SyntaxHighlighter - Feature Demo</title>
    <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js' type='text/javascript'></script>
 
    <link href='/SyntaxHighlighter/css/main.css' rel='stylesheet' type='text/css' />
  <link href='/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css' />
  <link href='/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css' />
  <script src='/pub/sh/current/scripts/XRegExp.js' type='text/javascript'></script>
  <script src='/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
  <script src='/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'></script>
  <script src='/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
  <script src='/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script>
  <script src='/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script>
  
  </head>
  <body class='no_sponsor'>
    
    <div id='content'>
      
      
      <h3 id='source'>Source</h3>
      <pre class='brush: plain'>
       <pre class="brush: php; highlight: [5, 15]; html-script: true">
       <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
       <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
       <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>SyntaxHighlighter Demo Page - <?= htmlspecialchars($title) ?></title>
       </head>
      
       <body>
      
       <?
       /***********************************
        ** Multiline block comments
        **********************************/
      
       $stringWithUrl = "http://alexgorbatchev.com";
       $stringWithOutUrl = 'hello world';
       
       ob_start("parseOutputBuffer");  // Start Code Buffering
       session_start();
       
       function parseOutputBuffer($buf) {
        global $portal_small_code, $portal_gzcompress;
        global $PHP_SELF, $HTTP_ACCEPT_ENCODING;
      
        // cleaning out the code.
        if($portal_small_code && !$portal_gzcompress) {
         $buf = str_replace(" ", "", $buf);
         $buf = str_replace("\n", "", $buf);
         $buf = str_replace(chr(13), "", $buf);
        }
       }
      
       ?>
      
       <!-- Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -->
      
       </body>
       </html>
       </pre>
      </pre>
      <h3 id='result'>Result</h3>
      <pre class='brush: php; highlight: [5, 15]; html-script: true'>
       <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
       <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
       <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>SyntaxHighlighter Demo Page - <?= htmlspecialchars($title) ?></title>
       </head>
      
       <body>
      
       <?
       /***********************************
        ** Multiline block comments
        **********************************/
      
       $stringWithUrl = "http://alexgorbatchev.com";
       $stringWithOutUrl = 'hello world';
       
       ob_start("parseOutputBuffer");  // Start Code Buffering
       session_start();
       
       function parseOutputBuffer($buf) {
        global $portal_small_code, $portal_gzcompress;
        global $PHP_SELF, $HTTP_ACCEPT_ENCODING;
      
        // cleaning out the code.
        if($portal_small_code && !$portal_gzcompress) {
         $buf = str_replace(" ", "", $buf);
         $buf = str_replace("\n", "", $buf);
         $buf = str_replace(chr(13), "", $buf);
        }
       }
      
       ?>
      
       <!-- Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -->
      
       </body>
       </html>
      </pre>
      <script src='/SyntaxHighlighter/scripts/main.js' type='text/javascript'></script>  
    </div>
    <div id='clear'></div>    
   
  </body>

</html>


Hay muchas otras alternativas, esta sólo es una de ellas pero espero les sea útil... ¡¡¡saludos javer@s!!!

miércoles, 25 de enero de 2012

Webservices con PHP

El uso de webservices se ha generalizado en la red debido al uso de diferentes tecnologías en sistemas globales y la necesidad de comunicación entre diversos componentes. A alguien en algún momento se le ocurrió: "Bueno, si el protocolo más utilizado para transmitir datos a través de internet es el http, porque no hacemos un estandar para la comunicación de nuestras aplicaciones que se hagan por medio de ese protocolo, sin importar en que lenguaje o plataforma estén corriendo"... y ¡gualá! aparecieron los estandares para el uso de Webservices en las aplicaciones modernas.

Se supone, que un webservice debidamente hecho y que cumpla con los estándares establecidos, será capaz de proporcionar un recurso para cualquier aplicación bajo cualquier lenguaje que soporte clientes de webservices. Para este ejemplo de uso de webservices es bueno que estemos familiarizados con conceptos de: HTML, XML, WSDL,SOAP y PHP.

En este caso vamos a crear un webservice de lo más sencillo utilizando PHP. Vamos a utilizar dos formas, una por medio de la librería nativa de PHP para crear un servidor SOAP y otra utilizando una librería que ya tiene un buen tiempo que funciona para hacer webservice de manera fácil y rápida en PHP llamada NuSOAP.

Ejemplo Webservice con PHP y NuSOAP

Aquí un ejemplo de servidor webservice que llamaremos serverNuSOAP.php usando la librería de NuSOAP que se descarga de su sitio. Para su funcionamiento necesitamos tener en el mismo lugar el directorio con la librería NuSOAP para que funcione la linea de require_once('lib/nusoap.php'); .

Teniendo nuestro archivo en un servidor Apache con PHP y con los módulos SOAP habilitados, podemos acceder a la especificación WSDL por medio de http://midominio/serverNuSOAP.php?wsdl y NuSOAP nos generará automáticamente el archivo WSDL.

Ahora vamos a ver un pequeño cliente (cliente.php) que utilice este servicio:
De esta manera accedemos al servicio publicado.

Ejemplo Webservice sólo con PHP

Ahora un ejemplo utilizando solo las librerías de PHP. Incluyo esto porque, aunque la librería de NuSOAP hace las cosas realmente fáciles, no es una librería estándar, es un esfuerzo hecho por terceros que no se encuentra completamente actualizado y además, leí por ahí, que no permite utilizar ciertas herramientas para mantener la seguridad en nuestros Webservices. En fin, aquí el ejemplo de como sería un servidor muy sencillo del webservice al que llamaremos servicio.php:

Este servicio lo podríamos consumir de la misma manera que el anterior, sin embargo al no tener un archivo WSDL con las definiciones pertinentes lo consumiremos a través de un cliente al que llamaremos clientephp.php:

Este ejemplo funciona perfectamente con clientes PHP, sin embargo hay problemas con aplicaciones hechas con otros lenguajes, como C# por ejemplo. Si queremos utilizar nuestro servicio desde cualquier cliente es importante tener publicado el archivo WSDL, que en este caso tendríamos que generar a patín o por medio de algún generador de WSDL. Java y C# pueden generar el archivo WSDL al vuelo en la forma que lo hace NuSOAP, pero no he encontrado la manera de hacerlo a través de las librerías nativas de SOAP para PHP, si alguien tiene algún ejemplo sería muy útil que lo pudiera compartir.

Les anexo un par de ejemplos más:
Ejemplo sencillo
Otro ejemplo sencillo

Un par de herramientas para generar WSDL con PHP. Yo he utilizado Katy (wsdl-writer) y es fácil de implementar, aunque creo que el proyecto ya no esta en mantenimiento. De cualquier manera son alternativas fáciles para una tarea, que al hacerlo a patín, resulta ser de lo mas engorrosa.
WSDL Generator
wsdl-writer


Hasta aquí llegamos el día de hoy Javer@s.... hasta la vista....

jueves, 29 de diciembre de 2011

Formatos diferentes para imprimir usando CSS

Nos encontramos ante una tarea clásica en un sistema web. Necesitamos hacer una página que muestre los resultados de una consulta y que al mandarse a imprimir no muestre todo el formato que en el navegador es imprescindible, como lo son: colores, imágenes, contrastes, etc. En resumen: necesitamos que esa página tenga un formato al mostrarse y otro al imprimirse.

Para resolver esto (no se preocupen, ya hubo alguien que pensó en éste problema antes) existe una funcionalidad con hojas de estilo (CSS). Se puede hacer que "automágicamente" una página debidamente formateada con su hoja de estilo al mandar imprimir tome otra hoja de estilo que sobreescriba las propiedades anteriores.

En pocas palabras esto se puede lograr añadiendo algo como esto a nuestra página en cuestión. La hoja de estilo que queremos utilizar para cuando se mande a imprimir la página desde el navegador se debe incluir de una manera como esta:

<link rel="stylesheet" href="print.css" type="text/css" media="print" />

Y para indicar de manera explicita la hoja de estilo que queremos utilizar para el navegador podemos utilizar algo como :

<link rel="stylesheet" href="screen.css" type="text/css" media="screen, projection" />

Y ¡listo! con eso debería de bastar, si quieren indagar un poco más en este tema les dejo un par de enlaces que incluso tienen ejemplos pácticos:
Espero les sea útil... 
¡Saludos javer@s y no javer@s!

Control de versiones con Subversion y NetBeans

Hay herramientas que cuando trabajamos en un equipo de desarrollo se vuelven indispensables desde la primera vez que las utilizas. Es el caso de un controlador de versiones, "versionador", entre otros nombres con los que los podemos encontrar.

En esta ocasión les platico de uno en particular: Subversion. Por su facilidad de uso y practicidad, es uno de los más populares en la red, teniendo integración en varios IDE's de programación como lo son NetBeans o Eclipse. Se puede utilizar para toda clase de de proyectos, de cualquier lenguaje.

Para configurarlo en un ambiente Linux (Ubuntu especificamente) estos dos tutoriales me han sido de mucha utilidad:

Si son usuarios nuevos en Subversion y quieren dar de alta un repositoro de prueba este tutorial les puede ser útil:

Tutorial 1

Si ya tienen un poco más de experiencia usando Subversion en este tutorial sencillo también viene como dar de alta usuarios y configurar el repositorio para que solo permita conexiones autentificadas:

Tutorial 2

Una vez echado a andar el repositorio (yo sólo lo he creado en Linux, en Windows desconozco como se haga... jeje), podemos llevar el control en las versiones de nuestro código, documentos o archivos en general.

Usar repositorio Subversion con NetBeans


Como comenté anteriormente, NetBeans se integra fácilmente para usar repositorios Subversion. Para poder utilizarlo es necesario tener instalado Subversion en nuestros equipos, si usas Linux bastará con que   lo instales desde los repositorios, dependiendo de tu distribución pero en un Ubuntu se puede hacer desde la consola con el siguiente comando:

$ sudo aptitude install subversion


En Windows es necesario instalarlo buscando algún instalador que agregue los comandos al PATH del sistema. Amig@s que usan Windows me han comentado les ha bastado con instalar TortoiseSVN, el cual lo pueden descargar desde aquí.

Una vez instalado el Subversion, para cargar archivos de un repositorio con NetBeans solo necesitamos ir al menú Team>>Subversion>>Checkout.

Ahí elegimos la ubicación de nuestro repositorio en la red e introducimos el nombre y contraseña en caso de ser necesario, si se esta haciendo un acceso anónimo al repositorio bastará con dejar vacíos estos campos.

Al dar siguiente elegimos desde que directorio del repositorio queremos hacer el checkout (descargar archivos del repositorio) y en donde queremos guardarlo, incluso nos da opción e elegir alguna versión de nuestros archivos en particular. Si solo quieres descargar la última versión puedes ignorar la pare donde dice "Repository Revision". Para terminar te pregunta si quieres, una vez que se haya hecho la descarga, que NetBeans busque y cree un proyecto con los archivos descargados. Puedes palomear esta opción y seguir los pasos de "Creación de un proyecto con datos existentes" para tener tu proyecto listo para usarse.

La manera de utilizar el repositorio es muy fácil, Update es actualizar desde el repositorio, Commit es subir cambios al repositorio; los archivos cambiados nos los pinta de azul, los nuevos de verde, y los que tienen conflictos de rojo.

Es importante recalcar que no debe de pasarse por alto antes de utilizar el repositorio el especificar que políticas se seguirán por parte del equipo de desarrollo  (o de ti mism@) para no hacer actualizaciones impertinentes o con código que no esté funcionando, y así evitar conflictos posteriores, porque yo se que puede llegar a pasar... jeje.

Espero les sea útil, usar un repositorio para controlar las versiones es muy útil en los equipos de desarrollo. Si eres de la vieja escuela no te arrepentirás de utilizar una herramienta como esta, si eres de la nueva y no los usas TACHE... jeje. ¡¡¡Saludos Javer@s!!!