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

sábado, octubre 31, 2009

México ante la Crisis. México es un país privilegiado.

,,

Este discurso de Denisse Dresser, a mi parecer, merece ser reproducido y publicado, en un intento más para que remueva la conciencia (como electro shock) y ojalá despierte la urgencia de cambios profundos en México (si no también de otros países con situaciones similares).

Se copia aquí el contenido por si se perdiera la liga original a futuro. Es interesante ver algunos comentarios y reacciones en el sitio de origen.

---(Inicio)----------------------------------------------------------

El Universal
Ciudad de México Viernes 30 de enero de 2009
Discurso de Denisse Dresser en el Foro "México ante la Crisis", frente a diputados, senadores, empresarios y funcionarios

29 de enero de 2009

México es un país privilegiado.

Tiene una ubicación geográfica extraordinaria y cuenta con grandes riquezas naturales. Está poblado por millones de personas talentosas y trabajadoras.

Pero a pesar de ello, la pregunta perenne sigue siendo: ¿por qué no crece a la velocidad que podría y debería? ¿Por qué seguimos discutiendo este tema año tras año, foro tras foro?

Aventuro algunas respuestas, y les pediría que me acompañaran en un ejercicio intelectual, recordando aquel famoso libro de Madame Calderón de la Barca llamado "La vida en México", escrito en el siglo XVII, en el cual intenta describir las principales características del país.

Si Madame Calderón de la Barca escribiera su famoso libro hoy, tendría que cambiarle el título a "Oligopolilandia". Porque desde el primer momento en el que pisara el país, se enfrentaría a los síntomas de una economía política disfuncional, con problemas que la crisis tan solo agrava.

Aterrizaría en uno de los aeropuertos más caros del mundo; se vería asediada por maleteros que controlan el servicio; tomaría un taxi de una compañía que se ha autodecretado un aumento de 30 por ciento en las tarifas, y si tuviera que cargar gasolina, lo haría sólo en Pemex.

En el hotel habría 75 por ciento de probabilidades de que consumiera una tortilla vendida por un solo distribuidor, y si se enfermara del estómago y necesitara ir a una farmacia, descubriría que las medicinas allí cuestan más que en otros lugares que ha visitado.

Si le hablara de larga distancia a su esposo para quejarse de esta situación, pagaría una de las tarifas más elevadas de la OCDE. Y si prendiera la televisión para distraerse ante el mal rato, descubriría que sólo existen dos cadenas.

Para entender la situación en la que se encuentra, tendría que recordar lo que dijo Guillermo Ortiz hace unos días: no hemos creado las condiciones para que los recursos se usen de manera eficiente; o tendría que leer el libro "Good Capitalism/Bad Capitalism", que explica por qué algunos países prosperan y otros se estancan; por qué algunos países promueven la equidad y otros no logran asegurarla.

La respuesta se encuentra en la mezcla correcta de Estado y mercado, de regulación e innovación. La clave del éxito -o el fracaso- se halla en el modelo económico: en la decisión de promover el capitalismo de Estado o el capitalismo oligárquico o el capitalismo de las grandes empresas o el capitalismo democrático.

Hoy México es un ejemplo clásico de lo que el Nobel de Economía Joseph Stiglitz denomina crony capitalism: el capitalismo de cuates, el capitalismo de cómplices, el capitalismo que no se basa en la competencia sino en su obstaculización.

Ese andamiaje de privilegios y "posiciones dominantes" y nudos sindicales en sectores cruciales -telecomunicaciones, servicios financieros, transporte, energía- que aprisiona a la economía y la vuelve ineficiente. Una mezcla de capitalismo de Estado y capitalismo oligárquico.

Hoy, México -inmerso en la crisis- está aún lejos de acceder al capitalismo dinámico donde el Estado no protege privilegios, defiende cotos, elige ganadores y permite la perpetuación de un pequeño grupo de oligarcas con el poder para vetar reformas que los perjudican.

Al capitalismo en el cual las autoridades crean condiciones para los mercados abiertos, competitivos, innovadores, que proveen mejores productos a precios más baratos para los consumidores. Para los ciudadanos.

Hoy, México carga con los resultados de esfuerzos fallidos por modernizar su economía durante los últimos 20 años.

Las reformas de los 80 y 90 entrañaron la privatización, la liberalización comercial.

Pero esas reformas no produjeron una economía de mercado dinámica debido a la ausencia de una regulación gubernamental eficaz, capaz de crear mercados funcionales, competitivos.

En vez de transparencia y reglas claras, prevaleció la discrecionalidad entre los empresarios que se beneficiaron de las privatizaciones y los funcionarios del gobierno encargados de regularlos.

Las declaraciones de Agustín Carstens el martes pasado, en torno a la necesidad de combatir los monopolios en telefonía, son bienvenidas. Lamentablemente, se dan 18 años tarde. Y allí están los resultados de reformas quizás bien intencionadas, pero mal instrumentadas: una economía que no crece lo suficiente, una élite empresarial que no compite lo suficiente, un modelo económico que concentra la riqueza y distribuye mal la que hay.

