tag:blogger.com,1999:blog-126509042024-02-07T00:05:41.042-05:00VictorEspina Personal BlogProgramación, Música y AppleManiaVictor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.comBlogger114125tag:blogger.com,1999:blog-12650904.post-29301647327137004202022-07-13T10:11:00.000-06:002022-07-13T10:12:01.897-06:00Acceso denegado a disco externo (Windows)<p> 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.</p><p>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. </p><p>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.</p><p>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.</p><p>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.</p><p>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: </p><p><a href="https://www.softzone.es/windows/como-se-hace/diferencias-fat32-ntfs-exfat/">https://www.softzone.es/windows/como-se-hace/diferencias-fat32-ntfs-exfat/</a></p><p>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.</p><p>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.</p><p>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.</p><p>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.</p><p>Hay un par de opciones mas que estoy investigando, así que esta historia continuara probablemente. </p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-70076605730020641002018-06-29T10:40:00.000-06:002018-06-29T10:51:06.913-06:00Sobre Mexico y AMLO<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px Helvetica}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px Helvetica; min-height: 29.0px}
</style>
<br />
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
Cuando Chavez empezó a hacer su campaña, mucha gente comenzó a llamar la atención, con preocupación,<span class="Apple-converted-space"> </span>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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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”.</div>
<div class="p2">
<br /></div>
<div class="p1">
Y así, Chavez ganó con una abrumadora mayoría. <span class="Apple-converted-space"> </span>Al inicio, debo reconocer, hasta yo empecé a ver con buenos ojos sus primeras acciones:<span class="Apple-converted-space"> </span>reducir el grosero salario de los parlamentarios, quitarles sus beneficios absurdos como escoltas, autos blindados, celulares pagados por los impuestos de todos, etc.</div>
<div class="p2">
<br /></div>
<div class="p1">
Pero muy pronto empezaron las señales de alerta.<span class="Apple-converted-space"> </span>Varios miembros de su gabinete, gente inteligente y preparada, empezaron a renunciar y alertar sobre las actitudes totalitarias de Chavez. <span class="Apple-converted-space"> </span>De nuevo, nadie les creyó.</div>
<div class="p2">
<br /></div>
<div class="p1">
Y ahi empezó, muy poco a poco, la aplicación de la receta comunista.<span class="Apple-converted-space"> </span>Todo comunista NECESITA inventarse dos enemigos: uno interno y otro externo.<span class="Apple-converted-space"> </span>Por que?<span class="Apple-converted-space"> </span>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.</div>
<div class="p2">
<br /></div>
<div class="p1">
En el caso de Chavez, el enemigo interno fue la empresa privada.<span class="Apple-converted-space"> </span>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.<span class="Apple-converted-space"> </span>Y asi, el discurso de “tu eres pobre porque LOS EMPRESARIOS siempre te han explotado y te han quitado lo que es tuyo”<span class="Apple-converted-space"> </span>cala MUY FACILMENTE.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
Con eso, mas el temor y la incertidumbre que las políticas y discursos de Chavez estaban causando en la clase empresarial,<span class="Apple-converted-space"> </span>se tenían ya todos los ingredientes para el desastre.</div>
<div class="p2">
<br /></div>
<div class="p1">
Los empresarios empezaron a sacar sus capitales al exterior para protegerlos del gobierno.<span class="Apple-converted-space"> </span>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. <span class="Apple-converted-space"> </span>Como?<span class="Apple-converted-space"> </span>bueno, gente conectada al gobierno empezó a recibir licencias para importar con el dolar oficial.<span class="Apple-converted-space"> </span>Esta gente recibía una cierta cantidad de dólares,<span class="Apple-converted-space"> </span>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.</div>
<div class="p2">
<br /></div>
<div class="p1">
Esto empezó a generar una presión inflacionaria por dos lados:<span class="Apple-converted-space"> </span>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.</div>
<div class="p2">
<br /></div>
<div class="p1">
Que hizo el gobierno?<span class="Apple-converted-space"> </span>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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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”.<span class="Apple-converted-space"> </span>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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
La familia Chavez que era una gente humilde del campo en su natal Barinas, pasaron a ser uno de los mayores terratenientes en Venezuela.<span class="Apple-converted-space"> </span>Hijos estudiando o vacacionando en USA y Europa, yates, fiestas privadas en playas paradisiacas, en fin.</div>
<div class="p2">
<br /></div>
<div class="p1">
Durante todo ese proceso, el gobierno se dió a la tarea de reformar las leyes (empezando por la constitución) para garantizar dos cosas:<span class="Apple-converted-space"> </span>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).</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
Y durante TODO ESE TIEMPO la gente decía: no vale, nosotros no terminaremos como cuba.</div>
<div class="p2">
<br /></div>
<div class="p1">
Y ahi vino el racionamiento y las famosas bolsas CLAP.<span class="Apple-converted-space"> </span>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.</div>
<div class="p2">
<br /></div>
<div class="p1">
Y bueno, para no hacer mas largo este cuento ya de por si largo, adivinen que?<span class="Apple-converted-space"> </span>Aun no estamos como en Cuba…pero nos parecemos MUCHO… y aun falta.<span class="Apple-converted-space"> </span>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. <span class="Apple-converted-space"> </span>Tengo primos que han pasado hasta 23 horas sin luz.<span class="Apple-converted-space"> </span></div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
Y el gobierno SIGUE INSISTIENDO que la culpa es de los empresarios y del “imperio”.</div>
<div class="p2">
<br /></div>
<div class="p1">
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.</div>
<div class="p2">
<br /></div>
<div class="p1">
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”.<span class="Apple-converted-space"> </span>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.</div>
<div class="p2">
<br /></div>
<div class="p1">
Puede que AMLO no sea Chavez, pero, honestamente, yo que Uds., no me tomaría el riesgo. <span class="Apple-converted-space"> </span></div>
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com4tag:blogger.com,1999:blog-12650904.post-27932605003701316542017-06-01T09:07:00.001-06:002017-06-01T09:20:01.524-06:00Freelancing, TopTal style<div class="separator" style="clear: both; text-align: center;">
<a href="https://drakuwa.files.wordpress.com/2014/05/toptal-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="257" data-original-width="800" height="102" src="https://drakuwa.files.wordpress.com/2014/05/toptal-logo.png" width="320" /></a></div>
Today, a fellow Venezuelan programmer talked to me about a freelancing site called <a href="https://www.toptal.com/web" target="_blank">TopTal</a><span id="goog_169474963"></span><a href="https://www.blogger.com/"></a><span id="goog_169474964"></span>. 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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-31563967818606616632015-06-03T12:41:00.001-05:002015-06-03T12:41:16.817-05:00Cannot read property 'aDataSort' of undefinedAcabo de perder 45 min investigando el error <b><span style="font-size: large;">Cannot read property 'aDataSort' of undefined</span></b> al inicializar un DataTable de jQuery.<br />
<br />
En google conseguí varias explicaciones de porque ocurre este error:<br />
<br />
<ul>
<li>El elemento <b>table</b> no contiene los elementos <b>thead</b> o <b>tbody</b></li>
<li>El elemento <b>thead</b> esta vacío</li>
<li>Hay mas columnas definidas en <b>thead</b> que las indicadas en la opción <b>columns</b></li>
<li>Una o mas de las columnas definidas en <b>columns</b> hacen referencia a una columna que no existe en el dataset aplicado.</li>
</ul>
<div>
<br /></div>
<div>
Ninguna de estas aplicaba a mi caso. Cual resulto ser el problema? que en lugar de tener:</div>
<div>
<br /></div>
<span style="font-family: Courier New, Courier, monospace;"><br /><table id="mytable"><br />...<br /><table></span><div>
<br /></div>
<div>
tenia:<div>
<br /></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace;"><</span><span style="font-family: Courier New, Courier, monospace;">table id="mytable" /</span><span style="font-family: 'Courier New', Courier, monospace;">></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">...</span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace;"><</span><span style="font-family: Courier New, Courier, monospace;">/table</span><span style="font-family: 'Courier New', Courier, monospace;">></span></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Notó el "/" extra en la apertura del nodo <b>table</b>? si? pues a mi me llevó 45 min verlo!! :(</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<br />
<br /></div>
Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com1tag:blogger.com,1999:blog-12650904.post-86223532322619558182015-03-17T15:27:00.000-05:002015-03-17T15:27:23.665-05:00OSX: Recuperar un arreglo RAID luego que uno de los discos ha falladoLa situación es esta:<br />
<br />
1. Un Mac Mini Server con dos discos de 1 TB, configurados en RAID<br />
2. Un dia, uno de los discos aparece marcado como <b>FAILED</b> y el RAID tiene estatus <b>DEGRADATED</b>.<br />
<br />
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.<br />
<br />
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.<br />
<br />
Luego de un par de meses de investigar, al final tome la decisión de arriesgarme y esto fue lo que hice:<br />
<br />
<br />
<ol>
<li>Utilizando un disco externo, hice un respaldo del disco principal usando Carbon Copy Cloner.</li>
<li>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.</li>
<li>Una vez iniciado OSX desde el disco externo, cargue la Utilidad de Discos</li>
<li>Una vez ahi, seleccione el arreglo RAID, seleccione el disco con problemas y pulsando en "-" lo desasocie del arreglo RAID.</li>
<li>Una vez retirado del RAID, procedi a formatear el disco con problemas </li>
<li>Una vez formateado, volvi a seleccionar el arreglo RAID y arrastre el disco nuevo a la ventana del arreglo RAID</li>
<li>Una vez confirmado el disco nuevo como parte del RAID, seleccione el arreglo y pulse en "Rebuild". </li>
<li>Luego de dos horas, el arreglo RAID estaba de nuevo <b>ONLINE</b></li>
<li>Una vez completado el proceso, volvi a configurar el disco RAID como disco de arranque y reinicie el servidor.</li>
</ol>
<div>
<br /></div>
<div>
Espero que esta pequeña guia sea de utilidad a otras personas que tengan que pasar por la misma situación.</div>
<div>
<br /></div>
<div>
<br /></div>
<br />
Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com1tag:blogger.com,1999:blog-12650904.post-30330699589509868242015-02-28T10:48:00.004-05:002015-02-28T10:48:58.719-05:00OSX: Sacar una aplicación de la "cuarentena"<div class="separator" style="clear: both; text-align: center;">
<a href="http://mactips.dwhoard.com/mactips/system/remove-quarantine/quarantine_box.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://mactips.dwhoard.com/mactips/system/remove-quarantine/quarantine_box.png" height="160" width="320" /></a></div>
<br />
Cuando descargamos una aplicación desde internet (en lugar de hacerlo desde la App Store), OSX coloca dicha aplicación en "cuarentena".<br />
<br />
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.<br />
<br />
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. <br />
<br />
Hay varias formas de eliminar ese flag de la aplicación:<br />
<br />
<br />
<ul>
<li>Ejecutar la aplicación y confirmar que deseamos confiar en ella</li>
<li>Mover la aplicación a la carpeta Aplicaciones</li>
</ul>
<div>
<br /></div>
<div>
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.</div>
<div>
<br /></div>
<div>
Para solucionar esto, necesitamos ejecutar el siguiente comando desde terminal:</div>
<div>
<br /></div>
<div>
<span style="background-color: #efefef; color: green; font-family: Courier, 'Courier New', serif; line-height: 21.6000003814697px;">xattr -d com.apple.quarantine /PATH/TO/APPLICATION</span></div>
<br />
<br />
(tome en cuenta que dependiendo de sus permisos, puede necesitar ejecutar la instruccion con <b>sudo</b>)<br />
<br />
<br />
Una vez ejecutada la instrucción, ya podremos abrir normalmente la aplicación sin tener que confirmarla.<br />
<br />
<br />
<br />
Fuente: <a href="http://mactips.dwhoard.com/mactips/system/remove-quarantine" target="_blank">MacTips</a>Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-14561697532113587782015-02-06T14:22:00.002-05:002015-05-30T20:20:40.899-05:00No cualquiera puede ser programadorEste texto lo tome de un foro de VFP en Español, cortesía del amigo Saul Piña:<br />
<br />
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:
<br />
<br />
<span style="border: 0px; color: blue; margin: 0px; padding: 0px; vertical-align: baseline;"><b>Hay que tener pasión para resolver problemas</b></span>
<br />
<ul>
<li>La programación de software es para el individuo que siente pasión por resolver problemas. </li>
<li>La experiencia indica que no todo el mundo le agrada la idea de andar resolviendo problemas. </li>
<li>El proceso de resolver problemas implica tener una mente proactiva, lista para el trabajo duro y constante</li>
<li>La mayoría de las personas son perezosas en este sentido.</li>
</ul>
<span style="border: 0px; color: blue; margin: 0px; padding: 0px; vertical-align: baseline;"><b>Toma tiempo dominar este arte</b></span>
<br />
<ul>
<li>El que piense que ser programador es cuestión de un evento, no está pensando correctamente o lo están desinformando deliberadamente.
</li>
<li>Llegar a ser un programador eficiente es producto de un proceso de aprendizaje que tarda años.
</li>
<li>La programación es un arte que se aprende en modo "prueba y error", consumiendo años de esfuerzo y energías.
</li>
<li>En pocas palabras, requiere trabajo duro y constante para llegar al nivel de ser productivo.
</li>
</ul>
<span style="border: 0px; color: blue; margin: 0px; padding: 0px; vertical-align: baseline;"><b>Hay que tener la actitud correcta</b></span>
<br />
<ul>
<li>El programador debe tener una actitud positiva, y al mismo tiempo, una mente tenaz.
</li>
<li>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.).
</li>
<li>La misma naturaleza de la tarea hace que cada paso sea un desafío. Aquí no existen atajos.
</li>
</ul>
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.<br />
<br />
<span style="border: 0px; color: blue; margin: 0px; padding: 0px; vertical-align: baseline;"><b>Pensar "outside the box"</b></span>
<br />
<ul>
<li>Para aprender programación es necesario pensar de manera abstracta.
</li>
<li>El pensamiento abstracto es fácticamente demostrable que no le es atractivo al "Layman" o "Average Joe"
</li>
</ul>
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:
<br />
<ul>
<li>(1) el método correcto de enseñanza
</li>
<li>(2) una mente fértil.
</li>
</ul>
<span style="border: 0px; color: blue; margin: 0px; padding: 0px; vertical-align: baseline;"><b>Planificación y diseño, luego ejecución</b></span>
<br />
<ul>
<li>Codificar es una cosa, planificar y diseñar la solución de un problema es otra cosa muy diferente.
</li>
<li>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.
</li>
<li>Es cierto que la programación es un arte, pero al mismo tiempo también es una ciencia.
</li>
<li>Es una combinación de creatividad y estructura mental. No están separadas, al contrario, coexisten indistintamente.
</li>
<li>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.
</li>
<li>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.
</li>
</ul>
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.
<br />
<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com1tag:blogger.com,1999:blog-12650904.post-22659575882323674172014-07-21T20:06:00.002-06:002014-07-21T20:08:56.299-06:00DP es ahora VFPDosPrint<div class="separator" style="clear: both; text-align: center;">
<a href="https://download-codeplex.sec.s-msft.com/Download?ProjectName=vfpx&DownloadId=33709&Build=20919" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="73" src="https://download-codeplex.sec.s-msft.com/Download?ProjectName=vfpx&DownloadId=33709&Build=20919" width="200" /></a></div>
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 <a href="https://vfpx.codeplex.com/wikipage?title=VFPDosPrint&referringTitle=Home" target="_blank">VFPDosPrint</a>.<br />
<br />
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.<br />
<br />
Gracias a Rick Shummer y todo el equipo de VFPx por todo el apoyo y la calurosa bienvenida que prodigaron a DP.<br />
<br />
<br />
<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com2tag:blogger.com,1999:blog-12650904.post-53652987978582314612014-05-21T09:54:00.001-06:002014-05-21T09:54:27.470-06:00Manejar el envio de un form con JQuery y AJAXTenemos 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.<br />
<br />
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.<br />
<br />
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:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">event.preventDefault();</span><br />
<br />
<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-51921847858319940432014-01-17T10:33:00.000-05:002014-01-17T10:33:02.609-05:00<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjON6i7UUS2XSEBANQ8lhR00T-bt92pzlRgcdlwOOWAwKfBfSTGBNNlQ_2xnplYuLN-gXLyCSlDcfwCI714i5JtMX-CUm9YDRkKdXk2jSyfFfwVPzndlnTCcHYs_QUHwtBU_s3XA/s400/Eros_Ramazzotti-Todo_Historias-Frontal.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjON6i7UUS2XSEBANQ8lhR00T-bt92pzlRgcdlwOOWAwKfBfSTGBNNlQ_2xnplYuLN-gXLyCSlDcfwCI714i5JtMX-CUm9YDRkKdXk2jSyfFfwVPzndlnTCcHYs_QUHwtBU_s3XA/s400/Eros_Ramazzotti-Todo_Historias-Frontal.jpg" height="200" width="200" /></a></div>
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.<br />
<br />
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.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br /><br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">EXODOS</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Eros Rammazzotti</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Tono: Sol Mayor</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Cifrado: Victor Espina</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: large;">G - D - C - % - % - G - D - C</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: large;">G D C D/</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">En una esquina</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">G D C </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">un escrito rezaba asi</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">C B7 Em</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">el último que salga que apague la luz</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">C B7 Em A Db</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">que no pueda nadie mirar... donde está...</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> F G</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">el pais del que te hablamos</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: large;">G D C</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Entre las ruinas</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">G D C D</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">un viejo se queda alli</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">C B7 Em A</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">con su gran dolor sin una lágrima ya</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Eb F G Eb</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">porque ya las ha llorado....</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> F G</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">en su corazón ahogado</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Bb Fm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Yo de aqui no puedo irme, nos decia</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">G# Gm F/</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">pues mis pies están cansados y además</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Bb Fm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">esta tierra es nuestra tierra, mirala</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">G# Gm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">el cerezo lo he plantado con mis manos</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">D#m Gm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">y en un mes o dos florecerá</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">D#m Gm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">como un signo de esperanza, renacerá</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">D#m Gm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">y al seguir el paso de mil huellas</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">D#m F</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">se me encoje el corazón porque</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Eb F</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">no puedo ver</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Eb F Gm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Como se marchan tantos amigos</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Dm Eb F Bb</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">tantos testigos que callarán</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Eb A7 Dm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Hasta las aves cuando amanezca</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Eb G#</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">alzando el vuelo emigrarán</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Gm/Fm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">lejos de esta mala suerte</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> G#</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">de este invierno, de esta muerte</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Gm/F</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">que otro frio nos traerá</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Eb - F - Gm - Dm - Eb - F - Bb</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Eb A7 Dm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Como se marchan todas las cosas</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Eb G#</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">las bellas esposas, como se marchan</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Gm/Fm</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">hacia donde quien sabrá</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> G#</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">que caminos andaran</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Gm/F</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">antes de poder parar</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Bb F Eb</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Y sobre el muro</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">Bb F Eb</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">queda escrito aquello que dice asi</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> D7 Gm D#m</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">el último que salga que apague la luz, y que</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Bb Eb</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">nunca mire a sus espaldas</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Bb Eb</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">que camine hasta encontrar</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Bb F</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">otro tiempo otra esperanza</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> Bb - F - Eb </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">por la humanidad</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;"> F Bb D#m - Bb</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: large;">En una esquina...</span><br />
<div>
<br /></div>
Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-44844845610828193782014-01-14T08:34:00.001-05:002014-01-14T08:35:49.008-05:00<div class="separator" style="clear: both; text-align: center;">
<a href="http://i1-news.softpedia-static.com/images/news2/Parallels-Desktop-7-for-Mac-Now-Available-to-General-Population-2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://i1-news.softpedia-static.com/images/news2/Parallels-Desktop-7-for-Mac-Now-Available-to-General-Population-2.jpg" width="200" /></a></div>
<div style="text-align: left;">
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. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
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.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
En estos casos, la solución consiste en terminar todos los procesos <i>prl_vm_app</i> que esten activos en ese momento y luego reiniciar el Parallels Desktop (ver <a href="http://kb.parallels.com/en/113881">aqui</a>). <br />
<br />
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.<br />
<br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-41053908738317754772013-09-15T10:36:00.001-05:002013-09-15T10:36:33.175-05:00Activar tipos de imagenes "escondidos" en Disk Utility<div class="separator" style="clear: both; text-align: center;">
<a href="http://i1-news.softpedia-static.com/images/news2/How-to-Back-Up-and-Restore-an-Entire-Mac-Disk-2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://i1-news.softpedia-static.com/images/news2/How-to-Back-Up-and-Restore-an-Entire-Mac-Disk-2.png" width="200" /></a></div>
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. <br />
<br />
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):<br />
<br />
<pre style="background-color: white; color: #9f2d00; font-family: Monaco, Courier, monospace; font-size: 12px; line-height: 16px; text-align: justify;"><code style="font-family: Monaco, Courier, monospace;">defaults write com.apple.DiskUtility advanced-image-options 1</code></pre>
<pre style="background-color: white; color: #9f2d00; font-family: Monaco, Courier, monospace; font-size: 12px; line-height: 16px; text-align: justify;"><code style="font-family: Monaco, Courier, monospace;">
</code></pre>
<pre style="background-color: white; color: #9f2d00; font-family: Monaco, Courier, monospace; font-size: 12px; line-height: 16px; text-align: justify;"><code style="font-family: Monaco, Courier, monospace;">
</code></pre>
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-82316343419105551522013-09-14T11:58:00.004-05:002013-09-14T11:59:20.642-05:00Problemas 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:<br />
<br />
<blockquote class="tr_bq">
<i>No se puede iniciar la sesión de depuración de T-SQL. No se puede conectar con el proceso de SQL Server</i></blockquote>
<br />
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:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">EXEC sp_addsrvrolemember 'Domain\Name', 'sysadmin'</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com2tag:blogger.com,1999:blog-12650904.post-7055233423916704012013-03-14T12:06:00.003-05:002013-03-14T12:16:49.285-05:00<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://cultofmac.cultofmaccom.netdna-cdn.com/wp-content/uploads/2013/02/mailboxreviewheader.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="http://cultofmac.cultofmaccom.netdna-cdn.com/wp-content/uploads/2013/02/mailboxreviewheader.jpg" width="200" /></a></div>
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.<br />
<br />
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.<br />
<br />
<br />
<br />
<br />
<br />
<a href="http://waxy.org/random/images/weblog/mailbox_queue-20130222-123550.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="http://waxy.org/random/images/weblog/mailbox_queue-20130222-123550.png" width="230" /></a>Cosas que espero mejoren en un futuro MUY próximo?<br />
<ul>
<li>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.</li>
<li>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.</li>
<li>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.</li>
</ul>
<div>
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. </div>
<div>
<br /></div>
<div>
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....</div>
<div>
<br /></div>
<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-15593755785763108162012-12-03T07:47:00.004-05:002012-12-03T07:48:38.746-05:00VFP: Obtener el nombre del PC en ambiente Terminal ServerSiempre he dicho que en lo simple esta la belleza del Universo y hoy vi esto confirmado una vez mas. <br />
<br />
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.<br />
<br />
Pero hoy, el gran Maestro Luis Maria Guayan me ha sorprendido con una forma mucho mas simple y elegante de resolver el problema:<br />
<br />
<br />
<pre class="brush: csharp;">IF UPPER(LEFT(GETENV("SESSIONNAME"),3)) == "RDP"
lcPC = GETENV("CLIENTNAME")
ELSE
lcPC = GETENV("COMPUTERNAME")
ENDIF
</pre>
<br />
<br />
<br />
Increíblemente simple!!<br />
<span style="color: #222222; font-family: Calibri; font-size: x-small;"><br /></span>
<span style="color: #222222; font-family: Calibri; font-size: x-small;"><br /></span>
<span style="background-color: white; color: #222222; font-family: Calibri; font-size: 13px;"><br /></span>Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com2tag:blogger.com,1999:blog-12650904.post-68682050709039091592012-11-02T09:54:00.002-05:002012-12-01T15:18:42.481-05:00OSX: Kernel Panics por CIJScannerRegister<div class="separator" style="clear: both; text-align: left;">
<a href="http://cache.lifehacker.com/assets/images/17/2011/05/1200-os-x-lion.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="112" src="http://cache.lifehacker.com/assets/images/17/2011/05/1200-os-x-lion.jpg" width="200" /></a>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.</div>
<br />
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.<br />
<br />
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.<br />
<br />
Resulto que si. Y el sospechoso común era un proceso llamado <b>CIJScannerRegister</b>. 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.<br />
<br />
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 <a href="http://www.help2go.com/content/tutorials/21-what-cijscannerregister.html#comments">aqui</a>.<br />
<br />
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.<br />
<br />
<h3>
<span style="color: blue;">Actualización Nov 5</span></h3>
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.<br />
<br />
<br />
<h3>
<span style="color: blue;">Actualización Dic 1</span></h3>
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.<br />
<br />
<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-76876355664258826632012-08-23T17:07:00.003-06:002012-08-23T17:15:29.554-06:00Plugin de Java en OSX Lion<div class="separator" style="clear: both; text-align: center;">
</div>
<a href="http://www.kodejava.org/images/java.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://www.kodejava.org/images/java.gif" /></a><span style="font-size: large;">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. </span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">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.</span><br />
<br />
<span style="font-size: large;">La solución?</span><br />
<ol>
<li><span style="font-size: large;">Abra una ventana de Terminal</span></li>
<li><span style="font-size: large;">Escriba o pegue este comando:<br /><span style="border: 0px; font-weight: bold; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">/</span><span style="background-color: #f9f9f9; color: #110000; line-height: 1.333;">Applications</span><span style="border: 0px; font-weight: bold; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">/</span><span style="background-color: #f9f9f9; color: #110000; line-height: 1.333;">Utilities</span><span style="border: 0px; font-weight: bold; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">/</span><span style="background-color: #f9f9f9; color: #110000; line-height: 1.333;">Java\ Preferences.app</span><span style="border: 0px; font-weight: bold; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">/</span><span style="background-color: #f9f9f9; color: #110000; line-height: 1.333;">Contents</span><span style="border: 0px; font-weight: bold; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">/</span><span style="background-color: #f9f9f9; color: #110000; line-height: 1.333;">MacOS</span><span style="border: 0px; font-weight: bold; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">/</span><span style="background-color: #f9f9f9; color: #110000; line-height: 1.333;">Java\ Preferences</span></span></li>
<li><span style="font-size: large;">Marque la opción <i>"Enable applet plug-in and Web Start applications"</i></span></li>
<li><span style="font-size: large;">Reinicie su navegador de internet</span></li>
</ol>
<div>
<br /></div>
<div>
<span style="font-size: large;">Fuente:</span></div>
<div>
<a href="http://sniptools.com/mac-osx/making-java-work-in-browsers-on-mac-osx-lion">http://sniptools.com/mac-osx/making-java-work-in-browsers-on-mac-osx-lion</a></div>
<div>
<br /></div>
<div>
<br /></div>
Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-44489742390034395052012-07-30T10:38:00.003-06:002012-07-30T10:38:27.667-06:00Web 2.0: Mi primer sitio web con JQuery y BootstrapLa 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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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. <br />
<br />
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.<br />
<br />
Aca les dejo algunas imagenes de este modulo de administración en bootstrap + JQuery. El sitio web en si pueden verlo en <a href="http://www.carmelitassanrafael.cl/">http://www.carmelitassanrafael.cl</a>.<br />
<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcDDRuJL9uYkzD6EKPNeW6tkQuEVExSFHLTF-aiP49hhjS-WgSHg3adkJFFyhxjdiJwmrj8wVDUD34m9NThEeHKbemEy1-ODnr9cyZtbJS1VdIMcOMmLsyva8fFNAUOoj2Ih5xIQ/s1600/Screen+Shot+2012-07-30+at+12.29.52+PM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="353" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcDDRuJL9uYkzD6EKPNeW6tkQuEVExSFHLTF-aiP49hhjS-WgSHg3adkJFFyhxjdiJwmrj8wVDUD34m9NThEeHKbemEy1-ODnr9cyZtbJS1VdIMcOMmLsyva8fFNAUOoj2Ih5xIQ/s640/Screen+Shot+2012-07-30+at+12.29.52+PM.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Pantalla de Login. La validación se hace mediante Javascript</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFVdhYMGWpLKnhUjrCDcucWX-hPXnVuOLdh0d12fsjAig7iK8uyFPgdUCUWn6v2UXUy0gZpiG00L_azuD2XUI0WBSOxQxwQ2XWdQgvJH0Sg3DQu2-Xux727oBwXmndUVPx62XtNQ/s1600/Screen+Shot+2012-07-30+at+12.30.04+PM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFVdhYMGWpLKnhUjrCDcucWX-hPXnVuOLdh0d12fsjAig7iK8uyFPgdUCUWn6v2UXUy0gZpiG00L_azuD2XUI0WBSOxQxwQ2XWdQgvJH0Sg3DQu2-Xux727oBwXmndUVPx62XtNQ/s640/Screen+Shot+2012-07-30+at+12.30.04+PM.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">La barra de tabs es generada y manejada automáticamente por Bootstrap; yo solo tuve que crear los DIVs para cada sección</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio1eNKl3Nrec1jAfrJrz3ktIJNutzNn-TC0K77XPoCPLTxbF-xLgHLjVPx6y3kI06ZYq8y82woYq3HYtdm9tfyDnV_rFgA66AciIZ-YIwyyjhiSGJvgRBcrZvBT2KiaF8e_nKe8g/s1600/Screen+Shot+2012-07-30+at+12.30.17+PM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio1eNKl3Nrec1jAfrJrz3ktIJNutzNn-TC0K77XPoCPLTxbF-xLgHLjVPx6y3kI06ZYq8y82woYq3HYtdm9tfyDnV_rFgA66AciIZ-YIwyyjhiSGJvgRBcrZvBT2KiaF8e_nKe8g/s640/Screen+Shot+2012-07-30+at+12.30.17+PM.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">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.</td></tr>
</tbody></table>
<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com1tag:blogger.com,1999:blog-12650904.post-68782230421481974972012-03-12T14:38:00.003-05:002012-03-12T14:39:45.557-05:00Consejos de un viejo programadorEsto 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 <a href="http://learnpythonthehardway.org/book/advice.html">aqui</a>.<br />
<br />
<blockquote class="tr_bq">
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Calibri; font-size: small; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="I've been programming for a very long time.">He estado programando durante un tiempo muy largo. T</span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="So long that it's incredibly boring to me.">anto que es increíblemente aburrido para mí. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="At the time that I wrote this book, I knew about 20 programming languages and could learn new ones in about a day to a week depending on how weird they were.">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. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Eventually though this just became boring and couldn't hold my interest anymore.">Finalmente, esto sólo se volvió aburrido y no podía mantener mi interés más. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="This doesn't mean I think programming is boring, or that you will think it's boring, only that I find it uninteresting at this point in my journey.">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.</span><span style="background-color: transparent;"> </span></div>
</blockquote>
<blockquote class="tr_bq">
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Calibri; font-size: small; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="This doesn't mean I think programming is boring, or that you will think it's boring, only that I find it uninteresting at this point in my journey."></span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="What I discovered after this journey of learning is that it's not the languages that matter but what you do with them.">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. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Actually, I always knew that, but I'd get distracted by the languages and forget it periodically.">En realidad, yo siempre lo supe, pero me distraía con los lenguajes y lo olvidaba periódicamente. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Now I never forget it, and neither should you.">Ahora ya no se me olvida, y usted tampoco debería hacerlo.</span><span style="background-color: transparent;"> </span></div>
</blockquote>
<blockquote class="tr_bq">
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Calibri; font-size: small; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Now I never forget it, and neither should you."></span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Which programming language you learn and use doesn't matter.">Qué lenguaje de programación aprendes y usas, no importa. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Do not get sucked into the religion surrounding programming languages as that will only blind you to their true purpose of being your tool for doing interesting things.">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.</span><span style="background-color: transparent;"> </span></div>
</blockquote>
<blockquote class="tr_bq">
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Calibri; font-size: small; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Do not get sucked into the religion surrounding programming languages as that will only blind you to their true purpose of being your tool for doing interesting things."></span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Programming as an intellectual activity is the only art form that allows you to create interactive art.">La programación como una actividad intelectual es la única forma de arte que te permite crear arte interactivo. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="You can create projects that other people can play with, and you can talk to them indirectly.">Puede crear proyectos que otras personas pueden jugar, y usted puede hablar con ellos indirectamente. Ninguna </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="No other art form is quite this interactive.">otra forma de arte es asi de interactiva. Las películas fluyen al público de forma directa</span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Movies flow to the audience in one direction.">. Las </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Paintings do not move.">Pinturas no se mueven. El </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Code goes both ways.">Código va en ambos sentidos.</span><span style="background-color: transparent;"> </span></div>
</blockquote>
<blockquote class="tr_bq">
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Calibri; font-size: small; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Code goes both ways."></span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Programming as a profession is only moderately interesting.">La programación como una profesión es sólo moderadamente interesante. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="It can be a good job, but you could make about the same money and be happier running a fast food joint.">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 </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="You're much better off using code as your secret weapon in another profession.">mucho mejor usando la programación como tu arma secreta en otra profesión.</span><span style="background-color: transparent;"> </span></div>
</blockquote>
<blockquote class="tr_bq">
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Calibri; font-size: small; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="You're much better off using code as your secret weapon in another profession."></span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="People who can code in the world of technology companies are a dime a dozen and get no respect.">Las personas que pueden programar en el mundo de las empresas de tecnología son una entre mil y no se les respeta. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="People who can code in biology, medicine, government, sociology, physics, history, and mathematics are respected and can do amazing things to advance those disciplines.">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.</span><span style="background-color: transparent;"> </span></div>
</blockquote>
<blockquote class="tr_bq">
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Calibri; font-size: small; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="People who can code in biology, medicine, government, sociology, physics, history, and mathematics are respected and can do amazing things to advance those disciplines."></span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Of course, all of this advice is pointless.">Por supuesto, todos estos consejos no tienen sentido. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="If you liked learning to write software with this book, you should try to use it to improve your life any way you can.">Si te ha gustado aprender a escribir software con este libro, usted debe tratar de usarlo para mejorar su vida de cualquier manera posible. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Go out and explore this weird wonderful new intellectual pursuit that barely anyone in the last 50 years has been able to explore.">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. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Might as well enjoy it while you can.">Puede ser que también lo disfrute mientras pueda.</span></div>
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Might as well enjoy it while you can."></span><br />
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', geneva, verdana, sans-serif; font-size: 14px; line-height: 21px; margin-bottom: 0.5em; margin-top: 0.8em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Might as well enjoy it while you can."><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Finally, I'll say that learning to create software changes you and makes you different.">Por último, diré que el aprender a crear software te cambia y te hace diferente. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Not better or worse, just different.">No mejor ni peor, solo diferente. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="You may find that people treat you harshly because you can create software, maybe using words like "nerd".">Usted puede encontrar que la gente te trata con aspereza porque puedes crear un software, tal vez usando palabras como "nerd". </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Maybe you'll find that because you can dissect their logic that they hate arguing with you.">Tal vez usted encontrará que usted porque usted puede desbaratar su lógica ellos odian discutir con usted. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="You may even find that simply knowing how a computer works makes you annoying and weird to them.">Usted puede incluso encontrar que el simple conocimiento de cómo funciona una computadora lo vuelve molesto y extraño para ellos.</span></span></div>
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Might as well enjoy it while you can.">
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', geneva, verdana, sans-serif; font-size: 14px; line-height: 21px; margin-bottom: 0.5em; margin-top: 0.8em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: baseline;">
<span style="background-color: whitesmoke; color: #333333; font-family: arial, sans-serif; font-size: 16px; line-height: normal;">Para todo ello sólo tengo un consejo: Todos ellos pueden irse al infierno !</span></div>
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', geneva, verdana, sans-serif; font-size: 14px; line-height: 21px; margin-bottom: 0.5em; margin-top: 0.8em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="The world needs more weird people who know how things work and who love to figure it all out.">El mundo necesita más personas raras que sepan cómo funcionan las cosas y que les encante averiguarlo</span></div>
<div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', geneva, verdana, sans-serif; font-size: 14px; line-height: 21px; margin-bottom: 0.5em; margin-top: 0.8em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: baseline;">
<span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="When they treat you like this, just remember that this is your journey, not theirs.">Cuando te traten así, sólo recuerda que este este es tu viaje, no el de ellos. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="Being different is not a crime, and people who tell you it is are just jealous that you've picked up a skill they never in their wildest dreams could acquire.">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.</span></div>
</span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="You can code.">Tu sabes programar. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="They cannot.">Ellos no. </span><span style="background-color: whitesmoke; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: arial, sans-serif; font-size: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;" title="That is pretty damn cool.">Eso es muy muy cool !</span></div>
</blockquote>Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com7tag:blogger.com,1999:blog-12650904.post-84565362874037029772012-02-20T09:40:00.001-05:002012-02-20T10:44:23.957-05:00VFP: Manejador de eventos en tiempo de ejecucionHay 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.<br />
<br />
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):<br />
<br />
<pre class="brush: csharp;">THIS.Events = CREATEOBJECT("VEEventHandler")
</pre>
<br />
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.<br />
<br />
<b>Usando una clase controller</b><br />
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í:
<br />
<br />
<pre class="brush: csharp;">THIS.Events.Add("sayHello","Hello",oController)
</pre>
<br />
Lo que estamos diciendo aqui es:<br />
<blockquote class="tr_bq">
<i>define un evento llamado "sayHello" el cual, cuando sea invocado, llamará al método "Hello" del objeto "oController"</i>.</blockquote>
<br />
<b>Usando codigo dinámico</b><br />
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:<br />
<br />
<pre class="brush: csharp;">THIS.Events.Add("sayHi",cSayHiCode)
</pre>
<br />
<br />
<b>Como invocar los eventos</b><br />
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:<br />
<br />
<b>Invocación directa</b><br />
Consiste en invocar el evento directamente por su nombre:
<br />
<br />
<pre class="brush: csharp;">miObjeto.Events.sayHello.Raise("World!")
</pre>
<br />
El método <i>Raise</i> 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.<br />
<br />
<b>Invocación indirecta</b><br />
Esta forma permite invocar el evento indirectamente, mediante un string que identifica el nombre del evento:
<br />
<br />
<pre class="brush: csharp;">miObjeto.Events.Raise("sayHello","Mundo!")
</pre>
<br />
El primer parámetro del metodo <i>Raise</i> recibe el nombre del evento a invocar y a partir de ahi los parámetros son pasados directamente al evento.<br />
<br />
La clase con su código fuente y ejemplos puede ser descargada desde <a href="http://www.victorespina.com.ve/hs/files/vfp/dwn/geh.zip">aqui</a>.<br />
<br />
<br />
<b><span style="color: red;">NOTA IMPORTANTE</span></b><br />
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 <i>BINDEVENTS</i>. 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).<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com0tag:blogger.com,1999:blog-12650904.post-7931619480440738792012-02-04T14:06:00.001-05:002017-02-11T08:36:56.218-05:00VFP: Un parser para JSON<br />
Para los que, como yo, nunca hayan escuchado hablar de JSON, se trata de una tecnologia ampliamente usada en la web para el intercambio de datos entre sistemas desconectados. Básicamente es lenguaje muy simple que permite definir objetos y su contenido. Los parsers JSON hacen dos cosas:<br />
<br />
a) Toman una referencia a un objeto (normalmente JavaScript) y genera una representación JSON en forma de string<br />
b) Toman un string JSON y devuelve el objeto original<br />
<br />
A pesar que en el sitio JSON.org se pueden encontrar dos parsers JSON para VFP, decidi hacer mi propio parser usando solo código VFP y, de paso, incluyendo un par de mejoras al estilo fox.<br />
<br />
La mejor de estas adiciones es lo que llame "schema". Un schema es basicamente una forma de definir uns estructura de datos reutilizable, al estilo de la construcción STRUCT en C# (pero sin la posibilidad de incluir metodos).<br />
<br />
Por ejemplo, para definir el schema "User":<br />
<br />
<pre class="brush: csharp;">JSON.declareSchema("User","{loginName:string, fullName: string, profileId: numeric, active: boolean}")</pre>
<br />
Luego, cuando queremos trabajar con un objeto que represente un usuario, solo hacemos:<br />
<br />
<pre class="brush: csharp;">oUser = JSONObject("schema:User")
oUser.loginName = 'vespina'
oUser.fullName = 'Victor Espina'
oUser.profileId = 25
oUser.active = .T.
</pre>
<br />
<br />
Supongamos ahora que queremos almacenar los datos del usuario que modifico un registro. Con JSON podriamos hacerlo asi:<br />
<br />
<pre class="brush: csharp;">SELECT clientes
REPLACE rowLastUpd WITH DATETIME(),;
rowUpdBy WITH oUser.ToJSON()
</pre>
<br />
Luego, cuando queramos mostrar quien modifico el registro, hacemos:<br />
<br />
<pre class="brush: csharp;">oUser = JSONObject(clientes.rowUpdBy)
MESSAGEBOX("Este registro fue modificado por " + oUser.fullName)
</pre>
<br />
<br />
Otro uso muy comun de JSON es crear objetos sobre la marcha de forma sencilla:<br />
<br />
<pre class="brush: csharp;">oPoint = JSONObject("{x:10, y:20}")
?oPoint.x --> 10
</pre>
<br />
<br />
Como ven, las posibilidades son muchas. En la documentacion de la libreria hay multitud de ejemplos de todo lo que se puede hacer con ella.<br />
<br />
<br />
Descargar <a href="http://www.noiqs.com/sos/qdfoxJSON.rar">qdfoxJSON</a> (version 1.2 del 9 Feb de 2012).Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com5tag:blogger.com,1999:blog-12650904.post-63085206745429110792011-12-02T12:07:00.001-05:002011-12-02T12:29:56.663-05:00EasyMax: problemas de intercalacion (collation) en SQL ServerLa librería FASTCALC.LIB utiliza frecuentemente una técnica que consiste en subir un cursor con ciertos datos al servidor en forma de tabla temporal, que luego es usada para filtrar datos específicos de una o mas tablas del sistema.<br />
<br />
Sin embargo, cuando sucede que la BD utiliza un collation distinto al collation configurado en el servidor SQL Server (situación que se presenta típicamente cuando se restaura la BD desde un backup hecho en otro servidor que usaba un collation distinto), se produce un error de intercalación al intentar mezclar en un mismo SELECT los datos de la tabla temporal con datos de las tablas de la BD.<br />
<br />
Aun peor, el problema no se limita a las funciones de FASTCALC.LIB sino que afecta a cualquier rutina que haga uso de las funciones QGetTempName(), QCursor2Temp() y QCloseTemp() de dicha librería.<br />
<br />
El problema se genera en la función QVFP2ODBC(), que es la encargada de tomar un cursor de memoria y subirlo a la BD en forma de tabla temporal. Al hacer esto, las columnas tipo CHAR o VARCHAR son creadas con el collation por omisión del servidor (digamos MODERN_SPANISH), el cual no necesariamente coincide con el collation usado en la BD actual (ej, LATIN_GENERAL).<br />
<br />
La siguiente version de QVFP2ODBC() soluciona este problema instruyendo a SQL Server para que cree las columnas CHAR y VARCHAR de la tabla temporal usando el collation de la BD actual en lugar del collation del servidor, lo cual soluciona el problema al garantizar que tanto la tabla temporal como las tablas relacionadas en la BD actual usan el mismo collation:<br />
<br />
<br />
<pre class="brush: csharp;">
* QVFP2ODBC (FASTCALC.LIB)
* Toma un cursor de memoria y lo sube a la BD actual utilizando el collation de la BD
*
#DEFPARAM pcCursor,pcTable,poDB
*-- Se obtienen la estructura del cursor local
*
#defvar aStr,nCount
#dim aStr[1x1]
#dbselect &pcCursor
nCount:=AFIELDS(aStr)
#let pcTable:="#"+pcCursor on vartype(pcTable)<>"C" or empty(pcTable)
#let pcTable:="#"+pcTable on left(pcTable,1)<>"#"
#let poDB:=CURDB on Type("poDB.Name")<>"C"
*-- Se crea el comando CREATE para crear la tabla temporal en SQL
*
#defvar i,cSQL,nResult,cSQLDT,cIL
cSQL:="CREATE TABLE "+pcTable+" ("
cIL:="("
#for i:=1 to nCount
cSQLDT:=""
#let cSQLDT:="CHAR("+ALLT(STR(aStr[i,3]))+") COLLATE database_default" on aStr[i,2]="C" and aStr[i,3]<=10
#let cSQLDT:="VARCHAR("+ALLT(STR(aStr[i,3]))+") COLLATE database_default" on aStr[i,2]="C" and aStr[i,3]>10
#let cSQLDT:="NUMERIC("+ALLT(STR(aStr[i,3]))+","+ALLT(STR(aStr[i,4]))+")" on aStr[i,2]="N"
#let cSQLDT:="BIT" on aStr[i,2]="L"
#let cSQLDT:="TEXT COLLATE database_default" on aStr[i,2]="M"
#let cSQLDT:="DATETIME" on aStr[i,2] $ "DT"
#let cSQLDT:="INT" ON aStr[i,2] $ "I"
#IF EMPTY(cSQLDT)
MESSAGEBOX("Tipo no reconocido: " + aStr[i,2],0,"QVFP2ODBC")
#ENDIF
cSQL:=cSQL + IIF(i>1,",","") + aStr[i,1] + " " + cSQLDT + " NOT NULL"
cIL:=cIL + IIF(i>1,",","") + "?m."+aStr[i,1]
#endfor
cSQL:=cSQL + ")"
cIL:=cIL + ")"
#defvar nODBCHnd
nODBCHnd:=QGethODBC(poDB)
*-- Se crea la tabla temporal
nResult:=SQLEXEC(nODBCHnd,cSQL)
#IF nResult < 0
SQLEXEC(nODBCHnd,"DROP TABLE "+pcTable)
nResult:=SQLEXEC(nODBCHnd,cSQL)
#ENDIF
#If nResult < 0
Kernel.Err.Capture()
#return No
#ENDIF
*-- Se carga la data del cursor en la tabla temporal
*
#dbselect &pcCursor
#dbgo top
#dowhile not eof()
#fieldstovars
SQLEXEC(nODBCHnd,"INSERT INTO "+pcTable+" VALUES "+cIL)
#dbskip
#ENDDO
#return Si
</pre>Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com3tag:blogger.com,1999:blog-12650904.post-85522327687946474142011-11-18T10:54:00.001-05:002012-01-26T16:01:08.064-05:00VFP: Clausula READWRITE para VFP 6Como sabemos, los cursores creados por el comando SELECT INTO en VFP son solo lectura. A partir de VFP 7 se incluyo una clausula llamada READWRITE que nos permite indicar si queremos que el cursor sea de lectura-escritura, lo cual es sumamente útil en infinidad de situaciones.<div>
<br /></div>
<div>
Sin embargo, para los que por algún motivo aun debemos seguir trabajando con versiones anteriores a VFP 7, convertir un cursor a lectura-escritura representa todo un reto. El truco mas usado para lograr esto en VFP 6 es usar la clausula NOFILTER para asegurarnos que VFP creara un cursor fisico temporal, hacer una copia fisica del cursor temporal con otro nombre, cerrar el cursor original y luego abrir el cursor temporal con el nombre original del cursor:</div>
<div>
<br /></div>
<pre class="brush: csharp;">
SELECT * FROM mitabla INTO CURSOR Q1 NOFILTER
SELECT Q1
COPY FILE (DBF("Q1")) TO ("Q1.TMP")
USE IN Q1
SELECT 0
USE ("Q1.TMP") ALIAS Q1
</pre>
<br/>
<div>
Pero esta solución dista mucho de ser perfecta, especialmente si el cursor original contaba con columnas cuyo nombre superara los 10 caracteres. En estos casos, el nombre de esas columnas era truncado lo cual causaba molestos problemas con las referencias a esas columnas en el código.</div>
<div>
<br /></div>
<div>
Hace un tiempo ayudé a un amigo a encontrar una forma de solventar este problema, y me encontré con que, como siempre, VFP me daba todas las herramientas necesarias para lograrlo; era solo cuestión de ponerlas a trabajar juntas.</div>
<div>
<br /></div>
<div>
En este caso, la ayuda llegó de la mano de los <i>arrays</i>. Yo sabía desde siempre que VFP contaba con una función que tomaba la estructura de un DBF o cursor y la almacenaba en un array. Lo que no sabía es que tanto el comando CREATE CURSOR como INSERT INTO contenían la clausula FROM ARRAY.</div>
<div>
<br /></div>
<div>
El resultado? una función que recibe el nombre de un cursor solo-lectura y lo convierte en lectura-escritura respetando los nombres largos de columna.</div>
<div>
<br /></div>
<div>
Aqui les dejo la función por si les resulta útil (NOTA Nov 19: limpié y mejoré un poco el código, ademas de corregir un problema cuando el cursor original estaba vacío).</div>
<div>
<br /></div>
<div>
<pre class="brush: csharp;">
* openForUpdate()
* Función que recibe un cursor de S/L y lo convierte en L/E respetando las columnas con nombres largos
*
* Autor: Victor Espina
*
PROCEDURE openForUpdate(pcCursor)
*
* Obtenemos el schema del cursor
LOCAL ARRAY aSchema[1]
AFIELDS(aSchema, pcCursor)
* Obtenemos el contenido del cursor
LOCAL ARRAY aRows[1]
LOCAL nRowCount
SELECT * FROM (pcCursor) INTO ARRAY aRows
nRowCount = _TALLY
* Cerrar el cursor original, lo recreamos como un cursor de L/E
* y lo llenamos con los datos originales (si habia)
SELECT (pcCursor)
USE
CREATE CURSOR (pcCursor) FROM ARRAY aSchema
IF nRowCount > 0
INSERT INTO (pcCursor) FROM ARRAY aRows
ENDIF
GO TOP
*
ENDPROC
</pre>
</div>Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com2tag:blogger.com,1999:blog-12650904.post-6132769480167391402011-11-15T11:59:00.001-05:002012-01-26T16:01:13.904-05:00VFP: Crear un buffer rapidamentePrimero, aclaremos conceptos. Llamo "buffer" a un objeto muy liviano cuya unica función es contener data temporal en forma de propiedades. En muchos sentidos vendria a ser como una versión <i>light</i> de un STRUCT, solo que sin la posibilidad de incluir métodos; solo propiedades.<br />
<br />
Por ejemplo, si quiero pasar información sobre una persona de un form a otro, me seria muy útil pasar un solo parámetro que contuviera toda la información de esa persona. Una forma de lograr esto es crear una clase "Persona" que contenga las propiedades para almacenar la información sobre una persona, pero muchas veces queremos lograr lo mismo sin la sobrecarga de crear una clase que en si misma no hace nada.<br />
<br />
Ese objeto "temporal" que sirve para almacenar múltiples informaciones relacionadas, es lo que llamo "buffer". La función <b><i>crearBuffer</i></b> hace justamente eso: crea un buffer con una lista de propiedades dada y, opcionalmente, inicializa esas propiedades con los datos suministrados; todo en una misma instrucción.<br />
<br />
Ejemplo:<br />
<br />
<pre class="brush: csharp">LOCAL oPersona
oPersona = crearBuffer("nombre,apellido,cedula,fechaNac,cargo","Victor","Espina","12345678",{18-11-1970})
?oPersona.Nombre --> "Victor"
?oPersona.Apellido --> "Espina"
</pre>
<br />
<br />
Práctico, cierto? aqui les dejo el código fuente.<br />
<br />
<pre class="brush: csharp">*-- crearBuffer
* Funcion para crear un buffer de datos e inicializarlo. Compatible con VFP 5 o superior
*
* Autor: V Espina
*
* Ejemplo:
* oBuff = CFDBuffer("Nombre,Apellido","Victor","Espina")
* ?oBuff.Nombre -> "Victor"
* ?oBuff.Apellido -> "Espina"
*
PROCEDURE crearBuffer
LPARAMETERS pcItemList,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19
*
LOCAL oBuff,i,cProp
oBuff=CREATEOBJECT("Custom")
LOCAL cPropName,uPropValue,nCount
LOCAL ARRAY aProps[1]
nCount = ALINES(aProps,STRT(pcItemList,",",CHR(13)+CHR(10)))
FOR i=1 TO MIN(nCount,20)
cPropName = aProps[i]
uPropValue = EVALUATE("P" + ALLTRIM(STR(i - 1)))
oBuff.AddProperty(cPropName, uPropValue)
ENDFOR
RETURN oBuff
*
ENDPROC
</pre>
<div>
<br /></div>Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com1tag:blogger.com,1999:blog-12650904.post-49052148304220526202011-11-07T09:38:00.000-05:002013-12-21T10:15:33.072-05:00VFP: Como crear un dll en .NET y usarlo desde VFP<br />
Alguien una vez dijo que no es cuestion de cambiarse de un lenguaje a otro sino de usar la herramienta adecuada al problema que se desea resolver. C# es excelente para muchas cosas en las que VFP no es tan bueno, por lo que el poder crear un DLL en C# y usarlo en VFP se convierte en algo muy poderoso.<br />
<br />
Aqui les dejo todo un conjunto de tips para lograr justamente esto:<br />
<br />
1. En tu clase C# debes incluir el namespace System.Runtime.InteropServices;<br />
<br />
2. La clase que deseas accesar desde VFP debe estar declarada como public y tener estas directivas:<br />
<br />
<pre class="brush: csharp">[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("className")]
</pre>
<br />
donde "className" es el nombre OLE de la clase, es decir, el que usaras en el CREATEOBJECT en VFP.<br />
<br />
3 Los metodos de la clase que quieras accesar desde VFP deben estar declarados como public y no ser estaticos.<br />
<br />
4. Los metodos publicos de la clase no pueden tener sobrecargas, es decir, multiples versiones del mismo metodo con diferentes parametros.<br />
<br />
5. Si un metodo devuelve un tipo estructurado, este tipo debe ser creado como class (no como struct) y cumplir con todas las condiciones indicadas en los puntos 1, 2, 3 y 4.<br />
<br />
6. Si un metodo devuelve un array de cualquier tipo (ej, string[]), VFP lo recibe como un tipo ARRAY y no como un objeto (como lo es en .NET), por lo que no podremos acceder a las propiedaes del array, tal como Lenght, pero si a sus items:<br />
<br />
<pre class="brush: csharp">aItems = myClass.MyMethod()
FOR EACH oItem IN aItems
?oItem.Property
ENDFOR
o
aItems = myClass.MyMethod()
FOR i = 1 TO ALEN(aItems,1)
oItem = aItems[i]
?oItem.Property
ENDFOR
</pre>
<br />
7. Antes de compilar la clase, debes ir a las propiedades del proyecto, Application, boton Assembly Information y marcar la casilla "Make assembly COM-visible"<br />
<br />
8. Debes firmar la DLL. Para esto, sigue los pasos indicados <a href="http://ryanfarley.com/blog/archive/2010/04/23/sign-a-.net-assembly-with-a-strong-name-without-recompiling.aspx">aqui</a><br />
<br />
9. Una vez compilada la dll, la misma debe ser registrada de la siguiente forma antes de poder ser usada en VFP:<br />
<br />
Windows 32 bits:<br />
C:\WINDOWS\microsoft.net\framework\v2.0.50727\regasm mylib.dll /register /codebase /tlb<br />
<br />
Windows 64 bits<br />
C:\WINDOWS\microsoft.net\framework64\v2.0.50727\regasm mylib.dll /register /codebase /tlb<br />
<br />
<br />
<br />Victor Espinahttp://www.blogger.com/profile/00326701048524315194noreply@blogger.com3