May 16, 2013

Tenoya - Auditorio Las Palmas de Gran Canaria

Puente del barranco de Tenoya
Desde el puente de Tenoya, en la carretera que une el pueblo del mismo nombre y Arucas,  se baja a el cauce del barranco y caminamos por él durante 2 kilómetros hasta el primer cruce.

Antes deberemos pasar por debajo del nuevo puente de la circunvalación, a tan sólo unos metros del antiguo, y entre varias  fincas.

Hay que estar atentos al cruce, cuarta foto, un grupo de unas diez palmeras junto a una casa sin terminar es una buena referencia para quedarse con él. El comienzo es de tierra pero luego pasa a ser un bonito empedrado y termina siendo cemento. Este camino o calle, por lo que he podido saber, se llama o llamaba "Camino a Gáldar", supongo que antiguamente era la vía de comunicación que había hacia el norte.
Seguir leyendo...

La Solana - Cortadores - Tauro

De camino a Cortadores
De camino a Cortadores - Andén del Zurrado
Desde La Solana, entre Barranquillo de Andrés y Cercados de Espino, tras pasar unas fincas de naranjos y con un inicio del sendero poco visible, se comienza a subir hacia Cortadores. 

El principio es bastante suave y se entra y sale en algunos barranquillos hasta llegar al vallado de los terrenos anteriormente nombrados. Una dura rampa nos conduce hasta un falso llano muy bonito, el andén del Zurrado. El camino pasa justo pegado al risco, foto de la derecha, por una plataforma que parece creada explícitamente para pasar por ella.

En unos minutos se llegan a unas rampas cortas pero con fuerte desnivel, una vez superadas estaremos en los Llanos de Cortadores.
Si echamos la vista atrás tendremos buenas vistas de la Cumbre, el Roque Nublo, el muro de la presa de Soria y de todos los barrios que hay en el fondo del valle.

Seguir leyendo...

Are Weight Loss Supplements Safe?

Trying to lose weight can be a frustrating and confusing time. Despite all of the advice out there, many people still struggle to drop the pounds, and can often find themselves trying one diet after another, with little or no success.

When this happens, sometimes a weight loss supplement such as Garcinia Cambogia extract can be used to help you achieve your weight loss goals.

Garcinia Cambogia is one of the few safe weight loss supplements on the market, as the product uses all natural ingredients and is backed by many weight loss experts and celebrities.

Unfortunately, the same cannot be said about many other products out there. In order to keep yourself safe when buying, you should follow the tips below.

Look for customer reviews

If you are thinking about buying a particular weight loss supplement but are struggling to find any real customer reviews, then you should avoid making the purchase.

Instead, only buy products where there is overwhelming evidence that is works. For example, you can find many customer reviews from sites such as Amazon, where real users share their thoughts, opinions, and results.

Is it approved by the FDA?

Another way to gauge the safety of a particular weight loss supplement is to see if it’s been approved by the FDA.

When it has, then it means that the product has passed strict quality control tests, so you can be 100% positive that it is safe to use on a regular basis.

Price

Unfortunately, due to the high competition between sellers in the weight loss supplement industry, the prices have gradually been driven lower and lower.

While this may seem like a good thing for consumer, in actual fact, for the most part this is not the case.

You see, in order to to still make a profit when the prices get driven lower, many companies have started to use cheap ìfillerî ingredients which may cause harm to your body or give you nasty side effects.

For this reason, you should avoid really cheap weight loss supplements, and always check the label before buying so you can see what ingredients have been used.

Conclusion

As long as you spend a little bit of time researching before buying a weight loss supplement, then you should have no problems in finding a product that is safe to use.

Just remember, while weight loss supplements can have many positive effects, they are no substitute for following a healthy diet and getting plenty of exercise on a regular basis.

May 09, 2013

Barranco de la Manta

Barranco de la Manta
Barranco de la Manta
Bonito y divertido barranco en la carretera que va de Mogán a la Aldea de San Nicolás para practicar barranquismo. La subida comienza justo en la Fuente de los Azulejos donde acabamos la ruta realizada en Enero. 
Muchas pozas y un gran rappel final para terminar el barranco. La vuelta es por el mismo camino de subida.
Recomiendo ir con alguien que ya haya ido y tenga bastante experiencia ya que hay que conocer las características del recorrido así como las técnicas de descenso.

Al fondo de esta foto la bonita montaña de Lobas, varias citas pendientes por esa zona y una de ellas es esa preciosa montaña piramidal.

Gracias por las fotos y todo lo demás a David



Seguir leyendo...

May 06, 2013

Programas para senderismo

Con este post pretendo dar a conocer varias herramientas web y software útil para senderismo, tanto para pc como para dispositivos móviles. También tenerlo siempre a mano en un enlace que voy a crear para ir actualizándolo a medida que alguna persona aporte algún programa o experiencia nueva. Última actualización: 06/05/2013

Aplicaciones para móviles:
  • OruxMaps y GPS Status: es un programa gratuito para Android y es el que uso actualmente. Una de las cosas a destacar es que permite seguir y grabar la ruta al mismo tiempo. Tiene mapas online y offline, permite crear waypoint y hacer fotos de éstos, estadísticas, admite el formato GPX y KML. Enlace para descargar OruxMaps. GPS Status es un buen complemento para OruxMaps, también está en la Play Store.
  • Endomondo:  lo usé poco ya que el anterior móvil no tenía un GPS decente pero aún así grabé alguna ruta, sé de personas que lo usan y les va de maravilla. Permite grabar la ruta y compartir en la página de endomondo al finalizar la grabación. Está disponible para cualquier sistema operativo, Android, Symbian, Windows Phone, para dispositivos iPhone, BlackBerry y también es gratuito. Enlace para descargar Endomondo.
  • Sports Tracker: éste no lo he usado en primera persona pero me han hablado bien de él.  Está disponible para Android, Symbian y dispositivos iPhone. También es gratis. Enlace para descargar Sports Tracker .
  •   Zello: aunque no es una aplicación GPS es muy útil para los pateos. Se trata de una aplicación que hace de walkie talkie por así decirlo. Se necesita tarifa de datos para usarlo. Disponible para Android, iPhone, BlackBerry y también se puede instalar en el ordenador. Disponible en la Play Store también. Zello
Seguir leyendo...

April 24, 2013

Barranco del Draguillo

Barranco del Draguillo
Barranco del Draguillo
Este barranco está situado entre los municipios de Telde e Ingenio. El camino comienza en lo alto del barrio de Aguatona y baja hasta el mismo cauce, siguiente foto.
Giraremos a la izquierda siguiendo por el barranco. También se puede comenzar en la carretera vieja que une Telde e Ingenio o justo en la orilla de enfrente en otro sendero que también baja hasta el mismo sitio que el camino que tomamos nosotros.

A los pocos minutos veremos una cueva a mano derecha en el mismo fondo y un tajinaste con un mojón delante de él. Es muy importante tomar este desvío por la derecha del montículo de piedras. Si se continua por el cauce se llegará a un salto con paredes totalmente verticales y sin posibilidad de salvarlo, al menos caminando o garrapateando no.
Seguir leyendo...

April 19, 2013

aguvillalba

ImprovedCode es un nuevo plug-in para el editor de textos TinyMCE que permite mejorar la experiencia del usuario a la hora de editar el código fuente de su texto añadiendo funcionalidades como el indentado del código, remarcado con colores, mostar el número de línea, entre otras características.

March 29, 2013

De paseo por el NOA

Tras el viaje nocturno en coche cama desde Córdoba con El Rápido, mucho más cómodo que la experiencia para llegar a Córdoba, llegábamos a Tucumán con curiosidad por pasar unos días deambulando por el Noroeste argentino (NOA)

Lo primero que nos dice Pablo en el punto de información de la estación, tras intentar descifrar mi acento, es que le encanta (Pepe) Vélez. Pablo hace además recomendaciones para el recorrido de los próximos días, y nos gestiona un coche de alquiler para movernos en los escasos días disponibles. En mis intentos previos de reservar uno con anterioridad, me pedían abonar por adelantado ...


Nos ponemos en camino hacia la Cuesta del Indio en dirección a Tafí del Valle. A la salida de Tucuman sorprenden los lavacoches que desde el arcén buscan clientes. Pasamos por Famaillá, entendiendo a la vista de las plantaciones, que sea la capital de cítricos y caña de azúcar. A poco de comenzar la cuesta tras salir de Tucumán, aparecen señales de obras y de nuevo un control. Esta vez me pedirían toditos los papeles pero no una ayuda (parece  no ser entonces algo generalizado), y ciertamente el uniforme no parecía de policía.


Tras el bosque de la Cuesta del Indio, y las frecuentes paradas de algunos minutos por obras en las carreteras (a lo largo del recorrido esa seana serían constantes las reparaciones viales), llegamos al Valle, donde el paisaje se abre de repente. Con parada en El Mollar para ver los menhires de la zona reubicados, un tanto triste, y Tafí del Valle. Sin quererlo estamos  a 2000 metros de altura, los árboles han desaparecido, y nos cuentan historias de los jesuitas que hasta allá llegaron con un piano para facilitarse la entrada en contacto a través de la música con los nativos. Hoy guaguas de turistas que parecen nacionales, y que hacen la ruta de los museos de la zona parando en Tafí a reponer fuerzas.


