miércoles, 23 de octubre de 2013

Entrada analógica microprocesador.Cálculo de una botonera.

Ahora me dedico al cacharreo con el microprocesador Arduino Uno. Este microprocesador dispone de varias entradas o salidas digitales y de varias entradas analógicas. Las entradas analógicas hacen la conversión de un valor de tensión analógico (de 0 a 5V) a un valor digital comprendido entre 0 y 1023. Una botonera son varios botones, normalmente mas de uno, que según se pulse uno u otro botón la acción a realizar es distinta. 

Este diseño de botonera ocupa una sola entrada analógica del microprocesador Arduino UNO. Consta de N resistencias en serie y de N-1 pulsadores de los que cierran el circuito al pulsarlos. Mientras no se pulse el botón el circuito permanece abierto.




  • Uno de los terminales de los pulsadores va a la línea de tensión positiva y el otro terminal se situa entre dos resistencias.
  • Los pulsadores cortocircuitan todas las resistencias situadas entre sus  contactos, según el gráfico. El primer interruptor cortocircuita todas las resistencias situadas por encima de R0, el segundo todas las situadas por encima de R1, el tercero todas las situadas por encima de R2, etc...
  • La  entrada analógica va conectada al punto de unión de R0 y R1, salida de la botonera. 
  • Al pulsar cada uno de los botones varía el nivel de tensión de salida. El cálculo de los valores de R para obtener un valor deseado es sencillo, pero un poco pesado. Por eso he preparado un libro excel que realiza estos cálculos.
  •  Parto del supuesto que  dos botónes consecutivos presentan un salto de tensión equivalente (1023/Num. Int.).
  •  Una vez calculados los valores teóricos de las resistencias busca los valores comerciales mas próximos.
  •  Una vez conocidos los valores comerciales de las resistencias calcula los valores que leerá la entrada analógica del microcontrolador.
  •  El libro excel está preparado para calcular botoneras de hasta 20 botones.


  • En  la columna B de la hoja "Botonera" calculo el valor digital que debe tomar la salida.
  • No voy a explicar como se despeja una ecuación con una incógnita. En la columna C de la hoja "Botonera" calculo un factor X por el que hay que multiplicar R0 para obtener las distintas Rn.
  •  Con esto encuentro los valores teóricos exactos que satisfacen las necesidades de la botonera.
  • Los valores teóricos obtenidos normalmente no coinciden con los valores comerciales de las resistencias. Para encontrar los valores comerciales mas próximos a los teóricos utilizo =COINCIDIR($E2;Resistencias;1). Esta formula devuelve la línea en la que está el último valor menor o igual al buscado.
  • Con los valores comerciales encontrados repito los cálculos para saber el valor digital correspondiente.
  • Repito los cálculos con los valores comerciales inmediatamente superiores a los teóricos.
  • Hay que repetir los cálculos n veces, una para cada resistencia, este es un trabajo típico de hoja de cálculo.




viernes, 15 de marzo de 2013

Números primos y conjetura de Goldbach.




Pequeña y poco útil herramienta, ¿ alguien se ha encontrado en el  mundo real con la necesidad de saber si un número es primo o no?  ,para saber si un número es primo o no y para saber cuales son los dos números primos que sumados dan un número par determinado.
Funciones utilizadas:
  1. Coincidir()
  2. Indice()
  3. Si()
  4. Entero
Rangos o variables con nombre:
  1. CGB=ConjeturaGoldbach!$B$1
  2. Num=Primo!$B$1
  3. Primos=NPrimos!$A:$A
  4. RaizNum=ENTERO(RAIZ(Primo!$B$1))
  5. RanSum=INDIRECTO("$g$3:$g" & Primo!$D$1+1)
  6. UCoin=Primo!$D$1

¿ Como podemos calcular si un número es primo o no? En principio un número primo es aquel que solo es divisible por uno o por si mismo. Si un número no es primo tiene al menos dos divisores, uno con un valor inferior a su raíz cuadrada  y el otro con un valor superior a esa raíz, salvo en el caso de que su raíz cuadrada sea un valor entero, en el solo podemos asegurar un divisor. Además al menos uno de los divisores es un número primo. Por tanto, para calcular si un número es primo, o no, se puede dividir por todos y cada uno de los números comprendidos entre el entero de su raíz cuadrada y dos. Si una de esas divisiones nos da entero, en número no es primo y si en ninguna de ellas nos da entero el número es primo. Este es el camino largo, para acortar el proceso basta con dividir por los números primos que hay entre su raíz cuadrada y dos. Es mas complejo pero permite, dadas las limitaciones del Excel, aumentar el máximo numero a comprobar. En la hoja de cálculo utilizo este segundo método. Los 65536 primeros números primos los encuentro mediante programación, con la siguiente subrutina:

Sub NumPrimos()
Dim N, I, X As Double, Es
N = 2
I = 1
Sheets(1).UsedRange.Clear

While N < 65536

