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!!!

lunes, 19 de diciembre de 2011

La era Youtube y sus consecuencias



No es que tenga yo algo contra ello, alguna vez lo he hecho, pero como en muchas otras cosas creo que a veces los excesos son malos. La posibilidad que brindan los dispositivos electrónicos hoy en día de poder capturar en video cuanto nos encontremos en frente, resulta ser una interesante herramienta de nuestros tiempos. Cuantas escenas chistosas no se han grabado, o acciones ilícitas o sucesos extraordinarios, es una fortuna que alguien haya tenido a la mano su celular o camara de video para compartirnos eso. Sin embargo el precio a pagar por los buenos contenidos son toneladas y toneladas de paja sin un solo gramo de metal que se pueda usar como aguja. 

El punto que quiero abordar en esta entrada es el sentido de la experiencia que de repente ha cambiado. Ahora con la era de los celulares para casi todos es más importante estar grabando con su dispositivo, que disfrutar de la experiencia de manera plena en ese momento. Al menos a mi no me gusta estar en un concierto con el celular por encima de la cabeza y el brazo acalambrado queriendo grabar toooodo lo que pasa en el escenario, pero a muchos sí, los respeto, pero no los entiendo a veces. Tal vez son unos samaritanos increíbles que desean compartir su vida con los menos afortunados que no pueden presenciar esos momentos, o simplemente unos presumidos que gustan de jactarse de lo que otros no pueden hacer. 

 Sea como sea creo que es importante encontrar el equilibrio. Muchas cosas valen la pena que estén en youtube. Últimamente he escuchado la expresión de alumnos ciberneticos que aprenden miles de cosas con "Youtube-un maestro", es genial que haya tanta cosa para escoger, aprender y reírse, así que aunque no me gusta estar grabando todo, agradezco a los que nutren la red de videos en Internet y que nos dan oportunidad de perder tantas horas en el ocio, o mil y un otras cosas productivas que se pueden hacer con esos videos, porque aunque no lo crean, hay muchos videos productivos en Youtube... jeje 

 Y ustedes .. ¿son de los que graban?... ¿de los que son grabados? ¿de los que ven videos?...¿de los que les vale maíz? ... ¿ninguna de las anteriores? .... ¿se puede eso?....

No sabremos, lo único seguro es que esto de los videos y las estrellas caseras apenas está agarrando vuelo, es algo que seguirá y seguirá.... 

miércoles, 12 de octubre de 2011

De nuevo por aquí

¡¡HOla amigos javeros!!

Una disculpa por la tardanza para seguir bloggeando por aquí, la verdad he pasado un periodo de descanso, aunque no lo crean ya llevo alrededor de año y medio sin tirar ni una sola linea de código Java. Ha sido bastante a gusto y fructífero este tiempo para otras disciplinas en que me desenvuelvo, pero para el desarrollo ha sido uno de los más largos periodos de inactividad que he tenido, que aunque he seguido desarrollando en otras tecnologías, debo admitir que he extrañado la singular manera que Java tenía de hacerme ver mis tendencias autodestructivas al momento de programar; cosa que otros lenguajes - como Php - no hacen.

Pero bueno, este no es un blog para hablar de las disciplinas varias que pueda tener ni de mis nostalgias reprimidas, es más bien para hablar de tecnología y cosas relacionadas con el mundo de la programación en Java y en otros menesteres.

Hay mucho de que hablar: la nueva versión de Java, nuevas tecnologías, tutoriales pendientes, el mundo de Google y su aplanadora de aplicaciones, frameworks, redes sociales, PHP, bases de datos, desarrollo ágil; en fin, muchas otras curiosidades.

Espero contar con su valiosa participación y cualquier comentario como siempre bienvenido. Saludos a tod@s l@s Javer@s y no Javer@s... continuamos...

miércoles, 14 de septiembre de 2011

Aplicacion web en medio de solo/lectura (CD) con Jetty y Derby. Parte 2: Implementación

Sin más preámbulos más que la referencia a la primera parte de este post que fue la motivación vamos directamente a la implementación.

