Mostrando las entradas con la etiqueta solución. Mostrar todas las entradas
Mostrando las entradas con la etiqueta solución. Mostrar todas las entradas

2022/03/12

Link hacia Whatsapp

 


¿Quieres crear un link que abra un chat en Whatsapp? Te cuento cómo lo solucioné con HTML.

  • Lo que necesitaba era que en el whatsapp del usuario se abriera un chat hacia cierto número y con un texto prestablecido.
  • Encontré que debía formar un url con un formato similar a https://api.whatsapp.com/send?phone=51999888777&text=Hola
    • El número de teléfono indicado por phone debe incluir el código del país (51 en este ejemplo)
    • El texto indicado por text debe ser url compatible, es decir que se pueda indicar a través del url.
      • Puedes usar una herramienta como URLEncoder para convertir tu texto. Incluso puedes poner emojis! 🙂
      • Si usas javascript para generar el enlace, la función encodeURI hace el trabajo.
  • De ese modo, es posible formar un enlace como este:
<a href="https://api.whatsapp.com/send?phone=51999888777&text=Hola%21%20%F0%9F%91%8D%F0%9F%99%82">Saludar por Whatsapp</a>
  • Cuando el usuario hace clic en el enlace, le aparece un diálogo para permitirle ir a la app whatsapp (si está instalada), donde abrirá el chat correspondiente al número indicado y con el texto indicado pre llenado.

¿Conoces otro modo de hacer esto, o quizás de manera más sencilla? Puedes compartirlo en los comentarios 🙏


Publicado originalmente en AKC Puroguramu

Solución al Vue Router y Vuex descontinuados para Vue2

 


¿Tienes alguna aplicación vue2 que ha dejado de funcionar de pronto? Te cuento cómo solucioné la incompatibilidad que se presentó para vue-router y vuex.

  • Hoy noté que una de las aplicaciones que desarrollé con vue2 estaba caída 🙈.
    • Revisando la consola, noté que no encontraba https://unpkg.com/vue-router@4.0.14/dist/vue-router.js.
    • Ese era el destino final que correspondería al que le indicaba en mi código: //unpkg.com/vue-router/dist/vue-router.js.
      • Cuando se indica así te lleva a la última versión, que al parecer ya no es más vue2 compatible.
  • Al parecer, la versión 4 de vue-router se ha vuelto vue3 compatible por default, así que hay que indicar explícitamente la versión vue2 compatible que uno quiere usar.
  • Pasé a indicar la versión 3 de vue-router y ya funcionó esa parte
    • De //unpkg.com/vue-router/dist/vue-router.js a //unpkg.com/vue-router@3. 👍🙂
  • Luego pase a resolver el issue similar para el caso de vuex.
    • Allí, también tuve tuve que indicar explícitamente la versión vue2 compatible (casualmente también es la 3)
      • De //unpkg.com/vuex a //unpkg.com/vuex@3.
  • En mi caso, estos dos cambios fueron suficientes para que la aplicación volviera a estar operativa. ✌️🙂

¿Has encontrado alguna versión más reciente de estos paquetes que sea vue2 compatible? Puedes compartirlo en los comentarios 🙏


Publicado originalmente en AKC Puroguramu

2017/10/18

La solución imperfecta


¿Por qué el mundo esta lleno de soluciones imperfectas?

Porque la solución depende del contexto.

Digamos que tienes cinco minutos para ordenar la salida de un sistema y un plugin ya listo que lo hace.

El algoritmo hace una ordenación simple tipo burbuja pero cumple con lo que necesitamos.

Si tuvieras un par de horas, quizas podrías hacer desde cero un plugin con el mejor algoritmo de ordenación posible.

Si tuvieras una hora, quizás podrías modificar este plugin y mejorar el algoritmo de ordenación.

Si tuvieras media hora, quizás podrías buscar si alguien más ha hecho ese plugin.

Pero tienes cinco minutos.

Poner este plugin te llevará un minuto, un pequeño test otro minuto, y ya estás gastando tiempo en analizar las alternativas. Alternativas que requieren más tiempo del que dispones. Y todas con un quizás. No existen. Sólo existe este plugin imperfecto, aquí y ahora.

No se trata de usar las respuestas de un libro de texto. Se trata de la vida real, retándote a hacer lo mejor que puedas con lo que tienes disponible en este momento.

Lo eliges. No es la respuesta perfecta, pero es la solución. En este contexto, es la respuesta.

Te gustaría que alguien te comprenda por usar una respuesta no optima.

Ahora te parece tan obvio.

Realizar una solución imperfecta es mejor que una respuesta perfecta que no se puede realizar.

Lo aceptas, y sigues adelante. Quizás en la siguiente iteración la puedas mejorar.

También es un quizás. Pero es es un quizás con algo corriendo.


Imagen de http://news.nationalgeographic.com/content/dam/news/2017/04/27/frog-gallery/01-frog-day-gallery.jpg

2017/01/21

La importancia de solucionar algo

Amazing Grace

A Grace Hopper se le dio el encargo de elaborar el manual de instrucciones de una de las primeras computadoras creadas en los Estados Unidos.

A la Marina, le interesaba averiguar de qué modo podría aprovechar el potencial de la nueva máquina Mark I.

No era común que una mujer perteneciera a la armada, y tampoco tenía los estándares de peso y talla, pero sus habilidades matemáticas le ayudaron a ser admitida y abrirse camino.

Ella propuso organizar bajo nombres más asequibles las rutinas que había coleccionado con su equipo, y un esquema para reutilizarlas con más facilidad y automatizar la generación de las secuencias binarias que eran la forma normal de programar las computadoras en aquella época.

Normalmente, para programar la solución de un problema, había que enfrentarse con el hardware y los interruptores necesarios para implementar el programa. Era como tener que atravesar continuamente una bruma mental para distinguir lo que se quería conseguir.

