Han sacado una herramienta visual para MySQL: MySQL Workbench (vía barrapunto).
jueves, abril 27, 2006
miércoles, abril 26, 2006
lunes, abril 24, 2006
jueves, abril 20, 2006
martes, abril 18, 2006
Qué importa que se invierta en tecnología si fallamos por la base [lcomerciodigital.com] por Xabier García Pañeda.
jueves, abril 06, 2006
Microsoft investigando sobre el Spam.
Alguno de los articulos referenciados, ya los había incluido en este blog.
Alguno de los articulos referenciados, ya los había incluido en este blog.
miércoles, abril 05, 2006
A raiz del la polemica sobre el tipo de letra Segoe [barrapunto.com] , he encontrado este link: comp.fonts FAQ.
Más sobre la polémica en Slashdot.
Hay bastante info en la wikipedia sobre 'Typefaces'. Unos links:
Más sobre la polémica en Slashdot.
Hay bastante info en la wikipedia sobre 'Typefaces'. Unos links:
martes, abril 04, 2006
lunes, abril 03, 2006
viernes, marzo 31, 2006
Psyco
Ha llegado la hora de progra Psyco.
Aquí hay una presentacion.
Y aquí unos ejemplos sencillos para empezar.
La instalación como todo lo de python, trivial.
Y tras unas primeras pruebas, usando el psyco.full() he visto que si optimiza, si. Tanto usando la opción -O como sin ella. El -O también ayuda (el fichero generado en lugar de .pyc es .pyo; curioso).
jueves, marzo 30, 2006
miércoles, marzo 29, 2006
Interesante entrevista a Stratton Sclavos, presidente de Verisign, donde habla de VIP (Verisign Identity Protection), un sistema de autentificación global.
Menciona también el concepto de Pharming, una técnica de fraude que es realmente muy peligrosa.
Menciona también el concepto de Pharming, una técnica de fraude que es realmente muy peligrosa.
martes, marzo 28, 2006
Python Remote Objects
Pyro, parece interesante para programar objetos Python distribuidos de una manera sencilla.
En Spyron.org aparte de SPyRO(Simple Python Remote Objects) tienen también SPyDI (simple Python Distribute Indexing).
viernes, marzo 24, 2006
martes, marzo 21, 2006
Unas noticias de barrapunto:
- Programadores matando dragones. Está gracioso. En meneame sobre python:
- "Python lo mata en dos o tres lineas después de instalar un módulo para matar dragones. Igualito que perl."
- The Economist analiza el modelo de fuente abierta.
viernes, marzo 17, 2006
Python y UML
Un par de noticias al respecto:
- Doxygen ya soporta python
- Me comentan de una herramienta que no tenía controlada: pyUT.
martes, marzo 14, 2006
lunes, marzo 13, 2006
viernes, marzo 10, 2006
Python muda de piel
Vía barrapunto, me entero de que python tiene una nueva web.
Han cambiado incluso el logo del lenguaje. Todo ahora es mas serio.
Y un link de regalo: Python Cheese Shop.
martes, marzo 07, 2006
viernes, marzo 03, 2006
jueves, marzo 02, 2006
Georeferencias: almacenamiento
Hoy he leido un thread interesante en python-es. Va sobre el almacenaciento de georeferencias en una BD.
Quien pregunta parece que de momento está usando Berkeley BD. Comenta tb. que opción muy rapida de acceso es usar la estructura de directorios (aunque tiene sus desventajas). Por ejemplo para acceder a 1000, irias a 1/0/0/0.record (vamos como los indices de FAST).
En python se accede a dicha BD a través del módulo bsddb. Los creadores de la BDB son Sleepycat Software (adquiridos por Oracle).
Los difefentes métodos que acceso que soporta la BD son:
- Hash
- BTree
- Recno
- Queue
Otro producto que mencionan es pytables. Adjunto un comentario de Francesc Altet (de carabos, la empresa creadora):
"Pues aunque PyTables no es puro Python (si quieres velocidades altas de I/O casi siempre has de ir a parar a hacer extensiones en C), si que es multiplataforma (ha sido probado en Windows, MacOSX, GNU/Linux FreeBSD y múltiples Unix más). El acceso a los datos se hace a través de arboles binarios (a nivel de la libreria HDF5 de la cual depende), con lo que el acceso a los registros es muy rápido.
Ademés, PyTables suporta indexación de columnas.
Respecto a la limitación en la cantidad de recursos usados, PyTables está diseñado para trabajar perfectamente con tablas de más de mil millones de filas en entornos de memoria realistas, así que con tablas del orden de millones, no deberías de tener problemas.
Además, PyTables usa objetos numarray como contenedores de datos, con lo que el consumo de memoria se hace óptimo, especialmente cuando quieres mantener gran cantidad de información. Finalmente, PyTables también soporta compresión de datos transparente, con lo que puedes mantener tus bases de datos comprimidas y leerlas sin necesidad de que
ocupen más espacio del necesario.
Para ejemplos de cómo funciona PyTables te recomiendo que le eches un vistazo a los tutoriales que vienen en la documentación:
http://pytables.sourceforge.net/html-doc/usersguide3.html
Aunque, naturalmente, lo mejor es que lo descargues y lo pruebes por tí mismo. Así te aseguras de que no te están vendiendo la moto ;-)"
Y ya para acabar... gadfly: que es una base de datos relacional implementada en python basada en SQL.
Concluyendo.... un thread de muy interesante lectura.
Actualización
Unos links:
Actualización 2
El thread ha continuado algo (los archivos de la lista aquí).
"Pues aunque PyTables no es puro Python (si quieres velocidades altas de I/O casi siempre has de ir a parar a hacer extensiones en C), si que es multiplataforma (ha sido probado en Windows, MacOSX, GNU/Linux FreeBSD y múltiples Unix más). El acceso a los datos se hace a través de arboles binarios (a nivel de la libreria HDF5 de la cual depende), con lo que el acceso a los registros es muy rápido.
Ademés, PyTables suporta indexación de columnas.
Respecto a la limitación en la cantidad de recursos usados, PyTables está diseñado para trabajar perfectamente con tablas de más de mil millones de filas en entornos de memoria realistas, así que con tablas del orden de millones, no deberías de tener problemas.
Además, PyTables usa objetos numarray como contenedores de datos, con lo que el consumo de memoria se hace óptimo, especialmente cuando quieres mantener gran cantidad de información. Finalmente, PyTables también soporta compresión de datos transparente, con lo que puedes mantener tus bases de datos comprimidas y leerlas sin necesidad de que
ocupen más espacio del necesario.
Para ejemplos de cómo funciona PyTables te recomiendo que le eches un vistazo a los tutoriales que vienen en la documentación:
http://pytables.sourceforge.net/html-doc/usersguide3.html
Aunque, naturalmente, lo mejor es que lo descargues y lo pruebes por tí mismo. Así te aseguras de que no te están vendiendo la moto ;-)"
Y ya para acabar... gadfly: que es una base de datos relacional implementada en python basada en SQL.
Concluyendo.... un thread de muy interesante lectura.
Actualización
Unos links:
Actualización 2
El thread ha continuado algo (los archivos de la lista aquí).
miércoles, marzo 01, 2006
Está guapo: Visualizador del funcionamiento de las expresiones regulares.
Y otro link relacionado: Regular Expression Online Tester.
Y aprovechando el tema, no esta por demas recordar que para python tenemos a Kodos.
Y otro link relacionado: Regular Expression Online Tester.
Y aprovechando el tema, no esta por demas recordar que para python tenemos a Kodos.
lunes, febrero 27, 2006
Más sobre la función timeit
Por Alvaro en el foro python-es en respuesta a "¿El método que acabas de mostrar para medir tiempos se podría hacer con un conjunto de instrucciones y funciones?":
Si viejo. Por ejemplo
Pero eso no seria muy inteligente ya que timeit tambien mediria cuanto se demora en definir la funcion, y eso no es lo que uno quiere.
Por ultimo la funcion timeit tiene un defecto. De que los datos que muestra no son los reales. Lo que hace la clase Timer es simplemente ejecuta una ves lo que le pases como 2do argumento y luego ejecuta un millon de veces (no me acuerdo si es un millon o solo mil veces) lo que le pases como primer argumento, sacando un promedio de cuanto se demoro cada ves que ejecuto el primer argumento. Pero el promedio que saca es cuando "se ejecutan el argumento muchas veces seguido" o dicho de otra forma, con gran estress. Asi que no hay que decir la funcion se demora en ejecutarce 0.55 seg, sino que hay que decir, bajo estress la funcion se demora 0.55 seg.
Para ser mas exactos es mejor no considerar a la funcion timeit como una funcion que mide el tiempo de ejecucion de algo, sino como algo que cuantifique el coste de ejecución de algo y que solo es valido cuando se compara con otra cosa (como por ejemplo cuando comparamos la ejecucion del len con distintos largos de string). Si esto se puede complementar con un
test de hipotesis de comparacion de medias, ideal....
Si viejo. Por ejemplo
Tambien podrias incluir dentro de la variable x la definición de la funcion.
X="""
x=4
y=5
z=x*y
"""
from timeit import Timer
Print Timer(X).timeit()
Eso si... Si quieres evaluar el desempeño de una funcion, por ejemplo una
funcion cuadrado te recomiendo:
from timeit import Timer
x="cuadrado(5)"
y="""
def cuadrado(x):
return x*x
"""
print Timer(x,y).timeit()
Pero eso no seria muy inteligente ya que timeit tambien mediria cuanto se demora en definir la funcion, y eso no es lo que uno quiere.
Por ultimo la funcion timeit tiene un defecto. De que los datos que muestra no son los reales. Lo que hace la clase Timer es simplemente ejecuta una ves lo que le pases como 2do argumento y luego ejecuta un millon de veces (no me acuerdo si es un millon o solo mil veces) lo que le pases como primer argumento, sacando un promedio de cuanto se demoro cada ves que ejecuto el primer argumento. Pero el promedio que saca es cuando "se ejecutan el argumento muchas veces seguido" o dicho de otra forma, con gran estress. Asi que no hay que decir la funcion se demora en ejecutarce 0.55 seg, sino que hay que decir, bajo estress la funcion se demora 0.55 seg.
Para ser mas exactos es mejor no considerar a la funcion timeit como una funcion que mide el tiempo de ejecucion de algo, sino como algo que cuantifique el coste de ejecución de algo y que solo es valido cuando se compara con otra cosa (como por ejemplo cuando comparamos la ejecucion del len con distintos largos de string). Si esto se puede complementar con un
test de hipotesis de comparacion de medias, ideal....
viernes, febrero 24, 2006
Coste de la funcion len() en los strings de Python
Sospechaba que el coste era constante, y según me han comentado así es. Se fija durante la creación de los string, ya que éstos son inmutables.
Su implementación se puede ver aquí.
Y muy interesante la intervención de Alvaro Leiva, en la lista python-es, sobre el modulo timeit (disponible a partir de Python 2.3):
Su implementación se puede ver aquí.
Y muy interesante la intervención de Alvaro Leiva, en la lista python-es, sobre el modulo timeit (disponible a partir de Python 2.3):
Aparentemente el coste no depende de el tamaño de un string.
En todo caso puedes verlo tu enpiricamente con este programita
from timeit import Timer
x=["a"*10,"a"*100,"a"*1000,"a"*10000]
for i in x*5:
print Timer("len(x)","x='%s'" % i).timeit()
Te daras cuenta que casi siempre te imprime el mismo numero "0.55" en mi
computador....
Esto deja en claro que el coste no depende de el largo del string. No asi
cuando uno ejecuta esto con listas
x=[["a"]*10,["a"]*100,["a"]*1000,["a"]*10000]
for i in x*5:
print Timer("len(x)","x=%s" % i).timeit()
Que arroja siempre valores pequeños de tiempo para ["a"]*10 y los tiempos
siempre son acendentes....
Este metodo del from timeit import Timer siempre lo ocupo cuando tengo una
duda sobre el coste de una funcion... Muy util cuando uno programa
algoritmos de optimisacion lineal como el simplex... Algoritmos famosos por
su tendencia a volverse lentos
Vía barrapunto, veo que The International Obfuscated C Code Contest se sigue celebrando.
Y lo del tatto este es la caña.
Y lo del tatto este es la caña.
jueves, febrero 23, 2006
Comentan en Dirson sobre Google Pages. También la comentan en barrapunto y telendro. Google siempre es noticia...
Autodetección de encodings
He estado buscando un poco en la web sobre el tema... La idea es detectar el encoding sin hacer uso de información existente en declaraciones (del protocolo, lenguaje, ...).
En C++ existe el detector de Mozilla: Mozilla Charset Detectors. (a través de Koders, podemos ver la rama)
En python he encontrado el Universal Encoding Detector. Aquí se explica como funciona (la doc). La librería es un port de la de Mozilla, la cual a su vez se implementó basandose en este articulo: A composite approach to language/encoding detection.
¿Lo que parece que no detecta es ISO-8859-1? Que raro.... (al menos no lo menciona en la documentación).
Antes de encontrar lo que ya he mencionado encontré el siguiente codigo (usando koders):
Y ya para acabar, unos links:
En C++ existe el detector de Mozilla: Mozilla Charset Detectors. (a través de Koders, podemos ver la rama)
En python he encontrado el Universal Encoding Detector. Aquí se explica como funciona (la doc). La librería es un port de la de Mozilla, la cual a su vez se implementó basandose en este articulo: A composite approach to language/encoding detection.
¿Lo que parece que no detecta es ISO-8859-1? Que raro.... (al menos no lo menciona en la documentación).
Antes de encontrar lo que ya he mencionado encontré el siguiente codigo (usando koders):
def autodetect_encoding(self, new_data):
enc = ""
if len(new_data)<5:
# If this is a very short external entity, it may not
# have enough bytes for auto-detection. In that case,
# it must be UTF-8
enc = "utf-8"
elif new_data[:3] == '\xef\xbb\xbf':
enc = "utf-8" # with BOM
elif new_data[:4] == '\0\0\0\x3c':
enc = "ucs-4-be"
elif new_data[:4] == '\x3c\0\0\0':
enc = "ucs-4-le"
# ignore unusual byte orders 2143 and 3412
elif new_data[:2] == '\xfe\xff':
enc = "utf-16-be" # with BOM
elif new_data[:2] == '\xff\xfe':
enc = "utf-16-le" # with BOM
elif new_data[:4] == '\0\x3c\0\x3f':
enc = "utf-16-be"
elif new_data[:4] == '\0\x3f\0\x3c':
enc = "utf-16-be"
elif new_data[:5] == ' # need to wait for encoding attribute, do not try
# to apply a codec until then.
pass
# ignore EBCDIC
else:
# Does not start with enc = "utf-8"
return enc
Y ya para acabar, unos links:
- Un thread sobre encoding y BOM (Byte Order Mark)
- Esta pagina parece de lectura recomendada.
- Character Encoding Detection en el Universal Feed Parser (en python).
- HTML::Encoding (perl)
miércoles, febrero 22, 2006
Usando los niveles del logging de python
Los valores posibles para definir el nivel de trazas ( con setLevel() ) son (sacados de logging/__init__.py):
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
Con NOTSET se sacan todas las trazas.
Estos son los valores definidos, pero se puede usar cualquier valor numerico
También hay definido un diccionario que realiza el mapeo entre las constantes y su nombre (string): _levelNames.
Actualización
Probando, NOTSET no se saca nada ¿Esa la documentación mal?
lunes, febrero 20, 2006
Standards Mode y Quirks Mode
Gracias a haberle leido un tutorial sobre encodings en xhtml, me he enterado que los browsers tienen dos modos de visualización:
- standards mode (fiel a los estándares de la W3C)
- quirks mode
Se puede pasar de uno a otro mediante el 'doctype switching'. En otras palabras: si el documento incluye el doctype, se visualiza en 'standards'; en caso contrario se visualiza como 'quirks'.
La reglas son diferentes, y por lo tanto el resultado visual también.
Si el documento tiene una declaración ?xml antes del doctype, en el caso de IE, provoca que se visualice en quirks mode.
En la siguiente página hay mas información sobre los diferentes doctypes y como se comportan los diferentes navegadores con ellos: Activating the Right Layout Mode Using the Doctype Declaration.
En la siguiente página se detallan algunas diferencias.
La reglas son diferentes, y por lo tanto el resultado visual también.
Si el documento tiene una declaración ?xml antes del doctype, en el caso de IE, provoca que se visualice en quirks mode.
En la siguiente página hay mas información sobre los diferentes doctypes y como se comportan los diferentes navegadores con ellos: Activating the Right Layout Mode Using the Doctype Declaration.
En la siguiente página se detallan algunas diferencias.
viernes, febrero 17, 2006
Detección de encoding en ficheros html/xhtml
Como se indica aquí, en los ficheros html (o xhtml) el encoding debe de estar especificado. Pero la realidad es otra, y es que puede no venir (los estandares especifican uno por defecto) o incluso no corresponderse con el verdadero encoding.
Buscando en la web, no he encontrado nada para hacer la autodetección. Aunque seguire buscando...
Lo único que he encontrado de momento es este thread.
De momento y para salir del paso usaré el comando 'file' de unix.
En los fichero xhtml nos encontramos con una problematica adicional, y es que pueden venir los encodings especificados en el meta y con el este documento, dependerá de su uso, es decir de como se entreguen. Lo cual no deja de ser un problema si el documento lo tenemos en disco y no sabemos como se ha entragado.
Lo que si especifica bien claro es que el encoding de HTTP tiene prioridad (si se indica) sobre el resto.
Y otro link que todavía no he tenido tiempo de mirar...
Actualización
El siguiente tutorial de W3C es muy bueno: Character sets & encodings in XHTML, HTML and CSS.
Y los diferentes valores para el encoding: IANA registry.
miércoles, febrero 15, 2006
Han inventado una pantalla tactil [barrapunto.com] que es la caña.
Aunque barrapunto ha estado lento. Telendro ya lo había publicado hace días.
Aunque barrapunto ha estado lento. Telendro ya lo había publicado hace días.
lunes, febrero 13, 2006
viernes, febrero 10, 2006
Me pasa vlady esta web: genbeta. Va de actualidad sobre software. No parece estal mal. Habrá que seguirla... Curioso que lanzan busquedas a través de Noxtrum.
Un par de enlaces de barrapunto:
- Generadores de código MDA (Model Driven Arquitecture).
- VMware mueve ficha. VMware a liberado una versión.
jueves, febrero 09, 2006
Encoding por defecto en xml y html
En XML si no se especifica el encoding, se toma por defecto utf-8, mientras que en html (para text/*) se toma por defecto iso-8859-1.
Para otro tipos de medios, entra en juego la RFP 3023.
Mas información aquí: Determining the character encoding of a feed.
miércoles, febrero 08, 2006
He encontrado un articulo que parece interesante (pero no he leido todavia): The Problem with the Libxml Python Bindings.
Al final del mismo hay un link muy muy interesante: Beware of strangers.
El cual me ha llevado a otros:
Al final del mismo hay un link muy muy interesante: Beware of strangers.
El cual me ha llevado a otros:
- La librería que usa libxml2 para los encodings: libiconv
- Y uno muy interesante sobre los encodings: Determining the character encoding of a feed.
- Un benchmarking de diferentes parser de xml. libxml2 es increiblemente rápido.
Parseando html con libxml2
En primer lugar tengo que comentar que no hay mucha documentación del 'binding' a python de libxml2. Básicamente las alternativas de documentarse son:
- Tirar de archivos de las listas: [1] y [2]
- Ver la ayuda: desde el interprete usar 'help(libxml2)' o desde la shell 'pydoc libxml2'.
- Ver ejemplos. Con la instalación viene alguno.
A continuación pongo un ejemplo que viene con la distribución (pushSAXhtml.py):
El poco tiempo que llevo usandolo ya me ha dado para poder reseñar que:
#!/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, "
chunk = " url='tst'>b"
ctxt.htmlParseChunk(chunk, len(chunk), 0)
chunk = "ar"
ctxt.htmlParseChunk(chunk, len(chunk), 1)
ctxt=None
.../...
El poco tiempo que llevo usandolo ya me ha dado para poder reseñar que:
- Internamente se trabaja con utf-8. Si el encoding viene especificado en el documento no hay problemas. En caso contrario supondrá uno por defecto (no realiza autodetección en este caso). El tema no es nada sencillo, ya que no sólo tenemos este problema, sino que se puede dar el caso de que el encoding no concuerde con lo que viene especificado en la declaración. O incluso que se use más de uno. Vamos una movida... Además en caso de estar parseando xhtml ignora el ?xml. Para xhtml se debería usar el parser xml, pero ¿y si el xhtml no está bien formado? Vamos que aqui hay miga...
- Desde el callback no podemos parar el parser. La parada hay que hacerla desde fuera. Lo suyo es hacerla entre el paso de un 'chunk' de datos a otro.
- Con el api de C he visto que el parser te puede notificar que ha habido un problema y que hay que parar, sin embargo esta funcionalidad no es posible en los bindings de python. Según me comenta Daniel Veillard: "The notion of fatal error where the parser stops emitting data (just more error message) exists only in the XML parser." Me parece muy bien, pero esto no explica porque existe esa funcionalidad en el api de C. En los links del post hay un ejemplo de ésto.
Y para acabar unos enlaces interesantes:
- htmlParseChunk loop
- SAX HTML still stuck
- htmlParseFile vs htmlParseDoc
- Aborting html sax parsing from python
martes, febrero 07, 2006
Un thread en el que se indica porque python está indicado para el desarrollo de crawlers.
En dicho thread comentan sobre google-kongulo, un crawler liberado por google y que se usa en su desktop.
Tambien recomiendan como parser BeatifulSoup. Lo que hace es convertir el html a un arbol (no es SAX; ni tampoco DOM).
En dicho thread comentan sobre google-kongulo, un crawler liberado por google y que se usa en su desktop.
Tambien recomiendan como parser BeatifulSoup. Lo que hace es convertir el html a un arbol (no es SAX; ni tampoco DOM).
libxml2 y el encoding
Ando trasteando con libxml2 y ésta página es la que hay que leer con respecto a los encodings.
Ya hace tiempo puse unos cuantos links sobre encodings; y ahora van un par mas extraidos de la página anterior:
- The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).
- On the Goodness of Unicode.
Actualización
Los encodings que soporta son:
- UTF-8
- UTF-16 little endian
- UTF-16 big endian
- UCS-4 little endian
- UCS-4 big endian
- EBCDIC
- UCS-4 unusual ordering (UCS4_2143)
- UCS-4 unusual ordering (UCS4_3412)
- UCS-2
- ISO-8859-1 ISO Latin 1
- ISO-8859-2 ISO Latin 2
- ISO-8859-3
- ISO-8859-4
- ISO-8859-5
- ISO-8859-6
- ISO-8859-7
- ISO-8859-8
- ISO-8859-9
- ISO-2022-JP
- Shift_JIS
- EUC-JP
- ASCII
lunes, febrero 06, 2006
domingo, febrero 05, 2006
viernes, enero 27, 2006
Anty- spywares
Preguntando a los amigotes sobre que cosas usaban me dijeron:
- Spybot. Se puede bajar de aquí. Vía my bro.
- Lavasoft. Vía 'el doctor'. Más info aquí.
- Y vía 'el abuelo': "Yo tenía El norton inteernet security con antivirus, firewall y spyware y de tó, pero se me acba la licencia pirateada y estoy por poner lo que me recomiendan los geeks de mi curro que es: kaspersky (antivirus) + ( agnitum outpost (firewalll y de-mas cosas versatil pero complicado) o zonealarm (firewalll facil) ) a ver si me lo pasan lo pruebo y so comento". Literal.
De momento he probado Spybot.
Nota posterior: Instalando Ad-Aware SE Personal (el de Lavasoft) , he visto que forma parte del Google Pack. Interesting...
Otra mas posterior: AVG, aparte de antivirus (de gratis), también tiene un anti-malware.
Nota posterior: Instalando Ad-Aware SE Personal (el de Lavasoft) , he visto que forma parte del Google Pack. Interesting...
Otra mas posterior: AVG, aparte de antivirus (de gratis), también tiene un anti-malware.
En Google Code han publicado unas estadísticas sobre código web. Vamos lo que usa la gente por ahí...
Vía Telendro.
Vía Telendro.
miércoles, enero 25, 2006
Un minipost, para presentar a Drupal, un content management/discussion engine hecho con Apache+PHP+mySQL.
Actualización
En mi proyecto lo estamos usando en ixnik, que es un portal interno para el grupo de desarrollo del proyecto en el que estoy.
Actualización
En mi proyecto lo estamos usando en ixnik, que es un portal interno para el grupo de desarrollo del proyecto en el que estoy.
Esta entrada es para presentar a Baquia. Vía Barrapunto:
"Acaba de renovar su diseño (obra de La Coctelera) y además su clásico boletín Zumo de Red ahora se publica diariamente en formato blog, lectura muy recomendable para seguir la actualidad tecnológica de forma amena y crítica."
"Acaba de renovar su diseño (obra de La Coctelera) y además su clásico boletín Zumo de Red ahora se publica diariamente en formato blog, lectura muy recomendable para seguir la actualidad tecnológica de forma amena y crítica."
martes, enero 24, 2006
Un par de noticias de barrapunto:
- Yahoo! abre un centro de I+D en Barcelona.
- Vídeos de Rails vs Django. No tenía ni idea de la existencia de Django: al igual que Rails es un framework de desarrollo rápido de aplicaciones web basado en el lenguaje de programación Python.
lunes, enero 23, 2006
Visualización de datos específica: ¿cuál es vuestra aplicación favorita? [barrapunto.com]. Esta bien... dan unos cuantes enlaces, aparte de los tipicos: gnuplot, graphviz, ...
viernes, enero 20, 2006
Ejemplo de reimplementación de los metodos que modifican un diccionario [python]
class MyDict(dict):
def __setitem__(self,c,v):
print "En __setitem__"
dict.__setitem__(self,c,v)
def __delitem__(self,c):
print "En __delitem__"
dict.__delitem__(self,c)
def pop(self,c):
print "En pop"
return dict.pop(self,c)
def popitem(self):
# Saca la key del principio
print "En popitem"
return dict.popitem(self)
def clear(self):
print "En Clear"
dict.clear(self)
def update(self,D):
print "En update"
# !Ojo! si tenemos un tratamiento por key, al invocar al update del padre
# no se ejecutaría. Vamos... que update no hace uso de __setitem__.
# Con lo cual nos tocaria hacer a peluski aquí el tratamiento especifico
dict.update(self,D)
def setdefault(self,c,v=None):
print "En setdefault"
return dict.setdefault(self,c,v)
Si heredas un diccionario será para aprovechar la funcionalidad que te ofrece, y ampliarla.
La segunda opción, y en principio mejor será que internamente tu clase haga uso de un diccionario.
Por ejemplo para eliminar un elemento tenemos 3 posibilidades: 'pop', 'popitem' y hacer uso de 'del'. Estaría bien que tanto 'pop', como 'popitem' hicieran uso de '__delitem__' como hace 'del' de esta manera con meter nuestro código en '__delitem__' valdría para las tres opciones de borrado. Pero como no funciona así, es necesario crear un método adicional que sea invocado desde las tres.
Un ejemplo todavía peor es el de 'update'.
Det todas formas por principio deberíamos siempre preferir la composición a la herencia: que nuestra clase haga uso del diccionario en lugar de heredar de él.
jueves, enero 19, 2006
Vía Javier Pagés [inforenses.com], he visto 2 articulos relacionados con la Informatica Forense:
- El ordenador, único testigo.
- Los informáticos forenses se hacen imprescindibles en delitos de guante blanco.
Del segundo he obtenido varias empresas que se dedican a este tipo de temas:
Y un par mas:
- GDT (Grupo de Delitos Telemáticos de la Guardia Civil).
- Centro Criptológico Nacional
lunes, enero 16, 2006
En Europa se esta fraguando el desarrollo de un nuevo buscador, que pueda rivalizar con los lideres americanos (google, yahoo, ...): quaero [telepolis.com].
viernes, enero 13, 2006
bitacoras.com
Bueno... parece que he encontrado un sitio para la creación de bitacoras que realmente está muy bien: bitacoras.com.
Lo que te ofrecen (de su pagina):
- Soporte para bitácoras y fotologs
- WebFTP desde el Panel de control
- Posibilidad de programar anotaciones futuras
- Moderación de comentarios y protección frente a spam
- Miniblog: Ideal para recopilar enlaces
- Envío/recepción de trackbacks y pings
- Posibilidad de enviar anotaciones desde teléfono móvil
- Posibilidad de enviar anotaciones desde el e-mail
- Gran cantidad de plantillas personalizables
- Sistema propio de etiquetas TAGs
- Sindicación compatible con todos los lectores
- Estadísticas de uso
- Foros de soporte
- Chat de usuarios
Y lo que yo he podido ver ...
- meten una barra arriba (posible publicidad) (-)
- ¿limite de subida? (-)
- permite subir ficheros, has 60 KB (+)
- limite de tamaño de fichero a subir (-). Pero es algo normal.
- categorias (+)
- moderación de comentarios (+)
- medidas antispam en comentarios (+). Pero no tienen la posibilidad de obligar a teclear una palabra generada en una imagen, con lo cual, aunque el spam no aparezca automáticamente (pasa por moderación), te obliga a moderarlo. Con la imagén ni siquiera llegaría a la página de moderación.
- Tienen varios gestores (+):
- usuarios
- enlaces
- acronimos
- emoticonos
- importación y exportación de ficheros (la exportacion la hace a un fichero de texto dentro de un .zip con un formato determinado, incluyendo: el titulo, el resumen, el contenido, los comentarios, ...) (+)
Servicios Plus (de su web):
- Eliminar publicidad de mi bitácora por 1? al mes.
- Eliminar publicidad de mi bitácora, aumentar hasta 250 Mb. el espacio disponible y aumentar el número de autores (hasta 10) por 2? al mes. Y la supresión de la limitación de subida de 60 KB.
A mi me parece de lo mejor que he visto hasta ahora. Y por un euro al mes, que es nada, te quitas del medio la publicidad.
miércoles, enero 11, 2006
Me comenta JJ un sitio web (tienda fisicamente en San Sebastian de los Reyes) muy bueno sobre todo para componentes: alternate.
Lo proximo de Microsoft
Windows Vista e IExplorer 7 (por lo visto con un look&feel clavao a firefox).
martes, enero 10, 2006
Hace ya un tiempo JJ me comentó unos productos de OpenSymphony:
También me comentó sobre un repositorio de proyectos 'Open Source' Java: CodeHaus. Según sus palabras: "...projectos muy a seguir de cerca. Hay de todo desde compiladores AOP hasta integradores de ESB."
lunes, enero 09, 2006
Un par de posts sobre ¿la muerte de barrapunto?:
- Filtro editorial vs filtro democratico [barrapunto.com].
- La muerte de barrapunto [microsiervos.com] .
Una de las cosas nuevas de estas fechas ha sido un HD con unos cuantos Gigas. Andaba un poco escaso de espacio...
Tras instalarlo, llega la pregunta del millón. ¿Como lo particionamos?
Si vamos a usar windows (actualmente lo normal será usar 2000 o XP) pues tenemos dos opciones: fat32 y ntfs.
Con fat32 tenemos que tener en cuenta que tenemos una limitación en el espacio de la particion 32 GB.
Buscando en google, hay bastante información para comparar.
Me resulta curioso que hoy en barrapunto hay un post relaciona: Formatos de archivos para discos externos.
Ya para acabar... Lo de los GB, es una movida. Según la entrada en la wikipedia hay dos definiciones posibles de GB: 10^9 y 2^30. ¿Adivinais cual usan algunos fabricantes de discos duros? Pues sí, la primera. No os extrañe que cuando tengais formateado un disco duro la capacidad real (GB para el ordenador es 2^30) sea menor...
Tras instalarlo, llega la pregunta del millón. ¿Como lo particionamos?
Si vamos a usar windows (actualmente lo normal será usar 2000 o XP) pues tenemos dos opciones: fat32 y ntfs.
Con fat32 tenemos que tener en cuenta que tenemos una limitación en el espacio de la particion 32 GB.
Buscando en google, hay bastante información para comparar.
Me resulta curioso que hoy en barrapunto hay un post relaciona: Formatos de archivos para discos externos.
Ya para acabar... Lo de los GB, es una movida. Según la entrada en la wikipedia hay dos definiciones posibles de GB: 10^9 y 2^30. ¿Adivinais cual usan algunos fabricantes de discos duros? Pues sí, la primera. No os extrañe que cuando tengais formateado un disco duro la capacidad real (GB para el ordenador es 2^30) sea menor...
viernes, enero 06, 2006
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:
En algún comentario, aparte de mencionar algunas herramientas de python, mencionan PyPy, como el futuro de python. Entre las otras mencionadas estaban:
- Iron Python. Python para .NET.
- wxPython. Para hacer GUIs. Para usarlo con wxGlade.
- Psyco.
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.
Mirando su contenido me he encontrado el notición: Guido van Rossum ha sido contratado por Google.
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.
Un par de noticias de barrapunto:
- Telecos e informáticos, los más solicitados. Hay algun comentario interesante.
- En unas horas comenzará Hispalinux 2005. He mirado el programa y no tiene mala pinta...
lunes, diciembre 19, 2005
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
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.
Via Telendro.
De barrapunto: Tim Berners-Lee (el padre de la web) comienza un blog:
- Su blog.
- Su primer comentario.
Hasta el momento de crear su blog, su 'blog' han sido la serie de articulos técnicos Design Issues for the WWW.
Suscribirse a:
Entradas (Atom)