domingo, noviembre 22, 2009

svn vs csv

Este viernes tenía una cena con compañeros de facultad.
Salió el tema del svn donde les comenté sobre como trabajar con ramas correctamente.
Emilio comentó que cuando estaba en TID tuvo the procedimentar la forma de trabajar con CVS, eso me ha hecho mirar las diferencias entre CVS y SVN, que no las recordaba.
Ahí van unos enlaces: [1][2][3].

miércoles, noviembre 11, 2009

Buscando sobre memcache

Buscando sobre memcache (que tengo que escribir un articulillo) me he encontrado unos enlaces que comparto:

No he visto muchas cosillas. De hecho sobre el tema de mi artículo no he visto nada...
Aparte de los artículos, hay algún comentario interesante y algún enlace para investigar...

domingo, noviembre 01, 2009

High Performance Web Sites

Sabía que este finde iba a tener algo de tiempo para leer, con lo cual me llevé un libro pequeño de la biblioteca de la Empresa "High Performance Web Sites" de Steve Souders (O'Really).
Aunque no lo he leido entero, lo acabaré en en breve (no le doy mas de esta semana) ya que es muy corto y muy directo al grano. Básicamente está dedicado a exponer 14 reglas para hacer web sites que cargen más rápidamente. Reglas dedicadas a frontend.
Las reglas son:

  • Make Fewer HTTP Requests
  • Use a Content Delivery Network
  • Add an Expires Header
  • Gzip Components
  • Put Stylesheets at the Top
  • Put Scripts at the Bottom
  • Avoid CSS Expressions
  • Make JavaScript and CSS External
  • Reduce DNS Lookups
  • Minify JavaScript
  • Avoid Redirects
  • Remove Duplicates Scripts
  • Configure ETags
  • Make Ajax Cacheable

Un libro totalmente recomendado si te dedicas al desarrollo web. Aunque es información que posiblemente puedas encontrar online, como por ejemplo aquí [de yslow].
Pero de todas formas está bien tenerlas agrupadas en un libro.

martes, octubre 27, 2009

Usando correctamente SVN - Bunny Hopping

Ahí va un post sobre SVN en estos tiempos que corren, donde lo que está de moda son los sistemas de control de versiones distribuidos. Pues si... porque ¿quien ha usado correctamente las ramas de SVN?
Pues fijate tu que yo hasta que he estado en mi curro actual no. Ahí va el enlace que motiva este post: What Mother never told you about SVN Branching and Merging.

Como veis, la clave está en el procedimiento y no en el knowhow de los comandos.

sábado, octubre 17, 2009

File/dir comparion tools bajo linux (and merge)

Bajo windows siempre me gustó Beyond Compare, pero no es gratis. Ahora por lo visto también está disponible bajo linus.
Sin tardar mucho necesité comparar unos directorios, y probé meld. Me gustó, pero a la hora de operar hacía alguna cosa rara... Hace ya tiempo que la probé y no me acuerdo bien. Creo que era como que cuando comparabas directorio y modificabas alguno de los ficheros no se refrescaba bien la información en el arbol.

Posteriormente probé kdiff3, y me ha gustado mucho. De momento es la que uso para comparar directorios. Aunque no he logrado usarla para hacer merges. Bueno tengo que confesar que tenía mucha prisa y no le he dado mas intentos.
Total que recurrí para hacer los merges a la herramienta que tiene incorporaba netbeans. Os la recomiendo al 100%. Hoy por hoy es lo que usaré para hacer merges. Mas si cabe si como yo ahora mismo usais netbeans.

Bueno tendré que darle de nuevo otra probazón al kdiff3.

Si buscais en google por 'diff tools linus' o 'file comparison tools' podeis obtener mucha info. No he buscado en stackoverflow, pero tb. es buena fuente.
Acabo con una tabla comparativa de la wikipedia.

lunes, octubre 05, 2009

3 meses despues

Pues si, ya han pasado 3 meses desde que entré en Tuenti. Y con ellos mi primer hito, que era precisamente el durar 3 meses.

Hace poco leí, que realmente las decisiones aunque pensemos que las tomamos racionalmente en el fondo las hacen los sentimientos. De otra manera jamás seríamos capaces de decidir nada.
Y así fue. Bueno... la verdad es que en mi anterior empresa me lo estaban poniendo fácil por su situación económica y futuro incierto. Pero tirar 7 años por la borda sin ver un chavo.... pues cuesta. Que uno ya no es un chaval!
Pero los trenes pasan sólo una vez, y o los cojes o se pierden, y esto era una oportunidad.
Eso si, tenía claro que iba a ser mucho cambio.... y las dudas si vas a estar a la altura de las circunstacias, poniendo en la balanza el poder perder el curro sin ni siquiera tener el paro.
Pero... el mundo no está hecho para los cobardes.
Eso si, una vez que tomas la decisión se abre un huevo horizonte... y te alegras de tomarla.

Pues eso, decisión tomada y a una empresa donde la media de edad es de 26 años. Ahí a romper la media. A jugar en el equipo de los veteranos :p.

Tras estos 3 meses, puedo decir que no he estado a la altura de las espectativas que mi jefe esperaba de mi, pero que tampoco lo he hecho mal. Hemos aprovado. La nota la tendría que poner él ;) (pero con lo exigente que es...).
Ha sido duro. Pero sarna con gusto no pica, y lo que no te mata te hace mas fuerte.

La oficina está relamente bien, y te cuidan bastante. Pero se curra, y todo el mundo curra, lo que da un ambiente realmente productivo y con buen ambiente.

El entorno es totalmente LAMP. Entré sin ni tener ni flowers de PHP, pero vamos... que eso es lo de menos. Los lenguajes lenguajes son. Y cuando sabes hacer soft con varios, pues mas o menos sabes con todos.

Me han sorprendido mas otras cosas. Por ejemplo como se exprime svn; lo bien que está trac; como te tienes asegurar de que lo que haces está bien (bien probado, pruebas unitarias, ...), ya que lo que liberes va a ser usado por miles de usuarios.
Todo el procedimiento para hacer releases, hotfixes, bugfixes, ...
Vamos... mucho que absorver.

Conocer herramientas que desconocía: netbeans, firebug, firephp, xdebug, memecache, lighttp, kcachegrind, ...
Ir poniendome las pilas con mysql...
Ver cosillas internas que se tienen montadas.

A ver si cuando tenga un poco mas de tiempo puedo ir publicando alguna cosilla sobre PHP y las herramientas mencionadas. Pero de momento lo veo complicado por la falta de tiempo.

Otra de las cosas novedosas para mi, es el tener a un jefe que pilote mas que tu y mucho.

En este periodo tuvimos que hacer una release de mi equipo que nos llevó 3 tentativas. Y tras lograrlo siguió dando colezatos que me los comí yo con patatas. Eso ha sido lo mas duro. Fueron como dos semanas duras duras. Pero fue una release muy complicada. Ahí, para coger callo XD.

A partir de ahora y con el callo ya generado, a intentar se mas productivo (que no es lo mismo que currar mas) y a ver si podemos ir aportando mas que hasta la fecha...

Para acabar dejo unos links de un compañero que tb. ha publicado algo sobre su entrada a tuenti: [1][2][3].

Nota final: Me sigue molando mas python :p.

jueves, septiembre 17, 2009

Name That Code
Created by OnePlusYou - Free Online Dating

miércoles, agosto 05, 2009