Hoy, México está atrapado por una red intrincada de privilegios

y vetos empresariales y posiciones dominantes en el mercado que inhiben un terreno nivelado de juego.

Una red descrita en el famoso artículo de la economista Anne Kruege: "The Political Economy of the Rent-Seeking Society" ("La Economía Política de la Sociedad Rentista").

Una red que opera a base de favores, concesiones y protección regulatoria que el gobierno ofrece y miembros de la cúpula empresarial exigen como condición para invertir.

¿Quién? Alguien como el dueño de una distribuidora de maíz o el concesionario de una carrera privada o el comprador de un banco rescatado con el Fobaproa o el principal accionista de Telmex o el operador de una Afore.

Estos actores capturan rentas a través de la explotación o manipulación del entorno económico en lugar de generar ganancias legítimas a través de la innovación o la creación de riqueza.

Y los consumidores de México contribuyen a la fortuna de los rentistas cada vez que pagan la cuenta telefónica. La conexión a Internet. La cuota en la carretera. La tortilla con un precio fijo. La comisión de las Afores. La comisión por la tarjeta de crédito. Ejemplo tras ejemplo de rentas extraídas a través de la manipulación de mercado.

Y el rentismo acentúa la desigualdad, produce costos sociales, dilata el desarrollo, disminuye la productividad, aumenta los costos de transacción en una economía que -ante el imperativo de la competitividad- necesita disminuirlos.

Para extraer rentas, los "jugadores dominantes" han erigido altas barreras de entrada a nuevos jugadores, creando así cuellos de botella que inhiben la innovación y, por ende, el aumento de la productividad.

Estos cuellos de botella inhiben el crecimiento de México en un mundo cada vez más globalizado y competitivo, y son una razón clave detrás de la persistente desigualdad social, como lo sugiere el reporte del Banco Mundial sobre México titulado: "Más allá de la polarización social y la captura del Estado".

La concentración de la riqueza y del poder económico entre esos "jugadores dominantes" con frecuencia se traduce en ventajas injustas, captura regulatoria y políticas públicas que favorecen intereses particulares.

Peor aún, convierte a representantes del interés público -muchos de los diputados y senadores sentados aquí- en empleados de los intereses atrincherados. Convierte al gobierno en empleado de las personas más poderosas del país.

Y lleva a las siguientes preguntas: ¿Quién gobierna en México? ¿El Senado o Ricardo Salinas Pliego cuando logra controlar los vericuetos del proceso legislativo? ¿La Secretaría de Comunicaciones y Transportes o Unefon? ¿La Comisión Nacional Bancaria o los bancos que se rehúsan a cumplir con las obligaciones de transparencia que la ley les exige? ¿ La Secretaría de Educación Pública o Elba Esther Gordillo? ¿La Comisión Federal de Competencia o Carlos Slim? ¿Pemex o Carlos Romero Deschamps? ¿Ustedes o una serie de intereses que no logran contener?

Porque ante los vacíos de autoridad, la captura regulatoria y las decisiones de política pública que favorecen a una minoría, la respuesta parece obvia.

México hoy padece lo que algunos llaman "Estados dentro del Estado", o lo que otros denominan "una economía sin un gobierno capaz de regularla de manera eficaz". Eso -y no la caída de la producción petrolera- es lo que condena a México al subdesempeño crónico.

Una y otra vez, el debate sobre cómo promover el crecimiento, cómo fomentar la inversión y cómo generar el empleo se encuentra fuera de foco.

El gobierno cree que para lograr estos objetivos, basta con tenderle la mano al sector privado para que invierta bajo cualquier condición. Y el sector privado, por su parte, piensa que la panacea es que se le permita participar en el sector petrolero, por dar un ejemplo.

Pero ésa es sólo una solución parcial a un problema más profundo. El meollo detrás de la mediocridad de México se encuentra en su estructura económica y en las reglas del juego que la apuntalan.

Una estructura demasiado top heavy o pesada en la punta de la pirámide; una estructura oligopolizada donde unos cuantos se dedican a la extracción de rentas; una estructura de complicidades y colusiones que el gobierno permite y de la cual también se beneficia.

Claro, muchos de los miembros del gobierno de Felipe Calderón, y muchos de los presentes en este foro, hablarán de crecimiento como una prioridad central.

Pero más bien lo perciben como una variable residual. Más bien parecería que buscan -y duele como ciudadana reconocerlo- asegurar un grado mínimo de avance para mantener la paz social, pero sin alterar la correlación de fuerzas existente. Sin cambiar la estructura económica de una manera fundamental.  

