Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

PHP Senior

Últimas horas para inscribirse al Grupo 5 del Taller POO/PHP5

Octubre 31st, 2008 - [Enlace local]

Al momento ya hay 13 personas activas en el Grupo 5 del taller, por lo tanto quedan 7 lugares disponibles (como tope para que el grupo no se desborde) y lo recomendable es que si alguien más quiere inscribirse lo haga entre hoy y el fin de semana, ya que se encuentran disponibles todos los materiales de la semana y la letra para la nueva tarea que tiene como plazo de entrega el martes 4/10 a las 23:55.

Si quieres inscribirte el lunes ya te diría que estarás sobre la fecha y tendrás riesgo de atrasarte con la semana siguiente.

Último llamadooooo..... ;-)

» Leer más, comentarios, etc...

Javier Pérez :: Blog

Evitar el robo de imágenes (hotlinking)

Octubre 31st, 2008 - [Enlace local]

Se llama hotlinking al robo de objetos de una web enlazándolos directamente sin alojarlos en tu propio servidor, siendo el caso más común el de las imágenes. Es muy común encontrarte con que una web ha puesto una imagen de tu blog conservando el mismo enlace, con lo que pierdes ancho de banda en tu servidor y no obtienes ningún reconocimiento por ello, a menos que hayas usado marcas de agua en la imagen.

Es considerado una mala práctica. De hecho es una norma no escrita que todos los buenos bloggers no deben hacer hotlinking, pero aún así hay quien no la cumple, bien sea por desconocimiento, por vagueza, o por simple malicia.

Las marcas de agua son una solución eficaz, aunque no impides el consumo de ancho de banda de tu servidor, y son difíciles de implementar, o al menos más difícil que unas simples reglas en el htaccess.

Con estas instrucciones no evitarás que te hagan hotlinking, pero al menos conseguimos que quien nos lo haga muestre la imagen que queramos, sea cual sea la que nos ha robado. La imagen puede ser todo lo maliciosa que queramos, porque además son sentimos con el derecho y la autoridad de hacerlo, ya que, recordemos, quien hace hotlinking está incumpliendo una norma de convivencia virtual.

Por lo tanto podremos hacer que estos hotlinkers muestren desde una foto pornográfica (no recomendable) hasta una sencilla imagen bien grande con la url a nuestra web (es mi caso).

Edita el .htaccess de tu servidor, y añade estas líneas:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?javierperez\.eu/ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?google\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?bloglines\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{REQUEST_FILENAME} !hotlink.png$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ http://javierperez.eu/img/hotlink.png [L]

Como podéis ver, esa es la configuración que tengo en el servidor de mi blog. Tendréis que sustituir javierperez.eu por la url de vuestro sitio.

En la primera línea activamos el módulo rewrite de Apache (tendréis que habilitarlo en vuestro servidor si no lo estuviera ya con a2enmod). En la segunda línea indicamos que el sitio *.javierperez.eu tiene permitido visualizar las imágenes de nuestro sitio. Normal, quiero que en mi sitio se vean las imágenes de mi sitio. En la tercera y cuarta línea, además, habilitamos a *.google.com y *.bloglines.com para que puedan mostrar mis imágenes. Y en la quinta habilitamos también a que se puedan visualizar las imágenes en un navegador introduciendo la url completa de la imagen en la barra del navegador.

La penúltima línea indica que la imagen hotlink.png es la única que permitimos que nos roben.

Y finalmente, la última línea dice que el resto de sitios, pidan la imagen que pidan, siempre verán la misma, la que yo diga, en este caso http://javierperez.eu/img/hotlink.png

Úsalo en tu sitio web, y consigamos entre todos que esta práctica deje de usarse.

» Leer más, comentarios, etc...

psé

Usabilidad al poder

Octubre 30th, 2008 - [Enlace local]

Me llama hoy un agricultor, de Sevilla, bastante majo el señor, comentándome que había tenido un problema con nuestro sistema de guiado agrícola GPS, poca cosa. Ya de paso le pregunté qué tal le había ido y demás.

Resulta que me dijo que quería sembrar una parcela de varias cosas, quería medir la mitad de la parcela para dejar mitad y mitad. Se le ocurrió poner un ancho de trabajo de 200 y pico metros y trazar una línea por la linde para saber luego donde estaba la mitad. La idea es muy buena, aunque agorguía puede hacer medidas de ese tipo sin recurrir a estos trucos.