Que facil es acostumbrarse al jamón ibérico

Hoy por fin recogí el finiquito de mi anterior empresa.
Fue muy agradable estar con un par de mis ex-compis (Pedro y Carlos). Una pena no ver a mas gente... pero entre el ERE temporal y las vacaciones....
La verdad... la última etapa formamos un grupeto muy bueno en las comidas. A ver si en septiembre nos podemos volver a juntar a echar unas cañas.
Para celebrar el ERE y la marcha tb. de Pedro, que hoy es su último día.

Pues estaba yo allí charlando con esta gente y alguno mas, y me fijé en los monitores TFT que teniamos de 17". Joder..... No llevo ni un mes currando con uno de 22" y ya me parecían una gena. De ahí lo del titulo del post. Casi que voy a pasar de ponerme un segundo monitor.... Porque si ya se acostumbro a caviar... jajaja.

Y ya que estamos con temas de 'laVida', voy a tocar otro. En noviembre del 2008 me largaron del proyecto en que estaba. Se quedaron con sólo un proveedor. Como yo era el único del mio...; a la puta calle. A pesar de ser una de las dos personas técnicamente mas importantes del proyecto (por no poner un orden entre las dos...). En mi lugar se quedó un junior, hay que joderse...

Pues bien... segundo recorte y del proveedor en exclusiva se queda una persona. Para nuestro divertimento, alias 'la heredera' (brown espeso para la pobre).

Pues bien... ahora le dan el proyecto a otro proveedor, el cual no tiene ni flowers del proyecto, y ya si me apuras, ni de python. Juas.
¿Adonde quiero ir? Que esta es la gestión del soft/proyectos que se hace en España por muchas empresas. La puta pela. La calidad? Que mas da.... Claro, al final los proyectos se van al garete.... No mi extraña.

¿Adivinais que empresa se ha puesto en contacto con 'la heredera'? Yo en su lugar no les haría ni puto caso. Si quieren algo, consultoría al canto a precio puta.

martes, julio 28, 2009

scalability

Como podeis ver últimamente no escribo na de ná. Eso si, en twitter o en greader estoy siempre más activo.

Aprovechando una charla de Dave Currie (Tuenti) sobre escalabilidad, aprovecho para soltar un par de enlaces mas.
Un post de alex sobre el tema; y una web, highscalability.

jueves, julio 09, 2009

Cambio laboral


Vaya! esto está que como muy tranquilo.
El motivo es que estoy de cambio laboral, y antes de él me he tomado unos días de asueto (que vienen genial para desintoxicar el coco y arrancar con fuerza).

Y supongo que lo seguirá estando por un tiempo... o al menos supongo no podré actualizar muy frecuentemente. Tengo que ponerme las pilas con bastantes cosas.

Por lo demas, con expectativas, pero también con inquietud. Supongo que se me exigirá bastante y hay que dar el callo. Hay 'level' por aqui, por lo que he podido ver... Se intentará no defraudar :p. Por otro lado, tengo el handicap del Inglés (idioma oficial de curro). Vamos... que lo estoy desoxidando a marchas forzadas... :pp

Y por de pronto mas nada... Decir que estoy en un proyecto interesante y en una empresa totalmete atípica para lo que es el mercado IT español; concepto de empresa americana a tope... (con sus pros y contras).

martes, junio 09, 2009

pyCitas

Tengo la impresión de que Java fue diseñado para hacer que fuera difícil escribir mal código, mientras que Python está diseñado para hacer que sea sencillo escribir buen código.


-- Magnus Lycka



A falta de un nombre mejor lo llamaré la paradoja Python: si una compañía decide escribir su software en un lenguaje poco utilizado comparativamente, serán capaces de contratar a mejores programadores, porque atraerán sólo a aquellos que se molestaron en aprenderlo…
Hasta ahora sólo unas pocas compañías han sido suficientemente inteligentes para darse cuenta de esto. Pero hay una especie de selección natural trabajando: son exactamente las mismas compañías en las que a los programadores les gustaría trabajar. Google, por ejemplo. Cuando ofertan puestos para programar en Java, también piden experiencia con Python.


-- Paul Graham



Vía eFerro de aquí.

viernes, junio 05, 2009

Spring Python

Hoy me pasaba JJ un enlace, sobre Spring Python.
No sabía de su existencia...
He estado leyendo un poco. Se trata de una migración del framework Spring de Java a Python.
Por lo visto Spring fue ha sido un revulsivo en la comunidad Java, ya que puede servir como alternativa a los EJBs.

Así como las cosas mas interesantes que incorpora son AOP, IoC y MVC.
Esto me ha dado pie a empezar la mañana a leer alguna cosilla sobre AOP y IoC. Para refrescar.
En la web de Spring Python hay información,
Continuando y recordado una duda de la semana pasada he indagado un poquillo algunas cosas.
La semana pasada me preguntaron por los Arquitecture Patterns. Y tirando de memoria, tras un ejemplo, logré sacar de la manga el Pipeline. Es lo que tiene el mentar en el CV el tema de los patterns. Luego hay que apechugar...
El tema de los patrones es interesante, pero ya está muy asumido. Cuando apareción era un concepto novedoso y ahora los usas casi sin darte cuenta. Incluso que implementas las cosas usando patrone de una manera natural.
De todas formas no estaría mal, volver a echar una lectur al libro de la GoF. El problema es el de siempre, la falta de tiempo, ya hay que priorizar.

Relacionado con la Application Arquitecture tendríamos la Enterprise Arquitecture [martinfowler]. Es interesante la lectura del link anterior. Las pegas que indica de la Enterprise Arquitecture, lo he visto con mis propios ojos.... Montarte una paja mental para intentar extenderla por la compañia. Es realmente complicado.

¿Que pasa cuando estas centrado en el día a día, implementando tus movidas? Pues que es fácil irte olvidando de algunos conceptos.
Por ejemplo, ¿cuantos me podríais definir claramente lo que es un Programming Paradigm? ¿Y una methodology? ¿Y software design? ¿Y que define que un lenguaje sea OOP?
¿Lo tendrías claro en una entrevista? Deberías.
Ya para nota, ¿sabrías lo que es SoC (Separation of Concerns)?

Para cerrar el tema con lo mismo que he empezado esta divagación, enlazo un post: The case of AOP in python.
Y un par de enlaces relacionados con IoC: DI y DIP.

viernes, mayo 08, 2009

WebServices en .NET - curso .net (III)

Ayer estuvimos trasteando con los webservices.
Supersencillo! Pero bueno... como todas las cosas... que todo va bien mientras va bien.

Te creas un projecto del tipo servicio web, y ya VS (Visual Studio) te crea una template, con ya una operación 'hola mundo'. Lo adaptas y ya tienes tu propio servicio. Los métodos que son servicios (puedes tener en la clase, métodos que no lo sean) están etiquetados.

Posteriormente te creas otro proyecto (que puede ser una aplicación windows normal) y estableces la referencia web con el servicio y eso es todoo.

El servicio llegará un momento en que tendrás que desplegarlo en un IIS, pero VS te monta un servidor en local, donde corre el servicio.