Y el problema surge cuando ese modelo comienza a generar monstruos; cuando ese apoyo gubernamental a ciertas produce monopolios, duopolios y oligopolios que ya no pueden ser controlados; cuando las "criaturas del Estado" -como las llama Moisés Naim- amenazan con devorarlo.

Sólo así se entiende la devolución gubernamental de 550 millones de dólares a Ricardo Salinas Pliego, por intereses supuestamente mal cobrados, un día antes del fin del sexenio de Vicente Fox.

Sólo así se entiende el comunicado lamentable de la Secretaría de Comunicaciones y Transportes hace un año celebrando la alianza entre Telemundo y Televisa, cuando en realidad revela una claudicación gubernamental ante la posibilidad de una tercera cadena.

Sólo así se comprende que nadie levante un dedo para sancionar a TV Azteca cuando viola la ley al rehusarse a transmitir los spots del IFE o se apropia del Cerro del Chiquihuite.

Sólo así se entiende la aprobación de la llamada "Ley Televisa" por la Cámara de Diputados y la de Senadores en 2006.

Sólo así se entiende la posposición ad infinitum en el Senado de una nueva ley de medios para promover la competencia en el sector.

Sólo así se comprende que la reforma de Pemex deje sin tocar el asunto del sindicato.

Sólo así se entiende la posibilidad de dar entrada a Carlos Slim a la televisión sin obligarlo a cumplir con las condiciones de su concesión original.

Síntomas de un gobierno ineficaz. Señales de un gobierno doblegado. Muestras de un gobierno coludido.

Con efectos cada vez más onerosos y cada vez más obvios que la crisis pone en evidencia, porque no logramos reformarnos a tiempo.

Mucha riqueza, pocos beneficiarios. Crecimiento estancado, país aletargado. Intereses atrincherados, reformas diluidas. Poca competencia, baja competitividad. Poder concentrado, democracia puesta en jaque. Un gobierno que en lugar de domesticar a las criaturas que ha concebido, ahora vive aterrorizado por ellas.

¿Cuáles son las consecuencias del mal capitalismo mexicano? Donde las élites tradicionales son fuertes, la gobernabilidad democrática es poco eficaz, los partidos políticos tienden a ser minimalistas.

En México, el incrementalismo de la política pública puede ser atribuido a élites tradicionales que usan su poder para bloquear reformas que afectan sus intereses, o asegurar iniciativas que protejan su situación privilegiada.

Si ustedes verdaderamente quieren que México crezca, tendrán que crear la capacidad de regular y reformar en nombre del interés público.

Tendrán que mandar señales inequívocas de cómo van a desactivar esos "centros de veto" que están bloqueando el crecimiento económico y la consolidación democrática: Los monopolistas abusivos, los sindicatos rapaces, las televisoras chantajistas, los empresarios privilegiados y sus aliados en el gobierno.

Si ustedes verdaderamente quieren que México prospere, tendrán que tomar decisiones que desaten el dinamismo económico, que fortalezcan la capacidad regulatoria del Estado y contribuyan a construir mercados, que promuevan la competencia y, gracias a ello, aumenten la competitividad.

En pocas palabras, usar la capacidad del Estado para contener a aquellos con más poder en el gobierno, con más peso que el electorado, con más intereses que el interés público.

¿Qué hacer? Los conmino a leer textos tan influyentes como "The Growth Report" y "The Power of Productivity".

A estar conscientes de lo que todo país interesado en crecer y competir debe hacer para lograrlo.

A saber que ello requiere una economía capaz de producir bienes y servicio de tal manera que los trabajadores puedan ganar más y más.

A entender que ello se basa en la expansión rápida del conocimiento y la innovación; en nuevas formas de hacer las cosas y mejorarlas; en técnicas que aumentan la productividad de manera constante.

A reconocer que las economías dinámicas suelen ser aquellas capaces de promover la competencia y reducir las barreras de entrada a nuevos jugadores en el mercado.

A entender que esa tarea del gobierno -a través de lar regulación adecuada- crear un entorno en el cual las empresas se vean presionadas por sus competidores para innovar y reducir precios, y pasar esos beneficios a los consumidores.

A comprender que si eso no ocurre, nadie tiene incentivos para innovar. En lugar de ser motores de crecimiento, las empresas protegidas y/o monopólicas terminan estrangulándolo.

En pocas palabras, la competitividad -factor indispensable para atraer la inversión y con ella remontar la crisis, como sugería Sanguinetti- Está vinculada a la competencia.

El crecimiento económico está ligado a la competencia. La innovación y, por ende, el dinamismo y la creación de empleos se desprenden de la competencia.

La inversión que se canaliza hacia nuevos mercados y nuevas oportunidades es producto de la competencia. No es una condición suficiente pero sí es una condición necesaria. No bastará por sí misma para desatar el crecimiento, pero sin ella jamás ocurrirá, por más dinero público que se inyecte a la economía mediante políticas contra cíclicas.