En principio yo pensé que había pinchado sobre el campo de texto donde se mete el ancho, había sacado el teclado y había puesto 200 y picos metros sin embargo durante la conversación va y me dice: "todavía tengo el dedo dolorido de ponerle los 200 metros". Resulta que puse dos botones para ajustar el ancho, de 10 en 10 centímetros y el agricultor se había subido los 200 y tantos metros con los botones... más 2000 pulsaciones.

Moraleja: está claro que esos botones no son útiles tal cual están debería poderse mantener pulsado y subir a velocidad creciente. Qué importante es la usabilidad en el software y cuantos beneficios aporta al software que el programador tenga feedback directo.

En estos días estoy dándole vueltas a una pequeña web (ya diré para qué en pocos días) y aunque soy yo quien la va a usar no me hago una idea de como la voy a usar y que me va a ser más útil. Optaré por la solución de darle vueltas e ir iterando... le estoy cogiendo el gusto a javascript y css.

» Leer más, comentarios, etc...

MonoCaffe

Accede a tus EJB3 de Sesión

Octubre 30th, 2008 - [Enlace local]

Quiero explicar cómo acceder de distintas maneras a un sEJB ejecutándose en un servidor de aplicaciones.

Además quiero hablar sobre las interfaces de los sEJB y cierta ventaja de salirse un poco del camino establecido por los tutoriales que se encuentran en la web dada las grandes posibilidades de implementación y configuración de los sEJB y sus interfaces.

¿Interfaces remotas o locales o las dos?

Depende, pero es mejor preguntarse ¿quién debe poder acceder a mi sEJB?

Como regla general, prefiero que cada EJB sea sólo utilizado como remoto o como local, no ambos. y así limitarlos según sea necesario.

La principal diferencia entre una interfaz local y una remota, es la manera en que el servidor de aplicaciones sirve el sEJB. Con las interfaces remotas, los objetos son enviados como valores y con las locales, se envían los objetos como referencias. Para conocer esto, el contenedor depende de la llamada que utilicemos: local o remote

Ahora, podemos definir las dos interfaces que implementen métodos distintos según nuestras necesidades, como evitar que los clientes remotos accedan a ciertos métodos que deseamos utilizar en local.

Un pequeña práctica que me gusta implementar es la de no utilizar la notación @remote o @local en las interfaces. En su lugar, prefiero utilizarlas directamente en el EJB que las implementa. Así podremos tener implementaciones de estas interfaces independientes del EJB. Dado que no podemos tener la certeza de que cualquier servicio proporcionado por estas interfaces vaya a ser un EJB prefiero mantener las interfaces por separado.

Seguimos necesitando indicar en alguna parte que estas interfaces son la local y remota de nuestro sEJB. Para lograr esto utilizamos la misma notación, pero ésta vez en el sEJB directamente:



@Stateless
@Local(MyTest.class)
@Remote(MyTestRemote.class)
public class MyTestBean implements MyTest, MyTestRemote{
//...
}

Ya habiendo definido el sEJB y sus interfaces, vamos a utilizarlas desde un cliente remoto y desde otro EJB incluido dentro del mismo EAR.

Lo más importante, es conocer la URI donde vamos a encontrar al EJB. Dado que lo hemos incluido dentro del EAR MyEA podremos acceder a las dos interfaces con los siguientes nombres:


El cliente remoto tendrá que hacer algo como lo siguiente, para poder obtener una instancia del EJB desplegado en un servidor JBoss:



Properties properties = new Properties();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url","localhost:1099");

Context context = new InitialContext(properties);
MyTestRemote remote = (MyTestRemote)context.lookup("MyEA/MyTestBean/remote");
//...


Para un EJB o POJO que está desplegado junto a MyTestBean en el EAR, debemos hacer algo parecido:



Context context = new InitialContext();
MyTest bean = (MyTest)context.lookup("MyEA/MyTestBean/local");
//...


Como veréis, no hace falta indicar las propiedades del contexto inicial ya que el servidor lo inicializará por nosotros.

Es importante no caer en el error de instanciar directamente un sEJB desde alguna de nuestras clases, ya que las inyección realizadas por el contenedor no se van a realizar. Por ejemplo, las unidades de persistencia no funcionarán y obtendremos un NPE poco explicativo.

» Leer más, comentarios, etc...

.: El Blog de Inwe :. » Programación

Ubuntu 8.10 ya disponible

Octubre 30th, 2008 - [Enlace local]

Por fin ha sido lanzada la nueva Ubuntu/Kubuntu 8.10, la cual nos brinda grandes novedades como son:

La podéis descargar, como siempre, desde aquí: Ubuntu 8.10

Entradas relacionadas

» Leer más, comentarios, etc...