En cambio, usar un compilador de código tenía la ventaja de permitr pensar con más claridad en el problema que se quería resolver.

Sin embargo, su propuesta fue desechada porque el código binario generado de ese modo era más largo y menos eficiente.

Grace persisitió en ello como un proyecto personal. Desarrollando lo que vendría a ser conocido como lenguaje ensamblador, o Assembler.

Uno de sus amigos, que había estado meses con un equipo tratando de programar la solución de un problema especialmente difícil, logró hacerlo en unas horas usando Assembler.

Poco a poco, el uso del Assembler se fue extendiendo.

Años después, creó COBOL, el primer lenguaje de programación, que permitía expresar un programa en algo parecido a sentencias en inglés.

Menos eficiente pero más eficaz

Hoy en día, prácticamente toda la programación se hace con ayuda de compiladores y los lenguajes de alto nivel que aparecieron luego del COBOL. De ese modo, los problemas no solo se resuelven con más rapidez, sino también con menos errores. Y si los hubiera, son mucho más fáciles de localizar.

La propuesta de Grace de usar lenguajes de más alto nivel para solucionar problemas encontró resistencia en otros programadores que desdeñaban el código binario repetitivo, largo e ineficiente que se producía de ese modo. Ellos podían hacerlo más simple, más elegante, del "modo correcto".

Los programadores que podían programar directamente en binario no eran muchos y quizás se sentían un poco como sumos sacerdotes. Los intermediarios exclusivos entre la gente y las máquinas todopoderosas.

Los lenguajes de alto nivel tuvieron la virtud de hacer la programación de computadoras accesible a más personas.

Sigue siendo cierta la observación de que el código binario producido por los compiladores es más repetitivo, largo y menos eficiente que el que se podría producir directamente. Sin embargo, con la mejora de la velocidad de procesamiento, la programación directa en binario ya es muy poco práctica.

Es más importante llegar primero a la solución de un problema. La eficiencia del resultado se podría ir mejorando luego de eso (finalmente reemplazando código por assembler y luego por binario si el rendimiento fuera algo vital).

Algo hecho es mejor que lo perfecto

¿Qué es mejor, una solución perfecta que tarda tanto que nunca llega, o una solución que funcione?

"Done is better than perfect" es una famosa frase acuñada por la gente de Facebook.

La comunidad hacker tiene además "Primero que funcione, luego optimizas".

Y Donald Knuth, la famosa "La optimización prematura es la raíz de todo lo malo".

No son opiniones. Expresan un hecho, comprobado una y otra vez en la experiencia de los programadores y los equipos de programadores y los proyectos de programación.

Aún así, de cuando en cuando encontrarás a otros programadores o desarrolladores de software insistiendo en buscar la perfección o hacer optimizaciones durante la solución.

Es la optimización mal entendida.

Optimizar algo está bien, pero su momento es después que haya una solución.

Solo puedes mejorar algo que tienes, si no, la optimización es una falacia (y las falacias son peligrosas porque suelen tener ese aire de verdad que hace que uno las acepte si no se anda con cuidado)

Código limpio

A la computadora le da igual si el código está limpio o no.

El código limpio es una optimización orientada a los programadores para facilitar el mantenimiento del programa.

Pero, igual que toda optimización, su momento es después que tengas una solución, no antes.

Hay que disfrutar garabateando con código, esbozando algoritmos, en el proceso de concretar una solución.

Pretender escribir código limpio durante el proceso de solución es tan contraproducente como pretender pintar la versión final de un retrato directamente sobre un lienzo en blanco.

Cómo odio a los haters :-)

Hay programadores que automáticamente tienen actitudes hostiles o de desdén hacia ciertos lenguajes de programación, ciertos frameworks o ciertas librerías.

"PHP es el peor lenguaje de programación jamás inventado"

"Javascript es un lenguaje de juguete que no se puede tomar en serio"

"Todos esos frameworks son basura que complica las cosas"

Pero minimizar lo que nos disgusta no hace que nuestras soluciones sean mejores. De hecho, impide ver las soluciones de otros.

PHP es un lenguaje que ha ayudado mucho a democratizar la programación en Internet. La valla es más baja y mucha más gente puede entrar y cometer errores que hacen sonreir con desdén a ciertos académicos y profesionales. Pero ha permitido que muchas ideas geniales vean la luz. Más de la mitad de los blogs en Internet están hechos en WordPress, que es un administrador de contenidos escrito en PHP. Wikipedia está escrita en PHP. La base de Facebook también estuvo escrita en PHP.

Javascript ha evolucionado. No es solo para hacer efectos especiales en una página web. Permite crear interfaces complejas. Y en el lado del servidor, facilita el desarrollo de soluciones ligeras, asíncronas y sin bloqueos. Paypal usa Javascript en el backend. Hay quienes consideran que actualmente Javascript tiene uno de los más completos ecosistemas de desarrollo web.

Los frameworks son herramientas para resolver problemas. Como un martillo, o una sierra. Puede tomar su tiempo conseguir maestría en su uso. Muchos dedos golpeados, cortes accidentales. Y puede que no sean para todo tipo de problemas. Quizás haya herramientas más sofisticadas, o más ligeras, pero posiblemente te enfrentarás a más problemas si intentas hacer carpintería con una piedra, un cuchillo, o una navaja suiza.

Creo que siempre es más constructivo tratar de ver las buenas partes, usar esas buenas partes y evitar las otras.

También aquí es cuestión de ver el vaso medio lleno.

Referencias

2016/10/31

El mito del mejor software


