Mostrando entradas con la etiqueta Informática. Mostrar todas las entradas
Mostrando entradas con la etiqueta Informática. Mostrar todas las entradas

domingo, 26 de septiembre de 2021

Eliminar credenciales de red webdav en windows

Contexto:

Trabajo para una compañía que maneja datos personales. Esos datos personales solo pueden permanecer en el servidor de la compañía, al que puedo acceder con una suite ofimática online penosa o bien a través de webdav.

Normalmente, accedo desde webdav con el conector de archivos remotos de libreoffice, pero hay algunas cosas que libreoffice no puede hacer (por ejemplo, exportar a un PDF remoto). Asimismo, hay otras operaciones que la versión web del manejador de archivos no puede hacer (por ejemplo, copiar un archivo a otra carpeta).

Por ello, empleo el conector webdav de windows:

net use <unidad> \\<servidorDav>\<ruta-a-webdav>

Windows me pide mis credenciales de red, tras lo que Windows abre la carpeta DAV como si fuera una unidad de disco.

De esta manera, puedo acceder a la carpeta DAV como si fuera una letra de unidad. Si abro algún archivo de ella desde openoffice, me vuelven a pedir la contraseña si quiero abrirlo en modo de edición.

Cuando termino la sesión, empleo el comando:

net use /delete <unidad>

Eso cierra la sesión. Sin embargo, la siguiente vez que escribo:

net use <unidad> \\<servidorDav>\<ruta-a-webdav>

Ya no se me pide la contraseña, lo cual es preocupante, porque estamos hablando de una carpeta con datos sensibles. ¿Cómo hacer que windows me pida la contraseña CADA VEZ?

El primer sistema es añadir /persistent:no al comando con que me conecto al servidor:

net use <unidad> \\<servidorDav>\<ruta-a-webdav> /persistent:no

De esa manera, me aseguro de que Windows no almacene esa conexión de red en su caché de conexiones. Sin embargo, si ya usé previamente el comando sin la opción /persistent:no, la conexión seguirá en la caché.

Otra opción es reiniciar el servicio Cliente Web de windows. Se puede hacer desde services.msc o desde la consola, pero en cualquier caso nos exigirá que seamos administradores, lo que es un tanto problemático:

net stop webclient

net start webclient

Una opción que suelo usar yo en ordenadores en que el usuario estándar tiene acceso a powershell (sabiéndome, claro está, la contraseña de administrador) es:

powershell start net -argumentlist { start webclient } -verb runas

powershell start net -argumentlist { start webclient } -verb runas

Sin embargo, como digo, el sistema anterior solo funciona siendo administrador del sistema, lo que es preocupante. Hay quien dice que al salir de la sesión se borra la caché de conexiones, pero yo no lo tengo nada claro...

domingo, 13 de junio de 2021

Recuerdos de un vejestorio: los manuales

Nos hemos acostumbrado a aprender por intuición. Pero la intuición a veces no es nada intuitiva. Recuerdo la primera vez que usé un Macintosh. A pesar de que la interfase de usuario de Windows se basaba en el famoso GUI de los ordenadores de la manzanita, me sentí completamente perdido.

Y es que si miramos nuestras pantallas veremos símbolos que nos hemos ido acostumbrando a descifrar, pero cuya relación con el referente es tan poco intuitiva como la que hay entre el carácter chino 口 y una boca, o entre la A y una vaca. Una vez sabido el significado es fácil reconocer que el signo es icónico: 口 se parece evidentemente a una boca; la A es una cabeza de vaca invertida; el viejo signo matemático ⋮ recuerda a un menú. Pero el camino inverso, el que va del significante al significado ha de ser aprendido.

No solo necesitamos aprender los símbolos de pantallas, mandos y botones. También la forma física o las posibilidades de la máquina han de aprenderse. A veces eso se olvida. Mi hermano me comenta, por ejemplo, que la nueva videoconsola de sus hijos se distribuye con un mero folleto de recomendaciones de seguridad y características técnicas donde ni siquiera dice dónde está la ranura para tarjetas SD, ni cómo activar el control parental. Toda esa información extra hay que buscarla enla red.

Ni en los años ochenta ni en los primeros noventa se confiaba en la intuición del usuario. Los aparatos se vendían con gruesos manuales, volúmenes que costaba dinero redactar, imprimir y distribuir. Mi primer ordenador, un Spectrum 48K traía la ZX Spectrum Basic Programming, un grueso tomo, encuadernado en espiral, con un tutorial de programación más una referencia sobre aspectos más técnicos, tales como los códigos de instrucción del procesador Z80; eso sí, en inglés. El siguiente ordenador Sinclair traía un bonito cuaderno impreso en papel couché a todo color (¡y en español!) del que se habían eliminado los aspectos más técnicos, asumiendo que el usuario raramente iba a querer programar en aquella máquina dirigida al mercado del videojuego. De explicar los entresijos del ordenador (y de paso algún concepto matemático: ahí tuve mi primer contacto con la trigonometría a los 14 años), prácticamente se pasaba al «LOAD ""⏎» (aunque he visto que en la versión en inglés esto no era así).

Algo parecido ocurrió con mis primeras impresoras. Entre 1990 y 1993, los manuales de mi matricial Olivetti y de su sucesora, una HP de inyección, traían la descripción de todos los códigos de escape, por si acaso el usuario necesitaba programar su propio driver (porque algunos procesadores de texto de la época, como WordPerfect 5, asumían que quizá el usuario se viera en la necesidad de hacerlo). No solo eso: mi HP Deskjet 500C, asumiendo que en la época las impresoras en color eran raras, traía un Manual para uso del color con recomendaciones tales como evitar tonos similares para distinguir valores en los gráficos, o combinar color y signos de manera que los daltónicos pudiéramos reconocerlos. Mi siguiente impresora (comprada no porque la 500C muriese, sino porque era grande, lenta y ruidosa y no permitía imprimir simultáneamente en color y negro) solo traía un manual de instalación y solución de problemas.

Puede pensarse que los manuales desaparecieron porque dejaron de ser necesarios. Tengo por casa el de un ordenador Fujitsu Senda 16 de 1990. Trae las informaciones sobre hardware propias del manual de una placa base (interrupciones del sistema, puertos de entrada salida de la arquitectura ISA, etcétera), más un suplemento enseñando cómo usar el sistema operativo (el farragoso MS-DOS) y otro explicando los rudimentos de GW-Basic. Un montón de información que el usuario de un pc actual o una tablet no necesitaría.

En efecto: a medida que iba simplificándose el manejo de los ordenadores, los manuales se sustituyeron por programas de ayuda en pantalla, que normalmente pasaban de puntillas sobre los aspectos más técnicos. Y a día de hoy, incluso esos manuales en pantalla han desaparecido: Office y Openoffice confían en la "ayuda en red", que está siempre al día... pero que desaparece cuando la versión del programa queda obsoleta. Y además esquiva las cuestiones más técnicas. Recuerdo buscar en tutoriales ajenos a Microsoft cómo usar el formato en campos combinados en Word, porque quienes hicieron la ayuda en línea habían supuesto que los pocos que usaban la combinación de correspondencia lo harían para nombres, apellidos y direcciones, nunca con cifras.

El problema está en que cuando se pierde la conexión a internet o el aparato se queda bloqueado por cualquier problema, nos quedamos sin manual. Por ejemplo, si Windows no arranca tras una actualización, vemos una pantalla con el logo y solo si se nos ocurre buscar en internet con el teléfono móvil (el ordenador, recordemos, está bloqueado) se nos indicará que debemos pulsar el botón de encendido, pero no una ni dos veces, sino tres. Con un manual, podríamos buscar esa información. Pero es cierto que en la mayor parte de oficinas y casas el manual se habría perdido largo tiempo atrás.

Y esa es realmente la razón de que ya no se hagan manuales en papel. No solo que sean caros de producir y que para el día a día sean innecesarios, sino que, a la hora de la verdad, no sabemos dónde los metimos.

domingo, 2 de febrero de 2020

Curiosidades sobre el uso de la raya (M-DASH)

La ortografía española define la raya como un signo parentético usado en los diálogos y para encerrar incisos. A diferencia de lo que sucede en inglés, en español la raya no se emplea así:

The man—at east, it looked as a man—arrived.

(Formato preferido por Grammarbook.com).

Ni así:

The man — at east, it looked as a man — arrived.

(Ese era el formato preferido por Project Gutenberg en la primera década del siglo; ahora parece que han cambiado de opinión;).

Sino que se emplea así:

El hombre —o al menos eso parecía— llegó

Obsérvese que en español la raya se trata como los paréntesis, es decir, se pega a las palabras que van dentro del inciso. Por eso mismo, es muy desagradable ver la línea dividida así

El hombre —o al menos eso parecía
— llegó

Del mismo modo que sería desagradable ver esto:

El hombre (o al menos eso parecía
) llegó.

