Monday, June 21, 2010

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)

Monday, February 15, 2010

San Valentín informático (día del amor)

Todos decimos que el 14 de Febrero es el día del amor y siempre hacemos la salvedad que no es solo del amor hacia la pareja. Hasta ahí todo bien, pero a alguien se la ha ocurrido pensar en el amor hacia nuestra inseparable amiga en la vida: nuestra computadora?

Creo que muchas veces hablamos de ello pero casi nunca en este día específicamente. Entonces pues, si aun no lo ha hecho piense en un buen regalito para el amor de su vida, al fin y al cabo la mayoría de los informáticos dicen: "te puedo prestar mi mujer pero no mi computadora!".

Pudiera comprarle, por ejemplo, una memoria RAM de 1 o 2 GB, un disco duro más moderno o de más capacidad, una actualización al antivirus para expurgarla de tantos bichos malignos o simplemente una buena limpieza externa que muchas la necesitan.

Si usted quiere ir más allá y llevarla a algún buen lugar: un restaurante, un cine, un concierto o al parque es su problema. No creo que su esposa este de acuerdo con tal competidora.

Pero bueno, es usted libre de expresarle su amor de la forma que desee, yo solo me limito a recordárselo para evitarle un disgusto y quizás un traumático divorcio.

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

Monday, November 23, 2009

¿Será el contenido la mejor herramienta de posicionamiento web en buscadores?

Muchas veces había escuchado la frase: “La mejor herramienta SEO es un buen contenido” y casi siempre había mantenido mi incredulidad ante tal “simpleza”.

Hoy, con la experiencia acumulada, puedo asegurarles que tal simpleza es real.

Está claro que cuando hablamos de un “buen contenido” estamos haciendo referencia a que sea útil a nuestros usuarios. Si somos capaces de crear contenido útil constantemente, nuestra web crecerá, ganará en visitas e importancia y por tanto tendrá la tendencia a estar bien ubicada en el posicionamiento web en los buscadores.

Si a eso le sumamos que su código o contenido está bien optimizado con técnicas SEO pues resulta mucho mejor.

He conocido webs que de tan solo publicar una versión beta (o de pruebas) y sin siquiera darles de alta en los Buscadores, estos la han encontrado y las han posicionado bastante bien en tan solo 15 o 21 días. Cuando digo “bastante bien” estoy haciendo referencia a un top 20-30 de google. Merito a Google también por sus robots tan buenos.

Si somos capaces de crear buen contenido, a la vez de optimizado, no tendremos demasiada necesidad de utilizar técnicas de “Creación de Enlaces”. Ahora lo que queda claro que estas ayudaran a afianzar nuestras posiciones y ayudaran a la promoción del sitio web. También resulta que no siempre el tema del sitio web es tan amplio como para tener un fácil crecimiento en contenido por lo que tendremos que apoyarnos en técnicas colaterales.

Pero también quiero llamar la atención a aquellos editores de contenido quienes se centran demasiado en aplicar una mayor densidad de palabras claves a los artículos de sus páginas webs descuidando la naturalidad y originalidad del lenguaje original que fue empleado por los autores al crearlo: sobre todo si ya está usted bien posicionado. Recuerde que los extremos casi nunca son buenos.

Artículo recomendado: http://deisbel.blogspot.com/2009/11/ahorrando-lineas-de-codigo-en-los.html

Ahorrando líneas de código en los operadores lógicos (PROGRAMACION)

Un ejemplo clásico de cómo incluimos muchas líneas de código de más es cuando hacemos uso de los operadores lógicos. Muchas veces nos olvidamos de los operadores lógicos ternarios y de que una expresión de comparación nos puede ahorrar una sentencia condicional IF completa.

Les detallo a continuación el ejemplo, que ubicaremos en un contexto.

Supongamos el ejemplo más sencillo: cuando tenemos una lista de opciones y en dependencia de la elegida queremos realizar varias acciones pero por lo general la más común es visualizar/ocultar determinada información.

Pudiéramos reflejar esto con el siguiente control agregado a un formulario web en asp.net.

<asp:DropDownList ID="sampleDropDownList" runat="server" AutoPostBack="true" OnSelectedIndexChanged="sampleDropDownList_OnSelectedIndexChanged">
    <asp:ListItem Text="Option 1" Value="0" Selected="True" />
    <asp:ListItem Text="Option 2" Value="1" />