Los rostros locales comienzan a exhibir un aspecto más andino. Desde Tafí subimos hasta el Infiernillo, el paso hacia los Valles Calchaquíes sobrepasados los 3000 metros de altura.  Ese día no tenía ni aspecto infernal, ni la temperatura que se puede esperar en invierno. Al otro lado, el descenso hacia los valles Calchaquíes. Los primeros cardones surgen al aproximarnos a los 2000 metros, poco antes de llegar a Amaicha del Valle. A su entrada exhibe orgullosa el eslógan "el mejor clima del mundo". Me resulta algo dudoso rondando los 2000 metros de altura... En esta localidad está el recomendable Museo Pachamama creado por el polifacético Héctor Cruz, y al parecer también polémico en la zona, quien cuenta con una sala con sus obras. En cierta medida lo que la visita me dijo de él, me hizo recordar a César Manrique.


Continuando camino hacia Cafayate, desde hace pocos años es posible visitar las  espectaculares ruinas de Quilmes. Ascender por ellas permite contemplar la amplitud del valle. Esa tarde además mostraba las prisas del sol por desaparecer en una tranquila tarde de invierno en el valle.

En Cafayate aseguran tener  los viñedos de mayor altura del planeta. Nos pilla la noche antes de llegar, pero por primera vez encontramos alojamiento a la primera en El hospedaje, y ni siquiera se ha hecho tarde. Acogedor y coqueto el lugar. Cafayate resultó encantador, y no menos la cena probando por primera vez la riquísima humita, y continuando con la docena de empanadas, acompañadas de torrontés (variedad de vid de la zona), y finalizando con el queso con dulce de cayote en la Casa de las Empanadas. Aún recuerdo la empanada Don Coro.

En Cafayate además de visitar mercadillos regionales, es posible realizar visitas a las bodegas, algunas en el centro de la localidad. Para continuar camino se puede optar por la Quebrada de las Conchas hacia  Salta, con numerosos puntos panorámicos, o seguir la ruta 40 hacia Cachí por la Quebrada de las Flechas.  Con las buenas sensaciones de Cafayate, optamos por tomar la ruta nacional 40, y dejar la Quebrada de las Conchas para una posible vuelta en el regreso hacia Tucumán.


El tramo hasta Cachí por la ruta 40 te hará conocer no solo el paisaje, sino también el polvo de las pistas argentinas durante decenas de kilómetros. Pequeños y distantes caseríos de minúsculas iglesias/ermitas sorprenden rompen de vez en cuando la monotonía del traqueteo sobre el polvoriento recorrido por el amplísimo valle. Es una pista, sí, pero de gran anchura y con indicación de cada kilómetro. Cuando por la noche abrimos el maletero, descubriríamos las bolsas cubiertas de polvo.

No hacía frío, pero las figuras que surgen cerca de las casas, deben conocer bien el sol de altura, y saben de sus cambios de temperatura, nadie iba en manga corta. Imagino que también caminar en manga corta cerca de la pista te empolvaría con velocidad. A Cachí llegamos añorando asfalto, y proseguimos. A los pocos kilómetros reaparece el asfalto, y nos dirigiríamos hacia Salta con la idea de poder llegar a dormir a Jujuy.

Antes de comenzar el descenso hacia Salta, se atraviesa el parque nacional Los Cardones. Una recta enorme con pasos para animales, y avisos de velocidad controlada por radar. La luz de la tarde ya anunciaba que quedaban pocas horas de cielo azul. Tras un leve ascenso que nos coloca de nuevo a 3000 metros arranca la Cuesta del Obispo que conecta con Salta, con trozos de nuevo de pista en los segmentos más pendientes. Tras terminar la parte más pendiente se nos une un campesino que hacía dedo, y nos acompañaría hasta Chicoana. Gracias a sus indicaciones pudimos atravesar Salta en dirección a Jujuy, porque sin GPS y la escasez de señalización en los accesos a las urbes por esta zona hubiera sido divertido. En general, cuando llega la noche hay que estar muy atento porque pueden aparecer animales en zonas poco transitadas y motoristas o bicicletas sin iluminación o reflectantes cerca de las localidades. Se la  juegan.


El nombre de Salvador de Jujuy me atraía desde la primera vez que lo leía sobre un mapa. Con esa ilusión pasamos Salta y tomamos la carretera que había visto como ruta más directa. Era ya de noche, y disfrutaba con la carretera solitaria, repleta de curvas, en los 50 kilómetros sólo encontraría dos coches, eso sí bastantes más vacas que pastaban a oscuras junto al asfalto. Luego descubriría que no es la vía más usada entre ambas ciudades, se hace un rodeo. Sin saber el día que era, nos la prometíamos felices, una carretera sin tráfico, encontrar alojamiento en Jujuy no debería ser problema, debe haber cuatro gatos por allí, ni siquiera es fin de semana.

Era 22 de agosto de 2012, y la tranquilidad de esos kilómetros no nos hacía presagiar lo que encontraríamos en Jujuy. Al entrar en la ciudad, de nuevo las indicaciones hacia el centro eran escasas. Al preguntar a un taxista me responde "quizás no se pueda acceder por el acto". ¿Acto? Ni idea, se veía gente como regresando con pancartas e incluso a caballo. Conforme nos acercábamos surgió el caos, aparecieron centenares de vehículos en un atasco espectacular, junto a caballos cabalgados por gauchos. Eran ya las 10 de la noche, necesitábamos buscar donde dormir, a duras penas conseguimos aparcar. El atasco impedía acercarse más hacia el centro, y nos encaminamos a pie desde unas diez cuadras. La operación de búsqueda de alojamiento estaba resultando infructuosa. Nos comentan que al día siguiente  se celebraba el bicentenario del éxodo jujeño. ¿Perdón? Al día siguiente tendría lugar un desfile cívico militar conmemorando el éxodo ante la llegada de las tropas realistas (españolas)  que intentaban sofocar el alzamiento independentista doscientos años atrás (tras la independencia luego durante decenas de años la historia argentina tendría conflictos bélicos internos) .

En resumen, el mejor día para llegar a Jujuy sin alojamiento reservado. Sobre la media noche  pudimos encontrar una reserva cancelada en el hotel Gregorio I, no era lo que buscábamos, pero era medianoche y lo único que habíamos podido encontrar. ¿Dónde había quedado Cafayate? Pese a lo chic del hotel y el precio, curiosamente por la mañana descubriríamos que el agua caliente parecía ser desconocida en el baño. En el desayuno, eso si bueno, veríamos a varios elegantes gauchos, que luego nos explicarían que uno de ellos era un alto representante de los gauchos argentinos. Nos movemos en unos círculos ...





Tras un breve paseo por la colapsada Jujuy, esa misma mañana emprendimos viaje lejos de las urbes, hacia la quebrada de Humahuaca. En nuestro camino hacia Humahuaca, disfrutaríamos de los paisajes no sólo del recorrido, sino del cerro de los siete colores de Purmamarca, su enorme mercado regional, la tranquilidad de Tilcara con su Pucará, probando las peimras empanadas jujeñas de llama. Finalmente llegábamos a Humahuaca, y tras dar preguntar en un par de casas, encontrábamos donde dormir. A excepción del refugio de Altavista del Teide supondría para mí el segundo lugar a 3000 metros de altura donde pasaría la noche. Antes tendríamos tiempo de saborear un estofado de lama acompañado de buen vino.
 

Al día siguiente recuperamos camino, ascendiendo desde Purmamarca hacia el gran salar. La carretera de ascenso resultó muy llamativa, con una degollada a poco más de 4000 metros, tras la que comienza el descenso hacia el salar. No hacía frío, y comenzaban a aparecer camélidos. Los que estaban antes del salar creo que eran guanacos. Tras la parada en el salar, nuestra intención era ir hacia San Antonio de los Cobres. De nuevo la ruta 40, en su formato de ripio para unas cuantas horas. Pese a lo largo del trayecto, el paisaje del altiplano impresionante, y más aún al encontrarse con una manada de llamas.



San Antonio resultó menos animado de lo esperado. hasta allí llega el costoso tren de las nubes. Eso sí, al menos pudimos avituallarnos con más empanadas de lama. Entre los rostros locales andinos, los nuestros destacaban tanto que en pocos minutos se nos aproximó una persona, que por su tez no era de la zona, a ofrecernos alojamiento. Nos quedaba una noche antes de regresar a Tucumán y optamos por intentar llegar a Cafayate, así que proseguimos hacia Salta.