Hay una historia acerca de un hombre al pie de un farol, buscando sus llaves. Alguien que llega para ayudarle, después de un rato le pregunta si está seguro que las perdió allí. "No, las perdí en la esquina", le contesta, "pero aquí hay más luz".

Un absurdo similar puede ocurrir cuando se elige una tecnología arbitrariamente y no por si contribuye efectivamente al problema que se quiere solucionar.

Cuando alguien se afana en manejar la mejor tecnología, reducir su código y optimizar la carga, simplemente "porque sí", porque es "la forma correcta", en realidad está imitando a aquel hombre. Esmerarse en hacer el mejor software posible es un problema diferente. Pero buscamos ahí porque es un problema donde tenemos más luz.

Nos gusta resolver el problema del mejor software, donde tenemos más luz, que el problema que realmente tenemos que resolver, donde aún está oscuro.

Puedes notar que a muchos programadores les gusta entrar a ese juego de juzgar la virtud de una solución en función de la tecnología usada para construirla.

"¿Con qué lo hicieron?"

Un programador puede tener preferencia por las tecnologías de vanguardia, otro por las super optimizadas, otro por las escalables, etc. Siempre será posible escoger un escenario desfavorable para cualquier tecnología con la que no simpaticemos.

Es una discusión no productiva. Hacer el mejor software no garantiza que se solucione el problema. No es que esté mal buscar la excelencia técnica; simplemente se trata de otro problema.

"¿Funcionó?"

Sería una pregunta más razonable. Una vez que una solución funciona, es cuestión de iterar para llegar a las optimizaciones o solucionar problemas relacionados.

La verdadera tarea no es hacer el mejor software posible sino solucionar un problema.

Hay muchos ejemplos de buenas soluciones hechas con software que se mira por sobre el hombro (Wikipedia, WordPress, Drupal, la base de Facebook, por ejemplo, son hechos con PHP).

Una solución no es buena por el software con que se hace, sino por su oportunidad y relevancia.

Resolución Iterativa de Problemas

Hemos sido educados con un sesgo importante hacia la resolución determinista de problemas.

La forma determinista postula que hay una forma correcta de resolver un problema. Ya sea porque es la más económica, o la más veloz. La solución.

La economía o el tiempo suelen ser los criterios últimos para evaluar una solución.

La forma determinista es como resolvemos los problemas que ya sabemos cómo se resuelven.

Como cuando aprendes a resolver problemas tipo para un exámen de admisión, o los casos de actuación en un protocolo.

¿Has resuelto alguna vez el problema de los dos trenes? Uno parte de A, el otro de B, distante tantos km, a tales velocidades, averiguar a qué hora se cruzan. Un problema con una solución ya conocida. Eso es resolución determinista de un problema. La forma con la que nos han enseñado a pensar. No funciona muy bien para explorar.
La forma iterativa es como realmente resolvemos los problemas cuya solución no conocemos.

Consiste en esbozar diversas alternativas y disparar tentativamente para encontrar alguna que funcione. Una vez que se tiene una línea que llegue al otro lado, se va iterando, corrigiendo la dirección, el apoyo, el material, hasta que poco a poco se tiene un puente que permita cruzar. Una solución.

¿Has jugado Angry Birds? Tienes una honda y varios proyectiles para intentar derrumbar una estructura. Sólo tienes pesos aproximados, alguna idea del viento. ¿Cómo lo resuelves? Lanzando cosas, usando diferentes combinaciones de impulso y ángulo hasta encontrar una respuesta satisfactoria. Eso es resolución iterativa de un problema. Así es como resolvemos las cosas por descubrimiento. Algo que vale la pena aprender a hacer mejor.
La forma iterativa admite muchas soluciones. Cualquiera respuesta que satisfaga la necesidad es una solución. Esta solución puede ser iterada, para optimizarse, para que sea más económica, para que sea replicable o escalable.

La economía o el tiempo pueden ser criterios para evaluar una solución iterativa. Pero sería ingenuo limitarse a ello.

Ya que la solución se va iterando, tiene valor la mantenibilidad; qué tan facil es entender la solución, corregirla y evolucionarla.

En la resolución iterativa de problemas los intentos de optimización prematura tienen el efecto de limitar las opciones disponibles y hacer más complicada la resolución.

Cuando la solución sea muy conocida, se podría usar de modo determinista, como en los libros de texto.

Un problema de los libros de texto es que no te cuentan la forma iterativa en que se se resuelven los problemas.

Cuando las metodologías agiles proponen una forma iterativa de organizar el desarrollo de un proyecto, puede haber una resistencia social (la jerarquía vertical resistiéndose a ser horizontal), y también una resistencia cultural.

Pienso que la resistencia cultural es básicamente el pensamiento determinista resistiéndose a ser iterativo. La gente desconfía de las soluciones iterativas. Básicamente porque no ha sido educada para resolver problemas iterativamente.




2014/11/02

Resolviendo Mac actualizada a Yosemite: Dialogo muy grande


Usando Yosemite (que recientemente instalé, desde Mavericks), encontré que, a veces, al presentarse el diálogo de archivo, los botones aparecían debajo del docker. Para alcanzarlos tenía que ocultar el docker o moverlo a un lado.

Investigando, parece que el problema se presenta cuando uno está en Chrome (donde paso la mayor parte del tiempo ^^). Parece que se trata de un bug del navegador.

Mientras el bug se resuelve, hay un workaround o rodeo: Usar el pequeño botón verde de la esquina superior izquierda de la ventana para maximizarla. Entonces, el diálogo se muestra completo.

Resolviendo Mac actualizada a Yosemite: Inicio estancado

De Mavericks a Yosemite

Recientemente actualicé el sistema de la Mac, de Mavericks a Yosemite.

