Category Archive: Informatica

Cosas sobre Linux, PC, programación y demas

Jan 27

SCRUM

Hola mi estimadisimo par de lector@s. Como comente a principios de semana estuve asistiendo a un curso de SCRUM ¿Y qué es eso se preguntará usted? Una forma de trabajar que se apropio del nombre de una jugada del Rugby y fue desarrollado en los 90′s por unos tales Ken Schwaber y Jeff Sutherland. Para que no se me valla a olvidar del todo lo que aprendí en este curso y para quien pueda querer consultar algo al respecto procedo a anotar aquí mis impresiones del curso y un leve resumen de lo que vi pero advierto desde ya que no pretendo escribir una guía completa… para los demás, de antemano pido me disculpen por aburrirlos y los invito a volver la próxima entrada o a ver alguna otra entrada random que les apetezca más, gracias.

“A todo el mundo le gustará Scrum;
es lo que ya hacemos cuando estamos
entre la espada y la pared.”

– Jim Coplien

SCRUM es un método de desarrollo de software ágil, pero a diferencia de lo que muchos directivos podrían pensar o querer no es ágil por hacer lo mismo más rápido, si no que involucra cambios más profundos. SCRUM y los metodos agiles son alternativas a otros metodos como CMMI a los que considera rigidos y pesados. La metodología ágil trabaja con personas para generar productos mientras que los metodos tradicionales se enfocan en CONTROLAR el proceso.

Scrum no es un proceso o una técnica para desarrollar o crear productos, sino que es un marco en el que se pueden emplear diversos procesos y técnicas. El papel de Scrum es hacer aflorar la eficacia relativa de las prácticas de desarrollo empleadas por usted, para que pueda mejorarlas, a la vez que proporciona un marco dentro del cual se pueden desarrollar productos complejos, que ha diferencia de los procesos tradicionales se basa en la experiencia empírica y en tratar a las personas como personas variables y no en los tiempos y el control, su objetivo primordial es producir algo útil con lo que el cliente este satisfecho y no en que el gerente se sienta que tiene un control total de lo que hace su personal en todo momento. Trabaja de forma iterativa e incremental aunque sacrifica algunas cosas como definir de antemano cuantas horas exactas va a tardar cada actividad durante todo el proyecto y eso puede darle temor a los directivos.

  • SCRUM es muy simple
  • SCRUM es difícil de implementar
  • SCRUM funciona en el contexto adecuado

¿A qué se refieren los puntos anteriores? Primero a que SCRUM es adaptable, no pide mucha documentación, los formatos te los puedes inventar tu, promueve la experimentación continua para buscar mejoras y cosas así. Lo segundo se refiere entre otras cosas a que es un cambio drástico respecto a los procesos tradicionales pero no solo en la forma de trabajar si no de la organización y para muchos hasta de forma de pensar y por ultimo se refiere a que no funciona para todo tipo de trabajo debido a su naturaleza cíclica e incremental. Ahora procedo a hablar un poco más a fondo de cada cosa.

Primero ¿Cuando es útil SCRUM? Cuando el proyecto es lo suficientemente complejo como para durar al menos una semana (puede ser menos pero entonces tal vez otras alternativas sean mejores que SCRUM) y cuando nuestro dominio de ante mano de la tecnología y los requerimientos del sistema nos impidan hacer fácilmente una planificación exacta con un método tradicional.

Gráfica hecha en el 1er sprint del proyecto de entrada

Si el proyecto ya lo tenemos bien dominando entonces experimentar con SCRUM, pero si no, entonces si se sugiere intentarlo.

En SCRUM no se planea todo exhaustivamente al inicio del proyecto si no que se busca obtener requisitos prioritarios y poder crear en base a ellos una primera base entregable que pueda funcionar pronto, y luego tomarse un ciclo de mejora y si es necesario otro y así hasta que quede listo. En cada ciclo se puede planear que va a estar listo para el final de ese ciclo pero probablemente no se sepa cuantos ciclos serán necesarios a ciencia cierta aunque se puede tener una idea general. Los resultados de cada ciclo sirven para que el cliente vea avance y como base para el siguiente ciclo más depurado y con más información. A cada uno de estos ciclos se le llama SPRINT.

El corazón de SCRUM son los SPRINTs, que son iteraciones que se recomienda duren entre mínimo una semana y máximo un mes dependiendo del tipo de proyectos con que se trabaje y decisiones del equipo pero se ruega que en la medida de lo posible la duración de los Sprints sea constante pues se busca alcanzar un ritmo estable de trabajo debido a varias razones como la satisfacción del usuario y de los trabajadores en el equipo, para poder medir la velocidad de trabajo razonable del equipo y facilitar la planificación de trabajo futuro.

En cada sprint se debe de terminar algo funcional para el cliente y se debe empezar por lo más prioritario para el cliente ya sea porque es lo más básico o que genera más riesgo en caso de no estar. Lo demás se deja para posteriores sprints. Por eso es un método incremental.

Los Sprints se componen de: la Reunión de Planificación de Sprint, el trabajo de desarrollo, la Revisión del Sprint, y la Retrospectiva del Sprint.

AutoOrganizarse. Si el corazón de Scrum son los Sprints, La auto-organización de los equipos de trabajo es la clave. Consiste en que en lugar de tener roles fijos donde cada quien hace una cosa y solo esa, Scrum alienta la creación de grupos de trabajo pequeños de preferencia de entre 5 y 7 personas donde entre todos saquen la tarea haciendo lo que prefieran hacer pero sin que quede nada por hacer porque nadie lo halla querido tomar. Para eso se requiere un equipo comprometido y que todos puedan confiar en los demás dentro del equipo. El equipo debe tener la libertad e iniciativa de comunicarse entre si cada vez que sea necesario y tener retroalimentación para asegurarse de hacer las cosas bien. La comunicación oral cara a cara tiene prioridad dejando a la escrita solo como un medio de respaldo para conservar lo que no queremos que se pierda en la memoria.

Los Pollos tirandole a los Cerdos

Los Pollos tirandole a los Cerdos

Pollos y Cerdos. Si bien dentro del equipo de desarrollo no hay roles específicos pre-definidos por el método, si hay tres roles y dos tipos de personas en esto.

Un cerdo y un pollo van caminando por una calle. El pollo voltea a ver al cerdo y le dice: “oye, ¿por qué no abrimos un restaurante?, El cerdo voltea a ver al pollo y dice “Buena idea, ¿cómo quieres llamarlo?”, El pollo se pone a pensar y le responde: “¿Porque no lo llamamos Jamón y huevos?”, No me parece dice el cerdo, “Yo estaría comprometido, pero tú sólo estarías implicado”.

Entonces “los cerdos” están comprometidos en la realización  del software con regularidad y con frecuencia, mientras todos los demás son “un pollo” – interesados en el proyecto. ¿Y exactamente quienes son los pollos y quienes los cerdos?

A los pollos también se les llama “stakeholders” y son los que no son miembros del equipo, es decir el o los clientes, los usuarios finales y quien patrocine el proyecto. Y los cerdos son el equipo que hace el software.