Las dos cosas que me llamaron la atención fueron:
  • Si usas clases en el servicio, en él puedes usarlas normalmente, pero desde fuera de el sólo puedes acceder a atributos y propiedades públicos (y el único constructor válido es el de por defecto; que lógicamente tendrá que tener).
  • No vi ningun fichero XSD por ningún lado. Con ASP.NET, se genera un fichero .asmx, que de hecho si acceder a él en el servidor, te da información sobre los diferentes servicios y el formato de los datos intercambiados. Hay otro tipo de archivo, que se mencionó en el curso, el .aspx, que se corresponderían con los WebForms. El .wsdl ((guisdel) si que se genera. En contraposición, cuando he manejado webservices sobre java, aparte del wsdl se generaba el xsd.

miércoles, mayo 06, 2009

Curso de .net (II)

Tengo pendiente algun post sobre el tema de .net. Pero antes va un minipost.

Hoy tenemos una minipractica. Va a ser interesante el volver a diseñar una miniapp con windows. Desde los tiempos en que estaba en Meta4 y desarrollabamos con VB no habia vuelto a tocar los forms de windows.

Hacer apps con C# en windows está tirado la verdad. Con la ventaja de que C# es un lenguaje muchisimo mejor que el VB que usabamos entonces...
Lo que no puedo comparar es el entorno de M$ con los de Java, ya que no he desarrollado aplicaciones gráficas en Java.

Otra cosilla que quería comentar es que con C# se puede ser muy productivo. No ya por el lenguaje. En este caso la productividad te la da el entorno.
Python es un lenguaje muy productivo por el mismo. C# puede serlo menos, pero el entorno que tienes de desarrollo hace que realmente puedas serlo.
Habría que ver cuanto mas podrías mejorar en la productividad con python con un buen entorno. No lo se, ya que no lo he hecho. Estoy acostumbrado a hacer las cosas a manubrio. Todavía aro mis campos con burro :p.

Pensando sobre lo que hizo M$ con .net, está claro que la jugada fue realmente buena. Imaginaros que no hubieran creado C# y .net... ¿Que seguirían, con VC++ y VB? Estaba claro que tenían que sacar algo... y como no pudieron adaptar Java [autonota: indagar mas esto], tuvieron que crear su propio entorno y crearon un nuevo lenguaje.

Lo único triste de todo esto es que quien esté detras sea M$, y no le interese abrir mas las cosas, y si quieres desarrollar en .Net y C# tengas que hacerlo sólo (practicamente) para Windows.
Yo ni me plantearía desarrollar para Mono, hoy por hoy.
Pero M$ no puede tener otra postura que la que tiene; de otra forma Linux le comería mas pastel.
Lo que si que gana ahora con .net es una mayor compatibilidad entre versiones de windows. Es lo que tiene el programar contra una maquina virtual.

Nota: el profe al final ya no se fue tanto por las ramas... mejor! cuando se iba la liaba parda!

Corrigiendo nif/cif/nie en django

Abrí un ticket sobre este tema, pero me lo marcaron como dup, ya que existía otro, el 10204.
El 10204 tiene un parche, pero es erroneo. Como estoy metido en estos fregaos y la corrección es trivial he subido otro parche.

Ha sido mas coñazo montarse el tema para corregirlo que realmente hacer la corrección.
Para ello hay que bajarse el código del repositorio.

Como las pruebas las voy a lanzar con los tests de regresión es necesario preparar para ello el entorno. Aquí de dicen como.
Como fichero de settings, me hice una copia de .../conf/global_settings.py modificandolo según indican aquí (usé la primera entrada).

Una vez creado el fichero, me creé las siguientes variables de entorno:

export PYTHONPATH = $HOME/.../django/trunk
export DJANGO_SETTINGS_MODULE=tests.cesar_settings

Según lo anterior, el fichero cesar_settings.py lo metí en .../django/trunk/tests.

Para ejecutar los tests de mi interés hice:

runtests.py -v 2 forms

Que ejecuta muchos tests, a pesar de que a mi sólo me interesaba trunk/tests/regressiontests/forms/localflavor/es.py.
Tengo que indagar como ejecutar sólo eso si es que se puede....

Ya para acabar, indicar que algo mas de curro se puede hacer sobre lo que hay en django/contrib/localflavor/es.

martes, mayo 05, 2009

Validación nif/nie y cif

Tenía que implementar un algoritmo para localizar nif/nie y cifs en texto, y de paso comprobar que eran validos.
Como tengo costumbre pasaba de reinventar la rueda, pero la única implementación que encontré era erronea.
Pregunté en la lista de python-es.
En el hilo podeis ver una implementación que hice, y lo que me pasó Jesus y la implementación de django.
Tanto la implementación de Jesus como la de django son mas pythoneras que la mia, pero la mia funciona :p.

En django actualmente hay un ticket abierto para corregir la implementacion, el 10204.

En la wikipedia está muy bien cubierto el tema. Lo único que no comentan es sobre el caso de un NIE que empiza con la letra T. Lo único que he encontrado es:

"La ley establece que el NIF, en caso de personas físicas extranjeras con documentación del pais de origen podrá sustituirse por el número de identidad válido en su país de origen, precedido por una T. Por tanto y de cara a la validación: TODO NIF QUE COMIENCE POR T ES VÁLIDO, dado que el resto del NIF se rige de acuerdo a la legislación propia de cada país"

Se podría considerar que un NIE que empieza con T podría ser valido si sus 8 caracteres siguientes están en el set [A-Z0-9], pero no lo podriamos validar, ya que el algoritmo de validación lo desconoceriamos. No creo que esto ahora mismo se use...
Yo no los aceptaría, en principio, a no ser que realmente hoy en dia, todavía se de el caso.

Una implementación que he visto muy copiada es la de bulma. Lo mas interesante de la misma es la codificación del valor de retorno. Si el valor es <=0 estamos ante un cif/nif/nie invalido.
En caso contrario es válido y ademas nos indica ante cual de ellos estamos por el valor (0,1 o 2).

lunes, abril 27, 2009

Va a estar divertido el curso de .net

No por el curso de .net, que será un truño, sino por las tertulias que vamos a mantener con el profe. Lo estoy viendo...
Antes de entrar en el tema, linkeo un post relacionado de Sergio Montoro.

Estaba muy desconectado del mundo Microsoft, pero ya me voy enterando, que si codeplex, team system, estado de mono, sharepoint, silverlight, ...

Bueno... volvamos al tema del curso.
El curso nos lo da un formador interno, teoricamente arquitecto o consultor en tecnologías .net.
Pues bien el susodicho puede que controle de .net, que ya lo iremos viendo... pero ha demostrado un desconocimiento del mundo del Open Source, y tener unas ideas sobre el desarrollo del software en general, que me hacen sospechar que tiene los pies de barro... Ya iremos viendolo, que puede estar divertido. Fijo, porque este es un taliban de Microsoft.

Ha tenido dos perlas hoy: la primera cuando mentó que desarrollar con Visual Studio era gratis. No puedes hacer afirmaciones como esa. Es gratis usando la versión express. Pero son versiones limitadas. Ni que fuera un comercial.

La segunda perla es cuando comentó las desventajas de usar open source frente al tener el respaldo del soporte de Microsort. Chanante! Ya nos metimos en una tertulia que duró hasta que me fuí del curso que tenía que salir un poco antes....
¿Pero como puedes hacer una afirmación como esta? Claro que está de PM el tener soporte (pero hay que pagarlo), pero el tener un soporte no te va a garantizar nada. Puede que incluso que hayas encontrado un bug ¿y que? ¿Te lo van a arreglar?
El tio comentaba una mala experiencia con una cosa que pillaron para fusilarlo en un proyecto y que luego les petaba.
  • Punto 1: tu eres responsable de lo que pillas
  • Punto 2: hay que saber lo que se coge. Y si coges algo que no sabes como está, pues se supone que vas a saber valorar su estado. Si coges algo como libxml2, puedes estar tranquilo que es a prueba de bombas. Sin dudarlo mejor que cualquiera de los parsers de microsoft, porque seguro que ha sido hecho con mas cariño, lo han revisado mas ojos, y está superprobado (si lo usas correctamente).
  • Punto 3: fusilar algo que es gnu, pues ya tiene delito. Ajo y agua.
  • Punto 4: de todas formas si pillas algo que no está hiperprobado, pues oye, eso que te ahorras. Da gracias. Si luego falla, pues oye, ¿no somos desarrolladores?
  • Punto 5: tienes el código. Quien no ha estado pillado por los huevos y no poder hacer nada, a no ser que pagues por que quien te tenga pillado te haga un desarrollo, que sabes que se puede hacer, pero no sabes como ni está documentado. Yo si.
  • Podiamos seguir... pero creo que es sufiente.
Ojo! reconozco que los productos de desarrollo de Microsoft son buenos, pero eso no quita para menosprecies el desarrollo Open Source.
Ojo! que no es oro todo lo que reluce. El Open Source tiene sus carencias: documentación, falta de soporte, ... Pero ya somos mayorcitos para saber donde nos metemos. Un poquito de por favor...

Ya para acabando, indicar que en una ppt indicaba que era multiplataforma. ¿Como puedes afirmar esto así categoricamente? Mencionaba que corría en Symbian. OK, pero seguro que es una versión limitada.
Y lo de mono tampoco sirve. Lo primero porque microsoft no está detrás. Con lo cual chungo.
Tienen implementado lo estandarizado (ECMA-334 y ECMA-335) y están intentando soportar parte de los paquetes que Microsoft no ha estandarizado: Windows.Forms, ASP.NET, ADO.NET, ...

En cuanto al tema de mono, comentar que he estado indagando y realmente hay pocas aplicaciones que lo usen. No se yo si es una tecnología para confiar. Yo según están las cosas no apostaría un duro por ello. Mas cuando la gente de gnome han creado un lenguaje, como alternativa: vala. Además hay temas chungos de licencias por medio.

Acabo este post comentado que hay un proyecto de gnu dotGNU, donde está Portable.NET.
Este proyecto está centrado en implementar las especificaciones ECMA en multiples plataformas.
Este si que me parece un proyecto interesante (si es que realmente el framework merece la pena...) y no mono. Bueno... es mi opinión.

sábado, abril 25, 2009

Metodologías ágiles y Team System en el mundo real

El xcoles despues de la charla de enmento subo a mi puesto, en un momento hecho un vistazo a mis feeds y veo que Rodrigo Corral ha publicado algo.
Como es uno de los sitios que suelo mirar porque pública sobre Scrum, lo hecho un vistazo y me entero de este evento, que era para el día siguiente, jueves. Ipso facto me registro, pido permiso al cheriff y gualá. Todo arreglado...
El jueves tras un poco de pereza por el madrugón que me tocaba dar (y el trasnoche del dia anterior) camino hacia 'la finca'. Como no había estado nunca salí con tiempo, en coche y con tontorrón. Tras comerme el atasco de la M-30 (por donde el Vicente Calderón) y luego otro en una rotonda (ya por Pozuelo de Alarcón). Llego a la finca y para no complicarme, coche a parking de pago...

La finca una zona edificos nuevos, ideales para currar, pero sin vida; a mi estos sitios fabricados no me gustan. Donde esté currar en el centro de Madrid...
La oficina de Microsoft pues bien, con zona para relajarse donde nos sirvieron caterings: a media mañana, para merendar y comer.
La charla de la mañana, ¡genial! Ya no solo por el contenido sino por la forma de presentarlo y las anectodas. Rodrigo lo hizo realmente ameno. Recomendable 100%.
Da gusto a ir a charlas donde se ve que la gente que la da, sabe de que está hablando y lo usa en su dia a dia.

Ya lo de por la tarde me interesaba menos... pero bueno... ya que estabamos allí... Pues lo vía hasta la hora de la merendola que aproveché para volver a los madriles.
También le saqué partido, sobre todo para ver las herramientas de Microsoft para probar unit testing, web testing y pruebas de carga.
Del OS siempre nos estamos quejando... pero hay que reconocerlo, tienen unas herramientas de desarrollo cojonudisisimas.
Con respecto al tema del unit testing, curiosa una herramienta todavía bastante experimental para generar automáticamente tests unitarios: Pex. Por ella misma no es que que sea muy util, pero puede ayudar a definir tests para 'cubrir' toda la casuistica posible. Interesante al menos.

Volviendo al tema de las metodologías ágiles, era muy guapo ver como se integraba Team System con excel y con las herramientas de desarrollo. Impresionante el tema de la integración la verdad. Lo cual es normal, ya que es su entorno y sus herramientas.

Umm, y esta semana que entra empiezo un curso de .NET. Pero no.... que no abandono el barco unixero. Dios me libre. Nunca está de mas, ver otras herramientas y entornos.

PD: Hace que no toco herramientas Microsoft la friolera de... yo diria 10 años. Ahí es ná, cuando desarrollaba con VB (yo creo que llegué a usar la 5.0) y para gestionar el código Sourcesafe. Ahí es ná.

miércoles, abril 22, 2009

lan testing

Tengo un NAS, el Linksys NAS 200 desde hace tiempo. La verdad es que no le había dado mucho uso, pero pienso darle mas. Para ello le he metido un segundo HD y lo he configurado como RAID1.

Al hacer el trasvase de datos de nuevo al NAS, me pareció que iba lento. Bueno lento tiene que ir comparado con un disco duro interno, ya que el interfaz de red es 10/100. Pero no se... me ha dado por probarlo. Me dio por pensar que quizás el router/switch me estaba haciendo de cuello de botella.
Pues bien, metí un switch de netgear entre medias y he probado a comunicar entre dos ordenadores a través del switch y a través del router y no tengo problemas. Tengo una tasa de transferencia que no llega a los 95 Mbps. Vamos... que no hay problema, pero es una tasa muy baja si la comparamos con un USB 2.0 (480 Mbps). Y ya ni que cuento si la comparamos con SATA (150/300 MBps).

Vamos... que si os quereis comprar un NAS para usarlo como disco externo y darle bastante uso no os lo recomiento. Es muy lento. Yo lo utilizo como backup de datos, de ahí el tema del RAID1. Estoy empezando a tirar bastantes fotos en digital y quiero una solución comoda como dispositivo de almacenamiento. El NAS es cómodo si quieres compartir tus datos entre varios ordenadores, pero es un tema a pensarse muy bien porque con un dispositivo USB quizas te apañes (estamos hablando de un entorno domestico, claro está).

Si teneis claro que lo vuestro es un NAS yo me iría a uno con interfaz ethernet gigabit. Hay cosillas por ahí donde incluso podeis configurarlo en RAID5.
Una ultima cosa... al lorito con el ruido. Sus darus cuen que estos dispositivos suelen llevar ventiladores.
Un ejemplo de cosas relativamente económicas. Y un ejemplo de comentario de ruido.
En este link podeis ver varios modelos.

enmento search

Hoy he estado en una jornada de presentación de la solución para búsquedas de enmento.
Como podeis ver en su página me llamaba la atención lo de 'semantic' que dicen que hacen.

Pues bien... de semantico poco la verdad. Lo que dicen de semantico es a nivel de palabra, sinonimos, ...
El producto es un producto muy sencillo y totalmente orientado a la plataforma .NET.

El producto se ve que está sobre todo orientado a crawlear documentos dentro de la red de una compañia (soporta seguridad de acceso a sets de documentos).

Realmente es complicado ya el mundo este de los buscadores.... porque sacar algo diferenciador es dificil. Y este no es el caso. Faltaría ver que tal busca, comparado con otros buscadores. Oye, quizás lo haga muy bien y por el coste de licencia compense... No lo se.

Bueno pasemos a ver algunos detalles...

Cada nodo de indexación puede albergar 1Millón de documentos. Lo que no se, es el ratio que manejan de media entre numero de docs y almacenamiento necesario.

Por lo visto, los indices no los almacenan en el sistema de archivos, sino en una BD!!!! A ver si mañana puedo indagar mas... Mira que me estraña esto.

Al añadir un nodo mas de indexación, no puedes redistribuir los indices ya existentes (vamos, que tienes que volver a procesar todo).

En la demo tenían una aplicación de administración de consola y un interfaz de búsqueda web. Por lo visto se puede acceder a través de .NET o a través de web services.

No se puede hacer procesamiento de los documentos, ni se soportan campos en el indice. Vamos... que por ejemplo no puedes meter un valor creado en runtime en un campo del indice que calculas basado en contenido del documento.

Todos los temas que ellos llaman semanticos: inflections, sinonimos, ... Se hacen durante la consulta. Lo que penaliza la misma, claro está.

Tienen una cosa que llaman 'macros', que sería un equivalente a los grupos de una expresión regular (seguimos hablando de la query).

Por lo demas soportan lo tipico: ands, "", *, ...

Y eso es todo en pocas palabras.

martes, abril 21, 2009

Windows shell

No voy a desvelar nada nuevo si digo que la shell de windows es un truño.
No ya por el propio lenguaje, o los comandos disponibles, sino por el dichoso terminal.
Es increible que todavía en el Windows XP siga viniendo...
Eso si mirando esto he descubierto que ya Windows ha sacado una nueva shell, Power Shell (aka monad, aka Microsoft shell, aka MSH). Un par de links mas: [intro][ide][un blog].

Para los reacios al tema windows, desde hace tiempo tenemos el cygwin. El problema de cygwin es que disponemos de una shell muchisimo mas potente, pero no nos desembarazamos de la dichosita consola. Pues bien.... he descubierto una emulador de terminar que se integra con cygwin (y podemos también abrir terminales vía ssh) y que está realmente bien. Se trata de poderosa.

Volviendo al tema de las shells, aparte de powershell y de cygwin, hay algunas alternativas (que no he probado):
  • console
  • powercmd: Esta tiene realmente muy buena pinta. A ver si la pruebo.
  • Take command
  • ipython: se ve que hay gente que lo usa, y usando python como lenguaje de scripting. Por lo visto en windows haga usando pyreadline.
  • Alternativas a cygwin, pero nativas. Hay varias opciones, pero algunas de ellas ya un poco obsoletas o sin soporte: unxutils, uwin, bash.
La mayoría de la información anterior la he obtenido de las dos páginas siguientes: [1][2].

Actualización
Se me había olvidado que con cygwin también disponemos de cygwin/x.

lunes, abril 20, 2009

Programming Collective Intelligence

Es curioso como el circulo a veces se cierra...
Resulta que tenía fichado un libro: Programming Collective Intelligence. Ya que lo comentaron en la primera reunión pythonera en Madrid.
Ayer lo pedí y hoy lo menciona gallir en un post.

El código fuente del libro está disponible aquí (blog del autor).
El código de gallir tb. es python.
¿Es sensación mia o cada vez hay mas gente tirando lineas en python?

No es pais para viejos (II)

Enlazando con el post anterior.
La empresa para la cual trabajo es partner un un buscador. Lo de partner es por decir algo, porque en 4 años no han vendido nada. Lo cual tampoco me estraña...

Pues bien, habiendo soluciones de software libre como Lucene y Nutch, y teniendo la cantidad de empleados que tienen sin proyecto, no puedo entender como no invierten o han invertido en formar a gente en dichos productos.

Y sin embargo ahora dan audiencia a la gente de enmento. ¿Querran hacerse partners también?
En fin... que ya me imagino yo por donde van los tiros de interesarse por un producto y no por apostar en software libre.

Este pais... no es pais para viejos

Voy a empezar con algo técnico para llegar a donde quiero llegar.

La semana pasaba vi este post con unas notas sobre la arquitectura de facebook. Pero tan interesante como las notas o mas es ver la presentación de donde están sacadas (1hr). Me gusta el formato, en la parte de arriba la charla por el 'Director of Engineering at facebook' (un chaval realmente muy joven), y en la parte de abajo los 'slides'.

Sobre la charla decir que es un gustazo ver como esta gente (y otra mucha) rompe con lo preestablecido para montar lo que ellos realmente quieren. Dile a algunos que vas a usar para almacenar los datos algo que no sea relacional...

Para cualquiera interesado en la arquitectura del software es de ver.
Pues bien, en esta interesante página [infoq] , podeis ver a la derecha imagenes de otras muchas charlas. ¿Que edad dirian que tienen los ponentes?

Esto viene a colación, de que el otro dia cañeando con un amigo, que me comenta que a un amigo en común que se fue a la calle (su empresa quebró) no lo cogieron en Indra (Asturias) porque era muy mayor (max 40 tacos debe tener) para trabajar como desarrollador. Lo flipas!!!!
Vaya manera de despachar a una persona, que puede tener los cuarenta tacos (que no los aparenta) pero que es un samurai del software (siendo su mejor arma el C++; y mira que es un arma dificil de dominar).

Y termino linkando un post de otro colegui, muy quemado con su jefe. Dichoso Pais. Cuando evolucionará aquí el mundo del desarrollo del software.

martes, abril 14, 2009

Dejavu y Geniusql

Gracias a un post de Jonathan Ellis, veo el video de la charla sobre Dejavu (y Geniusql) en PyCon. Es interesante... Mola lo pythoniano de las expresiones recuperar los datos.

En pocas palabras: Geniusql hace el mapeo entre objetos y tablas siguiendo el patrón Table Data Gateway.
Dejavu usa Geniusql y usa el patrón Data Mapper.

El resto de patrones de acceso a datos serían: Row Data Gateway y Active Record.

No he tenido que acceder a BBDDs con python, y menos con ORM, con lo cual es un campo bastante desconocido para mi. Hoy me propuse indagar un poco sobre ver que comparativas de productos había. Dejo un par de enlaces (Storm vs SQLAlchemy vs GeniuSql): [1][2].

Acabar indicando que hay unos cuantos mas ORMs, y que siempre podemos usar directamente el SQL.

martes, abril 07, 2009

Sorting in Python

Un artículo de recomendable lectura, que compila el tema de la ordenación en python: Python Sorting Howto.

lunes, abril 06, 2009

Functional Python

Que bueno este artículo: Python Functional Programming HOWTO.
Aparte de repasar alguna cosilla que sabía he aprendido algunas nuevas.

Mi historia de Meta4

Hacía mucho que no visitaba los sitios donde escribe Sergio Montoro, una descuido por mi parte porque me encanta lo que escribe y como lo escribe. Es un placer leerlo.

En esta ocasión escribe la historia de Meta4 desde su punto de vista.
En mi historía de Meta4 coincidí con Sergio. Yo entré en Meta4 en el 1997 y me fuí en el 1999. Si leeis el artículo de Sergio, comprobareis que entré cuando la versión 3.X estaba a todo motor.

En el 1997 acababa de terminar la mili, y un par de amigos me comentaron que estaban allí y que echara el CV. Así hice y al poco tiempo ya estaba currando. Entré en el departamento de calidad, SQA. Ya en este departamento se notaba lo que comenta Sergio, gente que llevaba tiempo en la empresa y las nuevas incorporaciones. De hecho con nuevo manager, Santiago Lecomte.

Yo por mi parte no tuve mucha suerte. Y caí en temas de calidad para la 2.X. Ya una vez pasó un tiempo en la empresa, logré pasar a desarrollo, que me interesaba mucho mas.
Ojo! no es que reniegue de calidad. En calidad se pueden hacer también bastantes cosas interesantes, pero en ese momento no era lo mio.
Caí en el equipo de Seguridad y Auditoría, donde curré codo con codo Miguelín. Nuestro manager era Javier.
La verdad... fue una etapa genial. No me he vuelto a encontrar un sitio para trabajar como Meta4 en esa epoca. El ambiente de trabajo era excepcional, y fuera de él también. Fueron muy inteligentes con las contrataciones (punto que también comenta Sergio).

Yo 'me tuve' que largar, ya que todavía era un pipiolo y la necesidad de descubrir mas mundo estaba ahí. Pero lo dicho, que gran sitio fue para trabajar, al menos para un pipiolo como yo.

viernes, abril 03, 2009

git


Parece que algo se mueve sobre el mundo de los SCMs (Source Code Management; aunque tb. podría ser las siglas de Software Configuration Management; quizás para evitar el equivoco se podría usar mejor las siglas RCS de Revision Control Software; y otro final Version Control System, VCS). Y que es que parece que git [en]está cogiendo base de usuario.. Sirva este post para recopilar enlaces sobre el tema.
Todavía no lo he probado, pero lo haré en breve.

Mi experiencia hasta la fecha con SCMs ha includo: CVS,SVN, Sourcesafe, un producto propietario de TID, y otra herramienta que ahora no recuerdo.
Mi uso con CVS y SVN ha sido muy básico. Tanto que nunca he tenido que hacer un merge de una rama. En la mayoría de proyectos en los que he estado el uso que se hace a los SCMs ha sido bastante básico: no politicas diferencias de acceso al repositorio, no branching, ...

Con lo que me quedo de git, así en breve tras lo que he podido leer:
  • Es distribuido (DVCS), con lo cual cambia y bastante el procedimiento de trabajo.
  • Parece muy indicado para proyectos muy grandes.
  • Pero parece también indicado para usarlo en proyectos personales donde estas experimentando por su facilidad para la gestión de las ramas.
  • Se puede combinar junto a SVN.
El mayor cambio respecto a un repositorio centralizado, es que con los sistemas distribuidos hay que crear una 'red de confianza'. Eso es algo externo que hay que aportar a git. Hay que crear un protocolo de trabajo.


Y eso así a bote pronto, sin entrar en mas temas técnicos, que para eso ya voy a dejar unos cuantos enlaces. Para empezar unos enlaces adicionales de la wikipedía sobre el tema:
De la lista de RCs me ha llamado la atención que hay varios implemetados en python: Bazaar, Mercurial y Codeville.

Por otro lado indicar que git no es el único distribuido, también están: Motonone, Mercurial, Code Co-op, Arch, Darcs, DCVS, Codeville, PlasticSCM, SVK, Telelogic Synergy, Bitkeeper. Pero vamos... que los que mas parecen sonar ahora aparte de git es Mercurial.



Llama la atención Darcs, no sólo por ser distribuido, sino por estar implementaro de Haskell.

Y la lista de referencias... En primer lugar indicar la web de git.
En primer lugar comentar que me parece muy interesante ver el video de la charla que dio Linus en google sobre git (resumen aquí).
El tono de Linus, no me convence mucho. Es demasiado 'radical', pero bueno... también puede ser su pose para promocionar git.

En los siguientes dos enlaces podeis ver condensadas las diferencias con SVN:
Aquí un curso rápido para gente de svn.
Y para finalizar unos links con 'discusiones' sobre el tema:
Y eso es todo amigos.... No os molesteis en buscar mas. Yo creo que lo mas interesante ya lo teneis enlazado aquí :p.

Me despido con una cita. Buen finde...

"You do realize that a distributed VCS can perfectly be used like a centralized VCS, don't you ? Declare any repository as the "central" one and decide that everybody should push/pull to/from it. That's their power: discributed VCS don't force you into a specific workflow, you choose how you want to use them. "

Joel on Software

Vía este blog, he llegado al blog de Joel on Software.
Por lo poco que he leido es un blog que merece la pena ser seguido.
Me ha llamado la atención uno de sus posts últimos sobre como pagan en su empresa.
Pues bien... tienen muy bien definido como empleado en donde estás; pero de una manera real, por tu valor. Realmente muy interesante. Y todo el mundo con el mismo status gana igual.

Otra post interesante que he leido: 12 steps to Better Code.

Pocas empresas habrá aqui como esta, si es que hay alguna...

jueves, marzo 26, 2009

Invertir una cadena

Ayer tenía que invertir una cadena y no me acordaba exactamente como hacerlo. Si tenía string un metodo para ello o no...
Pero tenía la problemática de que estaba con python 2.3. Bueno... al lio.

En python 2.3 NO puedes hacer:


>>> s = "0123456789"
>>> "".join(reversed(s))
'9876543210'


Pero si:


>>> s[::-1]
'9876543210'


Pongo alguna invocación mas de slicings, para entenderlo:


>>> s[::]
'0123456789'
>>> s[3::]
'3456789'
>>> s[:3:]
'012'
>>> s[::3]
'0369'
>>> s[::-2]
'97531'
>>> s[-2::-2]
'86420'

martes, marzo 17, 2009

Recopilando web semantica

Al igual que he hecho con temas lingüísticos voy a hacer lo mismo con lo de la web semantica. De delicious:


Del blog:

Recopilado info lingüistica

Ayer estuve echando un vistazo a mis cosillas tageadas en delicious, en relación con la lingüistica, NERs, ... Ahí van:

Un día me debería poner a organizar un poquillo los tags.
En cuanto a este blog, los que hay relacionados:
Esta recopilación viene a colación de que estuve buscando que productos ahi sobre NER. El sitio con mas info es la wikipedia. De hecho no he sido capaz de encontrar info en mas sitios (en el rato que estuve buscando).
De lo que miré me ha sorprendido FreeLing. Espero poder probarlo en breve...

martes, marzo 10, 2009

Anonymous Code Blocks in Python

Siguiendo con la tónica de los ultimos posts, ahí va una mas, para simplemente enlazar un artículo muy interesante: Exploring Dynamic Scoping in Python.

En el, el autor, logra crear 'code blocks' anónimos.
Gracias a leer este artículo se me ha ocurrido que podemos crear dinámicamente funciones, pero eso ya será para otro post....
Autonota de que usar:


code(argcount, nlocals, stacksize, flags, codestring,
constants, names, varnames, filename, name,
firstlineno, lnotab[, freevars[, cellvars]])
function(code, globals[, name[, argdefs[, closure]]])


Hoy curiosamente llego por segunda vez a BytePlay.

Decompiling with introspection

Ultimamente he estado jugando con decompyle. Necesitaba obtener código que estaba generado con python 2.3, con lo cual por ese lado no tenía ningun problema.
El problema es que no disponía ni siquiera del código fuente, los módulos estaban embebidos en el interprete. ¿Ingenioso verdad? ¿Que hacer ante esto? Pues fácil. A tirar de introspección y a generar el código de los CodeObject encontrados.

Para generar el código sin tener que tocar decompyle, usé la siguiente función:



def decompile(codeObject):
"""
Método que realiza la decompilación
"""

# decompyle, funciona volcando a un archivo o a stdout.
# Para no modificar el código de decompyle, hemos hecho la ñapa
# de usar un fichero temporal.

code = None
fout = None
tmpFile = None
try:
try:
to_avoid = ['# local variables:','# tab-width:','# emacs-mode:'] # Esto lo genera decompile

tmpHandle,tmpFile = tempfile.mkstemp()
os.close(tmpHandle)
fout = open(tmpFile,"w+")
decompyle.decompyle("2.3", codeObject, fout, 0, 0)
fout.seek(0,0)
lines = []
for line in fout:
skip = False
for item in to_avoid:
if line.find(item) != -1:
skip = True
break
if not skip: lines.append(line)
code = "".join(lines)
except:
pass
finally:
# En python 2.3 el finally no se puede mezclar con un un 'try' normal
if fout is not None: fout.close()
if tmpFile is not None: os.remove(tmpFile)

return code




Mediante una lista de módulos a decompilar, y usando el módulo inspect, podemos llegar al código de las funciones, métodos.
El resto de código tendremos que generarlo nosotros (*1). Y aún así nunca podremos llegar a generar el código original, pero bueno... en plan de tener algo de documentación, pues bien está...

¿porque digo esto último? Porque al ir tirando de una lista de módulos que se van cargando, vamos a ir haciendo introspección de sus atributos: tipos basicos, módulos, clases....
En principio, el script que yo hice va dirigido por módulos, es decir, no va profundizando en los módulos, ya que no te puedes fiar, ya que los import, te van a generar un elemento en el espacio de nombres del módulo que estas analizando.

Otro ejemplo lo tenemos con las clases. Si tienemos un import tal que 'from mimodulo import clasecita', nos vamos a encontrar que 'clasecita' en el contexto de decompilación actual y vamos a intentar obtener su código, cuando dicha clase realmente está definida en otro módulo.

(*1) Toda la estructura de ficheros, clases, funciones, ... hay que generarla a pelo.

lunes, marzo 02, 2009

Decompilando built-ins

Si disponemos de código python 2.3 en principio, usando decompyle, es posible obtener el código fuente.
Pero... ¿que pasa si el código que queremos compilar es código python pero está embebido en el interprete que estamos usando? Pues que también podemos obtenerlo... Al menos de las funciones. Para ello necesitamos usar un módulo que acabo de descubrir, inspect.

Adjunto un ejemplo de como lo he usado, para decompilar el código de una función (en el ejemplo Document es un módulo built-in):

import inspect
import decompyle
import sys


#--- Módulo
#members = inspect.getmembers(Document)
#for member in members:
# print member

#--- Documento
d = Document.Document("a")
#members = inspect.getmembers(d)
#for member in members:
# print member

#--- Método => Función
#print "Método"
members = inspect.getmembers(d.SetLogger)
im_func = None
for member in members:
if member[0] == 'im_func':
im_func = member[1]

if im_func == None:
raise Exception,"No se ha podido obtener la función para el mètodo."


# Fúnción => Code Object
print "Función"
members = inspect.getmembers(im_func)
func_code = None
for member in members:
if member[0] == 'func_code':
func_code = member[1]


if func_code is None:
raise Exception,"No se ha podido obtener el 'code_object' para la función."

#print type(func_code)

decompyle.decompyle("2.3", func_code, sys.stdout, 0, 0)

jueves, febrero 26, 2009

Python decompile revisited

Ya escribí sobre esto. Aparte del servicio mencionado, se puede usar el módulo dis.
He visto que existe otro servicio para decompilar: DePython.
Y que el módulo antiguo también está en sourceforge: decompyle.

Sobre el script he leido:

"There used to be a module, decompyle, that decompiled .pyc files up to
version 2.2 of python. Decompyle for 2.3 is now a paid for web service and
the 2.2 decompyle seems to have been yanked."

Pero también:

"It will decompile Python up to version 2.3, but not 2.4+. "


¿Cual tendrá razón? Voy a probarlo yá!

viernes, febrero 06, 2009

Sniffing

Debido a la realización de un script, que estoy realizando para logarme a una web, me he visto obligado a usar un sniffer.
Desde mi navegador me conectaba sin problema, pero desde la maquina en la que estaba desarrollando no. Solución ver que mensajes HTTP se estaban enviando desde un sitio y desde otro.
Desde mi navagador (windows) usé wireshark, y desde la maquina linux (solo tengo acceso por consola) iba a usar tcpdump, con la intención de luego importar el fichero generado con wireshark.

Al final lo de tcpdump, no me hizo falta, ya que desde windows, vi que realmente la petición de login era un GET, en lugar de un POST (con datos ocultos) como estaba suponiendo.

Y hasta aqui la historia, el resto es comentar algún producto mas (que no he usado); siempre pensado en el analisis de HTTP.
  • httpfox: un addon para firefox para analizar el trafico http.
  • httpwatch: similar a httpfox Este también vale para IE. Tienen versión gratis, pero la completa es de pago.
  • webscarab: funciona como un proxy. Escrito en Java. Soport HTTP y HTTP. Ummm, no conocia el sitio donde está alojada OWASP. Habrá que echarle un ojo...
  • Para windows, hay una aplicación equivalente a tcpdump, windump. Usa winpcap que es el porting a windows de libpcap.
  • urlsnarf, de dsniff.
Ya sobre sniffing mas en general:

He visto que wireshark puede manerar estos tipos de ficheros: 5vw, acp, atc, bfr, cap, enc, erf, fdc, pcap, pkt, snoop, syc, tcp, tr1, trace, trc, wpc, wpz, rf5.

jueves, febrero 05, 2009

urllib2 a través de un proxy NTLM

Tenía pendiente desde hacía tiempo probar esto...
Pues bien, al menos hasta la versión que yo he usado (python 2.5) no es posible usar urllib2 con un proxy NTLM.

Ante esto tenemos dos opciones:
Lo deseable es que urllib2 al igual que tiene un ProxyBasicAuthHandler, tuviera uno para el protocolo NTLM.

Tanto para un caso como para el otro, tendremos que hacer que urllib2 no use el proxy por defecto. Un ejemplo:


proxy_support = urllib2.ProxyHandler({'http':'http://localhost:5555'})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)