I = I + 2
X = Int(Sqr(I))
Es = True
For j = X To 2 Step -1
If I / j = Int(I / j) Then
Es = False
Exit For
End If
Next
If Es Then
N = N + 1
Sheets(1).Range("a" & N).Value = I
End If

Wend

End Sub

La hoja NPrimos contiene los 65536 primeros números primos, en la hoja "Primo" hago encuentro si un numero es primo o no. En la hoja "ConjeturaGoldbach" encuentro al menos una pareja de números primos que sumados dan un determinado número par.  El mecanismo de funcionamiento exige, en ambas hojas, activar el filtro después de escribir el número, eligiendo 1 en el desplegable de valores de la columna G en Primo y de la columna I en la conjetura.

Números primos. Hoja "PRIMO":

  1. El numero a procesar se escribe en B1 (variable con nombre Num)
  2. Incluyo en la columna C, a partir de la línea 3, los números enteros del 0 al  655333.
  3. En D1, mediante la fórmula =COINCIDIR(RaizNum;Primos;1) (ver rangos y variables con nombre) , localizo el mayor número primo que es menor o igual al entero  de la raíz cuadrada del número.
  4. En la columna E divido el número Num por los números primos menores al primero encontrado. Para ello utilizo la función  =Num/INDICE(Primos;UCoin-$C3). Esta función produce un error cuando UCoin-$C3 es menor que uno.
  5. En la columna G, mediante la función condicional =SI(ENTERO($E3)=E3;1;0) indico que si el resultado de la división del apartado anterior es entero de un uno y si no un cero.
  6. Sumo la columna G en la variable con nombre RanSum ,=INDIRECTO("$g$3:$g" & Primo!$D$1+1). Si un número no es primo tiene varios divisores primos, hasta llegar a uno, y si lo es solo tiene uno, el uno. En ambos casos hay que sumar hasta la línea del uno, pero no incluirla. Esto significa que si el último primos menor o igual a la raíz está en la línea N hay que sumar N-1 terminos. Como empezamos el la línea tres, corregimos la fórmula hasta D1+1. No es necesario gestionar los errores dado que solo utilizamos el rango en el que no se ha producido ninguno.
  7. En H, mediante la función condicional =SI(SUMA(RanSum)=0;"Es primo";"No es primo") presento el resultado del proceso. 
  8. Lamentablemente el filtro no se actualiza automáticamente, hay que activarlo cada vez, seleccionando uno en G.

Hoja ConjeturaGoldbach:

  1. El número par a comprobar se sitúa en B1. 
  2. Cálculo la mitad de ese número en d1.
  3. Encuentro el mayor número primo que es menor o igual a la mitad del número procesado.
  4. El algoritmo consiste en restar cada número primo inferior a igual a la mitad del número procesado, restarlo del número para después encontrar, media la función COINCIDIR, el último primo menor que el resultado de la resta. Si este segundo número primo encontrado sumado al primero suman igual que el número procesado la conjetura se cumple. En la columna I, mediante el condicional SI se prepara, mediante 0 o 1 la selección del par de primos que hacen que la conjetura se cumpla.
  5. Lamentablemente el filtro no se actualiza automáticamente, hay que activarlo cada vez, seleccionando uno en I.









jueves, 7 de marzo de 2013

Conversión de ficheros formato Kml a formato PLT