</asp:DropDownList>
<br />
<br />
<asp:Label ID="option1Label" runat="server" Text="Option 1 Visible" Visible="true" />
<asp:Label ID="option2Label" runat="server" Text="Option 2 Visible" Visible="false" />

Como se puede observar tenemos dos simple opciones y un evento que manipularemos cuando el usuario las seleccione.

Y es aquí donde vemos líneas de código excesivas para algo tan simple.

protected void sampleDropDownList_OnSelectedIndexChanged(object sender, EventArgs e)
{
    if (sampleDropDownList.SelectedValue == "0")
    {
 option1Label.Visible = true;
 option2Label.Visible = false;
    }
    else
    {
 option1Label.Visible = false;
 option2Label.Visible = true;
    }
}

o también

protected void sampleDropDownList_OnSelectedIndexChanged(object sender, EventArgs e)
{
    switch(sampleDropDownList.SelectedValue)
    {
 case "0":
     option1Label.Visible = true;
     option2Label.Visible = false;
     break;
 case "1":
     option1Label.Visible = false;
     option2Label.Visible = true;
     break;
    }
}

Estas dos variantes, una mejor que la otra, adolecen del mismo problema: demasiadas líneas de código, al menos para mi gusto.

Podemos sustituirlo con estas sentencias, mucho más simples:

protected void sampleDropDownList_OnSelectedIndexChanged(object sender, EventArgs e)
{
    option1Label.Visible = sampleDropDownList.SelectedValue == "0";
    option2Label.Visible = sampleDropDownList.SelectedValue != "0";
}

Solo un par de líneas de código! Habrá quien quiera filosofar sobre si es más eficiente una sola comparación que varias, pero no entrare es este tema. Lo que sí es muy claro que la acción de visibilidad para cada "Label" queda en solamente una línea de código, no en varias. Este código es mucho más fácil de mantener y evita que por descuido actualicemos la visibilidad en una sola parte del IF: en la verdadera o la falsa.

Este es un caso que enfrentamos a diario y a veces el subconsciente y la prisa nos traicionan por nuestra forma natural de pensar de forma condicional.

Índice de la sección PROGRAMACION: http://deisbel.blogspot.com/2009/11/programacion-nueva-seccion.html

Artículo recomendado: ¿De dónde saca el dinero Google?

Friday, November 6, 2009

Programación (Nueva sección)

Con esta entrada quiero comenzar una sección para el blog donde publicaré cuestiones sobre programación, en específico sobre código fuente. A menudo recibo código de otros colegas, conocidos y no conocidos, que dan ganas de llorar al verlos, otros no tan graves pero igual mejorables.

Entonces, me gustaría ir dejando constancia de lo que pudiéramos llamar BUENAS PRACTICAS DE PROGRAMACION y otras veces tan solo mencionar algunas mejorables.

Los artículos estarán clasificados bajo la categoría POGRAMACION.

Espero les sea útil a quienes se vean reflejados en estos temas.

Artículos de la serie:

Ahorrando líneas de código en los operadores lógicos.

Thursday, November 5, 2009

¿De dónde saca el dinero Google?

Por lo interesante que me ha resultado este artículo quiero reproducirlo íntegramente. Muchas personas, en mi radio de acción, se me han acercado haciendo esta misma pregunta y no solo en referencia a Google sino a otras compañías que ofrecen servicios gratuitos.

Es un fenómeno difícil de comprender para quienes vivimos en un mundo menos agresivo y menos consumista. Este artículo es la respuesta a quienes siempre han escuchado la frase "la información es poder" y no logran comprender su esencia. De ahora en lo adelante piensen en una respuesta sencilla para comprender cuando poderosa resulta la información: Google.

Aquí les va el artículo, después de esta breve introducción, extraído del portal Terra.

---

Reportaje: La economía del nuevo monopolio
¿De dónde saca el dinero Google?

Si pensamos en los productos de Google, lo primero que nos viene a la cabeza es su gratuidad. Google parece ser el mecenas de Internet, espléndido y bondadoso, pero también es un monopolio económico. ¿Cómo lo hace?