Fue un proceso largo. Más largo de lo que esperaba. Lo inicié en el trabajo e incluso reinicié la computadora un par de veces a mitad de un proceso porque parecía que no había progreso. Un amigo fue quien me aclaró que era un proceso largo, que tuviera paciencia.

El proceso terminó varias horas después en mi casa.

Primeras impresiones

Yosemite se ve bien, con su efecto de pavonado transparente. Lo iconos del docker, algo más planos, pero con matices. Es un look que me parece más cercano a Ubuntu Linux que al Metro de Microsoft. Antes Mac daba la pauta y los demás la imitaban, ahora, como que no necesariamente.

Problema

Bueno, resulta que un día, la Mac se iba poniendo cada vez más lenta. A pesar de que el monitor de recursos indicara que había memoria. Reinicié y seguí trabajando pero luego de un rato se repitió la situación. Volví a reiniciar y esta vez fue diferente: la barra de progreso que aparece debajo de la manzanita no pasaba de la mitad. Luego de esperar un rato decidí reiniciarla. Hice varios reinicios sin lograr pasar de ese punto.

Investigando en la otra computadora (Windows 7), encontré que los problemas con Yosemite no eran escasos, principalmente para los que habían llegado actualizando desde Mavericks.

Encontré que presionando Command+R luego del sonido que indica el inicio del sistema, se entra en modo de recuperación. Allí, hay un juego de utilidades para restaurar un backup, reinstalar el sistema, buscar ayuda, verificar los discos, etc. También hay un terminal.

Primero, opté por verificar el disco. Se hallaron algunas inconsistencias (habrá sido por mis interrupciones en la actualización?) que luego indiqué corregir. Después, reinicié, pero igual seguía estancado el inicio.

Reinstalando

Volví al modo de recuperación y decidí indicar que reinstalara el sistema. Parecía que la computadora intentaba conectarse a algún lugar y no lo lograba. Insistí, sin resultado. Seguí entonces el consejo de una página, que tenía que ver con la conexión a red. Entré al terminal y ejecuté el par de comandos:

# launchctl unload -w /System/Library/LaunchDaemons/com.apple.discoveryd.plist
# launchctl load -w /System/Library/LaunchDaemons/com.apple.discoveryd.plist

Luego de eso, indiqué reinstalar el sistema y esta vez si conectó y se realizó el proceso. Demoró toda la noche.

La mañana del día siguiente, entré al renovado Yosemite y me fue bien durante todo el día.

Pero hoy, al retomar la computadora, de pronto parecía que los procesos dejaban de responder, incluso el terminal y el monitor de recursos, como antes de la reinstalación. Reinicié la computadora y llegué otra vez al inicio estancado.

Volví al modo de recuperación, pero esta vez fui al terminal y ejecuté el par de comandos:

# launchctl unload -w /System/Library/LaunchDaemons/com.apple.discoveryd.plist
# launchctl load -w /System/Library/LaunchDaemons/com.apple.discoveryd.plist

Luego, al reiniciar, el inicio se realizó normalmente.

Así que, aparentemente, hay un problema con el manejo de los recursos de red. Si tienes un problema similar, ojalá que estos comandos también te ayuden.

Para más información, esta es la página que encontré:

http://osxdaily.com/2014/10/25/fix-wi-fi-problems-os-x-yosemite/

2014/01/23

Kanbiando con Kanban


Hace unos días, en mi trabajo, hicimos una actividad interesante.

Se propuso a los miembros del equipo un problema de programación no muy complejo. Se eligió un lenguaje de programación y una sola computadora, cuya pantalla se reflejaba en un televisor para todos, donde cada uno trataba de avanzar lo que pudiera durante 5 minutos.

Excepto el jefe, que debía mantenerse al margen haciendo intervenciones ocasionales, nadie más que quien estaba en su turno podía hablar, contando a los demás que iba haciendo y por qué lo hacía.

Además podía buscar en Google, y modificar o borrar el código previo.

Se sucedieron varias rondas y paso un par de horas sin que lográramos escribir una solución funcional.

Entendíamos la solución a la que queríamos llegar, y probablemente todos hubieran podido escribirla trabajando solos durante quince minutos o media hora. Pero, por alguna razón, no la lográbamos alcanzar.

Cuando terminó la jornada, me retire, pero el problema continuaba en manos que quienes podían quedarse.

Me sentía frustrado, pero, conforme pasaba el tiempo me iba sintiendo además instruido. Un problema simple y solucionable se había vuelto prácticamente irresoluble debido a las condiciones de trabajo impuestas.

Estas condiciones fueron tales que prácticamente anulaban la comunicación. Eso inhabilitaba el trabajo en equipo. Al menos, él trabajo en equipo usual.

Reflexionando, me di cuenta que, al inicio, nadie asumió el reto como un trabajo en equipo. Cada uno quería, de ser posible, terminar el problema en su turno.

Luego, cuando las primeras rondas iban mostrando que no sería tan fácil, apareció gente que prefirió hacer explícita una estrategia en lugar de programar. Entonces, el trabajo de todos empezó a encauzarse y parecía que se resolvería pronto. Nos estábamos adaptando.

Es allí donde el jefe cambió de pronto las reglas. Dijo que estaba clara la solución y que el reto sería ahora tratar de escribirla una sola persona, desde cero, en 5 minutos.

Además de transformar el problema en una competencia de tipeo, de entrada, eso destruía la comunicación incipiente que había surgido espontáneamente. Fue entonces cuando me retiré.

Camino a casa iba pensando que pasaría si esa prueba se repitiera cada semana. Creo que iniciaríamos sacrificando tiempo de programación para establecer mejor primero un marco de trabajo y luego la estrategia para resolver el problema. Y luego recién empezaríamos a codear.

Me pregunte luego cuántos proyectos habrá así en la vida real. Con gente competente y sin embargo sin avances significativos. Y todo por una organización contraproducente.