Nuevos Programadores

Patrón Observador - Ejemplo en C#

Octubre 30th, 2008 - [Enlace local]

El patrón observador define una relación de uno a muchos, en la que un objeto único, al que llamaremos observable deberá notificar cada vez que cambie de estado a muchos objetos, que llamaremos observadores.

El funcionamiento de este patrón de diseño puede compararse con el de una suscripción a una revista, ya que los observadores se suscriben y cada vez que la revista, (observable), se actualiza, la misma se envía a los observadores suscriptos.

La definición del patrón observador es la siguiente: define una dependencia entre objetos de uno a muchos, de manera tal que cuando un objeto cambia su estado, todos sus dependientes son notificados y actualizados automaticamente.

Para demostrar el uso de este patrón, se ha creado un ejemplo en el que tenemos un form principal que tiene 2 botones, uno para abrir múltiples instancias de observadores, que en nuestro caso serán forms que mostrarán un listado desde una fuente de datos, un archivo XML más concretamente; y otro botón para abrir nuestro simulador de edición, que no es más que un form que nos permitirá editar la fuente de datos y nos permitirá observar que cada vez que alteramos los datos nuestros observadores serán notificados y actualizados automáticamente.

Es importante destacar que para una correcta implementación del patrón se utilizan interfaces que definen el rol de una clase como Observable u Observador, con lo cual nos olvidamos, por ejemplo de cómo se comporta cada clase cuando es notificada de un cambio de estado.

Veamos el diagrama de clases y a continuación el enlace para descargar nuestra mini-aplicación que implementa el patrón observador en C#.

Ejemplo de Patrón Observador en C#

También te puede interesar:

» Leer más, comentarios, etc...

phpleo.Blog

BarCamp Lima 2008

Octubre 30th, 2008 - [Enlace local]

Pués sí, todo comenzó en uno de los post de la Asociación Nacional de Webmasters Perú y luego César Soplín completó la idea de armar el BarCamp Lima 2008, un evento donde todos están invitados, y sobre todo “no hay turistas”. El primer encuentro es el sábado 8 de noviembre, y pronto en el wiki del [...]

» Leer más, comentarios, etc...

avemundi, blog de un micro-isv » Desarrollo de software

declutter, la palabra de moda

Octubre 29th, 2008 - [Enlace local]

Una de mis grandes manías tiene que ver con el entorno de programación, con el sitio físico donde realizo mi trabajo. Intento ser organizado en mi estudio, controlar el caos de mi mesa de trabajo y las estanterías donde guardo libros, apuntes, papeles y revistas. Algunos de mis programas nacieron con la intención de intentar organizar este caos, como es el caso de Cuaderno de Bitácora y Azeta, pero muchas veces más que una herramienta lo que se necesita para ser organizado es una actitud mental. Por eso, de un tiempo para acá leo algunos blogs sobre productividad personal que tratan sobre el tema. En castellano mis preferidos son El Canasto, Hábitos Vitales, IQ vital y El inconformista. Hay un concepto recurrente en estos blogs que es el de intentar simplificar los aspectos relacionados con el trabajo y la vida. Este simplificar no se refiere unicamente a hacer algo mas sencillo, sino a eliminar todo lo innecesario. Como es habitual los americanos llevan el decluttering al paroxismo y aplican este concepto a todos los órdenes de la vida, desde la organización doméstica a las relaciones personales.Volviendo al tema de la programación podemos hacer decluttering de muchas maneras, desde refactorizando nuestro código fuente a ser organizado con la instalación de nuestro PC. Algunas ideas para este decluttering de nuestro PC son las siguientes:

» Leer más, comentarios, etc...

Fetishcode...Thinking in objects

ORA-02291: integrity constraint

Octubre 29th, 2008 - [Enlace local]

A

» Leer más, comentarios, etc...

Javier Pérez :: Blog

Europa del Este y Rusia, en Google Analytics

Octubre 29th, 2008 - [Enlace local]

Estaba consultando las estadísticas de este blog, cuando vi que al pasar el cursor por Rusia (Federación Rusa, quiero decir) aparece un cuadro de texto informándome de que eso es Europa del Este. Pensando que es un fallo de Google Analytics, pincho en Rusia, y me sale este gráfico:

Europa del Este

Y seguía sin creerme que la Federación Rusa fuera considerada Europa, parte del continente europeo, pero empecé a dudar... Así que acudí a la wikipedia y, efectivamente, la Federación Rusa es un país más que conforma Europa del Este. ¿Me quedé dormido durante algunos años o qué ha pasado aquí?