Roles del Equipo. Los cerdos son los que forman el equipo scrum, es decir el equipo y se dividen en tres roles:

  • Scrum Master. Cuyo trabajo primordial es quitar impedimentos y distracciones a la capacidad del equipo de entregar o terminar las metas del sprint. No es el líder del equipo si no un facilitador. Puede ser parte integral del equipo o no y este puesto puede irse rotando entre los miembros del equipo. Es responsable de asegurar que el equipo Scrum se adhiere a los valores, prácticas y normas Scrum.
  • Product Owner. Representa la voz del cliente/usuario ante el equipo para que el cliente no interactue o distraiga al equipo durante el sprint, intermediario entre cliente y equipo.  El dueño del producto escribe los detalles desde el punto de vista del cliente (Historias de usuario), les da prioridad y los añade al back log del producto. Un dueño del producto puede ser parte el equipo Scrum pero no puede ser un Scrum Master. El Propietario del Producto es una persona, no un comité. Una vez empezado un sprint solo este rol puede detenerlo, ni los pollos directamente ni el equipo ni el scrum master pueden. Durante el sprint el Product Owner se mantiene en comunicación con el cliente para preparar los requerimientos para el próximo sprint.
  • Equipo. Todos los demás cerdos que se encargan de desarrollar el producto. No hay roles fijos dentro del equipo y todos deben estar dispuestos a cooperar en lo que sea necesario de forma auto-organizada. Nadie – ni siquiera el ScrumMaster – dice al Equipo cómo convertir el Product Backlog en incrementos de funcionalidad entregable. El Equipo busca por su cuenta la mejor forma de hacerlo. Cada miembro del equipo aplica su experiencia a todos los problemas. La sinergia resultante mejora la eficiencia global de todo el Equipo, y la eficacia. El equipo debe trabajar en equipo de preferencia y no como una cadena de montaje para evitar que una pausa en un rol pare a todo el equipo.

El Propietario del Producto es el “cerdo” del Product Backlog. El equipo es el “cerdo” del trabajo del Sprint. El ScrumMaster es el “cerdo” del proceso de Scrum. Todo el resto de personas involucradas son “pollos”. Los “pollos” no pueden decir a los “cerdos” cómo hacer su trabajo.

Estimación. Tienes una ventana de tiempo ¿Qué cabe en la ventana?

En SCRUM no se estima por horas si no en Puntos de Historia y esto es uno de los aspectos que requieren un cambio de paradigma que me parece más van a sacar de balance a los directivos acostumbrados a medir desempeños. Los puntos de historia son grados de complejidad de las tareas y ayudan a medir cuales y cuantas tareas entran en el sprint, es decir, en lugar de decir me tardo X horas en hacer Y actividad lo que pasa ahora es que tenemos un Sprint fijo para entregar resultados en digamos 2 semanas y lo que varia es que es lo que el equipo se compromete en tener listo para ese tiempo.

La manera de enfrentarse a tareas imposibles
es cortalas a un número de tareas meramente
muy dificiles de realizar, y romper cada una
de ellas en un grupo de tareas arduamente
difíciles de realizar, y cada una de ellas
en trabajos complicados,
y cada uno de ellos…

–Terry Pratchett

En Scrum además de no planificar las actividades en horas, se divide todo el proyecto en actividades que se hagan en máximo una jornada de trabajo y se pone enfasis en no dejarlas sin terminar. La idea es que todos los días el equipo valla haciendo actividades que pueda terminar el mismo día. Así, para planificar el equipo calculará la dificultad de los requisitos y asígnara cuantos días tomará hacer el trabajo, pero como la duración del Sprint es fija lo que haces es averiguar cuantas actividades es razonable que quepan en cada sprint y meter primero las que generen más valor y prioridad.

¡Si todo urge, NO urge nada! Hay que establecer y respetar las prioridades, dificilmente todo va a urgir en realidad.

Hay dos partes en la Reunión de Planificación del Sprint: la parte del “¿Qué?” y la parte del “¿Cómo?“ En la primera parte, el Equipo Scrum aborda la cuestión del ”¿Qué?”. El Propietario del Producto presenta al equipo la parte más prioritaria del Product Backlog. Trabajan juntos para determinar qué funciones se van a desarrollar durante el próximo Sprint. La información de entrada para esta reunión es el Product Backlog, el último incremento del producto, la capacidad del Equipo y el rendimiento anterior del Equipo. La cantidad de Backlog que el Equipo selecciona es una decisión del Equipo. Sólo el Equipo puede evaluar lo que puede lograr en el próximo Sprint, aunque el Product Owner hallá definido las prioridades del cliente.

Una vez seleccionado el Product Backlog, se define un Objetivo para el Sprint. El Objetivo del Sprint es una meta que se alcanzará mediante la implementación del Product Backlog. Es una declaración que sirve de orientación al equipo acerca de por qué se está construyendo el incremento. El Objetivo del Sprint es un subconjunto del objetivo de la entrega.

En la segunda parte de la Reunión de Planificación del Sprint, el equipo aborda la cuestión del “¿Cómo?”. Durante la segunda mitad de la Reunión de Planificación del Sprint (bloque de cuatro horas para un Sprint de un mes), el Equipo debe determinar cómo convertirá en un incremento, el Product Backlog (el “Qué”) seleccionado durante la reunión de planificación de Sprint. El Equipo por lo general comienza por el diseño del trabajo. Mientras diseñan, identifican tareas. Estas tareas son las porciones detalladas del trabajo necesario para convertir el Product Backlog en software que funciona. Las Tareas se deben descomponer para que se puedan completar en menos de un día. Esta lista de tareas se llama Sprint Backlog.

En Scrum sabes cuando termina el Sprint actual pero tal vez no sepas cuando termina el proyecto total, los nuevos requerimientos generan nuevos sprints. Debido a sus planificaciones cortas, el SCRUM esta preparado para los cambios entre cada iteración, que en metodos tradicionales son más dificiles de adaptar y piden replanificar los requerimientos mientras que en SCRUM se toman en cuenta en el siguiente SPRINT.

Luego cuando ya el equipo se pone a desarrollar el avance se puede ir viendo y monitoreando rapidamente con un par de tecnicas, una es llevar reuniones diarias de no más de 15 minutos y de pie para limitar el tiempo y darle prioridad a lo importante. En estas juntas se deben revisar 3 preguntas con el equipo.

  • ¿Qué hiciste ayer? Rapido te das cuenta que es lo que ya esta hecho y si alguien no hace nada.
  • ¿Qué vas a hacer hoy? Rapido puedes saber quien esta haciendo que.
  • ¿Tuviste problemas? Así los problemas se saben en máximo un día.

Esta junta es responsabilidad del Scrum Master y meditante ellas se puede ver a diario que todos los miembros del equipo avancen, en que avancen y que problemas hay, así a diario se lleva el control del proyecto y se atacan rapidamente las causas de problemas que puedan haber surgido el día anterior.

La otra tecnica es el uso de un tablero (Task Board) donde se mantenga visible que hay que hacer, que se esta haciendo y que ya se hizo. Se propone hacerlo poniendo en el de forma breve y exacta cada actividad.

Durante el sprint el equipo trabaja, el Scrum Master se coordina con ellos y retira los obstaculos que surgen durante el sprint ¿Y el Product Owner? Seguramente quedaron requisitos fuera de los compromisos del sprint en proceso así que el Product Owner debe aclarar con el cliente estos requerimientos para tenerlos listos para la planificación del próximo sprint. También es su labor mantener al cliente informado y lo suficientemente tranquilo para que no interrumpa al equipo de trabajo. El P.O. es un embudo de requerimientos desde el cliente hasta el equipo.

El resultado del Sprint es un entregable rapido para el cliente, el cliente lo revisa y puede dar su visto bueno o no, también es posible tomar nuevos requerimientos si los hay y correcciones o cualquier otro feedback que surja y con eso preparar que es lo que se trabajará en el próximo sprint y volvemos a empezar. Por esto SCRUM no funciona sin cooperación del cliente para obtener Feedback.

PRINCIPIOS DE SCRUM

  • Los proyectos se desarrollan entorno a equipos motivados.
  • Prioridad a la comunicación oral cara a cara, lo escrito se deja para documentar los acuerdos y no dejarlo a la memoria.
  • La medida de exito es el software funcionando, no los documentos ni el proceso.
  • Se promueve un ritmo constante de trabajo, balanceado, sin horas extra o periodos de inactividad.
  • Atención al diseño y excelencia tecnica.
  • Simplicidad. Máximizar la cantidad de trabajo no realizado (ver principio KISS).
  • AutoOrganización. Dejar que el equipo se ponga de acuerdo sobre como hacer las cosas.
  • Reflexión y mejora periodicamente.

