miércoles, diciembre 28, 2005

PyPy


Tras hacer una lectura rápida de PyPy Archichecture Overview, queria reseñar que:
  • Hacen uso de LLVM (Low Level Virtual Machine).
  • Uno de sus targets es Squeak. Una versión de Smalltalk 'Open Source'.
  • Usan Boehm-Demers-Weiser conservative garbage collector. Pero por lo visto la gestión de memoria se puede configurar para usar 'cuenteo de referencias' o no.
  • Actualmente es unas 10-20 veces mas lento que CPython.

Redirección 301


Según leo, parece ser que la redirección 301 sirve para mirar un sitio a otro (cambiar el home). Interesting...
Nuevo sitio dedicado a caza recompensas de proyectos [barrapunto.com]. Estaría bien que existiese algo así en España.
Indagando mas sobre la noticia de que Guido ha sido contratado por Google, he encontrado la noticia en Slashdot: Guido Goes Google; y en el grupo de python: comp.lang.python.

En algún comentario, aparte de mencionar algunas herramientas de python, mencionan PyPy, como el futuro de python. Entre las otras mencionadas estaban:

lunes, diciembre 26, 2005

Vaya, otro blog sobre buscadores: OJObuscador.

Mirando su contenido me he encontrado el notición: Guido van Rossum ha sido contratado por Google.
Un par de posts de Telendro:
A través del último artículo de Francis Pisani en el Ciberpais he llegado a Google Maps Mania.

miércoles, diciembre 21, 2005

martes, diciembre 20, 2005

¿Que es estar en un sandbox?


"Estar en un sandbox es que pasan de indexarte, o que te indexan la página de inicio y poco mas".
Via Telendro.

Microsoft Business Solutions Axapta



Axapta, es un ERP que ahora implanta mi empresa.
WordPress: la herramienta que usa Telendro para su blog.
Un par de noticias de barrapunto:
Habia oido hablar de ella, pero no la había visitado: TrabajoBasura.
Consejos para el diseño de newsletters.
Via Telendro.

lunes, diciembre 19, 2005

El blog del cheriff de fon: Martin Varsavsky.

Sobre Dominios


La lista de TLDs (o 'Top Level Domains').
El link anterior es del ICANN, pero buscando en google, aparecen varias páginas con mas información.

Como no, en la wikipedia hay una entrada al respecto.

Los dominios se dividen en los siguientes tipos:
  • Country Code Domains
  • Infraestructure Domain (.arpa)
  • Generic Domains (.aero, .biz, .com, .coop, .edu, .gov, .info, .int, .mil, .museum, .name, .net, .org, and .pro)
  • Top Level Domains
En el siguiente link de IANA, hay mas información sobre los diferenes tipos.
Ya para acabar, un link en el que se mencionan los nuevos dominos de segundo nivel disponibles para .es.
El Sr. Reina ,director de la oficina comercial de Google España, ha lanzado su segundo blog.
Via Telendro.
Seekbot, es un servicio de Seekport que analiza como de preparada está una página web para ser indexada por los buscadores.
De barrapunto: Tim Berners-Lee (el padre de la web) comienza un blog:
Hasta el momento de crear su blog, su 'blog' han sido la serie de articulos técnicos Design Issues for the WWW.

jueves, diciembre 15, 2005

Con google ahora puedes buscar musica (grupos, albunes...).
Por telendro.
Una lista de los dominios existentes.
Sitios web para alojar proyectos [barrapunto.com].

miércoles, diciembre 14, 2005

Unas noticias de barrapunto

martes, diciembre 13, 2005

Sobre rootkits


Comentan en barrapunto sobre rootkits. En wikipedia tenemos una entrada.

lunes, diciembre 12, 2005

Un gestor de contenidos, muy conocido: Documentum. Usa FAST.

Sobre buscadores


Se está confirmando; Telendro va a ser de visita obligada a diario. Tiene unos de post interesantes:

Un par de links de barrapunto:

sábado, diciembre 10, 2005

Acabo de meter un enlace a Telendro, en mi weblog. Es muy bueno su blog.
Acabo de mirarlo y se hace eco de la noticia de compra de del.icio.us, al igual que barrapunto.

También comenta sobre la nueva versión del algoritmo de google, Jagger.

Los posicionamiento cambian totalmente, y para mi para mejor (no por este blog).

jueves, diciembre 08, 2005

Google da miedo


Estos tios no paran de sacar cosas. Es que es casi a diario, esta vez se trata de Google Transit.

miércoles, diciembre 07, 2005

De barrapunto:

Habrá que mirar periódicamente el Telendro. Han clavado (ver comentarios) sobre lo noxtrum.
Pero claro, si comentá alguien de TPI... Un tal Jorge, y tiene el blog tocomocho.

Respecto a este blog. Cada vez hemos mas de menos el no tener categorias...., a ver si los de blogger se ponen las pilas.
..

martes, diciembre 06, 2005

Interesante página de msn me he encontrado: sandbox.
Voy a echar un vistazo a alguna cosilla de Microsoft...

Sobre buscadores


Uno muy interesante: Gigablast.
Habrá que estar al tanto de él. Es interesante la cantidad de servicios que ofrece.
Entre sus patners esta clusty.

viernes, diciembre 02, 2005

Buscando sobre Spam, me he encontrado (aunque ya me habían hablado de él) con SpamAssassin. Por lo visto es de lo mejor que hay por ahí para la detección de Spam en el correo.
Creo que usa reglas aparte de filtros Bayesianos (clasificación). Quizás se podría rascar algo para Web Spam, no lo se...

Buscando en sourceforge.net me he encontrado con SpamBayes. Está implementado en python. Está basado también en filtros Bayesianos. Hay info al restpecto de dichos filtros en la web.
Poco se ha tardado en saber que Noxtrum esta usando Ask Jeeves. Habrá que estar al tanto de Telendro.
En estos dos blogs también se habla de ello: Davilac y error500.

Comparativa de velocidad de RAID por Software en Linux.
En la siguiente página, se pueden ver los puertos que usa yahoo messenger.
Estos son:


Chat & Messenger TCP Port 5050: Client Access only
Insider/Room Lists TCP Port 80: Client Access only
File Transfer TCP Port 80: Server Access.
Your ISP may block this port, as its used for web hosting.
You can change port in Messenger, Preferences, File Transfer.
Voice Chat UDP 5000-5010
TCP 5000-5001: Client Access
If UDP Fails, TCP will be used instead, see below.
WebCam TCP Port 5100: Client Access
Super Webcam TCP Port 5100: Server Access
P2P Instant Messages TCP Port 5101: Server Access
PMs between Buddys may not use the Yahoo! Server,
but this is not a requirement.

jueves, diciembre 01, 2005

En relación a Noxtrum, interesante lo que dicen sobre futuros desarrollos de google para España [google.dirson.com].

Buscando en google por noxtrum, salen ya bastantes comentarios. Este post está bastante bien.
Un par mas:

Recall and precision


Estas dos medidas son claves en el mundillo de los buscadores para saber como de efectiva ha sido una busqueda. La siguiente pagina las describe muy bien.

Y en la siguiente página hay un estudio de como se comportan cinco buscadores con respecto al 'recall and precision'. Google sale muy bien parado.
Un buscador de información cientifica: scirus.
Un conjunto de referencias sobre Machine Learning for Spam Detection.
Sobre Firefox:
  • Ya salió Firefox 1.5.
  • Hay una extensión que es la caña: WebDeveloper. Es de probar: te muestra visualmente las celdas, los tamaños de la imagenes, ...
Y una noticia de hoy de barrapunto: ¿Qué solución de almacenamiento comprar?

Y un par de noticias que tenia por poner:

La noticia del lanzamiento de Noxtrum en barrapunto.

miércoles, noviembre 30, 2005

Rescato lo siguiente de otro blog (error al postear)...

Unas noticias de barrapunto:

Util para buscar articulos: citeseer.

martes, noviembre 29, 2005

Ya está online noXtrum.

Web spam


Una herramienta que analiza si una página usa técnicas consideradas como spam: Search Engine Spam Detector. Detectando las siguientes muchos trucos de los siguientes métodos:
  • keyword stuffing
  • doorway farms
  • text hiding
Para mas información ver su FAQ.

Y unos links de la wikipedia sobre el tema:
Y para acabar otro link muy interesante: Nigritude Ultramarine FAQ. Sobre todo el punto "What did Black Hat SEOs do to win the Nigritude Ultramarine contest?".

Python decompile


Para poder decompilar ficheros pyc tenemos dos opciones.
  • La primera es comercial: de crazy-compilers.
  • Y la segunda es una versión de para debian (o bsd). También disponible para python2.2.
    • Este versión creo que parte del mismo código que la versión comercial (no disponible como aplicación, sino como servicio). Al pasar a ser comercial hicieron una nueva rama de desarrollo.

lunes, noviembre 28, 2005

Temas laborables


Dejamos lo tecnico para meternos en lo laboral. Me han pasado una web muy buena: weblaboral.net.
En ésta página se indican unas cantidades a saber.

No, no voy a perder el curro ;).
Marc Najork, del grupo grupo web de Microsoft Research, tiene online alguna presentación y artículos sobre web spam.
Solo hay que buscar un poquito en google o en Microsoft Research.


Barrapunto viene gordito:

viernes, noviembre 25, 2005

Los tentáculos de Google [barrapunto.com].

miércoles, noviembre 23, 2005

lunes, noviembre 21, 2005

viernes, noviembre 18, 2005

miércoles, noviembre 16, 2005

Y venga... otro servicio de Google, Google Base [barrapunto.com].

martes, noviembre 15, 2005

Estos de google no paran: Google Analytics.

domingo, noviembre 13, 2005

Tras visitar la web [erdani.org] (por cierto ha cambiado de dominio) de Andrei Alexandrescu, veo que ha publicado un un nuevo libro junto a Herb Sutter: C++ Coding Standards.

martes, noviembre 08, 2005

Javier Pagés sigue activo, ahora veo que ha creado un nuevo portal, inforenses. Que bueno el nombre que ha pillado. Tambien existe inforense (sitio de criminalistica.net).
Veo también que Infoperitos, sigue funcionando.
Mirando los post de ésta noticia de barrapunto (sobre DNI electrónico), me he encontrado con el termino Trampa para canarios.
Singularity es un proyecto de OS de Microsoft Research. Mas info aquí [barrapunto]

lunes, noviembre 07, 2005

Dependecy Injection Pattern



Ya he podido echar un vistazo al articulo de Martin Fowler sobre el patrón Dependency Injection (DI).

Lo primero que hace es discutir del porque del nombre. Ya que se le estaba llamando de manera incorrecta Inversion of Control.
Posteriormente explica los tres tipos disponibles que hay:
  • Constructor Injection
  • Setter Injection
  • Interface Injection
Entrando a discutirlas con ejemplos concretos de frameworks: picocontainer, spring y avalon (dicho proyecto de apache ya no existe como tal; aunque tras su extinción han surgido varios proyectos derivados).

A continuación compara el patrón con el Service Locator.

Lo que se puede extraer del articulo:
  • Tanto el Service Locator como la DI son maneras válidas de separar la configuración del uso.
  • Si estamos realizando un servicio que va a ser usado en aplicaciones fuera de nuestro control, la DI tiene ventajas.
  • Entre los tipos de DI, recomienda la 'Constructor' y la 'Setter' en ese orden (la de interfaz es mas 'intrusivo').
Tanto picocontainer como spring soportan la constructor y la setter. El que un framework use la DI no quita a que pueda usar Locators (Avalon combina ambos).

El patrón no es nada sorprendente, pero como casi siempre en estos casos, lo que hace es poner nombre a soluciones que se estaban usando.

ipython


Ya comenté en un post anterior sobre ipython. Ya he podido echarle un vistazo...

