martes, diciembre 28, 2010

Artificiales 200 Años

A pesar de todos los problemas acaecidos, fue emocionante...




Posted by Picasa

jueves, octubre 14, 2010

Los 33 mineros de Chile. Referente internacional

Lo de los mineros de Chile es un hecho que vale por sí sólo. No es necesario equipararlo con otras acciones que deberían haberse hecho para preguntarse si es válido o no. Menos aún pretender analizar el color político o ideológico del presidente en turno para determinar su valor (además si a alguien le duele este color actual, quizás este análisis incrementaría su valor, pero es otro tema). Solito tiene su valor y claramente positivo. Su valor NO está en las motivaciones previas que impulsaron a los actores a realizar el acto.

Lo cierto es que en México no ha sucedido nada parecido recientemente (véase Pasta de Conchos en México) y si hubiese pasado, todos hubiésemos pensado que probablemente sería una mentira “¿cómo que después de dos meses salen sanitos y a salvo?”…”seguro es un invento mediático del gobierno”, etcétera. He escuchado en la radio, a un comentarista conocido, decir cosas como que “salieron hasta afeitados” y que le deja “dudas”. Parece que algunas personas no creen en la dignidad humana o en la dignidad humana de los mineros. ¿Acaso tenían que haber salido todo “madreados” para que tuviera valor? ¿Sólo sería válido estar bajo tierra si todo el tiempo permaneces aislado del exterior y sin  alimentación y atención médica? Curiosa la mente humana de estos tiempo: “necesitada de morboso alimento”.

Mi parecer es que justamente esto habla bien de quienes estuvieron organizando y participando en el proceso, por el motivo que sea (aunque fuera el valor político del caso), de un grado elemental de conciencia sobre la vida humana digna, en buen estado de salud, donde se hizo lo posible por hacer las cosas bien y “correr” sólo en la medida que fuera seguro y que tuviera cierto grado de calidad.

Ciertamente el proceso habla de un proyecto (Project Management) con estructura y control, con medición de riesgo y con inversión de tiempo y recursos para asegurar la calidad y el éxito. Cada proyecto debe atender sus objetivos, y en este caso se trataba de salvar personas que se supo estaban vivas, no sin un buen esfuerzo e inversión inicial.

Si yo pensara que fue una mentira no tendría caso siquiera escribir esto.

Por suerte he escuchado a muchos amigos mexicanos emocionarse con el suceso y la manera en que se manejó y no es para menos, porque finalmente lo sucedido siembra un referente internacional, más habiendo sido realizado por un país latinoamericano. Estoy convencido que la mayoría de los mexicanos nos hubiéramos atrevido a dejarnos llevar por la “emoción solidaria, colectiva, de equipo” o algo parecido, como sucedió en el terremoto del 85 de la Ciudad de México, según cuentan mis amigos y muchos documentos.

Es curiosa la mente humana y lo que producen en ella, años y años de una cultura determinada, que ha sembrado profunda desconfianza, pero a pesar de eso no dudo que la mayoría de los mexicanos se admiraría y se uniría ante un hecho similar.