[*] parece una chorrada esto que he dicho aquí, pero no lo es tanto. Normalmente en el trabajo los sysadmin no te darán la opción, pero... muchos de vosotros teneis maquinas de trabajo a las cuales si teneis acceso a través de SSH, y desde las cuales si teneis salida a internet. Pues bien... lo que se puede hacer es montar un tunel SSH y redirigir el trafico HTTP a través del tunel. Es decir... estais corriendo un proxy en local que redirige el tráfico a otra maquina.
Esto tiene la ventaja adicional de que el tráfico va encriptado.

miércoles, febrero 04, 2009

Cookies en python

Ando haciendo un servicio que hace uso de urllib2.
Sobre urllib2 recomendar este tutorial. Es realmente bueno; asi como los demas del mismo sitio.

Cuando abres una url, con urlopen, se hace uso de una serie de openers por defecto, entre los que no se encuentra el que maneja los cookies. Sobre este tema os recomiendo esta página.

Haciendo unas pruebecillas, sin usar HTTPCookieProcessor, obtenia las siguientes cabeceras en una respuesta:


Connection: close
Content-Length: 159
Via: 1.1 PUBLICO2
Date: Wed, 04 Feb 2009 15:42:11 GMT
Location: http://www.8a.nu/login/SessionTimeOut.aspx
Content-Type: text/html; charset=iso-8859-1
Server: Microsoft-IIS/6.0
Cache-Control: private
X-Powered-By: ASP.NET
X-Aspnet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=h5iruz45bl041xrvrhbn1tmk; path=/; HttpOnly


