Sunday, May 22, 2011

Quién dice que no hay Corrientes Artísticas y Sociales en la Programación?

Suelo decir que cuando escribes mucho significa que trabajas poco, al menos para un programador. Llevaba mucho tiempo sin escribir en mi Blog y de pronto hoy pues he publicado 2 entradas y ahora una tercera.

Tengo poco trabajo? No, para nada, estoy haciendo estos escritos pasada ya la media noche: es cuestión de que el “cuerpo” me la ha pedido. Quizás sea porque acabo de regresar de la sede del Cliente del proyecto actual (en el cual permanecí durante los últimos 11 días seguidos) y vengo con la tranquilidad que el proyecto va saliendo de maravillas luego de una etapa inicial muy convulsa y delicada, por parte del cliente, aclaro.

Y hablando de este proyecto actual, ahí fue donde hace unos días surgió la idea para este Post. Resulta que estoy compartiendo el trabajo con un colega y en una de sus entregas veo que me había dividido un proyecto de Visual Studio en dos.

Cuando le pregunto que para qué? Pues me dice que al él le gustaba hacerlo así porque bin bin y bin ban… y que reconoce que pertenece a la famosa escuela (entre nuestra comunidad de amigos y programadores) del IPerson.

Para los que no conocen la historia, se trata de una añejo debate, tratado en blog, discusiones, etc, sobre hasta qué punto debemos hacer un software o no basado en la super separación de capaz, interfaces, y los patrones que se nos ocurran. Y dentro de este debate el ejemplo más clásico es que si vas a hacer una clase Persona pues deberíamos hacer una interface IPersona, aun cuando más nadie la herede ni la use, pero, para un futuro! (Esto es una exageración con intensión de burla de los críticos de dicha filosofía).

Bien, volviendo a la conversación con mi colega, y como soy de los que da libertad para los estilos individuales cuando trabajo en equipo (salvo alguna excepción, jeje) le dije:

- Está bien, no sé si sea lo mejor, pero es tu decisión. Al menos cuando alguien vea el código dirá: Joder, como hay proyectos en esta solución!! Debe estar compleja.

A lo que me responde, sonriendo:

- Si, si, tu sabes, EL IMPRESIONISMO.

Ahí mismo comencé a reírme porque le puso nombre a toda mi idea y más aún: la sintetizó en una palabra y en una tendencia artística (del código fuente de los programadores)

Le dije, hare un escrito con esto y de inmediato dejamos volar la imaginación hacia las diferentes corrientes artísticas que podíamos recordar. Les comento algunas y serán bienvenidas las que aporten:

El IMPRESIONISMO:

Ya lo conocen, se trata de impresionar con muchas, muchísimas líneas de código más de las que realmente son necesarias para una decorosa ejecución de proyecto. Se trata de hacer Interfaces para todo lo que sea “Interfaceable” (esta palabra ni debe existir, ok?), de utilizar cuanto Patrón nos venga a la mente, de dividir los proyectos “siempre que sea necesario”.

No importa cuán complejo o grande se haga el proyecto, más prestigio tendremos ante los ojos de nuestros colegas que le den un vistazo al código, que dirán: Joder, estos socios sí que saben, jeje.

El FUTURISMO:
Es aquel que agrega cuanta mierda se le ocurre porque en un futuro puede usarse. Y aclaro que no hablamos de un límite permisible de previsión a corto plazo que es admisible, sino de previsión a Procesos que ni siquiera existen en ese momento.

Esta técnica incluye crear campos adicionales en las tablas de las BD por si se usan. Lo interesante del caso es que casi nunca se usan y si se usan pues quedaría tan diferente el nombre del campo de su “objeto social” que no hay Programador que sea capaz de leer el código de darle una mirada simple como debería ser. También incluye crear clases con propiedades y métodos superfluos, o como dicen un chiste cubano, super fulas, jaja, y asi una larga lista de lo que puede ser.

Pensando asi deberíamos programar a todos nuestros software la capacidad de dirigir a los humanos cuando ya se vuelvan locos de tanto pensar en lo que será el futuro, y bla bla bla

El ABSTRACCIONISMO:

Aunque esta tendencia o corriente pueda asemejarse a la primera (impresionismo) la diferencia es sutil: Los abstractos no pueden hacer las cosas de otra forma, utilizan interfaces para todo lo que sea posible, protocolos sobre lo que no tiene protocolos, pero solo por convicción y porque son así. No les interesa impresionar a nadie.