Y a formato GPX. Un fichero KML es uno de los tipos de fichero que utiliza  Google Hearth para representar una ruta. Es un fichero de texto leíble con cualquier editor de textos.
Una ruta en formato KML esta formada por una serie de comandos XML. Cada comando está dedicado a un tema, cabecera, nombre, el color, etc... Aquí solo nos interesan las coordenadas, que son una única línea en la que están todos los puntos de una ruta separados por un espacio. Cada punto, a su vez, está formado por un valor X para la longitud, un valor Y para la latitud y un valor Z para la altura, separados por comas X,Y,Z 
Esta estructura de datos nos crea un problema a la hora de trabajar con ellos en Excel, los datos no vienen en columnas, vienen en una sola línea, lo que junto a que una hoja excel tiene 256 columnas como máximo y a que el número de caracteres en una celda también es limitado nos impide trabajar, al menos, con rutas de mas de 256 puntos.
Cuando empecé este trabajo no tuve en cuenta estas limitaciones, me limité a abrir el fichero KML con excel y a procesar la línea con los puntos de la ruta. En esta primera forma de trabajar , durante el primer paso, necesitaba una columna por punto. Esta la limitación de 256 columnas me impedía trabajar rutas de mas 256 puntos. Posteriormente pensé ¿Como convierto esa línea de n puntos en una columna con n líneas de un punto? Se puede hacer y de hecho es relativamente sencillo. Como he dicho estos ficheros son editables con cualquier editor de textos, en mi caso utilicé el bloc de notas. 
  • Hacemos una copia del fichero KML, pongamos pru.kml, y la abrimos con el bloc de notas.
  • Eliminamos todas las líneas de comandos y nos quedamos solo con la enorme línea con los puntos de la ruta.
  • Delante de esa línea insertamos <table><tr><td>
  • Como en este caso el separador de los puntos de la ruta es un espacio sustituimos ese espacio por <tr><td>. Accedemos a la utilidad de reemplazar, escribimos un espacio en la casilla "buscar" y <tr><td> en la casilla "reemplazar por". Pulsamos reemplazar todo.
  • Añadimos después de la línea con los puntos </table>
  • Guardamos el fichero con "Guardar Como" cambiando la extensión del fichero a HTM. Pongamos pru.htm
  • Con el botón derecho del ratón (botón secundario) abrimos este fichero htm con excel. Por lo menos en mi PC funciona, ya tenemos la línea convertida en columna.
  • Copiamos la columna, con pegado especial-> Valores, a un libro nuevo.
  • En este punto hay que separar los distintos X,Y,Z de cada punto. Con Datos->texto en columnas los vamos a separar.
  • Seleccionamos la columna completa. Datos->Texto en columna, delimitados. En este caso el separador en una coma.
  • A la hora de convertir un punto de formato no vamos a tocar ni el valor X ni el Y. El valor Z lo tenemos que convertir a pies, por lo que tiene que ser numérico.
  • En el paso 3 de la conversión seleccionaríamos los dos primeros campos (X e Y) como texto y par el tercero, la altura, lo dejamos como "General" y con la opción avanzadas indicamos que el separador decimal es un punto y el separador de miles es una coma. Indicamos la celda de destino y finalizamos.
  • Para pasar la altura de metros a pies divido la altura en metros por 0,3 y ya de paso redondeo el resultado. Utilizo  la función =REDONDEAR(C1/0,3;0) 
  • El resto es concatenar los distintos valores XYZ para que tengan la estructura de los distintos formatos OZIEXPLORER o GPX.
  • Añadimos los valores en los ficheros de texto que tengamos preparados con cabeceras y colas, y ya podemos funcionar.
Conversión de De PLT a GPX
Conversión de GPX a PLT
http://ellibrosobreexcelquenoescribirenunca.blogspot.com.es/2011/11/de-gpx-plt.html
http://ellibrosobreexcelquenoescribirenunca.blogspot.com.es/2011/11/de-gpx-plt-ii.html
http://ellibrosobreexcelquenoescribirenunca.blogspot.com.es/2011/11/de-gpx-plt-iii.html




martes, 19 de febrero de 2013

Separar nombres y apellidos II

Antes de nada voy a explicar como se maneja esta herramienta. Este libro tiene dos hojas, una de ellas (hoja "Nombres") contiene los nombres  mas habituales, sin acento y otra con la relación de nombres completos a separar (hoja "Personal"). Su uso es tan fácil como:

  • Habilitar macros.
  • Eliminar las líneas usadas anteriormente en la hoja Personal. Eliminarlas, no borrarlas.
  • Copiar en la columna D de la hoja personal la lista de los nombres completos.
  • Si fuese necesario hay que eliminar los dobles espacios.
  • Realizar el proceso automático.
  • Realizar el proceso manual.
  • La búsqueda de nombres se basa en la lista de nombres. Si Se  añaden nuevos nombres a la lista de la hoja Nombres esta búsqueda mejora. No es necesario ni ordenarla ni que solo aparezca solo una vez cada nombre, se pueden repetir. Los nombres se deben añadir sin acento. 

He logrado encontrar un algoritmo que me permite separar nombre y apellidos de manera automática. No todos, calculo que quizás no encuentre bien menos 10% de los nombres, o no los encuentra o los encuentra mal, pero encuentra mas del 90%.
Los apellidos simples los encuentra todos si el nombre no es compuesto y casi todos si el nombre es compuesto.
Los apellidos compuestos, algunos de ellos para saber como van hay que hablar con el sujeto en cuestión, creo que tiene un acierto mayor al 80%. El resto hay que resolverlos a mano.
Mi algoritmo está pensado para nombres compuestos de hasta cuatro palabras, dos nombres y dos partículas, del tipo "María de las Mercedes". Este algoritmo no contempla un nombre compuesto de mas de dos nombres. De los apellidos compuestos solo estudio dos  palabras, para saber si son partículas. 
Recordemos que en la composición de nombres y apellidos, en algunas de sus opciones, no se dan certezas, se dan casos mas probables.