Pues bien, resulta que esto de a qué continente pertenece cada país es bastante cambiante, y que lo mismo dentro de un siglo China es parte de Europa, o de EEUU, quién sabe... Y ahora Rusia es parte de Europa porque así lo decidió la división de estadísticas de la ONU. Aunque no toda Rusia, porque he descubierto además que Rusia es un país transcontinental, que quiere decir que el país tiene territorio en varios continentes... "normal", me dije.

Ya me frotaba yo las manos pensando en que habíamos arrebatado el país más grande del mundo a Asia, pero nos quedamos sólo con un trocito. Por algo se empieza...

Bienvenidos al Risk del mundo real.

» Leer más, comentarios, etc...

Yet Another Programming Weblog

Completado el borrador de C++0x

Octubre 29th, 2008 - [Enlace local]

Como comenta Herb Sutter en su blog, se ha publicado el borrador (pdf) de C++0x que se pasará a la votación internacional. Creo que es una buen noticia para todos los usuarios de C++, porque como dicen en reddit, map<string, string>::iterator, tu larga década de terror se ha acabado :) Además, y no menos importante, toda una serie de características como rvalues, lambdas, conceptos, librería de operaciones atómicas, librería de threads, soporte para expresiones regulares...

Y uno de los arreglos más importantes, el modelo de memoria. Del borrador:

The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any member of the basic execution character set and the eight-bit code units of the Unicode UTF-8 encoding form and is composed of a contiguous sequence of bits, the number of which is implementationdefined.
The least significant bit is called the low-order bit; the most significant bit is called the high-order bit. The memory available to a C++ program consists of one or more sequences of contiguous bytes. Every byte has a unique address.
[...]
A memory location is either an object of scalar type or a maximal sequence of adjacent bit-fields all having non-zero width. [...] Two threads of execution can update and access separate memory locations without interfering with each other.

Enhorabuena a los premiados. Ahora falta que los implementadores hagan su trabajo. MS VC++ parece que va avanzando para llegar a VC++2010. (Estoy seguro que la coincidencia del borrador de C++0x y la publicación este post en el blog de VC++ no es casual...) gcc, aunque más lento, también va avanzando y ya se pueden probar algunas características.

La misma entrada y más comentarios en Completado el borrador de C++0x en barrapunto

» Leer más, comentarios, etc...

Navegapolis

La lista definitiva de modelos y buenas prácticas para proyectos de software

Octubre 29th, 2008 - [Enlace local]

numerosEscribir "lista definitiva", de "buenas prácticas...", y más, en un blog, puede sonar como los "requisitos definitivos" de un proyecto ágil: ¿Estos son? ¿No van a cambiar?

Este artículo es un backlog, o pila, si empleamos en nuestro idioma: una lista en continuo cambio, para ir completando y mejorando entre todos, vuelta tras vuelta.

CRITERIO DE CLASIFICACIÓN

Prácticas

Dicen "CÓMO" hacer las cosas: cómo describir y gestionar los requisitos (historias de usuario, elementos de backlog...), cómo estimarlos, cómo realizar las reuniones para validar con el cliente, cómo realizar el mantenimiento del código, las pruebas, la integración...

 

» Leer más, comentarios, etc...

{ Radamanthys }

Validando valores numericos en Python

Octubre 29th, 2008 - [Enlace local]

Ademas de verificar el valor contenido en una variable, es decir, que rango de valores dentro de los aceptables por un tipo de datos permitiremos en nuestra aplicacion, tambien debemos velar porque esos datos sean tolerables por un tipo de datos con el que estemos tratanto(Poe ejemplo, verificar que el usuario no ingrese caracteres del alfabeto{a..z, A..Z} cuando esperamos un caracteres tipo numerico {0-9,.}).

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import math
import sys
 
text = raw_input('Obtener seno de [ ingrese número flotante ] :')
 
number = 0.0
 
try:
	flag = 0
	number = float(text)	
except ValueError:
	flag = 1
	print "Entrada inválida (no es un número flotante)."
 
if flag == 0:
	sin_obtained = round(math.sin(number),2)
	print sin_obtained

En el caso de Python podremos capturar un excepcion del tipo ValueError, la cual es lanzada cuando se realiza operacion o una funcion recibe como argumento un tipo de dato no apropiado. Como seria en este ejemplo, si la funcion float intentara convertir una cadena que no represente un dato numerico.

Mas informacion : http://www.python.org

» Leer más, comentarios, etc...

Blog de Julio César Pérez Arques

Cómo configurar Log4j con Spring