La teoría es que la pista se había acabado pero durante el paisajístico descenso hacia Salta encontraríamos varias decenas de kilómetros no asfaltados, nos soprenderían de nuevo pequeñas iglesias que parecían maquetas o forradas de alumino. No llegábamos a Salta con luz suficiente para degustar la Quebrada de las Conchas, así que una vez en la ruta 68 buscamos donde dormir en Coronel Moldes, donde por suerte además encontramos un lugar para comer algo, eso sí, plato único era la oferta.


Para el día siguiente dejábamos un recorrido casi por completo conocido. Disfrutamos de las formas caprichosas de la Quebrada de las Conchas, de un nuevo paseo por Cafayate, con nueva parada en la Casa de las Empanadas. Ya por la tarde pararíamos esta vez en el Museo Pachamama, antes de emprender la subida hacia el Infiernillo. El tiempo había refrescado, en el valles estábamos según el coche a unos 12ºC con el cielo despejado, tras dejar los 3000 metros de altura del Infiernillo, vislumbré un mar de nubes en el valle, al acercarnos destacó la vegetación helada, en unos minutos la temperatura pasó a -6ºC. Por suerte era un frío seco, y fue subiendo conforme proseguíamos el descenso hacia Tucumán. 


Llegaríamos de noche y de nuevo las pasé canutas para orientarme hacia el centro con la escasa señalización bien iluminada. Como era norma, el alojamiento resultó no ser fácil, acabamos en un hotel, era sábado y la ciudad con ambiente. La cena en "Il postino", tiene buenas críticas, mucho ambiente pero no resultó nada especial. Al día siguiente cogeríamos camino hacia Misiones, nos esperaban 20 horas de trayecto en guagua, tiempo para descansar y reponer fuerzas.





March 25, 2013

Camaretas - Las Casillas - Cruz de los Llanos

Otra salida desde el albergue de Camaretas para realizar una de las variantes que vimos en la ruta anterior. Después de un kilómetro llegamos a una fuerte subida de cemento, foto de la derecha, que deberemos coger hasta el pequeño caserío de Las Casillas. 
Aquí hay varios cruces muy seguidos que debemos tener en cuenta, primero a la izquierda llegamos como a un patio de una casa y parece no haber salida, pero el camino sube por la derecha por unas escaleras y pasa entre un alpendre y una finca. Aquí otra vez a la izquierda y unos metros más adelante nuevamente a la derecha en subida y paralelo a otra finca.

En este tramo nos seguimos encontrando con la red de tuberías, ya nombradas en este post y el enlazado arriba, que canalizan el agua desde La Cumbre hasta Las Palmas de Gran Canaria. Sin duda este camino se creó y se conservó hasta nuestros días por el mantenimiento de todo este entramado de canalizaciones.
Seguir leyendo...

March 18, 2013

Ciudad del Campo - Teror


Charcas de San Lorenzo en el barranco de Mascuervo
Charcas de San Lorenzo - Foto Martín Falcón Padrón
Mi intención era describir una parte de uno de los Caminos del Pino. El camino que enlaza Las Palmas de Gran Canaria con Teror, denominado Camino de mar a la Cumbre, y muy usado en el pasado por los peregrinos y todo aquel que necesitaba desplazarse en uno u otro sentido por los diferentes barrios por los que pasaba.

Más información en la FEDAC pinchando aquí.
Había un enlace en la wikipedia muy completo que alguien ha decidido cambiar, una lástima.

Como bien dice la wikipedia, actualmente se usa a partir de San Lorenzo, no entiendo como dejaron que desapareciera este camino en el olvido. Aquí dejo el enlace que sube por El Román por un sendero muy amplio, que aunque lo he recorrido muchas veces, no fue así en esta ocasión.

Seguir leyendo...

#Monotremas: HabbitRPG, MyScriptFont y Lino

En mi afán de animar un poco el blog, voy a empezar una sección (etiqueta #Monotremas) con las utilidades, aplicaciones, páginas o servicios que más me han llamado la atención en Internet. No descarto poner algún día una chorrada, si me parece graciosa, pero seran raras excepciones. vamos con Los monotremas de la semana:

HabbitRPG

HabbitRPG te permite convertir tus metas y tus objetivos en un Juego de Rol. Si lo haces bien, ganas puntos de experiencia y monedas de plata y oro con las que puedes conseguir nuevas armas, escudos, armaduras y demás parafernalia. Si fallas, pierdes puntos de vida; si fallas miserablemente, pierdes todo lo ganado y tienes que empezar de nuevo. Quien sabe, quiza sea el extra de motivación que algunos necesitamos. Tiene una Campaña en Kickstarter para mejorar el producto.

MyScriptFont

MyScriptFont es una aplicación web que te permite obtener una fuente o tipografia a partir de tu propia letra manuscrita. Es muy sencillo de usar; te descargas desde la web una plantilla,la rellenas con tu letra, la escaneas y la subes. Tras unos pocos segundos, obtienes un fichero con la tipografía en formato TrueType. Lo que ya no resulta tan sencillo es que tengas una letra bonita que merezca el esfuerzo. Ojo con la orientación, tamaño y posición relativa de los caracteres. Mi primera versión ha sido un truño, si consigo algo mas presentable la publicaré aquí.

Lino

Lino es un servicio de publicación y compartición de notas, fotos, vídeos, enlaces, y lo que se ocurra, sobre una pizarra virtual. Es como el tablero de corcho de toda la vida, pero en la nube. Es sencillo de usar y puede ser una gran herramienta de trabajo colaborativo. Los tableros pueden ser privados, públicos pero sólo para lectura (cualquiera puede ver el tablero, pero no modificarlo), o totalmente públicos. El registro es gratuito, y solo necesitas un navegador moderno y/o un smartphone para usarlo. Puedes acceder a una demostración de lino -sin necesida de registrarte- desde su página web.

March 15, 2013

Ayacata - Camino de la Plata

Camino de la Plata
Camino de la Plata
Desde la iglesia de Ayacata sube el camino PR GC 60 que conduce hasta La Goleta. Muy bien señalizado, atravesando la carretera en varias ocasiones nos llevará hasta el aparcamiento del Roque Nublo.

Desde aquí giraremos a la izquierda e iremos por la carretera hasta el aparcamiento situado justo encima de la presa de los Hornos. Aquí abandonaremos el camino señalizado como pequeño recorrido. Enfrente sale un sendero prácticamente perdido y casi campo a través que nos llevará montaña arriba.

Existe una alternativa con el camino en mejor estado. Al llegar al Roque Nublo, girar a la derecha y subir por un camino que tiene una barandilla de madera, enlaza con el que nosotros hicimos.

Seguir leyendo...

March 14, 2013

Google Reader ha muerto, larga vida a Feedly

¿Te sientes dolido, casi traicionado por la anunciada muerte de Google Reader? Una rápida búsqueda en Google y parece que su próximo sucesor apunta maneras: Feedly. Como no hay mejor suerte que estar en el sitio preciso en el momento preciso (¿Verdad, Eddard Stark?), los de feedly parece que se venían oliendo que esto iba a pasar, y llevan trabajando en un reemplazo, el proyecto Normandía, una reimplementación compatible a nivel de API de los servidores de GoogleReader, y ejecutandose sobre Google App Engine, por añadir un poco de sal a la herida.

Feedly tienen aplicaciones nativas para teléfonos iOS, Android y Kindle, y plugins para Chrome y Firefox. Puedes usarlo simplemente registrándote con tu cuenta de Google, y el día fatídico en que se cierre el servicio de Google las aplicaciones empezarán a usar Normandy, con lo cual el usuario no debería notar ningún problema. Parece que han añadido más servidores para evitar el colapso ante la avalancha de usuarios que, presumiblemente, les caerá encima.

Por lo que he podido ver usa más o menos los mismos atajos de teclado (J/K para avanzar/retroceder, ? para la ayuda), y tiene diferentes formas de visualización, por defecto nos muestra una llamada magazine, bastante atractiva, pero tiene la posiblidad de cambiar a una vista más resumida, title, solo con los títulos de las entradas; esto es imprescindible para poder filtrar rápido cuando tienes, como yo, poco tiempo y muchos feeds. En esta página hay más consejos para sentirte cómodo en feedly si vienes de Google Reader (en Inglés).

March 13, 2013

Ischigualasto y Talampaya en un fin de semana

Ciertamente no recomiendo dedicar un solo fin de semana para visitar estos  parques argentinos, pero el ímpetu por aprovechar los días para recorrer varias zonas del norte argentino, me llevó a planificarlo así. 

Los parques de Ischigualasto (o Valle de la Luna) y Talampaya se encuentran a cierta distancia  de cualquier ciudad, las más cercanas son La Rioja y San Juan. En nuestro caso por la disponibilidad  de tiempo y la facilidad para conseguir un coche de alquiler, escogimos Córdoba, que está a algo más  de 400 kilómetros de cualquiera de los dos parques. Si se dispone de más tiempo es posible  organizarse con los servicios de omnibuses, pero requiere precisamente eso, más tiempo.

Era el primer fin de semana en Argentina, y con el recuerdo que tenía de las guaguas chilenas, la opción escogida fue llegar desde Madrid a Ezeiza (aeropuerto internacional de Buenos Aires), y viajar en un coche cama hasta alguna ciudad próxima a los parques. Como la llegada al aeropuerto era sobre las ocho de la tarde, por anticipado el destino con más opciones era Córdoba. Tras los múltiples consejos de no intentar llegar a Retiro a pie de noche por seguridad, usamos el servicio de bus de Manuel Tienda León. El precio es de aeropuerto, y el vehículo bastante añejo, pero por unos pesos más te dejan en la puerta de la terminal de Retiro.

No eran las 11 de la noche del jueves, y la primera sorpresa del viaje fue que sólo había plazas en un coche semicama a medianoche. Luego descubriríamos que comenzaba un fin de semana largo por la celebración del libertador San Martín. El mito de los coches cama que había conocido en Chile, esa noche desaparecieron. La única opción fue cutre, eran butacas viejas e incómodas con un aire acondicionado enfriando en exceso. No conseguir demasiado me permitiría contemplar el paisaje de La Pampa con sus infinitas plantaicones. Cuando se acercaba la hora de llegada, hubo una larga parada, que una hora después resultó ser una avería, de la que nos enteramos por otro pasajero. Curiosamente nadie se quejó (allá donde fueres haz lo que vieres). La compañía Plus Ultra - Mercobus (creo que el coche era de Mercobus) la recordaré por haber sido la peor experiencia durante esas semanas en Argentina.

Al final el retraso fue superior a dos horas, el cansancio, hambre y el incipiente resfriado marcaron la primera impresión de Córdoba. Al no tener claro si lograríamos conectar esa noche no teníamos reserva, unido a que resultó ser un fin de semana largo, no fue fácil ni encontrar alojamiento para por fin descansar, ni el coche para la mañana siguiente.

Tras descansar, el objetivo era llegar el sábado para el último turno en Ischigualasto, y reservar el domingo para Talampaya. Según la predicción de google los 400 y pico kilómetros se podían hacer a tiempo. La impresión era que sobraría tiempo, pero la realidad fue que  el trayecto desde Córdoba hasta Ischigualasto, presenta mucho tráfico, con innumerables cruces, semáforos y curiosas interrupciones. Sobre todo en la parte  inicial hasta prácticamente Cruz del Eje dado lo concurrido de la sierra cordobesa y alrededores. 

Al conductor novato en  Argentina, le sorprendían la cantidad de controles policiales que pueden surgir. Lo más sorprendente fue cuando en uno  de ellos, en la frontera con La Rioja, nos solicitaron colaboración (económica se entiende). Una vez alejados, el tráfico desaparece, es importante tener en cuenta que si llevas vehiculo, el número de localidades disminuye, y no hay que descuidar el depósito. Reposté en Chamical.  


Tras las peripecias, llegamos a Ischigualasto, también conocido como Valle de la Luna. Una curiosidad del parque, que no es atractiva, es que se requiere un vehículo para poder visitarlo, y es una pena pero no parece existir  otra posibilidad que recorrer la zona accesible en convoy con los guías. Según la información del parque  es también posible realizar un ascenso hasta un pico, pero desconozco si requiere ir acompañado de guía. Ambas  actividades tienen coste. Mi ilusión de llegar para el último turno es que podríamos disfrutar de los colores del parque con los últimos rayos de sol. Al ser el fin de semana, y festivo, el número de personas del convoy fue grande. Se realizan varias paradas, y en la última nos permitieron quedarnos sin prisas. La mayoría sin embargo se fue. Fue probablemente el mejor momento dentro del parque, con toda la tranuilidad para contemplar las luces y colores de la puesta de sol.


Desde Ischigualasto hasta Talampaya hay más de 100 kilómetros, y sólo una pequeña población entre ambos, Baldecitos, pese a que intentamos buscar referencias por si disponían de alojamiento, no lo conseguimos por  anticipado, y al pasar de noche por el caserío, no vimos nada que pareciera activo ni gente a quien preguntar.  Al día siguiente nos dirían que hay un albergue que está empezando y por eso no hay excesiva  publicidad. Hablaron maravillas del chivito. ¡Lástima!

En Talampaya tampoco hay alojamiento, está en medio de la nada. Se debe continuar hacia Villa Unión, o probar en los pequeños núcleos intermedios. Villa Unión cuenta además con gasolinera.  

Son unos 50 kilómetros más. En nuestro caso, lo divertido fue que coincidía con un fin de semana largo, y al llegar a Villa Unión, no había alojamiento de ningún tipo. Y todavía fue más preocupante cuando al intentar repostar en una gasolinera nos dicen que no tendrían hasta el lunes, y descubrir una cola en  la segunda. Afortunadamente la cola era exagerada, no estaban escasos. 


Preguntando nos comentan opciones de alojamiento 70 kilómetros aún más lejos. Distancias que para un canario resultan enormes. Así que optamos por darnos una buena cena, antes de deshacer los 50 kilómetros para dormir en el coche junto a la entrada del parque. Como la cena dejó recuerdo, merece la pena nombrar la parrilla "La Palmera", donde paramos por el nutrido ambiente que se observaba. Hambriento como estaba, primero senté las madres del largo dia con un plato de locro, antes de saborear mi primer bife de chorizo en Argentina. Decoración rústica, con un baño también muy curioso...

Imaginen un desierto, a unos 1000 metros de altura. Era Agosto, hubo suerte y frío no sufrimos, pero eso sí, como se pueden imaginar, el cielo estrellado  del desierto es espectacular, y el amanecer en esa soledad impactante. 
Obviamente por la mañana entramos los primeros en el parque. Y pronto descubrimos que este parque además ofrece posibilidades para el visitante. La entrada al parque da derecho al transporte a la entrada  del cañón, donde permiten realizar un pequeño paseo por la zona de los petroglifos. 


Pero cuidado, este transporte gratuito sólo se realiza a primera y última hora. De esta forma la gran mayoría de visitantes  se ven "invitados" a realizar la excursión en vehículo, que recuerda a la de Ischigualasto. Sin embargo , existe la posibilidad de realizar una ruta a pie con guía, eso sí las salidas se realizan temprano entre las 9 y las 10. Curiosamente sólo el 4% de los visitantes  la realizan. El coste es similar a la ruta en coche, pero yo lo recomiendo. Fueron unos 13km, que si ciertamente no cubren todas las paradas de  los visitantes motorizados, nos mostraron con mayor tranquilidad el ascenso por una quebrada anexa, para posteriormente descender al cañón de Talampaya, y disfrutar de toda su  inmensidad. 



Si vas con más tiempo, Talampaya cuenta con otras zonas para acceder algo más al sur, de las que otros caminantes me hablaron  muy bien ("¿Arco iris?").


La vuelta a Córdoba la hicimos a través de la cuesta Miranda, que fue mi primer contacto como conductor con una  de las pistas argentinas. Espectaculares vistas, pero alarga el trayecto. La llegada a Córdoba presentó de nuevo alguna dificultad para encontrar  alojamiento por la festividad, pero pudimos descansar antes de emprender camino hacia el NOA a la noche siguiente, no sin antes pasear por Córdoba con nuevos ojos y saborear una parrillada libre en la recomendación de un cordobés, "El patio" en 24 de septiembre.

Como escribir una calculadora en 70 líneas de Python, mediante un analizador descendente recursivo

Este post es una traducción del artículo original de Erez, publicado en su blog Stories For Sad Robots. El original puede consultarse aquí:

http://blog.erezsh.com/how-to-write-a-calculator-in-70-python-lines-by-writing-a-recursive-descent-parser/

Hay referencias a un artículo anterior, si alguien está interesado un que lo traduzca también que me deje un comentario y se hará lo que se pueda.

Empieza la traducción

Hace tres meses, escribí un post detallando el proceso de implementar una calculadora usando una librería de parsing. La respuesta popular, sin embargo, mostró que la mayoría de los lectores estaban más interesados en ver una calculadora implementada desde cero, usando solo las "pilas incluidas". Y me dije ¿Por qué no?

Implementar una calculadora es fácil, si usas algunos trucos específicos de las expresiones aritméticas, pero usar estos trucos siempre produce lo mismo: La solución pierde elegancia, no se puede extender y se hace difícil de comprender intuitivamente. Como parecía un desafío interesante, y puede conducir a un post útil, he decidido escribirlo usando un analizador descendente recursivo (recursive descent parser en wikipedia) genérico. Con la mismo filosofía de la vez anterior, quiero mantener el menor número de líneas que sea razonable, así que el código estará lleno de trucos y hacks, pero estarán a un nivel superficial y no serán específicos de la tarea que tenemos entre manos.

Este artículo es una explicación detallada, paso a paso, de la implementación. Si quieres pasar directamente al código e intentar entenderlo por tu cuenta, solo tienes que ir a la última parte. Con suerte una vez leído y entendido el artículo tendrás una mejor comprensión del funcionamiento interno de un analizador sintáctico. Luego puedes incluso utilizar una librería de análisis sintáctico de verdad y ahorrarte todos estos enojosos detalles.

Para entender este artículo, hace falta tener un conocimiento más o menos completo de Python, y es recomendable tener al menos una idea de lo que son los analizadores sintácticos o parsers y para que sirven. Si no estás seguro, te recomiendo que leas el artículo anterior How To Write A Calculator in 50 Python Lines (Without Eval), en el que se explica la gramática que usaremos aquí.

Paso 1: Tokenizar (Tokenize)

Para poder evaluar una expresión, el primer paso será convertirla en una lista de símbolos individuales, o tokens. Esta es la parte más fácil, y no es el tema central de interés en este artículo, así que haremos un poco de trampa para facilitar las cosas.

En primer lugar, definiremos los tokens (Se observará que falta la definición de números, eso es porque vamos a considerarlos el valor por defecto):

token_map = {'+':'ADD', '-':'ADD',
             '*':'MUL', '/':'MUL',
             '(':'LPAR', ')':'RPAR'}
Token = namedtuple('Token', ['name', 'value'])

Y este es el código que usaremos para tokenizar una expresión dada, expr:

split_expr = re.findall('[\d.]+|[%s]' % ''.join(token_map), expr)
tokens = [Token(token_map.get(x, 'NUM'), x) for x in split_expr]

La primera línea es un truco que divide la expresión en sus componentes básicos, de forma que:

'1.2 / ( 11+3)' --> ['1.2', '/', '(', '11', '+', '3', ')']

La siguiente línea asigna nombres a los tokens, para que el parser pueda reconocerlos por categoría:

['1.2', '/', '(', '11', '+', '3', ')']
-->
[Token(name='NUM', value='1.2'), Token(name='MUL', value='/'),
Token(name='LPAR', value='('), Token(name='NUM', value='11'),
Token(name='ADD', value='+'), Token(name='NUM', value='3'),
Token(name='RPAR', value=')')]

Se asume que cualquier token que no esté en el diccionario token_map corresponderá a un número. Nuestro tokenizador carece de la virtud de la validación, que evitaría que se aceptaran cosas que no fueran números, pero por suerte el evaluador realizará más tarde esta tarea por nosotros.

Ahora que ya tenemos una lista de tokens, nuestro siguiente paso será parsearlo para obtener un AST.

Paso 2: Definir la gramática

El parser que usaremos en esta implementación es un versión un tanto ingenua de parser recursivo descendente (recursive descent parser), que es una versión simplificada del parser LL (LL parser). Este tipo de parser es el más fácil de implementar, y de hecho solo nos ocupará unas 14 líneas de código. Es un tipo de parser descendente, lo que significa que primero intenta emparejar la regla más alta (como expression), y continua de forma recursiva intentado emparejar subreglas hasta que alcanza las reglas de más bajo nivel (como por ejemplo, number). Para expresarlo de otra manera, mientras que un parser ascendente (Como un LR Parser o Analizador sintáctico LR en español) intenta de forma gradual "plegar" o "comprimir" tokens y reglas dentro de otras reglas, hasta que solo quede una, un parser descendente irá expandiendo las reglas, usando cada vez reglas menos abstractas, hasta el punto en que haya emparejado completamente los tokens de entrada.

Pero antes de entrar en materia con el parser, hablemos un poco de la gramática. En el post anterior usamos un parser LR, y se definió la gramática así (las mayúsculas son tokens):

add: add ADD mul | mul;
mul: mul MUL atom | atom;
atom: NUM | '(' add ')' | neg;
neg: '-' atom;

Note

Si no entiendes esta gramática, deberías leer el artículo anterior: How To Write A Calculator in 50 Python Lines (Without Eval).

esta vez usaremos un parser LL, así que definiremos la gramática de esta otra forma:

rule_map = {
    'add' : ['mul ADD add', 'mul'],
    'mul' : ['atom MUL mul', 'atom'],
    'atom': ['NUM', 'LPAR add RPAR', 'neg'],
    'neg' : ['ADD atom'],
}

Hay un cambio sutil: Las definiciones recursivas de add y mul están invertidas. Este detalle es muy importante, y necesita su aclaración.

La versión LR de esta gramática usa lo que se llama recursividad por la izquierda (left recursion en inglés). Cuando un parser LL se encuentra con una llamada recursiva, la ejecuta de inmediato, en un intento de emparejar la regla que está utilizando, por lo que puede entrar en un bucle infinito. Incluso parsers LL bastante avanzados como ANTLR se enfrentan a esta problema, aunque probablemente, en vez de dar vueltas indefinidamente, como hace nuestro parser de juguete, terminarán con un conveniente mensaje de error .

La recursividad por la izquierda se soluciona de forma sencilla cambiándola por recursividad por la derecha, que es justo lo que acabamos de hacer con nuestro sutil cambio. Pero como nada en la vida es fácil cuando tratamos con parsers, se ha creado otro problema: Mientras que la recursividad por la izquierda analiza 3-2-1 correctamente como (3-2)-1, la recursividad por la derecha lo analiza, de forma incorrecta, como 3-(2-1). No sé como solucionar esto de forma fácil, así que para mantener las cosas sencillas he optado por mantener la forma incorrecta y resolverlo en una etapa posterior (véase el paso 4).

Paso 3: Obtener un AST (Árbol de Sintaxis Abstracta)

El algoritmo es sencillo. Vamos a definir una función recursiva que acepta dos parámetros: El primero es el nombre de la regla que estamos intentando capturar, y el segundo es una lista de los tokens que nos quedan por comprobar. Empezaremos con add, -que es la regla más alta- y con la lista de todos los tokens, y haremos que las sucesivas llamadas recursivas sean cada vez más específicas. La función retorna una tupla: La correspondencia encontrada y una lista de los tokens que faltan por comprobar. Con el propósitos de reducir en lo posible el código, este será capaz de encontrar tokens también (En los dos casos son cadenas de texto: en un caso con todas las letras en mayúsculas y en el otro con todas las letras en minúsculas).

Este es el código del parser:

RuleMatch = namedtuple('RuleMatch', ['name', 'matched'])

def match(rule_name, tokens):
    if tokens and rule_name == tokens[0].name:      # Match a token?
        return RuleMatch(tokens[0], tokens[1:])
    for expansion in rule_map.get(rule_name, ()):   # Match a rule?
        remaining_tokens = tokens
        matched_subrules = []
        for subrule in expansion.split():
            matched, remaining_tokens = match(subrule, remaining_tokens)
            if not matched:
                break   # no such luck. next expansion!
            matched_subrules.append(matched)
        else:
            return RuleMatch(rule_name, matched_subrules), remaining_tokens
    return None, None   # match not found

Las líneas 4-5 comprueban si rule_name es realmente un token, y si coincide con el token actual. Si lo hace, devuelve la coincidencia, junto con el resto de los tokens que aun faltan por consumir.

La línea 6 itera sobre las subreglas de rule_name, de forma que cada una pueda ser analizada recursivamente. Si rule_name es un token, la llamada a get() devolverá una tupla vacía y el código continuará hasta alcanzar el return final, que devuelve una tupla sin valores.

Las líneas 9-14 iteran sobre cada elemento de la subregla actual, e intenta hacerlas coincidir de forma secuencial. Cada iteración intenta consumir tantos tokens como le sea posible. Si un elemento no coincide, se descarta toda la regla. Si, por el contrario, se consigue casar todos los elementos, alcanzaremos la cláusula else y devolveremos nuestra coincidencia para rule_name, junto con el resto de tokens que faltan por casar.

Vamos a ejecutarlo con 1.2 / ( 11+3) como entrada:

>>> tokens = [Token(name='NUM', value='1.2'), Token(name='MUL', value='/'),
              Token(name='LPAR', value='('), Token (name='NUM', value='11'),
              Token(name='ADD', value='+'), Token(name='NUM', value='3'),
              Token(name='RPAR', value=')')]
>>> match('add', tokens)
(RuleMatch(name='add', matched=[RuleMatch(name='mul',
matched=[RuleMatch(name='atom', matched=[Token(name='NUM', value='1.2')]),
Token(name='MUL', value='/'), RuleMatch(name='mul',
matched=[RuleMatch(name='atom', matched=[Token(name='LPAR',
value='('), RuleMatch(name='add', matched=[RuleMatch(name='mul',
matched=[RuleMatch(name='atom', matched=[Token(name='NUM', value='11')])]),
Token(name='ADD', value='+'), RuleMatch(name='add',
matched=[RuleMatch(name='mul', matched=[RuleMatch(name='atom',
matched=[Token(name='NUM', value='3')])])])]), Token(name='RPAR',
value=')')])])])]), [])

El resultado es una tupla, como era de esperar, y podemos ver que no queda ningún token para analizar. La coincidencia actual no es fácil de leer, vamos a representarla gráficamente para que se entienda mejor:

add
    mul
        atom
            NUM '1.2'
        MUL '/'
        mul
            atom
                LPAR    '('
                add
                    mul
                        atom
                            NUM '11'
                    ADD '+'
                    add
                        mul
                            atom
                                NUM '3'
                RPAR    ')'

Esta es la pinta que presenta un AST, en concepto. Es una buena práctica ejecutar mentalmente el parser, o quizá con la ayuda de papel. Me atrevería a decir que es necesario si realmente quieres entenderlo. Puedes usar este AST como referencia para asegurarte de que lo estás haciendo bien.

En este punto, henos escrito un parser capaz de analizar correctamente operaciones binarias, operadores unitarios, paréntesis y precedencia,

Solo hay una cosa que hace mal, y vamos a arreglarla a continuación.

Paso 4: Post Procesado

El parser no es perfecto en muchos aspectos. El más importante ahora es que no puede manejar la recursividad por la izquierda, lo que obliga a que la gramática sea recursiva derecha. En consecuencia, analizar la cadena 8/4/2 nos genera el siguiente AST:

add
    mul
        atom
            NUM 8
        MUL '/'
        mul
            atom
                NUM 4
            MUL '/'
            mul
                atom
                    NUM 2

Si intentamos resolver esta expresión con este árbol, tendríamos que calcular primero 4/2, que es incorrecto. Algunos parsers LL eligen arreglar la asociatividad en el árbol. Pero esto llevaría demasiadas líneas ;). En vez de eso, lo que vamos a hacer en "aplanarlo". El método es sencillo: Para cada regla en el AST que:

  1. necesite ser arreglada,
  2. sea una operación binaria (tiene tres subreglas), y
  3. el operando por la derecha resulta ser la misma regla

entonces "aplanaremos" la última en la primera. Por "aplanar" quiero decir reemplazar un nodo por sus hijos, en el contexto de su padre. Como nuestro recorrido por el árbol es DFS post-order, esto significa que empieza por los bordes del árbol y va progresando hacia la raíz, de forma que los efectos son acumulativos. Este es el código:

fix_assoc_rules = 'add', 'mul'

def _recurse_tree(tree, func):
    return map(func, tree.matched) if tree.name in rule_map else tree[1]

def flatten_right_associativity(tree):
    new = _recurse_tree(tree, flatten_right_associativity)
    if tree.name in fix_assoc_rules
        and len(new)==3
        and new[2].name==tree.name:
            new[-1:] = new[-1].matched
    return RuleMatch(tree.name, new)

Este código convertirá cualquier composición secuencial de sumas o multiplicaciones en una lista plana (sin mezclar unas con otras). Los paréntesis rompen la secuencia, por supuesta, así que no se ven afectados.

A partir de aquí se podría reconstruir la estructura en forma asociativa por la izquierda, usando código como:

def build_left_associativity(tree):
    new_nodes = _recurse_tree(tree, build_left_associativity)
    if tree.name in fix_assoc_rules:
        while len(new_nodes)>3:
            new_nodes[:3] = [RuleMatch(tree.name, new_nodes[:3])]
    return RuleMatch(tree.name, new_nodes)

Pero no lo vamos a hacer. Queremos reducir el número de líneas de código, y cambiar el código de evaluación para que pueda manejar listas conlleva menos líneas que reconstruir el árbol.

Nota

DFS post order: DFS significa "búsqueda en profundidad", y significa que a medida que recorremos el árbol, se visitan primero los nodos que están en los niveles inferiores (O, dicho de otra manera, los más profundos). Hay dos tipos de búsquedas en profundidad, en preorden o postorden. La diferencia entra las dos es el momento en que se añade un nodo a la salida, antes o después de visitarlo)

Paso 5: Evaluar

Evaluar el árbol es muy sencillo. Lo único que hace falta es navegar por él de forma similar a como lo hicimos en el código de post-proceso (Es decir, DFS post-order) y evaluar cada regla que nos encontramos. Como hemos evaluado primero los nodos más profundos, cada vez que alcanzamos un nodo de tipo regla, sus hijos no pueden ser otra cosa más que números. Este es el código:

bin_calc_map = {'*':mul, '/':div, '+':add, '-':sub}

def calc_binary(x):
    while len(x) > 1:
        x[:3] = [ bin_calc_map[x[1]](x[0], x[2]) ]
    return x[0]

calc_map = {
    'NUM' : float,
    'atom': lambda x: x[len(x)!=1],
    'neg' : lambda (op,num): (num,-num)[op=='-'],
    'mul' : calc_binary,
    'add' : calc_binary,
}

def evaluate(tree):
    solutions = _recurse_tree(tree, evaluate)
    return calc_map.get(tree.name, lambda x:x)(solutions)

Hemos escrito calc_binary para que evalúe tanto la suma como la multiplicación (y sus contrapartidas). También evalúa listas, dado el caso, de manera asociativa por la izquierda. De esa forma resolvemos el problema que teníamos con nuestra pequeña gramática LL.

Paso 6: El REPL (Read–Eval–Print Loop)

La forma más sencilla posible sería:

if __name__ == '__main__':
    while True:
        print( calc(raw_input('> ')) )

Que no precisa más explicación. Espero :)

Apéndice: Todo el código en uno: una calculadora en 70 líneas

Este es el código final:

'''A Calculator Implemented With A Top-Down, Recursive-Descent Parser'''
# Author: Erez Shinan, Dec 2012

import re, collections
from operator import add,sub,mul,div

Token = collections.namedtuple('Token', ['name', 'value'])
RuleMatch = collections.namedtuple('RuleMatch', ['name', 'matched'])

token_map = {'+':'ADD', '-':'ADD', '*':'MUL', '/':'MUL', '(':'LPAR', ')':'RPAR'}
rule_map = {
    'add' : ['mul ADD add', 'mul'],
    'mul' : ['atom MUL mul', 'atom'],
    'atom': ['NUM', 'LPAR add RPAR', 'neg'],
    'neg' : ['ADD atom'],
}
fix_assoc_rules = 'add', 'mul'

bin_calc_map = {'*':mul, '/':div, '+':add, '-':sub}
def calc_binary(x):
    while len(x) > 1:
        x[:3] = [ bin_calc_map[x[1]](x[0], x[2]) ]
    return x[0]

calc_map = {
    'NUM' : float,
    'atom': lambda x: x[len(x)!=1],
    'neg' : lambda (op,num): (num,-num)[op=='-'],
    'mul' : calc_binary,
    'add' : calc_binary,
}

def match(rule_name, tokens):
    if tokens and rule_name == tokens[0].name:      # Match a token?
        return tokens[0], tokens[1:]
    for expansion in rule_map.get(rule_name, ()):   # Match a rule?
        remaining_tokens = tokens
        matched_subrules = []
        for subrule in expansion.split():
            matched, remaining_tokens = match(subrule, remaining_tokens)
            if not matched:
                break   # no such luck. next expansion!
            matched_subrules.append(matched)
        else:
            return RuleMatch(rule_name, matched_subrules), remaining_tokens
    return None, None   # match not found

def _recurse_tree(tree, func):
    return map(func, tree.matched) if tree.name in rule_map else tree[1]

def flatten_right_associativity(tree):
    new = _recurse_tree(tree, flatten_right_associativity)
    if tree.name in fix_assoc_rules and len(new)==3 and new[2].name==tree.name:
        new[-1:] = new[-1].matched
    return RuleMatch(tree.name, new)

def evaluate(tree):
    solutions = _recurse_tree(tree, evaluate)
    return calc_map.get(tree.name, lambda x:x)(solutions)

def calc(expr):
    split_expr = re.findall('[\d.]+|[%s]' % ''.join(token_map), expr)
    tokens = [Token(token_map.get(x, 'NUM'), x) for x in split_expr]
    tree = match('add'<div></div>, tokens)[0]
    tree = flatten_right_associativity( tree )
    return evaluate(tree)

if __name__ == '__main__':
    while True:
        print( calc(raw_input('> ')) )
Termina la traducción

Hasta aquí el artículo original. Si quieres que traduzca el artículo anterior al que se hace referencia en el texto, déjame una nota en los comentarios.

Pygments: Embellece tu código fuente

Pygments es una librería, plugin y utilidad, todo en uno, que nos permite embellecer nuestro código, añadiendo resaltado de palabras claves y colores que facilitan la lectura del mismo. Es especialmente útil para foros, wikis, blogs o cualquier sistema de enseñanza on-line que necesiten mostrar código fuente. por ejemplo, lo usa mi repositorio de código favorito, bitbucket.

Pygments está escrito en Python, pero entiende muchos tipos de lenguaje, incluyendo los lenguajes de programación más populares como Python, Ruby, JavaScript, C, C++, C#, Java, Lua, Perl, lenguajes clásicos como Pascal, Common Lisp o Fortran, lenguajes nuevos como CoffeeScript o Clojure, lenguajes de plantillas como los de Django, Jinja, ERB (Ruby templating), Mako o Myghty y mil cosas más: ficheros de configuración de Apache, hojas de estilo CSS, SQL, etc... Esta variedad viene dada por lo sencillo que resulta escribir nuevos analizadores léxicos; la mayoría de los lenguajes solo necesitan definir algunas expresiones regulares.

