miércoles, julio 13, 2022

Acceso denegado a disco externo (Windows)

 Bueno, después de varios años sin escribir nada aquí (demasiados), vuelvo con un tema con el que me he tenido que enfrentar ya dos veces en los últimos años, pero que recién hoy logre entender completamente el trasfondo.

El escenario es así:  tienes un disco externo donde esperas guardar archivos de gran tamaño, específicamente archivos de mas de 5 GB, cómo podría ser un backup de una BD SQL Server o un respaldo de una maquina virtual. 

El tema es que cuando se trata de archivos muy  grandes, FAT32 queda descartado por su limite de 4 GB por archivo.   Que hacia yo entonces?  lo formateaba con NTFS y asunto resuelto.... al menos hasta que por cualquier razón quería acceder a ese disco desde otro equipo, y me topaba con un mensaje de ACCESO DENEGADO al disco entero.

Esto me paso la primera vez al intentar acceder a un disco que normalmente estaba conectado solo a mi MacMini, desde mi laptop Linux con un Windows virtualizado.  En ese momento el problema lo solucione asignando de nuevo los permisos en el disco.

Pero ayer me sucedió de nuevo, esta vez al probar una copia de mi MV Parallels en Virtual Box... pude acceder al disco externo (formateado con NTFS) desde la MV en VirtualBox sin problemas, pero al apagar esa MV y volver a encender la MV original en Parallels, resultó que perdí el acceso completo a ese disco, con el mensaje de ACCESO DENEGADO.

Después de múltiples intentos fallidos de reasignar los permisos para volver a ganar acceso desde Parallels, me tope con este articulo que finalmente me dio luz sobre lo que estaba pasando y, sobre todo, sobre lo que había hecho mal desde el inicio: 

https://www.softzone.es/windows/como-se-hace/diferencias-fat32-ntfs-exfat/

Tal como bien explican en el articulo, el problema con NTFS es que no solo te permite manejar archivos grandes y, en general, manejar tus archivos de manera mas optima y segura (en mis mas de 30 años de carrera he visto cualquier cantidad de discos con FAT32 corruptos al punto de no poder recuperar nada, pero JAMAS he visto un disco NTFS que sufra la misma suerte), sino que ADEMAS incorpora SEGURIDAD a los mismos, es decir, PERMISOS.... y esta característica justamente la que te causa problemas cuando conectas ese mismo disco a otro equipo.

La razón?  NTFS fue pensado para usarse en DISCOS INTERNOS. Así de simple.  O, en todo caso, en discos externos que estarán siempre conectados al mismo equipo.

Cuál es la solución entonces?   Pues usar el formato EXFAT que es similar al FAT32 pero sin las limitaciones de 4 GB por archivo.  Sin embargo, CUIDADO!!   ExFAT es tan propenso a la corrupción como lo es FAT32, especialmente cuando hay caídas de energía durante operaciones de escritura, o cundo se usa de forma intensa permanentemente, por lo que NO SIRVE para usarlo en discos con data sensitiva que te costaría mucho perder en un momento dado.

Como hacer entonces si quieres tener data sensitiva y poderla compartir entre distintos sistemas?  bueno, es una BUENA PREGUNTA... NTFS no sirve por el tema de los permisos y FAT32/EXFAT tampoco por el tema de la tendencia a la corrupción del sistema de archivos durante fallas.

Hay un par de opciones mas que estoy investigando, así que esta historia continuara probablemente. 







viernes, junio 29, 2018

Sobre Mexico y AMLO


Un amigo y colega mexicano me pidió que escribiera sobre mi experiencia como Venezolano con respecto a lo que sucedió y esta sucediendo en Venezuela, y las similitudes que pudiera haber con el caso de Mexico.

La primera similitud que veo es el descontento general con los politicos tradicionales y con la corrupción generalizada. Ese era el ambiente reinante en Venezuela para 1996, donde encima de la creciente cantidad de casos de corrupción destapados, la gente resentía el efecto de las medidas neo liberales que el gobierno se había visto obligado a implementar para intentar palear los desaciertos de los dos gobiernos anteriores.

La gente estaba demandando un cambio pero no encontraba un líder, alguien que representara ese cambio. Y fue justo en ese momento cuando apareció la figura de Chavez, que no solo le puso cara al inconformismo y a las ganas de cambio, sino que encima se solapó con la eterna figura latinoamericana del “caudillo”, el hombre fuerte que es capaz de hacer lo que se necesita.

Cuando Chavez empezó a hacer su campaña, mucha gente comenzó a llamar la atención, con preocupación,  sobre sus inclinaciones izquierdistas; pero el pueblo no las quiso creer, en parte porque las palabras “izquierdista” y “comunista” se asociaban con Cuba y si había un país que fuera DIAMETRALMENTE DISTINTO a Cuba, ese era Venezuela.

Encima, Chavez se dedicó a dar entrevistas en las que afirmaba que nunca atentaría contra la empresa privada, que el era un demócrata convencido y que siempre respetaría el estado de derecho y la propiedad privada.

A eso se le sumó que mucha gente notable, inteligente, respetada, aparecía dentro de los candidatos a su posible gabinete, lo cual le dió aun mas tranquilidad a la gente sobre que este no era “un loco comunista”.