Los ECOLOGISTAS:
Les pongo este nombre porque los Ecologistas son los que más se preocupan por reciclar, usar el mínimo posible de recursos de cualquier tipo.

En el caso de los programadores serían los tipos que son capaces de crear variables, clases y métodos con los nombres más cortos posibles, por ejemplo: a, x, e, i. Minimizan al máximo las teclas que presionan, gastan poco papel si imprimen su código, etc.

Pero para mayor semejanza, estos programadores ecologistas reciclan dichas variables tanto como sea necesario. Son capaces de usar la variable a para un objeto de tipo integer y después para un objeto de tipo File. Son capaces de crear un método X que sea para disparar un Laser y después crear otro X que lo que haga se reproducir una canción.

Si a alguien se le ocurre un mejor nombre para este grupo? Pudiéramos llamarle los Cerdos, pero no tendría relación con tendencias artísticas o sociales.

Alguna tendencia más?

Una en Contra, una a Favor, para que nadie salga herido de sentimientos

En mi post anterior me declaraba en contra se utilizar una de las nuevas opciones de Gmail.

Bien, ahora voy a celebrar las nuevas opciones que ha puesto a disposición de los Usuarios la plataforma de Blog de Google: BlogSpot.

He recibido con satisfacción lo nuevo que han agregado para hacer más participativo el debate.

- Reacciones: Ahora los usuarios pueden marcar si el post les resulta Divertido, Interesante o Guay (en la versión Español)

- Compartir enlaces en la Redes sociales: Ya los usuarios pueden compartir nuestro post haciendo un simple clic. Entre las redes están las 2 más importantes como Twitter y Facebook.

Entonces no queda más que dar las gracias por las nuevas opciones. Esperemos que los usuarios las usen en bien del debate y el conocimiento.

Importante o no Importante? Para quién?

Soy un admirador de Google y vivo muy agradecido de sus servicios gratuitos. Mi información personal la confío a Google como a nadie y no es que confíe ciegamente, pero en algún lugar debo poner mi información importante y también la no importante.

Quizás una copia local es una opción pero tiene el problema que no es accesible estés donde estés. Además es susceptible a robos, registros por personal no deseado (muy común en algunos lugares de este mundo), etc. Para poner un ejemplo bien cercano, hace poco más de un mes robaron en mi oficina laboral y se llevaron, entre otras cosas, una laptop que yo utilizaba y en la cual tenia que se abrieran de forma automática varios servicios de correo, etc.

Lo primero que hice fue entrar a todos los servicios on line importantes y cambiar las contraseñas, llámese: correos, bancas en línea y comunicación, principalmente. Si todos los correos hubiesen estado en dicha laptop pues sabemos es en bastante fácil revisar la información de un disco duro y romper contraseñas locales por un malintencionado. Entonces pues, partamos del hecho de que en algún lugar deben estar tus datos y tampoco estamos hablando de información de seguridad nacional que necesite estar debajo de un sótano a prueba de ataque, robos y la madre divina: hablamos solo de nuestra información personal.

También la tengo en línea porque entre tantos millones de usuarios somos uno más del montón. Si un día sufrimos uno de los tantos ataques de “inseguridad” que también sufren “los grandes servicios” pues es poco probable que quien la robe este tan cerca de mí como para poder utilizarla eficazmente.

Además, entre tantos cientos de miles de correos tendrá que pasar mucho, pero mucho tiempo para localizar lo que realmente es importante para mí, aun cuando está claro que por palabras claves se le pudiera facilitar el trabajo de búsqueda: dinero, negocios, amor, …, y una larga lista, pero aun asi tendría que leer varios cientos de miles de correos.

Ahora, qué pasaría si tú le haces el trabajo? Qué pasaría si le dices: mira, estos de aquí son mis correos importantes?

Creo que no me gustarían los resultados.

Y es a donde quiero llegar. Realmente nos daría utilidad decirle a Gmail que correo es importante para nosotros? Esta es una nueva opción que acabo de ver hace un par de días: Marcar como Importante, o como no Importante un correo.

Cuando la vi me pregunte de inmediato: bueno, y esto ahora para qué? Ya tengo la posibilidad de marcar como una Estrella mi mail importante (que no la uso, salvo temporalmente para marcar algo y buscarlo muy rápido). Ya tengo la posibilidad de organizar con Etiquetas mis correos, una de ellas puede ser para mí la “más importante”. Y así podemos enumerar varias facilidades con el mismo objetivo.