Y, ¿cómo empezar a empujar eso? Con una tercera cadena de televisión; con el fomento de la competencia en banda ancha a través de la red de la Comisión Federal de Electricidad; con el fortalecimiento de los órganos regulatorios, con la sanción a quienes violen los términos de su concesión; con la reacción de mercados funcionales, como ya se logró con las aerolíneas de bajo costo; con medidas que se empiecen a desmantelar cuellos de botella y a domesticar a esas "criaturas del Estado".

Tiene que ver con la inauguración de un nuevo tipo de relación entre el Estado, el mercado y la sociedad.

Porque si la clase política de este país no logra construir los cimientos del capitalismo democrático, condenará a México al subdesempeño crónico. Lo condenará a seguir siendo un terreno fértil para los movimientos populares contra las instituciones; un país que cojea permanentemente debido a las instituciones políticas que no logra remodelar; los monopolios públicos y privados que no logra desmantelar; las estructuras corporativas que no logra democratizar.

Será lo que Felipe Calderón llama "un país de ganadores" donde siempre ganan los mismos.

Un lugar donde muchas de las grandes fortunas empresariales se construyen a partir de la protección política, y no de la innovación empresarial.

Un lugar donde el crecimiento de los últimos años ha sido menor que en el resto de América Latina debido a los cuellos de botella que los oligopolios han diseñado, y que sus amigos en el gobierno les ayudan a defender.

Un lugar donde las penurias que Madame Calderón de la Barca enfrentó con los aeropuertos, los maleteros, los taxis, las gasolineras, la telefonía y la televisión son las mismas que padecen millones de mexicanos más.

Ese consumidor sin voz, sin alternativa, sin protección. Ese hombre invisible. Esa mujer sin rostro.

Esa persona que paga -mes tras mes- tarifas telefónicas más altas que en casi cualquier parte del mundo.

Esa compañía que paga -mes con mes- servicios de telecomunicaciones que elevan sus gastos de operación y reducen sus ganancias.

Miles de personas con comisiones por servicios financieros que no logran entender, con cobros inusitados que nadie puede explicar, parados en la cola de los bancos. Allí varados. Allí desprotegidos. Allí sin opciones. Allí afuera.

Víctimas de un sistema económico disfuncional, institucionalizado por una clase política que aplaude la aprobación de reformas que no atacan el corazón del problema.

Presidentes, secretarios de Estado, diputados, senadores y empresarios que celebran el consenso para no cambiar.

Aunque se agradece que este foro finalmente acepte la magnitud de la crisis, si de aquí no surgen medidas concretas para mirar más allá de la coyuntura, revelará nuevamente nuestra incapacidad para encarar honestamente los problemas que México viene arrastrando desde hace décadas.

Revelará la propensión de los sentados aquí a proponer reformas aisladas, a anunciar medidas cortoplacistas, a eludir las distorsiones del sistema económico, a instrumentar políticas públicas a pedacitos, para llegar a acuerdos que sólo perpetuán el statu quo.

Mientras tanto, la realidad acecha a golpes de 327 mil despedidos, crecimiento negativo, el lugar 60 de 134 en el índice Global de Competitividad y una nación que dice reformarse mientras evita hacerlo.

México no crece por la forma en la cual se usa y se ejerce y se comparte el poder. Ni más ni menos.

Por las reglas discrecionales y politizadas que rigen a la república mafiosa, a la economía "de cuates".

Por la supervivencia de las estructuras corporativas que el gobierno creó y sigue financiando.

Por un modelo económico que canaliza las rentas del petróleo a demasiadas clientelas.

Por un sistema político que funciona muy bien para sus partidos pero muy mal para sus ciudadanos. Un sistema de W"extracción sin representación".

Creando así un país poblado por personas obligadas a diluir la esperanza; a encoger las expectativas; a cruzar la frontera al paso de 400 mil personas al año en busca de la movilidad social que no encuentran aquí; a vivir con la palma extendida esperando la próxima dádiva del próximo político; a marchar en las calles porque piensan que nadie en el gobierno los escucha; a desconfiar de las instituciones; a presenciar la muerte común de los sueños porque México no avanza a la velocidad que podría y debería.

---(Fin)--------------------------

viernes, octubre 16, 2009

La salud y la educación de alta calidad una inversión social para todos. Contra el terrorismo mediático