Pero, mientras que con el paréntesis tenemos un segundo elemento que nos permite discernir si se trata de apertura o cierra (todo el mundo sabe qué lado del paréntesis es el de cierre y qué lado es el de apertura), no sucede lo mismo con la raya. Así que la razón de que el español divida las líneas sin separar la raya del texto al que va pegado no es solo estética, sino que tiene su razón de ser lingüística.

Esto lo recoge la norma Unicode en el apartado B2 del anexo 14. Sin embargo, dado que la regla descrita como texto es complicada de implementar, el algoritmo para ordenador ignora totalmente esto. De hecho, el único algoritmo correspondiente al carácter B2 (m-dash) es que B2 seguido de espacio seguido de B2 no se separa... ¡Cuando lo que dice reglas en lenguaje humano es que B2 se tiene que separar por el lado del espacio si va seguido de espacio!

Por eso, cuando usamos em-dash en nuestro blog se producen desagradables divisiones de línea como esta:

Texto con la raya de comienzo de inciso al final de línea.

Una manera de solucionar este problema es emplear la barra horizontal &horbar; (―) en lugar de la raya &emdash; (—). Sin embargo, dependiendo del tipo de letra, la barra horizontal puede ser más corta o más larga que la raya, y su espaciado es distinto (a veces lleva un miniespacio a uno de los lados). Lo podéis observar aquí:

Texto con barra horizontal marcando comienzo de inciso; está en el sitio adecuado pero es más corta que la raya.

Otra manera (la que me recomendaron los cachondos mentales de LibreOffice cuando lo reporté como bug) es añadir un espacio de no separación sin anchura alrededor de la raya. Todo el mundo sabe que es muy fácil escribir &#8288;&emdash;&#8288; en lugar de &emdash;:

Texto formateado correctamente.

He de decir que esto no funciona con todos los programas. Por ejemplo, Microsoft Word 2013 ignora el carácter de unión de palabras cuando va entre símbolos. Además, es muy farragoso. Sí, puedes hacer un "buscar y reemplazar" de todas las rayas (y tratar de recordar si las escribiste como código o como símbolo) y añadirles estos espacios, pero en un diálogo esto añadiría al menos un carácter unicode (dos bytes) por línea. Dado que xml permite definir "entidades" que se traducen como texto, sería deseable poder incluir en la cabecera del html una entidad que incluyera los tres caracteres. Teóricamente, se puede hacer, cambiando la cabecera:

<!DOCTYPE html >

Por:

<!DOCTYPE html [ <!ENTITY mdash "&#8288;&#8212;&#8288;"> ]>

Sin embargo, esto no funciona en Blogger (que rechaza los cambios hechos en DOCTYPE) y es muy probable que tampoco funcione en otros DTD, como los correspondientes al formato EPUB (precisamente, el problema de la raya es muy preocupante en el mercado de los EPUB).

¿Alguien me sugiere alguna solución?

domingo, 7 de enero de 2018

Conectar dos ordenadores a un router viejo para transferir vía cable...

El ordenador de mi padre estaba ya para el arrastre: poco disco duro, un windows que ya no soportaba actualizaciones, un procesador que no admitía instalar el windows más reciente... Pero, sobre todo, una pantalla golpeada que amenazaba caerse en pedazos de un momento a otro. Después de posponerlo durante más de un año, al final se ha adquirido un nuevo ordenador. Y llega el momento de transferir archivos de uno a otro...

Soy enemigo de usar un disco duro usb para hacer ese tipo de transferencia. En primer lugar, porque los discos pueden dar también problemas y gastan espacio; en segundo lugar, porque el USB 2.0 de los ordenadores viejos tampoco es que sea muy rápido. Pero hacer la transferencia vía Wifi tampoco es que sea mano de santo: Windows, en sus primeros cálculos, suponía que la transferencia duraría 17 horas ¿Por qué? Porque la red de casa de mis padres está ocupada por varios dispositivos "inteligentes", todos saliendo del mismo router. Y aunque los dispositivos que más ancho de banda consumen usan una conexión cableada, supongo que el router estará un tanto saturado teniendo que gestionar tantas conexiones.

El único cable crossover en casa de mis padres es un viejo cable usb con adaptadores RJ45 y RJ45 crossover; pero, puesto que el viejo cable daba problemas con USB, no me fío de usarlo como cable de red. Pero tengo dos cables de red sobrantes, procedentes de los diversos cambios de router (actualmente, ya no te dan cables nuevos cuando cambian tu router —de hecho, la última vez probaron a reutilizar la fuente de alimentación de mi router antiguo— pero antes sí lo hacían). Y tengo un router antiguo de Ya.com que todavía funciona (de hecho, hace años lo usé para extender mi red Wifi, hasta que tuve que reaprovechar su transformador para otra cosa).

A primera vista parece que es todo muy sencillo. Conectar los cables de red al router antiguo y a los ordenadores y ya está. El problema es que como estuve usando el router antiguo para extender mi antigua red Wifi, el router tiene el DHCP desactivado (y yo no sé qué dirección de red le asigné). Y además no me acuerdo de su contraseña por defecto, así que tampoco puedo resetearlo.

Pero no hay problema. Si configuramos una IP fija en Windows podemos solucionar el problema