Como podeis ver, el cookie está al final. Pues bien, si incluimos el opener para el cookie, si imprimo de nuevo los headers, está información ha sido extraida. Y no sólo la del cookie, sino la 'Location'.


Connection: close
Content-Length: 1235
Via: 1.1 PUBLICO2
Date: Wed, 04 Feb 2009 15:42:11 GMT
Content-Type: text/html; charset=iso-8859-1
Server: Microsoft-IIS/6.0
Cache-Control: private
X-Powered-By: ASP.NET
X-Aspnet-Version: 2.0.50727


Estas trazas las he imprimido metiendo unas trazas en el método http_response de HTTPCookieProcessor:



def http_response(self, request, response):
self.cookiejar.extract_cookies(response, request)
return response


Lo mas estraño es que las trazas me salian un par de veces!!! La primera con la informacion sin eliminar, y la segunda con ella eliminada. No se el porqué.

Si queremos acceder a la información de los cookies, lo podemos hacer a traves de la instancia del cookie processor. Ejemplo:


cookieProcessor = urllib2.HTTPCookieProcessor()
urllib2.install_opener(urllib2.build_opener(cookieProcessor))
...
print cookieProcessor.cookiejar._cookies


_cookies es un diccionario, indexado por dominio. El valor es otro diccionario indexado por rutas.
Os muestro un ejemplo:


{'www.8a.nu': {'/': {'ASP.NET_SessionId': Cookie(version=0, name='ASP.NET_SessionId', value='1agr3qatdwhvin3en2d4ye45', port=None, port_specified=False, domain='www.8a.nu', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)}}}


La 'Location' que desaparece de los headers, se puede obtener con el método geturl de la respuesta. Ah! y los header con el método info.

Postada
Un tutorial que también recomiendo leer es el de Autentificación: Basic Authentication.

miércoles, enero 21, 2009

Probando Google App Engine

He colgado una aplicación superchorra en gae: myclimbinglog.

Me gustaría que evolucionara a algo mas... pero de momento para probar gae, me ha servido...
Pero he hecho uso muy básico. Tengo que profundizar en bastantes cosas.

Direcciones de interés:

De las últimas cosillas que he subido y metido ha sido el fichero favicon [utilidad] y el robots.txt.
Una vez que tienes la aplicación corriendo en local (con el SDK), para gestinar las actualizaciones, y alguna cosilla mas, se dispone del script appcfg.py.

Alguna cosilla mas que reseñar:
  • Me he encontrao un problema con el último despliegue, y es que he tenido que copiar el index.html de static/html a /. Cuando con el SDK me funcionaba sin problemas.
  • Los timestamps de los logs no están en la hora local. Es decir que hay un desfase de tiempo...
  • Y poco mas que contar... Me ha gustado la experiencia.