Deming, el padre de la mejora continua de la calidad, decía que el 95% del resultado éxito o fracaso se debía a la organización y solo 5% a la gente.

Pero no es obvio. Mucha gente tiende a culpar a la gente y lanzarse a tomar medidas correctivas en ese sentido. Llamadas de atención, recorte de privilegios, castigos, en el peor de los casos. Capacitaciones y coaching en el mejor de los casos.

Pero, si la causa es la organización, no se solucionará nada. A menos que se empondere a la gente para que la pueda mejorar.


Un par de días después, asistimos a un seminario sobre Kanban (la metodología de visualización de flujo de trabajo inspirada en las prácticas de Toyota).

Resulta que es una herramienta muy simple y poderosa para visualizar el estado del flujo de trabajo en una organización. Y para hacer evidentes sus virtudes y defectos.

Siendo evidentes los defectos, es más fácil proponer cambios de políticas e ir gradualmente cambiando la organización.

Yo pensaba que venía utilizando Kanban, al menos en mis proyectos personales. Descubrí que lo estaba haciendo de modo incompleto. Para que Kanban haga su magia, es necesario hacer hacer explícitos los límites de trabajo en progreso (WIP, por sus siglas en inglés) y las políticas de aceptación de tareas.

Ahora estoy leyendo y aprendiendo más al respecto. Un libro que me parece sumamente útil y fácil de leer es "Scrum y Kanban: Usando lo mejor de ambos", de Henrik Knigerg y Mattias Skarin.

Estoy viendo que podría usarlo también para mejorar mi forma de estudiar... y hasta para procesar con más eficacia las montones de cosas que quiero hacer en la vida (Personal Kanban)

Una gran virtud de Kanban es que te permite iniciar como eres ahora, con lo que tienes ahora.

Viva Kanban \(^_^)/

2013/10/29

Solucionando problema vista dinámica en blogger

Puede ser que al usar la plantilla de vista dinámica en blogger, hayas notado que el fondo ya no aparece, o que la mayoría de imágenes no se ha cargado.

Esto se debería a que blogger colocó un script para prevenir que la carga de una página demorara demasiado.

Sin embargo, el tiempo asignado por default es muy poco. Y por eso paginas que antes cargaban bien ahora aparecen con aspecto tristón.

Para solucionarlo, ir al administrador del blog, entrar a Plantilla, Editar HTML y buscar al final del documento u código similar al siguiente:

<script language="javascript" type="text/javascript">
  setTimeout(function() {
    blogger.ui().configure().view();
  }, 1000);
</script>

Observar que he cambiado el 0 que estaba por 1000 milisegundos (1 segundo).

Guardar la plantilla y ver la mejora en la carga.

2013/08/27

Resolviendo el virus que crea acceso directo intermediario en memorias y discos portátiles

En días pasados, conecté mi disco duro portátil en una computadora y noté que todos los archivos desaparecían de su directorio raíz y en su lugar aparecía un acceso directo.

Haciendo click en el acceso, se podía acceder a los archivos. Era como si hubiera aparecido un nivel más.

Viendo en la ruta mostrada por el navegador de archivos, aparecía un directorio de nombre vacío conteniendo todo lo demás.

En algunas computadoras con antivirus, aparecía una alerta al intentar ejecutar el acceso.

Buscando en Internet no encontré ninguna referencia al problema.

Felizmente, revisando un poco el disco, encontré que era posible deshacer el cambio manualmente. Así que aquí está el procedimiento por si ayuda a alguien más (ayer tuve el mismo problema luego de usar mi usb en en una computadora pública):

  • Realizar el procedimiento en una computadora limpia, con antivirus. Es decir que no haya ocasionado el problema que describí.
  • En el explorador de archivos, entrar al menú (tecla Alt), y entrar Herramientas, Opciones de Carpeta. Activar ver los archivos ocultos y también ver archivos del sistema (que normalmente están desactivados).
  • Conectar el disco o usb infectado. Podrá ver varios archivos de nombres raros, incluyendo el acceso directo. Pero también uno de nombre aparentemente en blanco.
  • Ingresar a ese directorio de nombre en blanco para verificar que están nuestros archivos.
  • En este punto se pueden hacer varias cosas. Como copiar todos nuestros archivos a otra unidad, formatear el drive infectado y luego copiar otra vez nuestros archivos.
  • Una opción más rápida es eliminar todos los archivos de nombres raros, incluyendo el acceso directo, y dejando sólamente el directorio de nombre en blanco. En el directorio en blanco, también eliminar los archivos raros que notara en su interior (como desktop.ini, en mi caso). Luego, mover todos los archivos del directorio en blanco al directorio raíz. Finalmente, eliminar el directorio en blanco.
    Son más pasos, pero mover archivos consume menos tiempo que copiarlos a otro drive y traerlos de vuelta.

2013/05/02

Resuelto Problema con Delta Search

Resuelto Problema con Delta Search

Al hacer una instalación, me precipité e hice click en OK antes de leer que estaba aceptando instalar Delta Search Toolbar.

Cuando se instala, reemplaza a la máquina de búsqueda por default de los navegadores.

En el Panel de Control, Desinstalar Programas, se puede encontrar el item Delta Search y desinstalarlos, pero no se realiza una desinstalación completa, como se comprueba al continuar viendo el buscador de delta al iniciar los navegadores.

Resolverlo en IE fue relativamente sencillo. Bastó con entrar a la administración de AddOns, hacer que otra maquina de búsqueda sea la default y eliminar a Delta Search.

En Firefox no encontré que se hubiera metido.