Para configurar una IP fija en Windows hay que hacer lo siguiente:

  • Ir a Panel de control\Todos los elementos de Panel de control\Conexiones de red (podéis acceder con clic en Explorador de archivos, clic derecho en Red, clic en Propiedades, Configuración del adaptador)
  • Saldrá una lista de adaptadores de red. Click derecho en el que se llame algo así como Conexión de área local (o que no mencione la palabras "inálámbrico" o "wifi")
  • Seleccionar Protocolo de internet versión 4 (TCP/IPv4).
  • Click en Propiedades.
  • Si estamos en windows 7 o superior, habrá una solapa llamada Configuración alternativa. Ahí metemos una dirección IP única en el rango 192.168.x.y, por ejemplo 192.168.100.1.
  • Si esa solapa no aparece, nos quedamos en la solapa "general", apuntamos todos los datos actuales y después marcamos Usar la siguiente dirección IP, y escribimos la dirección que aparece en el paso anterior
  • Como puerta de enlace, escribimos una dirección en el mismo rango 192.168.x.y, por ejemplo 192.168.100.2. Apuntamos esta dirección.
  • Hacemos lo mismo en el segundo ordenador, intercambiando las dos direcciones (si uno tiene IP 192.168.100.1 y puerta 192.168.100.2, el otro tiene IP 192.168.100.2 y puerta 192.168.100.1). De este modo, todo el tráfico IP de cada ordenador pasará por el otro.
  • A continuación queda lo más duro, conseguir que windows considere que ambos ordenadores pertenecen a una red privada. Cuando dos ordenadores se conectan sin router, Windows supone que pertenecen a una red "no identificada" y por tanto no permite elegir si la red es privada o pública (dado que NO conviene activar el compartir archivos para redes no públicas).
  • Teóricamente, en Windows 10 eso se puede cambiar desde Configuración\Estado de red\Cambiar propiedades de conexión" y haciendo luego clic en el nombre del adaptador. Pero, en la práctica he visto que, cuando mi ordenador estaba en dos redes (wifi privada y ethernet no identificada), no podía cambiarlo. Afortunadamente, mi firewall (ESET) permite elegir si el ajuste de red a usar es el de Windows o uno personal.
  • En Windows XP, Vista y 7, la configuración de zonas se hace desde Panel de control\Todos los elementos de Panel de control\Conexiones de red, pulsando en el icono de la casa o el banco que aparecerá según la red esté marcada como privada o pública.
  • Después de esto, podéis abrir una línea de comandos para comprobar si ambos ordenadores se "ven" en la red:
  • Ping 192.168.100.2 (desde el que tiene el número 192.168.100.1) o ping 192.168.100.1 (desde el que tiene el número 192.168.100.2).
  • Si el comando anterior ha fallado, algo habéis hecho mal, o el firewall os está bloqueando. Una vez funcione, probad el siguiente comando: nbtstat -A 192.168.100.2 y nbtstat -A 192.168.100.1 (ejecutad los dos comandos en los dos ordenadores). Si falla, es que uno de los dos firewall está bloqueando la conexión, o que no tenéis activadas las carpetas compartidas.
  • A continuación, id a la carpeta "documentos públicos" del ordenador nuevo (en Windows 10 está escondida, tendréis que escribir su nombre para encontrarla) y cread dentro una carpeta llamada "ordenador viejo". Clic derecho, "compartir", "uso compartido avanzado".
  • Clic en "compartir esta carpeta", dadle un nombre (en este ejemplo el nombre será ANTIGUO), clic "PERMISOS", clic "Cambiar". Aceptar todo
  • En caso de que uséis contraseñas en vuestros nombres de usuario, o que los nombres de usuario de ambos ordenadores sean iguales, ya está todo hecho. Si entráis sin escribir nombre de usuario o contraseña, tenéis que crear un usuario con contraseña para que pueda acceder a la carpeta compartida. (Agregar, editar o quitar otras personas => Agregar otra persona a este equipo => No tengo los datos de inicio de sesión de esa persona => Agregar un usuario sin cuenta Microsoft=>Escribe después un usuario y una contraseña); puedes eliminar a ese usuario una vez hayas hecho la copia.
  • Si en vuestro windows había un usuario sin contraseña que iniciaba sesión automáticamente, podéis usar la aplicación netplwiz para configurar un usuario sin contraseña. (Básicamente: decís a Cortana que abra netplwiz, elegís "Los usuarios deben escribir su nombre de usuario y contraseña...", después marcáis el usuario que queráis que inicie por defecto, y después desmarcáis lo de "los usuarios deben escribir...)

Creo que no me dejo nada en el tintero. Como véis es un proceso complicado, pero el hecho de tener los dos ordenadores en red permite, además, ir copiando todas esas puñetitas que uno se va encontrando después dentro de los programas y que no se pueden copiar directamente: adjuntos de correo sin guardar, favoritos del navegador, firmas electrónicas, etcétera.

Por supuesto, acordáos de dar permiso de lectura de la carpeta compartida a todos los usuarios del ordenador nuevo una vez esté hecha la copia, y después dejad de compartirla.

jueves, 4 de enero de 2018

Apagar el ordenador cuando termina una tarea.

Me encanta robocopy. Tiene sus más y sus menos, claro, pero el hecho de que a partir de XP se incluyera con windows un programa equivalente a Xcopy pero con la capacidad de seleccionar qué copiar, ejecutarse en segundo plano, e incluso hacer copias de seguridad programadas, fue un gran adelanto.

El problema es que, cuando te pones a hacer copias hay muchos tiempos muertos. Y a veces quieres dejar la última copia en ejecución pero deseas que se apague el ordenador al terminar (lo que es muy útil a altas horas de madrugada, cuando el cuerpo pide sueño). No sé por qué no se incluyó esa característica en robocopy (que, por lo demás, está pensado para ejecutarse sin supervisión), o quizá es que no la he encontrado.

Pero, de repente, al ejecutar el administrador de tareas se me ocurrió una idea. Si existiera en windows un administrador de tareas en modo consola, podría consultarlo repetidamente para saber si una tarea sigue en ejecución. Una pequeña búsqueda reveló que ese programa existe, y se llama tasklist. Así que es muy fácil hacer un programa como este para supervisar si robocopy ha terminado o no:

rem Guardar este programa como
rem apaga-al-terminar-robocopy.cmd
rem y ejecutarlo DESPUÉS de iniciar robocopy.
rem
:inicio
tasklist | find /i "robocopy" > estado_robocopy
for %%a in (estado_robocopy) do (
if %%~za.==0. goto :apaga
)
for /L %%f in (1;1;10000) do rem %%f
goto :inicio
:apaga
shutdown -s -t 200
:fin

El programa anterior hace lo siguiente:

  1. Busca la palabra "robocopy" en la lista de tareas, enviando el resultado al archivo "estado_robocopy". Se usa find /i para indicar que no ha de distinguirse entre mayúsculas y minúsculas (el nombre del proceso usa una mezcla de ambas).
  2. A continuación, comprueba el tamaño del archivo. Para obtener el tamaño de archivo, busco un archivo cuyo nombre sea estado_robocopy y devuelvo sus datos en la variable %a (aquí se usa %%a porque se ejecuta desde un script). Se compara %%~za (tamaño del archivo referenciado por %%a) con cero. Si el tamaño es cero, se salta a la etiqueta :apaga, que nos saca del bucle. Se usan los paréntesis para dividir la instrucción en dos líneas.
  3. La segunda instrucción for hace que esperemos un rato antes de volver a comprobar el tamaño de archivo. Básicamente, le decimos al ordenador que cuente hasta diez mil. Esto es importante, porque, como sucedía en Ms-DOS, en algunas versiones de Windows los archivos de intérprete de comandos hacen un uso intensivo del disco, y ese for nos libera tiempo para que robocopy pueda trabajar mientras tanto.
  4. Después del tiempo de espera, salto a la etiqueta :inicio, con lo que todo el proceso vuelve a comenzar de nuevo.
  5. A la etiqueta :apaga se llega solo en caso de que el archivo estado_robocopy tenga un tamaño cero, es decir, cuando robocopy ya no esté en la lista de tareas. Y va seguido de una instrucción shutdown -s -t 200, que apagará el equipo dejando un tiempo de gracia de 200 segundos (unos 3 minutos) por si deseamos cancelar el apagado (para ello, deberíamos abrir un intérprete de comandos y ejecutar shutdown -a)

El programa se puede adaptar para que funcione con cualquier tarea cuyo proceso desaparezca al finalizar (normalmente esto solo ocurre con tareas de consola o tareas diseñadas para poder programarse). Para ello, sustituid "robocopy" por el nombre con que la tarea en cuestión aparece en la lista de procesos del sistema (podéis consultarlo con tasklist.exe o con el administrador de tareas, llamado "taskman" o "taskmgr" según la versión de Windows). Aseguráos también de que en vuestro ordenador exista el comando "tasklist".

Y ahora ya podéis dejar la SD de vuestro móvil copiándose en un blu-ray de 50 gigas mientras os vais a dormir...



Podéis leer mis scripts para la línea de comandos en doc.apagada.com

sábado, 21 de enero de 2017

Cómo: Pasar aplicaciones del segundo monitor al primero en Windows.

Edición 26/2/2017 - Lee esto primero

Juraría que había probado esto pero no me había funcionado...:

Con Tecla Windows + Flecha lateral se puede mover la ventana a la izquierda, centro o derecha de la ventana, sin importar que previamente estuviera maximizada.

En caso de que haya varias pantallas, se irá moviendo de pantalla en pantalla.

Así que la solución de abajo se puede cambiar por:

Pulsa Windows + hasta que la ventana deseada aparezca en tu pantalla.


POST ORIGINAL:

A pesar de que Windows 10 soporta múltiples escritorios virtuales, aparentemente no se puede enviar un escritorio a cada pantalla: solo se puede "extender" la pantalla para que ciertas aplicaciones (pongamos por caso chrome viendo Netflix o HBO en la tele) salgan por la pantalla secundaria.

Así que la posibilidad de alternar de un escritorio a otro se queda muy reducida con respecto a lo que ocurre en Linux, donde muchos gestores de ventanas muestran en una ventanita pequeña a qué monitor o escritorio se ha ido cada aplicación, para que la pasemos al monitor que tenemos encendido en ese momento.

Una alternativa a esto, que conocemos quienes empezamos a usar Windows en los 90 antes de tener un ratón, es manejar las ventanas «a ciegas» con el teclado.

Pongamos por caso que yo tengo mi escritorio extendido a dos pantallas, y que la última vez que encendí mi ordenador llevé Chrome a una pantalla secundaria (por ejemplo una televisión) para ver una película, pero ahora quiero encender solo la pantalla pequeña. Al abrir Chrome, la aplicación sale en la pantalla grande, que está apagada. ¿Cómo pasar Chrome a la otra pantalla?

La solución viene con el uso del teclado. El ratón es un dispositivo muy interesante, pero solo podemos usarlo correctamente si miramos la pantalla. En cambio, el teclado puede usarse sin pantalla (¿quien no ha tocado música en un ZX-Spectrum con la tele apagada? ¿quién no ha usado Ms-DOS conectado a una impresora matricial que hacía de pantalla?).

  1. Seleccionamos la aplicación cuya ventana queremos mover (ALT-TAB o pulsando en el icono de la barra de tareas)
  2. Pulsamos ALT-ESPACIO. (ALT-ESPACIO significa "abre el menú estándar Windows de la ventana").
  3. Pulsamos "R". En la traducción de Windows vendida en España, "R" corresponde a restaurar. Si estamos en otro país quizá tengamos que comprobar con una ventana que se abra en la pantalla normal qué letra corresponde a "restaurar" en nuestra traducción de Windows.
  4. Con la anterior acción, hemos restaurado la ventana (en caso de que estuviera maximizada, esto es imprescindible para poder moverla).
  5. Ahora, pulsamos de nuevo ALT-ESPACIO para volver a llamar al menú de la ventana.
  6. Pulsamos "M". En la traducción de Windows vendida en España, "R" corresponde a restaurar. Si estamos en otro país quizá tengamos que comprobar con una ventana que se abra en la pantalla normal qué letra corresponde a "restaurar" en nuestra traducción de Windows.
  7. Finalmente, mantenemos pulsado "Flecha izquierda" o "Flecha derecha", según si en la lógica de Windows la pantalla apagada está situada a la derecha de la actual (flecha izquierda para llevar la ventana a la actual) o a la izquierda (al revés). Esto moverá la ventana hacia nosotros.

Espero que haya sido útil a alguno de vosotros

martes, 26 de enero de 2016

El encriptador PC-Secure de PCTools (1989-1990)

Cuando tuve mi primer pc, allá por 1991, tardé bastante en conseguir un programa de compresión de archivos, algo que en aquella época era mucho más necesario que actualmente. Tengamos en cuenta que mi primer disco duro tenía 20 megas de capacidad, que todavía se vendían los diskettes de 5¼ pulgadas y 540 Kb y que, si bien los disquettes de 3½ pulgadas de alta densidad podían contener 1,44 megas, a menudo había que conformarse con hacer un agujero en el lateral de los diskettes de «doble cara, doble densidad» de 720 Kb, más baratos, y rezar porque MS-DOS no encontrase muchos problemas a la hora de formatearlos con el doble de densidad de la garantizada por el fabricante.

Conseguí mis primeros compresores como parte de los programas que regalaban las revistas de informática. LhArc, el compresor japonés que producía archivos Lzh, se usaba (con otro nombre, claro está) en el disco de instalación de una demo de ContaPlus que regalaba una revista de software «serio», probablemente PC-Magazine. PkUnZip vino en un HobbyPC, como parte de la instalación de la demo de un juego, quizá "La bella y la bestia"; el problema es que sólo servía para descomprimir. La utilidad Arj, que se convirtió en mi favorita, me llegó también en un disco de instalación; no recuerdo en cuál. En cuanto a Tar, Gzip y demás utilidades tipo unix no las conocería hasta que hice mis pinitos con un compilador para PC llamado djgpp, que conocí poco antes de intentar usar linux... pero esto ya bien entrados los noventa, cuando ya tenía acceso a colecciones de shareware en cd-rom. Más o menos al mismo tiempo llegó Rar, también en un CD de shareware.

Por ello, durante un breve tiempo utilicé el backup de MS-DOS para hacer copias de seguridad (no ahorraba mucho espacio, sólo lo que la arquitectura del sistema de archivos FAT de Microsoft derrochaba habitualmente), el PCBackup de PC-Tools (tampoco comprimía los archivos, pero añadía un sector adicional, que suponía de un 5 a un 10% de espacio, a cada disquete) y, muy brevemente, el encriptador PC-Secure (no confundir con el antivirus homónimo) de la misma suite, que además de encriptar los archivos los comprimía con un ahorro del... ¡10%! Imagináos qué desesperado debía de estar para emplear ese programa.

* * *

Así que años después me he encontrado, tratando de organizar mis viejos programas basic, con tres archivos con extensión ".SEC", de dos de los cuales disponía también de la versión en texto plano. Las letras "PCT5" con que se iniciaban los ficheros me indicaron que las había creado algún programa de la suite PC-Tools. Entonces recordé lo que os he contado sobre ficheros comprimidos, encriptación, etcétera. Fui al trastero y busqué un de PC-Tools. A lo largo de mi vida he usado PC Tools 4, 5 y 6; sin embargo, ante la duda, saqué el primero que encontré. Probé con la clave que todavía creía recordar y encontré que el archivo no se descomprimía.

Después de leer un poco en la red, vi que el archivo usaba una codificación DES de un solo paso, y que, aunque era una codificación compleja, usaba solo una pequeña parte de la clave, así que era posible descrifrarlo por fuerza bruta. Mi primer intento se centró en averiguar cómo se usaba la línea de comandos de PC-Secure para poder hacer un ataque de fuerza bruta sin tener que enviar pulsaciones de teclado. Descubrí que, aparentemente, la sintaxis era:

  • PCSECURE /kclave /f fichero para encriptar (¿añadir /c para comprimir?)
  • PCSECURE /kclave /d fichero para desencriptar (¿añadir /c para comprimir?)
Después de un rato, me quedé insatisfecho con la idea de usar la fuerza bruta llamando una y otra vez al programa, lo que generaba cientos de ventanitas abriéndose y cerrándose sobre la pantalla de Windows. Así que usé la opción "encriptar" para crear unos cuantos archivos con las claves "1", "11", "12", "111", "123", "1111" y "1234", para averiguar si el programa guardaba la clave en algún lugar del archivo. Esto es lo que descubrí:
  • El archivo comenzaba con la firma "PCT6"
  • Los siguientes 4 bytes contenían la firma (hash) de la clave como DWord (entero de 64 bits) en el orden lsb...MSB estándar de Intel (es decir, el valor hex 12345678h se guarda como 78h 56h 34h 12h).
  • La firma estaba generada con el siguiente algoritmo:
    • Para cada byte en clave:
    • desplaza el hash a la izquierda 4 bits (es decir, hash=hash*16 o hash=hash<<4)
    • haz un o-exclusivo (XOR) entre hash y el byte de la clave.
  • Aparentemente, la firma o hash se usaba como clave XOR a lo largo del resto del archivo, con pequeñas modificaciones (rotaciones de bytes) cada cierto tiempo.

Decidí inicialmente pasar las claves de "fuerza bruta" a través del hash para comprobar si eran válidas antes de enviarlas al propio programa PC-Shell. Y como necesitaba un lenguaje de programación que poseyera un operador shift (hacer un shift en basic, que es lo que tenía instalado, es un dolor de cabeza en cuanto el último bit se activa y el número se convierte en negativo) empleé Processing para Android en modo Java. Era una buena idea, además, porque el procesador de mi móvil es mucho más rápido que el de mi ordenador. Sin embargo el programa volvía a empezar cada vez que perdía el foco. Ahí me empecé a dar cuenta, además, de que algo no cuadraba en el archivo que yo tenía.

Con todo esto, y tras deducir que el número de combinaciones para generar la clave eran finitas (de hecho, se podía deducir una clave "usable" tomando 8 bytes, uno por cada media palabra), probé otro ataque de fuerza bruta mucho más rápido porque se limitaba a probar combinaciones de 4 caracteres en lugar de todas las posibles entre 1 y 16 letras.

// Python

//Sustituir esto por los bytes 6-8 del
//archivo grabado por pcsecure.exe:
miclave=0x5d7ee440

//Archivo de salida
handle=open ("C:\salida.txt","a+")


bita=0
while (bita<=255):
    bitb=0
    while (bitb<=255):
        bitc=0
        while (bitc<=255):
            bitd=0
            print hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd)
            while (bitd<=255):
                clave=bita
                clave=(clave<<4) ^bitb
                clave=(clave<<4) ^bitc
                clave=(clave<<4) ^bitd

  // Lo siguiente podría depender del archivo
  // PCSECURE.CFG con que se hayan encriptado
  // los archivos originalmente:

                clave=(clave ^0x8090000)
  // (Mi archivo pcsecure.cfg comienza 08 09 00 00 )

                if (clave==miclave):
                    print "solucion:"+ hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd)
                    handle.write ("solucion:" + hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd))
                    handle.flush()
                    handle.close ()
                    quit()
                if ((clave & 0xffff) == (miclave & 0xffff)):
                    print "parcial:"+ hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd)
                    handle.write ("parcial:" + hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd))
                bitd=bitd+1
            bitc=bitc+1
        bitb=bitb+1
    bita=bita+1