La verdad es que existiendo, no le veo ninguna ventaja a seguir usando la shell por defecto.
Tras haberme leido la introducción mas recomendaba, y sin explorar todo lo que pueda ofrecer; simplemente por lo siguiente, ya merece la pena usalo:
  • Historia de comandos
  • Posibilidad de llamar a un editor externo.
  • Multiples profiles.
  • Uso de colores.
  • Posiblidad de ejecutar comandos del Sistema Operativo.
  • Logging.
  • Posibilidad de ejecutar scripts desde el interprete. Esto es especialmente util (comando 'run':
    • Podemos hacer que se ejecute el main o no
    • Que nos de estadisticas de tiempos
    • Usar el profiler
    • O el depurador
  • Definición de macros.
  • 'Tab Completion'.
  • Tener una shell embebida detro de un programa python.
Un par de enlaces para acabar:
Me comentan de Caspost, un servicio para meter audio y video en tu blog.
Mr. Hal, el otro dio me comentó sobre los siguientes servicios:
  • Writely. Para escribir documentos word en la red.
  • Workspot. Un linux en el browser.
  • delicious. Mantener bookmarks online.
Voy a probarlos... ¡ya!

miércoles, noviembre 02, 2005

Un libro sobre python que puede ser interesante (disponible online): Dive Into Python.

IDE´s para python



A través de Wing IDE he llegado a ésta página [spyced]donde comparan diferentes IDEs para python. Los editores comparados son:

No se han includo en la comparativa de de Jonathan Ellis los editores (aunque se mencionan):
Los comentarios son lectura interesante. En alguno ponen a SPE bastante bien, y hay alguna URL a otras reviews.

Hace poco JJ me comentó que hay algun apropuesta para que eclipse soporte python.

Encontrar cosas en la web


Es curioso como vas encontrando cosas en la web. He llegado a la web de spyced, y creo que es una web que volveré a mirar. Parece estar interesante.

Según veo en la web, hay un framework para embeber python en HTML, spyce.

El tio de spyced, Jonathan Ellis forma parte del Utah Python User Group.

Actualización

Mas editores:




Y una comparativa.

Morfeo


Que bueno, TID esta pasando algunos de sus productos a Software Libre, como TIDORB. El proyecto en cuestion se llama Morfeo.

Debugging in python



Aunque puede ser interesante generar trazas de nivel debug, devido a la velocidad del ciclo de desarrollo (codificar, probar, corregir, probar, ...) he encontrado que simplemente usando el comando print, se depuraba perfectamente. Una vez depurado el codigo se eliminan los print.

Eso hasta ahora. He estado probando una cosilla que me ha costado bastante de depurar, con lo cual me ha hecho plantearme el echarle un vistazo al debugger de python (pdb), y que productos hay adicionales, así como GUIs.

Sin embargo ésta es una mejor introducción.

Una herramienta que puede ser interesante de probar es iPython. Es una shell mejorada.

Haciendo una pequeña buqueda en google, con respecto a GUIs que den soporte a la depuración he encontrado:
  • winpdb, que se apoya en wxpython, que es un toolkit para desarrollo de aplicaciones gráficas con python.
  • Wing IDE [Wingwire.com]. El cual es un editor para python. ¿El problema? que no es de gratis.
Y de momento hasta aquí. Voy a trastear un poco con pdb...
[actualizacion]
He visto en la lista de python-es, en un comentario que recomendaban winpdb.
Herb Sutter ha puesto online un artículo que seguro que es muy interesante de leer, va de la revolución que va a ser la concurrencia para el software.

En su página web, ha puesto los videos de un par de conferencias. Seguro que son interesantes.

Unas noticias de barrapunto:

lunes, octubre 31, 2005

Unas noticias de barrapunto:
Me ha vuelto a hablar JJ maravillas de Spring. He estado echanvo un vistazo a un artículo, sobre él, pero requiere mas tiempo del que tengo ahora. Es un poco espeso.
Me quedo con dos conceptos que mencionan:
  • 'Inversion of Control' (IoC)
  • 'Dependency Injection' (a flavour of IoC)
Con lo cual al buscar en google, lo primero que me ha salido es un artículo de Martin Fowler, Inversion of Control Containers and the Dependency Injection pattern.

Mas info aquí.
Por lo visto Apache Excalibur lo usa.

La idea es del concepto es:

"That's the basic concept of Inversion of Control; you don't create your objects, you describe how they should be created. You don't directly connect your components and services together in code, you describe which services are needed by which components, and the container is responsible for hooking it all together. The container creates all the objects, wires them together by setting the necessary properties, and determines when methods are invoked."
He habían comentado que en developerWorks (de IBM), había bastantes artículos sobre python, y efectivamente así es. Como muestra un botón, unos articulos sobre:
Despues de mirar lo de python, me puse a navegar un poco por la red, encontrando un artículo sobre la Web Semántica en la seccion web.

viernes, octubre 28, 2005

Interné en España


Estaba terminando hoy de ojear el ciberpais. En uno de los articulos sobre el estado de internet en España, comparado con otros paises en europa he visto que sólo ganamos en:
  • bajar musica
  • publicar en weblogs
Unas noticias de barrapunto:

jueves, octubre 27, 2005

Parsers SAX de html en python


Incluidos en python tenemos dos posibles parsers a usar:

Actualmente estoy usando HTMLParser.HTMLParser. Un problema que tenemos con este parser es que necesitamos detectar correctamente los inicios y los fines de tags, y hay tags que a veces no traen el fin de tag. Para evitar esto, y teniendo en cuenta que estamos en una etapa del proyecto totalmente de desarrollo (avanzando en funcionalidad), solventamos el problema usando tidy y generado xhtml.

El problema de esta solución es que tidy incrementa bastante el tiempo de procesamiento. Esto, unido a la idea de que haya parsers que puedan procesar html de una manera mas robusta que HTMLParser.HTMLParser y sean mas rápidos (por ejemplo hechos en C) me llevó a mirar libxml2.
Lo bueno de libxml2 es que tiene bindings a python, con lo cual algo (no sencillo) que nos quitamos del medio. Además hay una librería ya mas 'python-oriented', lxml. El problema con lxml, es que no es SAX.

Aparte de libxml2, hay un par de parsers candidatos a usar que no he evaluado:
Según he leído, en principio el segundo puede ser mejor.

Sobre libxml2



Las primeras pruebas que he realizado con el parser SAX incluido en libxml2 han sido muy satisfactorias (unas 10 veces mas rápido que HTMLParser).
Pero necesito hacer mas pruebas, sobre todo con html mal formado.

Los mayores inconvenientes que le he encontrado son:
  • Falta de documentación.
  • No cubre todo el API de C.
  • Mas delicado de usar (tenemos que gestionar nosotros mismos la memoria)
Ya haciendo mis pruebas, lo que no he podido hacer es abortar el procesamiento de un documento.
Si el motivo por el cual queremos parar el parseo es porque nos hemos excedido del tiempo, la solución es meter el documento en porciones (es lo mas sensato además).
En caso contrario, pues es un problema que espero averiguar...

Para acabar adjunto un ejemplo que viene incluido con la distribución:


#!/usr/bin/python -u
import sys
import libxml2

# Memory debug specific
libxml2.debugMemory(1)

log = ""

class callback:
def startDocument(self):
global log
log = log + "startDocument:"

def endDocument(self):
global log
log = log + "endDocument:"

def startElement(self, tag, attrs):
global log
log = log + "startElement %s %s:" % (tag, attrs)

def endElement(self, tag):
global log
log = log + "endElement %s:" % (tag)

def characters(self, data):
global log
log = log + "characters: %s:" % (data)

def warning(self, msg):
global log
log = log + "warning: %s:" % (msg)

def error(self, msg):
global log
log = log + "error: %s:" % (msg)

def fatalError(self, msg):
global log
log = log + "fatalError: %s:" % (msg)

handler = callback()

ctxt = libxml2.htmlCreatePushParser(handler, "b">
ctxt.htmlParseChunk(chunk, len(chunk), 0)
chunk = "ar
"
ctxt.htmlParseChunk(chunk, len(chunk), 1)
ctxt=None

reference = """startDocument:startElement html None:startElement body None:startElement foo {'url': 'tst'}:error: Tag foo invalid
:characters: bar:endElement foo:endElement body:endElement html:endDocument:"""
if log != reference:
print "Error got: %s" % log
print "Exprected: %s" % reference
sys.exit(1)

# Memory debug specific
libxml2.cleanupParser()
if libxml2.debugMemory(1) == 0:
print "OK"
else:
print "Memory leak %d bytes" % (libxml2.debugMemory(1))
libxml2.dumpMemory()

koders: un buscador curioso, de código.

lunes, octubre 24, 2005

De WORD a XML y al reves


He encontrado un artículo al respecto, que lo confieso, no he leido.

Ojo con las trazas en python



En el proyecto que estoy actualmente hemos llegado a un punto en que lo que tenemos montado puede ser ya usado, funcionalmente. Pero nos quedaba una incógnita por resolver. ¿Es lo suficientemente rápido?

El sistema tiene que procesar documentos html, para lo cual en primer lugar usamos Tidy, luego se parsean, y los transformamos a nuestro formato interno.

El uso de Tidy es necesario ya que el parser de python (HTMLParser) no se traga cualquier cosa.

En un futuro seguramente usemos algún otro parser implementado en un lenguaje de mas bajo nivel y que valide, pero de momento el sistema actual nos ha servido para avanzar en el desarrollo.

Para la primera toma de tiempos usé simplemente la función time.time. Tomando tiempos con las trazas activadas y desactivadas. Mi sorpresa es que tidy no era lo que se llevaba mas tiempo (escribe el documento totalmente), sino que nuestra parte se llevaba mas.

Para seguir analizando, decidí usar el profiler de python, ya que nunca lo había usado.
La forma mas sencilla de uso es:



python profile.py <script> <args>



Su salida de texto, ya me sirvió para ver alguna cosilla sospechosa dentro del código (que no del parser).
De todas formas es mas potente usándolo dentro del código, ya que el fichero generado es binario:




import profile
profile.run(<funcion>,<fichero>)



Posteriormente a través del módulo pstats, se puede postprocesar:



import pstats
import sys

file = sys.argv[1]
p = pstats.Stats(file)
p.sort_stats('cumulative')
p.print_stats()



El profiler me orientó, sobre la zona del código con los problemas.
A partir de ahí usé una librería hecha a medida para la toma de tiempos. La ventaja de la librería sobre el profiler, es que el profiler te da el tiempo por llamada, y la librería de toma de tiempos te da mas libertad, ya que tu defines la porción de código que entra en la toma de tiempo.

Una vez tengamos este tipo de librería lo suyo es que dejemos el código instrumentado con ellas en sitios clave, y que mediante configuración podamos activar o desactivar la toma de tiempos.

Bueno que de desvío del tema... Con la librería vi que algo raro pasado. No era normal que una región de código que no hacía nada se llevase el tiempo que se estaba llevando. Hasta que me fijé en las dichosas trazas, que tenía desactivadas, y gualá. Di con el problema.

El problema de fondo es que vengo del desarrollo de C++ y allí normalmente cuando se desactivan las trazas, no se ejecuta ni la invocación.
Pero claro aquí estábamos con python, y con un recubrimiento del modulo de logging de python. La invocación ser realizaba, aunque la traza no se generase. Y lo que se estaba llevando el tiempo era la evaluación de los argumentos. Estaba pasando a string una estructura de datos bastante tocha.

Moraleja: ojito con la evaluación de los argumentos en las trazas.

De todas formas a posteriormente me he dado cuenta de que fui un gañán y que a veces no vemos lo que no queremos ver. Ya que en la salida del profiler salía que el logging era lo que se estaba llevando el tiempo. Pero claro como estaba desactivado el nivel DEBUG...

Diseño de librería de toma de tiempos



Continuando con este tema...

Como he indicado anteriormente la toma de tiempos se debe de poder activar y desactivar por configuración y a los tiempos se les asigna una marca o tag.

En el diseño original, la librería tenia dos métodos para una determinada marca; uno para el comienzo de toma de tiempo y otro para el final de toma de tiempo.
Esto tiene como problema el que se te puedan quedar marcas desbalanceadas.

Un diseño mejor, es que en lugar de definir un comienzo y fin de marca y se vayan acumulando los tiempos, lo que hagamos es para cada marca registrar el tiempo.
Una vez terminada la ejecución se pedirán los tiempos. Cuando se pidan los tiempos es cuando se calculan los acumulados. Para calcular los acumulados, será necesario indicar entre que marcas se van a hacer los cálculos.


viernes, octubre 21, 2005

Me ha comentado JJ que estan usando una Wiki, cuyo motor está en python, se trata de MoinMoin. En la wikipedia tienen hasta una entrada, sobre él.

En la wikipedia se puede seguir navegando sobre temas afines. Uno muy interesante es una comparación sobre 'wiki software'.

Según me comenta JJ, el mejor es MediaWiki.
Una noticia de barrapunto:

jueves, octubre 20, 2005

Ajax


Me ha extrañado que no hubiese escrito nada al respecto, ya que JJ me había comentado sobre ello. Ajax es una tecnología (o un conjungo) que usa entre otros google.
En el siguiente artículo dan una descripción muy clarita de él. El primer artículo sobre el mismo fue de un tal James Garret.

Según me comenta oreques, lo que no hay por ahí son muchos ejemplo disponibles (lo confieso, yo no he buscado), pero parece que ibm si tiene algo.
Me pasa my bro un proveedor de hosting que dice es interesante (no lo he mirado): bluehost.
Unas noticias de barrapunto:

lunes, octubre 17, 2005

Componentes electrónicos en madrid


Me han dicho que Conectrol es la caña (en Jorge Juan, al lado de Goya). Por lo visto tienen 2 tiendas (enfrente una de otra), una mas de informatica y otra de componentes electrónicos.

(1 día despues)

Antes de salir del curro me comentó JJ sobre Telkron, que me pilla mas cerca del curro, y como la otra, me pilla también de camino a casa (está en Avda. Donostiarra).
Me pasé por la primera y lo que buscaba lo tenían agotado, entonces probé con Conectrol. En la tienda de informatica si que lo tenían, pero como tenía que preguntar otra cosilla me fuí a la de electrónica. Vaya pasada....
Un par de noticias de barrapunto:

viernes, octubre 14, 2005

jueves, octubre 13, 2005

lunes, octubre 10, 2005

miércoles, octubre 05, 2005

Compilar codigo en python


Cuando se invoca a 'python' siempre se genera un fichero '.pyc', el cual contiene el bytecode correspondiente al codigo python. Este bytecode se ejecutará en la maquina virtual de python.

Si lo que queremos es generar el bytecode pero sin ejecutar, tenemos dos modulos que nos lo permiten: py_compile y compileall.

Ejecución dinamica en python


La funcion interna exec, nos permite ejecutar codigo python que obtenemos en tiempo de ejecución.
exec code[ in globals[,locals]]

code, puede ser una cadena, un fichero o bien un objeto compilado.
Hay otra función, rexec, que permite la ejecución en un entorno limitado (como en el caso de los Applets de Java).

Para compilar objetos podemos usar la función compile.

Y finalmente tenemos la función eval, que permite evaluar expresiones.

Mas información en la documentación de python.
El libreo de O'Really Python in a Nutshell, habla de exec en el punto 13.1 ('Dynamic Execution and the exec Statement') y en 13.2 sobre 'Restricted Execution'.
Barrapunto hoy viene cargadito:

martes, octubre 04, 2005

lunes, octubre 03, 2005

miércoles, septiembre 21, 2005

Una pagina de ayuda sobre adsl.
Una noticia de barrapunto:
Hay también otra noticia, de google. Casi no pasa un día de que no tengamos una noticia de google. Se están metiendo en multiples temas. La verdad es que es un poco preocupante, esto puede llegar a ser el monopolio del siglo. Desde luego si que han sido visionarios...
La misma noticia, en telecinco (un poco mas sensacionalista): El último reto de Google: una red wifi gratuita y arruinar a las telecos.

martes, septiembre 20, 2005

La 'machine' que tiene JJ para MP3, el HP140 de iriver.
Un posts de barrapunto:

Ver page rank


Para ver el page rank de una pagina, se puede hacer tal que:

http://rankwhere.com/google-page-rank.php?url=cesarob.blogspot.com


lunes, septiembre 19, 2005

Hacer un poll por correo


Tengo necesidad de hacer un poll o encuesta a través del correo. Por lo que ando a la búsqueda de algún sitio que me proporcione este servicio de forma gratuita.

En principio yahoo groups no me sirve, ya que te obliga a que los votantes, tengan cuenta de yahoo. Tengo que probar los grupos de google.

Buscando en la web, en desarrolloweb, me han orientado a elistas y egrupos. Habrá que probarlo también...
Unas noticias de barrapunto:

Y como siempre que estoy con JJ, sale alguna conversación técnica y de ella recursos de interés como (unos cuantos sobre persistencia de objetos):

viernes, septiembre 16, 2005

Hay una noticia en barrapunto sobre la profesión informática, que como siempre ha atraído la atención de muchos de nosotros. Ya tenia mas de 500 comentarios y el servidor de barrapunto esta caído, mientras escribo estas lineas. Supongo que por la cantidad de accesos que deben de estar teniendo.

Otras noticias de hoy:

jueves, septiembre 15, 2005

Sobre ADSL


Me han comentado que el ADSL de Jazztel es el mejor, si ellos te proveen el servicio directamente. Esto depende de las zonas. En caso de que su red no te llegue, lo harán con Telefónica.
Si eres afortunado, puedes tener hasta 4Mb.
Me han comentado también que en bandaancha hay mucha información interesante.
Por lo visto en la entrada de la toma telefónica en casa, hay como unas cucarachitas que limitan mucho la velocidad, lo suyo es cambiarlas por jumpers (de los del ordenador).
En bandaancha seguro dicen algo al respecto...

miércoles, septiembre 14, 2005

Unas noticias de barrapunto


Búsquedas en blogs



La noticia anterior sobre google es para mi una gran noticia, ya que era algo que estaba echando mucho de menos.
De hecho ya mi blog personal esta indexado. Este parece que no. Tendré que echarle un vistazo...
Ahora solo me queda que modificar la template para poder buscar en él. ¡Genial!
Yo podía buscar, cosa que hago a menudo, cuando estaba logado en blogger pero ahora se abre el campo a posibles visitantes.
Aprovechando la noticia he estado echando un vistazo a technorati. Está bien. Ya tienen mi blog personal, y supongo que este en breve...

Con blogger los pings de notificación los reciben, en caso contrario lo puedes hacer manualmente mediante un ping. O bien puedes consultar como hacerlo aquí.

Ah! la direccion para buscar en google es blogsearch.google.com.

martes, septiembre 13, 2005

lunes, septiembre 12, 2005

Compiladores e interpretes


El tema surgió con una discusión amigable con Hector. Según el:
  • Un compilador traducía de un lenguaje a otro.
  • Un interprete ejecutaba con sólo una pasada (el código)

Según yo:
  • El compilador traducía, pero de un lenguaje a lenguaje maquina.
  • El interprete no tiene porque dar una sola pasada.
Mirando en la wikipedia las definiciones de compilador e interprete (o las mas completas de la edición inglesa: compiler y interpreter), la cosa no queda clara. Se inclinaba mas a lo que decía Hector; pero esas definiciones tienen contradicciones.
Por lo tanto decidimos tomar como referencia lo de la asignatura que tuvimos en cuarto de carrera de Ingeniería Informática, Procesadores del Lenguaje. Según un cuaderno técnico que yo tenía(Conceptos básicos de traductores, compiladores e interpretes. Juan Manuel Cueva Lovelle. 3ª Edición, Octubre 1992. Cuadernos Didácticos de la Universidad de Oviedo.):

  • Traductor: programa que procesa un texto fuente y genera un texto objeto. El traductor está escrito en un lenguaje de implementación (LI). El texto fuente esta escrito en un lenguaje fuente (LF). El texto objeto está escrito en un lenguaje objeto (LO).

  • Ensamblador: Traductor cuyo LF es el lenguaje ‘ensamblador’ y el LO es el ‘lenguaje maquina’.

  • Compilador: Traductor que transforma textos fuente de lenguajes de alto nivel a lenguaje maquina o a lenguaje ensamblador.

  • Interprete: Traduce el texto fuente simultáneamente a su ejecución, coexistiendo en memoria el programa fuente y el programa intérprete. La compilación ocurre en tiempo de ejecución.


Según uno de Hector (Una Edición posterior: Conceptos básicos de traductores, compiladores e interpretes. Juan Manuel Cueva Lovelle. 4ª Edición, Diciembre 1994. Cuadernos Didácticos de la Universidad de Oviedo):

  • Compilador (Página 10): Traductor que transforma textos fuente de lenguajes de alto nivel a lenguajes de bajo nivel.

Según estas definiciones en lo del interprete yo tenía razón, y en lo del compilador, realmente ni él ni yo (exactamente).
Han publicado un tutorial sobre Python 2.4 en Español.

domingo, septiembre 11, 2005

Esta vez va de HW

Desde que quise tener un reproductor de MP3 de los pequeñitos (descartamos tipo ipod y rivales, con HD y mas pesados), mis requisitos siempre fueron, el tener radio FM y poder grabar de la radio.
Ahora mismo ya voy por mi segundo reproductor. Con esta experiencia añadiria los siguientes requisitos: al menos 512 MB, USB 2.0, bateria de litio.

Tras tener un primer reproductor con baterias AAA, decidí que el segundo fuera con batería interna de litio, ya que lo de andar recargando las baterias AAA, se me hacía un poco coñazo.
Otro de los motivos que motivaron el cambio fue el que cuando quería grabar de la radio (directamente a MP3) las baterías se fundian. Vamos el cacharrito se las merendaba a una velocidad...


A diferencia del primero el segundo graba en formato WAV. Esto tiene la pega de que las canciones no estan comprimidas (si usas encoding PCM).

Aparte de esto el primero tenia un problema de usabilidad con la radio, y es que no guardaba tras apagarlo la emisora que habias estado escuchando por ultima vez, ni podias tener sintonias grabadas (presintonias). Eso si, la usabilidad del aparato es mejor que la del segundo.

Aparte de mi reproductor MP3 he podido probar otro de características similares. En ambos ocurren un par de cosas que no me gustan nada nada:

  • Al conectar el reproductor al cable USB del ordenador, no puedes usarlo. Vamos que no lo puedes estar cargando a la vez que lo usas (si lo conectas a AC tampoco).
  • No te indica cuando se ha terminado de cargar la bateria.
A la hora de comprar uno de estos aparatitos me he encontrado con un problema, y es que cuando estas en las tiendas mirando las características que suelen, estas son muy genéricas (e incluso pueden estar equivocadas), con lo cual lo mejor una visto un modelo, lo mejor sería mirar la caja. Pero ni con esas... en la caja los fabricantes tampoco te dan toda la información necesaria. Un paso mas sería mirar el manual del reproductor, o mejor aun probarlo.

En fin, tras mi experiencia puedo concluir que para comprar uno de estos cacharritos, lo mejor es probarlo con manual en mano. La proxima vez que vaya a cambiar esta será mi premisa. El establecimiento me deberá dejar. O bien compraré algo que sepa que está bien a ciencia cierta.

Bueno, para acabar los modelos que han paso por mis manos han sido:

  • DENVER mp-111 (128 Mb): El primerito.
    • Muy buena usabilidad.
    • Baterias AAA. No incluidas.
    • USB 1.1
    • Grabación directa a MP3.
    • Buena documentación

  • MxOnda mx-mp5794fm (512 Mb). El mio.
    • Mala usabilidad.
    • Bateria interna de litio. Carga a USB y AC.
    • USB 2.0.
    • Grabación a WAV (32 Khz). Aparte del encoding a PCM soporta otros, que comprimen, pero la calidad es peor.
    • Calidad de la documentación intermedia.
    • No tiene mucha facilidad para usar la radio sin ser en modo de presintonias. Pero hay truquis (El pero es que en el modo search no puedes cambiar el volumen. Vamos que esta mas pensado para presintonias. Una forma facil de solventar esto es usar una presintonia para tener en ella la emisora que quieras y lo vas cambiando.)
    • Pantalla a color

  • RIMAX USBeat 323 (512 Mb). Otro que he probado.
    • Usabilidad intermedia.
    • Bateria interna de Litio. Carga a USB y adaptador para AC.
    • No se que version de USB tiene.
    • Grabación a WAV (32 Khz).
    • Documentación poble.
    • No trae para colgarlo. ¡Hay que ser cutre!
    • La radio muy buena usabilidad (busqueda manual, automatica y presiontonias)), pero la calidad de sintonia, me pareció peor que con los otros modelos.




Mediamark


La verdad es que en mediamark a veces tienen unos precios...
  • Un HD TrekStor externo (USB 2.0) de 200 GB por 99 euros.
  • Un reproductor MP3/FM de 512 Mb y batería de litio por 69 leuros (Inovix IMP 36 512). Eso si, no se si graba voz.
  • Y ya la caña, un reproductor de DVD por 29 leuros (soportando DIV-X)
Lo que si que es cierto, es que por ejemplo en Salamanca (las ofertas anteriores) las ofertas son diferentes que en Madrid. De hecho son mejores.

miércoles, septiembre 07, 2005

Optimizaciones en python


Me han pasado hoy un extracto del libro 'Python in a Nutshell', sobre optimizaciones.
Hay sobre todo dos que son muy interesantes:

Expandiendo Listas
Es posible mejorar el rendimiento si sabemos a priori el tamaño que va a alcanzar la lista, reservando el espacio de la siguiente manera, result=[None]*N. Posteriormente accederemos a cada posición con el operador [].

Expandiendo Cadenas
La idea es en lugar de hacer appends, ir metiendo los elementos en una lista y luego pasarlos a la cadena.

big_string = ''.join(temp_list)

Indican también otra forma O(N) de crear cadenas concatenando las piezas a una instancia de un array.array('c'), o escribiendo las piezas a una instancia de cStringIO.StringIO.

Otra optimización, pero menos importante es hacer uso del operador %. Ejemplo:

oneway = str(x)+' eggs and '+str(y)+' slices of '+k+' ham'
another = '%s eggs and %s slices of %s ham' % (x, y, k)

Pruebas
He estado haciendo unas pruebas sobre las difefentes formas de concatenar cadenas:



from time import time
tini = time()

#----- 0.016
#s = ''
#for i in range(10000):
# s += ' '
#----- 0.006
#l = []
#for i in range(10000):
# l.append(' ')
#s = ''.join(l)
#----- 0.004
#l = [None] * 10000
#for i in range(10000):
# l[i] = ' '
#s = ''.join(l)
#----- 0.007
#import array
#a = array.array('c')
#for i in range(10000):
# a.append(' ')
#s = str(a)
#----- 0.008
#import cStringIO
#io = cStringIO.StringIO()
#for i in range(10000):
# io.write(' ')
#io.seek(0)
#s = io.read()
#----- 0.021
#x = "1"
#y = "2"
#k = "3"
#for i in range(10000):
# oneway = str(x)+' eggs and '+str(y)+' slices of '+k+' ham'
#----- 0.011
#x = "1"
#y = "2"
#k = "3"
#for i in range(10000):
# another = '%s eggs and %s slices of %s ham' % (x, y, k)
#-----

tfin = time()

print (tfin - tini)





Esta aplicación parece ser interesante: VLC - the cross-platform media player and streaming server.

martes, septiembre 06, 2005

Unas noticias de barrapunto:

Y de SlashDot:

domingo, septiembre 04, 2005

La coctelera


Mirando un blog he estado echando un vistazo al sitio de publicación La coctelera. Estas son mis observaciones.
A favor:
  • Esta muy bien el que puedas buscar. Cosa que blogger ahora mismo no tiene.
  • Puedes meter categorías.
  • Se puede cambiar la apariencia
  • Pueden contactar contigo anónimamente
  • Te puedes sindicar
  • Puedes tener una seccion de enlaces
  • Puedes subir archivos de hasta un mega.

En contra:

  • No puedes desactivar los comentarios
  • No se el espacio que te dan
  • No puedes cambiar el sitio de publicación (ni puedes publicar por ftp a un site diferente de los 2 que ellos te ofrecen)

Concluyendo: Una muy buena alternativa a blogger, aunque sería deseable mas flexibilidad en el formato.

Y es que me estoy planteando migrar de blogger, ya ahora no puedo buscar en mis entradas, y para mi es fundamental. No se si será un cambio temporal o definitivo....

gmail


Son la caña los tios de google. Como no, tienes una opción de bajarte todos los archivos adjuntos a un documento, ¿pues no van los tios y ya te crean un zip?

lunes, agosto 29, 2005

Un link interesante sobre matemáticas, MathWorld.
Una noticia de barrapunto y un post de mi interés:

Este finde hablando con JJ, me comentó sobre POJO. Un par de links relacionados:

miércoles, agosto 24, 2005

Hoy hay un par de noticias sobre google e IM:
Habrá que probarlo.

martes, agosto 23, 2005

Inclusión mutua de módulos en python



Pensando en un desarrollo que voy a iniciar, me dí cuenta que podía tener una inclusión mutua de módulos, y como no tenía claro como se comporta python, decidí probarlo con:


# A.py
from B import B

class R:
def __str__(self):
return "hello world"

if (__name__ == "__main__"):
b = B()
b.r = R()
print "b: ",b



from A import R
class B:

def __init__(self):
self.r = R()

def __str__(self):
s = str(self.r)
return s


Dándome el error que comento en este post [comp.lang.python].
El post lo puse cuando no había encontrado nada sobre el problema, luego buscando mas correctamente me encontré un post en los grupos. De hecho hay varios, buscando por 'mutual'
Y una entrada en la faq de python.
En una respuesta del post me pasaron este link.

Y volviendo al problema...

Al ser python un lenguaje interpretado, es muy posible que realmente no sea necesario hacer el import (como va a ser mi caso). El tipo del objeto definido en 'A' y que usará 'B', se determinará en tiempo de ejecución. Una mente acostumbrada a lenguajes compilados, como la mía, no cayó en esto.

De todas formas, siempre estaría la solución de refactorizar el código (la que mas me gusta personalmente), o bien hacer el import dentro de un método o función (lo he probado y funciona).

Para acabar, muestro el código final, sin necesidad del import:


# A.py
from B import B

class R:
def __str__(self):
return "hello world"

if (__name__ == "__main__"):
b = B()
b.r = R()
print "b: ",b




# B.py
class B:

def __init__(self):
self.r = None

def __str__(self):
s = str(self.r)
return s

lunes, agosto 22, 2005

Me pasa Hector un link sobre como acelerar eMule.

Un par de noticias de barrapunto:

viernes, agosto 19, 2005

Sobre pythfilter.py

Hace ya tiempo comenté ([1],[2])sobre este filtro python para convertir código python a esqueletos en C++. La utilidad del mismo es para luego poder usar doxygen.

Lo estoy echando un vistazo con mas detalle, y seguramente le meta mano, para poder incluir en la documentación los atributos de las clases.

De momento quería añadir unos detalles:

  • La opción -f se usa para filtrar simplemente un fichero. El uso normal será usarlo con dos argumentos, el directorio origen y el destino. Usándolo de este modo, el mismo se invoca recursivamente con la opción -f, con lo cual es necesario que python este en el path.
  • Si posteriormente queremos usar doxygen, los diagramas de colaboración estarán incompletos, por no tener los miembros generados
  • Con los diagramas de herencia cuando heredemos de clases que no estén en nuestro paquete, tampoco saldrán, a no ser que hagamos que doxygen sea capaz de localizar sus esqueletos de C++. Con clases internas de python, como no se necesita hacer imports, habrá que hacer algún tipo de procesamiento, para incluir en los ficheros que nos interesen una referencia a algún fichero en el cual tengamos las declaraciones que nos interesen.
Pythfilter usa el modulo tokenizer. En esta página hay un par de ejemplos majos.
Contenidos Web 2.0 en Español [barrapunto.com]

jueves, agosto 18, 2005

martes, agosto 16, 2005

Python, xml y unicode


Sobre este tema hace unos dias puse un par de links. Ya he tenido tiempo de leerlos y son recomendables.

De el Python Unicode Tutorial esta interesante el ejemplo de recoder de latin-1 a utf-8:



import codecs
#Encoding / decoding functions

def encode(latin1_data):
return unicode(latin1_data,'latin-1').encode('utf-8'),len(latin1_data)

def decode(utf8_data):
return unicode(utf8_data,'utf-8').encode('latin-1'),len(utf8_data)

#StreamCodecs

class Codec(codecs.Codec):
def encode(self,latin1_data):
return encode(latin1_data)
def decode(self,utf8_data):
return decode(utf8_data)

class StreamWriter(Codec,codecs.StreamWriter):
pass

class StreamReader(Codec,codecs.StreamReader):
pass

#Codec registry entry point

def getregntry():
return(encode,decode,StreamReader,StreamWriter)



Y aquí podemos ver un ejemplo de uso.

Con respecto al default encoding de unicode, parece que en sys puede existir, o en algún momento ha existido la función setdefaultencoding. Pero al menos en mi distribución no viene.
De todas formas si queremos probar a cambiar el encoding por defecto, lo que podemos hacer es cambiar el valor de la variable encoding de site.py.
Un par de noticias de barrapunto:

viernes, agosto 12, 2005

Generating DOM Magic


Tenia pendiente echar un vistazo a este artículo de Uche Ogbuji.

El artículo en si está interesante, ya que muestra varias rutinas que trabajan sobre un árbol XML.
Las rutinas se centran en el uso de generators, y los comparan con el uso de recursión y xpath.
La técnica mas lenta es usando xpath. Es bueno saberlo.
Entre generators y el uso de recursión están ahí ahí, pero claro, con la prueba realizada. Con otros ejemplos posiblemente se incremente la diferencia a favor de los generators.

¡Ah! los generators por lo visto también son mas eficientes que los iterators.

Pero lo mas interesante del articulo, es que muestra enlaces a una serie de temas en python de los cuales no tenía constancia, y que pueden ser englobados dentro de Stackless Python. Dentro de stackless python tenemos por ejemplo: continuations, generators y microthreads (o coroutines).

Para finalizar unos links a unos artículos:
Ya comenté sobre Python Pitfalls en otro post. Dos articulos relacionados son:

Y para acabar un libro online sobre Python, Python Languaje Reference Manual.

Static Local Variables in Python


Pues eso variables estaticas locales en Python, con un ejemplo:

>>> def foo(v=[1]):
... print v[0],
... v[0] += 1
...
>>> foo()
1
>>> foo()
2
>>> foo()
3


Tengo que echar un vistazo a FreeMind, una aplicación para representar mapas mentales.
A ver si me animo esta tarde...
También tengo que echar un vistazo a la licencia Copyleft. Unos enlaces al respecto:

jueves, agosto 11, 2005

Guide to Python introspection.

Python y XML


Desde luego esta es la columna sobre Python y XML.
Los dos ultimos articulos que he estado ojeando:
El autor de la columna es Uche Ogbuji. Es el fundador de Fouthought empresa que desarrolla 4suite.
Dentro de 4Suite esta Domlettes, una implementacion DOM muy ligera. Dentro de Domlletes tenemos FtMinidom:

FtMiniDom - available only in 4Suite 0.12.0a1 through 1.0a4, FtMiniDom is identical to cDomlette, but is implemented completely in Python. In most cases, it uses your platform's PyExpat to do the XML parsing. FtMiniDom is very much like the xml.dom.minidom that comes with Python and the xml.dom.minidom replacement that comes with PyXML, but it does have some differences and added features. You can force the use of FtMiniDom by setting USE_MINIDOM=1 in your environment before importing Ft.Xml.Domlette.


Para acabar un par de enlaces mas:



miércoles, agosto 10, 2005

De HTML a XML con python


Ya hace tiempo, estuve mirando algun enlace al respecto, ya que intuía que me iba a tocar trastear con estos temas.
De nuevo me he encontrado con el siguiente articulo 'Wrestling HTML'. Es bueno, te cuenta lo que tienes que hacer para pasar de html a xml usando varias posibles herramientas. Menciona en el articulo tanto uTidyLib, como libxml2 HTMLParser.

El mismo autor tiene otro articulo sobre eluso de libxml.

Y para acabar este post unos links mas:

Pyrex


¡¡¡Redios!!! La de cosas que hay por ahí, relacionadas con Python. Me acabo de encontrar con Pyrex, según comentan en la introducción, se trata de un lenguaje para extender python, de manera que podamos mezclar codigo python con tipos de C.

Se ve que lxml lo usa.

DOM Parser


Voy a ver si hoy pruebo un parser DOM. El candidato va a ser libxml2, el cual es un parser para C, pero que tiene bindings para python.
Por lo que he podido leer, no es muy recomendable su uso, de ahí que vaya a usar lxml.

Ya para acabar, lxml usa como API el modulo ElementTree. Parece muy util, para ser usado, incluso sin usar un parser DOM.

lunes, agosto 08, 2005

Tidy



Tidy es una herramienta muy util para evitar errores de parseo usando parsers html, ya que 'corrige' el html.
Para usarlo dese python, he encontrado dos librerias:

El segundo (el unico que he probado) requiere:

  • tener instalado tidylib.
  • y tener instalado ctypes.