Entonces pues, para que una más? Me di a la tarea de buscar algunas opiniones rápidamente y algunos veo que pedían a gritos una opción como esta, asociándola a lista de prioridades a la hora de la salida o entrada del correo, quizás. Otros lo ven como perjudicial porque los Spammer generalmente envían sus correos con la categoría de Importantes y esto no hará más que hacer que te clasifiquen como spam.

Conclusiones:

No le veo ninguna utilidad que no esté ya a mi alcance. Estoy consciente que Gmail pensó en algo bueno con esto, pero no creo que sea para mí. Le veo más riesgos que beneficios, en el plano personal, aclaro. Los correos en Gmail salen a la velocidad de un cohete aun sin ser marcados como Importantes.

Cada quién que haga uso o no de dicha herramienta.

Friday, April 1, 2011

Mi blog, mi abandonado blog

No, lo puedo creer!!, como pasa el tiempo! 9 meses de mi ultima entrega en este blog.

Bueno, las razones son varias, muy personales: mucho trabajo, cambio de ciudad (bueno, quién dice ciudad? cambio de país incluso).

Entonces pues, ya casi llevo 3 meses asimilando una nueva cultura, una nueva forma de ver y asimilar la vida cotidiana, de ver cosas mejores, cosas peores, y en resumen, cosas nuevas...

Para colmo he tenido desde mi llegada mas trabajo aun del que tenia antes. Pudiera quejarme, pero es bueno tener trabajo: creo que estaremos de acuerdo en este punto.

En cualquier caso espero a partir de hoy tener tiempo para escribir algunos articulos que tengo en mente, queriendo salir a la luz. Y si no, que remedio, dentro de otros 6 o 9 meses volvere a recordar que tengo un blog.

Un abrazo a todos los que lo merecen.

Monday, June 21, 2010

Mientras más conozco de Java más quiero a Microsoft

Dicen las mujeres:
Mientras más conozco a los hombres más quiero a mi perro!.

Es un refrán que me viene a la mente pero extrapolándolo a Java yo diría:

Mientras más conozco de Java más quiero a Microsoft.

Es casi imposible enfrentar un proyecto de Java sin tener que estudiar una o varias bibliotecas de terceros siendo a veces un “desorden de tecnologías” que no hay quien siga. He trabajado en proyectos donde se han utilizado unas bibliotecas enormes y tan solo al pasar de 2 años ya no se continúan desarrollando por sus creadores. Ni hablar del esfuerzo de instalar y configurar dichas biblioteca!!!, mama mia!. Si hoy quisiéramos continuar desarrollando el proyecto no nos quedaría mas remedio que comenzar de cero con otra.

Tengo un amigo que cada vez que le encargaban hacer algún proyecto se las ingeniaban para encontrar una biblioteca de “San Juan de los Palotes” y pedirle que la estudiara y la usara: el pobre!: bueno, no tan pobre, jeje, que gracias a eso pasó a mejor vida, quiero decir: a mejores condiciones laborales, jaja.

No quisiera referirme demasiado al tema de las interfaces visuales: AWT, Swing, SWT, alguna de Eclipse más una larga lista de etcéteras, sumado 18 mil IDEs (o pluggins o asistentes visuales o como les llamen) creados sobre estas que al final son en extremo lentos, no son muy compatibles con el resto de sus “tecnologías hermanas” y que casi nunca llegan a dar soluciones a todas las necesidades. Cuando más contento estas se te desconfigura el formulario tan detalladamente habías creado y en el cual habías invertido varias horas de trabajo. De pronto descubres que el titulo es la barra de estado, que el botón Cerrar está en el Encabezado y que los controles fueros todos a parar a no sé dónde?.

Mención aparte, y para bien, merece el tema J2ME (Java para equipos Móviles: Micro Edition). Creo que es uno de los temas menos problemáticos de Java, mejor tratados y que mejor responde a las expectativas. Bueno al menos no recuerdo haber sido infeliz durante el poco tiempo en el cual tuve que vérmelas con esta versión.

Soy consciente que los fanáticos o amantes de Java quizás deseen matarme después de tan pocos amables comentarios pero, qué le voy a hacer? Sé que es mucha mi ignorancia aun en el mundo del Java, pero señores me quedo con Microsoft y sus adorados IDEs: TODO en UNO.