Aquí esta lo que necesitaremos y utilizaremos:
  • Java JDK instalado (versión utilizada 1.6) con su respectiva versión de JRE (máquina virtual)
  • Jetty (versión utilizada 6.1.22).
  • Proyecto web Java construido (Puede ser el war, pero nosotros utilizaremos el proyecto con los fuentes compilados, como el que genera NetBeans en el directorio build/web del proyecto para este ejemplo)
  • Derby (versión utilizada 10.5.3.0)
Pasos a seguir:
  • Paso 1: Tener instalado y funcionando el Java JDK.
  • Paso 2: Configurar Jetty para su uso en medio de sólo lectura
  • Paso 3: Preparar proyecto web Java: configuración para uso de base de datos embebido con Derby.
  • Paso 4: Preparar Base de Datos con Derby 
  • Paso 5: Como almacenar.
  • Paso 6: Como ejecutar.


Paso 1: Tener instalado y funcionando el Java JDK.

Este paso me imagino todos los javeros ya deben tenerlo cumplido, y los que no, deben hacerlo. Hago énfasis porque es importante que estén incluidas las variables de entorno en el path del sistema para evitar cualquier conflicto de ejecución tanto en Windows como en Linux. Esto es que además de tener instalada la máquina virtual, asegurarse de tener variables como JAVA_HOME definidas en el sistema, tanto en Linux como en Windows.

Paso 2: Configurar Jetty para su uso en medio de sólo lectura

Hay que descargar el archivo con el servidor embebido Jetty desde aqui y descomprimir. En la estructura e directorios buscamos el archivo JETTY/etc/jetty.xml, donde  JETTY es el directorio raíz donde esta desempaquetada la aplicación,  y nos vamos a la parte del log y comentamos de la siguiente manera:
<!--==================================== -->
<!-- Configure the Request Log-->
<!--==================================== -->
<!--
<Set name="RequestLog">
[snip]
</Set>
-->


Así comentamos la parte que activa el log de Jetty para que no intente guardar el log en nuestro medio de solo lectura, como lo es un CD.


Paso 3: Preparar proyecto web Java: configuración para uso de base de datos embebido con Derby 


Esto puede ser cualquier proyecto web hecho en cualquier IDE, en mi caso tomé un proyecto hecho en NetBeans y compilado con ant al cual llamaremos PROYECTONETBEANS (ruta que contiene la estructura del proyecto web java en Netbeans, con directorios como build, dist, lib, src, web, etc. ). Por lo tanto aquí supondremos que esta debidamente creado el proyecto y con las librerías necesarias (Incluyendo el jar del driver jdbc para usar Derby)

Yo utilicé el framework Hibernate para utilizar mi base de datos con un manejador Derby, pero se puede hacer con o sin Hibernate y usar la clase JDBC de manera directa para poblar la base de datos con Derby en nuestro programa e incluso utilizar cualquier otro cliente para manipular la base de datos fuera de nuestro programa.

Ahora lo que hay que hacer para utilizar nuestra base de datos de manera embebida en el medio de sólo lectura es cambiar la manera en como se carga el driver del jdbc (Controlador para Java de la base de datos). Esto lo hacemos donde definimos el driver esto es:
  • Si estas usando Hibernate como en mi caso hay que modificar el archivo de configuración "hibernate.cfg.xml". Yo tenía esta configuración en mi archivo al usarlo de manera local:
<property name="hibernate.connection.driver_class" >org.apache.derby.jdbc.EmbeddedDriver</property>
<property name="hibernate.dialect" >org.hibernate.dialect.DerbyDialect </property>
<property name="hibernate.connection.url" >jdbc:derby:directory:derbytestbd;create=true;territory=es_MX;collation=TERRITORY_BASED </property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>

Cambié el valor de la propiedad "hibernate.connection.url" por: "jdbc:derby:classpath:/derbytestbd;territory=es_MX;collation=TERRITORY_BASED" . Con esto queda configurado el sistema para usar la base de datos embebida con Derby en el medio de solo lectura.
  • En caso de que estés utilizando el driver JDBC directamente desde alguna clase lo único que tienes que hacer es cambiar el texto del Driver de Derby. Esto sería cambiar la línea 1 a la línea 2: 