Octubre 28th, 2008 - [Enlace local]

Configurar Log4j con Spring es muy sencillo. Suponiendo que tienes el log4j.jar en la carpeta lib de tu aplicación o servidor más el fichero de configuración log4j.properties o log4j.xml, basta con añadir las siguientes líneas al fichero Spring applicationContext.xml (pej) de tu aplicación:

lt;bean id="log4jInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"gt;

lt;property name="staticMethod" value="org.springframework.util.Log4jConfigurer.initLogging" /gt;

lt;property name="arguments"gt;

lt;listgt;

lt;valuegt;ruta_a_fichero_configuracion_log4jlt;/valuegt;

lt;/listgt;

lt;/propertygt;

lt;/beangt;



Un ejemplo de ruta_a_fichero_configuracion_log4j podría ser classpath:conf/log4j.properties.



Si la aplicación es web, aún es mas sencillo. Sólo habría que añadir lo siguiente al fichero web.xml:



lt;context-paramgt;

lt;param-namegt;log4jConfigLocationlt;/param-namegt;

lt;param-valuegt;ruta_a_fichero_configuracion_log4jlt;/param-valuegt;

lt;/context-paramgt;



lt;listenergt;

lt;listener-classgt;org.springframework.web.util.Log4jConfigListenerlt;/listener-classgt;

lt;/listenergt;



De nuevo, un ejemplo de ruta_a_fichero_configuracion_log4j podría ser /WEB-INF/log4j.xml.

» Leer más, comentarios, etc...

Variable not found

Atajo para instanciar tipos anónimos en C# y VB.NET

Octubre 28th, 2008 - [Enlace local]

Tanto la guía de programación del lenguaje C# 3.0 como la de Visual Basic .NET 9 hablan de que ambos compiladores pueden agilizar la instanciación de tipos anónimos, permitiendo escribir instrucciones realmente concisas, gracias a su capacidad para deducir los nombres de las propiedades a partir de su contexto. Sin embargo son ese tipo de detalles que, al menos un servidor, había pasado por alto a pesar de haberlo visto utilizado más de una vez.

Como sabemos, la creación "normal" de un objeto de tipo anónimo es como sigue, si lo que queremos es inicializar sus propiedades con valores constantes:

  // C#
var o = new { Nombre="Juan", Edad=23 };

' VB.NET
Dim o = New With { .Nombre="Juan", .Edad=23 }
 
Sin embargo, muchas veces vamos a inicializar sus miembros con valores tomados de variables o parámetros visibles en el lugar de la instanciación, por ejemplo:
  // C#
public void hacerAlgo(string nombre, int edad)
{
var o = new { nombre=nombre, edad=edad };
...
}

' VB.NET
Public Sub HacerAlgo(ByVal nombre As String, _
ByVal edad As Integer)
Dim o = New With {.nombre = nombre, .edad = edad}
...
End Sub
 
Pues bien, es justo en estos casos cuando podemos utilizar una sintaxis más compacta, basada en la capacidad de los compiladores de inferir el nombre de las propiedades del tipo anónimo partiendo de los identificadores de las variables que utilicemos en su inicialización. O en otras palabras, el siguiente código es equivalente al anterior:
  // C#
public void hacerAlgo(string nombre, int edad)
{
var o = new { nombre, edad };
...
}

' VB.NET
Public Sub HacerAlgo(ByVal nombre As String, _
ByVal edad As Integer)
Dim o = New With {nombre, edad}
...
End Sub
 

Brad Wilson, un desarrollador del equipo ASP.NET de Microsoft, nos ha recordado hace unos días lo bien que viene este atajo para la instanciación de tipos anónimos utilizados para almacenar diccionarios clave/valor, como los usados en el framework ASP.NET MVC. También es una característica muy utilizada en Linq para el retorno de tipos anónimos que contienen un subconjunto de propiedades de las entidades recuperadas en una consulta.

Publicado en: www.variablenotfound.com.

» Leer más, comentarios, etc...

Javier Pérez :: Blog

Migración de mi blog al nuevo CMS

Octubre 28th, 2008 - [Enlace local]

Y aprobechando que cambio de CMS (éste va por la tercera versión, si no recuerdo mal), también he trabajado en otro diseño, que a mí personalmente me gusta más, pero claro, lo he hecho yo...

Quede como recuerdo esta captura de pantalla:

Captura de pantalla del blog v2

El nuevo CMS usado no es ni más ni menos que el CMS que estoy desarrollando, y con el que he publicado diosteescucha.com, y pronto elecratia.com. Usa un framework con patrón MVC en PHP5 desarrollado por mí mismo, y espero poder publicarlo en breve y dar más detalles sobre él.

