sábado, 25 de mayo de 2013

Visita a La Trona del Rey


La mañana del 12 de Mayo se presentaba muy prometedora, sobre todo por las horas a las que nos vamos acostumbrado a madrugar cada vez que salimos a una montaña "extranjera". Con ésto me refiero a salir fuera de Barcelona ciudad; nuestras amadas Collserola y Serralada de Marina a veces se nos quedan "cortas". Aún así, la sonrisa siempre decora nuestro rostro si la dicha es buena, ¿no? ¡Qué mejor que sentir el fresco de la montaña en la cara!

Al grano, ¿de qué consta esta visita a La Trona? No , no hablo de ir al WC que también es una trona importante, en este caso el comentario va relacionado con una zona encumbrada en Santa Coloma de Farners (que siempre lo cambio de población...)  desde donde se disfruta de una de las más preciosas vistas, como tantas y tantas que he ido recopilando a lo largo de mi vida montañera.

Pero para llegar hasta esa cumbre, antes se ha de sufrir disfrutar pedaleando durante aproximadamente 1.30h de subida sin tregua, siguiendo el camino que lleva a Can Mas Huix. Dulces subidas sin ningún tipo de sosiego en el ritmo. Son pistas forestales amplias, cuyo comienzo fue modificado (presumo) por las obras de la autovía, por lo que resultan bastante anchas y cómodas para pedalear sin echar el pato acabar exhausto.

Fijaos en el manto de nubes que ensombrecen las laderas, ¡Qué bonico, por favor!


Vale, vale, retomo la pequeña descripción.

Una vez llegados a Mas Huix supimos que las bajadas nos esperaban pronto, ya que llevábamos 1.20h subiendo y no nos quedaba más pista que seguir, pero nuestro sendero nos desviaba hacia la derecha (dirección Ermita del Padró) para proseguir serpenteando entre más árboles y pistas más estrechas, dignas de arboledas, por supuesto. Aunque no tuvimos que alejarnos mucho, ya que pronto llegaríamos al inicio de nuestras esperadísimas bajadas... ¡¡GUERRAA!!


Cierto es que el primer tramo parecía más técnico de lo que realmente es, ya que el respeto a lo "desconocido" siempre hace que tientes a revisar pasos que, en otro momento, lo realizaría sin pavor alguno; pero más vale ser cautos y plantar pie que la cara, ¡je!

Bajada tras bajada íbamos disfrutando de lo que nos iba deparando el camino, sin saber a ciencia cierta si seguíamos de forma fiel el track o no, por ello teníamos que consultar el móvil/GPS de vez en cuando, ya que los corriols se suceden uno tras otro de forma muy frecuente, lo que viene a ser "está minado".

Al final, sin quererlo, llegamos a un mirador precioso descubriendo así la archiconocida Trona del Rey.


Como una imagen vale más que mil palabras, la anterior os puede dejar un mensaje claro de las vistas desde esa zona. Preciosa, ¿cierto? Aunque no hace justicia de la realidad, es mejor presenciarlo en directo.

Tras invertir algo más de quince minutos ahí postrados, continuamos haciendo bajadas que para eso habíamos subido,¿no?

El resumen de todas éstas queda en tramos de recta con saltos naturales para ir tirando de manillar, y curvas cerradas donde se ha de hundir la leva del freno hasta el puño para no salir despedido ladera abajo =P

Una vez finalizado el tramo y llegando abajo, a la carretera, casi nos dejamos uno de los puentes más bonitos construidos sobre el riachuelo río charca  agua (poco técnico lo mío) del cual hicimos varias tomas y fotos, ¡por favor!



Aunque los mejores detalles los podéis encontrar en el vídeo de la ruta:

Visita a La Trona del Rey from segomo on Vimeo.

Si alguno desea información de cómo ir y más detalle, que pregunte por aquí, así como el track de la ruta o algún detalle más.