Para nombres:
  • He recopilado los 380 nombres mas comunes en España. En este caso necesito saber si una palabra esta incluida en la relación de nombres.
  • Cuento el número de palabras del texto con el nombre y apellidos. Para que uno de esos textos tenga un nombre compuesto o un apellido compuesto debe tener mas de tres palabras. 
  • Si tiene tres palabras, la primera es el nombre, la segunda es el primer apellido y la tercera es el segundo apellido. Las separaciones las indican el primer y segundo espacio del texto.
  • Si tiene cuatro puede tener un nombre compuesto de dos palabras (José María), la primera y la segunda palabra. Hay que comprobar si esa segunda palabra está en la relación de nombres. Si lo esta la separación entre el nombre, en este caso compuesto, es el segundo espacio, si no es el primero.
  • Si tiene cinco puede tener un nombre compuesto de tres  palabras, dos nombres y una partícula (María del Carmen). Si la segunda palabra es nombre se aplica el anterior punto. Si no es nombre lo supongo partícula y compruebo que la tercera palabra sea nombre. Debería comprobar que la segunda palabra fuese una partícula pero, con estos niveles de error, da un poco lo mismo. Además el algoritmo está pensado para funciones Excel no para programación, lo que multiplicaría por mil las funciones anidadas. Si la tercera palabra es nombre la separación es el tercer espacio. Si no, el primero.
  • Si tiene séis puede tener un nombre compuesto de cuatro  palabras, dos nombres y dos partícula (María de las Mercedes). Si la segunda palabra es nombre se aplica lo dicho en puntos anteriores. Si no es nombre lo supongo partícula y compruebo que la tercera palabra sea nombre, como en el anterior punto. Si la cuarta palabra es nombre  la separación es el cuarto espacio. Si no, el primero.

Resumiendo: 

  • Si el texto tiene  cuatro o mas palabras (>=4) y la segunda palabra es nombre la separación la da el segundo espacio.
  • Si el texto tiene  cinco o mas palabras (>=5) y la segunda palabra es una partícula y la tercera es nombre la separación la da el tercer espacio.
  • Si el texto tiene  seis o mas  palabras (>=6) y la segunda palabra es una partícula y la tercera es nombre la separación la da el cuarto espacio espacio.
  • En todos los demás casos la separación la da el primer espacio.


El formulón que resuelve este algoritmo es:

=SI(P1<=3;1;SI(Y(NO(ESNOD(COINCIDIR(J1;Nom;0)));P1>=4);2;SI(Y(NO(ESNOD(COINCIDIR(K1;Nom;0)));P1>=5);3;SI(Y(NO(ESNOD(COINCIDIR(L1;Nom;0)));P1>=6);4;1))))

En Donde:

  •  P1 (columna P) es el número de palabras del texto original.
  • J1 (columna J) es la segunda palabra, K1 la tercera y L1 la cuarta.
  • El rango con nombre Nom es =Nombres!$A:$A
  • Durante la fase de desarrollo separé las palabras del texto mediante la opción "Texto en Columnas". El número de palabras la calculé con =SI(L1="";3;SI(M1="";4;SI(N1="";5;SI(O1="";6;7))))
Podía haber separado mediante una fórmula similar los apellidos, pero dado que es realmente farragoso y que además es un trabajo dedicado a mi esposa, ella lo va a utilizar, decidí pasarme a la programación.

Para apellidos estudio las tres palabras siguientes al nombre o nombre compuesto encontrado. Los casos encontrados y su respuesta mas probable son:

  • Si primera de estas palabras es partícula y la segunda no (Del Corral) la separación se produce dos espacios después del nombre.
  • Si esas dos palabras son partículas (De la Parra) la separación es tres espacios después del nombre.
  • Si después del nombre hay cuatro o mas palabras y ninguna de las tres primeras es una partícula la separación se produce dos espacios después del nombre.
  • Si después del nombre hay cuatro o mas palabras y la primera no es partícula, la segunda si y la tercera no la separación se produce tres espacios después del nombre.
  • En todos los demás casos la separación se produce un espacio después del nombre.
Las partículas que considero son: "de" , "del" , "la" , "los" , "las", "a", "as", "o", "os", "y", "i", "do" , "dos", "van", "den", "san" 







viernes, 8 de febrero de 2013

Como crear nuestras propias funciones en Excel.

En alguno de los ejemplos anteriores he expuesto algunas funciones anidadas realmente complejas. Si nos encontramos con un caso de estos, funciones complejas, situaciones difíciles de calcular con las funciones propias de Excel, podemos crear con VBasic nuestras propias funciones.
En programación una función es una subrutina que devuelve un valor. En VBasic estas subrutinas se utilizan:

  • Function NombreFunción(Parametro1,parametro2,....)
  • operaciones necesarias para obtener el resultado
  • NombreFunción=resultado
  • end function
Para utilizar estas funciones hacemos como con las funciones propias de Excel, nos situamos en lacelda correspondiente y escribimos =NombreFunción(Param1;Param2;....)

Como ejemplo:

Function XCart(Dist, Rumbo)

XCart = Dist * Sin(3.14159265358979 * Rumbo / 180)

End Function

Esta función pasa los grados sexagesimales del parámetro Rumbo a radianes y calcula la el valor de la proyección del parámetro Dist en función del seno del rumbo.

Para utilizarla dentro de una hoja de cálculo, situándonos en la celda correspondiente:
=xcart(F3;I3)

jueves, 7 de febrero de 2013