SCRUM no debe tener presión, si hay presión no es SCRUM.

Por ultimo, quiero recalcar un punto fundamental de SCRUM. Respetar los tiempos (timeboxes), si algo no se alcanzo a ver en una junta en el tiempo dado es porque hicimos mal la junta o porque no era más importante que lo que si se vio. Si se va a acabar el tiempo del Sprint y no vamos a terminar tampoco se alarga el Sprint, si no que tenemos que aprender de esto y dejar lo pendiente para el siguiente Sprint.

Para más información: www.scrumalliance.org

Jan 21

Ya estaba dicho…

Los últimos días han sido muy movidos en el Internet desde el apagón de páginas del día 18 y el cierre de Megaupload el día 19 por el FBI sin necesidad de SOPA siquiera y todas las páginas que posteriormente fueron tumbadas por Anonymous principalmente, entre otras acciones menos impactantes de cara al publico. He estado atengo y me llama la atención que hasta se le llegue a llamar World War Web a este estado de cosas.

En mi caso he decidido mantenerme neutral aunque expectante a lo que ocurra porque es muy difícil llegar a un equilibrio ¿Equilibrio? Si, porque es cierto que los autores deben ser remunerados, que la piratería no es buena y eso, no hay duda. Pero también es verdad que la globalización nos permite enterarnos rápidamente de todo el material de nuestro gusto casi de inmediato en cuanto sale, por ejemplo series de televisión inglesa, películas de Bollywood (si, con B y no con H), animes de Japón, música coreana, programas de radio españoles, etc por mencionar algunas cosas internacionales que me acuerdo ahora mismo y a lo que quiero llegar es que para muchas de estas cosas no hay métodos legales para obtenerlos pagando y remunerando a sus autores ya sea porque el contenido no esta en tiendas digitales o esta pero restringido solo a ciertos países y los demás que se aguanten ¿Y entonces que queda? Hay opciones como Netflix, las stores de las consolas de videojuegos, iTunes y otros similares pero aun están muy limitados a lo que las empresas deseen distribuidor, donde deseen hacerlo, sus limitaciones a la hora de traducir y así. Las opciones legales aun no son suficientes.

No se mucho de leyes, si algun@ de mis estimad@s lector@s si sabe por favor díganos, pero hasta donde se, si en el país nadie, ninguna empresa tiene los derechos de distribución de un material entonces en consecuencia si nadie es el dueño nadie puede demandar que se detenga la distribución, como un vació legal que desaparece en cuanto una empresa obtiene los derechos y a partir de ahí si es ilegal su distribución. Pero como les digo no estoy seguro de la base jurídica de tal afirmación aunque me suena lógico pero ya sabemos que ley y justicia no van de la mano siempre como debería de ser ¿Saben algo más al respecto?

Hay sitios como Youtube que nos permiten compartir contenidos y que tienen reglas más o menos estrictas respecto al uso de material protegido por derechos de autor que hacen advertencias, retiran los vídeos y en general cooperan para retirar el material cuando las compañías afectadas se los reportan. En Megaupload hay mucho material original generado por usuarios, no lo dudo, pero no podemos ignorar que fue muy popular también para subir toda clase de cosas incluido material protegido por derechos autor también y no se que tan bien se dedicarían a limpiar sus servidores de material protegido pero supongo que poco y además con las cuentas premium que mucha gente pago para bajar más rápido este material sin darle alguna parte a los autores porque, debe ser prácticamente imposible de hacer de manera justa, pues se puede decir que lucraban con el contenido de otros. Es complicado y muy gris todo esto. Por eso seré neutral.

Dejando atrás lo anteriormente comentado ahora quiero mencionar que el 11 de diciembre de 2010 publique el siguiente texto en un momento en que aun estaba lejos de ocurrir esta batalla por el Internet, es más ni aun habían empezado las revueltas en norte de África y medio oriente que terminaron tumbando dictaduras ni las de Europa como el 15M de España. En Egipto, Tunez y España el uso de redes sociales fue muy importante para coordinar a la gente, pero ahora si, al texto.

Controlar el Internet

Ya hemos visto en China como el gobierno mantiene a Internet más bien como una especie de sub-red nacional controlada. ¿Y si otros países toman de pretexto esto para implementar controles a internet? Ya me imagino presiones a los buscadores para que no muestren las páginas que le resulten incomodas al gobierno, filtrados de servidores DNS para que no puedas conectarte a ciertas páginas no autorizadas, control a las compañías proveedoras de Internet. ¿Acaso algunos gobiernos están planeando dividir el internet en corralitos controlados? Quiero pensar que eso es solo una fantasía pesimista de mi parte, ojala que no pase.

Imaginen un péndulo que va entre dos extremos, uno de libertad y otro de seguridad, donde para llegar a un extremo forzosamente se aleja del otro. Así funcionan los gobiernos actualmente, que para brindar seguridad dejan que los servicios de inteligencia espíen y recopilen información de los demás… hasta que llega a ser sofocante e intrusivo y entonces la gente exige libertad, el pendulo se mueve en dirección opuesta, se relajan las medidas y los malhechores aprovechan dando un golpe que hace que la opinión publica pida seguridad y vamos de nuevo en la otra dirección. Es muy difícil encontrar un justo medio funcional para todos, pero eso si, a los gobiernos les gusta más el extremo de seguridad porque les da poder y control, pretextos para poder justificar excesos.

Novus Ordo Seclorum

La historia humana ha ido por periodos donde poderes y sistemas han dominado o mantenido equilibrios estables por un tiempo, seguidos luego de una renovación rápida -y generalmente violenta también- seguida de una nueva estabilización. Para no irnos muy lejos venimos del siglo XX donde la primera guerra mundial genero un periodo roto por la segunda guerra mundial que a su vez genero un nuevo equilibrio de poderes entre USA y la URSS que acabo con la desaparición de la unión soviética en 1991, dando una década de supremacía indiscutible a Estados Unidos, pero los atentados del 2001 (independientemente de quien fue y porque) mostraron que al gigante se le puede golpear y fuerte, incluso en su propio territorio. Actualmente tenemos un precario equilibrio de bloques que más bien están como viendo a ver que pasa antes de moverse, acompañados de una que otra nación armada y retadora, cuestión de asomarse a Asia y ver. Las fidelidades ya no son lo que eran y ahora los trapos sucios de todos están en riesgo.

Tal vez exagero con ese subtitulo de nuevo orden, pero la verdad si estamos en una época de cambios y reacomodos, reconozcanlo.

Y el amigo Kid me menciono que eso no es nada, que mucho antes Kojima nos dijo en Metal Gear Solid 2 lo siguiente:

Raiden: Who are you?
Colonel: To begin with — we’re not what you’d call — human.Over the past two hundred years –A kind of consciousness formed layer by layer in the crucible of the White House.It’s not unlike the way life started in the oceans four billion years ago.The White House was our primordial soup, a base of evolution –We are formless. We are the very discipline and morality that Americans invoke so often.How can anyone hope to eliminate us? As long as this nation exists, so will we.
Raiden: Cut the crap! If you’re immortal, why would you take away individual freedoms and censor the Net?
Rose: Jack, don’t be silly.
Colonel: Don’t you know that our plans have your interests — not ours — in mind?

Interesante verdad.

Jan 18

Apagón de Internet

Imagina un mundo sin conocimiento libre
Por toda una década, nosotros invertimos millones
de horas construyendo la más grande enciclopedia
en la historia de la humanidad. Ahora, el Congreso
de los Estados Unidos está tratando una legislación
que podría causarle una herida mortal a la Internet
libre y abierta.
– Wikipedia

Hoy 18 de Enero de 2012 así se vio la Wikipedia en ingles

Y así se vio WordPress