Mi calificación de la ruta


  • Nivel físico: 7
  • Nivel técnico: 6
  • Accesos: 6
  • Paisaje: 9
  • Bajadas: 8
  • Aglomeración: 2 (apenas encontramos senderistas / cicloturistas)
  • Satisfacción: 99%
¡RUTA MRA!



Sobre todo, si alguien visita este paraje, tan sólo un mensaje RESPETA EL PAISAJE.

Salud y pedales.

miércoles, 14 de noviembre de 2012

Macros Excel (III) ¡Un pasito más!

Otra entrega más, la tercera ya, de esta pequeña introducción al mundo de las Macros en Excel®. Hoy quiero avanzar un poquito más, para ello pondré un ejemplo que quizás lo podáis adaptar a vuestro entorno, como ir a comprar pan, tabaco calcular si vuestros interfaces de red, Ethernet, WiFi, WAN, balancean el tráfico de forma correcta.

Ante todo entended que NO es más que una pequeña macro que va embebida en otras más complejas, ¿vale?

Os comento el escenario del ejemplo:
  • Partimos de un fichero en formato CSV que, tras importarlo a un libro Excel (XLSX) separamos sus campos en varias columnas, un total de 36 columnas, aunque trabajaremos con tres de estas.
  • Creamos una Tabla Dinámica (Pivot Table) para ordenar los campos deseados y, de paso, darle un formato a nuestro gusto.
  • La "foto" de la PT es la siguiente:
  
 
En la  captura anterior podéis ver que existen espacios en blanco entre los campos principales, ahí tan sólo podemos aplicar un poco de lógica que explico ahora.

Copiemos en una nueva hoja (sheet) dentro del mismo libro los campos mostrados con sus valores y, para ir avanzando, agregamos nuevas cabeceras en las columnas D,E,F y G:
# Caminos    % Respecto Total    Total KB/sec    Balanceado?
Una vez finalizada nuestra tabla, vamos a calcular algunas cosas, como por ejemplo cuántos Devices Ethernet tiene cada máquina (en el ejemplo es fácil pero podemos tener múltiples campos)
[Para una mejor ejecución, he puesto una marca de "FIN" en la última celda de columna B]

Sub Gimme_N_Devices ()
    Dim Cont As Integer, Pos As Integer, Traffic As Double
    Dim RES As Variant
   
    Traffic = 0
    Cont = 1
   
    For Each x In Selection
        If x.Offset(1, 0) = "" Then
            Cont = Cont + 1
            Traffic = Traffic + x.Offset(0, 1)
        Else
            Pos = Cont * (-1) + 1
            Traffic = Traffic + x.Offset(0, 1)
            x.Offset(Pos, 2) = Cont
            x.Offset(Pos, 4) = Traffic          
            x.Offset(Pos, 5) = Gimme_Medias(x.Column, x.Row, Cont, Traffic)
            Cont = 1
            Traffic = 0
        End If
    Next x
End Sub
Nota: Antes de empezar a ejecutar la macro en si, seleccionar la columna B hasta la marca FIN que comentábamos anteriormente.
 