Los sucesos mediáticos positivos también siembran un antecedente y los más importante un referente. Quizás este es un caso de un valor positivo que podría otorgarle a la televisión, cosa que me cuesta otorgarle en general, por el poder de manipulación que tiene el medio para meternos cuanta basura se les ocurra en nuestras cabezas, como dice Jerry Mander (“En ausencia de lo sagrado", “Cuatro buenas razones para eliminar la televisión”), uniformado la cultura con los valores de la dominante, entre otras muchas.

El referente internacional ya despertó sus primeros ecos, hoy en México, una renovada protesta por lo de Pasta de Conchos. Ya veremos qué sucede la próxima vez que pase algo como esto en México.

Las discusión de que si se aprovecha el suceso para promover un gobierno o el consumo, me parece absurda, no importa qué presidente hubiese sido ni el color, se hubiese podido decir lo mismo. En realidad ningún asunto importante y mediático podría estar desasociado del interés y del ego humano, ya sea periodístico, personal, presidencial, partidista, ideológico, de cadena de televisión, económico, etc.

Todo el mundo quiere un pedazo del pastel mediático, desde Piñera hasta Obama, hasta yo que escribo esto simples pensamientos disconexos, espero desahogar algo seguramente relacionado con el ego. Si se trata de promover pensamientos fundamentalmente cristianos (en su sentido piadoso), con actos fundamentalmente cristianos, ¡bien venidos sean!

Qué bueno, ¡que todos tomen del pastel hasta ahogarse! ya, que de paso, se están comprometiendo y nos estamos comprometiendo, a hacer las cosas mejor y con más conciencia de que debemos hacer cierto, que la vida humana no tenga precio, porque hoy por hoy, la vida humana tiene un precio despreciable.

Etiquetas de Technorati: ,,,

martes, julio 27, 2010

Revisión del Auricular (Headphones) RadioShack PRO35A

Radio Shack PRO35A HeadphonesSoy fanático del sonido y este auricular, de tipo abierto, es extremadamente bueno. Lo adoro.

La verdad me tardé en reconocerlo como se lo merece. Lo tengo desde hace al menos unos 5 años.

Tiene una respuesta frecuencias muy amplia (realmente lo logra). Bajos profundos sin distorsión armónica combinados con agudos cristalinos, claros y sin distorsión. Ni se diga de la hermosa gama dinámica, clara y precisa.

Lo cierto es que hace palidecer cualquier sistema de bocinas (inclusive las de alta calidad).

El otro día estaba viendo una película en DVD desde la misma computadora con dos auriculares (el Pro35A y otro). Simplemente no hay comparación, el Pro35A se lleva de calle a cualquier auricular que no sea mucho más caro e inclusive a algunos más caros también.

Me recuerda a un viejo modelo que tuve de Technics de los años 80 que no tenía igual.

Pros

Respuesta a frecuencias: 10 (fácil le creo al 20 @ 20,000 Hz)

Gama dinámica y claridad del sonido: 10

Relación Costo/Beneficio = Muy Baja (EXCELENTE).

 

Contras

Esponjas duran poco y hay que cambiarlas (pero se encuentran repuestos en el propio RadioShack o de línea).

Cables muy delgados, hay que cuidarlos para que no se desconecten después de un rato de manoseo. Es de fácil apertura y mantenimiento. He desarmado la carcasa de manera sencilla con una simple presión y he vuelto a soldar el cable a las bocinas (ojo cuidar la polaridad).

Conclusión

Absolutamente recomendado.

lunes, mayo 24, 2010

Operador LIKE y COLLATION. Comparación de cadenas Unicode y no Unicode

El problema

Un amigo me preguntó la causa de que sus procedimientos almacenados no funcionaran bien con las comparaciones de cadenas a partir de instalar su base de datos con cierta intercalación (collation) de SQL Server 2008.

Su base de datos tiene varios años de evolución y maduración y se ha migrado desde SQL Server 2000. Originalmente la base de datos se había creado con una intercalación de SQL Server (la famosa SQL_Latin1_General_CP1_CI_AS). Cuando se migró a SQL Server 2008 se decidió actualizar la intercalación a una moderna de Windows llamada Latin1_General_100_CI_AI (Unicode no sensible ni a mayúsculas ni a los acentos).

A partir de entonces las comparaciones simples de variables de cadena en los procedimientos almacenados no funcionaban y esta consulta literal tan simple de comparación mediante LIKE, devolvía un resultado contrario al esperado, es decir devuelve “No” en vez de “Yes”:

IF '/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' LIKE'%/DEVELOPMENT'
SELECT 'Yes' as
IsLikeLiteral
ELSE
SELECT
'No' as
IsLikeLiteral

Lógicamente aquí era de esperar que la cadena “[lo que sea antes]/DEVELOPMENT” sí se encuentre en la primera cadena literal.

El primer problema es que estos literales son interpretados por el motor como cadenas con una intercalación no Unicode entonces si el servidor está configurado (instalado) con una intercalación Unicode como Latin1_General_100_CI_AI, los caracteres no serán interpretados de la manera que esperamos al realizar la comparación y la ordenación.

Lo más simple para ver esto es colocar el indicador de literales Unicode (N) al frente de las cadenas e inmediatamente se obtendrá el resultado correcto esperado, es decir “Yes” (ver y o ejecutar los ejemplos de más abajo en una ventana de su SQL Server Management Studio 2008, si es otra versión previa comente la intercalación de tipo “_100_”, ya que s nueva en SQL Server 2008).

El echo de que los procedimientos almacenados o funciones no realicen bien las comparaciones se debe a que todos los valores de las variables de cadena de la base de datos fueron originalmente definidas como “varchar” y almacenados con la intercalación antigua de SQL_Latin1_General_CP1_CI_AS (estas intercalaciones de SQL se mantienen por compatibilidad con el pasado y se recomienda utilizar las de Windows o bien actualizarlas).

La solución

Lo más adecuado es tomar su base de datos y hacer lo siguiente:

  • Transformar su base de datos (los datos almacenados) a la intercalación del servidor mediante este script maravilloso de Igor F. Kovalenko.
  • Actualice todas sus tablas para que utilicen tipos de datos Unicode en las cadenas (nchar, nvarchar, ntext).
  • Actualice todos sus procedimientos almacenados y funciones y cambie las declaraciones de variables de tipo “varchar” a “nvarchar” (vea el último ejemplo de la serie de consultas más abajo para que vea por qué).
    • Si tuvo la necesidad en el pasado de declarar algo como “varchar(8000)” y espera cadenas de ese largo ya no puede utilizar nvarchar con ese tamaño porque nvarchar está limitado a 4000 caracteres cuando quiere especificar la longitud. Entonces, si requiere más de 4000 caracteres, declare las variables como “nvarchar(max)” que soporta hasta 2 GB.

Fíjese que si los valores no están almacenados en la intercalación correcta aunque utilice COLLECT no obtendrá el resultado adecuado, por eso debe realizar la transformación de datos.

Para sus nuevos desarrollo, no lo dude, utilice una intercalación de Windows Unicode como la indicada aquí, que acepta un amplia variedad de idiomas humanos.

Demostrador

-------------------------------------------------
-- Comparación literal
-------------------------------------------------
IF '/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' LIKE
'%/DEVELOPMENT'
SELECT 'Yes' as
IsLikeLiteral
ELSE
SELECT
'No' as
IsLikeLiteral

-------------------------------------------------
-- Comparación literal explícita Unicode
-------------------------------------------------
IF N'/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' LIKE
N'%/DEVELOPMENT'
SELECT 'Yes' as
IsLikeUnicode
ELSE
SELECT
'No' as
IsLikeUnicode

-------------------------------------------------
-- Conversión a una intercalación determinada
-------------------------------------------------
IF '/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' COLLATE Latin1_General_CI_AI LIKE '%/DEVELOPMENT' COLLATE
Latin1_General_CI_AI
SELECT 'Yes' as
IsLikeCollation
ELSE
SELECT
'No' as
IsLikeCollation

-------------------------------------------------
-- Conversión a una intercalación determinada (100)
-------------------------------------------------
IF '/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' COLLATE Latin1_General_100_CI_AI LIKE '%/DEVELOPMENT' COLLATE
Latin1_General_100_CI_AI
SELECT 'Yes' as
IsLikeCollation100A
ELSE
SELECT
'No' as
IsLikeCollation100A

-------------------------------------------------
-- Conversión a una intercalación determinada (100)
-------------------------------------------------
IF N'/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' COLLATE Latin1_General_100_CI_AI LIKE N'%/DEVELOPMENT' COLLATE
Latin1_General_100_CI_AI
SELECT 'Yes' as
IsLikeCollation100B
ELSE
SELECT
'No' as
IsLikeCollation100B

-------------------------------------------------
-- Comparación con varchar (cadena no unicode)
-------------------------------------------------
DECLARE @varCharInput1 varchar(500
)
DECLARE @varCharInput2 varchar(500
)
SET @varCharInput1 =
'/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT'
SET @varCharInput2 =
'%/DEVELOPMENT'

IF @varCharInput1 LIKE
@varCharInput2
SELECT 'Yes' as
IsLikeVarchar
ELSE
SELECT
'No' as
IsLikeVarchar

-------------------------------------------------
-- Finalmente este es el punto.
-- Comparación con nvarchar (cadena unicode)
-------------------------------------------------
DECLARE @nVarCharInput1 nvarchar(500
)
DECLARE @nVarCharInput2 nvarchar(500
)
SET @nVarCharInput1 =
N'/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT'
SET @nVarCharInput2 =
N'%/DEVELOPMENT'

IF @nVarCharInput1 LIKE
@nVarCharInput2
SELECT 'Yes' as
IsLikeNVarchar
ELSE
SELECT
'No' as IsLikeNVarchar

Los resultados

image

---(FIN)---