En estos tiempos de visión unilateral del mundo, es muy interesante una visión diferente de América Latina y del mundo. Este artículo “Un Premio Nobel para Evo” (aunque se refiere a otro tema central) me hace recordar que más allá de cualquier "color" ideológico soy un convencido que que la salud y la educación de nuestros paisanos debe ser una inversión social, o dicho de otra forma, un negocio para todos, no para uno cuantos. Creo que Canadá y Cuba son ejemplos contrastantes de que esto es posible y que no tiene nada que ver con ser un país capitalista desarrollado o un país en vías de desarrollo y socialista. ¿Ya vieron Sicko de Michael Moore?, se los recomiendo. Siempre andamos discutiendo de "ismos" o izquierdas, centros y derechas (que son tan relativos), cuando lo que realmente importaría es pensar en el contenido. Este sitio de Cuba Debate tiene un slogan sugerente "contra el terrorismo mediático", es decir si los medios de comunicación están en manos de unos pocos grupos con fuertes intereses económicos ¿cuál será la visión preponderante que nos transmitan?, en ese sentido es una especie de terrorismo mediático, todo lo que vaya en contra de esos intereses (salud y educación como inversión social) será bombardeado mediáticamente.

Etiquetas de Technorati: ,

sábado, octubre 03, 2009

BUG Warehouse. CSPS. La cadena vacía '' no es un nombre válido (The empty string ‘’ is not a valid name)

CSPS: Contexto, Situación, Problema, Solución
Bug: Defecto

Contexto
  • Microsoft Visual Studio 2008, NET Framewotk 3.5 SP1
  • Servicio Web ASMX existente expuesto mediante SOAP y HTTPS.
  • Cliente del servicio mediante protocolo SOAP.
Situación
  • Se tiene un servicio Web asmx operativo y conforme con Basic Profile Version 1.1 expuesto a través del protocolo SOAP.
  • Se toma una aplicación cliente cualesquiera (por ejemplo una consola) y se adiciona un referencia de servicio (Service Reference). Las referencias a servicios funcionan tanto con servicios de WCF o bien con servicios heredados tipo asmx. Se hace notar que también podría ser una referencia web (Web Reference) heredada de NET Framework 2.0 (asmx) y se produce el mismo comportamiento.
Problema

Al ejecutar el cliente se obtiene el siguiente mensaje de error:

   1: System.ServiceModel.FaultException was unhandled



   2:  



   3: Message="System.Web.Services.Protocols.SoapException: El servidor no puede procesar la solicitud. ---> System.ArgumentException: La cadena vacía '' no es un nombre válido.\n en System.Xml.XmlTextWriter.ValidateName(String name, Boolean NCName)\n en System.Xml.XmlTextWriter.InternalWriteName(String name, Boolean NCName)\n en System.Xml.XmlTextWriter.WriteQualifiedName(String localName, String ns)\n en System.Web.Services.Protocols.Soap11ServerProtocolHelper.WriteFault(XmlWriter writer, SoapException soapException, HttpStatusCode statusCode)\n en System.Web.Services.Protocols.SoapServerProtocol.WriteException(Exception e, Stream outputStream)\n en System.Web.Services.Protocols.WebServiceHandler.WriteException(Exception e)\n en System.Web.Services.Protocols.WebServiceHandler.Invoke()\n en System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()\n --- Fin del seguimiento de la pila de la excepción interna ---"



   4:  



   5: Source="mscorlib"



   6:  



   7: StackTrace:



   8:  



   9: Server stack trace: 



  10:  



  11: en System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)



  12: ...



  13: Exception rethrown at [0]: 



  14:  



  15: en System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)



  16:  



  17: en System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)



  18: ...



  19: en ....MyApp.MyMethod(UploadCollectionFileRequest request) en C:\...\Reference.cs:línea 357



  20: ...




El error no dice mucho y tampoco contiene información detallada de dónde ha sucedido como para hacer un seguimiento del código fuente. En la línea 19 se muestra un texto de ejemplo del detalle máximo referente al código, donde sólo se observa que hay algún problema con el “request” que se ha creado en nuestra referencia de servicio “Reference.cs”.



Solución


Si observamos la primera parte el problema se refiere a la dificultad de escribir el resultado de una serialización XML de forma correcta, debido a que hay un nombre inválido (vacío).



Al revisar el código fuente del Servicio Web se encontró que el servicio capturaba cualquier excepción y la convertía en una SoapException personalizada con las siguientes características:



try
{
//----------------------------------------------------------
// Custom code that throws an exception...
//----------------------------------------------------------

}
catch (Exception ex)
{
throw new SoapException("Mi descripción personalizada del error.", XmlQualifiedName.Empty, ex);
}
finally
{
// ...


}



Como se observa al preparar la excepción SOAP el parámetro XmlQualifiedName se está pasando con el valor “Empty”, lo que provoca que al intentar serializar la excepción esta no pueda procesarse.



Si bien es cierto que usted podría colocar cualquier nombre calificado, en vez de XmlQualifiedName.Empty y podría evitar este bug referido, por ejemplo, new XmlQualifiedName("Mi nombre para el código de excepción SOAP"), lo recomendable es respetar el estándar para el protocolo, ya que el parámetro del constructor de SoapException que acepta un XmlQualifiedName se llama “code” y se refiere al tipo de código de error de SOAP, por lo tanto el deber ser es, elegir alguno de los códigos disponibles, conocidos como códigos de error SOAP para la versión 1.1 del protocolo SOAP. En nuestro caso así queda la línea de excepción completa:



catch (Exception ex)
{
throw new SoapException("Mi descripción personalizada del error."
, SoapException.ServerFaultCode, ex);
}



Lo anterior resuelve el bug presentado y en su caso permite obtener la excepción subyacente que mostraría el verdadero error que se está produciendo en el servicio web.



---(FIN)---

martes, septiembre 22, 2009

Windows 7. Revisando la nueva interfaz de usuario.

Etiquetas de Technorati: ,,

Debo decir que he probado la nueva interface de Windows 7, como mi máquina principal de trabajo y la encuentro muy mejorada, más cómoda y más lógica (avanzando hacia el sentido común, lo que es mucho decir quizás, porque sabemos que a ese decir de que las “computadoras y/o sistemas operativos ya estarían hechos para el común de los mortales”, todavía le queda mucho trecho por andar).

Debo también decir, que en términos prácticos, me salté Windows Vista, sólo lo utilicé esporádicamente y me mantuve con XP hasta casi el final, cuando me enteré de esta opción para el RC1 de Windows 7.

La barra de tareas.

Mi primera impresión de la nueva barra de tareas fue una sensación de retroceso en el diseño, …sólo fue resistencia al cambio, a corto andar me percaté de una mejora significativa. La agrupación de aplicaciones similares (con vista previa interactiva) sin cambiar de tamaño , así como el soporte temático en la propia barra es una belleza, que en caso de temas de con múltiples colores e imágenes va cambiando regularmente todos el diseño tanto del fondo como de las ventanas y lo hace menos aburrido.
Cuando se está trabajando con el Explorador de Windows en una operación de copia de archivos de larga duración por ejemplo, el icono de la barra de tareas muestra claramente el procesamiento en curso con un cambio de colores.
Cualquier aplicación se puede anclar a la barra de manera de tenerla a la mano y las aplicaciones de su tipo se abren allí mismo donde se ancló.

image

La vista de previa interactiva en la barra de tareas

En el caso de Internet Explorer muestra tanto diferentes instancias como las pestañas que se tengan abiertas.

image

Búsqueda de programas en el menú de inicio

El menú de inicio con énfasis en la caja de búsqueda que busca los mismo programas que archivos hace que rara vez tenga que ingresar a “Todos los programas” a buscar en el árbol de programas que tiene instalados. Simplemente: “tecla de Windows” o clic en el menú de inicio y se puede anotar los buscado, en el ejemplo “sql server”.

image image

Lo reciente por aplicación en el menú de inicio

Es una excelente nueva funcionalidad esta que agrupa en el propio acceso directo de cada programa más utilizado del menú de inicio, los elementos o vínculos recientes (desde XP los programas más utilizados se van colocando a la mano en el menú de inicio). Por ejemplo Google Chrome:

image

Los iconos ocultos y otro típicos

Para mostrar los los iconos ocultos también resulta bastante más lógico utilizar una “window” en Windows que desplazar los iconos en la propia barra, lo que era realmente desesperante. Con el vínculo de “Personalizar…” uno puede decir que muestra de forma permanente.

image

 

Todas las ventanas de información me parecen más claras y mejoradas (menos técnicas u orientadas a un usuario común). Por ejemplo, en vez de tener una lista interminable de opciones de energía que nunca se utilizan o no se sabe qué hacen, se tienen dos elementales a la mano (y otras si se quiere bajo demanda).

 image image

Un nuevo centro mensajes sencillo que avisa de mensajes que atender o de problemas a solucionar.

image

image

Todo lo anterior está en el contexto de los iconos de notificación en la barra de tareas.

La hora y fecha

Por fin una mejora en eso. Era molesto tener que dar doble clic para ver una ventada muy anticuada. Ahora sólo basta con tocar (clic) la hora y fecha en la parte inferior derecha de la barra de tereas para que aparezca la información adecuada y mejor presentada.

image

Bibliotecas

Las bibliotecas son una excelente manera de organizar de forma lógica los accesos a diferentes ubicaciones físicas con alguna relación de nuestro interés. Yo me creé por ejemplo una biblioteca de desarrollo donde tengo muchas carpetas específicas a la mano.

image

Dentro de las bibliotecas la agrupación por fecha y otras opciones mejoradas resultan muy útiles para encontrar cosas como imágenes por diferentes criterios. Por ejemplo en mi biblioteca de imágenes puedo agrupar por mes las fotos (sin importar donde estén), así también por etiqueta, categoría, etc.

image

Favoritos más amplios

En los favoritos podemos colocar también carpetas de nuestra preferencia y lo “cambiado recientemente” (para documentos o archivos),

image 

y “sitios recientes” (para carpetas) son una excelente alternativa a antiguo menú de inicio “Documentos recientes”. Lo cambiado reciente funciona con simplemente haber guardado un archivo adjunto desde un correo electrónico en nuestro disco, muy útil.