Subrutina o Subprograma.


  • En computación, una subrutina o subprograma (también llamada procedimiento, función o rutina), como idea general, se presenta como un subalgoritmo que forma parte del algoritmo principal, el cual permite resolver una tarea específica. Algunos lenguajes de programación, como Visual Basic .NET o Fortran, utilizan el nombre función para referirse a subrutinas que devuelven un valor.
  • Se le llama subrutina a un segmento de codigo separado del bloque principal y que puede ser invocado en cualquier momento desde este o desde otra subrutina.
  • Las subrutinas permiten realizar separadamente del programa principal determinadas tareas repetitivas. Normalmente para utilizarlas es necesario pasarles unas variables de trabajo (parametros).
  • Las subrutinas facilitan la estructuración del programa. Cuando el programa principal llama a una subrutina para que ésta se ejecute, la subrutina procesa su programa hasta el final. El sistema retorna luego el control al segmento del programa principal desde donde se llamó a la subrutina.
  • Las subrutinas sirven para estructurar o dividir el programa en bloques más pequeños y, por tanto, más fáciles de gestionar. Los bloques más pequeños facilitan la comprobación y la eliminación de errores tanto en las subrutinas como en el programa entero.
  • Básicamente una Subrutina es un segmento de código que se escribe sólo una vez pero puede invocarse o ejecutarse muchas veces. Existen dos tipos: Procedimientos y Funciones.
  • Procedimientos: Son un tipo de subrutina que ejecuta un conjunto de acciones sin devolver valor alguno como resultado de dichas operaciones. 
  •  Funciones: A diferencia de los procedimientos, las funciones después de ejecutar un conjunto de acciones devuelven sólo un valor del tipo usado en la declaración de ésta.




lunes, 4 de febrero de 2013

Comprobar la existencia de una hoja.

Al trabajar con VBasic muchas veces necesitamos utilizar una hoja, que puede que no exista, que hay que añadir, o puede que ya exista, con lo que no hay que crearla. Una manera de gestionar este tipo de asuntos es gestionar los errores que puedan producirse. La gestión de errores al  intentar utilizar una hoja, si no existe, nos da un error (<>0) y si existe nos da una ausencia de error (0), lo que de una manera simple nos permite saber si una hoja existe o no. Conocido el error o la ausencia de este procedemos a crear la hoja, si fuera necesario.
En VBasic hay una primera función para controlar los errores, la función Err. Esta función devuelve un valor numérico. Si no se produce un error devuelve cero y dependiendo del error, un número distinto de cero. Por otra parte los errores en tiempo de ejecución detienen el proceso. Para evitar que el proceso se detenga al aparecer un error utilizamos la instrucción On Error Resume Next. Debemos recoger el error inmediatamente después de producirse, en la siguiente instrucción, E = Err. Al terminar la gestión del error debemos activar de nuevo la detención de la ejecución al producirse un error, mediante On Error Goto 0.
En esta rutina además de comprobar la existencia de la hoja, en caso de que no exista, la crea.


Sub Comprueba(Hoja)

On Error Resume Next

Set h = Sheets(Hoja)

E = Err

On Error GoTo 0

If E <> 0 Then

Sheets.Add.Name = Hoja 

End If

End Sub 
Preparamos la gestión.


Provocamos el error.

Guardamos el error en una
 variable.
Reactivamos la detención.

Si el error es distinto de

cero.
Añadimos una hoja.


viernes, 25 de enero de 2013

Consola de recuperación.

Mi disco C: después de su ampliación, y de funcionar correctamente después de su ampliación, perdió su capacidad de arranque. Busqué y encontré la manera de recuperar el sector de inicio o de arranque (XP). Hay que:

  • Reiniciar el PC con el CD de instalación, en mi caso XP. En mi instalación, además, tuve que usar un teclado con cable, el inalámbrico no lo detectaba.
  • Tarda un rato. Hay que seleccionar la opción R, de consola de recuperación, pulsando R.
  • Como solo tengo un S.O. instalado lo seleccione, pulsando un 1.
  • Es obligatorio acordarse de la contraseña del administrador.
  • Lance los dos comandos de recuperación del sector de arranque, FIXMBR y FIXBOOT. Como mi XP viene en castellano hay que confirmar con una S.
  • Termino con Exit. 