Mientras el programa de fuerza bruta iba funcionando, probé también el acercamiento de emplear una clave de 16 bits (si el hash era algo así como «5d7ee440», podría funcionar elegir el modo hex e introducir la clave «05 0d 07 0e 0e 04 04 00», y de hecho la clave hex máxima tenía precisamente 8 bytes, es decir, 16 cifras). Para mi desesperación, comprobé que PC-Secure graba la clave en un lugar totalmente diferente cuando se seleccionaba la opción "hex".

Además, había encontrado que mis archivos no acababan de cuadrar con el método de encriptación que había comprobado. Quizá fuera porque estaban comprimidos. Sin embargo, el resultado de la encriptación con compresión de pc-secure era un archivo más o menos del mismo tamaño que el original, con el final del archivo lleno de repeticiones de la clave (¡vaya seguridad!). Pero en los archivos que yo quería desencriptar, que sabía que estaban comprimidos, no tenían bytes repetidos al final.

Finalmente me decidí a rebuscar hasta encontrar el pc-Tools 5, y comprobé que su versión de PC-Secure usaba la misma línea de comandos que el incluido con PC-Tools 6, pero producía archivos completamente diferentes. Después de investigar (creando de nuevo los archivos con clave 1, 11, 12, 123...), decidí que, puesto que el sistema de encriptación era tan distinto (y de hecho, más seguro que PC-Tools 5, pues no incluía claves visibles al final de los archivos comprimidos), lo más sensato era probar mi vieja clave con *esa* versión de PC-Secure.

Funcionó a la primera

Ya sé que no se puede esperar mucho de un programa de hace 26 años, pero me maravillan dos hechos. Primero, ¿por qué PC-Secure 6 no avisa que no sabe descifrar un archivo creado con versiones anteriores? De hecho, los reconoce como archivos cifrados. Y, en segundo lugar, ¿por qué PCSecure 6 era menos seguro que PCSecure 5? ¿Se debe, quizá, a que, como se puede leer en el código de PCSecure 5, el primer programa fue desarrollado por terceros? No sería de extrañar: el mismo esquema el mismo esquema apareció con las utilidades de terceros incluidas en las últimas versiones de MS-DOS, luego discontinuadas. ¿O acaso los programadores de PC-Secure tuvieron miedo de haber vulnerado los tratados norteamericanos conta la exportación de tecnología de encriptación en la versión más antigua?