Espero que guste el diseño y la funcionalidad, aunque aún queda mucho por hacer. Al menos ahora sí se ve en Internet Explorer, algo que muchos lectores me han pedido con insistencia.

» Leer más, comentarios, etc...

The New Cult of Dead Cow

Pastebin

Octubre 28th, 2008 - [Enlace local]

Pastebin ( y todos sus clonicos ) son una excelente herramienta para solicitar ayuda en las listas de correo y en las salas IRC. Nos permiten compartir codigo y mostrar resultados de compilaciones, etc.

El inconveniente es que hay que abrir el navegador cargar la pagina, copiar el archivo y luego obtener la URL para poder solicitar ayuda.

Para abreviar, podemos utilizar un script en bash que nos permite hacerlo de manera automatica. Por ejemplo, si quiero enviar las ultimas 20 lineas de acceso de mi proxy haria lo siguiente

tail -n 20 /var/log/squid/access.log | pastebin.sh

o enviar el archivo de log de un compilacion en gentoo

cat /var/tmp/portage/www-client/htmlview-3.0.0-r1/temp/build.log | pastebin.sh

De momento el script, solo envia informacion a paste.ubuntu.com, y utiliza tu usuario como nick para enviar la informacion.

 pastebin.sh

Para utilizarlo, copienlo en /usr/bin y denle permisos de ejecucion.

» Leer más, comentarios, etc...

The New Cult of Dead Cow » desarrollo

Pastebin

Octubre 28th, 2008 - [Enlace local]

Pastebin ( y todos sus clonicos ) son una excelente herramienta para solicitar ayuda en las listas de correo y en las salas IRC. Nos permiten compartir codigo y mostrar resultados de compilaciones, etc.

El inconveniente es que hay que abrir el navegador cargar la pagina, copiar el archivo y luego obtener la URL para poder solicitar ayuda.

Para abreviar, podemos utilizar un script en bash que nos permite hacerlo de manera automatica. Por ejemplo, si quiero enviar las ultimas 20 lineas de acceso de mi proxy haria lo siguiente

tail -n 20 /var/log/squid/access.log | pastebin.sh

o enviar el archivo de log de un compilacion en gentoo

cat /var/tmp/portage/www-client/htmlview-3.0.0-r1/temp/build.log | pastebin.sh

De momento el script, solo envia informacion a paste.ubuntu.com, y utiliza tu usuario como nick para enviar la informacion.

 pastebin.sh

Para utilizarlo, copienlo en /usr/bin y denle permisos de ejecucion.

» Leer más, comentarios, etc...

Cerebro en la Sombra » Técnico

Y seguimos con la falta de personal técnico cualificado

Octubre 28th, 2008 - [Enlace local]

Tenía pendiente hacer un comentario desde la semana pasada.

¿Por qué se empeña Enrique Dans en contradecir a cientos de programadores? ¿En serio es creíble el argumento de que no hay personal adecuadamente cualificado en España? Suelo leer a Enrique y creo que es un tío normalmente serio y coherente en sus argumentaciones (estés o no de acuerdo con ellas), pero es que con ésta no puedo, no la veo reflejada por ningún lado en el mundo real.

Mi experiencia me dice lo contrario. Claro que ya no se reciben cientos de curriculums para una oferta de trabajo, pero es que aquello era lo anormal. ¿Acaso recibes docenas y docenas de currilums para un puesto importante de departamentos tradicionales (comercial, marketing, rrhh…)? ¿Por qué esperas entonces recibirlos para un puesto de programador? Un programador es, desde la base de su formación, personal altamente cualificado y han estado puteados durante muchos años. Resulta que ahora cuando comienza a verse un poco de dignidad en el sector, no hay gente, curioso ¿no?, es decir, ahora que queremos jornadas normales y salarios decentes, faltan programadores. Recuerda que, ante todo, buscas a la/s persona/s que diseñarán y construirán tu producto…

Lo he comentado ya en otras ocasiones pero creo que mis razones siguen siendo completamente válidas:

Sobran más palabras ¿no?.

» Leer más, comentarios, etc...

Cerebro en la Sombra » Técnico

Generador de códigos de barras en AS3

Octubre 28th, 2008 - [Enlace local]

Hoy vamos a ver un ejemplo sobre cómo generar códigos de barras al vuelo utilizando ActionScript3. Un código de barras es la representación mediante líneas paralelas de distinto grosor de un código numérico o alfanumérico. Esta representación lineal los hace de fácil interpretación para un lector láser. No creo que se necesiten más explicaciones, todo el mundo sabe lo que es un código de barras.