Y Google si bien no cerro si puso un doodle de protesta así, censurado

Reddit y otras páginas también estuvieron fuera hoy. Creo que de cierto modo el día de hoy fue histórico en la trayectoria del Internet y lo vivimos en asientos de primera fila.

Cya! Espero que podamos seguir leyéndonos por mucho tiempo más.

Jan 04

¿Qué es SOPA? Ley contra Pirateria

Hola mis querid@s tres lector@s, les traigo hoy una entrada algo paradojica porque habla de cierto modo sobre pirateria y curiosamente es pirateada (gracias David, Kid, PoderPDA, ALT1040 y otras fuentes de la información, no digan que me robo sus meritos) contrario a mi costumbre de procurar redactar contenido propio aunque siempre es valido tener fuentes que validen lo que les cuento ¿no? El caso es que ultimamente esta sonando mucho la Ley SOPA que aunque es de Estados Unidos tiene potencial de afectar mucho a todos los usuarios de Internet y que si usted mi bien documentado lector ya sabe del tema me alegro y si no dejo aquí para que se documente porque seria buen antecedente para la próxima entrada, así que proceda a leer por favor.

A Mafalda no le gusta la SOPA

Si has prestado algo de atención sobre lo que pasa en Internet últimamente, seguramente habrás escuchado leído más de una vez artículos referentes a la propuesta de ley SOPAStop Online Piracy Act, que en español se puede traducir como “Ley de Alto a la Piratería en Línea”. Como todas las leyes relacionadas con el mundo del Internet, aparentemente todavía tan incomprendido por algunos, la SOPA tiene sus defensores y detractores. Tratar de comprender la lógica detrás de quienes apoyan esta iniciativa no es tarea fácil, pero primero tendríamos que entender de qué estamos hablando.

Básicamente, esta propuesta de ley le daría la facultad al gobierno estadounidense de tumbarle el sitio a cualquier empresa que fuera acusada (con demostración de causa o no) de proveer o facilitar la distribución de contenido protegido por leyes de copyright. Nodo9 lo explica bastante biencomparando la propuesta con la manera en que algunas empresas controlan y limitan el acceso a Internet a un nivel granular impresionante. El problema aquí es que no es cuestión de revisar Twitter en la oficina sino de tener la capacidad de coartar la libertad de expresión de millones de usuarios con fines legítimos.

Obviamente, siendo políticamente correctos, si estamos hablando de un sitio cuyo principal objetivo es facilitar acceso a contenido protegido por leyes de copyright, muchos estarían a favor de ayudarles a legitimizar su modelo de negocios. Sin embargo, lo que esta nueva iniciativa propone es que basta con que haya una simple, pequeña e inocente liga a una canción, imagen o video (por decir ejemplos) en un comentario de una entrada escondida en una sección enterrada al fondo de un stream sentado en un vuelo de taca para que te tumben el sitio. Es decir, adiós Facebook.

Si yo no creyera que las leyes de copyright en papel son tan absurdas que de ser llevadas a la práctica en forma literal arrasarían con todos los pseudo artistas en YouTube y los arrastrarían a la cárcel – y sí, esto incluye también a Justin Bieber en sus orígenes y a también a los Vazques Sounds (que por cierto Ángela no tenía el CD, ¿habrán bajado el álbum en iTunes?)-, tal vez estaría de acuerdo. Pero como dicen por ahí, desde que comenzaron las demandas contra Napster, la industria de entretenimiento (entre otros) ha intentado eliminar los nuevos modelos de distribución de la misma manera en que si se matara moscas con bombas nucleares… en el lugar equivocado.

Lo irónico de todo esto es que esta iniciativa se está promoviendo en el país que se da palmadas a sí mismo en la espalda por defender la democracia, la libertad de expresión y las garantías individuales (a final de cuentas, eso es lo que fueron a hacer a Iraq, ¿no? ¿a liberar a la gente?) y ahora ellos mismos se ponen en una posición que los compara con gobiernos autoritarios como el de China, donde la censura se practica en todos los niveles para evitar levantamientos sociales, razón por la cual hastaGoogle tardó en entrar al mercado chino de lleno precisamente porque estaban en contra de las prácticas dictatoriales. Aunque la intención de esta ley es noble, bien dice el dicho “no hagas cosas buenas que parezcan malas”.

Y es que es evidente que las razones de fondo no van en mano con causas humanitarias sino con controlar los flujos de efectivo, situación no rara para un país que asigna más presupuesto a su ejército que a sus programas sociales. Quienes están detrás de esta propuesta son precisamente algunas de las asociaciones más cargadas de Estados Unidos: la Cámara de Comercio de EU, la “Motion Picture Association of America” (todo lo que tenga que ver con películas), la Federacion de Músicos de EU, el Gremio de Directores y el Gremio de Actores. Básicamente, esta gente nos quiere de vuelta en los cines o rentando DVD’s sin considerar que el Internet es un excelente medio de distribución como lo han demostrado ya compañías como HuluNetflixAmazon.

De proceder esta ley, prácticamente todas las empresas que le dan facilidad al usuario de crear su propio contenido tendrían que tener un departamento especializado en el monitoreo de dicho contenido con tal de asegurar que no haya profanación de derechos de copyright, como es el caso de Weibo, un servicio similar a Twitter que tiene un equipo de alrededor de 1,000 personas dedicadas a peinar el sitio con tal de apegarse a lo que dicten las autoridades. Para las empresas pequeñas y startups, los pesos legales y logísticos de esto serían un verdadero obstáculo para su desarrollo y capacidad de innovación.

Por su parte, el sitio FightForTheFuture ha creado el portal IWorkForTheInternet, en el cual miles de personas que están en contra de esta iniciativa expresan su punto de vista defendiendo sus trabajos y sus responsabilidades. “Yo trabajo para Internet”, una especie de “la tierra es de quien la trabaja” versión moderna.

En ningún punto deja de ser válido el punto de que se debe defender la propiedad intelectual, pero los problemas surgen cuando quienes intentan hacer algo al respecto son personas ajenas a la tecnología (como nota curiosa, sólo hay seis ingenieros en el Congreso estadounidense). Desafortunadamente, como dice Matt Cutts, faltan todavía varios años antes de que la nueva generación de “nativos digitales” se infiltren en las filas de los legisladores y defiendan la tecnología como la conocemos hoy en día (aunque quién sabe, para ese entonces las cosas podrían ser muy distintas).

Hola, soy Rupert Murdoch. Fui dueño de MySpace y ahora estoy a favor de la SOPA

Hola, soy Rupert Murdoch. Fui dueño de MySpace y ahora estoy a favor de la SOPA

La siguiente infografía, creada por AmericanCensorship.org, explica también cuáles son las implicaciones de esta ley y por qué sería perjudicial para la innovación, la economía y el desarrollo.