Se trata de un pequeño misterio que me habría gustado haber descubierto muchos años antes, cuando todavía hubiera existido la posibilidad de encontrar en la red a alguien que hubiera sido un usuario experto de aquellos programas. Aquí lo dejo como aviso a navegantes.

domingo, 26 de abril de 2015

Ejemplares fantasma en Abies 2.x

En la biblioteca de mi instituto usamos todavía el viejo Abies2, pues con nuestra inestable conexión a internet no nos atrevemos a usar abies3. Uno de los problemas que nos ha surgido es que hay unos cuantos ejemplares que han sido catalogados en el pasado (prueba de ello es su código de barras de Abies) pero no aparecen en el catálogo por ninguna parte.

Analizando el problema a partir de una copia de seguridad que abrimos con Access, se manifiesta el origen del problema:

Abies guarda los autores en dos lugares diferentes. En primer lugar está el autor principal, que se almacena en el campo idAutor de la tabla [Fondos]. Por otro lado, en la tabla [Fondos_Autores] hay un registro que lista los autores secundarios y principales de cada fondo, con un campo llamado booleano "principal" que indica si estamos hablando del autor principal o no.

El problema es que al hacer el listado de ejemplares que sale en la pantalla principal de abies, los ejemplares se recuperan a partir de una consulta que solo toma aquellos ejemplares con valores definidos en la tabla [fondos_autores], es decir, que si por la razón que sea (probablemente una edición manual o una actualización mal hecha) se pierden los registros de la tabla [fondos_autores], los fondos desaparecerán de la vista de catálogo.

Podemos añadir la siguiente macro a una copia de seguridad de abies para averiguar qué ejemplares son los que se han convertido en "fantasmas". Aunque he añadido una funcionalidad de "reparación", yo no cambiaría nada a menos que me asegure de que no he vuelto a catalogar los ejemplares desaparecidos... (y teniendo en cuenta que es un proceso largo y que en medio hay que evitar prestar o catalogar ningún fondo, es complicado).

'Buscar ejemplares sin autor en la tabla fondos_autores
'(Ejemplares con autor declarado en fondos pero sin autor en fondos_autores)
' Creo que esa es la causa de que "Réquiem por un campesino español" de 
' Ramón J. Sender no aparezca en Abies, a pesar de que aparece en la tabla
' "ejemplares" y en la tabla "fondos".

Sub buscaEjemplaresSinAutor()
Dim Fondos As Recordset
Dim FondosAutor As Recordset
Dim xlApp As Excel.Application
Dim Book As New Excel.Workbook
Dim MySheet As Excel.Worksheet

Dim Db As Database

Set Db = Access.CurrentDb

Set xlApp = CreateObject("Excel.Application")
Set Book = xlApp.Workbooks.Add
Set MySheet = Book.Sheets(1)
        Book.Activate
        With MySheet
            With .Range("A:D")
                .HorizontalAlignment = xlLeft
                .Font.Size = 10
                .VerticalAlignment = xlTop
                .WrapText = True
            End With
            With .Range("1:2")
            .Font.Size = 12
            .VerticalAlignment = xlTop
            .HorizontalAlignment = xlCenter
            End With
            .Cells(1, 1) = "Fondos sin autor en IDAutores"
            .Cells(2, 1) = "IDFondo"
            .Cells(2, 2) = "IDAutor"
            .Cells(2, 3) = "A"
            .Cells(2, 4) = "Titulo"
            .Cells(2, 5) = "CodigoEjemplar"
            .Cells(2, 6) = "NumRegistro"
            .Cells(2, 7) = "[Signatura]"
            .Cells(2, 8) = "FechaAlta"
            .Cells(2, 9) = "[Arreglado?]"
            
            'Colorear el encabezado
            .Range("A1:G1").Cells.Interior.Color = RGB(&HFF, &HCC, _
                  &H99)
            .Range("A1:G1").HorizontalAlignment = xlCenter
            .Range("A1:G1").Merge
            .Range("A2:G2").Cells.Interior.Color = RGB(&HC0, &HC0, _
                  &HC0)
            .Columns(1).ColumnWidth = 8
            .Columns(2).ColumnWidth = 8
            .Columns(3).ColumnWidth = 20
            .Columns(4).ColumnWidth = 20
            .Columns(5).ColumnWidth = 8
            .Columns(6).ColumnWidth = 8
            .Columns(7).ColumnWidth = 8
            .Columns(8).ColumnWidth = 8
        FilaAct = 3
        End With
    
    
  consulta = "SELECT Ejemplares.CodigoEjemplar,Autores.a, "+ _
             "Fondos.Titulo, Ejemplares.Sig1, Ejemplares.Sig2,"+ _
             "Ejemplares.Sig3, Fondos.IdFondo,Fondos.IdAutor, " + _
             "Ejemplares.FechaAlta, Ejemplares.NumRegistro " + _
             "FROM (Fondos INNER JOIN Ejemplares ON " + _
             "Fondos.IdFondo = Ejemplares.IdFondo)" + _
             "INNER JOIN Autores ON Fondos.IdAutor = " + _
             "Autores.IdAutor ORDER BY Fondos.IdFondo"
  
    Set Fondos = Db.OpenRecordset(consulta, dbOpenDynaset)
    Fondos.MoveFirst
    Do Until Fondos.EOF
        While Fondos.Fields("idfondo") = "": Fondos.MoveNext: Wend
        idfondo = Fondos.Fields("IdFondo")
        consulta2 = "SELECT * FROM [Fondos_Autores] Where "+ _
              "[IdFondo]=" & idfondo & " ORDER By IdFondo"
        Set FondosAutor = CurrentDb.OpenRecordset(consulta2, _
              dbOpenDynaset)
        cuenta = FondosAutor.RecordCount
        'If idfondo = 3294 Then Stop
       If cuenta = 0 Then
            With MySheet
                .Cells(FilaAct, 1) = Fondos.Fields("idFondo")
                .Cells(FilaAct, 2) = Fondos.Fields("idAutor")
                .Cells(FilaAct, 3) = Fondos.Fields("A")
                .Cells(FilaAct, 4) = Fondos.Fields("Titulo")
                .Cells(FilaAct, 5) = Fondos.Fields("CodigoEjemplar")
                .Cells(FilaAct, 6) = Fondos.Fields("NumRegistro")
                .Cells(FilaAct, 6) = Fondos.Fields("Sig1") + _
                    " " + Fondos.Fields("Sig2") + _
                    " " + Fondos.Fields("Sig3")
                .Cells(FilaAct, 7) = Fondos.Fields("FechaAlta")
            End With
            FilaAct = FilaAct + 1
            respuesta = MsgBox( _
                    "El libro " + vbCrLf + Chr(34) + _
                    Fondos.Fields("Titulo") + Chr(34) + vbCrLf + _
                    "(autor: " + Fondos.Fields("A") + ")" + vbCrLf + _
                    "no tiene entrada de autor en la tabla " + _
                    "Fondos_Autores." + vbCrLf + _
                    "¿Crear entrada?", _
                    vbYesNo + vbQuestion, _
                    "Arreglar Autor")
            If respuesta = vbYes Then
                'Stop
                ' Inserta una línea en la hoja de cálculo
                ' avisando del arreglo.
                MySheet.Cells(FilaAct - 1, 9) = "ARREGLADO"
                'Inserta un registro nuevo en Fondos_Autores
                FondosAutor.AddNew
                FondosAutor.Fields("idAutor") = _
                     Fondos.Fields("idAutor")
                FondosAutor.Fields("idFondo") = _
                     Fondos.Fields("idFondo")
                Rem FondosAutor.Fields("idFuncion")= Vacío
                FondosAutor.Fields("Principal") = True
                FondosAutor.Update
            End If
        
        End If
        FondosAutor.Close
        Fondos.MoveNext
        Debug.Print ".";
    Loop
    Book.Application.Visible = True
End Sub

miércoles, 30 de julio de 2014

Formato obsoleto...

Sucede que me compré 12 gigas de cómics en humblebundle y quiero guardarlos en alguna parte. No es que necesite realmente guardarlos: en cualquier momento podría volver a descargarlos sin pagar más, pero ¿y si se pierde mi contraseña? ¿y si quiebra la compañía? ¿y si se estrella un meteorito gigante contra la Tierra? Más vale tener una copia que no esté en la nube.

Así que voy al VIPs a conseguir DVDs porque ando bastante escasito de ellos. De camino, pienso en la posibilidad de comprar CDs. La radio del coche no tiene reproductor de mp3 ni entrada de línea, y aunque a veces es posible hacer que el teléfono móvil le envíe su música por FM, no siempre funciona el truco, especialmente en las áreas llenas de emisoras como Madrid. Así que para oír los mp3 en el coche hay que grabarlos en CD. Probablemente tendré CDs a montones en casa, pero estoy convencido de que en cualquier momento se dejarán de fabricar. Eso es lo que me decide a comprarlos.