Y así, Chavez ganó con una abrumadora mayoría.   Al inicio, debo reconocer, hasta yo empecé a ver con buenos ojos sus primeras acciones:  reducir el grosero salario de los parlamentarios, quitarles sus beneficios absurdos como escoltas, autos blindados, celulares pagados por los impuestos de todos, etc.

Pero muy pronto empezaron las señales de alerta.  Varios miembros de su gabinete, gente inteligente y preparada, empezaron a renunciar y alertar sobre las actitudes totalitarias de Chavez.   De nuevo, nadie les creyó.

Y ahi empezó, muy poco a poco, la aplicación de la receta comunista.  Todo comunista NECESITA inventarse dos enemigos: uno interno y otro externo.  Por que?  para poder tener a alguien a quien culpar de las cosas que no funcionan bien (internamente) y para poder ganar espacios en la comunidad internacional.

En el caso de Chavez, el enemigo interno fue la empresa privada.  La gente SIEMPRE va a preferir culpar a alguien mas de su mala situación, porque eso es mas fácil que asumir sus propios errores.  Y asi, el discurso de “tu eres pobre porque LOS EMPRESARIOS siempre te han explotado y te han quitado lo que es tuyo”  cala MUY FACILMENTE.

La otra cosa que la gente siempre esta dispuesta a creer es que la gente que fue la universidad se “las da de la gran cosa” y que ellos también pueden hacer lo mismo que hacen ellos, a fuerza de experiencia, y sin necesidad de un titulo.

Con eso, mas el temor y la incertidumbre que las políticas y discursos de Chavez estaban causando en la clase empresarial,  se tenían ya todos los ingredientes para el desastre.

Los empresarios empezaron a sacar sus capitales al exterior para protegerlos del gobierno.  Esta presión en las reservas internacionales obligó al gobierno a implementar un control de cambio, no solo para frenar la fuga de capitales, sino para poder tener controlados a los empresarios en un país donde casi todo se importa, y encima para poder tener una maquina de generar dinero ficticio y repartir prebendas.   Como?  bueno, gente conectada al gobierno empezó a recibir licencias para importar con el dolar oficial.  Esta gente recibía una cierta cantidad de dólares,  no importaban nada o importaban mercancía de segunda o tercera, y luego vendían esos dolores en el mercado negro a varias veces el precio oficial.

Esto empezó a generar una presión inflacionaria por dos lados:  por un lado había un montón de dinero circulando en la economía, lo que le permitía a cierta gente pagar mas por los bienes y servicios, y por otro lado los empresarios, ante la incertidumbre de cuando les aprobarían los dólares necesarios para importar, se vieron obligados a aumentar sus precios para poder compensar la devaluación causada por el control cambiario.

Que hizo el gobierno?  control de precios… lo cual, obviamente, no solo creó un mercado negro paralelo para los bienes controlados, sino que empezó a causar desabastecimiento pues muchos productores optaron por cerrar antes de vender a pérdida.

Ante esta situación, el gobierno, olvidándose de sus promesas de campaña, empezó a intervenir empresas estratégicas y a expropiarlas, dándole el control a cooperativas de trabajadores… que OBVIAMENTE no sabían como manejar una empresa de ese tipo (solo sabían hacer su trabajo) y terminaron quebrándolas y luego saqueadoras…. lo cual llevo a un mayor desabastecimiento.

El gobierno intentó combatir ese desabastecimiento aumentando la importación de productos, pero en la realidad eso solo contribuyó a un mayor aumento de la corrupción ligada al control cambiario, y con lamentables casos de comida perdida en containers que nunca salieron de aduana.

Al mismo tiempo, el gobierno echaba la culpa de todo al “imperio”, que hacia una “guerra económica” para intentar derrocar el gobierno “del pueblo”.  Ahi empezó la clase media empresaria a darse cuenta de que la cosa iba en picada y decidieron vender todo y mudar sus negocios a otros países, principalmente Colombia y Panamá, mientras eso fuese aun posible…. y, obviamente, esto solo contribuyó al aumento del problema del abastecimiento.

El gobierno, lejos de darse cuenta de la debacle que estaba causando por su políticas erradas, se apoyó en una bonanza petrolera sin parangón en la historia de Venezuela, para seguir intentando solventar a fuerza de dinero los problemas estructurales que el mismo había creado con su persecución suicida contra el sector privado…. y hasta cierto punto le funcionó, hasta que el precio del petróleo cayo de 100 USD/barril a menos de 30.

Durante todo ese tiempo, mientras el pueblo venezolano empezaba a sufrir los rigores del desabastecimiento (yo pasé una vez 3 meses sin poder comer nada frito porque no había NADA con que freír: ni aceite, ni manteca, ni mantequilla) y la falla de los servicios básicos (por la falta de inversiones y mantenimiento apropiado), la gente ligada al gobierno y los militares empezaron a enriquecerse de una manera grosera y ya descarada.

La familia Chavez que era una gente humilde del campo en su natal Barinas, pasaron a ser uno de los mayores terratenientes en Venezuela.  Hijos estudiando o vacacionando en USA y Europa, yates, fiestas privadas en playas paradisiacas, en fin.