Linea 1:
Connection conn = DriverManager.getConnection("jdbc:derby:directory:derbytestbd;create=true;territory=es_MX;collation=TERRITORY_BASED","root","");


Linea 2:
Connection conn = DriverManager.getConnection("jdbc:derby:classpath:/derbytestbd;territory=es_MX;collation=TERRITORY_BASED","root","");



Se puede observar como en ambos casos utilicé un usuario "root"  sin contraseña (vacío).

Una  vez hecho esto simplemente copiamos el directorio donde esta nuestro proyecto al directorio de Jetty. Esto sería copiar el directorio con los archivos compilados del proyecto web, en mi caso copiar el contenido de PROJECTONETBEANS/build/web a un JETTY_HOME/webapp/miproyecto , estamos pasando todos los jsp's y directorios WEB-INF y META-INF que son necesarios para que nuestra aplicación web funcionara en un contenedor tomcat por ejemplo.

Paso 4: Preparar Base de Datos con Derby

Debemos preparar la base de datos para que funcione en el medio de solo lectura.

Para empezar a manipular la base de datos es importante que  hayamos finalizado cualquier cliente que pudiera estar conectado y haciendo uso de nuestra base de datos.

Nuestra base de datos se llama "derbytestbd" entonces este es el nombre del directorio que contiene nuestra base de datos derby en la ubicación que lo hayamos creado. Dentro de este directorio antes de copiarlo debemos borrar el archivo directorio derbytestbd/tmp (sólo el tmp), el cual puede o puede no existir, así que no se preocupen si no existe.

Una vez hecho esto nos disponemos a crear el jar con los archivos de la base de datos. La mejor manera es utilizando el comando jar de la siguiente manera:

$ jar cMf derbytestbd.jar derbytestbd

Para más información de como crear un jar con tu base de datos Derby checar el Tema de la documentación de Derby "Transferring read-only databases to archive (jar or zip) files"

Donde derbytestbd es el directorio donde esta nuestra base de datos Derby y derbytestbd.jar es el nombre del nuevo archivo jar que se creará con nuestra base de datos para el medio de solo lectura.

Continuamos copiando nuestro nuevo archivo jar "derbytestbd.jar" en donde tenemos nuestro proyecto preparado para el medio de sólo lectura, es decir donde esta nuestra aplicación Jetty. Entonces copiamos derbytestbd.jar a JETTY_HOME/webbapp/miproyecto/WEB-INF/lib y así el jar de nuestra base de datos quede ligado al classpath de nuestra aplicación.

Paso 5: Como almacenar.

¡Listo! ya tenemos nuestro proyecto preparado para utilizarlo en un medio de sólo lectura. Para almacenarlo solo es necesario copiar el directorio completo JETTY_HOME al medio de almacenaje que deseemos. En este tutorial se indica que sea en un CD, pero se puede copiar a una memoria USB, disco portátil, etc. Así que tal cual se oye, técnica "copy&paste" y ¡ya!.


Paso 6: Como ejecutar.

Para ejecutar unicamente es necesario correr el servidor Jetty utilizando el archivo jar JETTY_HOME/start.jar ejecutandolo de la siguiente manera:

$ java -jar start.jar

Para más información de como ejecutar o utilizar el servidor Jetty acceder a la página oficial del proyecto aquí.

De esta manera iniciamos el servidor Jetty en la computadora donde estemos. Ahora es necesario acceder a nuestro proyecto, lo cual lo haremos a través de un navegador web ingresando a la siguiente url (Con las opciones por default de Jetty): "localhost:8443/miproyecto"

Si todo sale bien estarás viendo tu proyecto corriendo desde un medio de sólo lectura de manera embebida en un servidor Jetty :D


Notas finales

Algunas consideraciones que pueden ayudar en caso de algún error:
  •  El tutorial del que tomé la mayoría de las cosas les puede ser útil también y lo encuentran aquí.
  • Es importante que los jar's necesarios para la aplicación estén incluidos en el directorio miproyecto/WEB-INF/lib , si algún problema con alguna dependencia esta fallando, revisar eso o el CLASSPATH para corregir problemas con dependencias.
  • Cualquier comentario extra o duda pueden externarla, espero con gusto poder ayudar.