Los códigos de barras lineales pueden ser de distintos tipos, en el ejemplo de hoy generaremos EAN y C128. EAN es el más utilizado a nivel mundial y el utilizado en España, así que será el que nos ocupe hoy. Mi trabajo está basado en la clase para generar códigos C128 de Friedrich Dimmel (lo siento, no localizo el link original). La clase que genera el código EAN no es ni más ni menos que la reescritura en AS3 de la que trae phpBarcode  y adaptada para generar la secuencia de líneas que se dibujan bajo la lógica de Friedrich Dimmel en vez de generar una imagen con GD como hace la clase original. Como casi siempre, este pequeño desarrollo lo hice hace un par de años para un sistema de control de stocks, no me critiquéis mucho el código :P.

Flash del generador

Un código EAN son 13 dígitos, 12 de información (código de país, empresa y producto) y un dígito de control que ayuda a verificar que la decodificación posterior es correcta.
Para crear la imagen de nuestro código simplemente debemos llamar a la clase generadora  con los parámetros:

Por ejemplo:

  1. BarcodeGenerator.generateBarcode("3456789012345", 50, "EAN");

Como hemos visto, el último dígito es de control, con lo que con introducir los 12 dígitos con valor será suficiente, la clase generará el treceavo automáticamente. No voy a explicar detalladamente como generar los códigos EAN, hay suficiente literatura acerca del algoritmo googleando un poco y para ver el resultado lo mejor es que examinéis el código fuente que os dejo más abajo. Creo que lo más curioso e importante es ver cómo generamos la imagen una vez tenemos generado el código de líneas.

  1. public static function generateBarcode(code:String="0", height:Number=60, tipo:String="EAN", showText:Boolean=true, backgroundColor:uint=0xffffff):Canvas {
  2.     var can:Canvas = new Canvas();
  3.     can.horizontalScrollPolicy = "off";
  4.     can.verticalScrollPolicy = "off";
  5.     can.height = height;
  6.     can.setStyle("backgroundColor", backgroundColor);
  7.     var sBarcode:Shape;
  8.     var rect:Rectangle;
  9.     var bd:BitmapData;
  10.     var img:Image;
  11.     var bitmap:Bitmap;
  12.     if(tipo=="EAN"){
  13.       var barcode:BarcodeEAN = new BarcodeEAN();
  14.       barcode.code = code;
  15.       barcode.barHeight = height;
  16.       if(showText) {
  17.         barcode.barHeight -= 15;
  18.       }
  19.       var k:Object=barcode.barcode_encode_ean(code);
  20.       if(!k.bars) return new Canvas();
  21.       var bars:String=k.bars;
  22.       var text:String=k.text;
  23.       sBarcode = barcode.generateBarcode();
  24.       rect = new Rectangle(0, 0, (sBarcode.width / 2) + 1, barcode.barHeight);
  25.       bd = getBitmapData(sBarcode, rect);
  26.       img = new Image();
  27.       bitmap = new Bitmap(bd);
  28.       img.source = bitmap;
  29.       can.addChild(img);
  30.       var chars:Array=text.split(" ");
  31.       var n:String;
  32.       var v:String;
  33.       var total_y:Number=40;
  34.       for(n in chars){
  35.         v=chars[n];
  36.         if (StringUtil.trim(v)){
  37.           var inf:Array=v.split(":");
  38.           var fontsize:Number=inf[1]/1.8;
  39.           var fontheight:Number=30;
  40.           var label:Label = new Label();
  41.           label.text = inf[2];
  42.           label.x = Number(inf[0])-2;
  43.           label.y = fontheight;
  44.           label.setStyle("fontSize", 9);
  45.           label.setStyle("paddingBottom", 0);
  46.           label.setStyle("paddingLeft", 0);
  47.           label.setStyle("paddingRight", 0);
  48.           label.setStyle("paddingTop", 0);
  49.           can.addChild(label);
  50.         }
  51.       }
  52.     }
  53.     return can;
  54. }

En realidad es tan sencillo como crear una imagen a partir de lo que nos devuelve la clase generadora EAN (un objeto de tipo Shape). Finalmente si queremos imprimir el código en la propia imagen tendremos que poner cada letra en el sitio que le toca, no van en cualquier lado.

¿Qué tal si hacemos el proceso contrario con un lector casero?

Os dejo el código fuente del proyecto.

» Leer más, comentarios, etc...

programania