La lista de empresas que han declarado abiertamente su apoyo a SOPA es la siguiente:

  • 60 Plus Association
  • ABCAlliance for Safe Online Pharmacies (ASOP)
  • American Federation of Musicians (AFM)
  • American Federation of Television and Radio Artists (AFTRA)
  • American Society of Composers, Authors and Publishers (ASCAP)
  • Americans for Tax ReformArtists and Allied Crafts of the United States
  • Association of American Publishers (AAP)
  • Association of State Criminal Investigative Agencies
  • Association of Talent Agents (ATA)
  • Baker & Hostetler LLPBeachbody, LLC
  • BMI
  • BMG Chrysalis
  • Building and Construction Trades Department
  • Capitol Records Nashville
  • CBS
  • Cengage Learning
  • Christian Music Trade Association
  • Church Music Publishers’ Association
  • Coalition Against Online Video Piracy (CAOVP)
  • Comcast/NBCUniversal
  • Concerned Women for America (CWA)
  • Congressional Fire Services Institute
  • Copyhype
  • Copyright Alliance
  • Coty, Inc.Council of Better Business Bureaus (CBBB)
  • Council of State Governments
  • Country Music Association
  • Country Music Television
  • Covington & Burling LLP
  • Cowan, DeBaets, Abrahams & Sheppard LLP
  • Cowan, Liebowitz & Latman, P.C.
  • Creative America
  • Davis Wright Tremaine LLP
  • Deluxe
  • Directors Guild of America (DGA)
  • Disney Publishing Worldwide, Inc.
  • Elsevier
  • EMI Christian Music Group
  • EMI Music Publishing
  • ESPN
  • Estée Lauder Companies
  • Fraternal Order of Police (FOP)
  • Go Daddy
  • Gospel Music Association
  • Graphic Artists Guild
  • Hachette Book Group
  • HarperCollins Publishers Worldwide, Inc.
  • HyperionIndependent Film & Television Alliance (IFTA)
  • International Alliance of Theatrical and Stage Employees (IATSE)
  • International AntiCounterfeiting Coalition (IACC)
  • International Brotherhood of Electrical Workers (IBEW)
  • International Brotherhood of Teamsters (IBT)
  • International Trademark Association (INTA)
  • International Union of Police Associations
  • Irell & Manella LLP
  • Jenner & Block LLP
  • Kelley Drye & Warren LLP
  • Kendall Brill & Klieger LLP
  • Kinsella Weitzman Iser Kump & Aldisert LLP
  • L’Oreal
  • Lathrop & Gage LLP
  • Loeb & Loeb LLP
  • Lost Highway Records
  • Macmillan
  • Major County Sheriffs
  • Major League Baseball
  • Majority City Chiefs
  • Marvel Entertainment, LLC
  • MasterCard Worldwide
  • MCA Records
  • McGraw-Hill Education
  • Mercury Nashville
  • Minor League Baseball (MiLB)
  • Minority Media & Telecom Council (MMTC)
  • Mitchell Silberberg & Knupp LLP
  • Morrison & Foerster LLP
  • Motion Picture Association of America (MPAA)
  • Moving Picture Technicians
  • MPA – The Association of Magazine Media
  • National Association of Manufacturers (NAM)
  • National Association of Prosecutor Coordinators
  • National Association of State Chief Information Officers
  • National Cable & Telecommunications Association (NCTA)
  • National Center for Victims of Crime
  • National Crime Justice Association
  • National District Attorneys Association
  • National Domestic Preparedness Coalition
  • National Football League
  • National Governors Association, Economic Development and Commerce Committee
  • National League of Cities
  • National Narcotics Offers’ Associations’ Coalition
  • National Sheriffs
  • Association (NSA)
  • National Songwriters Association
  • National Troopers Coalition
  • News Corporation
  • Patterson Belknap Webb & Tyler LLP
  • Pearson Education
  • Penguin Group (USA), Inc.
  • Pharmaceutical Research and Manufacturers of America (PhRMA)
  • Phillips Nizer, LLPPfizer, Inc.
  • Proskauer Rose LLP
  • Provident Music Group
  • Random House
  • Raulet Property Partners
  • Republic Nashville
  • Revlon
  • Robins, Kaplan, Miller & Ciresi LLPScholastic, Inc.Screen Actors Guild (SAG)
  • Shearman & Sterling LLP
  • Showdog Universal Music
  • Simpson Thacher & Bartlett LLP
  • Skadden, Arps, Slate, Meagher & Flom LLP
  • Sony/ATV Music Publishing
  • Sony Music Entertainment
  • Sony Music Nashville
  • State International Development Organization (SIDO)
  • The National Association of Theatre Owners (NATO)
  • The Perseus Books Groups
  • The United States Conference of Mayors
  • Tiffany & Co.
  • Time Warner
  • 4Ultimate Fighting Championship (UFC)
  • UMG Publishing Group Nashville
  • United States Chamber of Commerce
  • United States Tennis Association
  • Universal Music
  • Universal Music Publishing Group
  • Viacom
  • Visa, Inc.
  • W.W. Norton & Company
  • Warner Music Group
  • Warner Music Nashville
  • White & Case LLP
  • Wolters Kluewer Health
  • Word Entertainment

ACTUALIZACIÓN: Go Daddy (la empresa más grande de EUA que renta servidores y nombres de dominios) acaba de retractar su apoyo a SOPA, después de la constante presión de sus clientes de mudarse a otros proveedores de host. Entre sus clientes más grandes estaba Wikipedia, FAILBlog y KnowYourMeme.

Dec 24

Migrando páginas web ASP.NET de Windows a Linux

¿Recuerdan una entrada titulada “Migrando una página web ASP.NET de Windows a Linux“? Esta entrada es como una continuación de aquella así que si esta interesado en el tema tal vez prefiera leer esa primero a modo de antecedentes comenzare por relatar que tuve que migrar varias páginas web hechas en ASP.NET en Windows con NetFramework y servidas mediante IIS hacia servidores Linux con Mono y servirlas mediante Apache + Mod mono.

En el principio del proyecto original hace años se intento pero Apache pero en ese entonces no podía servir páginas ASP.NET por si mismo (aun no puede) y no existía algún complemento como Mod mono y aunque Mono tenia su propio servidor llamado XSP este no era lo suficientemente estable para soportar la carga de trabajo de una empresa como esta, de hecho aun no lo es todavia, y por eso ahora usamos Mod Mono.

Usando SharpDevelop en lugar de Visual Studio para probar las aplicaciones con Mono y XSP previamente a probar en los servidores Linux se pudo afinar las instrucciones y entonces si pasar a ambientes más reales donde solo que hubo que ajustar algunas características de seguridad que resultaron más altas que en Windows y entonces vino el problema. Parecía no haber poder humano que hiciera que los caracteres especiales, ñ y letras acentuadas se vieran correctamente.

La base de datos. Muchos trabajamos con bases de datos PostGreSQL y estas suelen ser creadas por default (desconozco si en algunas versiones pone alguna codificación por default más avanzada) con codificación (encoding) SQL_ASCII, que según la documentación de PostGreSQL con SQL_ASCII el servidor interpretara los valores 0 al 127 del estándar ASCII, así que más que una declaración de que juego de caracteres usar es una orden de ignorar la codificación lo que puede causar problemas cuando se usen caracteres no ASCII como letras acentuadas, la ñ o símbolos. Debido a esto de ser posible hay que tener cuidado de definir desde el principio la base de datos con un juego de caracteres, de preferencia UTF8, que es UNICODE porque es apto para todos los idiomas, y esto es importante independientemente del tipo de tecnología de su base de datos que ustedes utilicen.

Seguramente su manejador de base de datos tendrá alguna opción para consultar el juego de caracteres de su base de datos pero si no lo encuentran, en PostGreSQL pueden ver la codificación de su base de datos con la siguiente instrucción:

SELECT encoding FROM pg_database where datname='[nombre de la base de datos]';

Esto arrojara un número que puede traducirse así, por poner ejemplos de encodings comunes, aunque esta tabla es solo una muestra muy limitada.

0 SQL_ASCII
6 UTF8 (UNICODE)
8 LATIN1
16 LATIN9 (ISO 8859-15)

La codificación de la base de datos también puede hacerse a base de datos ya creadas actualizando (Update) el campo “encoding” de “pg_database” que consultamos con la instrucción anterior pero esto no afecta de inmediato y “automagicamente” a toda la información previamente guardada en las tablas de la base de datos, eso lo tendremos que ajustar por nuestros propios medios. Además de que las conexiones abiertas antes del cambio no se verán afectadas, para que tome efecto deberán ser cerradas y volver a establecer la conexión para que se conecten usando el nuevo juego de caracteres, y dependiendo del tipo de cambio de encoding en las consultas podría haber problemas al tratar de leer caracteres que no existen en un juegos de caracteres pero si en el otro o que en ambos encodings un mismo código represente caracteres diferentes y eso altere nuestra información; son cosas a tomar en cuenta.