La consola de recuperación es un pequeño S.O. que permite, además de esta recuperación del sector de arranque, hacer copias, borrar ficheros, crear directorios y otras operaciones con comandos similares, o iguales, a los del antiguo DOS. Según Microsoft son:

  • Attrib: cambia los atributos en un archivo o subdirectorio.
  • Batch: ejecuta los comandos especificados en el archivo de texto, ArchivoEntrada. ArchivoSal contiene la salida de los comandos. Si omite el parámetro ArchivoSal, el resultado se mostrará en la pantalla.
  • Bootcfg: modifica el archivo Boot.ini file para la recuperación y configuración del inicio.
  • CD (Chdir): sólo funciona en los directorios de sistema de la instalación actual de Windows, en los medios extraíbles, en el directorio raíz de cualquier partición del disco duro y en los orígenes de instalación locales.
  • Chkdsk: el modificador /p ejecuta Chkdsk incluso aunque la unidad no se haya etiquetado como "incorrecta". El modificador /r busca posibles sectores defectuosos y recupera en ellos la información legible. Este modificado implica a/p. Chkdsk requiere Autochk. Chkdsk busca automáticamente Autochk.exe en la carpeta de inicio. Si Chkdsk no puede encontrar el archivo en la carpeta de inicio, lo busca en el CD-ROM de instalación de Windows 2000. Si Chkdsk no puede encontrar el CD-ROM de instalación, Chkdsk pregunta al usuario por la ubicación de Autochk.exe.
  • Cls: borra la pantalla.
  • Copy: copia un archivo en una ubicación de destino. De manera predeterminada, el destino no puede ser un soporte extraíble y, además, no puede usar caracteres de tipo comodín. Al copiar un archivo comprimido desde el CD-ROM de instalación, se descomprime el archivo automáticamente.
  • Del (Delete): elimina un archivo. Sólo funciona en los directorios de sistema de la instalación actual de Windows, en los medios extraíbles, en el directorio raíz de cualquier partición del disco duro y en los orígenes de instalación locales. De manera predeterminada, no puede usar caracteres comodín.
  • Dir: muestra todos los archivos, incluidos los ocultos y los de sistema.
  • Disable: deshabilita un controlador o un servicio del sistema de Windows. La variable servicio_o_controlador es el nombre del servicio o del controlador que desea deshabilitar. Cuando utiliza este comando para deshabilitar un servicio, el comando muestra el tipo de inicio original del servicio antes de cambiar el tipo a SERVICE_DISABLED. Anote el tipo de inicio original para que pueda usar el comando enable para reiniciar el servicio.
  • Diskpart: administra las particiones en los volúmenes del disco duro. La opción /add crea una partición nueva. La opción/delete elimina una partición existente. La variable de dispositivo es el nombre de dispositivo para la nueva partición (como \dispositivo\discoduro0). La variable de unidad es la letra de unidad que para una partición que está eliminado (por ejemplo, D). Partición es el nombre basado en la partición para una partición que está eliminando (por ejemplo: \dispositivo\discoduro0\partición1) y se puede usar en lugar de la variable de unidad. El tamaño de la variable es el tamaño, en magabytes, de una nueva partición.
  • Enable: habilita un controlador o un servicio del sistema de Windows. La variable servicio_o_controlador es el nombre del servicio o del controlador que desea habilitar y tipo_inicio es el tipo de inicio para un servicio habilitado. El tipo de inicio usa uno de los siguientes formatos:
    SERVICE_BOOT_START
    SERVICE_SYSTEM_START
    SERVICE_AUTO_START
    SERVICE_DEMAND_START
  • Exit: sale de la consola de recuperación y reinicia el equipo.
  • Expand: expande un archivo comprimido. La variable de origen es el archivo que quiere expandir. De manera predeterminada, no puede usar caracteres comodín. La variable de destino es el directorio para el nuevo archivo. De manera predeterminada, el destino no puede ser un soporte extraíble y no puede ser de sólo lectura. Puede usar el comando attrib para quitar del directorio de destino el atributo de sólo lectura. Se requiere la opción /f:filespec si el origen contiene más de un archivo. Esta opción permite caracteres comodín. El modificador /y deshabilita el comando de confirmación de sobrescritura. El modificador /d especifica que los archivos no se expandirán y muestra un directorio de los archivos en el origen.
  • Fixboot: escribe un nuevo sector de inicio en la partición del sistema.
  • Fixmbr: repara el código de inicio principal de la partición de inicio. La variable de dispositivo es un nombre opcional que especifica el dispositivo que requiere un registro de inicio maestro. Omita esta variable cuando el destino sea el dispositivo de inicio.
  • Format: da formato a un disco. El modificador /q ejecuta un formato rápido. El modificador /fs especifica el sistema de archivos.
  • Help: si no usa la variable de comandos para especificar un comando, help enumera todos los comandos que son compatibles con la consola de recuperación.
  • Listsvc: muestra todos los controladores y servicios disponibles en el equipo.
  • Logon muestra las instalaciones de Windows detectadas y solicita la contraseña de administrador local para esas instalaciones. Use este comando para pasar a otra instalación o subdirectorio.
  • Map: muestra las asignaciones de dispositivo activas actualmente. Incluya la opción arc para especificar el uso de rutas de Computación avanzada de RISC (ARC) (el formato para Boot.ini), en lugar de las rutas de dispositivo de Windows.
  • MD (Mkdir): sólo funciona en los directorios de sistema de la instalación actual de Windows, en los medios extraíbles, en el directorio raíz de cualquier partición del disco duro y en los orígenes de instalación locales.
  • More/Type: muestra en pantalla el archivo de texto especificado.
  • Rd (Rmdir): sólo funciona en los directorios de sistema de la instalación actual de Windows, en los medios extraíbles, en el directorio raíz de cualquier partición del disco duro y en los orígenes de instalación locales.
  • Ren (Rename): sólo funciona en los directorios de sistema de la instalación actual de Windows, en los medios extraíbles, en el directorio raíz de cualquier partición del disco duro y en los orígenes de instalación locales. No puede especificar una nueva unidad o ruta como destino.
  • Set: muestra y configura las variables de entorno de la consola de recuperación.
  • Systemroot: configura el directorio actual en %raízSistema%.