En Chrome, entré a la configuración de motores de búsqueda y lo eliminé. Sin embargo al iniciar el navegador, abría Delta Search en una segunda ventana.
Para resolverlo, seguí el consejo de abrir el archivo %UserProfile%\AppData\Local\Google\Chrome\User Data\Default\Preferences, buscar las ocurrencias de delta-search.com y eliminarlas, o reeemplazarlas por google.com o algo parecido. Sin embargo, el problema persistía.

Finalmente, la solución consistió en usar AdwCleaner. Lo instalé, localizó los problemas (entre ellos la entrada en Preferences) y me dio la opción de corregirlos.

2012/09/24

Resolviendo Soporte Drag para Flexslider

Es posible usar el plugin jquery.event.drag para proveer soporte para drag a Flexslider (es decir que permita arrastrar los sliders con el ratón en el desktop, de modo similar a como permite hacerlo en un dispositivo tipo touch):

- Usando el plugin jquery.event.drag (http://threedubmedia.com/code/event/drag/)
- En jquery.flexslider.js, copio el bloque que da soporte a mousewheel y lo uso como base para el soporte para drag:
...
// MOUSEWHEEL:
if (vars.mousewheel) {
  slider.bind('mousewheel', function(event, delta, deltaX, deltaY) {
    event.preventDefault();
    var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');
    slider.flexAnimate(target, vars.pauseOnAction);
  });
}
// DRAG:
if (vars.drag) {
  slider.bind('drag', function(event, delta) {
    event.preventDefault();
    var target = (delta.deltaX < 0) ? slider.getTarget('next') : slider.getTarget('prev');
    slider.flexAnimate(target, vars.pauseOnAction);
  });
}
...

- También agrego 'drag' en los defaults de flexslider:
...
$.flexslider.defaults = {
  ...
  mousewheel: false,
  drag: false,
...

- Entonces, en el script, se puede usar 'drag: true' cuando se requiera:

$('.flexslider').flexslider({
  animation: 'slide',
  slideshow: false,
  drag: true
});

Referencia:  Request: add mouse dragging for desktop users

2011/10/04

Solucionar puerto 80 ocupado luego de Webmatrix

Resolver esto me ha tomado un tiempo. Espero le resulte de ayuda a alguien.

Luego lo desinstalar Webmatrix (La versión 1.0 me parece, en Windows 7), encontré que XAMPP no podía usar el puerto 80 como antes.

Con la idea de averiguar qué proceso lo ocupa, ejecuto en la consola de comandos, como administrador:

netstat -anb

pero aparece que no hay información disponible sobre el proceso que ocupa el puerto 80.

Usando la utilidad tcpview (de Sysinternals), veo que el proceso es el mismo System, con PID 4.

Hago telnet localhost 80 y veo que quién está atendiendo es Microsoft-HTTPAPI/2.0

Reviso en el Panel de Control, Herramientas Administrativas, Servicios, y desactivo "Servicio Agente remoto para Microsoft Web Deploy 2.0."

Eso era. Al parecer un issue de Webmatrix. Ahora XAMPP ya puede iniciar en el puerto 80.

Referencias

2011/02/08

Quitar Facemood de la búsqueda de Firefox

De algún modo instalé Facemood. De pronto uno se da cuenta de que trata de ser la máquina de búsqueda por default de tus navegadores. Parece un malware.

En Firefox, aunque el plugin de Facemood ya esté desinstalado, deja la barra de direcciones afectada. Si uno tipea allí alguna palabra, en lugar de enviarla a Google, como antes lo tenía configurado, lo envía a la página de Facemood.

Felizmente, encontré un modo de solucionar esto último (probado en Firefox 5, al menos). En la barra de direcciones de Firefox, entrar about:config. Luego de aceptar la advertencia, buscar keyword.URL. Verá que aparece la dirección de la página de Facemood. Reemplazarlo por http://www.google.com/search?q=



Referencia
http://www.flywithmysoul.com/2010/09/remove-facemood-from-firefox.html

2010/11/30

Solucionando problema de visualización en Photoshop CS5

Usando Photoshop CS5 (instalado en Windows 7 con 2 GB de RAM, tarjeta Nvidia Geforce), encontré que al usar CTRL+0 (para hacer que encajara el lienzo en la pantalla) a veces desaparecían los elementos de la imagen.

Para volverlos a ver, lo solucionaba probando otras opciones de zoom, como CTRL+1 o CTRL++ o CTRL+-, o desmarcando/marcando los iconos de visualización de los layers.

Busqué un poco en Google y me pareció que podía deberse a un problema con la tarjeta gráfica. Tal vez no tenía tanta memoria.

Entré al menú de Photoshop, Edit, Preferences, Performance, GPU Settings, Advanced Settings, Mode: Basic (antes estaba en Normal) para que use menos memoria.

Reinicié el programa y ahora funciona bien el zoom con CTRL+0.

2010/09/17

Solucionando los gadgets flash de Windows 7 64b

Ocurre que en Windows 7-64b puede haber algunos problemas para correr gadgets que requieran flash.

Al intentar correrlos aparece un diálogo pidiéndonos permiso para correr Flash, acepto, pero nada parece ocurrir.

La solución la encontré en este post: http://www.sevenforums.com/customization/1499-windows-7-7000-x64-sidebar-flash-player-fix.html#post863632.

Allí, se facilita un parche que, al ser ejecutado, soluciona el problema: http://www.sevenforums.com/attachments/customization/87586d1280161565-windows-7-7000-x64-sidebar-flash-player-fix-windows_64bit_sidebar_flash_support.exe

A mi me ocurrió que el archivo que descargué tenía la extensión .download, en lugar del .exe esperado. Felizmente fue cuestión de renombrarlo y ponerle la extensión correcta para poder ejecutarlo.

Por si acaso, también está disponible en este enlace: http://ifile.it/q456acu/Windows_64bit_Sidebar_Flash_Support.exe

2010/08/13

Personalizando la pantalla 404 en Apache

Cuando se intenta acceder a una dirección que no se reconoce en el site, el webserver responde con una página de Error 404: Document Not Found.

Es posible personalizar esta página para que sea más informativa o, al menos, más agradable de ver que el mensaje en blanco y negro que viene por default.

En un servidor web Apache , es posible hacerlo modificando la página de error 404 del sistema, o indicando en su archivo de configuración el nombre de otra que preparemos para usar en su lugar.

Sin embargo, hay una opción que me parece mas flexible. Es usar un archivo .htaccess en el directorio, indicando cuál será el archivo que se presentara para el error 404.

Esto requiere que Apache tenga activado el módulo mod_rewrite y permita el rewrite en ese directorio. Me parece que suele estar configurado de ese modo en la mayoría de hostings.

Si se tiene acceso a la configuración de Apache (/etc/httpd/conf/httpd.conf en Linux CentOS), debe haber un bloque similar a:


<Directory "/var/www/html/mydir">
    Options Includes Indexes FollowSymLinks MultiViews
    AllowOverride FileInfo
    Order allow,deny
    Allow from all
</Directory&gt


Donde mydir es el directorio donde queremos colocar el .htaccess. También puede ser AllowOverride All, que incluye la opción FileInfo.

La configuración afecta al directorio y todos sus subdirectorios, a menos que para ellos se indique otra cosa.

.htaccess
ErrorDocument 404 /error-docs/HTTP_NOT_FOUND.html

Esto indica la página que se presentará cuando ocurra el error 404. La ruta es relativa a la raíz del servidor web, como en un URL. Por ejemplo, la ruta /error-docs/HTTP_NOT_FOUND.html, puede corresponder al archivo /var/www/html/error-docs/HTTP_NOT_FOUND.html.

En la página 404.html, ya que puede ser llamada desde cualquier ubicación, los url que se usen deben ser absolutos.

Páginas de error

Las principales son:
400: Bad request
Cuando el servidor no entiende la solicitud por un error de sintaxis.
401: Unauthorized
Cuando el usuario no ha sido autenticado para acceder.
403: Forbidden
El servidor no puede ejecutar la solicitud.
404: Not Found
El servidor no puede encontrar la direccion solicitada.
500: Internal Server Error
El servidor ha encontrado una situacion inesperada que no le concretar la respuesta.
Esta es una lista más completa que se podría incluir en el .htaccess:

ErrorDocument 400 /error-docs/HTTP_BAD_REQUEST.html
ErrorDocument 401 /error-docs/HTTP_UNAUTHORIZED.html
ErrorDocument 403 /error-docs/HTTP_FORBIDDEN.html
ErrorDocument 404 /error-docs/HTTP_NOT_FOUND.html
ErrorDocument 405 /error-docs/HTTP_METHOD_NOT_ALLOWED.html
ErrorDocument 408 /error-docs/HTTP_REQUEST_TIME_OUT.html
ErrorDocument 410 /error-docs/HTTP_GONE.html
ErrorDocument 411 /error-docs/HTTP_LENGTH_REQUIRED.html
ErrorDocument 412 /error-docs/HTTP_PRECONDITION_FAILED.html
ErrorDocument 413 /error-docs/HTTP_REQUEST_ENTITY_TOO_LARGE.html
ErrorDocument 414 /error-docs/HTTP_REQUEST_URI_TOO_LARGE.html
ErrorDocument 415 /error-docs/HTTP_UNSUPPORTED_MEDIA_TYPE.html
ErrorDocument 500 /error-docs/HTTP_INTERNAL_SERVER_ERROR.html
ErrorDocument 501 /error-docs/HTTP_NOT_IMPLEMENTED.html
ErrorDocument 502 /error-docs/HTTP_BAD_GATEWAY.html
ErrorDocument 503 /error-docs/HTTP_SERVICE_UNAVAILABLE.html
ErrorDocument 506 /error-docs/HTTP_VARIANT_ALSO_VARIES.html

Notas de compatibilidad

Cuando no se define una página de error, el navegador puede presentar su propia versión personalida. Seguramente lo habra notado. Los mensajes de "Página no existe" son diferentes en IE, Firefox, Chrome, etc.

Algo curioso es que Chrome insistira en presentar su propia versión, a menos que la nuestra tenga al menos 512 bytes de tamaño.
IE7, Firefox 3.6.8 y Safari 5 sí muestran nuestra versión si estuviera disponible.

Referencias

2010/01/23

Resolviendo el Mercury de XAMPP

XAMPP es un conveniente paquete que contiene Apache, PHP, MySQL y otros programas para facilitar la instalación y uso de un entorno de desarrollo PHP. Lo vengo usando satisfactoriamente desde hace varios meses. Sin embargo, me enfrasqué en un problema cuando necesité usar el Mercury que trae incluido para enviar emails. Aparentemente no funcionaba. Buscando y navegando mucho por internet, encontré estas páginas que me ayudaron a resolver el problema:
El primer enlace da una secuencia detallada de pasos. Muchos comentan que les funcionó muy bien, pero yo tuve un problema. Veía que las ventanas de los varios monitores que muestra Mercury decían offline, y un comando "telnet localhost 25" ejecutado en la consola me devolvía "Could not open connection to the host, on port 25".
Entonces, encontré el segundo enlace, donde un forista comentaba que los mensajes de offline se debían a un bug del módulo MercuryX y se debía deshabilitar. Así lo hice y, al reiniciar, el administrador de Mercury funcionó :-D, se enviaron los mensajes de prueba que tenía atascados e incluso pude hacer una prueba usando el telnet.

Resúmen de pasos

La idea del relay es usar un servidor SMTP externo, como el de GMail, para que Mercury envíe el correo a través de él. En teoría sería posible también usar un SMTP en localhost, pero como algunos proveedores no permiten que sus usuarios envíen correo de ese modo, el uso del relay parece más general.
En el archivo xampp/php/php.ini, ubicar las líneas correspondientes a [mail function] y editarlas para que quede algo como:

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = postmaster@localhost

A continuación, configurar Mercury. En el administrador de Mercury (que se abre al pulsar su botón Admin en el panel de control de XAMPP), entrar a las opción de menú indicadas por cada título y realizar los cambios que se indican:

Configuration/Protocol modules...

Note que se han desahabilitado MercuryE y MercuryX, y se ha habilitado Mercury C.


Luego de desactivar/activar módulos es necesario reiniciar Mercury (salir del administrador y volver a entrar).


Configuration/Mercury core module...

 

Configuration/MercuryS SMTP server

El nombre en "Announce..." puede ser cualquiera. El IP es el del localhost (la página dice que usar el IP de la intranet, 192.168.x.x, no le funcionó).

 
Aquí se modifica la restricción para que se permita conexiones en el rango 127.0.0.1-127.0.0.1
Pero el punto más importante es desmarcar la casilla "Do not permit SMTP relaying of non-local-email"

Configuration/MercuryC SMTP client

Aquí indico que se use el SMTP server de gmail, según las recomendaciones de su página y usando el puerto 587 para SSL con STARTTLS. Si es su caso, verifique que el nombre de usuario incluya @gmail.com

Configuration/Manage local users

Se agrega el usuario postmaster, con privilegio de administrador.

2009/10/20

La importancia de comprender el proceso de solución

Muchas veces me he preguntado por qué frecuentemente parece tan problemático aplicar en proyectos del mundo real los esquemas de trabajo que aprendemos al estudiar.

El desarrollo de un sistema real suele ser un problema impreciso, a diferencia de los libros de texto, donde cada problema suele aparecer expresado de modo preciso.
Aún en los proyectos aparentemente simples, es normal encontrar imprecisiones en lo que el cliente tiene, lo que el cliente quiere y lo que realmente necesita.

Pero, aunque eso es un problema adicional al principal, pienso que no es la principal razón de las dificultades al desarrollar un proyecto.

Me parece que la principal razón es un problema de actitud frente a los problemas debido, básicamente, a la falta de comprensión de cómo se solucionan.

Muchas personas no han hecho nunca el intento de resolver algo desde cero. Casi siempre han podido solucionar lo que necesitaban adaptando o configurando una solución general desarrollada por alguien más.
Sin embargo, se les pone en proyectos de desarrollo que implican desarrollar desde cero, y entonces empiezan a ocurrir problemas.

Pienso que cuando una persona se ha acostumbrado a renunciar a buscar sus propias soluciones para usar las de otros, con el tiempo puede empezar a tener una visión distorsionada de lo que una solución es y del proceso necesario para lograrla.
Como las soluciones de otros suelen venir acabadas, pulidas y empaquetadas, una persona que no ha tenido experiencia hallando sus propias soluciones suele mirar con desconfianza el proceso de solución de otras personas.
Le es difícil entender la presencia de código auxiliar, y las sucesivas aproximaciones, simplificaciones y pruebas que ocurren en el proceso. Cree que las soluciones se deben construir tal cual se presentan al final, lo cual es como pretender que una casa se puede construir colocando cada parte con su cubierta y acabado final, cuando en realidad el proceso de construcción es por etapas.

George Polya escribió sobre el proceso de solución de problemas por uno mismo. Primero comprender el problema; familiarizarse con él; en qué consiste. Luego usar alguna estrategia de solución; quizás dividirlo, quizás simplificarlo, quizás expresarlo de otro modo, o en términos de problemas cuya solución conozcamos; probar y probar. Hallada la solución, comprobarla; ver si realmente satisface el problema. Finalmente, ver si puede hacerse de otro modo, quizás más rápido o con menos recursos.
Primero resolver la cuestión, luego optimizar la solución.

Pero cuando no se ha sido educado en solucionar problemas por uno mismo, sino en asimilar la solución de problemas tipo resueltos por otros, uno se puede llegar a acostumbrar a eso. Y, con el tiempo, llegar a pensar que todos los problemas se pueden resolver de ese modo.
Así, no es poco frecuente hallar personas que creen que toda solución debe aparecer ya optimizada.
La solución de un problema tipo puede aparecer optimizada porque ya es conocida.
La solución de un problema nuevo, en cambio, se construye gradualmente.

Muchas veces se dice que hay que evitar reinventar la rueda, y se mira con cierto desdén a una persona que lo intenta. Sin embargo, es importante. Porque quien lo hace entrena su mente en distinguir soluciones, y en construir el camino para hallarlas. Puede sentir cuál será el siguiente paso.

Quién sólo aplica soluciones es como alguien confinado a ir siempre por caminos ya trazados. Quizás tan temeroso que evita, aproximarse a los bordes, o siquiera mirar a los lados. Y, posiblemente, obstaculizando constantemente a quienes quisieran aventurarse más allá. Sin entender que los caminos no aparecen pavimentados de golpe, sino que deben construirse y, aún antes, descubrirse.

Solucionar un problema por uno mismo puede ser un proceso de exploración y descubrimiento, como aventurarse en un bosque. O también puede ser un proceso de sembrar, cultivar y cosechar.

Por supuesto que aplicar la solución de otro también tiene su mérito. Es una cuestión de técnica. De cómo, hecho el camino, lo puedo recorrer. Pero, ¿quién hace el camino?

Admitiendo que un proyecto tiene partes que desarrollar desde cero, debería dejarse espacio para el proceso de exploración y evolución que una solución desde cero necesariamente requerirá. ¿Lo hace usted?