Lo mejor, de ser posible es empezar la base de datos con el encoding adecuado y grabarle los datos desde un respaldo, si se pasa de SQL_ASCII a un encoding mayor como UTF8, Latin1 o Latin9 no debería haber problemas… en teoría, en la practica ya sabemos como son las cosas.

La codificación de la base de datos

La codificación de la base de datos

ODBC y la conexión a la base de datos. Aunque los datos estén correctamente guardados en la base de datos estos no vienen solos a nuestras aplicaciones si no que necesitamos conectarnos y la mayoría de las veces lo hacemos usando un ODBC. No creo que halla necesidad de explicar eso pero si de recordar o advertir que hay ODBC ANSI y los hay UNICODE y tengo experiencias de que si consultas una base de datos con caracteres UNICODE usando una conexión ANSI los caracteres especiales no llegan bien sino que llegan símbolos de interrogación (?) y como ya vienen así para nuestras aplicaciones será imposible distinguir que símbolo era originalmente y eso será un gran problema. Los ODBC ANSI funcionan de maravilla con bases de datos SQL_ASCII pero si van a usar una con UNICODE asegúrense de que el ODBC valla a la par.

Además recuerden o sepan que en la cadena de conexión podemos dar indicaciones sobre la codificación de caracteres a utilizar al conectarnos a la base de datos. Así podemos indicarle si queremos que se conecte usando SQL_ASCII, Latin1, UTF8 o lo que sea que nuestra base de datos soporte.

DRIVER={[ODBC]};Server=[IP];Encoding=[Encoding];DATABASE=[DB];UID=[Usuario];PWD=[contraseña];

* Nota extra para desarrolladores en .NET: Ver tutorial para conectarse a bases de datos PostGreSQL sin utilizar ODBC.

Consultando la base de datos. Si no podemos controlar la codificación de caracteres en la base de datos o solo vamos a hacer unos pocos querys ocasionales que no ameriten tanto esfuerzo pero aun así necesitemos el texto consultado a la base de datos en un encoding especifico podemos recurrir a indicarlo dentro de la instrucción de consulta, por ejemplo con la función convert de SQL de la siguiente manera:

SELECT convert( 'texto', 'SQL_ASCII', 'UTF8')

El código anterior convierte el primer parámetro, ‘texto’ de su codificación original a UTF8.

La codificación de caracteres de las páginas web. Los navegadores web traducen el código de la página en algo visible al usuario y el texto también debe ser interpretado y para eso también manejan los estándares de codificación de caracteres que ya mencionamos antes como podemos ver en la imagen a continuación.

La mayoría de los navegadores te dejan elegir un juego de caracteres por default o ellos mismos lo ponen pero también tienen la capacidad de detectar el juego de caracteres usado por la página para mostrar correctamente el contenido ¿Y cómo es que las páginas le dicen al navegador cual es el estándar que deben usar? Usando una cabecera especial en su código fuente.

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>

Aquí estamos indicando que el texto en la página es UTF8 y el browser así lo interpretará así que tómenlo en cuenta.

* Nota extra para desarrolladores en .NET: En el archivo Web.config de nuestras aplicaciones web podemos indicar explicitamente más detalles sobre el idioma de nuestra página agregando las siguientes configuraciones que ajustan el contenido de la página al formato regional del idioma y país además de en los caracteres especiales también en cosas como las fechas, los signos y formatos de moneda y cosas así.

<globalization
requestEncoding=”utf-8″
responseEncoding=”utf-8″
fileEncoding=”utf-8″
uiCulture=”es-MX”
culture=”es-MX”
/>

Con lo anterior debería de bastar pero si además desean indicarle al compilador cual es el encoding que debe reconocer cuando genere su dll o ejecutable pueden hacerlo así, aunque en lo personal a mi me parece ya exagerar un poquito pero no esta demás eliminar los posibles cabos sueltos ¿verdad?

<compilation defaultLanguage=”c#” debug=”true”>
<compilers>
<compiler language=”cs;csharp”
extension=”.cs”
type=”Microsoft.CSharp.CSharpCodeProvider,System”
compilerOptions=”/codepage:utf8″ />
</compilers>
</compilation>

Y hablando de no dejar cabos sueltos, queda un ultimo punto que comentar que si bien no es exactamente el mismo tema de conservar información compatible entre sistemas y plataformas si puede ser un complemento para la parte visual de nuestras aplicaciones web.

HTML. El HTML no es un lenguaje de programación si no uno más limitado para la estructuración y formato de las páginas web donde indicamos donde va cada elemento en pantalla y como se debe de ver, y tiene sus limitaciones. Para HTML la ñ o la á no existen pero si en el código de tu página…

Para ver esto en pantalla… debes poner
á &aacute;
é &eacute;
í &iacute;
ó &oacute;
ú &uacute;
Á &Aacute;
É &Eacute;
Í &Iacute;
Ó &Oacute;
Ú &Uacute;
ñ &ntilde;
Ñ &Ntilde;
ü &uuml;
Ü &Uuml;

Claro, los caracteres arriba mencionados solo son unos pocos, y cambiarlos todos manualmente es tedioso pero podríamos hacer funciones para automatizar el cambio o mejor aún, aprovechar funciones ya incluidas en los lenguajes de programación, por ejemplo en C# tenemos la función HtmlEncode que reemplaza en una cadena de caracteres los caracteres que tienen algún equivalente en código HTML de modo que la cadena resultante donde se han reemplazado sea aceptada y bien interpretada por los navegadores, hasta cambia los saltos de linea por su código HTML.

Server.HtmlEncode(string);

En caso de usar PHP también tenemos un par de funciones que pueden hacer un trabajo similar. htmlspecialchars(string) y htmlentities(string) son algo “parecido pero diferente”, pues estas funciones convierten ciertos caracteres que tienen un significado especial en HTML y deben ser representados por entidades HTML si se desea preservar su significado para que se muestren así en pantalla en lugar de ser tomados por código fuente, descuadren la página y no se vean. Estas funciones devuelven una cadena de caracteres con algunas de estas conversiones realizadas. htmlspecialchars solo afecta a los caracteres más útiles para la programación web.

Las traducciones realizadas son:

  • ‘&’ (ampersand) se convierte en ‘&amp;’
  • ‘”‘ (comillas dobles) se convierten en ‘&quot;’
  • “‘” (comilla simple) se convierte en ”’
  • ‘<’ (menor que) se convierte en ‘&lt;’
  • ‘>’ (mayor que) se convierte en ‘&gt;’

En cambio se usa htmlentities si se requieren traducir todas las entidades de caracteres HTML. Ambas funciones son útiles para prevenir que texto suministrado por el usuario, un archivo o desde la base de datos contenga código HTML.

¿Algo más? Por ultimo recordarles que si su página además usa JavaScript para mostrar algo en pantalla consideren que también maneja códigos para representar los caracteres especiales y que no son iguales que los de HTML.

Para ver esto en pantalla… debes poner
á á
é é
í í
ó ó
ú ú
ñ ñ

Para que lo tomen en cuenta si de repente en algún control dinámico les aparece un carácter extraño.

Y bueno, con eso finalizamos de revisar esta serie de puntos a considerar al desarrollar una página web lo más universal posible.

Dec 24

Npgsql. Conectarse a BD PostGreSQL sin usar ODBC

Como sabrán .NET es un Framework de programación que en teoría pretende ser independiente de la plataforma y facilitar el desarrollo aunque en la practica esa portabilidad es un tanto cuanto artificial y depende del proyecto Mono para funcionar en más plataformas además de Windows, pero al menos esta estandarizado y permite crear aplicaciones multiplataforma aunque con algunas restricciones.