jueves, 24 de enero de 2013

Redimensionar disco C:

He redimensionado el disco C: sin demasiados problemas, pero con alguno. Cuando instalé el XP dividí el disco fìsico en dos discos virtuales, el C: para el sistema operativo y el D: para los datos. Con el paso del tiempo el disco C: se ha ido llenando, hasta el punto de estar por encima del 90% de ocupación, yo creo que empezaba a entorpecer el funcionamiento del PC. 
Tengo un disco (live CD) con Guadalinex V6, que dicho sea de paso es bastante bueno. Antes de iniciar con Guadalinex desfragmenté el  ambos discos. Inicio el PC  con ese disco y abro GParted (Sistema->editor de particiones). Redimensiono el disco D:, dejando espacio el espacio libre entre ambos discos, a la izquierda de D:. Lleva su tiempo, pero sin problemas.
El disco C: sí me dio problemas. Daba un error, salvando el error a uno de los discos, pude ver que se refería a un cluster determinado y recomendaba ejecutar desde windows CHKDSK /f . Reinicié windows, ejecute el comando, como el disco es el del sistema tuve que forzar el chequeo del disco en  siguiente reinicio. Lo hice, repetí el chequeo para el disco D: (CHKDSK D: /f)
Volví a Guadalinex, lance GParted y amplié, esta vez sin problemas, el disco C: con el espacio libre obtenido anteriormente.

martes, 22 de enero de 2013

Separador de nombre y apellidos.






Muchas veces nos llega un listado, en Excel o en texto, con una relación de nombres y apellidos con un formato “nombre 1 apellido 2º apellido”. Muchas veces ese formato no nos vale, necesitamos separar en columnas el nombre y los apellidos. Esta utilidad separa el nombre y los apellidos, colocándolos en una columna cada uno.
 Al haber nombres compuestos, apellidos compuestos, una combinación de ambos, e incluso  personas con un solo apellido y al ser muy difícil separarlos automáticamente, los nombres o apellidos compuestos se deben resolver por parte del administrador, pero sin tener que reescribir esos nombres. Sencillamente se indica el número de separador (espacio) que separa el nombre del primer apellido y el segundo apellido del primero.

Utilizo las siguientes funciones:
Sustituir()
Espacios()
Encontrar()
Indice()
Si()
EsErr()
Izquierda()
Extrae()

Algoritmo, o como se hace:

  • Preparar el dato.
  • Localizar los espacios.
  • Indicar posición separadores. Manual, por parte del administrador.
  • Separar datos.
  • Copiar, pegado especial, valor.

Preparación del dato:
El listado con los nombres recibido hay que copiarlo el la columna A. En la columna B, que normalmente debería permanecer oculta, preparo cada nombre para su proceso. Esta preparación, en este caso, consiste en suprimir los espacios que puedan rodear, antes o después del nombre, el dato, en convertir los posibles dobles espacios entre palabras en un solo espacio y en añadir al final de la línea un espacio. El algoritmo utilizado para separar palabras necesita que un espacio, y solo uno, al final del nombre. Este pequeño truco garantiza que siempre habrá al menos dos separadores, lo que evita un error en los nombres con un solo apellido. Para líneas en blanco o sin espacios si se producirá un error.
  1. Los espacios los elimino utilizando la función ESPACIOS().
  2. Para sustituir los posibles dobles espacios utilizo, dos veces, anidada, la función SUSTITUIR() y por último concateno un espacio.
=SUSTITUIR(SUSTITUIR(ESPACIOS(A2);"  ";" ");"  ";" ") & " "

Localización de espacios:
Entre las columnas C y L se localizan los posibles espacios entre palabras mediante función ENCONTRAR(), controlando los posibles errores mediante la función EsErr() y la función SI().
La función encontrar tiene tres parámetros, el valor buscado, el texto dentro del cual se busca y un tercer parámetro opcional que indica, en número, a partir de que carácter se busca. Por eso, en esta utilidad, se hace referencia (+1) al valor anterior encontrado. 


En la columna D encontramos la siguiente fórmula :

=SI(ESERR(ENCONTRAR(" ";$B2;C2+1));-1;ENCONTRAR(" ";$B2;C2+1))

En donde C2 es la posición del anterior espacio dentro del nombre (B2). Si C2 fuese el último espacio espacio la función ENCONTRAR() daría un error. Si se produce ese error la función SI() nos devuelve un -1 y si no nos devuelve la posición del espacio, y así sucesivamente. He preparado la hoja para encontrar hasta 10 espacios, que considero que es suficiente para separar cualquier nombre. No obstante también calculo la longitud del nombre con