Futuro de PHP: closures, traits, namespaces, lambda y más.

Octubre 28th, 2008 - [Enlace local]

Está motidito el mundo del PHP. Ya sabíamos que PHP 6 traería Traits, que PHP 5.3 traería closures, o que cuando la 5.3 estuviera suficientemente expandida saldría Zend Framework 2.0 y que sería incompatible hacia atrás.

Resulta bastante sencillo perderse dentro de todo este girigai de mejoras. Os dejo una presentación que trata de aclararlo un poco.

Of Lambda Functions, Closures, and Traits
View SlideShare presentation or Upload your own. (tags: design language)

» Leer más, comentarios, etc...

Picando Código

Frase del día: Recursividad

Octubre 28th, 2008 - [Enlace local]

Los verdaderos programadores sueñan en recursivo.

Fernando Briano

¿Qué es recursividad?

» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

100/100 en Acid3

Octubre 28th, 2008 - [Enlace local]

Aunque fue la gente de Opera, los primeros en crear una versión de su motor, capaz de conseguir los 100 puntos en el test Acid3, parece que finalmente quien pegará primero será la gente de Webkit.

El último Opera disponible (9.61.10463) se conforma con 85 puntos, la última compilación de Chromium 0.3.155.0 build 3972, obtiene los deseados 100 puntos, pero con un aviso de "Linktest failed".

Sin embargo, Safari 3.1.2, combinado con la última compilación de Webkit (37819), si que es capaz de pasar satisfactoriamente el test.

Con todo, parece que la tecnología ya está ahí, lo que queda por ver, es quien lanzará oficialmente en primer lugar, un navegador con este soporte.

» Leer más, comentarios, etc...

Arragonán

Jobsket.com a la vuelta de la esquina

Octubre 28th, 2008 - [Enlace local]

Tras varios meses de trabajo, vemos ya cercana la aparición Jobsket al mundo, en forma de beta privada. Un proyecto dirigido al sector empleo en internet, con un desarrollo y un enfoque que se sale de lo habitual, y al que también le vemos un potencial enorme.

Jobsket logo

Para estos proyectos se suele hablar mucho del equipo, y tengo que decir que el nuestro da miedo ;) : con Jordi, Mamen, y Martín. Para mi los tres son de lo mejorcito, mientras tanto, otros hacemos lo que podemos para no desentonar demasiado :P .

Con el potencial del proyecto y del equipo, estamos convencidos que jobsket dará mucho que hablar y que demostará, una vez más, que con motivación y gente muy válida no importa que los miembros del equipo estén a cientos o miles de kilómetros para terminar haciendo un gran trabajo.

Si alguien tiene curiosidad a un nivel más técnico y no lo ha leído antes en el blog de Martín, nuestro framework web elegido fue Grails, algunas razones: cuando empezamos se estaba hablando muy bien de Grails(allá por la Release Candidate de la versión 1.0), al basarse en Hibernate y Spring sabíamos que no empezábamos de 0, además ya había algunas aplicaciones en producción más o menos grandes y teníamos ganas de aprender algo nuevo. La experiencia hasta el momento está siendo muy satisfactoria.

Por ahora tampoco podemos decir mucho más, simplemente animaros a seguirnos en twitter y que si queréis probar la beta cuando esté disponible registréis vuestra dirección de correo para avisaros.

» Leer más, comentarios, etc...

Pwned's blog - Desarrollo de Tecnologia

Nuevo logo de .NET

Octubre 27th, 2008 - [Enlace local]

logoNET

El cambio ha sido inminente y eso conlleva a nuevos objetivos y nueva experiencia. El logotipo de Microsoft .NET ha sido renovado e innovado a un nuevo diseño, mas fresco y con la característica tan especial de representar a .NET ante mas de millones de desarrolladores y entusiastas de las tecnologías de .NET.

 

Este nuevo diseño creado por Mason Flint y Brand Strategy CMD será anunciado de forma publica la próxima semana en PDC.

 

Ahora, ¿Por qué el cambio?, El logo original de .NET fue diseñado justo antes del 2000. Fue diseñado para ser parte de otras marcas de Microsoft como un agregado. El resultado fue un logotipo que no está bien en su propia esencia y carece de impacto.

 

El logo sera el elemento visual primario en comunicaciones y productos de User Experiences (UI) para .NET.

 

Interesante el nuevo diseño y sobretodo que fue diseñado con las mismas herramientas de .NET y se ve muy cool.

 

Saludos.

Blogger Etiquetas de : , , ,

Pwned's Blog

» Leer más, comentarios, etc...

Información legal y técnica