image

Mostrar u ocultar el escritorio

Anteriormente para esta tarea tan simple y útil había que buscar un icono quien sabe dónde (se tenía que activar la barra de herramientas “inicio rápido” - quick launch) o bien colocar algún acceso especial. Finalmente abajo, en la parte derecha de la barra de tareas, existe un a zona especial con un simple botón para esta función que además muestra una vista previa del escritorio a pasar por ella.

image

Windows XP Mode

Aprovechando la tecnología de máquinas virtuales de Microsoft y descargando de la red los archivos correspondientes podemos instalar una máquina virtual de Windows XP Professional para correr aplicaciones heredadas que tuviesen algún problema de compatibilidad con Windows 7 o para otros propósitos. Una característica muy interesante que he visto (pero no probado de forma personal) es que una aplicación instalada en XP se puede correr como un acceso directo desde Windows 7 sin necesidad de abrir explícitamente la máquina virtual y se ejecuta como si fuera una aplicación en ventana del propio Windows 7. Se necesita una máquina que tenga características de tecnología de virtualización por hardware (revise su BIOS). Cuando lo pruebe lo mostraré.

image

Energía + Suspensión + Hibernación

Por primera vez la suspensión y la hibernación alcanzan un amplio grado de estabilidad en mi máquina (ref: HP Pavilion tx1030la, que es otra historia muy especial pero con HP), antes tenía Windows Vista y no más no me quedaba otra que evitarlo. La suspensión es rapidísima, la hibernación no tanto, pero funciona bien.
En cuanto dejamos la máquina sin utilizar con, con el esquema de energía predeterminado “Equilibrado”, la tarjeta gráfica pasa a un modo de bajo consumo (antes de apagar el monitor) así como otros dispositivos, lo que redunda en una mejora de ahorro de energía en general para el ambiente y en una mayor duración de la batería cuando no estamos conectados a un tomacorriente. Si, podríamos decir que es un sistema operativo algo más preocupado del medio ambiente.
Ahora sí, a pesar de tener conectados muchos dispositivos, discos duros, máquinas virtuales activas en disco duro externo, dispositivos USB de cache, unidades de DVD externa, etc. por fin no tengo problemas a reanudar. Puedo dejar mi máquina solita para se apague (suspenda) cuando no la utilizo y siempre inicia bien con todo funcionando...bueno algunas pocas veces noto que el Explorador de Windows tiene un comportamiento  raro al tratar de mostrar la información (en especial de discos y o bibliotecas). En ese caso me basta con cerrar la sesión y solucionado.

Monerías

Otras cosas como organizar ventanas con sólo desplazarlas hacia los bordes del escritorio puede resultar muy útil cuando estamos copiando o comparando información entre las mismas.

image

Quizás el agitar una venta para dejarla sola en el escritorio puede tener utilidad para alguien, a lo mejor me hago fan más adelante.

Finalmente mi calificación general de Windows 7 es 10, es decir satisfecho en términos relativos y con un sentimiento agradable de mejora notoria, comparado con todos los sistemas anteriores de Microsoft. El uso intensivo de colores y texturas ha de tener algo que ver.

---(FIN)---

Update Progress Solution for ASP.NET MVC with Ajax

Etiquetas de Technorati: ,,,,,
Introducción
Buscando alternativas para utilizar ajax y un estilo como el de update progress de ASP.NET para ASP.NET MVC me encontré con algunas soluciones que no eran lo que buscaba, algunas mezclando componentes de servidor otras con código demasiado abstracto para algo que debería ser simple.
Finalmente decidí hacerlo de otro modo y obtuve esta solución simple basada directamente y exclusivamente, en lo que ofrece ASP.NET MVC. El concepto que propongo está basado en MVC y proporciona control total sobre lo que queremos que se muestre. Es objetivo de este artículo generar una solución base los más directa posible con los controles existentes de MVC para facilitar la comprensión, con menos abstracciones, tal como se muestra a continuación.
Audiencia
Si usted no tiene conocimiento previo sobre los conceptos básicos de ASP.NET MVC le recomiendo revisar los mismos.
Lo que queremos lograr

Veamos primero lo que queremos obtener.
El usuario hace clic en la liga “Actualizar foo…”
image
El sistema pide su confirmación.
image
El usuario acepta y se procede con la actualización mostrando una imagen animada.image
Al finalizar el procedimiento de actualización se muestra un mensaje de “actualización lista” (Ready.).
image
En una vista cualesquiera (sea de un control de usuario o vista final) se crea un control de usuario llamado UpdateProgressControl y se inicializa su modelo UpdateProgressViewModel con un nombre de negocio que lo identifique “UpdateFoo”, el nombre debe ser válido para un control pero sólo basta con que contenga el sentido de negocio (los prefijos y/o sufijos como para un control, por ejemplo “divUpdateProgressUpdateFoo” los coloca el propio modelo).
Veamos una vista con un vínculo ajax (liga, link) y los elementos comentados.