Google (el buscador), Google Earth, Google Maps, Google Wave, Google lo que sea... la mayoría de los productos de la empresa estadounidense son gratuitos. Y es que gracias a ello, Google se ha convertido prácticamente en un sinónimo de Internet, apareciendo el término "Google" como sinónimo de "buscar" en los diccionarios.

Sin embargo, detrás del lema inicial de la compañía, "Don't be evil" (no seas malvado), hay una empresa cuyo objetivo principal es hacer dinero, ya que de lo contrario los accionistas no estarían demasiado satisfechos.

Veamos de dónde saca dinero el principal monopolio de los servicios a través de Internet y cómo se ha posicionado hasta convertirse en el pez más grande, sin hacer demasiado ruido, y delante de las narices de sus principales rivales, como Microsoft.

El poder de la información

¿Dónde reside el potencial de generación de recursos de Google? Analicemos rápidamente su producto estrella, el buscador. En sí, se trata de una serie de ordenadores que almacenan información obtenida automáticamente de todas páginas existentes en Internet. Información que es gratuita.

A continuación, esta información es clasificada e indizada para que el usuario del buscador encuentre aquello que busca. Y aquí está la clave: aquello que busca. El valor real de Google es el de los usuarios que, gracias a sus búsquedas, le permiten saber qué es popular y qué no, qué webs son relevantes cuando buscamos un término concreto, y, si nos damos de alta (gratuitamente, eso sí) como usuarios de Google, qué tipo de usuario realiza qué tipo de búsquedas.

Esa información es la que después Google puede rentabilizar a través de su programa de publicidad (Adsense y Adwords), ya que sabe qué términos son los más buscados, y por lo tanto, tienen un precio más alto para el anunciante.

También puede facilitar información detallada al anunciante sobre usos y costumbres de los usuarios para que la campaña de publicidad pueda estar mucho mejor dirigida al público objetivo de la empresa en cuestión.

Por último, Google también dispone de esta ingente cantidad de información para hacer sus propios estudios de mercado y conocer antes que nadie hacia dónde se dirigen los hábitos de consumo de un usuario tipo o la distribución geográfica de una moda determinada.

Gratuidad para ganar mercado

Pero lo que hace especial a Google es lo que hace una vez domina el mercado de los buscadores y obtiene un rendimiento a través de la publicidad. Y es que a la hora de expandirse, lo hace utilizando el medio que mejor conoce, Internet, a través de aplicaciones de gran utilidad para el usuario, y lo que es más importante: son gratuitas.

Pudiendo permitirse el lujo de poder invertir las ganancias en copar cada vez más mercado, Google va convirtiéndose en un aliado imprescindible para nuestro día a día. Google Maps y Street View (¿cómo podíamos vivir sin eso?), Google Earth, Google Docs, Google Wave... la filosofía es clara: no te preocupes, Google te da todo lo que puedes necesitar en Internet, y gratis.

Pero Google no se queda ahí, y a la proliferación de servicios gratuitos a través de Internet va sumando nuevas adquisiciones e inversiones multimillonarias. Cada vez posee más servidores, más ancho de banda propio, e incluso puede invertir en satélites para obtener sus propias imágenes desde órbita.

Eso supone que los gastos de mantenimiento de los servicios básicos de la compañía ya no son externos, sino que Google no necesita a nadie para funcionar. Tiene los ordenadores, tiene el ancho de banda, y tiene todo lo que puede desear. Las piezas están en su lugar para el ataque final.

El golpe de gracia

Y es que todo lo anterior lo ha estado haciendo delante de las narices de sus principales competidores quienes, estupefactos, no sabían cómo reaccionar a este nuevo modelo de negocio basado en hacerlo todo gratuito. Google se convertía en uno de ellos, pero además con la gente contenta y no tomándolos como un demonio monopolista.

Con las piezas en su lugar, Google está comenzando a mostrar de lo que es capaz, lanzando ataques contra sectores como el de los navegadores de Internet, con Chrome, los navegadores vía satélite (tiembla Tom Tom y Garmin), los teléfonos móviles... su posición dominante le permite escoger dónde y cuándo atacar, y su imagen de gigante benévolo le permite hacerlo sin que los usuarios lo tomen como una amenaza.

Veremos si el lema original de la compañía, "Don't be evil", se sigue cumpliendo en el futuro.

---

Url original http://www.terra.es/tecnologia/articulo/html/tec22641.htm