Separación del dato:
En las columnas N y O el administrador indica la posición, en numero, de los separadores (blancos) entre nombre y apellidos y apellidos entre si.  No es el numero de carácter que hace el espacio dentro del texto, es ordinal de los espacios (primero, segundo,..) A la hora de preparar las líneas,  como norma general, deben valer 1 y 2. Para nombres compuestos, por ejemplo “Juan Ramón” el espacio que separa nombre de apellidos es el segundo espacio. Para “María del Carmen” el espacio separador es el tercero, etc. Lo mismo sucede con el espacio que separa los apellidos entre si.

El nombre, en la columna Q, se separa mediante la fórmula =IZQUIERDA($B2;INDICE($C2:$L2;$N2)-1), en donde $N2 es la posición del separador. El primer apellidos lo encuentra entre el primer separador (N) y el segundo (O). El segundo apellido lo encuentra entre el segundo separador y el último carácter de la cadena.
La posición de los espacios dentro del texto está en el rango $C2:$L2. Con la función
INDICE($C2:$L2;$N2) obtenemos esa posición y a partir de ella, dividimos.

Por último el resultado se debe copiar y pegar, con el pegado especial, como valor, en el sitio de destino.










jueves, 17 de enero de 2013

Gráfico a partir de rumbo y distancia.


¿Y para qué nos sirve un gráfico de este tipo?
 En principio, cuando empecé a pensar en este ejercicio no me planteé esa pregunta, en general los ejercicios que pienso para subir a este blog están pensados para "hacer cosas en excel", independientemente de que tengan, o no, una utilidad práctica, aunque algunos si sean de utilidad. En este caso, este tipo de gráfico nos permite representar un camino en el que no podamos utilizar el GPS (caso de una mina), conocer las dimensiones de una habitación, conocer las rutas o dimensiones de sitios ciegos a los satélites del GPS. Solo necesitamos una brújula buena, con grados y una cinta métrica u otro aparato que nos permita medir distancias.

Caso práctico: ¿Como medir una habitación?
  • Colocamos la brújula con el eje 0-180  paralelo a la pared. El eje norte sur lo da aguja. 
  • Anotamos el ángulo, o rumbo, que nos da la brújula, (360 - ángulo).
  • Medimos la distancia entre esquinas.
  • Llevamos los valores a la hoja de cálculo.



En navegación se define el rumbo como el ángulo medido en el plano horizontal entre el norte y la dirección de avance del barco, medido en círculo, es decir, de 0º a 360º. Es uno de esos parámetros que utilizan o indican los GPS y que, aunque son términos náuticos, también los utilizan los GPS en tierra a la hora de seguir una ruta. Es uno de los datos que el software que acompaña a los GPS Garmin, el programa MapSource, da como propiedades de los puntos de un camino. Da el rumbo seguido y la distancia recorrida.

A partir de esos valores he preparado un gráfico XY. entre dos puntos de un camino hay un rumbo y una distancia.



Los puntos del camino seguido los paso a un libro excel mediante un copia-pega. Abro, en MapSource, las propiedades de un camino, selecciono los puntos de interés y los copio (contro+c) a un libro excel. 
Los datos importados (hoja Datos MapSource) vienen con sus correspondientes unidades (28 M o 32º) Utilizando Datos->Texto en columnas->delimitados elimino la parte innecesaria de esos datos. Como delimitador utilizo el espacio, para la distancia, y el signo de grado (º) , copiándolo del texto importado,para los grados. Al pasar los datos a columnas solo importo la primera columna, el resto las desecho. 
Como en excel las funciones trigonométricas utilizan radianes, hago la trasformación de grados a radianes de dos maneras, una mediante el cálculoGrados*PI()/180 y otra utilizando la función RADIANES(Grados), no es util, no es necesario pero refresca conocimientos.
Entre dos puntos se produce un incremento de los valores X e Y. En estos incrementos  el valor del incremento de   Y es distancia*coseno(rumbo) y el valor del incremento de X es distancia*seno(rumbo), columnas L y M de la hoja puntos. Como ya he dicho, las columnas J y K, el cálculo de radianes, no son necesarias, en las formulas de la columna  L se puede utilizar la función RADIANES anidada  en la formula de cada celda  =$F2*SENO(RADIANES(I2))

El camino queda definido al sumar los sucesivos incrementos (Columnas N y O de la hoja Puntos).Estos  puntos del camino los utilizo para dar contenido a la única serie del gráfico XY. Este gráfico es un gráfico del tipo XY (dispersión), de los que ya he puesto varios ejemplos en este blog. Por debajo de la serie coloco el mapa de la zona por donde hicimos la marcha. El mapa lo obtuve desde el programa MapSource. Como puede verse la ruta dibujada por MapSource coincide con la serie de XY. 
A esta serie le falta el punto inicial, el de origen, el 00. Este origen puede ser el 00 o unas coordenadas conocidas.