En el VIPs solo hay DVDs de los caros, los regrabables (podría ser peor: el otro día estuve en la FNAC y no había ninguno). Los CDs, mezclados con ellos en la pila, son de la misma marca, pero obviamente son CD-R (lo que me indica que todos los compradores de CD están en la misma situación que yo). Voy con uno de cada a la cajera y, después de mirarlos un rato, ella me dice:
—No lo entiendo. Unos valen seis euros y los otros dieciséis.
—No hay problema. Sé que son distintos y quiero uno de cada.
Aunque ella no aparenta tener menos de veinticinco años (claro está que el trabajo envejece, así que puede que me equivoque), me pide que le explique la diferencia.
—Unos son para música, los otros son para datos.
Ella misma deduce que los de datos serán más caros porque tendrán más capacidad. Así que lo que falla es, simplemente, que llegó a la tecnología demasiado tarde para saber la diferencia. Debe de ser que realmente los CDs sí están obsoletos.

sábado, 22 de febrero de 2014

Cuando tenía que redescubrir la pólvora

El otro día estuve mirando una página sobre el Spectrum y de ahí salté al blog de José Ramón Palacios, un programador de Spectrum a cuyo único juego nunca había jugado, pero que resultó ser paisano mío e inspirador de uno de los primeros juegos de PC a los que jugué, y, por otro lado, al compilador ZX Basic Compiler. Ambas páginas me trajeron un montón de recuerdos y nostalgia, pero no solamente del viejo Spectrum, sino también —al leer las condiciones en que programaba Palacios— sobre cómo hacía yo las cosas en el PC antes de que los discos de Shareware primero e internet después me pusieran en condiciones de usar un compilador.

Hoy en día, encontrar información sobre cómo programar es sencillísimo. De hecho, me extraña que no haya, por lo menos, un programador en cada hogar de España. Quizá porque a los adolescentes les atrae más jugar que programar, no lo sé. El caso es que en mi primer PC busqué lo que me había ofrecido el Spectrum: la posibilidad de programar. El problema es que el lenguaje interpretado incluido con MS-DOS era lentísimo, como solía suceder en aquellos tiempos (no es que los lenguajes actuales sean más rápidos: es que hoy en día son ejecutados por procesadores que funcionan a cientos de veces su velocidad). Por eso había dos opciones: usar ensamblador o compilar, es decir, convertir un programa del lenguaje utilizado por el humano al usado por la máquina, para que funcionase rápidamente.
¡Compilar! Yo había oído hablar de los compiladores desde los tiempos del Spectrum, y recuerdo haberme acercado al Corte Inglés de electrónica de Sol a principios de los 90 buscando uno.

No sé si recordáis cómo era aquella sección entonces: los juegos de ordenador en la planta baja o quizá el sótano, rodeados por artefactos tales como procesadores de texto (de hardware), unos bicharracos que parecían ordenadores pero que se anunciaban como "simples y robustos" frente a los ordenadores; secciones donde todavía aparecían los últimos modelos de Spectrum, Amstrad y Commodore junto a estanterías donde casi todos los juegos para PC funcionaban en CGA pero mostraban pantallas de la versión Amiga, muy superior, discos de 5 1/4 y... ¡programas serios! una gran cantidad de programas serios, muy superior a la que hoy en día encontraríais en la FNAC o en el propio Corte Inglés.

Interrogado un comercial, me dijo el precio del compilador de basic... Creo que era el QuickBasic de Microsoft, pero no estoy seguro (quizá fuera el anterior compilador de Basic de IBM, que a los años me he encontrado rondando por la red). Su precio, astronómico (muy superior a lo que hoy costaría un Office). Natural, porque era para programadores profesionales. Pregunté por Pascal, C... Todos carísimos.

Así que me volqué en el ensamblador. Como no era aficionado a recorrer bibliotecas, mi fuente eran libros de informática, leídos a vistazos rápidos en librerías. En una descubrí cómo usar la interrupción 10h para trazar puntos en la pantalla(método lento, lentísimo). En otra, traté de averiguar cómo convertir ondas desde un .VOC en espectrogramas (por aquel entonces cursaba una asignatura de fonética). El problema era que programar en ensamblador sin tener un ensamblador era harto complicado.

Para explicar la complejidad, primero debería indicar qué es eso del ensamblador. Un PC de hacia 1990 tenía un procesador de un solo núcleo que iba leyendo secuencias de instrucciones en bloques de 8 bits. Cuando recibía, por ejemplo, la secuencia "B8", sabía que las siguientes secuencias serían valores a almacenar en el "registro AX", una especie de memoria a muy corto plazo cuyo valor podía ser sumado, restado o multiplicado (pero que, por ejemplo, no servía para hacer referencia a una dirección de la memoria RAM). Instrucciones como la serie "B8-NN-NN" constituirían el complicado "código máquina" o "código binario", distinto para cada familia de procesadores (los primeros ordenadores, como el Spectrum 48K, traían una lista de tales instrucciones). Como el "código máquina" es complicado de usar, los programadores de la época empleaban un lenguaje intermedio, llamado "mnemónico" (es decir, "fácil de recordar"), cuyas instrucciones se corresponden una a una con el código máquina. Por ejemplo, la instrucción "B80000" correspondería al "MOV AX,0000". Ese lenguaje mnemónico se llamaba también "lenguaje de ensamblador", pues se empleaba normalmente en unos programas llamados ensambladores.

Sin embargo, yo no poseía un ensamblador. Pero poseía algo parecido. Hasta muy recientemente, todos los sistemas operativos de Microsoft llevaban un programa llamado debug.exe que podía emplearse para escribir instrucciones en ensamblador y convertirlas a código binario o viceversa. Sin embargo, no era un auténtico ensamblador. ¿Por qué? Porque, a diferencia del auténtico lenguaje de ensamblador, donde se puede saltar a puntos del "código" nombrados con etiquetas inteligibles, como "nueva_partida", en debug (como en el código máquina) había que indicar exactamente a qué posición de la memoria habría que saltar. De forma que para algo tan simple como lo siguiente:

Comentario: Factorizar 3!
  1. Paso 1: Haz que B valga 3
  2. Paso 2: Haz que A valga 1
  3. Paso 3: Haz que C valga 1
  4. Paso 4: C= C*B
  5. Paso 5: Aumenta en 1 el valor de C
  6. Paso 6: Si C es menor o igual que A, vuelve al paso 4
  7. Paso 7: Finaliza.
Se convertía en código máquina en algo como:
[100] BB 01 00 (MOV BX,0001 )
[103] B8 03 00 (MOV AX,0003 )
[106] B9 01 00 (MOV CX,1 )
[109] F7 E1    (MUL CX)

[10B] 41       (INC CX)
[10C] 39 D9    (CMP CX,BX)
[10E] 7E F9    (JLE 0109)
[110] C3       (RET)
En la lista anterior aparecen a la izquierda, entre paréntesis, las posiciones de memoria en que está el código; en el centro, las instrucciones que lee el procesador y a la derecha, el código mnemónico equivalente. En debug yo podía introducir el código mnemónico (y esto era genial, porque no tenía que andar consultando un manual a cada paso en busca de la cifra equivalente). Pero detengámonos en esta línea:
[10E] 7E F9    (JLE 0109)