Npgsql es un .Net Data Provider (Proveedor de Datos) independiente de NET o Mono que permite a estos establecer conexiones a bases de datos PostGreSQL que son tan comunes. Así Npgsql es una alternativa a los ODBC para cuando no tenemos el control de estos o no nos dan los resultados esperados, y Npgsql para el desarrollador resulta muy similar en uso a ODBC.

¿Cómo utilizarlo?

Podemos descargar la ultima versión desde la página oficial y agregarlas a nuestro proyecto con facilidad copiando la libreria Npgsql.dll en el directorio de la aplicación (o en otro directorio si ha configurado Path to Private Components).

En aplicaciones web ASP.NET y Web Services se debe alojar Npgsql.dll y Mono.Security.dll en la carpeta bin de la aplicación.

Luego agregamos a nuestro sistema como referencia las .dll antes mencionadas y ya podremos usarlas en nuestro código.

Donde las usemos hay que agregar los espacios de nombres Data y Npgsql. Aquí dejo un mínimo ejemplo de la sintaxis.

using System.Data;
using Npgsql;

// Establecer la conexión a base de datos
NpgsqlConnection conn = new NpgsqlConnection("[cadena de conexion]");
// Abrir la conexion
conn.Open();
// Indicar una instrucción a la base de datos
NpgsqlCommand Command = new NpgsqlCommand("[instruccion SQL]", conn);
// Ejecutar la instrucción SQL
Command.ExecuteNonQuery();
// Cerrar la conexión
conn.Close();

Cómo pueden ver es idéntico al uso de conexiones por ODBC, pero ya no dependemos del ODBC instalado en la PC donde nuestra aplicación sea ejecutada. Prácticamente es cambiar todo donde diga ODBC por Npgsql, por ejemplo un OBDCDataReader se reemplaza por NpgsqlDataReader.

La cadena de conexión que usaremos para Npgsql es estandar. Yo la utilizo así:

Server=[IP];Port=[Puerto];Database=[DB];User Id=[Usuario];Password=[Contraseña];

En las versiones más recientes de Npgsql la codificación es siempre UNICODE por lo que el atributo encoding ha quedado obsoleto, pero en caso necesario, las versiones más antiguas si manejan encoding SQL_ASCII o UNICODE según se indique en la cadena de conexión.

Y así es como logramos conectarnos a una base de datos PostGreSQL desde Mono sin depender de ODBC.

Dec 13

JavaScript: Cerrar un popup desde la página madre

Típico, que estas programando una página web y necesitas una ventana popup para apoyar alguna función de la página principal, poner alguna advertencia o que el usuario seleccione algún dato que será pasado a la página principal… cosas comunes.

Pero esta vez me tope con un caso un poco diferente, resulta que necesitaba que fuese la página madre la que después de terminar un proceso propio cerrara al popup y… pues instrucciones para manipular a la página madre desde el popup hay muchas pero en sentido inverso no tantas. La forma más sencilla es apoyándose en una variable para poder mantener el control del popup y manipularlo de la siguiente manera usando JavaScript.

Si quieren probar un ejemplo sencillo con un par de páginas simples en su computadora bajen este ejemplo antes de continuar: DESCARGAR EJEMPLO.

Dentro del archivo, La página principal es javascript.html así que ábrala en su navegador porque será la pagina donde probaremos abrir y cerrar un popup y a leer un dato en la página principal desde un popup para lograr un efecto en esta página hija. Se verá algo parecido a la imagen de al lado.

La otra, javascript2.html será un popup llamado desde la primera página y lo usaremos para que lea un dato en que escribamos en la página madre.

Así vemos como un evento puede abrir el popup y el otro lo cierra, todo desde la misma ventana madre. Este es solo un ejemplo para que usted estimado lector tenga total control del proceso pero en cuestiones más practicas como la que yo comentaba, al poder cerrar el popup desde una función en la ventana madre puede invocarse desde algún otro método automático en el momento preciso para mi sin necesidad de intervención humana.

El código para las funciones de abrir y cerrar popup usadas en estos botones -y para obtener la resolución del monitor y centrar el popup en la pantalla como bonus- de ejemplo es el siguiente:

var popup = null; // Variable compartida entre las funciones

function abrir()
{
	var height = (screen.height-66)/2;
	var width = (screen.width-66)/2;
	popup = window.open('loading.gif', 'popup',
		'width=66,height=66,top='+height+',left='
		+width+',resizable=no,scrollbars=no');
}

function cerrar()
{
	popup.close(); // Cerrar la ventana
}

INCONVENIENTES: Pero hay un inconveniente con este método, resulta que solo funciona mientras la página original no se recargue, al hacer un postback se pierde el control del popup y ya no puede cerrarse desde la página madre lo cual reduce los escenarios donde este uso del javascript nos es útil, entonces hay que hacerle un ajuste extra para poder hacer que el popup se cierre cuando lo necesitamos.

Para lidiar con ese efecto podríamos dar alguna instrucción desde la página original… si supiera cual o como, si alguno sabe por favor dígamelo, y como no pude entonces podemos probar el camino inverso accediendo desde el popup a la página madre en busca de alguna señal que indique cuando debe cerrarse mediante window.opener que nos da la posibilidad de leer campos en la ventana principal. El código interesante de ese popup es que manda llamar a una función que lee cierto campo en la ventana principal y si encuentra un dato especifico se cierra así mismo. Si no lo encuentra entonces algunos segundos después va a volver a buscar. El código de la función sigue los principios de este ejemplo:

function timer()
{
	// Leer el campo en la página madre
	var caracter = opener.document.forms[0].texto.value;

	if (caracter.length &gt; 0) // Si hay algo
	{
		alert('En la ventana madre escribio esto: '
		+ caracter);
		window.close(); // Cerrar este popup
	}
	else // Si no hay nada
	{
		alert('Escriba en la ventana antes de 5 segundos.');
		setTimeout(timer, 5000); // buscar en 5 segundos
	}
}

La idea es que setTimeout([nombre de la función], [tiempo en milisegundos]); nos permite buscar algún dato o variable en la página madre que nos va a indicar que ya es momento de que el popup se cierre, y como no lo puedo cerrar desde la página principal simplemente le dejamos una señal para que se cierre a si mismo. Para la versión de producción mía en lugar de usar un botón mejor invoco la función desde el metodo onload del body de la página, cuestión de adaptarse.

Nov 17

Proceso automatizado

Alrededor del año 2500, la humanidad descubrio un problema computacional que “debe” ser resuelto. La única dificultad es que el problema es NP-completo y tomaria cientos de años incluso con la más reciente tecnología opticobiologica disponible. El mejor cientifico de computación se puso a pensar en alguna solución.

Con gran consternación, una mujer parte del personal le conto a su esposo al respecto. Solo hay una solución, el dijo. Recuerda fisica 103, fisica moderna, relatividad general y todo. Ella replico ¿Qué tiene que ver eso con resolver un problema de computo?

¿Recuerdas la paradoja de los gemelos?

Después de unos minutos, ella dijo, podria poner la computadora en una maquina muy rapida y para la computadora solo pasarian unos minutos pero eso es exactamente lo contrario a lo que queremos… ¡Por supuesto! Dejemos la computadora aquí, y ¡Aceleremos la tierra!

El problema fue tan importante como para hacer exactamente eso. Entonces cuando la tierra regreso, ellos se encontraron con la siguiente respuesta:

IEH032 Error in JOB Control Card.

PD: No se la fuente de ese texto, me lo dijo el Fortune al iniciar sesión en un servidor Linux.

Nov 16

Migrando una página web ASP.NET de Windows a Linux

Hola estimad@s lectoras. Aquí esta Gnoblis de nuevo aburriéndolos como ostras con una entrada que se acerca un poco a temas de programación que solo a el interesan como documentación de las cosas que hace y le parece interesante guardar como auto-consulta a futuro. Si a alguien también le sirve y/o interesa es puro daño colateral, así que discúlpenme por no poner un tutorial claro con ejemplos y todos los enlaces.