<p>
<% =Ajax.ActionLink("Actualizar foo..."
, "Update1"
, new AjaxOptions()
{
Confirm
= "¿Seguro desea proceder con la actualización?"
, OnBegin
= UpdateProgressViewModel.GetFunctionNameForShow(
"UpdateFoo")
, OnComplete
= UpdateProgressViewModel.GetFunctionNameForHide(
"UpdateFoo")
}
) %>
</p>
<% Html.RenderPartial("UpdateProgressControl"
, new UpdateProgressViewModel("UpdateFoo")); %>



Como se observa en el código, mediante AjaxOptions se establecen los nombres de las funciones javascripts, utilizando métodos estáticos del propio modelo que reciben como parámetro el nombre simple de negocio que hemos definido antes (“EditFoo”). Más adelante se verán los detalles.


En resumen, el concepto central es simplemente:




  1. Crear el control de usuario UpdateProgressControl.


  2. Configurar los métodos OnBegin y OnComplete de AjaxOptions para mostrar y ocultar el control.



Además podemos colocar las características o estilo de nuestro control en un Cascading Style Sheets, CSS de nuestro sitio.



Índice



  1. Crear estilos (CSS).


  2. Crear un modelo para la vista.


  3. Crear la vista del control UpdateProgress.


Veamos cada punto en el mismo orden.




1. Crear los estilos.


Creamos un conjunto de estilos que utilizará nuestro control y nos permite modificar la presentación del mismo.



/* Update Progress  
----------------------------------------------------------*/
.updateProgress
{
display: none;
background-repeat: no-repeat;
background-image: url('../Content/Images/ajax-loader.gif');
padding-top: 5px;
padding-bottom: 20px
}
.updateProgress label
{
padding-left: 45px
}


2. Crear un modelo para la vista.

El modelo cuenta con:





  1. Varios constructores.


  2. Dos funciones estáticas para recuperar (y generar) los nombres de funciones de java script que se utilizarán para mostrar y ocultar la operación en progreso.


  3. Varias propiedades básicas (ID, Name y Message) para utilizarlas en el control.



image   
A continuación se muestra solamente el constructor más simple que inicializa valores predeterminados.



/// <summary>
///
Initialize update progress with default message.
/// </summary>
/// <param name="name">
Update progress name.</param>
public UpdateProgressViewModel(string name)
: this(name, UpdateProgressViewModel.GetInProgressMessage(), false)
{
}


3. Crear la vista del control UpdateProgress.


Ahora creamos la vista parcial del control Update Progress que utilizará el modelo previamente creado.

La vista integra los estilos definidos, unas rutinas de javascript y el modelo para generar un control simple html que se desplegará y ocultará a conveniencia durante las llamadas ajax de nuestras páginas consumidoras.


Nuestro control de usuario tiene dos DIV para desplegar nuestra imagen de actualización y para desplegar el mensaje de actualización terminada. El modelo es el encargado de generar los nombres o ID's que necesitemos.



Este primer DIV es para desplegar la imagen de actualización y se carga desde el CSS.



<div id="<%=Model.ID%>" class="updateProgress" style="display: none">
<
label>
<%= Html.Encode(Model.Message) %>
</label>
</
div>



El segundo DIV se encarga de desplegar un mensaje de actualización completada (Ready).



<div id="<%=Model.ID%>MessageResult" class="updateProgressResult" style="display: none">
<
label>
<%= SmartResource.GetString("ReadyLabel", "Ready.") %>
</label>
</
div>



Se puede sustituir la línea de “<%= SmartResource…” por un mensaje fijo.

Finalmente nuestro control de usuario mediante el modelo también genera el javascript que necesitamos para mostrar y ocultar nuestro control. Por ejemplo para mostrar el control y tenemos:



function <%=Model.FunctionNameForShow%>() {
$("#<%=Model.ID%>").show();
$("#<%=Model.ID%>MessageResult").hide();
var disableSubmit
= <%=Model.DisableSubmitOnRequestString %>;
if(disableSubmit)
{
//Disable submits.
$(":submit").each(
function (i)
{
this.disabled = true;
}
);
}
}



Como se observa estamos aprovechando las facilidades de jQuery para referenciar los elementos que queremos controlar.


En una próxima entrega podríamos explorar las ventajas de adicionar más abstracción a este tema y generar un MVC AjaxHelper especializado para este control que tanta utilidad tiene, lo que simplificaría aún más la llamada desde el cliente. En vez de utilizar el Ajax.ActionLink, sería tan simple como esto:


<p>

   
<%=Ajax.UpdateProgressLink("Actualizar foo helper..."

         
, "Update1"

         
, "¿Seguro desea proceder con la actualización?"

         
, "UpdateFoo") %>

</p>



---(Fin)---