Me viene a recuerdo un amigo que de seguro lee este articulo y que para mí es todo un símbolo de lo que yo llamaría Homosexualismo Tecnológico (no puedo escribir aquí la verdadera palabra con la que lo califico, jeje) o Traición tecnológica. Mi buen amigo se ha tatuado la tasita símbolo de Java pero se gana la vida con Microsoft y sus tecnologías, jajajajaja, es para morirse de la risa.

Sé que el expondrá sus razones desde el punto de vista comercial, etc, etc, pero cuando se ama algo, no se traiciona y menos por dinero, jeje.

Bueno, hasta aquí mis palabras de desahogo por la ultima e infeliz semana que me ha hecho pasar Java.

Problemas con Jdbc para conectar a una BD en SqlServer 2005 Express (PROGRAMACION)

Crear aplicaciones de bases de datos en Java a través de Jdbc puede no ser siempre una experiencia alegre, sobre todo cuando se trata de conectarlas con SqlServer.

En nuestro caso trabajamos con el IDE Eclipse, usamos un driver de Microsoft y usamos SqlServer 2005 Express Edition.

Los primeros problemas vienen con el Driver que a decir de varias personas en Internet no es la mejor opción seleccionar el de Microsoft sino otros de terceros que incluso se pueden encontrar en CodeProjetc con licencia GNU.

En Microsoft encontramos varias versiones: “Microsoft SQL Server JDBC Driver 2.0” y “Microsoft SQL Server 2005 JDBC Driver” y aunque la lógica indica hacer uso de este ultimo pues en mi caso solo funcionó el primero.

Entonces, ya sabe, si tiene problemas con la supuesta versión 2005 del Driver pues utilice en su lugar la versión “Microsoft SQL Server JDBC Driver 2.0”.

Estructura de la Cadena de Conexión.

Lo primero es un curso de adivino, hasta que te convences y buscas la documentación. Normalmente en todas las cadenas de conexión el nombre del servidor es “NombreServidor\NombreInstancia” (recordemos que podemos tener varias instancias de SqlServer en la misma PC, incluso de la misma versión) pero no se por cual motivo nuestros amigos de Microsoft decidieron separar aquí estas dos propiedades: Supongo que de fondo sea por culpa de alguna limitación de Java, jajaja.

El formato es como sigue:

"jdbc:sqlserver://MOMBRE_SERVIDOR;instanceName=NOMBRE_INSTANCIA;user=USUARIO;password=PSW;databaseName=NOMBRE_BD";

Un ejemplo concreto sería:

"jdbc:sqlserver://miServidor;instanceName=SQLEXPRESS; user=sa;password=miPassword;databaseName=miDB";

Una vez que esto es correcto estaremos en condiciones de crear Conexiones en Java a través del java.sql.DriverManager: DriverManager.getConnection(connectionUrl);

A partir de este momento pueden generarse una serie de mensajes de error entre cuyas causas están las siguientes:

- No Suitable Driver.

Este es un error bastante común y que lo he visto bastante documentado salvo por el segundo punto que expondré.

Lo primero es verificar que incluimos la biblioteca del driver en el ClassPath del proyecto. En el caso de Eclipse basta con acceder a la propiedades del proyecto, opción “Java Build Path” en la lista de la izquierda, ficha Libraries, botón “Add External JARs…” y localizar el jar del driver correcto como explique anteriormente.

Pero esto me funciono en varias PC y de pronto en una no me funcionaba, error va y error viene y ni atrás ni adelante, hasta que verificando observe que estaba usando la versión 5 y necesite configurar el uso de la versión 6 del “JRE System Library (jre6)” .

En mi caso, usando Windows7, mas de un problema me vino por esta causa. Por ejemplo el programa iReport no se me abría, entre otros, por lo que le recomiendo descargar la ultima versión del JRE.

- El servicio SQLBrowser está detenido.

Hasta ahora jamás he tenido que iniciar este servicio (parte del SqlServer) para conectarme con SqlServer pero al parecer este Driver hace uso del mismo para detectar la instancia que solicitamos.

Esto lo podemos hacer desde varios lugares: el administrador de Servicios del PC, el “Sql Server Configuration Manager” localizado en el grupo de programas del menú Start de Windows con nombre “Microsoft Sql Server 2005/Configuration Tools”.

- El protocolo TPC/IP de Servidor para SQLEXPRESS está desabilitado.