¿Recuerdan que les dije que la semana pasada fue pesada? Si, pero al menos hubo una cosa interesante. Pasar páginas construidas hace años a servidores Linux. En su tiempo Mono estaba muy verde y se hicieron en Windows pero les llego su hora. Una de las ventajas que se dicen de .NET es su portabilidad semi-artificial porque es dependiente del Proyecto Mono, y sin entrar en detalles sobre las ventajas de otras tecnologías como PHP o JAVA -qué indudablemente se que tienen y he aprovechado en algunos desarrollos, como todo lo que ya esta hecho en PHP y lo combinable que es cuando necesitas controles personalizados- por ejemplo o mantenerse puro e incontaminado de todo contacto con Microsoft y cosas así. Esas son otras historias y aquí solo me dispongo a hablar de una experiencia pasando algo hecho y funcional en lugar de empezar de cero algo nativo o mejor, aunque también me parece justo reconocer que con .NET hicieron algo bastante mejor que con las tecnologías sueltas que tenían antes como ASP o Visual Basic pero eso también es otra historia.

Centrándome en el tema, tenemos sitios web construidos con ASP.NET y C# como base aderezada de JavaScript y hasta algún ActiveX (que solo funcionan en el terrible IE, lo se, pero en un ambiente cerrado, interno y sin Internet puede resultar menos riesgoso) por ahí ¿Cómo habría de comportarse eso corriendo en Linux? Esa era la pregunta de una migración teóricamente posible pero de esas que podemos imaginar que nunca fluyen sin obstáculos pero el caso es que no sean irrazonablemente difíciles.

En Windows el entorno funciona nativamente combinando IIS + NetFramework. En Linux tenemos como opciones a Mono en lugar del NetFramework y en lugar de IIS tenemos a XSP como opción más sencilla pero de menor capacidad así que para probar estuvo bien pero no para confiar en eso para un ambiente productivo real así que la opción fue el siempre confiable servidor Apache complementado con Mod mono.

De Mono ya habré hablado antes en algunas entradas, y mod_mono es un módulo para que Apache pueda servir páginas ASP.NET usando a Mono, y funcional en Linux. No voy a explicar aquí como montar un servidor Apache, supongo que a quien le interese el tema debe manejarse lo suficiente para hacerlo o saber donde buscar… creo. Y además del Apache hay que instalar el módulo de Mono libapache2-mod-mono y la interfaz entre Mono y servidor mono-apache-server.

La página oficial de Mod mono es www.mono-project.com/Mod_mono, hay le buscan en la sección de descargas del sitio.

Bueno, una vez que tenemos montado nuestro server Linux con Apache y Mod mono podemos pasarle nuestra aplicación y empezar a probar, usando de preferencia la versión 2 de ASP.NET.

Antes de pasar la versión de la página compile y revise el código usando SharpDevelop y Mono 2.0 para asegurarme de ajustar lo que necesitara ajustar para mayor seguridad, pues en mi caso encontre que dice que la instrucción “ConfigurationSettings.AppSettings.Get” esta obsoleta. Actualizar eso fue fácil.

Invalid postback or callback argument

Lo que si requirió un poco más de investigación fue este error.

Invalid postback or callback argument. Event validation is enabled using in configuration or in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Lo que en lengua común significa que hay una validación de seguridad en el Framework 2 que en 1.1 no existía y que revisa cuando se carga la página y si hubo un cambio sospecha que algo malicioso ocurrió del lado del cliente como un intento de ataque de inyección de código y que por eso los datos estan alterados, y por motivos de seguridad detiene todo y da ese aviso. Lo mejor es corregir el problema en lugar de desactivarlo como esta la alternativa pero en mi caso lo que ocurre es que tengo unos scripts del lado del cliente que cambian el valor de los controles en base a ciertas cosas y eso es lo que disparaba la validación. Así que mi solución paso por poner en la cabecera de la página afectada EnableEventValidation=”false” para que solo en esa página no hiciera la validación.

 <%@ Page EnableEventValidation="false" ... %>

En mi caso lo hice así porque este sistema trabaja en un ambiento interno y cerrado, con scripts controlados por nosotros y en un par de páginas bien identificadas. En caso de requerir que toda la aplicación funciones así es mejor ponerlo en el web.config para todo el proyecto.

<system.web>
	<pages enableEventValidation="false"/>
</system.web>

Bueno, con eso funciono la página excepto por los acentos que en lugar de poner la letra acentuada ponía un cuadrito, pero revisando las configuraciones regionales se arregla.

Oct 06

Saber el número de serie de disco duro SATA con C#

Esto resulto un poco más difícil que la entrada anterior sobre la dirección MAC de la PC, pues hay múltiples ejemplos de código para obtener el número de serie del disco duro pero solo funcionan con IDE y no para SATA y ¿Quien tiene un PC con disco duro IDE en estos días? Yo tengo uno pero no me considero un estándar representativo de la sociedad.

La verdad, aquí hice trampa. Por que parece ser que WMI por si mismo no tiene la capacidad de obtener el número de serie de un disco SATA y al menos yo no encontré una alternativa viable así que utilice un código en C++ para llegar a un nivel más bajo de lo que pude con C# y así obtener la información, unmanaged code o código no administrado le llaman al uso de códigos así.

WMI significa Windows Management Instrumentation y sirve también para obtener otras cosas como el número de serie de la tarjeta madre por ejemplo, trabajando mediante una instancia de ManagementObjectSearcher y consultas tipo SQL para obtener una colección de los objetos Win32_BaseBoard. Para eso necesitamos el espacio de nombres System.Management.

Aquí no vamos a ver este método pero creo que ya le di suficientes palabras clave para que busquen en el Google si les interesa saber más.

Regresando a este código que les decía, la parte de C++ que comento no lo programe yo, si no que lo encontré en The Code Project y lo adapte a mis necesidades. Empecemos con esta parte.

Pueden descargar el código fuente y el programa ejemplo original de aquí para tener la dll DriveInfoEx.dll que vamos a necesitar. En esta dll se tienen los métodos necesarios para obtener la información del disco duro que queremos. Hay que agregarla como referencia a nuestro sistema en C# así como también la dll System.Management.dll, que si no la tienes por default para poder usar el espacio de nombres puedes buscarla en C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ si tienes al menos .NET framework 2.

Les dejo aquí una función de muestra de como aprovechar a DriveInfoEx.dll para obtener el número de serie hasta de discos SATA.

public static string getHardDiscInfo()
{
    #region Variables de uso local

    DriveListEx listado = null;
    string informacion = string.Empty;
    ulong capacidad = 0;
    ulong capacidadReal = 0;

    #endregion

    listado = new DriveListEx(); // Inicializar la lista
    // Obtener la informacion de los discos duros
    listado.Load();

    // Revisar si hay informacion de los discos duros
    if (listado != null && listado.Count > 0)
    {
        // Recorrer la lista de discos duros
        foreach (DriveInfoEx disco in listado)
        {
            // Capacidad del disco redondeada a miles
            capacidad = disco.DriveSize/1000000000;
            // Capacidad del disco calculada a 1024
            capacidadReal = disco.DriveSize/1073741824;

            informacion += "Modelo: " + disco.ModelNumber + "\r\n";
            informacion += "N° Revisión: " + disco.RevisionNumber + "\r\n";
            informacion += "N° de Serie: " + disco.SerialNumber + "\r\n";
            informacion += "Capacidad: " + capacidad + "GB\r\n";
            informacion += "Capacidad Real: " + capacidadReal + "GB\r\n";
            informacion += "Tamaño del Buffer: " + disco.BufferSize + "\r\n";
            informacion += "Tipo: " + disco.DriveType + "\r\n\r\n";
        }
    }
    else
    {
        informacion = "No se encontro información de discos duros";
    }

    return informacion;
}

Older posts «