Durante todo ese proceso, el gobierno se dió a la tarea de reformar las leyes (empezando por la constitución) para garantizar dos cosas:  su poder para perpetuarse indefinidamente (mediante el control del poder electoral) y su poder para anular cualquier acción en su contra (mediante el control del tribunal supremo de justicia).

Fue así como sucedieron cosas como que en estados donde la gobernación fue ganada por un opositor, el TSJ decretó la creación de una figura administrativa que estaba POR ENCIMA del gobernador y que controlaba todos los recursos y decisiones.

Fue así como cuando perdieron el control de la Asamblea Nacional, usaron al TSJ para invalidar la elección de la cantidad exacta de diputados que la AN necesitaba para tener la mayoría calificada y asi poder hacer cosas como renovar los puestos del TSJ o del Consejo Nacional Electoral.

Fue así como el gobierno, saltándose la constitución que ellos mismos crearon, decretaron la creación de una Asamblea Nacional Constituyente, que suplanto a la AN (de mayoría opositora) y anuló todas sus decisiones.

Y durante TODO ESE TIEMPO la gente decía: no vale, nosotros no terminaremos como cuba.

Y ahi vino el racionamiento y las famosas bolsas CLAP.  Si, es verdad, no tenemos tarjetas de racionamiento como en CUBA, pero si tenemos filas de kilómetros para poder comprar cosas tan simples como harina y arroz, en donde nos marcan como ganado para evitar que podamos hacer la cola dos veces, o en su defecto tenemos que esperar a que el consejo comunal NOS PERMITA comprar una bolsa CLAP (bolsa de comida entregada por el gobierno) por familia, que debe durar para todo un mes.

Y bueno, para no hacer mas largo este cuento ya de por si largo, adivinen que?  Aun no estamos como en Cuba…pero nos parecemos MUCHO… y aun falta.  Al día de hoy, mi familia que aun vive en Venezuela tiene que sufrir el horror de dormir sin aire acondicionado o ventilador, a 32 grados con 80% de humedad, mas mosquitos, porque la capacidad generadora que aun queda en Venezuela no da para cubrir la demanda, por lo que el gobierno se ve obligado a racionar la electricidad, a veces por mas de 8 horas.   Tengo primos que han pasado hasta 23 horas sin luz.   

La devaluación es tan enorme que necesitas una carretilla llena de los billetes de mas alta denominación disponibles, para poder comprar un sandwich. El efectivo es tan escaso, que se “vende” por el doble de su valor nominal, a gente que por distintas razones necesita comprar algo que no se puede pagar con transferencia.

Y el gobierno SIGUE INSISTIENDO que la culpa es de los empresarios y del “imperio”.

Y uds me dirán, “claro, pero es Venezuela. México no es Venezuela ni los Mexicanos son como los Venezolanos”… y si, tienen razón…. pero eso mismo, EXACTAMENTE, era lo que decíamos nosotros de Cuba y los Cubanos… y miren como estamos ahora.

Todo lo que se necesita para que el comunismo infecte y destruya a una sociedad es que la gente se crea el discurso divisorio y de odio de clases, que no reconozca que el progreso se logra con el esfuerzo y no “quitándole a los ricos para darle a los pobres”.  Que a lo que todos debemos aspirar es a aprender a pescar, NO a que nos den el pescado y MUCHO MENOS quitándoselo a otros.

Puede que AMLO no sea Chavez, pero, honestamente, yo que Uds., no me tomaría el riesgo.  

jueves, junio 01, 2017

Freelancing, TopTal style

Today, a fellow Venezuelan programmer talked to me about a freelancing site called TopTal. I have to admit that I've never heard about them until today, but following the council of my friend, I decided to give it a try.

TopTal is a Web Programmer Community that brings together big companies with the best freelance programmers out there. The sign up process, from the actual flow, to the clean, clear and minimalist UX, already caught my attention from the start.  The process was straight forward, but something in the way they handle new applicants told me these people were really serious about getting the right kind of professionals.

I am now waiting for the first screening call, and it's exciting to see the kind of projects I could work on through their platform.  Programming should be not only about getting the work done, but also to actually have fun while doing it, and I believe TopTal could be a place where I can find the kind of projects I love to work on.

My previous experiences with freelancing sites were mostly disappointing, because they were like a jungle where freelancers competed on lower fares instead of better quality.   Most of the hirers didn't cared about quality, but about paying less as possible for the work they needed.  TopTal, on the other hand, seems to focus on quality at both sides of the equation, bringing together great companies with top-of-the-line programmers, all over the world, focusing on excellency.

So, if you are a seasoned programmer, focused on quality and proud of your craft, go and apply on TopTal and join others that shares your same passion about good and beautiful code.



miércoles, junio 03, 2015

Cannot read property 'aDataSort' of undefined

Acabo de perder 45 min investigando el error Cannot read property 'aDataSort' of undefined al inicializar un DataTable de jQuery.

En google conseguí varias explicaciones de porque ocurre este error:

  • El elemento table no contiene los elementos thead o tbody
  • El elemento thead esta vacío
  • Hay mas columnas definidas en thead que las indicadas en la opción columns
  • Una o mas de las columnas definidas en columns hacen referencia a una columna que no existe en el dataset aplicado.

Ninguna de estas aplicaba a mi caso.  Cual resulto ser el problema? que en lugar de tener:


<table id="mytable">
...
<table>

tenia:

<table id="mytable" />
...
</table>


Notó el "/" extra en la apertura del nodo table?  si? pues a mi me llevó 45 min verlo!! :(





martes, marzo 17, 2015

OSX: Recuperar un arreglo RAID luego que uno de los discos ha fallado

La situación es esta:

1. Un Mac Mini Server con dos discos de 1 TB, configurados en RAID
2. Un dia, uno de los discos aparece marcado como FAILED y el RAID tiene estatus DEGRADATED.

Si estas en esta situación, seguramente ya habrás descubierto que es muy pero muy difícil encontrar en internet una guia de como solucionar este problema, principalmente porque todo el mundo parte del supuesto que el disco que presenta fallas se daño físicamente y debe ser sustituido.

En mi caso, el disco parecía funcionar correctamente desde el punto de vista físico, o al menos eso indicaba su status S.M.A.R.T.

Luego de un par de meses de investigar, al final tome la decisión de arriesgarme y esto fue lo que hice:


  1. Utilizando un disco externo, hice un respaldo del disco principal usando Carbon Copy Cloner.
  2. En Preferencias del Sistema, cambie el disco de arranque a fin de iniciar desde el disco externo.  La idea de esto es que si algo salía mal, podría reiniciar mi servidor desde el disco externo, formatear ambos discos, recrear el RAID y luego usar CCC para restaurar el disco desde el disco externo.
  3. Una vez iniciado OSX desde el disco externo, cargue la Utilidad de Discos
  4. Una vez ahi, seleccione el arreglo RAID, seleccione el disco con problemas y pulsando en "-" lo desasocie del arreglo RAID.
  5. Una vez retirado del RAID, procedi a formatear el disco con problemas 
  6. Una vez formateado, volvi a seleccionar el arreglo RAID y arrastre el disco nuevo a la ventana del arreglo RAID
  7. Una vez confirmado el disco nuevo como parte del RAID, seleccione el arreglo y pulse en "Rebuild".  
  8. Luego de dos horas, el arreglo RAID estaba de nuevo ONLINE
  9. Una vez completado el proceso, volvi a configurar el disco RAID como disco de arranque y reinicie el servidor.

Espero que esta pequeña guia sea de utilidad a otras personas que tengan que pasar por la misma situación.



sábado, febrero 28, 2015

OSX: Sacar una aplicación de la "cuarentena"


Cuando descargamos una aplicación desde internet (en lugar de hacerlo desde la App Store), OSX coloca dicha aplicación en "cuarentena".

Lo que en realidad ocurre es que OSX activa el flag de "quarantine" en esa aplicación, para indicar que aun no se sabe si debe confiar en dicha aplicación o no.

Cuando intentamos abrir una aplicación que tiene esta marca activa, OSX nos advierte de la situación con un diálogo que nos pide confirmar si efectivamente deseamos ejecutar dicha aplicación.

Hay varias formas de eliminar ese flag de la aplicación:


  • Ejecutar la aplicación y confirmar que deseamos confiar en ella
  • Mover la aplicación a la carpeta Aplicaciones

Sin embargo, a veces sucede que por una u otra razón, el flag no se elimina  a pesar de haber confirmado nuestra confianza en ella o haberla movido a la carpeta Aplicaciones, lo cual nos deja con la molestia de tener que estar confirmando la aplicación cada vez que la ejecutamos.

Para solucionar esto, necesitamos ejecutar el siguiente comando desde terminal:

xattr -d com.apple.quarantine /PATH/TO/APPLICATION


(tome en cuenta que dependiendo de sus permisos, puede necesitar ejecutar la instruccion con sudo)


Una vez ejecutada la instrucción, ya podremos abrir normalmente la aplicación sin tener que confirmarla.



Fuente: MacTips

viernes, febrero 06, 2015

No cualquiera puede ser programador

Este texto lo tome de un foro de VFP en Español, cortesía del amigo Saul Piña:

No todo el mundo puede llegar a ser programador. La programación no es un asunto para cualquiera. Es una tarea muy especializada que requiere la combinación de actitudes, conocimientos y un ambiente correcto para poder desarrollarse. En este artículo se explica algunas razones. Comencemos por el principio:

Hay que tener pasión para resolver problemas
  • La programación de software es para el individuo que siente pasión por resolver problemas. 
  • La experiencia indica que no todo el mundo le agrada la idea de andar resolviendo problemas. 
  • El proceso de resolver problemas implica tener una mente proactiva, lista para el trabajo duro y constante
  • La mayoría de las personas son perezosas en este sentido.
Toma tiempo dominar este arte
  • El que piense que ser programador es cuestión de un evento, no está pensando correctamente o lo están desinformando deliberadamente.
  • Llegar a ser un programador eficiente es producto de un proceso de aprendizaje que tarda años.
  • La programación es un arte que se aprende en modo "prueba y error", consumiendo años de esfuerzo y energías.
  • En pocas palabras, requiere trabajo duro y constante para llegar al nivel de ser productivo.
Hay que tener la actitud correcta
  • El programador debe tener una actitud positiva, y al mismo tiempo, una mente tenaz.
  • El proceso de escribir un código fuente es complejo,  envuelve tener pendiente multitudes de detalles técnicos (sintaxis, variables, procesos, bucles, entradas, salidas, etc.).
  • La misma naturaleza de la tarea hace que cada paso sea un desafío. Aquí no existen atajos.
No existe un asunto más tedioso y aburrido que "debuggear" y luchar contra ese "sentimiento de impotencia" que surge cuando tenemos un código fuente que no parece compilar nunca, aun cuando el código luce estar perfectamente escrito. Sí, todos hemos pasado por esto, al final sólo faltaba un "punto y coma" o cerrar una llave para que el código compilara. Recientemente, leí en un ensayo de Paul Graham, que el verdadero programador disfruta el proceso de  "debuggear". No lo ve como una pérdida de tiempo sino que disfruta cada segundo hasta encontrar la solución. Yo creo que Graham tiene razón. Si no te gusta "debuggear" quizás no sientes pasión por este arte.

Pensar "outside the box"
  • Para aprender programación es necesario pensar de manera abstracta.
  • El pensamiento abstracto es fácticamente demostrable que no le es atractivo al "Layman" o "Average Joe"
Recuerdo perfectamente en la universidad aprendiendo POO (Programación Orientada a Objetos) cuando el profesor explicaba los términos: herencia, polimorfismo, objeto, método, clase, etc. La mayoría de los estudiantes no captaban los conceptos. Era como si se les hablara en Mandarín. La abstracción requiere dos cosas:
  • (1) el método correcto de enseñanza
  • (2) una mente fértil.
Planificación y diseño, luego ejecución
  • Codificar es una cosa, planificar y diseñar la solución de un problema es otra cosa muy diferente.
  • La mayoría de las personas que he visto fracasar en el intento de convertirse en programadores tienen una característica en común: no tienen una sólida base de conocimientos en matemáticas y algoritmos.
  • Es cierto que la programación es un arte, pero al mismo tiempo también es una ciencia.
  • Es una combinación de creatividad y estructura mental. No están separadas, al contrario, coexisten indistintamente.
  • Para resolver problemas computacionales es necesario pensar "outside of the box", pero para aplicar esa solución creativa, y llevarla a la realidad, es necesario orden y estructura. Es aquí donde muchos fracasan.
  • No es posible llegar a una solución eficiente si no contamos con un algoritmo que aproveche de la mejor forma los recursos computacionales disponibles.
Hay que ser curioso. La mayoría de los programadores competentes son personas muy curiosas. Les gusta aprender constantemente y averiguar el porqué de las cosas. De hecho, la mayoría que conozco son autodidactas y no paran de aprender. La programación no es estática. Es una profesión que viene en constante evolución (nuevos lenguajes, IDE, Frameworks, etc.). Si no eres curioso y dependes de otras personas para aprender, la programación no es para ti.


lunes, julio 21, 2014

DP es ahora VFPDosPrint

DP, mi librería para generar reportes basados en texto, y que ha estado en uso en varios países del mundo desde hace mas de 10 años, es ahora un miembro oficial del proyecto VFPx, bajo el nombre VFPDosPrint.

Ha sido un largo camino para DP, y no creo que exista un mejor final para esta clase que tantas satisfacciones me ha dado, que el pasar a formar parte de un proyecto tan importante como VFPx.

Gracias a Rick Shummer y todo el equipo de VFPx por todo el apoyo y la calurosa bienvenida que prodigaron a DP.




miércoles, mayo 21, 2014

Manejar el envio de un form con JQuery y AJAX

Tenemos un form cuyo envío queremos manejar via AJAX usando JQuery.  Para esto, programamos el evento "onSubmit" el form para invocar una función javascript, la cual usa $.ajax() para enviar el POST hacia un servicio REST.

Todo funciona bien... excepto que la primera vez que pulsamos el botón "Submit" la llamada Ajax falla, pero si volvemos a intentar funciona perfectamente.

El problema lo causa el hecho de que cuando se inicia el proceso de POST del formulario, se invoca la función javascript indicada en el evento onSubmit, pero luego se continua con el procesamiento normal del form, que incluye un POST hacia la dirección indicada en el href del elemento FORM y un postback de la página.  Para evitar esto, debemos incluir la siguiente linea al final de la función javascript:

event.preventDefault();



viernes, enero 17, 2014

Cuando empece este blog tenia la firme intención de escribir sobre otras cosas que no fueran tecnología, tal como la música, que es mi mayor pasión.

Sin embargo, hasta ahora no ha sido así.  Tiempo de corregir; este es una de las canciones que mas me costado sacar en la guitarra... ojalá les guste la versión.






martes, enero 14, 2014

A pesar de que Parallels Desktop ha mejorado muchísimo en cuanto a estabilidad y confiabilidad con el paso de los años, aun suceden cosas raras de cuando en cuando. 

El que mas se repite es uno que causa que al suspender o detener una MV, este proceso no termine nunca.  Si se fuerza el cierre de Parallels Desktop y se vuelve a cargar, al intentar iniciar la MV la misma vuelve al estado de suspendiendo o deteniendo.

En estos casos, la solución consiste en terminar todos los procesos prl_vm_app que esten activos en ese momento y luego reiniciar el Parallels Desktop (ver aqui).

Lo bueno es que la MV no sufre ningún daño por esta situación (o al menos a mi no me ha sucedido nunca hasta ahora), por lo que no pasa de ser un bug molesto.





domingo, septiembre 15, 2013

Activar tipos de imagenes "escondidos" en Disk Utility

Disk Utility es muy útil a la hora de crear imágenes de distintos tipos, tales como CDs, DVDs, etc.  Resulta que, internamente, Disk Utility soporta otros varios tipos de imágenes que no están activos por omisión.

La forma de activarlos, como es común en OSX, es modificando una preferencia especifica de la aplicación (asegúrense que Disk Utilityt no este ejecutando antes de hacer esto):

defaults write com.apple.DiskUtility advanced-image-options 1



sábado, septiembre 14, 2013

Problemas al intentar depurar una instruccion en el SQL Server Managment Studio ?

Esto me ha pasado varias veces; al intentar ejecutar un script en MSSSMS en modo depuración, me salta el error:

No se puede iniciar la sesión de depuración de T-SQL. No se puede conectar con el proceso de SQL Server

Aunque hay distintas causas posible para este error, la mas común resulta ser que el usuario bajo el cual se inicio la sesión en el MSSSMS no tiene el permisos "sysadmin".  La solución?  ejecute esta instrucción y, con un poco de suerte, el problema será historia:

EXEC sp_addsrvrolemember 'Domain\Name', 'sysadmin'



jueves, marzo 14, 2013

Hoy, por fin!!, luego de mas de 3 semanas de espera, llegó mi turno y ya tengo mi flamante MailBox funcionando en mi modesto iPhone 3GS.

Las primeras de cambio fueron, francamente, satisfactorias: una interfaz impecable, gestos faciles de aprender, la aplicación responde increiblemente rápido en todas sus funciones, incluso en mi 3GS... en fin, excelente.





Cosas que espero mejoren en un futuro MUY próximo?
  • Aunque no lo he probado personalmente, parece que al hacer forward de un correo que tiene anexos, estos no son incluidos en el nuevo correo. Gran problema.
  • MailBox no utiliza los sonidos configurados en iOS relacionados con mail, ni tampoco brinda una opción interna para personalizarlos.  No es mal de morir, pero si algo que a la gente en general le gusta mucho poder hacer.
  • Aunque el menu de opciones al momento de poner un correo en espera son bastantes completas e intuitivas, no caería mal que se pudieran crear nuevas opciones a gusto del usuario.
En general, creo que esta aplicación tiene un gran potencial para sustituir a la aplicación nativa de Mail, al menos en mi caso.  

Veremos luego de un par de semanas si la experiencia inicial se confirma o si termina en decepción. Por ahora, si les interesa probar esta app, pónganse en la cola lo mas pronto posible porque la fila es larga....



lunes, diciembre 03, 2012

VFP: Obtener el nombre del PC en ambiente Terminal Server

Siempre he dicho que en lo simple esta la belleza del Universo y hoy vi esto confirmado una vez mas.

Es un escenario cada vez mas común el de ejecutar sistemas administrativos mediante sesiones de Terminal Server.  En este escenario, la función SYS(0) devuelve el nombre del equipo donde se esta ejecutando la sesión de TS y NO el equipo "cliente", que seria el que en definitiva nos interesaría. Este problema lo había resuelto hace tiempo mediante llamadas al API de TS que me permitían obtener el nombre del equipo cliente.

Pero hoy, el gran Maestro Luis Maria Guayan me ha sorprendido con una forma mucho mas simple y elegante de resolver el problema:


IF UPPER(LEFT(GETENV("SESSIONNAME"),3)) == "RDP" 
  lcPC = GETENV("CLIENTNAME")
ELSE
  lcPC = GETENV("COMPUTERNAME")
ENDIF



Increíblemente simple!!



viernes, noviembre 02, 2012

OSX: Kernel Panics por CIJScannerRegister

La verdad, los usuarios de OSX no estamos acostumbrados al equivalente Apple de la pantalla azul de la muerte, tan familiar en el mundo Windows.  De hecho, ni siquiera recuerdo cuando fue la última vez que una de mis Mac tuvo un Kernel Panic (que asi se llaman en OSX) y, por norma, mi laptop pasa MESES sin siquiera necesitar de un reboot.

Asi que imaginen mi frustración cuando, de repente, mi laptop empezó a generar Kernel Panics varias veces por semana.  Una de esas veces, afecto mi disco de fuentes y se imaginarán el desastre.

Anoche dejé la laptop encendida realizando un backup en línea, solo para conseguirme esta mañana con que el equipo se había apagado luego de un Kernel Panic.  Asi que dije "basta!" y recurrí a San Google para intentar ver si alguien mas estaba sufriendo del mismo problema.

Resulto que si. Y el sospechoso común era un proceso llamado CIJScannerRegister.  Resulta que este proceso, relaciondo con impresoras Cannon, ya estaba instalado en mi equipo desde que hice el fresh install de Snow Leopard pero, por alguna razón, luego de actualizar a Lion empezó a causar problemas con el kernel del sistema operaivo.

Dado que yo no uso impresoras Cannon y mucho menos scanners de esa o cualquier otra marca, la solución para mi fue tan simple como renombrar el driver para evitar que se cargue, tal como indican aqui.

Apenas hice el cambio hoy, asi que habra que esperar a ver si, efectivamente, este CIJScannerRegister era el causante de mis problemas o si, por el contrario, tendre que seguir buscando otros sospechosos.

Actualización Nov 5

Van ya 3 dias sin ningún tipo de problemas ni Kernel Panics. Incluso, la portatil se ha calentado menos y la bateria dura un poco mas. Creo que este CIJScannerRegister me estaba causando mas problemas de los que pense en un inicio.  Tambien el hecho de haber eliminado el Flash Player quizas este teniendo algo que ver aqui.


Actualización Dic 1

A casi un mes del tema no he tenido mas Kernel Panics ni ningún otro problema.  De hecho, eliminé el panel Fan Control y le di un reset al SMC de mi MBP para que los ventiladores cayeran de nuevo en control del firmware original de Apple y todo volvió a ser como siempre debió haber sido: una laptop estable y extremadamente silenciosa.



jueves, agosto 23, 2012

Plugin de Java en OSX Lion

Hoy intenté entrar a una página que usa applets de Java y me conseguí con la sorpresa de un recuadro blanco con la leyenda "disabled plugin". Inicialmente pense que era un problema con Google Chrome, pero pronto me di cuenta que tenia que ser un problema a nivel de sistema, pues lo mismo sucedia con Safari. 

Una rápida busca en Google me indicó que, por alguna razón, el proceso de instalación de OSX Lion desactiva este plugin en todos los navegadores.

La solución?
  1. Abra una ventana de Terminal
  2. Escriba o pegue este comando:
    /Applications/Utilities/Java\ Preferences.app/Contents/MacOS/Java\ Preferences
  3. Marque la opción "Enable applet plug-in and Web Start applications"
  4. Reinicie su navegador de internet

Fuente:


lunes, julio 30, 2012

Web 2.0: Mi primer sitio web con JQuery y Bootstrap

La historia es que mi esposa tiene una tia que es monja de las Carmelitas Descalzas del convento San Rafael en Santiago, y la hermana encargada de las cuestiones tecnológicas me preguntó que si podia hacer una página web para el convento.  Nada del otro mundo; solo una página de portada, galeria, ubicación y contacto.

La ocasión me pareció propicia para intentar dar mis primeros pasos en el mundo de JQuery y Bootstrap y así ver que tan útil son dichas herramientas a la hora de crear interfaces de usuario en Web al estilo HTML5.

La experiencia fue traumática, ya que me recordo lo realmente poco que se sobre HTML y Javascript, pero con un poco de ayuda de Google pude sacar adelante el proyecto.  El diseño básico de la página lo hice con iWeb y algo de PHP, y luego cree una especie de página de administración donde una persona autorizada puede entrar y cambiar ciertos contenidos de la pagina de forma dinámica.

Para este módulo de administración utilizé exclusivamente Bootstrap como base para la diagramación y la interfaz gráfica y, debo decir, la experiencia fue todo un placer.  Bootstrap pone las cosas de manera realmente sencilla y el resultado final es simplemente espectacular.

Por su parte, JQuery hace muy sencillo la manipulación de elementos dentro del HTML asi como la ejecución de código en forma asincrónica.  De hecho, todo el modulo de administración funciona en un solo HTML, usando DIVs para cada sección que, en otros casos, habrían sido paginas individuales.

Aca les dejo algunas imagenes de este modulo de administración en bootstrap + JQuery.  El sitio web en si pueden verlo en http://www.carmelitassanrafael.cl.



Pantalla de Login. La validación se hace mediante Javascript

La barra de tabs es generada y manejada automáticamente por Bootstrap; yo solo tuve que crear los DIVs para cada sección

Bootstrap incluso maneja elementos de interfaz visual para la validación de formularios, y una libreria de soporte permite crear reglas en forma declarativa, a fin de facilitar el proceso de validación de formularios.


lunes, marzo 12, 2012

Consejos de un viejo programador

Esto lo encontré en un post del grupo de programadores de Visual Foxpro y no pude mas que estar de acuerdo con todo lo planteado por este sabio programador, mayormente por propia experiencia. El texto original en inglés lo pueden ver aqui.

He estado programando durante un tiempo muy largo. Tanto que es increíblemente aburrido para mí. En el momento en que escribí este libro, sabía cerca de 20 lenguajes de programación y podía aprender otros nuevos en alrededor de un día a una semana dependiendo de lo raro que eran. Finalmente, esto sólo se volvió aburrido y no podía mantener mi interés más. Esto no significa que creo que la programación es aburrida, o que usted va a pensar que es aburrido, sólo que me parece que ya no es tan interesante en este punto de mi viaje. 
Lo que descubrí después de este viaje de aprendizaje es que no son los lenguajes lo que importa, sino lo que haces con ellos. En realidad, yo siempre lo supe, pero me distraía con los lenguajes y lo olvidaba periódicamente. Ahora ya no se me olvida, y usted tampoco debería hacerlo. 
Qué lenguaje de programación aprendes y usas, no importa. No se deje atrapar por la religion que acompaña a los lenguajes de programación lo que sólo te cegará a su verdadero propósito de ser tu herramienta para hacer cosas interesantes. 
La programación como una actividad intelectual es la única forma de arte que te permite crear arte interactivo. Puede crear proyectos que otras personas pueden jugar, y usted puede hablar con ellos indirectamente. Ninguna otra forma de arte es asi de interactiva. Las películas fluyen al público de forma directa. Las Pinturas no se mueven. El Código va en ambos sentidos. 
La programación como una profesión es sólo moderadamente interesante. Puede ser un buen trabajo, pero tu podrías hacer la misma cantidad de dinero y ser más feliz poniendo un restaurante de comida rápida. Harías mucho mejor usando la programación como tu arma secreta en otra profesión. 
Las personas que pueden programar en el mundo de las empresas de tecnología son una entre mil y no se les respeta. Las personas que pueden programar en biología, medicina, el gobierno, sociología, física, historia y matemáticas son respetadas y pueden hacer cosas increíbles para avanzar en esas disciplinas. 
Por supuesto, todos estos consejos no tienen sentido. Si te ha gustado aprender a escribir software con este libro, usted debe tratar de usarlo para mejorar su vida de cualquier manera posible. Salga y explore esta nueva, extraña y maravillosa búsqueda intelectual que casi nadie en los últimos 50 años ha sido capaz de explorar. Puede ser que también lo disfrute mientras pueda.

Por último, diré que el aprender a crear software te cambia y te hace diferente. No mejor ni peor, solo diferente. Usted puede encontrar que la gente te trata con aspereza porque puedes crear un software, tal vez usando palabras como "nerd". Tal vez usted encontrará que usted porque usted puede desbaratar su lógica ellos odian discutir con usted. Usted puede incluso encontrar que el simple conocimiento de cómo funciona una computadora lo vuelve molesto y extraño para ellos.
Para todo ello sólo tengo un consejo: Todos ellos pueden irse al infierno !
El mundo necesita más personas raras que sepan cómo funcionan las cosas y que les encante averiguarlo
Cuando te traten así, sólo recuerda que este este es tu viaje, no el de ellos. Ser diferente no es un delito, y las personas que te dicen que lo es, solo tienen celos de que hayas adquirido una habilidad que ellos nunca, ni en el mas loco de sus sueños podrían adquirir.
Tu sabes programar. Ellos no. Eso es muy muy cool !

lunes, febrero 20, 2012

VFP: Manejador de eventos en tiempo de ejecucion

Hay muchas situaciones en las que terminamos necesitando que una instancia de una clase propia pueda ejecutar codigo arbitrario en uno o mas de sus eventos, como por ejemplo en clases que se instancian en tiempo de ejecucion en lugar de hacerlo en tiempo de diseño.

Habiéndome topado con estos casos muchas veces, hace unos dias terminé escribiendo una clase que me permite añadir un manejador de eventos dinámicos a cualquier clase de forma sencilla. El primer paso es crear un manejador de eventos en la clase. Para esto le añadimos una propiedad que contendrá la instancia del manejador de eventos, la cual es creada en el constructor de la clase (evento Init):

THIS.Events = CREATEOBJECT("VEEventHandler")

Lo siguiente es definir los eventos que estarán disponibles y la forma de manejar los mismos. La clase permite dos formas de manejar los eventos declarados cuando estos son invocados.

Usando una clase controller
Consiste en asociar un metodo de una clase controladora al evento declarado de modo que, cuando se invoque el evento indicado este procesa a invocar el metodo indicado en la clase controladora. La principal ventaja de este metodo es que la asociacion entre el evento y su controlador puede ser modificada sin que esto afecte el código existente. La forma de definir estos eventos seria así:

THIS.Events.Add("sayHello","Hello",oController)

Lo que estamos diciendo aqui es:
define un evento llamado "sayHello" el cual, cuando sea invocado, llamará al método "Hello" del objeto "oController".

Usando codigo dinámico
Consiste en asociar un codigo VFP válido al evento, de modo que cuando este sea invocado se ejecute el método asociado al evento. La ventaja principal de este método es que no necesitamos de un segundo objeto que maneje los eventos y ademas el código asociado al evento puede cambiar dinámicamente sin afectar el resto del codigo de la aplicación. La forma de definir estos eventos es:

THIS.Events.Add("sayHi",cSayHiCode)


Como invocar los eventos
Una vez definidos los eventos que estarán disponibles en la clase, lo único que queda es invocarlos cuando sea necesario. La clase ofrece dos formas de invocar estos eventos:

Invocación directa
Consiste en invocar el evento directamente por su nombre:

miObjeto.Events.sayHello.Raise("World!")

El método Raise acepta hasta 10 parámetros, los cuales son pasados al método del controller asociado al evento, o a la sentencia PARAMETERS o LPARAMETERS del código asociado al mismo.

Invocación indirecta
Esta forma permite invocar el evento indirectamente, mediante un string que identifica el nombre del evento:

miObjeto.Events.Raise("sayHello","Mundo!")

El primer parámetro del metodo Raise recibe el nombre del evento a invocar y a partir de ahi los parámetros son pasados directamente al evento.

La clase con su código fuente y ejemplos puede ser descargada desde aqui.


NOTA IMPORTANTE
Mucha de la funcionalidad proporcionada por esta clase, sobre todo usando la figura de controllers, puede ser implementada de forma nativa en VFP a partir de la introducción del comando BINDEVENTS.  La ventaja que da esta clase es que la misma es compatible con cualquier versión de VFP (solo usando eventos manejados por controller; los eventos con código dinámico requieren de VFP 7 o superior).