Su significado es el siguiente "En caso de que el resultado de una comparación previa sea menor o igual, salta al byte 109 y continúa desde ahí". En un ensamblador yo habría podido dar una dirección simbólica a la operación de multiplicación y saltar ahí; ensamblando con debug, yo necesitaba saber dónde estaría la instrucción de multiplicación, es decir, cuántos bytes ocupaba cada una de las instrucciones anteriores (así, MUL CX ocupa 2 pero INC CX ocupa 1). El riesgo de equivocación era alto, puesto que el listado anterior habría tenido una lectura distinta leído desde diferentes posiciones de memoria (de modo que un salto a 108 en lugar de a 109 hubiera hecho que el procesador leyera las instrucciones "ADD BH, DH" (instrucciones 00 F7) y "LOOPZ 14D (instrucciones E1 41)", que pudieran haber provocado un salto a una dirección arbitraria de la memoria. Por eso mis desvelos por conseguir, aunque fuera, un auténtico ensamblador que permitiera construir programas usando etiquetas.

Hice muchísimos intentos por crear mi propio ensamblador, intentos en que suplía con ingenio la falta de documentación --no tenía a mano manuales ni internet--. Usando el propio Debug sobre sí mismo intentaba conseguir listados de instrucciones, y luego, probando todas las combinaciones posibles, trataba de ver qué bytes de código máquina equivalían a cada instrucción de ensamblador. Pero finalmente desistí.

No fue hasta 1995 que concebí un método rápido y sencillo para conseguir hacer mi propio ensamblador. Tan fea era la solución que llamé a mi experimento "cutressembler". Mi programa leía un listado en ensamblador con etiquetas marcadas de forma especial (puesto que no realizaba ningún análisis de la sintaxis). Sustituía todas las etiquetas por "0000", alimentaba con el resultado al programa "debug" y capturaba la salida, almacenando las direcciones que en debug correspondían a cada etiqueta. A continuación, volvía a pasar el programa por Debug, sustituyendo las direcciones por las obtenidas en la pasada anterior. Puesto que las instrucciones de salto ocupaban más o menos bytes según lo lejano que fuera el salto, había que repetir el proceso varias veces hasta que el resultado dejara de cambiar. Sin embargo, la mejora respecto al solo uso de Debug era tan grande, que al poco empecé a escribir bibliotecas para "acelerar" diversos programas BASIC.

Pero para la época tenía ya internet, hacía tiempo que las unidades de CD-ROM se habían popularizado y además había sustituido el 286 por un 486, lo que me había permitido acceder a compiladores de C de linux. Además, el mundo del MS-DOS iba cayendo frente a Windows, un sistema para el cual no podría ensamblar con mi cutressembler. Así que mi original ensamblador acabó dedicándose mayoritariamente a proyectos "retro" en mi viejo 286.

Todo esto he pensado esta mañana, cuando buscando viejos programas de Basic de Spectrum he encontrado los folios en que pergeñé el proyecto de mi cutressembler. Era infinita mi sensación de nostalgia, pensando en aquellos tiempos, en que a cada momento tenía que redescubrir la pólvora.

martes, 11 de febrero de 2014

Dictar al ordenador usando la tecnología de Google.

Seguro que ya habéis visto que google os permite buscar textos usando el micrófono. Pero también permite a los desarrolladores crear aplicaciones básicas que respondan a la voz, en cualquier idioma, con mejores resultados que los que ofrece la aplicación de dictado incluida con Windows 7 (no he podido probar la de Windows 8) y, desde luego, inmejorablemente mejores que los de XP (que solo lleva aplicación de dictado para el idioma inglés).

Un ejemplo de ello es la mínima aplicación web de dictado que he hecho con Construct2. Solo unas pocas líneas de "código" (por llamarlo de alguna manera) y podéis dictar al ordenador y luego copiar el texto del cuadro.

A este paso van a conseguir caerme bien estos chicos de Google...

viernes, 31 de enero de 2014

Presenting DaltonAid [english info page]

Believe it or not, about 9 percent caucasian males have some form of color blindness. Most color blind people have deuteranopy, wich makes them see red as green.

While being a non-incapacitating condition, color blind people have to deal with the cultural value other people give to red color. So they have to deal with many documents where red is not interpreted as a dark, boring color (this is the way they see it), but as a bright, eye-attracting and even frightening color.

Being a color-blind person myself, as many people in my family, I work in an industry (education) where "red" is the standard color for spell checking texts, and checking and grading tests. While I can catch most of the proof marking done by myself, using details such as writing style, trace strenght or line weight, sometimes I need to use a scanner to check whether a minor spell change, such as an accent, was done by the original author or was a spell check done by myself.

Daltonaid aims to solve this need. It simply decomposes the image in three color planes (red, green and blue) and allows the user to do its own mix (so you can distinguish the dark, boring, red colors by changing them into bright blue colors).

Requirements:

  • WEBGL - This program uses webgl effects, and will work only with webgl.
  • Webcam (Chrome) or Camera (android)- This program shows the current video input from the webcam, and applies a color filter to it. The webcam image is not stored or streamed anywhere.
  • Minimal screen resolution: 640x520 pixel. Webcam image is captured at 640x480.

Downloads

miércoles, 13 de noviembre de 2013

Posicionamiento.

Hoy me he encontrado por casualidad con una página que, siendo absolutamente infumable, había obtenido un gran posicionamiento en Google.
Como era el mejor ejemplo que había visto hasta la fecha (salió haciendo una búsqueda normal, no depende de erorres ortográficos o mecanográficos) me he detenido a indagar qué le había dado su puesto de número uno en Google.

La página es "www. merluza en salsa verde .com" (lo escribo así para no contribuir a su posicionamiento con un link) y tiene las siguientes características:
  • El término de búsqueda (de aquí en adelante, searchterm) aparece en:
    • El dominio, la ruta dentro del dominio y el nombre del documento:
      http://www.searchterm.com/searchterm/searchterm.htm
    • El título (etiqueta title).
    • El nombre de la hoja de estilos css.
    • Subpáginas referenciadas (ejemplo: elmejorsearchterm.html, etc.) y el texto de los enlaces.
    • El texto (repetidamente). Además el texto es "natural" (es un texto real sobre el tema, solo se ha exagerado en cuanto a la reiteración del término de búsqueda).
  • Términos parecidos se emplean también en las imágenes, tanto en el nombre del fichero (searchterm.jpg) como en su texto alternativo (alt="searchterm").
  • Probablemente, también tiene importancia que haya imágenes y vídeos.
  • Por último, me han llamado la atención los nombres de las "clases" de elementos css. Son "noticias" (y derivados), "app" (y derivados) y "mejor". No creo que los nombres estén elegidos al azar. Desde luego, no son "exigidos" por el script que acompaña a la página.

viernes, 1 de noviembre de 2013

¿Problemas con los links en Internet Explorer?

Desde hacía un tiempo, al abrir links en nueva pestaña en internet explorer 10 me aparecía una pestaña vacía. Al principio no me di cuenta de que era un problema del navegador: parecía ser un problema de las páginas que estaba visitando (por ejemplo gmail, donde percibí que no podía abrir los archivos adjuntos, pero sí podía descargarlos... ¡luego me daría cuenta de que en realidad no podía abrir ningún enlace!), pero hoy al fin he decidido tomar cartas en el asunto.

Después de desactivar los complementos del navegador, resetear su configuración e incluso desinstalar y reinstalar internet explorer 9 y 10 y borrar sus claves del registro, lo que ha funcionado ha sido un script que des-registra y vuelve a registrar todos los DLL de internet explorer (¿por qué no se registran al instalar el programa?).

El problema es que, aunque en las soluciones de Microsoft ya avisaban que el problema podía estar en la necesidad de volver a registrar los DLL, las páginas de Microsoft hablaban solo de los DLL del Explorer 6...  Por eso he necesitado un script externo, llamado ie8rereg.cmd, que registra los DLL adicionales usados por los explorer 8, 9 y 10.
  1. Ve a: http://iefaq.info/index.php?action=artikel&cat=42&id=133&artlang=en (Copia el link si no puedes abrirlo de otra manera).
  2. Descarga el archivo adecuado según si tu navegador es de 64 bits (ie8-rereg.64on64.cmd), de 32 bits en ordenador de 64 bits (ie8-rereg.32on64.cmd), o de 32 bits en un ordenador de 32 bits (ie8-rereg.32on32.cmd).
  3. Descomprime el archivo. Creará un archivo cmd. Ejecútalo como administrador. (Si no te fías, puedes echarle un vistazo con el bloc de notas, ya que los archivos cmd tienen formato de texto). 

martes, 25 de junio de 2013

Checklist para el uso de firma electronica con la administración.

No sé por qué, pero algo que debería ser simple, rápido, eficaz y gestionado por el servidor, como la firma electronica, suele dar un montón de problemas, al menos a mí siempre me los da. A continuación, una pequeña checklist para tratar de corregir errores.
  1. ¿Tienes una firma electronica? Asegúrate de tener una firma electrónica. En caso de que la firma esté en un dispositivo externo (DNI electrónico), asegúrate de haber escrito bien la contraseña.
  2. ¿Has incluido los AC raíz más recientes de la FNMT (Administración Pública, FNMT-RCP y APE) y Camerfirma en tu navegador? Si no lo has hecho, ve a la página de la FNMT y Camerfirma y descárgatelos. (NOTA: en los puntos siguientes, al hablar de certificados, nos referimos a tu certificado personal MÁS los certificados de la FNMT y Camerfirma).
  3. ¿Estás usando Chrome? - El navegador Chrome tiene su propia gestión de los archivos PDF. Eso es estupendo, pero, lamentablemente, alguien decidió (por motivos de seguridad) no incluir el soporte para script que necesitan casi todos los formularios online de la administración española. Por tanto, tienes dos opciones (elige una de ellas):
    1. Cambiar de navegador (Internet Explorer es lo que menos problemas te dará, siempre y cuando tengas la última versión).
    2. Abrir chrome://plugins/, y deshabilitar "Chrome PDF Viewer", lo que debería habilitar "Adobe Reader" (si tienes adobe instalado, claro). Cuando abras el PDF, Chrome intentará disuadirte de ejecutar Adobe Reader, así que tendrás que decirle que sí, que lo ejecute.
  4. ¿Has instalado tu certificado en tu navegador? Puede que hayas instalado tu certificado en Windows, pero eso no garantiza que esté instalado en el navegador, a menos que uses explorer. Comprueba en la configuración de tu navegador que el certificado esté instalado.
    1. Chrome: Menú > Configuración > Ver opciones avanzadas > HTTPS > Administrar certificados.
    2. Mozilla Firefox: Herramientas > Opciones > Avanzado > Cifrado > Ver Certificados
  5. ¿Has instalado tu certificado en Adobe Acrobat? Puede que hayas instalado tu certificado en Windows, pero eso no garantiza que esté instalado en Acrobat (aunque debería). Comprueba en la configuración de Acrobat Reader que esté instalado. Use una de estas dos.
    1. Instala tus certificados en Edición > Protección > Configuración de seguridad.
    2. Ve a Preferencias > Seguridad > Preferencias avanzadas > Integración con windows y márcalo todo (de ese modo, se asegurará de que sus preferencias de seguridad coincidan con las de windows, aunque esto no está exento de problemas).
  6. ¿Has instalado tus certificados en Java? Para instalarlos, tienes que ir al panel de control, buscar Java, y dentro del icono "Java" seleccionar "Seguridad" y "Gestionar Certificados".
  7. ¿Está tu navegador bloqueando Java o Acrobat? Puedes tratar de evitarlo manteniendo pulsado "Control" en Internet Explorer, o bien agregando la web actual a "Sitios de confianza". A menudo, el bloqueo de Java conduce a un bucle sin fin (sale un cartelito pidiendo que aprobemos un applet, decimos que sí, volvemos al mismo sitio donde estábamos, se vuelve a descargar el applet, se nos vuelve a preguntar si la aprobamos). Ese "bucle sin fin" solo se puede evitar si agregamos la ubicación actual a los "sitios de confianza" o bajamos la seguridad del navegador al mínimo.

Supón que has probado todo lo anterior y sigue sin funcionar. ¿Qué puede haber pasado? Si usas un lector de DNIe puede deberse a un capricho de la aplicación del DNIe; también puede suceder que tu nombre tenga acentos en tu certificado pero no los tenga en la administración con la que estás lidiando (esto suele suceder en la Seguridad Social) o puede, simplemente, que hoy los hados no estén de tu parte. Mejor imprimes el dichoso formulario y te vas al registro de tu ayuntamiento, o a una oficina de correos.


Nota sobre certificados digitales y seguridad: es importante que tu certificado digital esté protegido con alguna contraseña, para evitar que el robo de tu ordenador conduzca al robo de tu identidad. Lamentablemente, casi ningún navegador gestiona bien este punto (Internet Explorer pide tu permiso pero, aparentemente, no solicita una contraseña). Admirables excepciones son Java y Firefox.


Edición del 24 de febrero de 2014. Hay otros dos errores posibles que no tuve en cuenta:
"Error 2148532334: El usuario canceló la operación":
Significa que el driver o programa usado no se ha instalado con privilegios administrativos, o no se ha ejecutado como administrador. Por lo tanto, el sistema de seguridad de Windows Vista / 7 / 8 / 8.1 lo bloquea.
"El navegador no puede ejecutar este complemento":
Puede significar varias cosas:
  • Muchos de los navegadores actuales bloquean java por defecto. Debes indicarle al navegador (habitualmente en un mensaje en la parte superior o en un icono en la barra de navegación) que permita usar java (ver arriba).
  • Además, Java 7 exige que las applet estén firmadas con una firma actual (por ejemplo, las de la Agencia de protección de datos no lo están). Para poder usar las app java de firmado en estos sitios es necesario ir al panel de control y bajar la configuración de seguridad de Java, o bloqueará el complemento.
  • Finalmente, las últimas actualizaciones de java exigen que las app incluyan en su "manifiesto" una lista de sitios web en los que pueden ejecutarse (esto ya es para nota). Así que la mayoría de sitios que usaban java ya no funcionan.

domingo, 13 de enero de 2013

Solucionando problemas del Bluetooth en Windows 8

Tras actualizar su ordenador ASUS a Windows 8, mi hermana estaba muy contenta, porque de repente todo lo que no funcionaba comenzó a funcionar. ¿Todo? ¡No! Una pequeña aldea gala, llamada Bluetooth, se seguía resistiendo.
Pues bien, después de varios intentos (buscar drivers, actualizar los drivers, etc.), resulta que la solución no consistía en meter un driver para Blueetooth, sino en instalar el programa que permite activar o desactivar este dispositivo.
Hay una nota que avisa de esto en uno de los drivers para Vista, pero no hay avisos en el resto de drivers (por ejemplo, en los drivers para 7).
El programa en cuestión se llama "Wireless Switch" (reemplaza al antiguo "Wireless Console"), y no está en la categoría "Bluetooth" de las actualizaciones, sino en la categoría "Utilidades".
Una vez instalado, os aparecerá un icono para que podáis activar el bluetooth... y listo!

domingo, 16 de septiembre de 2012

África Clicable

Este año me toca la asignatura de Ámbito Sociolingüístico de 3º, lo que implica que tendré que repasarme la geografía (que no repaso desde que di un curso de compensatoria hace una docena de años).

Por eso se me ocurrió crear una pequeña aplicación que preguntase los nombres de una serie de accidentes geográficos africanos. Podría haber empleado un programa para pizarra digital, como ActivInspire, pero me pareció mucho más sencillo emplear Construct2, un programa gratuito de creación de juegos html2.

La aplicación todavía está en mantillas (no tengo tiempo para buscar sonidos gratuitos, probar tipografías, etcétera), y es incómoda de usar porque con el motor de "toque" de scirra es difícil simular el scroll de la pantalla. Pero la he subido a la web por si queréis echarle un vistazo, o por si alguien se anima y me pide el código fuente para crear una aplicación similar para la geografía española o europea.


Pulsad aquí para abrir África Clicable, un mapa interactivo de África.

miércoles, 15 de febrero de 2012

Trucos tontos: crear un autorun.inf para detectar virus en pendrives.

Un método tonto para detectar virus que atacan unidades USB:

Si tienes que utilizar a menudo ordenadores compartidos por mucha gente y que no están actualizados, supongo que te preocupará el hecho de llevarte un virus de regalo a casa cada vez que usas un pendrive. Este es un pequeño truco para detectar fácilmente si tienes un virus, y por tanto poder tomar medidas antes de que tu ordenador de casa se contagie. (De todas formas, es muy aconsejable que deshabilites la opción autorun en las unidades USB de tu ordenador de casa... )

1) Crea en la raíz del usb una carpeta llamada Autorun