Comienzo a describir qué hace la función creada ( Gimme_N_Path ):

  • Las variables las defino (DIM), por regla general, al principio de la misma.
  • Inicializo las variables Traffic y Cont, la primera porque nos servirá como sumatorio de los KB/sec por device y la segunda es un simple contador. Ambas se irán reinicializando al final del bucle.
  • Inicio del bucle, para cada elemento X que se encuentre dentro de la selección, los devices ethernet de la columna B.
  • Las condiciones IF comprobarán si siguen dentro del mismo ETHx o del siguiente, para ello mirará debajo si la celda está vacía o no X.Offset(1, 0) OFFSET es un desplazamiento desde el punto indicado hacia una coordenada concreta. En nuestro caso, X.Offset (1, 0) le indica que, para la celda X de la selección, mirar hacia 1 celda positiva hacia el eje de ordenadas (y) 0 en el eje de abscisas (x) ¿Me seguís? Quizás a alguno se le haya olvidad cómo mirar los ejes de coordenadas en 2 dimensiones... mal, muy mal.
  • SI la celda de abajo está vacía, entonces sumará a la variable Traffic lo que se encuentre a su derecha [para ello usamos Offset(0, 1) esta vez] y Cont sumará 1, para tener en cuenta de que ya hemos pasado por un ETHx.
  • SI NO está vacía la celda de abajo,  entra en juego una nueva variable POS que almacena, gracias a CONT, la posición en negativo del ETHx tratado  Pos = Cont * (-1) + 1. Entiendo que os puede resultar algo raro esta utilidad, pero lo veréis para qué ahora. Jugamos de nuevo con Offset para, mediante la variable Pos, decirle nde colocar los valores de Cont y Traffic, veáse el número de posibles valores o caminos de ETH y el tráfico total :
            x.Offset(Pos, 2) = Cont
            x.Offset(Pos, 4) = Traffic          
            x.Offset(Pos, 5) = Gimme_Medias(x.Column, x.Row, Cont, Traffic)
  • Aquí haremos uso de una FUNCIÓN llamada Gimme_Medias en la que le pasaremos los valores de posición de X, es decir de la celda que estamos trabajando, para ello usamos X.ROW y X.COLUMN; además le facilitaremos CONT y TRAFFIC para el cálculo de las medias. [luego explico dicha función]
  • Ahora si, reseteamos las variables CONT y TRAFFIC para que se comience de nuevo el Loop con la siguiente X (celda).
 Sigo ahora con la función Gimme_Medias, que nos devuelve SI, NO ó -- (dos guiones).
¿Por qué tiro de esta función? Porque tomando los valores de TRAFFIC y CONT  nos hace la media aritmética, además de compara dicha media con los valores de cada una de las celdas que la forman, véase, calcular el porcentaje % de cada valor respecto a la media, con un márgen de "error" de +/- 5%. ¿Lo pilláis? Es algo más matemático que algorítmico.

Function Gimme_Medias(Colu, Fila, Paths, Totales)
    Dim a As Integer
    Dim RES As Long
    a = 0
    fila_new = Fila - Paths + 1
    Colu_new = Colu + 3
       
    Do While a < Paths
        IO_Count = Cells(fila_new + a, Colu_new - 2)
        If Totales > 0 Then
            RES = (IO_Count * 100) / Totales
            Cells(fila_new + a, Colu_new) = (IO_Count * 100) / Totales
            If (RES <= ((100 / Paths) + 5)) And (RES >= ((100 / Paths) - 5)) Then
               Gimme_Medias = "SI"
            Else
               Gimme_Medias = "NO"
            End If
           
        Else
            Gimme_Medias = "--"
        End If
        a = a + 1
    Loop
  
End Function
  Además, una vez  ejecutada la función, nos devuelve para condición si el valor está balanceado "SI" o "NO" y la otrora condición "--" que viene a ser "Sin tráfico".

Buf, parecía cortito el código pero algunas cosas ejecuta, ¿cierto?

Hasta aquí la tercera entrega, las próximas más código y menos charla.

¡Ah! el resultado final en una imagen:


#HALT

viernes, 26 de octubre de 2012

Tu primera Macro (Ohh que bonito)

 Como si de un retoño se tratara, en esta entrada vamos a ser capaces de automatizar alguna tarea cotidiana como lavarse los dientes  de vuestro día-a-día.

- Y.. ¿cómo la vamos a hacer?

Ya llegó el preguntón de turno... pues de forma manual, con el editor, picando linea a linea ¡Bingo! #chistefácil

- Ah...vale, pues ya dirás.

Sí, sí, ahora os cuento.

Como os dije en el anterior post, para entrar en el modo manual de edición de macros, pulsaremos ALT + F11 (buscad por el teclado la F11, que imagino que la usáis menos que el dedo pequeño del pie)