Casi de seguro deberemos activar el uso de este protocolo pues por defecto no se activa con la instalación.

Desde el “Sql Server Configuration Manager” vaya al árbol de la izquierda a la opción
“SQL Server 2005 Network Configuration/Protocols for SQLEXPRESS” y en la derecha active el protocolo TCP/IP.

- No está activada la Autenticación mixta para Sql Server que nos permita autenticarnos con usuarios propios del mismo y no con los usuarios de Windows.

Desde el “Micorsoft SQL Server Management Studio” acceda al nombre de su Instancia en el árbol de la izquierda (una vez registrado y conectado claro), acceda a sus Propiedades (clic derecho encima y seleccione Properties), vaya a la ficha Security y active la opción “SQL Server and Windows Authentication mode” del grupo de opciones “Server authentication”.

- El usuario “sa”está desabilitado o posee una contraseña diferente a la que está utilizando.

Aunque no es correcto, en ambientes de producción solemos utilizar al mismísimo usuario “sa” (System Administrator) para trabajar pero por defecto la instalación deja la posibilidad de autenticarse a través de este usuario deshabilitada.

Para corregir este problema, desde el “Micorsoft SQL Server Management Studio” acceda al nombre de su Instancia en el árbol de la izquierda (una vez registrado y conectado claro), acceda a la opción Security/Login/sa, y una vez allí, a sus Propiedades (clic derecho encima y seleccione Properties). Vaya a la ficha Status y active la opción “Enabled” del grupo de opciones “Login”.

De paso vaya a la ficha General y verifique o modifique la contraseña para este usuario.

Bueno, son bastantes las causas de errores media mágicas a las que nos enfrentamos como pueden ver. Espero tengan suerte y no se enfrenten a ellas.

Thursday, May 6, 2010

Dos problemas con la autenticación en ASP.Net y la seguridad con roles (PROGRAMACION).

Primer problema: El ticket de autenticación pierde el valor  previamente guardado en su propiedad UserData y el formulario de Login se muestra una y otra vez.



He desarrollado varios sitios web utilizando la misma filosofía de autenticación y seguridad de ASP.Net. No obstante me han reportado varias veces que de pronto “Internet Explorer” se comporta de forma inesperada en el proceso de Autenticación y aclaro que casi nunca había sucedido con “Mozilla Firefox”: hasta hoy.

De pronto el formulario de autenticación parecía trabajar bien pero nunca me dejaba salir hacia otras páginas de la administración de mi sitio web. Una y otra vez se mostraba cuando las credenciales de acceso eran correctas. Depuraba el código fuente de la aplicación y todo parecía funcionar correctamente, salvo
que los Roles se perdían de pronto en una u otra esquina.

Para aclarar mejor aun el contexto, tengo una carpeta de nombre ADMIN que guarda todas las páginas de administración del sitio. Esa carpeta tenía las políticas de acceso siguientes:

<?xml version="1.0" encoding="utf-8"?>
<configuration> 
 <system.web>
  <authorization>
   <allow roles="admin" /> 
   <deny users="*" /> 
  </authorization> 
 </system.web> 
</configuration>
    
Pues bien una solución momentánea fue cambiar la política

<deny users="*" /> a <deny users="?"/>
    
Aunque luego más tarde no me solucionó aún el problema sino que me llevó al segundo.

Segundo problema: El tratamiento de roles


Cuando queremos habilitar opciones en dependencia del rol(es) del usuario utilizamos el siguiente método para saber si pertenece o no a “rol_name”

HttpContext.Current.User.IsInRole(“rol_name”)

Pues bien, algo tan sencillo y que llevo años usandolo de pronto no funcionaba tampoco. Despues de tanto y tanto depurar descubri que se debia a la simple sentencia de configuración siguiente que accidentalmente se me habia agregado al archivo de configuración de la raiz del sitio.

<?xml version="1.0"?> 
 <configuration> 
  <system.web> 
   <roleManager enabled="true" />

Bastó con eliminar esta linea de la configuración y todo volvió a la normalidad: tanto mi primer problema como el segundo.

Es necesario aclarar que las causas pudieran ser varias más, así que solo pretendo ofrecerles un par de posibles soluciones para cuando se les presentes estos “mágicos” e indeseables comportamientos en la autenticación con ASP.Net.

Enlace recomendado:
¿Será el contenido la mejor herramienta de posicionamiento web en buscadores? (seo)