2) Con un programa de dibujo que sea capaz de grabar en formato ico, crea un icono personalizado a partir de una foto y guárdalo en formato ICO en una carpeta llamada \autorun en tu lápiz usb. En caso de necesidad, puedes ponerle la extensión ICO a un BMP de 32x32 puntos.

3) Activa en tu explorador de archivos la opción de ver archivos ocultos y de sistema (dependiendo de la versión, los pasos serán diferentes. En XP es algo así como Herramientas => Opciones de Carpeta => Marcar "Mostrar todos los archivos y carpetas ocultos" y desmarcar "Ocultar archivos protegidos del sistema operativo").

4) En la raíz del USB, crea o edita el archivo de texto autorun.inf (si ese archivo contiene alguna línea que haga referencia a un archivo .EXE, puede que tengas un problema).

5) Inserta la siguiente línea:
[AUTORUN]
ICON=\autorun\nombredetuicono.ico

(sustituye nombredetuicono por el nombre que le hayas dado a tu icono).

6) Graba el archivo (no olvides que si lo editaste con Notepad tienes que seleccionar "Todos los archivos" como "Tipo de archivo" para poder ponerle la extensión inf).

7) Dale los atributos "Oculto", "Sólo Lectura" y "Sistema" a la carpeta autorun y a los archivos que has guardado (clic derecho en tus archivos => Propiedades => marca "Oculto" y "Sólo Lectura"; para dar el atributo de sistema, es posible que tengas que emplear la consola de MS-DOS (CMD.EXE): el comando es attrib +HRS letra_unidad:autorun.inf).

A partir de ese momento, cada vez que introduzcas la unidad usb en un ordenador con windows, aparecerá tu icono personalizado. En caso de que no exista, es muy posible que hayas sido infectado por un virus.

Ten en cuenta que el hecho de que siga apareciendo tu icono personalizado no garantiza que no haya un virus en el ordenador; simplemente, indica que el virus no afecta a los usb, o que es suficientemente inteligente como para no eliminar tu icono personalizado.

martes, 5 de julio de 2011

Compatibilidad teclado/ratón inalámbrico

No sé si a alguno os ha ocurrido, como a mi, que os habéis cargado en alguna ocasión uno de los componentes (teclado o ratón) de un escritorio inalámbrico.

Como resulta muy incómodo tener dos emisoras de radio distintas (una para el teclado y otra para el ratón), en estos casos suelo procurar hacerme con un ratón o teclado compatibles con el teclado o ratón que funcionan, de forma que no necesite una segunda emisora.

El problema es que a menudo las casas fabricantes no proporcionan datos sobre compatibilidad entre teclados y ratones distintos de la misma marca.

Así que propongo que hagamos una pequeña lista.

De momento, yo he introducido los datos de tres ratones y un teclado. Si conocéis más datos, indicádmelos en el apartado "comentarios", y los agregaré a la hoja.