Una vez ahí, con la pantalla de edición por delante, ya podemos comenzar a picar código.

Detalles Previos [conceptual]
Claro está, necesitamos un poco de teoría de programación, ¿no?   Antes de nada, diferenciaros qué es un Procedimiento (Sub) de una Función (Function) aunque ambas realicen la misma actividad.

La manera más sencilla de saber si hemos de elegir entre crear una función o un procedimiento es que la primera nos devuelve un valor / objeto a su finalización y la segunda no. Sencillo, ¿verdad?

Os lo aclaro con un ejemplo: Estáis creando un código que, repetidas veces durante la ejecución del mismo, tenéis que realizar una "secuencia de Fibonacci" ¿a quién no le pasa esto en su vida cotidiana? Por favor, qué vida más monótona la vuestra. Pues qué haríais, ¿escribir el código de dicho cálculo cada vez que lo necesitéis? NOOOoooo, ¡por favor! Para ello lo más aconsejable sería crear una función que se llame perico-de-los-palotes y ésta sea llamada.

Algo así:

Function FibonacciNumber(ByVal N As Long)
    Dim I As Long, X0 As Variant, X1 As Variant
        X0 = 1: X1 = 1
        For I = 3 To N Step 2
            X0 = CDec(X0 + X1)
            X1 = CDec(X0 + X1)
        Next I
   FibonacciNumber = IIf(N Mod 2 = 1, X0, X1)
End Function

Sub test()
    MsgBox FibonacciNumber(100)
End Sub
En el ejemplo anterior, hemos creado (con la función extraída de aqui) una FUNCIÓN con el nombre FibonacciNumber, la cual recibe una variable de tipo Long, numérica, y la trata hasta que devuelve el resultado del cálculo de Fibonacci al final de la misma. Ésta es llamada desde el procedimiento [Sub] test mostrando su resultado en un "MsgBox" (ya iré explicando actividades y llamadas más adelante) . De esta forma, si tuviera que calcular valores de una columna o fila de excel, no tendríamos que ir reescribiendo el código de la función una vez tras otra, sino que tan sólo haríamos bucle con la llamada hacia la función Fibonacci. ¿Me seguís?  El que se pierda que levante la manita, ¿eh?

Ahora que ya sabéis qué es SUB y qué es Function, creemos la primera de las nuestras funciones y procedimientos.

Volvamos al Editor de Macro de Excel.

Ahora insertemos un nuevo módulo dentro de nuestro libro abierto de la siguiente manera:

Tras ello tendremos disponible dentro de nuestro libro activo un módulo, generalmente llamado "Module1" (os recuerdo que yo uso las herramientas en inglés... imagino que no traduce el nombre al castellano, siendo lo contrario, os pido disculpas y dinero, si os dejáis)

 Escribimos "Sub primera" y le damos a Intro (Enter, salto de carro...)

Automáticamente nos aparecerá lo siguiente

Sub primera()

End Sub

Viene a ser la definición standard de procedimiento, donde empezaremos a crear código, como por ejemplo "Hola mundo"

Sub primera()
   MsgBox "¡Hola mundo!"
End Sub


Ahora presionamos F5 y seleccionando nuestro procedimiento "primera", click sobre Run.

Nos saldra una ventana emergente que dirá ¡Hola mundo! y el botón OK.

martes, 16 de octubre de 2012

¿Y si hablamos de Macros (Excel)?

Nota: Esta entrada y todas las relacionadas con la temática expuesta hace las veces de diario o bloc de notas personal. Sólo las comparto por si a alguien le puede ser útil o tiene las misma experiencias. NO soy un experto en la materia, sólo experimento. Todas estas macros se ejcutan desde las versiones 2007 y 2010.

Quizás es uno de los temas más tratados (y mejor, claro está) por muchos foros expertos donde se exponen trucos, tutoriales y ejemplos de qué son y cómo funcionan las Macros de Excel.