Para acabar algún link mas, de recursos necesarios:

martes, enero 20, 2009

viernes, enero 16, 2009

Recibir archivo, y devolver archivo procesado con GAE

Para probar Google App Engine, he hecho una aplicación bastante chorra: myclimbinglog.
El código está en google code.

Si, ya se que el diseño de la página es supercutre, pero ahora me interesaba probar la funcionalidad....
Como no desarrollador web que soy, la mayor duda era como enviar el archivo a procesar y el resultado.

Para enviarlo es muy sencillo:

.../...
form action="/process" enctype="multipart/form-data" method="post"
.../...
input name="file" type="file"
.../...


Para devolver el resultado...

En primer lugar indicar que el framework que se usa es webapp y se instala en (google_appengine/google/appengine/ext/webapp).
En el RequestHandle, vamos a tener un atributo de tipo Response.
Pues bien, la respuesta va a tener un atributo headers que es un diccionario. En él tendremos por defecto el siguiente valor:


self.headers['Content-Type'] = 'text/html; charset=utf-8'


Si no hacemso nada mas, podemos devolver el contenido procesado como html, tal que:


self.response.out.write(cgi.escape(bufferSalida))


Pero si queremos devolver el contenido con los correctos mimetypes (y que el browser los trae como tenga configurado, debemos hacer alto tal que):