Puede usarse como herramienta de línea de comandos: pygmentize, como librería para uso interno o como plugin o añadido para sistemas ya existentes: Wordpress, MoinMoin y REsT entre otros. Es muy fácil tanto de utilizar como de extender; puedes personalizar la hoja de estilos para reflejar tus gustos estéticos (Pero recuerda, marrón y azul rara vez combinan). La salida más común es Html, pero también podemos obtener la salida en RTF, LaTex o códigos ANSI para la consola.

Para integrarlo con Blogger usé la línea de comandos para obtener los estilos CSS correspondientes (pygmentize -f html -S colorful) y los incluí en mi plantilla.

Como creo fervientemente en las virtudes didácticas de los ejemplos, he aquí un cacho de código Python (¡Mi primer código publicado en Python 3!) antes de Pygments:

granos = 1
for escaque in range(1, 65):
    print ("En el escaque #{0} hay #{1} granos".format(escaque, granos))
    granos *= 2

Y después:

granos = 1
for escaque in range(1, 65):
    print ("En el escaque #{0} hay #{1} granos".format(escaque, granos))
    granos *= 2

Veamos otro ejemplo, esta vez con Ruby. Antes:

granos = 1
64.times do |escaque|
    puts "En el escaque #{escaque+1} hay #{granos} granos"
    granos *= 2
    end

Y después:

granos = 1
64.times do |escaque|
    puts "En el escaque #{escaque+1} hay #{granos} granos"
    granos *= 2
    end

 

March 09, 2013

aguvillalba

Programando en JavaScript, seguramente todos alguna vez nos hemos encontrado en la situación de tener que ejecutar un bloque de código u otro dependiendo de si una variable es "null" o "undefined". Hoy vamos a analizar la diferencia que existe en JavaScript entre "null" y "undefined", dado que hemos de ser muy cuidadosos a la hora de compararlos.

March 04, 2013

Camaretas - Cruz del Saucillo

Roque Saucillo y de la Retamilla
Como continuación de la anterior salida decidimos hacer la ruta Camaretas, Hoya del Gamonal hasta la Cruz del Saucillo ida y vuelta.

Cerca del desvío de la presa de la Lechucilla está el albergue de Camaretas, tomamos la pista de tierra que sube junto a éste y caminamos durante un kilómetro hasta la Hoya del Gamonal. En este punto, junto a otra casa del agua de la misma red que la de la Lechuza, nos encontramos con un primer desvío hacia Los Llanos de la Pez, lo obviamos y seguimos a la izquierda.

El camino está muy bien señalizado con postes del cabildo con inscripciones PR GC 10 San Mateo - Siete Fuentes, de hecho creo que a veces están muy juntos.

Seguir leyendo...

Operaciones matemáticas con css

Es es sueño de un programador cuando trabaja haciendo maquetación css. Poder hacer calculos en nuestro archivo css como si de php se tratara.
Y lo mejor, es que se puede hacer y nos permite trabajar en distintas medidas (px, em, %) y funciona incluso con IE 9.

Se usa de forma sencilla, con cualquier propiedad css que admita medida, del tipo que sean (tamaño, tiempo..) y aunque actualmente es mejor usarla con el prefijo del navegador -webkit, -moz, etc está bastante bien adoptado por los navegadores de escritorio, aunque siempre hay navegadors moviles que dificultan.

Se utiliza de la siguiente forma:

/* De forma estándar */
width: calc(#valores#);
/* con prefijo para navegadores */
width: -webkit-calc(#valores#);
width: -moz-calc(#valores#);

Podremos aplicar cálculos como el siguiente:

width: calc(100% - 30px);

Y realizar las cuatro operaciones matemáticas básicas:

width: calc(50px * 2);
width: calc(50px / 2);
width: calc(50px + 2px);
width: calc(50px - 2px);

Con esta nueva función, evitamos utilizar javascript en muchos casos donde sólo tratamos de maquetar nuestra web.

Más información | W3C Calc

13 puntos para optimizar nuestro código javascript

Estas pautas son para optimizar javascript en el motor de V8 de chrome, actualmente el más rápido de los interpretes javascript.

  • Inicializar todos los miembros de un objeto en la función constructor
  • Inicializar siempre los miembros de un objeto en el mismo orden
  • Utilizar preferiblemente valores numéricos que puedan ser representados por enteros con signo
  • En los arrays utilizar keys contiguas y empezando por 0
  • No reservar todo el espacio de golpe para los arrays muy grandes (+ de 64.000 elementos)
  • No eliminar elementos de un array, especialmente si se trata de un array numérico
  • No cargar elementos no inicializados o eliminados
  • Inicializar los arrays pequeños de tamaño prefijado con literales
  • Prereservar arrays pequeños para corregir su tamaño antes de usarlos
  • No almacenar valores no numéricos en arrays numéricos
  • Monomorfismo antes que polimorfismo siempre que se pueda
  • No usar try y catch
  • Evitar cambios en funciones después de que estén optimizadas

Visto | Jonefox.com

Django 1.5


No, no hablo de la nueva versión de la oscarizada pelicula de Quentin Tarantino. Django 1.5 es el último lanzamiento del mejor framework para Python que podemos encontrar en la Red.

Viene con muchas novedades, entra las que destacaría las siguientes:

  • Modelo de usuario configurable
  • Soporte para salvar un subconjunto de los campos de un modelo (una gozada!)
  • Cacheo de instancias relacionadas de un modelo
  • Soporte para streaming
  • Una nueva etiqueta de bloque llamada verbatim
  • Soporte para Python 3 (El soporte para Python 3 todavía se considera experimental, pero hay disponible una guía para portar nuestro código a Python 3 circulando)

Además corrección de errores y bugs conocidos, y un puñado de mejoras más.

Enlaces | Django 1.5

March 01, 2013

Edición especial Python de Full Circle Magazine

La revista Full Circle Magazine ha sacado un especial agrupando la serie de artículos sobre programación en Python. Se puede descargar libremente desde aquí:

 

 

Es la edición número 6, así que supongo que en algún lado estarán las ediciones anteriores, si las encuentro las pondré también. Dicho y hecho:

Ediciones anteriores

February 28, 2013

Resumen de los Premios de la Academia

&&

1099457_ciak (1)Durante los primeros meses del año, los amantes del cine tienen que mantener la calma. Sobretodo este año, ya que la temporada 2012 terminó con una buena selección de películas, y el comienzo del 2013 ha sido bastante tranquilo. Esto hace que muchos de nosotros busquemos otras formas de entretenimiento para estos meses, como pueden ser los juegos de azar online en Binguez, leer algunos libros nuevos, etc. Sin embargo, para los verdaderos cinéfilos, hubo una última forma de disfrutar de las películas de 2012: Los Premios de la Academia, que tuvieron logar el 24 de febrero. Cada año estos premios celebran lo mejor de Hollywood, y este año parecía que hubieran nominaciones particularmente interesantes. Aquí os dejo un breve resumen de los mejores premios de la noche.

Mejor Guión Adaptado
Chris Terrio se llevó a casa este premio por su trabajo escribiendo el guión de Argo, que fue una de las películas más aclamadas del año. El otro favorito para este premio fue Lincoln, un guión adaptado de la novela “Team Of Rivals”.

Mejor Guión Original
Este premio fue para Quentin Tarantino por su película Django desencadenado, un controvertido pero incuestionable guión magistral. Otras nominaciones son los guiones de Amor, El Vuelo, Moonrise Kingdom, y La noche más oscura.

Mejor Actriz de Reparto
Desde hace mucho considerada la favorita en esta categoría,  Anne Hathaway se llevó a casa el Oscar por su trabajo como Fantine en Los Miserables. A pesar del relativamente corto papel de Fantine, el “I Dreamed A Dream” de Hathaway se convirtió en el icono del este film musical.

Mejor Actor de Reparto
Esta era una categoría muy reñida que incluía a actores veteranos como Tommy Lee Jones (Lincoln), Robert de Niro (El lado bueno de las cosas) y Philip Seymour Hoffman (The Master) entre otros, pero al final fue Christoph Waltz uien se llevó a a casa el Oscar por su papel en Django desencadenado.

Mejor Actriz
Pese al impresionante grupo de nominadas, fue la joven Jennifer Lawrence quien ganó este gran honor para las actrices por su papel en El lado bueno de las cosas, y continúa su meteórico ascenso en Hollywood.

Mejor Actor
Había un increíble grupo de actores nominados a este premio, pero Daniel Day-Lewis estaba sobre el resto por su papel como Presidente Lincoln en Lincoln. Day-Lewis se convirtió en el primer actor en ganar el premio 3 veces en su carrera.

Mejor Director
En la quizás mayor sorpresa de la noche, Ang Lee ganó el Oscar al Mejor Director por su trabajo en La Vida de Pi. El favorito era Steven Spielberg (Lincoln), aunque con pesos pesados como Kathryn Bigelow (La noche más oscura) y Ben Affleck (Argo) que no recibieron nominaciones, esta categoría entera fue sorprendente.

Mejor Película
Finalmente, fue Argo quien se llevo el máximo galardón de la noche. Lincoln era quizás la favorita, y hubieron rumores acerca de El lado bueno de las cosas, pero fue el maravilloso film de Ben Affleck inspirado en la historia real de una misión de rescate durante la Crisis de Rehenes en Irán la que consiguió el Oscar.

February 26, 2013

GALLETAS DE MAÍZ

&&

x-defaultMuchos de vosotros ya conocéis mis “famosas” galletas de mantequilla. Pues aquí os dejo una variación a base de harina de maíz. Os garantizo que quedan bueníiiiiiisimas. :P

INGREDIENTES:

  • 150 gr de azúcar
  • 100 gr de harina de trigo
  • 100 gr de harina de maíz
  • 2 huevos
  • 1 sobre de levadura
  • Una pizca de sal

PREPARACIÓN:

  1. Mezclamos todos los ingredientes en un bol y amasamos bien con ayuda de una cuchara hasta que la masa se vuelva elástica y se empiece a romper. Si es necesario, añadir más harina.
  2. Dejamos reposar la masa cubierta con un trapo durante una hora.
  3. Después precalentamos el horno a 190ºC, hacemos pequeñas bolitas y horneamos hasta que empiecen a estar doradas.
  4. Si es necesario, podemos poner un poco el grill.

NOTA PARA CELÍACOS: Los celíacos pueden hacer las galletas utilizando harina sin gluten en lugar de la harina de trigo, o utilizando sólo harina de maíz. La levadura puede contener trazas de trigo, por lo que es aconsejable usar levaduras sin gluten o gasificantes.

February 18, 2013

Big Culo Day 2013

Mi aportación al gran Big Culo Day 2013. En esta ocasión, cortesía de Russ Heath:


Extra bonus: Por si está repetida:


¡Ah! ¡Qué satisfacción da el deber cumplido! Hasta el año que viene.

La Lechuza - 7 Fuentes - La Lechucilla

Subida a Siete Fuentes
Esta nueva ruta de tarde tiene como salida el aparcamiento del instituto de la Vega de San Mateo, en la carretera que va hacia Tenteniguada y Valsequillo.
A 150 m. en dirección a San Mateo, en la misma curva, hay un desvío hacia La Lechuza y un cartel señalizando el sendero hacia 7 Fuentes, tendremos que seguir la carretera de asfalto que sube por la izquierda, foto de la derecha.

A los pocos metros comienza una rampa con un gran desnivel, hay muchos tramos igual de fuertes si se hace el camino desde el pueblo además de los que comentaré más adelante.

Seguir leyendo...

January 30, 2013

MIGAS

&&

 

x-defaultSe acerca el fin de mes y no un fin de mes cualquiera… ¡el fin de mes de Enero!

Después de la temida “cuesta de enero”, ahora toca recuperar un poco nuestros bolsillos. Una opción muy interesante es aprovechar el pan duro y aquellos “recortes” que teníamos guardados en el congelador y con los que no sabíamos qué hacer. Ya publicamos una entrada titulada “Recetas para fin de mes”; y hoy vamos a aprender a hacer unas deliciosas migas caseras.

INGREDIENTES:

  • Pan receso (de un par de días como mucho)
  • Jamón
  • Chorizo
  • Unos dientes de ajos
  • Un poco de aceite
  • Agua
  • Sal

 

PREPARACIÓN:

  1. Cortar el pan en rebanadas finas, cuanto más finas mejor. (¡Cuidado con los dedos! ¡DUELE!) ;)
  2. Llenar una ensaladera con agua y añadir un buen puñado de sal.
  3. Ir colocando en una fuente las rebanadas de pan y humedecerlas con el agua. (Sólo unas gotas por rebanada.) Lo más práctico es mojar las manos en el agua y salpicar el pan poco a poco.
  4. Una vez humedecidas todas las rebanadas, “amasamos” un poco el pan hasta que todas las rebanadas se hayan deshecho.
  5. Trocear los dientes de ajos en rodajas finas, y saltearlo con un poco de aceite.
  6. Cuando el ajo esté dorado, añadir el jamón y el chorizo finamente troceado. Darle un par de vueltas y luego añadir el pan.
  7. Seguir moviéndolo hasta que evapore todo el agua y empiece a tomar un color dorado.
  8. Podemos dejar las migas muy tostadas a más jugosas, al gusto.
  9. Sirven como primer plato o como acompañamiento. Van muy bien con sardinas a la plancha. ;)

 

Nota: También podemos sustituir el jamón y el chorizo por un variado de setas. Esto reducirá el contenido calórico del plato, aunque seguirá estando igual de sabroso.

January 29, 2013

Degollada de la Aldea - El Viso - Los Azulejos


Inicio del camino en la Degollada de la Aldea
En el cruce de la GC-200, carretera que va de Mogán a La Aldea de San Nicolás, con Tasártico comienza esta ruta. Al punto de partida se le conoce como Degollada de la Aldea, en la señal de la  foto indica que a 3,5 km está la montaña del Viso.
También saqué la parada de guaguas, seguramente la señal de tráfico durará más que la de senderismo, la triste costumbre de romper todo.

Un primer tramo en suave ascenso, con un pequeño tramo duro, nos conducirá hasta un bonito andén. Ya desde aquí podremos ver la montaña de Horgazales, Lobas, La Aldea de San Nicolás, etc...

Seguir leyendo...

January 15, 2013

ALUBIAS CON ALMEJAS VERSIÓN “APAÑÁ”

&&

x-defaultDespués de las Navidades, de los excesos (tanto económicos como gastronómicos), toca afrontar con filosofía la “cuesta de enero” (que para algunos, más que “cuesta”, se trata de todo un “puerto de montaña”). Triste

Pero no pasa nada. Porque aquí vamos a seguir viendo recetas fáciles, económicas y bajas en grasas. Como la de hoy: un sabroso guiso de alubias del que nadie sabrá que está hecho a base de “latas” y alubias de bote. Guiño

INGREDIENTES:

  • Un bote de alubias
  • Una o dos latas de almejas o berberechos
  • Dos o tres dientes de ajo
  • Un poco de aceite
  • Una cucharada de harina
  • Vino blanco
  • Perejil
  • Sal

PREPARACIÓN:

  1. Picamos los dientes de ajo y los salteamos con un poco de aceite en una sartén. Cuando empiece a estar dorado, añadimos una cucharada rasa de harina y le damos un par de vueltas. Antes de que se queme, añadir un chorro de vino.
  2. Dejamos evaporar un poco el vino y añadimos las latas de almejas y/o berberechos sin escurrir (o sea, con el agua que traen las latas).
  3. Añadimos también el bote de alubias, también sin escurrir. (Si tenemos problemas al sacar las alubias, podemos meter el bote un poco en el microondas, abierto por supuesto, y templarlo durante un par de minutos.)
  4. Tanto las alubias como las almejas están ya cocidas, así que sólo tenemos que esperar a que el guiso se caliente.
  5. Probamos el caldo y, si es necesario, añadimos un poco de sal.
  6. Antes de servir, picar un poco de perejil fresco y añadirlo también.

LA CASA BLANCA NO CONSTRUIRÁ LA “ESTRELLA DE LA MUERTE”

&&

wallpaper-767668En EEUU existe una normativa según la cual, una propuesta secundada por un mínimo de 25.000 firmas debe ser estudiada por el gobierno, quien deberá publicar una respuesta oficial de lo acordado.

Pues bien; el pasado 14 de noviembre se publicó en la página oficial de la Casa Blanca una propuesta para que el gobierno de los Estados Unidos construyera la mítica “Estrella de la Muerte”, el arma especializada en la destrucción de planetas que aparece en “La Guerra de las Galaxias”. La petición iba acompañada de la siguiente afirmación: “Al enfocar nuestros recursos de defensa en una plataforma espacial y un sistema de defensa como la Death Star, el gobierno puede fomentar la creación de trabajos en los campos de la construcción, ingeniería, exploración espacial y más, y fortalecer nuestra defensa nacional”. El 13 de diciembre de 2012, la petición consiguió reunir más de 35.000 firmas a su favor.

Sin embargo, la Casa Blanca ha decidido no construir la Estrella de la Muerte debido a que el coste aproximado rondaría los 850.000 billones de dólares y porque el gobierno de los EEUU “no está a favor de la destrucción planetaria”. Además, “¿por qué íbamos a gastarnos incontables dólares de los contribuyentes para construir algo con un fallo de diseño tan obvio que una sola nave podría destruirlo?”.

 

Mas info:

http://www.enter.co/vida-digital/la-casa-blanca-tendra-que-responder-a-una-peticion-para-construir-una-death-star/

http://elpais.com/elpais/2013/01/12/gente/1357980653_284794.html