Allá por el año 1993, en la versión 5 de Excel (ha llovido ya mucho desde entonces) y ha ido evolucionando desde aquel momento. De hecho, y una de las aspectos que más nos molesta a los asiduos a estas aplicaciones, es que Microsoft resta retrocompatibilidad de versiones entre sus actualizaciones. ¿Qué quiero decir con esto? Sencillo, a cada nueva versión de Excel nuestras macros "antiguas" pueden sufrir cambios que, en menor o mayor medida, nos pueden crear quebraderos de cabeza.

Por suerte disponemos del modo "Debug" para ver qué parte del código nos está molestando pero, antes de ir hablando de este tema, me gustaría explicar otros puntos antes.

¿Qué es una Macro de Excel y para qué sirve?

Claro, ¡qué tonto! no os había hablado de esto y si has llegado a esta entrada porque te has perdido imagino no tienes porqué saber qué es una macro.

En lenguaje coloquial, una Macro es una serie de instrucciones y/o acciones que nos ayuda, automatizan y secuencian una tarea. Esto, en Excel, puede significar que por ejemplo una serie de sumas y cambios que realices sobre una tabla a diario la puedas automatizar ejecutando una macro o sobre un botón. Resultan muy útiles y cómodas cuando deseas que en una sola acción se realicen todos los procesos que manualmente pueden tomar su tiempo.

Ejemplo práctico: Cada día has de hacer una serie de asientos bancarios, cuyo detalle se encuentra en tres hojas de Excel distintas y algún fichero de texto plano (.TXT) Pues bien, se hace pesado el tener que abrir estos ficheros, copiar los datos que contienen y recopilarlos sobre un mismo Libro de Excel (.XLSX). Además, tras este primer proceso, tienes que hacer una serie de operaciones manuales paras las cuales has de ir cambiando de hoja en hoja, contrastando cifras, hasta que llegas al resultado final.

¿Y si te dijera que ésto se puede automatizar?
SI, es posible gracias a la creación de las Macros las cuales son capaces de abrir ficheros externos, leer/editar/copiar/muchascosasmás sobre el contenido de éste y moverlo a donde quieras.

Para ello intentaré explicar poco a poco cómo funciona este entresijo de Macros.

¿Cómo crear una Macro de Excel?

Nota: Para mayor comodidad de la ejecución y creación de macros, debéis mostrar la pestaña (tab) Programador (Developer) que por defecto está oculta en Excel 2007 y 2010. Para mostrarla ir a Opciones >> Personalizar Cinta de Opciones >> "Check" sobre Programador [En inglés es Options >> Customize Ribbon >> Check sobre Developer ]

Existen varias vías de creación de Macro aunque las puedo englobar en dos: Manual y Automática  :p


Automática: se activa mediante la pulsación del botón "Grabar Macro" , que suele aparecer abajo de la ventana activa de Excel. Esta acción permite que todo aquello que estés haciendo de forma manual en el libro (entiéndase libro de Excel) se vaya registrando, más o menos paso a paso, dentro de un procedimiento (desde ahora lo llamare SUB) y plasmando qué acciones/actividades ejecuta en "background" el programa en si. Es bastante útil cuando no tienes muy claro cómo se nombran determinadas acciones (actividades, instrucciones...), pero no son tan potentes como algoritmos o subprocesos que podamos hacer de forma manual.

Manual (obvio...) : Podemos acceder al editor Visual Basic embebido en la aplicación Excel. Podemos acceder directamente pulsando ALT + F11. Tras ésto se nos abrirá el editor citado y ¡podemos comenzar a producir nuestras macros!

 La ventana de edición es todo un mundo de sub-ventanitas y barras de tareas...aunque la gran mayoría de cosas ni las llego a usar. Explicaré cuáles necesitaremos más adelante.

En la próxima entrada haré un pequeño ejemplo "Hands On" de cómo crear nuestra primera macro.

#close + thanks