self.response.headers['Content-Type'] = '%s; charset=utf-8' % str(tipo)
self.response.out.write(bufferSalida)


Donde tipo, será un mimetype ( 'text/xml', 'text/plain', 'text/csv', ...)

jueves, enero 15, 2009

Como no te puede convencer Scrum...

Desde no hace mucho sigo a Rodrigo Corral. Es un blog interesante a seguir si os interesa el scrum. Tiene bastantes post interesantes, como sobre estimación y gestión de proyectos.

A raiz de su último post sobre scrum, releí uno anterior, que recomiendo; por lo convincente que es para convencerte de una gran ventaja de usar scrum respecto a otras metodologías, la posibilidad de REALMENTE poder mostrar el avance de un proyecto.

miércoles, enero 14, 2009

Sobre web design - maximizando legilibilidad

En su último post, IB hace referencia a un par de páginas donde se dan unas claves para mejora la legibilidad de un site. Es decir... de un site, donde quieres primar la legibilidad del texto sobre el diseño mismo...

IB, sigue estas directrices, menos la de la anchura del texto. Pero lo argumenta. Las directrices serían:


  • 50% de la anchura
  • uns 15 palabras por linea
  • 100% font size (vamos... el tamaño por defecto)
  • aumentar la altura de la linea en un 140%
  • que haya contraste
Los articulos a los que hace referencia o relacionados:
Y hasta aquí sobre el tema de la legibilidad....



Sobre el tema de la topografía he repasado un par de temas que siempre se me olvidan: serif y sans-serif.
Como no podía dudar en la wikipedia en inglés hay un listado de los typefaces.

En imprenta serif se usa típicamente para el 'body' y sans-serif para los 'headlines'. La justificación es que serif, es mas legible.
En la escritura a mano, no se suele usar serif.
En pantallas, sans-serif es mas legible y da un look mas casual.



Unos enlaces sobre propiedades que dan legibilidad al texto:



Y para acabar una curiosidad... El hosting que usa Wilson Miner es WebFaction. Soportan django. Interesante!

jueves, enero 01, 2009

Primer post del año...

Publica JEllis sobre CouchDB. En el mismo artículo menciona los siguientes productos: